Files
vueapp/dist/assets/pages-learning-assistant-learning-assistant.Bq8COlcP.js
T
2026-06-24 11:11:11 +08:00

2 lines
12 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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-B3xhAghV.js";import{_ as A}from"./config-doctor.TgARj_nM.js";import{F as S,a as E,r as $}from"./session.DPiOuS8W.js";import{b as O}from"./navigation.CCHZDycG.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")}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-6964d26f"]]);export{J as default};