You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1 lines
22 KiB

import{g as Ee,C as Le,c as n,a as s,d,q as S,s as q,F as c,r as C,t as i,l as g,n as h,m as Oe,v as he,x as fe,y as m,z as ke,A as O,o as a,_ as De}from"./6O01ZZML.js";import{u as Be}from"./BgasD__e.js";import{u as je}from"./xsgK-Nup.js";import{L as de}from"./DD3V9C6_.js";const Fe={class:"scopebar"},Ie={class:"flex items-center gap-2"},Te=["value"],ze=["value"],Ge={class:"text-[11px] text-slate-400"},He={key:0,class:"bg-white rounded-xl border border-slate-100 py-16 text-center"},Ke={class:"langsum-head"},Re={class:"langsum-formula"},Xe={key:0,class:"langsum-msg bad"},Pe={key:1,class:"langsum-msg bad"},We={key:2,class:"langsum-langs"},qe=["title"],Je={key:3,class:"langsum-msg"},Qe={key:0,class:"alert alert-warning py-2 text-sm mb-4"},Ye={class:"card"},Ze={class:"card-head"},es={class:"flex gap-2 shrink-0"},ss=["disabled"],ts=["disabled"],ls={class:"probe-bar"},ns=["value"],as={key:0,class:"probe-out"},is={key:1,class:"probe-out bad"},os={key:0,class:"py-10 text-center text-slate-400 text-sm"},ds={class:"min-w-0"},us={class:"svc-prov"},cs={class:"flex flex-wrap gap-1"},rs={key:0,class:"lang"},vs={key:1,class:"text-[11px] text-slate-400"},bs={class:"svc-cost"},_s={key:1,class:"text-slate-300"},ms=["checked","disabled","onChange"],gs={class:"svc-acts"},ps=["disabled","onClick"],hs=["disabled","onClick"],fs=["onClick"],ks=["onClick"],xs={class:"card mt-4"},ys={class:"card-head"},ws={class:"flex gap-2 shrink-0"},Cs=["disabled"],$s=["disabled"],Ns={key:0,class:"py-10 text-center text-slate-400 text-sm"},As={class:"min-w-0"},Vs={class:"svc-name"},Ss={class:"svc-prov"},Ms={class:"svc-cost"},Us={key:1,class:"text-slate-300"},Es=["checked","disabled","onChange"],Ls={class:"svc-acts"},Os=["disabled","onClick"],Ds=["disabled","onClick"],Bs=["onClick"],js=["onClick"],Fs={class:"card mt-4"},Is={class:"card-head"},Ts=["disabled"],zs={class:"mode-bar"},Gs={class:"flex items-center gap-2 cursor-pointer shrink-0"},Hs=["checked","disabled"],Ks={class:"mode-txt"},Rs={key:0,class:"py-10 text-center text-slate-400 text-sm"},Xs={class:"grid place-items-center"},Ps=["checked","disabled","onChange"],Ws={class:"min-w-0"},qs={class:"svc-name"},Js={key:0,title:"多媒体大模型,能识图"},Qs={key:1,class:"chip chip-app ml-1"},Ys={class:"svc-prov"},Zs={class:"svc-cost"},et={key:1,class:"text-slate-300"},st=["checked","disabled","title","onChange"],tt=["checked","disabled","onChange"],lt={class:"svc-acts"},nt=["onClick"],at=["onClick"],it={class:"modal-box max-w-md"},ot={class:"font-bold text-lg"},dt={class:"mt-4 space-y-3"},ut={class:"form-control"},ct=["value"],rt={key:0,class:"text-[11px] text-amber-600 mt-1"},vt={class:"form-control"},bt={class:"label py-1"},_t={class:"label-text text-sm font-medium"},mt={key:0,class:"flex gap-4"},gt={class:"flex items-center gap-2 cursor-pointer"},pt={class:"flex items-center gap-2 cursor-pointer"},ht={class:"modal-action"},ft=["disabled"],kt={class:"modal-box max-w-sm"},xt={class:"text-xs text-slate-400 mt-1"},yt={class:"modal-action"},wt=["disabled"],Ct=Ee({__name:"meetingsvc",setup($t){const{webApi:D,consoleApi:xe}=Be(),{success:J,error:M}=je(),ue=[{value:1,label:"中国"},{value:2,label:"美国"},{value:3,label:"东亚"},{value:4,label:"东南亚"},{value:5,label:"南亚"},{value:6,label:"中东"},{value:7,label:"欧洲"},{value:8,label:"俄罗斯"},{value:9,label:"非洲"},{value:10,label:"南美"},{value:11,label:"北美"},{value:12,label:"大洋洲"},{value:13,label:"巴西"},{value:14,label:"印度"}];function ye(l){return ue.find(e=>e.value===l)?.label??"区域"+l}const Q=m([]),$=m(""),N=m(0),B=m([]),I=m([]),Y=m({1:[8],2:[3],3:[5,9]}),U=m(!1),ce=m(!1),Z=m(!1),E=m(!1),r=m(!1),f=m("zh-CN"),T=m(null),z=m(null),k=m(1),v=ke({svc_id:"",cost_hint:0,is_default:!1,client_visible:!1}),y=ke({row_id:0,name:"",kind:1,cost_hint:0});function G(l){return l===1?"识别":l===2?"翻译":"总结"}function re(l){return l===1?"元/小时":l===2?"元/百万字符":"元/百万token"}function H(l){return de.find(e=>e.code===l)?.name??l}function ve(l,e){return(l||"").split(",").map(t=>Number(t.trim())).includes(e)}const K=O(()=>{const l=new Map;for(const e of I.value)l.set(e.id,e);return l});function w(l){return K.value.get(l)?.name??l}function ee(l){return K.value.get(l)?.provider??"?"}function L(l){return K.value.get(l)?.languages??""}function we(l){return ve(K.value.get(l)?.categories??"",9)}function b(l){return B.value.filter(e=>e.kind===l).sort((e,t)=>e.priority-t.priority)}function j(l){const e=Y.value[String(l)]??[],t=new Set(B.value.filter(o=>o.kind===l).map(o=>o.svc_id));return I.value.filter(o=>!t.has(o.id)&&o.categories.split(",").some(u=>e.includes(Number(u.trim()))))}function R(l,e){const t=L(l);return t?t.split(",").map(o=>o.trim()).includes(e):!0}const x=O(()=>b(1).find(l=>l.enabled&&R(l.svc_id,f.value))??null),A=O(()=>b(2).find(l=>l.enabled)??null);function Ce(l){return x.value?.row_id!==l.row_id&&(!l.enabled||!R(l.svc_id,f.value))}function $e(l){return x.value?.row_id===l.row_id?"ok":!l.enabled||!R(l.svc_id,f.value)?"no":""}function Ne(l){return x.value?.row_id===l.row_id?L(l.svc_id)?`✓ 当前源语言(${H(f.value)})由它承接`:"✓ 未限定语言,先落到它(实际支持由引擎判断)":l.enabled?R(l.svc_id,f.value)?"备用:前面都跳过时接手":`不支持 ${H(f.value)}(${f.value}),跳过 → 顺延下一个`:"已停用,跳过"}const _=O(()=>{const l=[],e=[];let t=0;for(const u of[1,2,3]){const V=b(u).filter(ie=>ie.enabled);if(!V.length){l.push(u);continue}const W=new Set;let ge=!1;for(const ie of V){const pe=L(ie.svc_id).split(",").map(oe=>oe.trim()).filter(Boolean);if(!pe.length){ge=!0;break}pe.forEach(oe=>W.add(oe))}ge?t++:e.push({kind:u,langs:[...W]})}if(!e.length)return{missing:l,unlimited:!0,langs:[],groups:e,unlimitedKinds:t};const o=e.reduce((u,V)=>u.filter(W=>V.langs.includes(W)),[...e[0].langs]).sort((u,V)=>be(u)-be(V));return{missing:l,unlimited:!1,langs:o,groups:e,unlimitedKinds:t}});function be(l){const e=de.findIndex(t=>t.code===l);return e<0?Number.MAX_SAFE_INTEGER:e}const Ae=O(()=>{const l=[];for(const e of[1,2,3]){if(_.value.missing.includes(e)){l.push(`${G(e)} 未配置`);continue}const t=_.value.groups.find(o=>o.kind===e);l.push(`${G(e)} ${t?t.langs.length+" 种":"全语种"}`)}return l.join(" ∩ ")}),X=O(()=>b(3).find(l=>l.is_default)??null),se=O(()=>b(3).filter(l=>l.enabled&&l.client_visible));async function Ve(){try{const l=await xe("products/list",{});Q.value=(l??[]).map(e=>e.name).filter(Boolean)}catch{Q.value=[]}}async function p(){Z.value=!0;try{const l=await D("getechoorch",{app_name:$.value,region:N.value});B.value=l?.items??[],I.value=l?.available??[],Y.value=l?.kind_cats??Y.value,U.value=!!l?.setting?.llm_client_choice,ce.value=(!!$.value||N.value!==0)&&(B.value.length>0||U.value)}catch(l){M(l?.message??"加载失败")}finally{Z.value=!1}}async function te(l){await D("saveechoorch",{app_name:$.value,region:N.value,orch:l})}function le(l){k.value=l,v.svc_id="",v.cost_hint=0,v.is_default=!1,v.client_visible=!1,T.value?.showModal()}async function Se(){if(v.svc_id){E.value=!0;try{const l=b(k.value),e=l.length?l[l.length-1].priority+10:10;await te({kind:k.value,svc_id:v.svc_id,priority:e,cost_hint:Number(v.cost_hint)||0,is_default:k.value===3?v.is_default:!1,client_visible:k.value===3?v.client_visible:!1,enabled:!0}),J("已添加"),T.value?.close(),await p()}catch(l){M(l?.message??"添加失败")}finally{E.value=!1}}}async function F(l,e){r.value=!0;try{await te({...l,...e}),await p()}catch(t){M(t?.message??"操作失败"),await p()}finally{r.value=!1}}async function ne(l){if(confirm(`从本段移除「${w(l.svc_id)}」?(不影响第三方服务配置里的服务本身)`))try{await D("delechoorch",{row_id:l.row_id}),J("已移除"),await p()}catch(e){M(e?.message??"移除失败")}}async function _e(l){r.value=!0;try{await D("reorderechoorch",{items:l.map((e,t)=>({row_id:e.row_id,priority:(t+1)*10}))}),await p()}catch(e){M(e?.message??"排序失败"),await p()}finally{r.value=!1}}function P(l,e,t){const o=[...b(l)],u=e+t;if(u<0||u>=o.length)return;const V=o[e];o[e]=o[u],o[u]=V,_e(o)}function me(l){const e=[...b(l)].sort((t,o)=>t.enabled!==o.enabled?t.enabled?-1:1:(t.cost_hint||Number.MAX_VALUE)-(o.cost_hint||Number.MAX_VALUE));_e(e)}function ae(l){y.row_id=l.row_id,y.name=w(l.svc_id),y.kind=l.kind,y.cost_hint=l.cost_hint,z.value?.showModal()}async function Me(){const l=B.value.find(e=>e.row_id===y.row_id);if(l){E.value=!0;try{await te({...l,cost_hint:Number(y.cost_hint)||0}),J("已保存"),z.value?.close(),await p()}catch(e){M(e?.message??"保存失败")}finally{E.value=!1}}}async function Ue(){r.value=!0;try{await D("saveechoorchsetting",{app_name:$.value,region:N.value,llm_client_choice:!U.value}),await p()}catch(l){M(l?.message??"保存失败"),await p()}finally{r.value=!1}}return Le(async()=>{await Ve(),await p()}),(l,e)=>(a(),n("div",null,[e[45]||(e[45]=s("div",{class:"flex items-start justify-between mb-4 flex-wrap gap-3"},[s("div",null,[s("h2",{class:"text-lg font-semibold text-slate-800"},"会议记录服务"),s("p",{class:"text-xs text-slate-400 mt-1 max-w-3xl"},[d(" 识别 / 翻译 / 总结三段,从"),s("b",null,"第三方服务配置"),d("里选已配好的服务来编排(不再单独填凭据)。 "),s("span",{class:"text-slate-500"},"先配「全局默认」作兜底,再按应用 / 区域覆盖"),d("——没配覆盖的应用自动继承全局默认。 ")])])],-1)),s("div",Fe,[s("div",Ie,[e[17]||(e[17]=s("span",{class:"text-xs text-slate-500 font-semibold"},"作用域",-1)),S(s("select",{"onUpdate:modelValue":e[0]||(e[0]=t=>$.value=t),class:"select select-bordered select-sm",onChange:p},[e[15]||(e[15]=s("option",{value:""},"全局默认(兜底)",-1)),(a(!0),n(c,null,C(Q.value,t=>(a(),n("option",{key:t,value:t},"应用:"+i(t),9,Te))),128))],544),[[q,$.value]]),S(s("select",{"onUpdate:modelValue":e[1]||(e[1]=t=>N.value=t),class:"select select-bordered select-sm",onChange:p},[e[16]||(e[16]=s("option",{value:0},"全区域",-1)),(a(),n(c,null,C(ue,t=>s("option",{key:t.value,value:t.value},i(t.label),9,ze)),64))],544),[[q,N.value,void 0,{number:!0}]])]),s("span",Ge,[d(i($.value?`正在编辑「${$.value}」`:"正在编辑全局默认")+i(N.value?` · ${ye(N.value)}`:" · 全区域")+" ",1),ce.value?(a(),n(c,{key:0},[d("(覆盖全局默认)")],64)):g("",!0)])]),Z.value?(a(),n("div",He,[...e[18]||(e[18]=[s("span",{class:"loading loading-spinner loading-sm"},null,-1)])])):(a(),n(c,{key:1},[s("div",{class:h(["langsum",{bad:!_.value.unlimited&&!_.value.langs.length,warn:_.value.missing.length}])},[s("div",Ke,[e[19]||(e[19]=s("span",{class:"langsum-title"},"当前配置支持的语言",-1)),_.value.unlimited?(a(),n("span",{key:0,class:h(["langsum-count",{off:_.value.missing.length}])},"未限定(各引擎自行判断)",2)):(a(),n("span",{key:1,class:h(["langsum-count",{off:_.value.missing.length}])},[d(i(_.value.langs.length)+" 种",1),_.value.missing.length?(a(),n(c,{key:0},[d("(链路未配全,尚不可用)")],64)):g("",!0)],2)),s("span",Re,i(Ae.value),1)]),_.value.missing.length?(a(),n("div",Xe," ⚠ "+i(_.value.missing.map(G).join("、"))+"段没有启用中的服务,整条链路走不通——先把这些段配上。 ",1)):!_.value.unlimited&&!_.value.langs.length?(a(),n("div",Pe," ⚠ 各段语言无交集,任何语种都走不完整条链路。放宽某一段的支持语言,或补一个覆盖面更广的服务。 ")):g("",!0),_.value.langs.length?(a(),n("div",We,[(a(!0),n(c,null,C(_.value.langs,t=>(a(),n("span",{key:t,class:"lang on",title:H(t)},i(t),9,qe))),128))])):_.value.unlimited&&!_.value.missing.length?(a(),n("div",Je," 各段都没限定支持语言(服务未填 languages 字段),实际能否处理由引擎判断。 ")):g("",!0)],2),I.value.length?g("",!0):(a(),n("div",Qe,[...e[20]||(e[20]=[s("span",null,[d(" 该作用域没有可选服务。先去"),s("b",null,"第三方服务配置"),d("添加「录音文件识别 / 机器翻译 / 文本或多媒体大模型」类的服务 (全局默认或该应用作用域),这里才能选。 ")],-1)])])),s("div",Ye,[s("div",Ze,[e[21]||(e[21]=s("div",null,[s("div",{class:"card-title"},"识别(录音文件转写)"),s("div",{class:"card-desc"},[d("按顺序找"),s("b",null,"第一个「已启用 + 支持源语言」"),d('的服务,不支持则跳到下一个。把便宜的排前面即"优先用性价比高的"。')])],-1)),s("div",es,[s("button",{class:"btn btn-xs",disabled:b(1).length<2||r.value,onClick:e[2]||(e[2]=t=>me(1))},"⇅ 按参考单价重排",8,ss),s("button",{class:"btn btn-primary btn-xs text-white",disabled:!j(1).length,onClick:e[3]||(e[3]=t=>le(1))},"+ 添加识别服务",8,ts)])]),s("div",ls,[e[22]||(e[22]=s("span",{class:"text-xs text-slate-500 font-semibold"},"选路预览",-1)),S(s("select",{"onUpdate:modelValue":e[4]||(e[4]=t=>f.value=t),class:"select select-bordered select-xs w-44 text-xs"},[(a(!0),n(c,null,C(Oe(de),t=>(a(),n("option",{key:t.code,value:t.code},i(t.code)+" · "+i(t.name),9,ns))),128))],512),[[q,f.value]]),x.value?(a(),n("span",as,[d("命中 "+i(w(x.value.svc_id)),1),x.value.cost_hint?(a(),n(c,{key:0},[d(" · ¥"+i(x.value.cost_hint)+"/时",1)],64)):g("",!0)])):(a(),n("span",is,"无可用服务 —— "+i(H(f.value))+" 会转写失败",1))]),b(1).length?g("",!0):(a(),n("div",os,"暂无识别服务,点右上「+ 添加识别服务」")),(a(!0),n(c,null,C(b(1),(t,o)=>(a(),n("div",{key:t.row_id,class:h(["svc asr",{hit:x.value&&x.value.row_id===t.row_id,off:!t.enabled}])},[s("div",{class:h(["svc-rank",{hit:x.value&&x.value.row_id===t.row_id}])},i(o+1),3),s("div",ds,[s("div",{class:h(["svc-name",{skip:Ce(t)}])},i(w(t.svc_id)),3),s("div",us,i(ee(t.svc_id))+" · "+i(t.svc_id),1)]),s("div",cs,[L(t.svc_id)?(a(),n(c,{key:0},[(a(!0),n(c,null,C(L(t.svc_id).split(",").slice(0,5),u=>(a(),n("span",{key:u,class:h(["lang",{on:u===f.value}])},i(u),3))),128)),L(t.svc_id).split(",").length>5?(a(),n("span",rs,"+"+i(L(t.svc_id).split(",").length-5),1)):g("",!0)],64)):(a(),n("span",vs,"未限定"))]),s("div",bs,[t.cost_hint?(a(),n(c,{key:0},[d("¥"+i(t.cost_hint),1),e[23]||(e[23]=s("small",null," /时",-1))],64)):(a(),n("span",_s,"—"))]),s("div",null,[s("input",{type:"checkbox",class:"toggle toggle-success toggle-sm",checked:t.enabled,disabled:r.value,onChange:u=>F(t,{enabled:!t.enabled})},null,40,ms)]),s("div",gs,[s("button",{class:"arrow",disabled:o===0||r.value,"aria-label":"上移",onClick:u=>P(1,o,-1)},"↑",8,ps),s("button",{class:"arrow",disabled:o===b(1).length-1||r.value,"aria-label":"下移",onClick:u=>P(1,o,1)},"↓",8,hs),s("button",{class:"btn btn-ghost btn-xs",onClick:u=>ae(t)},"单价",8,fs),s("button",{class:"btn btn-ghost btn-xs text-red-500",onClick:u=>ne(t)},"移除",8,ks)]),s("div",{class:h(["svc-why",$e(t)])},i(Ne(t)),3)],2))),128))]),s("div",xs,[s("div",ys,[e[24]||(e[24]=s("div",null,[s("div",{class:"card-title"},"翻译"),s("div",{class:"card-desc"},[d("按顺序取"),s("b",null,"第一个已启用"),d("的服务;调用失败自动回退下一个。")])],-1)),s("div",ws,[s("button",{class:"btn btn-xs",disabled:b(2).length<2||r.value,onClick:e[5]||(e[5]=t=>me(2))},"⇅ 按参考单价重排",8,Cs),s("button",{class:"btn btn-primary btn-xs text-white",disabled:!j(2).length,onClick:e[6]||(e[6]=t=>le(2))},"+ 添加翻译服务",8,$s)])]),b(2).length?g("",!0):(a(),n("div",Ns,"暂无翻译服务")),(a(!0),n(c,null,C(b(2),(t,o)=>(a(),n("div",{key:t.row_id,class:h(["svc mt",{hit:A.value&&A.value.row_id===t.row_id,off:!t.enabled}])},[s("div",{class:h(["svc-rank",{hit:A.value&&A.value.row_id===t.row_id}])},i(o+1),3),s("div",As,[s("div",Vs,i(w(t.svc_id)),1),s("div",Ss,i(ee(t.svc_id))+" · "+i(t.svc_id),1)]),s("div",Ms,[t.cost_hint?(a(),n(c,{key:0},[d("¥"+i(t.cost_hint),1),e[25]||(e[25]=s("small",null," /百万字符",-1))],64)):(a(),n("span",Us,"—"))]),s("div",null,[s("input",{type:"checkbox",class:"toggle toggle-success toggle-sm",checked:t.enabled,disabled:r.value,onChange:u=>F(t,{enabled:!t.enabled})},null,40,Es)]),s("div",Ls,[s("button",{class:"arrow",disabled:o===0||r.value,"aria-label":"上移",onClick:u=>P(2,o,-1)},"↑",8,Os),s("button",{class:"arrow",disabled:o===b(2).length-1||r.value,"aria-label":"下移",onClick:u=>P(2,o,1)},"↓",8,Ds),s("button",{class:"btn btn-ghost btn-xs",onClick:u=>ae(t)},"单价",8,Bs),s("button",{class:"btn btn-ghost btn-xs text-red-500",onClick:u=>ne(t)},"移除",8,js)]),s("div",{class:h(["svc-why",t.enabled?A.value&&A.value.row_id===t.row_id?"ok":"":"no"])},[t.enabled?A.value&&A.value.row_id===t.row_id?(a(),n(c,{key:1},[d("✓ 默认由它承接,失败顺延")],64)):(a(),n(c,{key:2},[d("备用:前面失败时接手")],64)):(a(),n(c,{key:0},[d("已停用,跳过")],64))],2)],2))),128))]),s("div",Fs,[s("div",Is,[e[26]||(e[26]=s("div",null,[s("div",{class:"card-title"},"总结(大模型)"),s("div",{class:"card-desc"},[d("后台指定默认模型,客户端可在允许范围内自选。带 🖼 的是"),s("b",null,"多媒体大模型"),d(",能识别会议里的图片。")])],-1)),s("button",{class:"btn btn-primary btn-xs text-white shrink-0",disabled:!j(3).length,onClick:e[7]||(e[7]=t=>le(3))},"+ 添加模型",8,Ts)]),s("div",zs,[s("label",Gs,[s("input",{type:"checkbox",class:"toggle toggle-primary toggle-sm",checked:U.value,disabled:r.value,onChange:Ue},null,40,Hs),e[27]||(e[27]=s("span",{class:"text-sm font-semibold text-slate-700"},"允许客户端指定模型",-1))]),s("p",Ks,[U.value?(a(),n(c,{key:0},[e[28]||(e[28]=d(" 前端能选 ",-1)),s("b",null,i(se.value.length),1),e[29]||(e[29]=d(" 个模型",-1)),se.value.length?(a(),n(c,{key:0},[d(":"+i(se.value.map(t=>w(t.svc_id)).join("、")),1)],64)):(a(),n(c,{key:1},[d("(一个都没勾「前端可见」,等同强制默认)")],64)),e[30]||(e[30]=d("。不传则用默认 ",-1)),s("b",null,i(X.value?w(X.value.svc_id):"—"),1),e[31]||(e[31]=d("。 ",-1))],64)):(a(),n(c,{key:1},[e[32]||(e[32]=d(" 前端不下发模型列表,一律走默认模型 ",-1)),s("b",null,i(X.value?w(X.value.svc_id):"—"),1),e[33]||(e[33]=d(";客户端传了也忽略。 ",-1))],64))])]),b(3).length?g("",!0):(a(),n("div",Rs,"暂无模型")),(a(!0),n(c,null,C(b(3),t=>(a(),n("div",{key:t.row_id,class:h(["svc llm",{isdefault:t.is_default,off:!t.enabled}])},[s("div",Xs,[s("input",{type:"radio",name:"llmdef",class:"radio radio-primary radio-xs",checked:t.is_default,disabled:!t.enabled||r.value,onChange:o=>F(t,{is_default:!0})},null,40,Ps)]),s("div",Ws,[s("div",qs,[d(i(w(t.svc_id))+" ",1),we(t.svc_id)?(a(),n("span",Js,"🖼")):g("",!0),t.is_default?(a(),n("span",Qs,"默认")):g("",!0)]),s("div",Ys,i(ee(t.svc_id))+" · "+i(t.svc_id),1)]),s("div",Zs,[t.cost_hint?(a(),n(c,{key:0},[d("¥"+i(t.cost_hint),1),e[34]||(e[34]=s("small",null," /百万token",-1))],64)):(a(),n("span",et,"—"))]),s("div",null,[s("input",{type:"checkbox",class:"toggle toggle-success toggle-sm",checked:t.client_visible,disabled:!U.value||!t.enabled||r.value,title:U.value?"":"先打开「允许客户端指定模型」",onChange:o=>F(t,{client_visible:!t.client_visible})},null,40,st)]),s("div",null,[s("input",{type:"checkbox",class:"toggle toggle-success toggle-sm",checked:t.enabled,disabled:r.value,onChange:o=>F(t,{enabled:!t.enabled})},null,40,tt)]),s("div",lt,[s("button",{class:"btn btn-ghost btn-xs",onClick:o=>ae(t)},"单价",8,nt),s("button",{class:"btn btn-ghost btn-xs text-red-500",onClick:o=>ne(t)},"移除",8,at)])],2))),128)),e[35]||(e[35]=s("div",{class:"col-h llm-h"},[s("div"),s("div"),s("div",null,"参考单价"),s("div",null,"前端可见"),s("div",null,"启用"),s("div")],-1))])],64)),s("dialog",{ref_key:"addDlg",ref:T,class:"modal"},[s("div",it,[s("h3",ot,"添加"+i(G(k.value))+"服务",1),e[41]||(e[41]=s("p",{class:"text-xs text-slate-400 mt-1"},"从第三方服务配置里选一个已配好的服务加入本段编排。",-1)),s("div",dt,[s("div",ut,[e[37]||(e[37]=s("label",{class:"label py-1"},[s("span",{class:"label-text text-sm font-medium"},"服务")],-1)),S(s("select",{"onUpdate:modelValue":e[8]||(e[8]=t=>v.svc_id=t),class:"select select-bordered select-sm"},[e[36]||(e[36]=s("option",{value:""},"请选择服务…",-1)),(a(!0),n(c,null,C(j(k.value),t=>(a(),n("option",{key:t.id,value:t.id},i(t.name)+i(k.value===3&&ve(t.categories,9)?" 🖼":"")+"("+i(t.provider||t.id)+") ",9,ct))),128))],512),[[q,v.svc_id]]),j(k.value).length?g("",!0):(a(),n("span",rt,"没有可添加的服务了(都加过了,或服务池里没这类服务)。"))]),s("div",vt,[s("label",bt,[s("span",_t,"参考单价("+i(re(k.value))+",可空)",1)]),S(s("input",{"onUpdate:modelValue":e[9]||(e[9]=t=>v.cost_hint=t),type:"number",step:"0.01",min:"0",class:"input input-bordered input-sm font-mono text-xs",placeholder:"0"},null,512),[[he,v.cost_hint,void 0,{number:!0}]]),e[38]||(e[38]=s("span",{class:"text-[11px] text-slate-400 mt-1"},"仅用于排序/展示,填你的实付价。",-1))]),k.value===3?(a(),n("div",mt,[s("label",gt,[S(s("input",{"onUpdate:modelValue":e[10]||(e[10]=t=>v.is_default=t),type:"checkbox",class:"toggle toggle-primary toggle-sm"},null,512),[[fe,v.is_default]]),e[39]||(e[39]=s("span",{class:"text-sm"},"设为默认",-1))]),s("label",pt,[S(s("input",{"onUpdate:modelValue":e[11]||(e[11]=t=>v.client_visible=t),type:"checkbox",class:"toggle toggle-success toggle-sm"},null,512),[[fe,v.client_visible]]),e[40]||(e[40]=s("span",{class:"text-sm"},"前端可见",-1))])])):g("",!0)]),s("div",ht,[s("button",{class:"btn btn-ghost btn-sm",onClick:e[12]||(e[12]=t=>T.value?.close())},"取消"),s("button",{class:"btn btn-primary btn-sm text-white",disabled:!v.svc_id||E.value,onClick:Se},i(E.value?"添加中…":"添加"),9,ft)])]),e[42]||(e[42]=s("form",{method:"dialog",class:"modal-backdrop"},[s("button",null,"close")],-1))],512),s("dialog",{ref_key:"costDlg",ref:z,class:"modal"},[s("div",kt,[e[43]||(e[43]=s("h3",{class:"font-bold text-lg"},"参考单价",-1)),s("p",xt,i(y.name)+"("+i(re(y.kind))+")",1),S(s("input",{"onUpdate:modelValue":e[13]||(e[13]=t=>y.cost_hint=t),type:"number",step:"0.01",min:"0",class:"input input-bordered input-sm w-full font-mono text-xs mt-3",placeholder:"0"},null,512),[[he,y.cost_hint,void 0,{number:!0}]]),s("div",yt,[s("button",{class:"btn btn-ghost btn-sm",onClick:e[14]||(e[14]=t=>z.value?.close())},"取消"),s("button",{class:"btn btn-primary btn-sm text-white",disabled:E.value,onClick:Me},"保存",8,wt)])]),e[44]||(e[44]=s("form",{method:"dialog",class:"modal-backdrop"},[s("button",null,"close")],-1))],512)]))}}),Mt=De(Ct,[["__scopeId","data-v-512b8191"]]);export{Mt as default};