2 lines
10 KiB
JavaScript
2 lines
10 KiB
JavaScript
|
|
import{d as a,r as s,o as e,b as t,e as l,f as n,w as o,i,E as c,j as u,l as r,m as d,F as f,n as _,k as m,g as p,t as v,s as h,C as g,q as b,y,z as w,x as k,u as C,S as A,R as x}from"./index-pnQqyMoS.js";import{_ as j}from"./config-doctor.TgARj_nM.js";import{F as S,a as E,r as I}from"./session.CQodznPl.js";import{b as D}from"./navigation.DVfJwOxJ.js";import{_ as O}from"./_plugin-vue_export-helper.BCo6x5W8.js";async function T(a){const s=(null==a?void 0:a.trim())?{title:a.trim().slice(0,100)}:{},e=await fetch(`${S}/learning-assistant/sessions`,{method:"POST",headers:E(),body:JSON.stringify(s)});if(!e.ok)throw new Error(await I(e));const t=await e.json();if("OK"!==t.code||!t.data)throw new Error(t.message||"新建会话失败");const l=function(a){const s=a.assistant_session_id||a.session_id||a.id;return"number"==typeof s||"string"==typeof s?s:""}(t.data);if(!l)throw new Error("新建会话返回缺少 assistant_session_id");return{...t.data,assistant_session_id:l}}function $(a,s){var e,t,l;const n=(null==(e=a.match(/^event:\s*(.+)$/m))?void 0:e[1])||"",o=a.split("\n").filter((a=>a.startsWith("data:"))).map((a=>a.replace(/^data:\s?/,"")));if(0===o.length)return;const i=o.join("\n");if("[DONE]"===i)return void(null==(t=s.onDone)||t.call(s,{}));let c=i;try{c=JSON.parse(i)}catch{}if("error"===n){const a="object"==typeof c&&c?c.message:c;throw new Error("string"==typeof a?a:"AI 学习助手回复失败")}const u=function(a){if("string"==typeof a)return a;if(!a||"object"!=typeof a)return"";const s=a,e=s.delta||s.content||s.answer||s.text;if("string"==typeof e)return e;const t=s.data;if(t&&"object"==typeof t){const a=t,s=a.delta||a.content||a.answer||a.text;if("string"==typeof s)return s}return""}(c);u&&s.onDelta(u),"done"!==n&&"message_done"!==n||null==(l=s.onDone)||l.call(s,"object"==typeof c&&c?c:{})}const q=O(a({__name:"learning-assistant",emits:["go-home","open-settings","open-profile"],setup(a,{emit:O}){const q=D(O),F=["更新指南","风险评估量表","药理学详情","病例研讨"],N=[{index:"1",title:"早期识别",description:"10分钟内完成12导联心电图。"},{index:"2",title:"药物干预",description:"阿司匹林、氯吡格雷。"},{index:"3",title:"再灌注策略",description:"STEMI需紧急PCI。"}],J=s([]),P=s(""),V=s(!1),M=s(!1),R=s(""),z=s(!1),H=s(0),K=s(null),U=s(!1);let W=null,B=null;async function G(){const a=P.value.trim();if(!a)return void Q("请输入问题");if(U.value)return;J.value.push({id:`user-${Date.now()}`,role:"user",content:a}),P.value="",M.value=!0,U.value=!0,L();const s=J.value.length;J.value.push({id:`assistant-${Date.now()}`,role:"assistant",variant:"simple",content:""});try{const e=await async function(a){if(K.value)return K.value;const s=await T(a);return K.value=s,h("clinical-thinking-learning-assistant-session",s),s}(a);null==B||B.abort(),B=new AbortController,await async function(a,s,e,t){const l=await fetch(`${S}/learning-assistant/sessions/${a}/chat/stream`,{method:"POST",headers:E("text/event-stream"),body:JSON.stringify(s),signal:t});if(!l.ok||!l.body)throw new Error(await I(l));const n=l.body.getReader(),o=new TextDecoder;let i="";for(;;){const{value:a,done:s}=await n.read();if(s)break;i+=o.decode(a,{stream:!0});const t=i.split("\n\n");i=t.pop()||"";for(const l of t)$(l,e)}i.trim()&&$(i,e)}(e.assistant_session_id,{question:a},{onDelta:a=>{J.value[s].content+=a,L()}},B.signal),J.value[s].content.trim()||(J.value[s].content="暂未生成回复,请稍后重试。")}catch(e){J.value[s].content=e instanceof Error?e.message:"AI 学习助手回复失败",Q(J.value[s].content)}finally{M.value=!1,U.value=!1,L()}}function L(){b((()=>{H.value+=1e3}))}function Q(a){W&&clearTimeout(W),R.value=a,z.value=!0,W=setTimeout((()=>{z.value=!1}),1800)}return e((()=>{!async function(){try{const a=g("clinical-thinking-learning-assistant-session");if(a&&"object"==typeof a)return void(K.value=a);K.value=await T("AI 学习助手"),h("clinical-thinking-learning-assistant-session",K.value)}catch(a){Q(a instanceof Error?a.message:"新建会话失败")}}()})),t((()=>{null==B||B.abort(),W&&clearT
|