2 lines
9.4 KiB
JavaScript
2 lines
9.4 KiB
JavaScript
import{d as oe,u as ie,q as se,c as d,e as a,w as n,a as _,x as de,y as b,p as F,k as C,j as I,r as u,z as ue,o as s,i as m,F as q,l as A,t as v,v as re,E as O}from"./index-CcdGGfCj.js";import{h as k,a as me,_ as pe}from"./http-CGjljVXL.js";import{_ as ce}from"./PageHeader.vue_vue_type_script_setup_true_lang-ClDoYPHj.js";import{A as _e}from"./AdminNumberInput-BCSDw1QF.js";import{_ as fe}from"./_plugin-vue_export-helper-DlAUqK2U.js";const ye={class:"page-stack management-page"},ge={class:"panel filter-bar"},be={class:"panel table-panel"},ve={key:0},ke={key:1},Ve={key:2},xe={key:0,class:"price-list"},he={key:1},Ce={class:"form-grid model-identity-grid"},$e={key:1,class:"text-billing-settings"},Ne={class:"model-price-section"},Te={class:"model-price-grid"},Ue=oe({__name:"ModelsView",setup(Me){const V=ie(),$=C(!1),x=C(!1),B=C([]),z=C([]),h=C(""),f=I({keyword:"",model_type:"",channel_id:""}),o=I({}),K=re(()=>o.model_type==="text"?o.text_billing_mode==="per_token"?[["input","M Token","输入 Token"],["output","M Token","输出 Token"]]:[["default","次","每次价格"]]:o.model_type==="image"?[["1K","次","1K"],["2K","次","2K"],["4K","次","4K"]]:[["480p","秒","480p"],["720p","秒","720p"],["1080p","秒","1080p"]]);function N(l){if(Array.isArray(l))return l;if(typeof l!="string")return[];try{const e=JSON.parse(l);return Array.isArray(e)?e:[]}catch{return[]}}function S(l){return N(l).some(e=>["input","output"].includes(String(e.price_key).toLowerCase()))}function J(l){return l.model_type==="text"&&(l.text_billing_mode==="per_token"||S(l.prices))}function D(l){const e=N(l.prices);if(l.model_type!=="text")return e;const i=J(l)?["input","output"]:["default"];return e.filter(c=>i.includes(String(c.price_key).toLowerCase()))}function E(l){const e=N(l==null?void 0:l.prices),i={};for(const r of e)i[r.price_key]=Number(r.price);const c=S(e)?"per_token":(l==null?void 0:l.text_billing_mode)||"per_request";Object.assign(o,{channel_id:(l==null?void 0:l.channel_id)||"",name:(l==null?void 0:l.name)||"",model_type:(l==null?void 0:l.model_type)||"text",multimodal:(l==null?void 0:l.multimodal)||!1,text_billing_mode:c,enabled:(l==null?void 0:l.enabled)??!0,price_values:i}),h.value=(l==null?void 0:l.id)||"",x.value=!0}async function R(){const l=[];let e=1;for(;;){const{data:i}=await k.get("/models",{params:{...f,page:e,page_size:100}}),c=i.data.items||[];if(l.push(...c),!c.length||l.length>=Number(i.data.total||0))return l;e+=1}}async function T(){$.value=!0;try{const[l,{data:e}]=await Promise.all([R(),k.get("/resources/channels",{params:{page_size:100}})]);B.value=l.map(i=>({...i,prices:N(i.prices)})),z.value=e.data.items}catch(l){U(l)}finally{$.value=!1}}async function G(){if(!o.channel_id||!o.name){V.warning("请填写模型名并选择渠道");return}const l=K.value.map(([e,i])=>({price_key:e,unit:i,price:Number(Number(o.price_values[e]||0).toFixed(2))}));try{const e={...o,prices:l};delete e.price_values,h.value?await k.put(`/models/${h.value}`,e):await k.post("/models",e),V.success(h.value?"模型已更新":"模型已创建"),x.value=!1,T()}catch(e){U(e)}}async function H(l,e){try{await O.confirm(`确认${e?"启用":"停用"}模型 ${l.name}?`,"状态变更",{type:"warning"}),await k.patch(`/resources/models/${l.id}/enabled`,{enabled:e}),l.enabled=e,V.success("模型状态已更新")}catch(i){l.enabled=!e,i!=="cancel"&&i!=="close"&&U(i)}}async function Q(l){try{await O.confirm("模型将被软删除;已有使用记录不会删除。","确认删除",{type:"warning"}),await k.delete(`/resources/models/${l.id}`),V.success("模型已删除"),T()}catch(e){e!=="cancel"&&e!=="close"&&U(e)}}function U(l){const e=me(l);V.error(e.message,e.copyText)}const W=l=>({text:"文本",image:"图片",video:"视频"})[l]||l,X=l=>({default:"基础",input:"输入",output:"输出"})[l]||l;return se(T),(l,e)=>{const i=u("el-button"),c=u("el-input"),r=u("el-option"),M=u("el-select"),y=u("el-table-column"),P=u("el-tag"),L=u("el-switch"),Y=u("el-table"),Z=u("el-empty"),g=u("el-form-item"),j=u("el-radio-button"),w=u("el-radio-group"),ee=u("el-form"),le=u("el-dialog"),te=ue("loading");return s(),d("div",ye,[a(ce,{title:"模型管理",description:"模型实际可用状态由模型和所属渠道的启用状态共同决定"},{default:n(()=>[a(i,{type:"primary",onClick:e[0]||(e[0]=t=>E())},{default:n(()=>[a(pe,{name:"Plus"}),e[11]||(e[11]=m("新建模型",-1))]),_:1})]),_:1}),_("section",ge,[a(c,{modelValue:f.keyword,"onUpdate:modelValue":e[1]||(e[1]=t=>f.keyword=t),clearable:"",placeholder:"模型名"},null,8,["modelValue"]),a(M,{modelValue:f.model_type,"onUpdate:modelValue":e[2]||(e[2]=t=>f.model_type=t),clearable:"",placeholder:"模型类型"},{default:n(()=>[a(r,{label:"文本",value:"text"}),a(r,{label:"图片",value:"image"}),a(r,{label:"视频",value:"video"})]),_:1},8,["modelValue"]),a(M,{modelValue:f.channel_id,"onUpdate:modelValue":e[3]||(e[3]=t=>f.channel_id=t),clearable:"",placeholder:"所属渠道"},{default:n(()=>[(s(!0),d(q,null,A(z.value,t=>(s(),b(r,{key:t.id,label:t.name,value:t.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),a(i,{type:"primary",onClick:T},{default:n(()=>[...e[12]||(e[12]=[m("查询",-1)])]),_:1})]),de((s(),d("section",be,[a(Y,{data:B.value},{default:n(()=>[a(y,{prop:"name",label:"模型名","min-width":"150"}),a(y,{label:"类型",width:"90"},{default:n(({row:t})=>[a(P,{size:"small",effect:"plain"},{default:n(()=>[m(v(W(t.model_type)),1)]),_:2},1024)]),_:1}),a(y,{label:"所属渠道","min-width":"130"},{default:n(({row:t})=>[a(P,{size:"small",type:"info",effect:"plain"},{default:n(()=>[m(v(t.channel_name),1)]),_:2},1024)]),_:1}),a(y,{label:"能力","min-width":"180"},{default:n(({row:t})=>[t.model_type==="text"?(s(),d("span",ve,v(t.multimodal?"支持多模态":"仅文本"),1)):t.model_type==="video"?(s(),d("span",ke,"视频生成")):(s(),d("span",Ve,"图片生成"))]),_:1}),a(y,{label:"模型价格","min-width":"240"},{default:n(({row:t})=>[D(t).length?(s(),d("div",xe,[(s(!0),d(q,null,A(D(t),p=>(s(),d("span",{key:p.price_key},v(X(p.price_key))+":"+v(Number(p.price).toFixed(2))+" 积分/"+v(p.unit),1))),128))])):(s(),d("span",he,"--"))]),_:1}),a(y,{label:"启用",width:"130"},{default:n(({row:t})=>[t.channel_enabled?(s(),b(L,{key:1,"model-value":t.enabled,onChange:p=>H(t,!!p)},null,8,["model-value","onChange"])):(s(),b(P,{key:0,size:"small",type:"warning",effect:"plain"},{default:n(()=>[...e[13]||(e[13]=[m("渠道已禁用",-1)])]),_:1}))]),_:1}),a(y,{label:"操作",width:"140",fixed:"right"},{default:n(({row:t})=>[a(i,{link:"",type:"primary",onClick:p=>E(t)},{default:n(()=>[...e[14]||(e[14]=[m("编辑",-1)])]),_:1},8,["onClick"]),a(i,{link:"",type:"danger",onClick:p=>Q(t)},{default:n(()=>[...e[15]||(e[15]=[m("删除",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"]),!$.value&&!B.value.length?(s(),b(Z,{key:0,description:"暂无模型"})):F("",!0)])),[[te,$.value]]),a(le,{modelValue:x.value,"onUpdate:modelValue":e[10]||(e[10]=t=>x.value=t),title:h.value?"编辑模型":"新建模型",width:"min(820px, calc(100vw - 32px))",class:"managed-scroll-dialog model-dialog","modal-class":"managed-scroll-overlay","lock-scroll":!0},{footer:n(()=>[a(i,{onClick:e[9]||(e[9]=t=>x.value=!1)},{default:n(()=>[...e[19]||(e[19]=[m("取消",-1)])]),_:1}),a(i,{type:"primary",onClick:G},{default:n(()=>[...e[20]||(e[20]=[m("保存",-1)])]),_:1})]),default:n(()=>[a(ee,{model:o,"label-position":"top"},{default:n(()=>[_("div",Ce,[a(g,{label:"模型名",required:""},{default:n(()=>[a(c,{modelValue:o.name,"onUpdate:modelValue":e[4]||(e[4]=t=>o.name=t),modelModifiers:{trim:!0}},null,8,["modelValue"])]),_:1}),a(g,{label:"所属渠道",required:""},{default:n(()=>[a(M,{modelValue:o.channel_id,"onUpdate:modelValue":e[5]||(e[5]=t=>o.channel_id=t),class:"field-full"},{default:n(()=>[(s(!0),d(q,null,A(z.value,t=>(s(),b(r,{key:t.id,label:t.name,value:t.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),a(g,{label:"模型类型",required:""},{default:n(()=>[a(M,{modelValue:o.model_type,"onUpdate:modelValue":e[6]||(e[6]=t=>o.model_type=t),class:"field-full"},{default:n(()=>[a(r,{label:"文本",value:"text"}),a(r,{label:"图片",value:"image"}),a(r,{label:"视频",value:"video"})]),_:1},8,["modelValue"])]),_:1})]),o.model_type==="text"?(s(),b(g,{key:0,label:"支持多模态"},{default:n(()=>[a(L,{modelValue:o.multimodal,"onUpdate:modelValue":e[7]||(e[7]=t=>o.multimodal=t)},null,8,["modelValue"])]),_:1})):F("",!0),o.model_type==="text"?(s(),d("div",$e,[a(g,{label:"计费方式",required:""},{default:n(()=>[a(w,{modelValue:o.text_billing_mode,"onUpdate:modelValue":e[8]||(e[8]=t=>o.text_billing_mode=t)},{default:n(()=>[a(j,{label:"per_request"},{default:n(()=>[...e[16]||(e[16]=[m("按次计费",-1)])]),_:1}),a(j,{label:"per_token"},{default:n(()=>[...e[17]||(e[17]=[m("按 Token 计费",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1})])):F("",!0),_("section",Ne,[e[18]||(e[18]=_("header",{class:"model-price-section__header"},[_("div",null,[_("h3",null,"模型价格"),_("p",null,"输入用户执行对应任务时实际扣除的积分。")])],-1)),_("div",Te,[(s(!0),d(q,null,A(K.value,([t,p,ae])=>(s(),d("div",{key:t,class:"model-price-card"},[a(g,{label:`${ae}计费(积分/${p})`},{default:n(()=>[a(_e,{modelValue:o.price_values[t],"onUpdate:modelValue":ne=>o.price_values[t]=ne,class:"price-input",min:0,precision:2},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1032,["label"])]))),128))])])]),_:1},8,["model"])]),_:1},8,["modelValue","title"])])}}}),Fe=fe(Ue,[["__scopeId","data-v-d019cb68"]]);export{Fe as default};
|