2 lines
12 KiB
JavaScript
2 lines
12 KiB
JavaScript
import{D as t,s as a,d as e,r as s,o as l,b as n,e as o,f as i,w as c,i as r,E as u,j as d,l as f,m as p,F as m,n as _,k as v,g as h,t as g,u as b,z as w,A as y,y as k,x as C,S as j,N as x}from"./index-DfCP9RI3.js";import{_ as A}from"./config-doctor.TgARj_nM.js";import{F as S,a as E,r as $}from"./session.D2K7L0GR.js";import{b as O}from"./navigation.Bg2Ef9wA.js";import{_ as D}from"./_plugin-vue_export-helper.BCo6x5W8.js";async function I(t){const a=(null==t?void 0:t.trim())?{title:t.trim().slice(0,100)}:{},e=await fetch(`${S}/learning-assistant/sessions`,{method:"POST",headers:E(),body:JSON.stringify(a)});if(!e.ok)throw new Error(await $(e));const s=await e.json();if("OK"!==s.code||!s.data)throw new Error(s.message||"新建会话失败");const l=function(t){const a=t.assistant_session_id||t.session_id||t.id;return"number"==typeof a||"string"==typeof a?a:""}(s.data);if(!l)throw new Error("新建会话返回缺少 assistant_session_id");return{...s.data,assistant_session_id:l}}async function T(t,a){var e;const s=await fetch("http://8.160.178.88:8088/v1/workflows/run",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json",Authorization:"Bearer app-9BapxGXgF2qQi9HHkq4R95Y7"},body:JSON.stringify({inputs:{input:t},response_mode:"blocking",user:q()}),signal:a});if(!s.ok)throw new Error(await async function(t){const a=await t.text().catch((()=>""));if(!a)return`临床思维训练书籍请求失败(${t.status})`;try{const t=JSON.parse(a),e=t.message||t.detail||t.error;if("string"==typeof e&&e.trim())return e}catch{}return a}(s));const l=await s.json();if((null==(e=l.data)?void 0:e.status)&&"succeeded"!==l.data.status)throw new Error(l.data.error||"临床思维训练书籍生成失败");const n=function(t){const a=t.data;if(a&&"object"==typeof a){const t=N(a.outputs)||N(a.output)||N(a.answer)||N(a.text)||N(a.result);if(t)return t}return N(t.output)||N(t.answer)||N(t.text)||N(t.result)}(l);if(!n)throw new Error("临床思维训练书籍内容为空,请稍后重试");return n}function q(){const e="clinical-thinking-workflow-user-id",s=t(e);if("string"==typeof s&&s.trim())return s;const l=`clinical-thinking-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;return a(e,l),l}function N(t){if("string"==typeof t)return t.trim();if(Array.isArray(t))return t.map(N).filter(Boolean).join("\n");if(!t||"object"!=typeof t)return"";const a=t,e=["answer","text","result","output","content","markdown","data"];for(const s of e){const t=N(a[s]);if(t)return t}return Object.entries(a).map((([t,a])=>{const e=N(a);return e?`${t}:${e}`:""})).filter(Boolean).join("\n")}function F(t,a){var e,s,l;const n=(null==(e=t.match(/^event:\s*(.+)$/m))?void 0:e[1])||"",o=t.split("\n").filter((t=>t.startsWith("data:"))).map((t=>t.replace(/^data:\s?/,"")));if(0===o.length)return;const i=o.join("\n");if("[DONE]"===i)return void(null==(s=a.onDone)||s.call(a,{}));let c=i;try{c=JSON.parse(i)}catch{}if("error"===n){const t="object"==typeof c&&c?c.message:c;throw new Error("string"==typeof t?t:"AI 学习助手回复失败")}const r=function(t){if("string"==typeof t)return t;if(!t||"object"!=typeof t)return"";const a=t,e=a.delta||a.content||a.answer||a.text;if("string"==typeof e)return e;const s=a.data;if(s&&"object"==typeof s){const t=s,a=t.delta||t.content||t.answer||t.text;if("string"==typeof a)return a}return""}(c);r&&a.onDelta(r),"done"!==n&&"message_done"!==n||null==(l=a.onDone)||l.call(a,"object"==typeof c&&c?c:{})}const J=D(e({__name:"learning-assistant",emits:["go-home","open-settings","open-profile"],setup(e,{emit:D}){const q=O(D),N=[{index:"1",title:"早期识别",description:"10分钟内完成12导联心电图。"},{index:"2",title:"药物干预",description:"阿司匹林、氯吡格雷。"},{index:"3",title:"再灌注策略",description:"STEMI需紧急PCI。"}],J=s([]),B=s(""),P=s(!1),H=s(!1),M=s(""),V=s(!1),z=s(0),R=s(null),G=s(!1),K=s("");let Q=null,U=null,W=null;function X(){G.value||(K.value="clinical-books"===K.value?"":"clinical-books")}async function Y(){const t=B.value.trim();if(!t)return void Z("请输入问题");if(G.value)return;J.value.push({id:`user-${Date.now()}`,role:"user",content:t}),B.value="",H.value=!0,G.value=!0,L();const e=J.value.length;J.value.push({id:`assistant-${Date.now()}`,role:"assistant",variant:"simple",content:""});try{if("clinical-books"===K.value){null==W||W.abort(),W=new AbortController;const a=await T(t,W.signal);J.value[e].content=a}else{const s=await async function(t){if(R.value)return R.value;const e=await I(t);return R.value=e,a("clinical-thinking-learning-assistant-session",e),e}(t);null==U||U.abort(),U=new AbortController,await async function(t,a,e,s){const l=await fetch(`${S}/learning-assistant/sessions/${t}/chat/stream`,{method:"POST",headers:E("text/event-stream"),body:JSON.stringify(a),signal:s});if(!l.ok||!l.body)throw new Error(await $(l));const n=l.body.getReader(),o=new TextDecoder;let i="";for(;;){const{value:t,done:a}=await n.read();if(a)break;i+=o.decode(t,{stream:!0});const s=i.split("\n\n");i=s.pop()||"";for(const l of s)F(l,e)}i.trim()&&F(i,e)}(s.assistant_session_id,{question:t},{onDelta:t=>{J.value[e].content+=t,L()}},U.signal),J.value[e].content.trim()||(J.value[e].content="暂未生成回复,请稍后重试。")}}catch(s){const t="clinical-books"===K.value?"临床思维训练书籍生成失败":"AI 学习助手回复失败";J.value[e].content=s instanceof Error?s.message:t,Z(J.value[e].content)}finally{H.value=!1,G.value=!1,L()}}function L(){b((()=>{z.value+=1e3}))}function Z(t){Q&&clearTimeout(Q),M.value=t,V.value=!0,Q=setTimeout((()=>{V.value=!1}),1800)}return l((()=>{!async function(){try{const e=t("clinical-thinking-learning-assistant-session");if(e&&"object"==typeof e)return void(R.value=e);R.value=await I("AI 学习助手"),a("clinical-thinking-learning-assistant-session",R.value)}catch(e){Z(e instanceof Error?e.message:"新建会话失败")}}()})),n((()=>{null==U||U.abort(),null==W||W.abort(),Q&&clearTimeout(Q)})),(t,a)=>{const e=w,s=y,l=k,n=C,b=j,S=x;return o(),i(e,{class:"learning-page"},{default:c((()=>[r(e,{class:"learning-shell"},{default:c((()=>[r(e,{class:"assistant-header"},{default:c((()=>[r(e,{class:"header-left"},{default:c((()=>[r(s,{class:"icon-button","aria-label":"返回",onClick:u(q)},{default:c((()=>[r(e,{class:"history-icon"})])),_:1},8,["onClick"]),r(l,{class:"page-title"},{default:c((()=>[d("AI 学习助手")])),_:1})])),_:1}),r(e,{class:"header-actions"},{default:c((()=>[r(s,{class:"director-chip",onClick:a[0]||(a[0]=t=>P.value=!0)},{default:c((()=>[r(n,{class:"director-thumb",src:A,mode:"aspectFill"}),r(l,null,{default:c((()=>[d("咨询王主任")])),_:1})])),_:1}),r(s,{class:"icon-button muted","aria-label":"更多",onClick:a[1]||(a[1]=t=>Z("更多功能即将开放"))},{default:c((()=>[r(e,{class:"more-icon"})])),_:1})])),_:1})])),_:1}),r(b,{class:"chat-canvas","scroll-y":"","scroll-top":z.value},{default:c((()=>[r(e,{class:"time-row"},{default:c((()=>[r(l,null,{default:c((()=>[d("今天 10:42 AM")])),_:1})])),_:1}),(o(!0),f(m,null,p(J.value,(t=>(o(),i(e,{key:t.id,class:_(["message-block",`message-${t.role}`])},{default:c((()=>["user"===t.role?(o(),i(e,{key:0,class:"user-bubble"},{default:c((()=>[r(l,null,{default:c((()=>[d(g(t.content),1)])),_:2},1024)])),_:2},1024)):(o(),i(e,{key:1,class:"assistant-message"},{default:c((()=>[r(e,{class:"assistant-meta"},{default:c((()=>[r(e,{class:"robot-badge"},{default:c((()=>[r(e,{class:"robot-icon"})])),_:1}),r(l,null,{default:c((()=>[d("AI 临床助理")])),_:1})])),_:1}),"acs-pathway"===t.variant?(o(),i(e,{key:0,class:"assistant-card"},{default:c((()=>[r(l,{class:"response-intro"},{default:c((()=>[d("急性冠脉综合征(ACS)临床路径:")])),_:1}),r(e,{class:"pathway-card"},{default:c((()=>[(o(),f(m,null,p(N,(t=>r(e,{key:t.title,class:"pathway-step"},{default:c((()=>[r(l,{class:"step-index"},{default:c((()=>[d(g(t.index),1)])),_:2},1024),r(e,{class:"step-copy"},{default:c((()=>[r(l,{class:"step-title"},{default:c((()=>[d(g(t.title),1)])),_:2},1024),r(l,{class:"step-desc"},{default:c((()=>[d(g(t.description),1)])),_:2},1024)])),_:2},1024)])),_:2},1024))),64))])),_:1}),r(e,{class:"evidence-box"},{default:c((()=>[r(e,{class:"evidence-heading"},{default:c((()=>[r(e,{class:"verified-icon"}),r(l,null,{default:c((()=>[d("循证来源")])),_:1})])),_:1}),r(l,{class:"evidence-item"},{default:c((()=>[d("[1] 2023 AHA/ACC ACS 管理指南")])),_:1}),r(l,{class:"evidence-item"},{default:c((()=>[d("[2] 《临床诊疗常规:心血管分册》")])),_:1})])),_:1})])),_:1})):(o(),i(e,{key:1,class:"assistant-card simple-card"},{default:c((()=>[r(l,null,{default:c((()=>[d(g(t.content),1)])),_:2},1024)])),_:2},1024))])),_:2},1024))])),_:2},1032,["class"])))),128)),r(e,{class:_(["typing-row",{visible:H.value}])},{default:c((()=>[r(e,{class:"typing-dots"},{default:c((()=>[r(e,{class:"dot dot-one"}),r(e,{class:"dot dot-two"}),r(e,{class:"dot dot-three"})])),_:1}),r(l,null,{default:c((()=>[d("正在思考中...")])),_:1})])),_:1},8,["class"])])),_:1},8,["scroll-top"]),r(e,{class:"input-panel"},{default:c((()=>[r(b,{class:"quick-actions","scroll-x":""},{default:c((()=>[r(e,{class:"quick-row"},{default:c((()=>[r(s,{class:_(["quick-chip",{active:"clinical-books"===K.value,disabled:G.value}]),disabled:G.value,onClick:X},{default:c((()=>[d(" 临床思维训练书籍 ")])),_:1},8,["class","disabled"])])),_:1})])),_:1}),r(e,{class:"composer"},{default:c((()=>[r(S,{class:"message-input",modelValue:B.value,"onUpdate:modelValue":a[2]||(a[2]=t=>B.value=t),"auto-height":"",maxlength:"1000",placeholder:"请输入您的问题...","placeholder-class":"input-placeholder",onConfirm:Y},null,8,["modelValue"]),r(e,{class:"composer-actions"},{default:c((()=>[r(s,{class:"attach-button","aria-label":"附件",onClick:a[3]||(a[3]=t=>Z("附件上传即将开放"))},{default:c((()=>[r(e,{class:"attach-icon"})])),_:1}),r(s,{class:_(["send-button",{disabled:G.value}]),disabled:G.value,"aria-label":"发送",onClick:Y},{default:c((()=>[r(e,{class:"send-icon"})])),_:1},8,["class","disabled"])])),_:1})])),_:1}),r(l,{class:"disclaimer"},{default:c((()=>[d("AI 生成内容仅供临床参考,最终医疗决策请咨询资深医师。")])),_:1})])),_:1}),P.value?(o(),i(e,{key:0,class:"modal-mask",onClick:a[9]||(a[9]=t=>P.value=!1)},{default:c((()=>[r(e,{class:"wang-modal",onClick:a[8]||(a[8]=v((()=>{}),["stop"]))},{default:c((()=>[r(e,{class:"modal-header"},{default:c((()=>[r(e,{class:"modal-doctor"},{default:c((()=>[r(n,{class:"modal-avatar",src:A,mode:"aspectFill"}),r(e,{class:"modal-title-group"},{default:c((()=>[r(l,{class:"modal-title"},{default:c((()=>[d("王主任")])),_:1}),r(l,{class:"modal-subtitle"},{default:c((()=>[d("临床教育首席专家")])),_:1})])),_:1})])),_:1}),r(s,{class:"icon-button muted","aria-label":"关闭",onClick:a[4]||(a[4]=t=>P.value=!1)},{default:c((()=>[r(e,{class:"close-icon"})])),_:1})])),_:1}),r(e,{class:"modal-body"},{default:c((()=>[r(e,{class:"quote-card"},{default:c((()=>[r(l,null,{default:c((()=>[d("“对于 ACS 患者,请务必牢记:时间就是心肌。虽然 AI 提供了标准的临床路径,但结合患者个体化风险特征的临床判断仍是您最关键的工具。”")])),_:1})])),_:1}),r(e,{class:"mentor-grid"},{default:c((()=>[r(s,{class:"mentor-card",onClick:a[5]||(a[5]=t=>Z("已选择查房带教"))},{default:c((()=>[r(e,{class:"school-small-icon"}),r(l,null,{default:c((()=>[d("查房带教")])),_:1})])),_:1}),r(s,{class:"mentor-card",onClick:a[6]||(a[6]=t=>Z("已选择疑难会诊"))},{default:c((()=>[r(e,{class:"notes-small-icon"}),r(l,null,{default:c((()=>[d("疑难会诊")])),_:1})])),_:1})])),_:1}),r(s,{class:"guidance-button",onClick:a[7]||(a[7]=t=>Z("一对一指导即将开始"))},{default:c((()=>[d(" 开始一对一指导 ")])),_:1})])),_:1})])),_:1})])),_:1})):h("",!0),r(e,{class:_(["toast",{visible:V.value}])},{default:c((()=>[d(g(M.value),1)])),_:1},8,["class"])])),_:1})])),_:1})}}}),[["__scopeId","data-v-18a2f742"]]);export{J as default};
|