惊鸿戏梦 3 meses atrás
pai
commit
fbcef0edb2

+ 18 - 0
newyouth-app/src/agent/agent-user-input/agent-user-input.component.html

@@ -0,0 +1,18 @@
+<ion-header>
+  <ion-toolbar>
+    <ion-buttons slot="start">
+      <ion-button color="medium" (click)="cancel()">取消</ion-button>
+    </ion-buttons>
+    <ion-title>用户输入</ion-title>
+    <ion-buttons slot="end">
+      <ion-button (click)="confirm()" [strong]="true">确认</ion-button>
+    </ion-buttons>
+  </ion-toolbar>
+</ion-header>
+<ion-content class="ion-padding">
+  @for(filed of filedsArray;track filed.name){
+    <ion-item>
+      <ion-input labelPlacement="stacked" label="请输入:{{filed.name}}" [(ngModel)]="inputData['poem']" placeholder="{{filed.desc}}"></ion-input>
+    </ion-item>
+  }
+</ion-content>

+ 0 - 0
newyouth-app/src/agent/agent-user-input/agent-user-input.component.scss


+ 22 - 0
newyouth-app/src/agent/agent-user-input/agent-user-input.component.spec.ts

@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
+
+import { AgentUserInputComponent } from './agent-user-input.component';
+
+describe('AgentUserInputComponent', () => {
+  let component: AgentUserInputComponent;
+  let fixture: ComponentFixture<AgentUserInputComponent>;
+
+  beforeEach(waitForAsync(() => {
+    TestBed.configureTestingModule({
+      imports: [AgentUserInputComponent],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(AgentUserInputComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  }));
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});

+ 40 - 0
newyouth-app/src/agent/agent-user-input/agent-user-input.component.ts

@@ -0,0 +1,40 @@
+import { Component, Input, OnInit } from '@angular/core';
+import { FormsModule, ReactiveFormsModule } from '@angular/forms';
+import { IonButton, IonButtons, IonContent, IonHeader, IonInput, IonItem, IonTitle, IonToolbar, ModalController } from '@ionic/angular/standalone';
+
+export interface AgentUserInputFiled{
+  name:string//字段名称
+  type:string//输入类型
+  desc:string//字段说明
+}
+@Component({
+  selector: 'agent-user-input',
+  templateUrl: './agent-user-input.component.html',
+  styleUrls: ['./agent-user-input.component.scss'],
+  imports:[
+    IonHeader,IonContent,IonInput,IonItem,IonButton,IonToolbar,IonButtons,
+    FormsModule,ReactiveFormsModule,IonTitle
+  ],
+  standalone: true
+})
+export class AgentUserInputComponent  implements OnInit {
+  poem:string="";
+  
+  @Input()
+  filedsArray:AgentUserInputFiled[]=[]
+
+  @Input()
+  inputData:any ={}
+
+  constructor(private modalCtrl: ModalController) {}
+  ngOnInit() { 
+    
+  }
+  cancel() {
+    return this.modalCtrl.dismiss(null, 'cancel');
+  }
+
+  confirm() {
+    return this.modalCtrl.dismiss(this.inputData, 'confirm');
+  }
+}

+ 19 - 0
newyouth-app/src/agent/agent.input.ts

@@ -0,0 +1,19 @@
+import { ModalController } from '@ionic/angular/standalone';
+import { AgentUserInputComponent } from 'src/agent/agent-user-input/agent-user-input.component';
+
+  // 数据搜集
+  //@description
+  //https://ionicframework.com/docs/api/modal#controller-modals
+  export async function getUserInput(modalCtrl:ModalController,options:{filedsArray:any}){
+    const modal = await modalCtrl.create({
+      component: AgentUserInputComponent,
+      componentProps:{filedsArray:options.filedsArray}
+    });
+    modal.present();
+
+    const { data, role } = await modal.onWillDismiss();
+
+    if (role === 'confirm') {
+      return data;
+    }
+  }

+ 11 - 0
newyouth-app/src/agent/agent.start.ts

@@ -0,0 +1,11 @@
+import { AgentTaskStep } from "./agent.task";
+
+  //任务执行函数
+  export async function startTask( taskStepList:AgentTaskStep[]){
+    for(let index=0;index<taskStepList.length;index++){
+      let step=taskStepList[index];
+      let result=await step.handle();
+      if(result == false){break;}
+      if(!step.error){}//任务正常执行,无error
+      }
+    }

+ 65 - 0
newyouth-app/src/agent/agent.task.ts

@@ -0,0 +1,65 @@
+//任务步骤初始化参数
+interface AgentTaskStepOptions{
+    title:string
+    shareData?:any
+    handle?():{():Promise<any>}
+}
+export class AgentTaskStep{
+    //任务名称
+    title:string="";
+
+    //任务数据 共享数据(整个任务集共享传递的数据)
+    shareData:any={};
+
+    //任务数据 私有数据(当前任务私有的处理数据)
+    data:any={};
+
+    //父级组件:任务集组件
+    //@example当前子任务未完成,且当前任务是必须时,需要在当前任务中,终止整个程序
+    parentComp:any|undefined
+    //当前任务在任务集数组中的项目
+    parentIndex:number|undefined
+    
+    /*任务生命周期
+    * @constructor  //构造时执行一次
+    * @onInit  //初始化后执行一次
+    * @onProgress // 进度变化时执行一次
+    * @onComplete // 完成前执行一次
+    */
+    constructor(metaData:AgentTaskStepOptions){
+        this.title=metaData.title
+        this.shareData=metaData.shareData
+        if(metaData.handle){
+            this.handle=metaData.handle;
+        }
+        this.init(metaData)
+    }
+
+    OnInit(step:AgentTaskStep){
+        this.isInit=true;
+    };
+    beforeHandle(step:AgentTaskStep){};
+    afterHandle(step:AgentTaskStep){};
+    onProgress(step:AgentTaskStep){};
+    onComplete(step:AgentTaskStep){};
+    onError(step:AgentTaskStep){};
+    //任务初始化函数
+     async init(metaData:AgentTaskStepOptions){
+
+    }
+    isInit:boolean=false;//是否初始化
+
+    //任务执行函数
+    //@desc 函数内必须有明确的完成、结束情形,函数内必须有进度的变化指示 从0.00 - 1.00
+    progress:number=0;
+    handle():Promise<any>|any{
+        
+        this.beforeHandle(this)
+
+        this.onComplete(this)
+        this.onError(this)
+        return true
+    }
+    error: string="";//错误原因
+
+}

+ 35 - 0
newyouth-app/src/agent/tasks/poem/poem-desc.ts

@@ -0,0 +1,35 @@
+import { ModalController } from "@ionic/angular/standalone";
+import { FmodeChatCompletion } from "fmode-ng";
+import { getUserInput } from "src/agent/agent.input";
+import { AgentTaskStep } from "src/agent/agent.task";
+
+export function TaskPoemPicutreDesc(options:{modalCtrl:ModalController,shareData:any}){
+    let task1=new AgentTaskStep({title:"意境分析",shareData:options.shareData});
+    task1.handle=async()=>{
+      //获取用户输入的诗词
+      let userInput=await getUserInput(options.modalCtrl,{filedsArray:[{name:"诗文内容",type:"text",desc:"诗文内容"}]});
+      console.log("已获取用户输入:",userInput)
+      console.log("已获取诗文内容:",userInput.poem)
+
+    // 文本生成
+    let PromptTemplate = `您是一名专业的美术画家,请您根据古诗文的内容,将其描述的画面、场景、人物、物品等用最简短的语言表达,直接写出画面,并且以中国的古风意境为主
+    诗文如下:${userInput.poem}`
+    let completion = new FmodeChatCompletion([
+      {role:"system",content:""},
+      {role:"user",content:PromptTemplate}
+    ])
+    completion.sendCompletion().subscribe((message:any)=>{
+      // 打印消息体
+      console.log(message.content)
+      // 赋值消息内容给组件内属性
+      options.shareData.PictureDescResult = message.content
+      if(message?.complete){ // 判断message为完成状态,则设置isComplete为完成
+        task1.progress=1
+      }
+    })
+      // await this.wait(1000);
+      // console.log("意境分析:执行过程");
+      // task1.progress=1
+      return task1;
+    }
+}

+ 28 - 0
newyouth-app/src/agent/tasks/poem/poem-picture.ts

@@ -0,0 +1,28 @@
+
+import { ModalController } from "@ionic/angular/standalone";
+import { DalleOptions, ImagineWork } from "fmode-ng";
+import { AgentTaskStep } from "src/agent/agent.task";
+
+// export function TaskPoemPictureCreate(options:{modalCtrl:ModalController,shareData:any}){
+//     let task2=new AgentTaskStep({title:"意境绘制",shareData:options.shareData});
+//     task2.handle=async()=>{
+//       //await this.wait(10000);
+//       //let userInput=await getUserInput(this.modalCtrl,{filedsArray:[{name:"绘图要求",type:"text",desc:"画风、构图等"}]});
+//       // console.log("已获取用户输入:",userInput)
+//       // console.log("已获取诗文内容:",userInput.poem)
+//       console.log("意境绘制:执行过程");
+//       let imagineWork = new ImagineWork();
+
+//       // 图片生成
+//       let PicturePrompt = `${options.shareData.PictureDescResult}\n风格:中国古风。画面不带任何文字。`
+//       let options:DalleOptions = {prompt:PicturePrompt}
+//       imagineWork?.draw(options).subscribe((work:any)=>{
+//           console.log("imagineWork",work?.toJSON())
+//           console.log("images",work?.get("images"))
+//           if(work?.get("images")?.length){
+//             options.shareData.images = work?.get("images");
+//             task2.progress=1
+//           }
+//       })
+//     }
+// }

+ 45 - 7
newyouth-app/src/app/tab3/tab3.page.html

@@ -1,17 +1,55 @@
 <ion-header [translucent]="true">
   <ion-toolbar>
     <ion-title>
-      健康计划
+      健康计划(任务集执行展示)
     </ion-title>
   </ion-toolbar>
 </ion-header>
 
 <ion-content [fullscreen]="true">
-  <ion-header collapse="condense">
-    <ion-toolbar>
-      <ion-title size="large">健康计划</ion-title>
-    </ion-toolbar>
-  </ion-header>
+  <ion-button (click)="doPoemTask()">执行诗文意境绘制任务集</ion-button>
+  <ion-button (click)="doInqueryTask()">执行问诊任务集</ion-button>
+  <!-- <ion-button (click)="testJSON()">测试JSON</ion-button> -->
 
-  <app-explore-container name="Tab 3 page"></app-explore-container>
+   <ul>
+    @for(step of taskList;track step.title;){
+      <div>
+        <!-- 待开始 -->
+        @if(step.progress==0 && !step.error){
+          <ion-icon name="radio-button-off-outline"></ion-icon>
+        }
+        <!-- 进行中 -->
+        @if(step.progress!=0 && step.progress!=1){
+          <ion-icon name="reload-outline"></ion-icon>
+        }
+        <!-- 已完成 -->
+        @if(step.progress==1){
+          <ion-icon name="checkmark-circle-outline"></ion-icon>
+        }
+        <!-- 已出错 -->
+        @if(step.error){
+          <ion-icon name="close-circle-outline"></ion-icon>
+        }
+        {{step.title}}{{step.progress}}</div>   
+    }
+    </ul>
+    <!-- 图片结果 -->
+    @if(shareData.images) {
+      @for(imageUrl of shareData.images;track imageUrl){
+        <img [src]="imageUrl" alt="" srcset="">
+      }
+    }
+<!-- 诗词意境绘画生成结果 -->
+<!-- @if(shareData.images) {
+  @for(imageUrl of shareData.images;track imageUrl){
+    <img [src]="imageUrl" alt="" srcset="">
+  }
+} -->
+
+<!-- 问诊报告生成结果 -->
+<!-- @if(shareData.diagResult){
+  <h1>{{shareData.diagResult.title}}</h1>
+  <h2>{{shareData.diagResult.desc}}</h2>
+  <p>{{shareData.diagResult.content}}</p>
+} -->
 </ion-content>

+ 127 - 4
newyouth-app/src/app/tab3/tab3.page.ts

@@ -1,14 +1,137 @@
 import { Component } from '@angular/core';
-import { IonHeader, IonToolbar, IonTitle, IonContent } from '@ionic/angular/standalone';
+import { IonHeader, IonToolbar, IonTitle, IonContent,IonButton,IonIcon, ModalController, } from '@ionic/angular/standalone';
 import { ExploreContainerComponent } from '../explore-container/explore-container.component';
-
+import { AgentTaskStep } from 'src/agent/agent.task';
+import { closeCircleOutline,radioButtonOffOutline,reloadOutline,checkmarkCircleOutline} from 'ionicons/icons';
+import { addIcons } from 'ionicons';
+import { DalleOptions, FmodeChatCompletion, ImagineWork } from 'fmode-ng';
+import { getUserInput } from 'src/agent/agent.input';
+import { startTask } from 'src/agent/agent.start';
+addIcons({radioButtonOffOutline,reloadOutline,checkmarkCircleOutline,closeCircleOutline})
 @Component({
   selector: 'app-tab3',
   templateUrl: 'tab3.page.html',
   styleUrls: ['tab3.page.scss'],
   standalone: true,
-  imports: [IonHeader, IonToolbar, IonTitle, IonContent, ExploreContainerComponent],
+  imports: [IonHeader, IonToolbar, IonTitle, IonContent, ExploreContainerComponent,IonButton,IonIcon],
 })
 export class Tab3Page {
-  constructor() {}
+  constructor(private modalCtrl:ModalController) {
+
+
+  }
+
+  taskList:AgentTaskStep[] = []
+
+  wait(duration:number=1000){
+    return new Promise(resolve=>{
+      setTimeout(() => {
+          resolve(true)
+      }, duration);
+    })
+  }
+
+  shareData:any = {}
+
+  // 任务:完成故事意境描述及图像绘制
+  doPoemTask(){
+    let task1 = new AgentTaskStep({title:"意境分析",shareData:this.shareData});
+    task1.handle=async()=>{
+      //获取用户输入的诗词
+      let userInput=await getUserInput(this.modalCtrl,{filedsArray:[{name:"诗文内容",type:"text",desc:"诗文内容"}]});
+      console.log("已获取用户输入:",userInput)
+      console.log("已获取诗文内容:",userInput.poem)
+
+    // 文本生成
+    let PromptTemplate = `您是一名专业的美术画家,请您根据古诗文的内容,将其描述的画面、场景、人物、物品等用最简短的语言表达,直接写出画面,并且以中国的古风意境为主
+    诗文如下:${userInput.poem}`
+    let completion = new FmodeChatCompletion([
+      {role:"system",content:""},
+      {role:"user",content:PromptTemplate}
+    ])
+    completion.sendCompletion().subscribe((message:any)=>{
+      // 打印消息体
+      console.log(message.content)
+      // 赋值消息内容给组件内属性
+      this.shareData.PictureDescResult = message.content
+      if(message?.complete){ // 判断message为完成状态,则设置isComplete为完成
+        task1.progress=1
+      }
+    })
+      // await this.wait(1000);
+      // console.log("意境分析")
+  }
+
+    let task2=new AgentTaskStep({title:"意境绘制",shareData:this.shareData});
+    task2.handle=async()=>{
+      await this.wait(10000);
+      //let userInput=await getUserInput(this.modalCtrl,{filedsArray:[{name:"绘图要求",type:"text",desc:"画风、构图等"}]});
+      // console.log("已获取用户输入:",userInput)
+      // console.log("已获取诗文内容:",userInput.poem)
+      console.log("意境绘制:执行过程");
+      let imagineWork = new ImagineWork();
+
+      // 图片生成
+      let PicturePrompt = `${this.shareData.PictureDescResult}\n风格:中国古风。画面不带任何文字。`
+      let options:DalleOptions = {prompt:PicturePrompt}
+      imagineWork?.draw(options).subscribe((work:any)=>{
+          console.log("imagineWork",work?.toJSON())
+          console.log("images",work?.get("images"))
+          if(work?.get("images")?.length){
+            this.shareData.images = work?.get("images");
+            task2.progress=1
+          }
+      })
+    }
+    
+    // 定义任务集
+    let PoemTaskList = [task1,task2]
+    // 传递给显示组件
+    this.taskList = PoemTaskList
+    // 开始执行任务
+    startTask(PoemTaskList)
+  }
+
+  // 任务集:医疗问诊任务集 完成一次完整的门诊服务
+  doInqueryTask(){
+    let task1 = new AgentTaskStep({title:"导诊",shareData:this.shareData});
+    task1.handle=async()=>{
+      await this.wait(1000)
+      console.log("导诊:执行过程")
+      task1.progress=1
+    }
+    let task2 = new AgentTaskStep({title:"问诊",shareData:this.shareData});
+    task2.handle=async()=>{
+      await this.wait(1000)
+      console.log("问诊:执行过程")
+      task2.progress=1
+    }
+    let task3 = new AgentTaskStep({title:"初诊",shareData:this.shareData});
+    task3.handle=async()=>{
+      await this.wait(1000)
+      console.log("初诊:执行过程")
+      task3.progress=1
+    }
+    let task4 = new AgentTaskStep({title:"检验",shareData:this.shareData});
+    task4.handle=async()=>{
+      await this.wait(1000)
+      console.log("检验:执行过程")
+      task4.progress=1
+    }
+    let task5 = new AgentTaskStep({title:"处方",shareData:this.shareData});
+    task5.handle=async()=>{
+      await this.wait(1000)
+      console.log("处方:执行过程")
+      task5.progress=1
+    }
+    // 定义任务集
+    let InquireServiceTaskList = [
+      task1,task2,task3,task4,task5
+    ]
+    // 传递给显示组件
+    this.taskList = InquireServiceTaskList
+    // 开始执行任务
+    startTask(InquireServiceTaskList)
+  }
+  
 }