Files
----/后端源码/yifan.action-ai.cn/index/js/index.DwLCMCDB.js

20 lines
14 KiB
JavaScript
Raw Permalink 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{Z as e,P as a,ao as l,x as t,aq as s,ar as n,y as i,as as o,h as r,at as d,aa as u,ad as c,i as m,ae as v,ai as p,au as g,w as _,v as f,E as y,D as h}from"./element-plus.C1XeB8_q.js";import{J as w,ej as k,t as b,S as V,_ as S,a1 as $,$ as x,a0 as C,H as M,ay as I,o as T,T as A,a9 as D,aa as j,a6 as O,a8 as H,a3 as U,a_ as L,aw as z,r as E,j as P,ak as J,n as R,el as K}from"./.pnpm.BudmgPu7.js";import{l as N,A as q}from"./index.DvZY56Zp.js";import{A as B}from"./ai_config.BHEfvHhl.js";import{K as F}from"./knowledge_base.BBl-t2nA.js";import{_ as Z}from"./_plugin-vue_export-helper.BCo6x5W8.js";import"./codemirror.BdleaLZh.js";const G="/application/ai/model",Q={enterprise_naming:"企业起名",enterprise_renaming:"企业改名",enterprise_scoring:"企业测名",enterprise_scoring_trial:"企业测名试用",personal_naming:"个人起名",personal_renaming:"个人改名",personal_scoring:"个人测名",personal_scoring_trial:"个人测名试用"},W={enterprise:{label:"企业服务",types:["enterprise_naming","enterprise_renaming","enterprise_scoring","enterprise_scoring_trial"]},personal:{label:"个人服务",types:["personal_naming","personal_renaming","personal_scoring","personal_scoring_trial"]}},X={
// 获取模型配置详情(如果不存在会自动创建默认配置)
detail:e=>N({url:`${G}/detail/${e}`,method:"get"}),
// 列表查询
list:e=>N({url:`${G}/list`,method:"get",params:e}),
// 更新配置
update:(e,a)=>N({url:`${G}/update/${e}`,method:"put",data:a}),
// 获取可用模型列表
getAvailableModels:e=>N({url:`${G}/available-models/${e}`,method:"get"}),
// 获取训练对话记录
getMessages:e=>N({url:`${G}/messages/${e}`,method:"get"}),
// 删除单条训练对话记录
deleteMessage:e=>N({url:`${G}/message/${e}`,method:"delete"}),
// 清空训练对话记录
clearMessages:e=>N({url:`${G}/messages/${e}`,method:"delete"}),
// 训练对话(流式输出)
async chat(e,a){const l=q.getAccessToken();return fetch(`/api/v1${G}/chat`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:l?`Bearer ${l}`:""},body:JSON.stringify(e),signal:a})},
// 起名测试(非流式,一次性返回)
test:e=>N({url:`${G}/test`,method:"post",data:e})},Y={class:"ai-model-container"},ee={class:"config-panel"},ae={class:"model-type-selector"},le={class:"category-tabs"},te={class:"type-tabs"},se={class:"chat-panel"},ne={class:"panel-header"},ie={class:"header-actions"},oe={key:0,class:"welcome-screen"},re={class:"welcome-content"},de={key:1,class:"messages-list"},ue={class:"message-content"},ce={class:"message-header"},me=["innerHTML"],ve={class:"message-avatar"},pe={class:"message-avatar"},ge={class:"message-content"},_e={class:"message-header"},fe=["innerHTML"],ye={key:0,class:"message-item assistant"},he={class:"message-avatar"},we={class:"message-content"},ke={class:"message-body"},be=["innerHTML"],Ve={key:1,class:"typing-indicator"},Se={class:"chat-input"},$e={class:"input-wrapper"},xe={class:"test-dialog-content"},Ce={key:0,class:"test-result"},Me=["innerHTML"],Ie=Z(w({name:"AIModel",inheritAttrs:!1,__name:"index",setup(w){const N=new k({html:!0,linkify:!0,typographer:!0,breaks:!0,highlight(e,a){if(a&&K.getLanguage(a))try{return`<pre class="hljs"><code>${K.highlight(e,{language:a,ignoreIllegals:!0}).value}</code></pre>`}catch{}return`<pre class="hljs"><code>${N.utils.escapeHtml(e)}</code></pre>`}}),q=E("enterprise"),Z=E("enterprise_naming"),G=P(()=>W[q.value].types);function Ie(e){return Q[e].replace(/^企业|个人/,"")}function Te(){const e=W[q.value].types[0];Z.value=e,la()}const Ae=E(),De=J({provider_id:void 0,model_name:void 0,system_prompt:"",temperature:1,knowledge_base_ids:[]}),je=E({}),Oe=E(!1),He=E(!1),Ue=E(!1),Le=E([]),ze=E([]),Ee=E([]),Pe=E([]),Je=E(""),Re=E(""),Ke=E(!1),Ne=E(),qe=E(null),Be=E(!1),Fe=E(""),Ze=E(""),Ge=E(!1);async function Qe(){try{const e=await B.list({page_no:1,page_size:100});Le.value=e.data.data.items}catch(e){}}async function We(){try{const e=await F.list({page_no:1,page_size:100,kb_status:2});Ee.value=e.data.data.items}catch(e){}}async function Xe(){Oe.value=!0;try{const e=(await X.detail(Z.value)).data.data;Object.assign(De,{provider_id:e.provider_id,model_name:e.model_name,system_prompt:e.system_prompt||"",temperature:e.temperature??1,knowledge_base_ids:e.knowledge_base_ids||[]}),je.value={...De},e.provider_id&&await Ye(e.provider_id)}catch(e){}finally{Oe.value=!1}}async function Ye(e){try{const a=await X.getAvailableModels(e);ze.value=a.data.data||[]}catch(a){ze.value=[]}}async function ea(){Ue.value=!0;try{const e=await X.getMessages(Z.value);Pe.value=e.data.data,ca()}catch(e){}finally{Ue.value=!1}}async function aa(e){De.model_name=void 0,ze.value=[],e&&await Ye(e)}async function la(){await Promise.all([Xe(),ea()])}async function ta(){He.value=!0;try{await X.update(Z.value,De),je.value={...De},y.success("配置保存成功")}catch(e){y.error("保存配置失败")}finally{He.value=!1}}async function sa(){var e;const a=Je.value.trim();if(!a||Ke.value)return;const l=JSON.stringify(De)!==JSON.stringify(je.value);Je.value="",Ke.value=!0,Re.value="";const t={id:-Date.now(),model_config_id:0,role:"user",content:a,created_time:(new Date).toISOString(),updated_time:(new Date).toISOString()};Pe.value.push(t),ca();try{const t={model_type:Z.value,message:a,config_changed:l,config_data:l?De:void 0};qe.value=new AbortController;const s=await X.chat(t,qe.value.signal);if(!s.ok)throw new Error(`HTTP error! status: ${s.status}`);const n=null==(e=s.body)?void 0:e.getReader();if(!n)throw new Error("无法获取响应流");const i=new TextDecoder;for(;;){const{done:e,value:a}=await n.read();if(e)break;const l=i.decode(a,{stream:!0});Re.value+=l,ca()}if(l&&(je.value={...De}),Re.value){const e={id:-Date.now()-1,model_config_id:0,role:"assistant",content:Re.value,created_time:(new Date).toISOString(),updated_time:(new Date).toISOString()};Pe.value.push(e)}}catch(s){if("AbortError"===s.name){if(Re.value){const e={id:-Date.now()-1,model_config_id:0,role:"assistant",content:Re.value+"\n\n*[已停止生成]*",created_time:(new Date).toISOString(),updated_time:(new Date).toISOString()};Pe.value.push(e)}}else{const e={id:-Date.now()-1,model_config_id:0,role:"assistant",content:"发送消息失败,请检查配置和网络连接",created_time:(new Date).toISOString(),updated_time:(new Date).toISOString()};Pe.value.push(e)}}finally{Re.value="",Ke.value=!1,qe.value=null,ca()}}function na(){qe.value&&qe.value.abort()}async function ia(){const e=Fe.value.trim();if(e&&!Ge.value){Ge.value=!0,Ze.value="";try{const a=await X.test({model_type:Z.value,text:e});Ze.value=a.data.data}catch(a){y.error("测试失败,请检查配置和网络连接")}finally{Ge.value=!1}}}function oa(){Fe.value="",Ze.value=""}async function ra(e){try{await h.confirm("确定删除这条对话记录吗?","提示",{type:"warning"}),await X.deleteMessage(e),Pe.value=Pe.value.filter(a=>a.id!==e),y.success("删除成功")}catch(a){}}async function da(){try{await h.confirm("确定清空所有对话记录吗?此操作不可恢复。","提示",{type:"warning"}),await X.clearMessages(Z.value),Pe.value=[],y.success("对话已清空")}catch(e){}}function ua(e){if(!e)return"";const a=function(e){return e?e.replace(/<think>([\s\S]*?)<\/think>/g,(e,a)=>`<details class="think-block"><summary><span class="think-icon">💭</span> 思考过程</summary><div class="think-content">${N.render(a.trim())}</div></details>`):""}(e);if(a!==e){const a=e.split(/<think>[\s\S]*?<\/think>/g),l=e.match(/<think>[\s\S]*?<\/think>/g)||[];let t="";for(let e=0;e<a.length;e++)if(t+=N.render(a[e]),l[e]){const a=l[e].replace(/<\/?think>/g,"").trim();t+=`<details class="think-block"><summary><span class="think-icon">💭</span> 思考过程</summary><div class="think-content">${N.render(a)}</div></details>`}return t}return N.render(e)}function ca(){R(()=>{Ne.value&&(Ne.value.scrollTop=Ne.value.scrollHeight)})}return b(async()=>{await Promise.all([Qe(),We()]),await Promise.all([Xe(),ea()])}),(y,h)=>{const w=e,k=a,b=n,E=s,P=t,J=i,R=o,K=r,N=_,B=m,F=f,X=l;return V(),S("div",Y,[$("div",ee,[h[13]||(h[13]=$("div",{class:"panel-header"},[$("h3",null,"模型配置")],-1)),$("div",ae,[$("div",le,[x(k,{modelValue:q.value,"onUpdate:modelValue":h[0]||(h[0]=e=>q.value=e),onChange:Te},{default:C(()=>[(V(!0),S(M,null,I(T(W),(e,a)=>(V(),A(w,{key:a,value:a},{default:C(()=>[D(j(e.label),1)]),_:2},1032,["value"]))),128))]),_:1},8,["modelValue"])]),$("div",te,[x(k,{modelValue:Z.value,"onUpdate:modelValue":h[1]||(h[1]=e=>Z.value=e),onChange:la},{default:C(()=>[(V(!0),S(M,null,I(T(G),e=>(V(),A(w,{key:e,value:e},{default:C(()=>[D(j(Ie(e)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["modelValue"])])]),O((V(),A(N,{ref_key:"configFormRef",ref:Ae,model:De,"label-position":"top",class:"config-form"},{default:C(()=>[x(P,{label:"AI供应商"},{default:C(()=>[x(E,{modelValue:De.provider_id,"onUpdate:modelValue":h[2]||(h[2]=e=>De.provider_id=e),placeholder:"请选择AI供应商",style:{width:"100%"},onChange:aa},{default:C(()=>[(V(!0),S(M,null,I(Le.value,e=>(V(),A(b,{key:e.id,label:e.name,value:e.id||""},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),x(P,{label:"模型"},{default:C(()=>[x(E,{modelValue:De.model_name,"onUpdate:modelValue":h[3]||(h[3]=e=>De.model_name=e),placeholder:"请选择或输入模型名称",style:{width:"100%"},disabled:!De.provider_id,filterable:"","allow-create":"","default-first-option":""},{default:C(()=>[(V(!0),S(M,null,I(ze.value,e=>(V(),A(b,{key:e.id,label:e.name,value:e.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue","disabled"])]),_:1}),x(P,{label:"系统提示词"},{default:C(()=>[x(J,{modelValue:De.system_prompt,"onUpdate:modelValue":h[4]||(h[4]=e=>De.system_prompt=e),type:"textarea",rows:6,placeholder:"请输入系统提示词"},null,8,["modelValue"])]),_:1}),x(P,{label:"模型温度"},{default:C(()=>[x(R,{modelValue:De.temperature,"onUpdate:modelValue":h[5]||(h[5]=e=>De.temperature=e),min:0,max:2,step:.1,"show-input":"","show-input-controls":!1,"input-size":"small"},null,8,["modelValue"])]),_:1}),x(P,{label:"关联知识库"},{default:C(()=>[x(E,{modelValue:De.knowledge_base_ids,"onUpdate:modelValue":h[6]||(h[6]=e=>De.knowledge_base_ids=e),multiple:"",placeholder:"请选择关联的知识库",style:{width:"100%"}},{default:C(()=>[(V(!0),S(M,null,I(Ee.value,e=>(V(),A(b,{key:e.id,label:e.name,value:e.id||""},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),x(P,null,{default:C(()=>[x(K,{type:"primary",loading:He.value,onClick:ta,style:{width:"100%"}},{default:C(()=>[...h[12]||(h[12]=[D(" 保存配置 ",-1)])]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"])),[[X,Oe.value]])]),$("div",se,[$("div",ne,[$("h3",null,"对话训练 - "+j(T(Q)[Z.value]),1),$("div",ie,[x(K,{text:"",icon:T(d),onClick:h[7]||(h[7]=e=>Be.value=!0)},{default:C(()=>[...h[14]||(h[14]=[D(" 起名测试 ",-1)])]),_:1},8,["icon"]),Pe.value.length>0?(V(),A(K,{key:0,text:"",icon:T(u),onClick:da},{default:C(()=>[...h[15]||(h[15]=[D(" 清空对话 ",-1)])]),_:1},8,["icon"])):H("",!0)])]),$("div",{ref_key:"messagesContainer",ref:Ne,class:"chat-messages"},[0!==Pe.value.length||Ue.value?O((V(),S("div",de,[(V(!0),S(M,null,I(Pe.value,e=>(V(),S("div",{key:e.id,class:U(["message-item",e.role])},["user"===e.role?(V(),S(M,{key:0},[$("div",ue,[$("div",ce,[x(K,{text:"",size:"small",icon:T(u),class:"delete-btn",onClick:a=>ra(e.id)},null,8,["icon","onClick"]),h[17]||(h[17]=$("span",{class:"sender-name"},"用户",-1))]),$("div",{class:"message-body",innerHTML:ua(e.content)},null,8,me)]),$("div",ve,[x(B,null,{default:C(()=>[x(T(v))]),_:1})])],64)):(V(),S(M,{key:1},[$("div",pe,[x(B,null,{default:C(()=>[x(T(c))]),_:1})]),$("div",ge,[$("div",_e,[h[18]||(h[18]=$("span",{class:"sender-name"},"AI",-1)),x(K,{text:"",size:"small",icon:T(u),class:"delete-btn",onClick:a=>ra(e.id)},null,8,["icon","onClick"])]),$("div",{class:"message-body",innerHTML:ua(e.content)},null,8,fe)])],64))],2))),128)),Ke.value?(V(),S("div",ye,[$("div",he,[x(B,null,{default:C(()=>[x(T(c))]),_:1})]),$("div",we,[h[20]||(h[20]=$("div",{class:"message-header"},[$("span",{class:"sender-name"},"AI")],-1)),$("div",ke,[Re.value?(V(),S("span",{key:0,innerHTML:ua(Re.value)},null,8,be)):(V(),S("span",Ve,[...h[19]||(h[19]=[$("span",null,null,-1),$("span",null,null,-1),$("span",null,null,-1)])]))])])])):H("",!0)])),[[X,Ue.value]]):(V(),S("div",oe,[$("div",re,[x(B,{size:"48"},{default:C(()=>[x(T(c))]),_:1}),$("h2",null,j(T(Q)[Z.value])+"训练",1),h[16]||(h[16]=$("p",null,"通过与AI对话来训练和优化模型效果",-1))])]))],512),$("div",Se,[$("div",$e,[x(J,{modelValue:Je.value,"onUpdate:modelValue":h[8]||(h[8]=e=>Je.value=e),type:"textarea",rows:1,autosize:{minRows:1,maxRows:4},placeholder:"输入消息进行训练...",disabled:Ke.value,onKeydown:L(z(sa,["exact","prevent"]),["enter"])},null,8,["modelValue","disabled","onKeydown"]),Ke.value?(V(),A(K,{key:1,type:"danger",icon:T(g),circle:"",onClick:na},null,8,["icon"])):(V(),A(K,{key:0,type:"primary",icon:T(p),disabled:!Je.value.trim(),circle:"",onClick:sa},null,8,["icon","disabled"]))]),h[21]||(h[21]=$("div",{class:"input-hint"}," 按 Enter 发送消息Shift + Enter 换行 ",-1))])]),x(F,{modelValue:Be.value,"onUpdate:modelValue":h[11]||(h[11]=e=>Be.value=e),title:"起名测试",width:"600px","close-on-click-modal":!1,onClosed:oa},{footer:C(()=>[x(K,{onClick:h[10]||(h[10]=e=>Be.value=!1)},{default:C(()=>[...h[23]||(h[23]=[D("关闭",-1)])]),_:1}),x(K,{type:"primary",loading:Ge.value,disabled:!Fe.value.trim(),onClick:ia},{default:C(()=>[...h[24]||(h[24]=[D(" 提交测试 ",-1)])]),_:1},8,["loading","disabled"])]),default:C(()=>[$("div",xe,[x(N,{"label-position":"top"},{default:C(()=>[x(P,{label:"测试内容"},{default:C(()=>[x(J,{modelValue:Fe.value,"onUpdate:modelValue":h[9]||(h[9]=e=>Fe.value=e),type:"textarea",rows:4,placeholder:"请输入要测试的内容...",disabled:Ge.value},null,8,["modelValue","disabled"])]),_:1})]),_:1}),Ze.value?(V(),S("div",Ce,[h[22]||(h[22]=$("div",{class:"result-header"},[$("span",null,"测试结果")],-1)),$("div",{class:"result-content",innerHTML:ua(Ze.value)},null,8,Me)])):H("",!0)])]),_:1},8,["modelValue"])])}}}),[["__scopeId","data-v-b7d6e58d"]]);export{Ie as default};