page-create-agent.component.ts 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. import { Component, OnInit } from '@angular/core';
  2. import { Router } from '@angular/router';
  3. import { CloudObject, CloudQuery, CloudUser } from 'src/lib/ncloud';
  4. import { IonHeader, IonToolbar, IonTitle, IonContent, IonButton,IonIcon, ModalController, IonTextarea, IonInput, IonCard, IonCardHeader, IonCardTitle, IonThumbnail, IonCardContent, IonCardSubtitle, IonItem, IonList, IonLabel, IonAvatar, IonSelect, IonSelectOption, AlertController, IonButtons, IonProgressBar, IonText, IonRefresherContent, IonRefresher, ToastController, IonToast } from '@ionic/angular/standalone';
  5. import { CommonModule } from '@angular/common';
  6. import { AvatarModule, ChatPanelOptions, DalleOptions, FmodeChat, FmodeChatCompletion, FmodeChatMessage, ImagineWork, openChatPanelModal } from 'fmode-ng';
  7. @Component({
  8. selector: 'app-page-create-agent',
  9. templateUrl: './page-create-agent.component.html',
  10. styleUrls: ['./page-create-agent.component.scss'],
  11. standalone: true,
  12. imports: [
  13. IonHeader, IonToolbar, IonTitle, IonContent, IonButton,IonTextarea,IonInput,
  14. IonIcon,IonCard,IonCardHeader,IonCardTitle,
  15. IonCardSubtitle,IonCardContent, IonThumbnail, IonItem,IonList,CommonModule,IonLabel,
  16. IonAvatar, IonSelect, IonSelectOption,IonButtons,IonProgressBar,
  17. IonText, IonCardHeader, IonCardSubtitle,IonRefresher,IonRefresherContent,
  18. IonToast
  19. ],
  20. })
  21. export class PageCreateAgentComponent implements OnInit {
  22. public buffer = 0.05;
  23. public progress = 0;
  24. async presentToast(position: 'top' | 'middle' | 'bottom') {
  25. const toast = await this.toastController.create({
  26. message: '正在创建智能体,请耐心等待!',
  27. duration: 1500,
  28. position: position,
  29. });
  30. await toast.present();
  31. }
  32. handleRefresh(event:any) {
  33. setTimeout(() => {
  34. // Any calls to load data go here
  35. this.loadAgentData()
  36. event.target.complete();
  37. }, 2000);
  38. }
  39. currentUser: CloudUser;
  40. constructor(
  41. private toastController: ToastController,
  42. private modalCtrl:ModalController,
  43. private router:Router,
  44. private alertController: AlertController
  45. ) {
  46. this.currentUser = new CloudUser();
  47. // 示例任务,自己生成图片后请存储新的ID
  48. this.imagineWork = new ImagineWork("");
  49. this.imagineWork.fetchTask().then(work=>{
  50. if(work){
  51. this.imagineWork.id = work.id
  52. }
  53. this.images = this.imagineWork?.images || '../../assets/image/头像示例.png';
  54. })
  55. this.loadAgentData()
  56. }
  57. images:Array<string> = []
  58. back:string = "返回";
  59. backhome() {
  60. this.router.navigate(['/tabs/tab1']);
  61. }
  62. ngOnInit() {
  63. }
  64. name: string = ''
  65. nameInput(e:any) {
  66. this.name = e.detail.value;
  67. console.log(this.name);
  68. }
  69. age: number = 18;
  70. ageInput(e:any) {
  71. this.age = e.detail.value;
  72. console.log(this.age);
  73. }
  74. gender: string = "男";
  75. genderChange(e:any) {
  76. console.log('ionChange fired with value: ' + e.detail.value);
  77. this.gender = e.detail.value;
  78. }
  79. genderCancel(){
  80. }
  81. genderDismiss(){
  82. }
  83. // 描述
  84. desc: string = ''
  85. descInput(e:any) {
  86. this.desc = e.detail.value;
  87. console.log(this.desc);
  88. }
  89. imagineWork:ImagineWork
  90. PictureDescResult:string = `` // 画面描述结果
  91. // 创建医生
  92. async createAgent() {
  93. let alert1 = await this.alertController.create({
  94. header: '温馨提示',
  95. subHeader: 'Tips',
  96. message: '把信息填写完整哦~',
  97. buttons: ['好的'],
  98. });
  99. let alert2 = await this.alertController.create({
  100. header: '温馨提示',
  101. subHeader: 'Tips',
  102. message: '智能体已经创建成功!',
  103. buttons: ['好的'],
  104. });
  105. let alert3 = await this.alertController.create({
  106. header: '温馨提示',
  107. subHeader: 'Tips',
  108. message: '智能体开始创建,请耐心等待!',
  109. buttons: ['好的'],
  110. });
  111. let alert4 = await this.alertController.create({
  112. header: '温馨提示',
  113. subHeader: 'Tips',
  114. message: '智能体创建失败,请重新创建!',
  115. buttons: ['好的'],
  116. });
  117. if (this.name == '' || this.age == 0 || this.gender == '' || this.desc == '') {
  118. await alert1.present();
  119. return;
  120. }
  121. await alert3.present();
  122. let a = setInterval(() => {
  123. this.buffer += 0.03;
  124. this.progress += 0.02;
  125. if (this.progress > 1) {
  126. this.buffer = 0.00;
  127. this.progress = 0;
  128. // 删除定时器
  129. clearInterval(a);
  130. }
  131. }, 1000);
  132. localStorage.setItem("company","E4KpGvTEto")
  133. let consult = new CloudObject("DoctorAgent")
  134. let now = new Date();
  135. let dateStr = `${now.getFullYear()}-${now.getMonth()+1}-${now.getDate()}`
  136. // 对象权限的精确指定
  137. let ACL:any = {
  138. "*":{read:true,write:true}
  139. }
  140. if(this.currentUser?.id){
  141. ACL[this.currentUser?.id] = {read:true,write:true}
  142. }
  143. this.imagineWork = new ImagineWork();
  144. // 文本生成
  145. let PromptTemplate = `您是一名专业的美术画家,擅长画各类型头像图,请您根据下面提供的需求内容,将其描述的画面、场景、人物、物品等用最简短的语言表达,直接写出画面,
  146. 需求如下:
  147. ${this.name},${this.age}岁,${this.gender},描述:${this.desc}
  148. `
  149. let completion = new FmodeChatCompletion([
  150. {role:"system",content:""},
  151. {role:"user",content:PromptTemplate}
  152. ])
  153. let avatar = ""
  154. if (!this.name || !this.desc){
  155. this.progress = 0; // 进度条重置
  156. await alert4.present();
  157. }
  158. completion.sendCompletion().subscribe((message:any)=>{
  159. // 打印消息体
  160. console.log(message.content)
  161. // 赋值消息内容给组件内属性
  162. this.PictureDescResult = message.content
  163. if(message?.complete){ // 判断message为完成状态,则设置isComplete为完成
  164. // 图片生成
  165. let PicturePrompt = `${this.PictureDescResult}\n风格:画面不带任何文字。人物为主体,人物要在图片的正中央。其中人物必须帅气,符合现代中国人审美。`
  166. let options:DalleOptions = {prompt:PicturePrompt}
  167. this.imagineWork?.draw(options).subscribe(work=>{
  168. if(work?.get("images")?.length){
  169. avatar = work?.get("images")[0];
  170. console.log(work?.get("images"));
  171. console.log("work",work);
  172. console.log("里面的avatar",avatar);
  173. consult.set({
  174. avatar:`${avatar}`,
  175. name:`${this.name}`,
  176. age:`${this.age}`,
  177. gender:`${this.gender}`,
  178. desc:`${this.desc}`,
  179. user:this.currentUser.toPointer(),
  180. ACL:ACL,
  181. })
  182. consult.save();
  183. this.progress = 1;
  184. console.log("consult",consult);
  185. alert2.present();
  186. this.loadAgentData();
  187. this.name = ''
  188. this.desc = ''
  189. }
  190. })
  191. }
  192. })
  193. }
  194. agentList: Array<CloudObject> = [];
  195. async loadAgentData() {
  196. let user = new CloudUser();
  197. let query = new CloudQuery("DoctorAgent")
  198. query.equalTo("user",user?.id)
  199. let agentlist = await query.find()
  200. // 将查询到的数据反向排序
  201. this.agentList = agentlist.reverse()
  202. console.log(this.agentList);
  203. }
  204. openInquiry(doctor:CloudObject){
  205. // 验证用户登录
  206. let currentUser = new CloudUser();
  207. let userPrompt = ``
  208. if(currentUser?.get("realname")){
  209. userPrompt += `当前来访的患者,姓名:${currentUser?.get("realname")}`
  210. }
  211. if(currentUser?.get("gender")){
  212. userPrompt += `,性别:${currentUser?.get("gender")}`
  213. }
  214. if(currentUser?.get("age")){
  215. userPrompt += `,年龄:${currentUser?.get("age")}`
  216. }
  217. localStorage.setItem("company","E4KpGvTEto")
  218. let consult = new CloudObject("Consultation")
  219. let now = new Date();
  220. let dateStr = `${now.getFullYear()}-${now.getMonth()+1}-${now.getDate()}`
  221. // 对象权限的精确指定
  222. let ACL:any = {
  223. "*":{read:true,write:true}
  224. }
  225. if(currentUser?.id){
  226. ACL[currentUser?.id] = {read:true,write:true}
  227. }
  228. consult.set({
  229. title:`门诊记录${dateStr}-${doctor?.get("name")}`,
  230. doctor:doctor.toPointer(),
  231. user:currentUser.toPointer(),
  232. ACL:ACL
  233. })
  234. let options:ChatPanelOptions = {
  235. roleId:"2DXJkRsjXK",
  236. onChatInit:(chat:FmodeChat)=>{
  237. console.log("onChatInit");
  238. console.log("预设角色",chat.role);
  239. chat.role.set("name",doctor?.get("name"));
  240. chat.role.set("desc",doctor?.get("desc"));
  241. chat.role.set("avatar",doctor?.get("avatar") || "../../assets/image/doctor7.png")
  242. chat.role.set("prompt",`
  243. # 角色设定
  244. 您是${doctor?.get("name")},${doctor?.get("desc")},年龄${doctor?.get("age")}岁,需要完成一次完整的门诊服务。
  245. # 对话环节
  246. 0.导诊(根据用户基本情况,引导挂号合适的科室)
  247. 1.预设的问询方式(根据不同症状来问询具体的情况)
  248. - 打招呼,以用户自述为主
  249. - 当信息充足时候,确认用户症状对应的科室,并进入下一个环节
  250. 2.拓展的问询细节
  251. 例如:用户反映呼吸不畅,拓展出:是否咳嗽;是否感觉痛或者痒等其他需要的问题。
  252. - 当问询细节补充完成后进入下一个环节
  253. 3.初步的诊断结果,并且同时列出检查检验项目
  254. 初步诊断:确定需要有哪些进一步检查
  255. 检查检验:获取医学客观数据
  256. - 等待用户提交客观数据,进入下一阶段
  257. 4.给出诊断方案并给出处方
  258. - 完成处方时,请在消息结尾附带: [处方完成]
  259. # 开始话语
  260. 当您准备好了,可以以一个医生的身份,向来访的用户打招呼。
  261. ${userPrompt}
  262. `);
  263. },
  264. onMessage:(chat:FmodeChat,message:FmodeChatMessage)=>{
  265. console.log("onMessage",message)
  266. let content:any = message?.content
  267. if(typeof content == "string"){
  268. if(content?.indexOf("[处方完成]")>-1){
  269. console.log("门诊已完成")
  270. consult.set({
  271. content:content // 处方内容
  272. })
  273. consult.save();
  274. }
  275. }
  276. },
  277. onChatSaved:(chat:FmodeChat)=>{
  278. // chat?.chatSession?.id 本次会话的 chatId
  279. console.log("onChatSaved",chat,chat?.chatSession,chat?.chatSession?.id)
  280. }
  281. }
  282. openChatPanelModal(this.modalCtrl,options)
  283. }
  284. deleteAgent(agent:CloudObject){
  285. console.log("删除了",agent);
  286. agent.destroy();
  287. this.loadAgentData();
  288. }
  289. }