import{E as he,a as _e}from"./el-form-item-CVKPsKks.js";import{E as be}from"./index-BXTVgd_U.js";import{a as ke,E as ye}from"./index-CX3tRQGA.js";import{ak as Ce,J as ge,a6 as we,b as Y,R as H,a5 as xe,T as Te,i as Ee,y as b,D as Z,a as L,j as T,F as Ie,aJ as W,k as Ve,C as Se,aK as Ke,d as O,o as g,c as E,h as R,n as K,f as s,B as Ne,q as l,x as ee,aa as A,s as _,w as x,e as te,r as $e,E as Pe,t as se,aL as ae,K as ne,L as Ae,ab as De,l as Be,G as Me,g as F,M as Fe,ad as He,aM as Re,ac as Ue,P as M,A as qe,z as Le,v as Oe}from"./index-DlMMG01R.js";import{C as oe,U as le}from"./raf-BkRpj8vQ.js";import{c as G}from"./castArray-7zADuvev.js";import{E as ze}from"./index-1HuwlNfR.js";import{E as je}from"./el-drawer-TffmoHSa.js";import{E as Je}from"./el-slider-leM7mLgE.js";import"./el-popper-IyKEajFX.js";import"./el-tooltip-l0sNRNKZ.js";import"./el-input-number-fKfc92sH.js";import{_ as We}from"./MarkdownView.vue_vue_type_style_index_0_lang-5bb5if_P.js";import{b as Ge,a as Qe}from"./compare-BmbHBUFR.js";import{_ as Xe}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./_baseClone-ByfTJ6fR.js";import"./index-bqLfwDNC.js";import"./index-BF7OFqWH.js";import"./index-4_3fwCBX.js";import"./index-DShMbbkV.js";import"./scroll-DrJeZ2h7.js";import"./use-dialog-0fWwqAmP.js";import"./debounce-Bbj-pL2w.js";import"./toNumber-EgQ2Nr-7.js";import"./clamp-BOWtGcsb.js";import"./index-CicPf2dR.js";const Q=t=>Ce(t)||ge(t)||we(t),Ye=Y({accordion:Boolean,modelValue:{type:H([Array,String,Number]),default:()=>xe([])},expandIconPosition:{type:H([String]),default:"right"},beforeCollapse:{type:H(Function)}}),Ze={[le]:Q,[oe]:Q},ie=Symbol("collapseContextKey"),et=Y({title:{type:String,default:""},name:{type:H([String,Number]),default:void 0},icon:{type:Ee,default:Te},disabled:Boolean}),X="ElCollapse",tt=(t,i)=>{const d=b(G(t.modelValue)),p=o=>{d.value=o;const r=t.accordion?d.value[0]:d.value;i(le,r),i(oe,r)},n=o=>{if(t.accordion)p([d.value[0]===o?"":o]);else{const r=[...d.value],c=r.indexOf(o);c>-1?r.splice(c,1):r.push(o),p(r)}},a=async o=>{const{beforeCollapse:r}=t;if(!r){n(o);return}const c=r(o);[W(c),Ve(c)].includes(!0)||Se(X,"beforeCollapse must return type `Promise` or `boolean`"),W(c)?c.then(f=>{f!==!1&&n(o)}).catch(f=>{Ke(X,`some error occurred: ${f}`)}):c&&n(o)};return Z(()=>t.modelValue,()=>d.value=G(t.modelValue),{deep:!0}),Ie(ie,{activeNames:d,handleItemClick:a}),{activeNames:d,setActiveNames:p}},st=t=>{const i=L("collapse");return{rootKls:T(()=>[i.b(),i.b(`icon-position-${t.expandIconPosition}`)])}};var at=O({name:"ElCollapse",__name:"collapse",props:Ye,emits:Ze,setup(t,{expose:i,emit:d}){const p=t,{activeNames:n,setActiveNames:a}=tt(p,d),{rootKls:o}=st(p);return i({activeNames:n,setActiveNames:a}),(r,c)=>(g(),E("div",{class:K(s(o))},[R(r.$slots,"default")],2))}}),nt=at;const ot=t=>{const i=Ne(ie),{namespace:d}=L("collapse"),p=b(!1),n=b(!1),a=ke(),o=T(()=>a.current++),r=T(()=>t.name??`${d.value}-id-${a.prefix}-${s(o)}`),c=T(()=>i==null?void 0:i.activeNames.value.includes(s(r)));return{focusing:p,id:o,isActive:c,handleFocus:()=>{setTimeout(()=>{n.value?n.value=!1:p.value=!0},50)},handleHeaderClick:v=>{var y;t.disabled||(y=v.target)!=null&&y.closest("input, textarea, select")||(i==null||i.handleItemClick(s(r)),p.value=!1,n.value=!0)},handleEnterClick:v=>{var y;(y=v.target)!=null&&y.closest("input, textarea, select")||(v.preventDefault(),i==null||i.handleItemClick(s(r)))}}},lt=(t,{focusing:i,isActive:d,id:p})=>{const n=L("collapse"),a=T(()=>[n.b("item"),n.is("active",s(d)),n.is("disabled",t.disabled)]),o=T(()=>[n.be("item","header"),n.is("active",s(d)),{focusing:s(i)&&!t.disabled}]),r=T(()=>[n.be("item","arrow"),n.is("active",s(d))]);return{itemTitleKls:T(()=>[n.be("item","title")]),arrowKls:r,headKls:o,rootKls:a,itemWrapperKls:T(()=>n.be("item","wrap")),itemContentKls:T(()=>n.be("item","content")),scopedContentId:T(()=>n.b(`content-${s(p)}`)),scopedHeadId:T(()=>n.b(`head-${s(p)}`))}},it=["id","aria-expanded","aria-controls","aria-describedby","tabindex","aria-disabled"],rt=["id","aria-hidden","aria-labelledby"];var ut=O({name:"ElCollapseItem",__name:"collapse-item",props:et,setup(t,{expose:i}){const d=t,{focusing:p,id:n,isActive:a,handleFocus:o,handleHeaderClick:r,handleEnterClick:c}=ot(d),{arrowKls:f,headKls:k,rootKls:C,itemTitleKls:v,itemWrapperKls:y,itemContentKls:$,scopedContentId:V,scopedHeadId:I}=lt(d,{focusing:p,isActive:a,id:n});return i({isActive:a}),(h,w)=>(g(),E("div",{class:K(s(C))},[l("div",{id:s(I),class:K(s(k)),"aria-expanded":s(a),"aria-controls":s(V),"aria-describedby":s(V),tabindex:t.disabled?void 0:0,"aria-disabled":t.disabled,role:"button",onClick:w[0]||(w[0]=(...N)=>s(r)&&s(r)(...N)),onKeydown:w[1]||(w[1]=se(ae((...N)=>s(c)&&s(c)(...N),["stop"]),["space","enter"])),onFocus:w[2]||(w[2]=(...N)=>s(o)&&s(o)(...N)),onBlur:w[3]||(w[3]=N=>p.value=!1)},[l("span",{class:K(s(v))},[R(h.$slots,"title",{isActive:s(a)},()=>[ee(A(t.title),1)])],2),R(h.$slots,"icon",{isActive:s(a)},()=>[_(s(Pe),{class:K(s(f))},{default:x(()=>[(g(),te($e(t.icon)))]),_:1},8,["class"])])],42,it),_(s(ze),null,{default:x(()=>[ne(l("div",{id:s(V),role:"region",class:K(s(y)),"aria-hidden":!s(a),"aria-labelledby":s(I)},[l("div",{class:K(s($))},[R(h.$slots,"default")],2)],10,rt),[[Ae,s(a)]])]),_:3})],2))}}),re=ut;const dt=Be(nt,{CollapseItem:re}),ct=De(re);function mt(){const t=b({question:"",fullContent:"",displayContent:"",thinkContent:"",isThinking:!1,isStreaming:!1,done:!1}),i=b(!1);function d(a){const o=/([\s\S]*?)(<\/think>)?/g;let r="",c=a,f=!1,k;const C=(a.match(//g)||[]).length,v=(a.match(/<\/think>/g)||[]).length;for(f=C>v;(k=o.exec(a))!==null;)r+=k[1];return c=a.replace(/[\s\S]*?(<\/think>|$)/g,"").trim(),{think:r.trim(),display:c,isThinking:f}}async function p(a){var c;i.value=!0,t.value={question:a.user_question||"",fullContent:"",displayContent:"",thinkContent:"",isThinking:!1,isStreaming:!0,done:!1};let o=0;const r=50;try{const f=await Ge(a);if(!f.ok)throw new Error(`HTTP ${f.status}`);const k=(c=f.body)==null?void 0:c.getReader();if(!k)throw new Error("无法读取响应流");const C=new TextDecoder("utf-8");let v="";for(;;){const{done:$,value:V}=await k.read();if($)break;v+=C.decode(V,{stream:!0}),t.value.fullContent=v;const I=Date.now();if(I-o>=r){o=I;const h=d(v);t.value.thinkContent=h.think,t.value.displayContent=h.display,t.value.isThinking=h.isThinking}}const y=d(v);t.value.thinkContent=y.think,t.value.displayContent=y.display,t.value.isThinking=!1,t.value.isStreaming=!1,t.value.done=!0}catch(f){t.value.isStreaming=!1,t.value.done=!0,t.value.error=f.message||"流式请求失败",t.value.displayContent=t.value.fullContent||t.value.error||"请求失败"}finally{i.value=!1}}function n(){t.value={question:"",fullContent:"",displayContent:"",thinkContent:"",isThinking:!1,isStreaming:!1,done:!1}}return{message:t,loading:i,send:p,reset:n}}const pt={class:"chat-wrap"},ft={class:"chat-header"},vt={class:"header-left"},ht={class:"header-title"},_t={class:"title-text"},bt={key:0,class:"mock-badge"},kt={class:"chat-body-inner"},yt={key:0,class:"empty-hint"},Ct={key:0,class:"avatar assistant"},gt={class:"bubble-wrap"},wt={class:"think-content"},xt={key:1,class:"bubble user-bubble"},Tt={key:2,class:"bubble ai-bubble markdown"},Et={key:3,class:"bubble ai-bubble streaming"},It={class:"chat-input-container"},Vt={class:"chat-input-inner"},St={class:"input-wrapper"},Kt=["disabled","onKeydown"],Nt=["disabled"],$t=O({__name:"InferenceChatView",setup(t){const i=Ue();Oe();const d=i.params.id,p=d==="mock",n=b(i.query.model||""),{message:a,loading:o,send:r,reset:c}=mt(),f=b(null),k=b([]),C=b(""),v=b(""),y=b(.7),$=b(.95),V=b(2048),I=b();let h=null;const w=b(!1);async function N(){var u;if(!p)try{f.value=await Qe(d);const e=z(f.value);(u=e[0])!=null&&u.model_name&&(n.value=e[0].model_name)}catch{}}function z(u){if(!(u!=null&&u.load_status))return[];try{return(typeof u.load_status=="string"?JSON.parse(u.load_status):u.load_status).loaded_models||[]}catch{return[]}}async function j(){const u=C.value.trim();if(!u||o.value)return;k.value.push({role:"user",content:u,done:!0});const e=Le({role:"assistant",content:"",think:"",isThinking:!1,isStreaming:!0,done:!1});if(k.value.push(e),C.value="",await M(),ce(),D(),p){await ue(e,u);return}const S=z(f.value)[0];if(!S){qe.error("未找到已启动的模型"),e.content="未找到已启动的模型,请先返回列表加载模型",e.done=!0,e.isStreaming=!1;return}h=e,await r({port:S.port,model_name:S.model_name,model_path:"",system_prompt:v.value,user_question:u,temperature:y.value,top_p:$.value,max_tokens:V.value}),e.content=a.value.displayContent||a.value.error||"(无回复)",e.think=a.value.thinkContent,e.isThinking=!1,e.isStreaming=!1,e.done=!0,h=null,c(),await M(),D()}async function ue(u,e){const P=`你好!我是 **${n.value||"示例模型"}**(mock 演示)。 你刚才问的是: > ${e} 这是一段模拟回复,用于演示对话界面。接入真实模型后,这里会展示模型的真实推理输出。 ## 说明 - 当前为前端 mock 环境 - 回复内容由本地生成 - 流式打字效果为前端模拟`;for(const S of P)u.content+=S,await M(),D(),u.content.length%3===0&&await new Promise(U=>setTimeout(U,16));u.isStreaming=!1,u.done=!0,await M(),D()}Z(()=>[a.value.displayContent,a.value.thinkContent,a.value.isThinking,a.value.done],async([u,e,P,S])=>{h&&(h.content=u,h.think=e,h.isThinking=P,h.isStreaming=!S,await M(),D())},{flush:"post"});function D(){I.value&&(I.value.scrollTop=I.value.scrollHeight)}function J(){h=null,k.value=[],c()}function de(u){const e=u.target;e.style.height="auto",e.style.height=Math.min(e.scrollHeight,120)+"px"}function ce(){const u=document.querySelector(".input-box");u&&(u.style.height="auto")}return Me(N),(u,e)=>{const P=ct,S=dt,U=be,B=_e,q=Je,me=ye,pe=he,fe=je;return g(),E("div",pt,[l("header",ft,[l("div",vt,[l("div",ht,[l("span",_t,A(n.value||"模型对话"),1),p?(g(),E("span",bt,"mock")):F("",!0)])]),l("button",{class:"header-btn",title:"设置",onClick:e[0]||(e[0]=m=>w.value=!0)},[...e[7]||(e[7]=[l("i",{class:"fa fa-sliders"},null,-1)])])]),l("div",{ref_key:"contentRef",ref:I,class:"chat-body"},[l("div",kt,[k.value.length===0?(g(),E("div",yt,[e[8]||(e[8]=l("div",{class:"empty-logo"},[l("i",{class:"fa fa-cube"})],-1)),e[9]||(e[9]=l("h2",null,"有什么我可以帮你的吗?",-1)),l("p",null,"开始与 "+A(n.value||"模型")+" 对话",1)])):F("",!0),(g(!0),E(Fe,null,He(k.value,(m,ve)=>(g(),E("div",{key:ve,class:K(["msg-row",m.role])},[m.role==="assistant"?(g(),E("div",Ct,[...e[10]||(e[10]=[l("i",{class:"fa fa-robot"},null,-1)])])):F("",!0),l("div",gt,[m.think?(g(),te(S,{key:0,class:"think-collapse"},{default:x(()=>[_(P,{title:"思考过程",name:"think"},{default:x(()=>[l("div",wt,A(m.think),1)]),_:2},1024)]),_:2},1024)):F("",!0),m.role==="user"?(g(),E("div",xt,A(m.content),1)):m.done?(g(),E("div",Tt,[_(We,{content:m.content},null,8,["content"])])):(g(),E("div",Et,[l("span",null,A(m.content||(m.isThinking?"思考中...":"生成中")),1),e[11]||(e[11]=l("span",{class:"typing-cursor"},null,-1))]))])],2))),128))])],512),l("footer",It,[l("div",Vt,[l("button",{class:"clear-btn",title:"清空对话",onClick:J},[...e[12]||(e[12]=[l("i",{class:"fa fa-eraser"},null,-1)])]),l("div",St,[ne(l("textarea",{"onUpdate:modelValue":e[1]||(e[1]=m=>C.value=m),class:"input-box",rows:"1",disabled:s(o),placeholder:"给模型发送消息...",onKeydown:se(ae(j,["exact","prevent"]),["enter"]),onInput:de},null,40,Kt),[[Re,C.value]]),l("button",{class:K(["send-btn",{active:C.value.trim()&&!s(o)}]),disabled:!C.value.trim()||s(o),onClick:j},[...e[13]||(e[13]=[l("i",{class:"fa fa-arrow-up"},null,-1)])],10,Nt)])]),e[14]||(e[14]=l("div",{class:"footer-hint"},"内容由 AI 生成,请仔细甄别。",-1))]),_(fe,{modelValue:w.value,"onUpdate:modelValue":e[6]||(e[6]=m=>w.value=m),title:"对话设置",size:"360px"},{default:x(()=>[_(pe,{"label-position":"top"},{default:x(()=>[_(B,{label:"系统提示词"},{default:x(()=>[_(U,{modelValue:v.value,"onUpdate:modelValue":e[2]||(e[2]=m=>v.value=m),type:"textarea",rows:6,placeholder:"设置模型角色/约束(可选)",resize:"none"},null,8,["modelValue"])]),_:1}),_(B,{label:"Temperature (温度)"},{default:x(()=>[_(q,{modelValue:y.value,"onUpdate:modelValue":e[3]||(e[3]=m=>y.value=m),min:0,max:2,step:.1,"show-input":""},null,8,["modelValue"])]),_:1}),_(B,{label:"Top P (核心采样)"},{default:x(()=>[_(q,{modelValue:$.value,"onUpdate:modelValue":e[4]||(e[4]=m=>$.value=m),min:0,max:1,step:.05,"show-input":""},null,8,["modelValue"])]),_:1}),_(B,{label:"Max Tokens (最大生成长度)"},{default:x(()=>[_(q,{modelValue:V.value,"onUpdate:modelValue":e[5]||(e[5]=m=>V.value=m),min:128,max:8192,step:128,"show-input":""},null,8,["modelValue"])]),_:1}),_(B,null,{default:x(()=>[_(me,{type:"danger",plain:"",onClick:J,style:{width:"100%","margin-top":"20px"}},{default:x(()=>[...e[15]||(e[15]=[l("i",{class:"fa fa-trash-o",style:{"margin-right":"4px"}},null,-1),ee("清空当前对话 ",-1)])]),_:1})]),_:1})]),_:1})]),_:1},8,["modelValue"])])}}}),os=Xe($t,[["__scopeId","data-v-7a15a4cd"]]);export{os as default};