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