123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- 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
- })
- }
- }
- }
|