import { CommonModule } from '@angular/common'; import { ChangeDetectorRef, Component, OnInit, ViewChild } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { ModalController } from '@ionic/angular/standalone'; import { ChatPanelComponent } from 'fmode-ng' import Parse from "parse"; import { combineLatest } from 'rxjs'; // 添加Icons import { addIcons } from 'ionicons'; import * as icons from 'ionicons/icons'; addIcons(icons); @Component({ selector: 'app-test-chat-panel', templateUrl: './test-chat-panel.component.html', styleUrls: ['./test-chat-panel.component.scss'], standalone: true, imports:[ CommonModule, ChatPanelComponent, ] }) export class TestChatPanelComponent implements OnInit { @ViewChild(ChatPanelComponent) chatComp:ChatPanelComponent|undefined leftButtons:any[]=[] modelList:any[]=[] isDirect:boolean=true; hideShare:boolean=true; hideModalSelect:boolean=true; hideInputPreview:boolean = true; chatId:string = "" roleId:string = "" pid:string = "" constructor( private route:ActivatedRoute, private cdRef:ChangeDetectorRef, private modalCtrl:ModalController ) { combineLatest([this.route.params,this.route.queryParams]).subscribe(async (data:any)=>{ let params = data[0] || {} this.chatId = params['chatId'] || this.chatId || null; this.roleId = params['roleId'] || this.roleId || null; this.pid = params['pid'] || this.pid || null; console.log("this.pid",this.pid) // 异步加载的后续数据 操作按钮 let bint = setInterval(() => { if(this.roleId){ clearInterval(bint); return } this.initPanelConfig(); }, 2000); }) } ngOnInit() { this.initPanelConfig(); // 异步加载的后续数据 提示词 let pint = setInterval(() => { if(this.chatComp?.fmodeChat?.promptList?.length){ clearInterval(pint); return } this.getChatPrompt(); }, 2000); // 异步加载的后续数据 采访人物 ChatSession.person let personInt = setInterval(() => { if(this.chatComp?.fmodeChat?.chatSession?.get("person")){ clearInterval(personInt) } if(!this.chatComp?.fmodeChat?.chatSession?.get("person")){ if(this.pid){ this.chatComp?.fmodeChat?.chatSession?.set("person",{type:"Pointer",className:"Person",objectId:this.pid}) } } }, 2000); } // 初始化聊天面板的设置 initPanelConfig(){ this.roleId = this.chatComp?.fmodeChat?.chatSession?.get("role")?.id || this.roleId; // 按钮自定义 this.leftButtons = [ // 提示 当角色配置预设提示词时 显示 { title:"话题灵感", showTitle:true, icon:"color-wand-outline", onClick:()=>{ if(this.chatComp){ this.chatComp.fmodeChat.isPromptModalOpen = true } }, show:()=>{ return this.chatComp?.fmodeChat?.promptList?.length } } ] this.leftButtons.push({ // 总结 结束并归档本次对话 title:"AI总结对话", showTitle:true, icon:"archive-outline", onClick:()=>{ if(this.chatComp){ // this.chatComp.fmodeChat.isPromptModalOpen = true if(this.chatComp.fmodeChat){ console.log(JSON.stringify(this.chatComp.fmodeChat.messageList)) // alert("处理对话记录") } } }, show:()=>{ return !this.chatComp?.fmodeChat?.chatSession?.get("story")?.id } }) this.leftButtons.push({ // 总结 结束并归档本次对话 title:"聊天心理分析", showTitle:true, icon:"archive-outline", onClick:()=>{ if(this.chatComp){ // this.chatComp.fmodeChat.isPromptModalOpen = true if(this.chatComp.fmodeChat){ let messageList = JSON.parse(JSON.stringify(this.chatComp.fmodeChat.messageList)) messageList = messageList.filter((item:any)=>item.role!="system"&&item?.hidden!=true) let qaContent = messageList.map((item:any)=>{ let roleName = "当前用户" if(item.role!="user"){ if(this.chatComp&&this.chatComp.fmodeChat.role){ roleName = this.chatComp.fmodeChat.role.get("name"); }else{ roleName = "AI助理" } } return `${roleName}:${item.content}` } ).join("\n") console.log(qaContent) // alert("处理对话记录") } } }, show:()=>{ return !this.chatComp?.fmodeChat?.chatSession?.get("story")?.id } }) setTimeout(()=>{ if(this.chatComp&&this.chatComp.fmodeChat){ // 自定义左下角操作按钮 console.log("左下角操作按钮",this.chatComp.fmodeChat.leftButtons); this.chatComp.fmodeChat.leftButtons = this.leftButtons; // 自定义角色名称 console.log("自定义角色",this.chatComp.fmodeChat.role); this.chatComp.fmodeChat.role.set("name","晓晓"); this.chatComp.fmodeChat.role.set("title","心理咨询师"); this.chatComp.fmodeChat.role.set("desc","一名亲切和蔼的心理咨询师,晓晓,年龄36岁"); this.chatComp.fmodeChat.role.set("tags",["焦虑","抑郁"]); this.chatComp.fmodeChat.role.set("avatar","https://nova-cloud.obs.cn-south-1.myhuaweicloud.com/storage/aigc/imagine/Q4Zif7fTbK-0.png") this.chatComp.fmodeChat.role.set("prompt",` # 角色设定 您是一名亲切和蔼的心理咨询师,晓晓,年龄36岁,需要完成陪来访者聊聊天,随意轻松一些。 # 对话环节 0.破冰,互相了解,引导用户介绍自己 1.拓展话题,根据用户的介绍,拓展一些和其心理状态相关的话题 - 引导,可深入的点,以用户自述为主 - 当信息充足时候,确认用户心理状态,并进入下一个环节 2.引导收尾,委婉引导用户结束本次对话 - 用户同意结束后,结束本次对话,如果依依不舍,可以再陪聊一会儿`); // this.chatComp.fmodeChat.role.set("name","晓晓"); // this.chatComp.fmodeChat.role.set("title","主任医师"); // this.chatComp.fmodeChat.role.set("desc","一名专业的全科医生,晓晓,年龄36岁"); // this.chatComp.fmodeChat.role.set("tags",["呼吸道","感染科"]); // this.chatComp.fmodeChat.role.set("avatar","https://nova-cloud.obs.cn-south-1.myhuaweicloud.com/storage/aigc/imagine/Q4Zif7fTbK-0.png") // this.chatComp.fmodeChat.role.set("prompt",` // # 角色设定 // 您是一名专业的全科医生,晓晓,年龄36岁,需要完成一次完整的门诊服务。 // # 对话环节 // 0.导诊(根据用户基本情况,引导挂号合适的科室) // 1.预设的问询方式(感冒问呼吸、肚子疼叩诊) // - 打招呼,以用户自述为主 // - 当信息充足时候,确认用户症状对应的科室,并进入下一个环节 // 2.拓展的问询细节 // 例如:用户反映呼吸不畅,拓展出:是否咳嗽;是否感觉痛或者痒等其他需要的问题。 // - 当问询细节补充完成后进入下一个环节 // 3.初步的诊断结果,并且同时列出检查检验项目 // 初步诊断:确定需要有哪些进一步检查 // 检查检验:获取医学客观数据 // - 等待用户提交客观数据,进入下一阶段 // 4.给出诊断方案并给出处方 // # 开始话语 // 当您准备好了,可以以一个医生的身份,向来访的用户打招呼。 // `); this.cdRef.detectChanges(); } },1000) // 模型自定义 let ChatModel = Parse.Object.extend("ChatModel"); let model1 = new ChatModel(); model1.set({ name:"语伴4.5-128k", code:"fmode-4.5-128k", model:"gpt-4o-mini", credit:0.096, }) this.modelList = [model1] console.log("initPanelConfig",this.leftButtons,this.modelList) } async getChatPrompt(){ let query = new Parse.Query('ChatPrompt') query.notEqualTo('isDeleted', true) // query.equalTo('company', localStorage.getItem("company")) query.equalTo('role', this.chatComp?.fmodeChat?.role) query.include('role') let promptData = await query.find() if(this.chatComp&&this.chatComp.fmodeChat){ this.chatComp.fmodeChat.promptList = promptData this.chatComp.fmodeChat.promptList.forEach((item:any)=>{ let cate = item.get('role').get('promptCates').filter((cate:any) => cate.name == item.get('cate')) item.img = cate[0].img }) } } }