Files
jizhi/backend/MiaoJiZhang.Api/wwwroot/assets/Settings-CYKsnZ8p.js
T
2026-07-24 23:11:20 +08:00

1 line
8.0 KiB
JavaScript

import{Bn as e,Cn as t,Kn as n,Ln as r,Pn as i,Qn as a,Sn as o,_n as s,a as c,bn as l,fn as u,or as d,vn as f,xn as p,yn as m,zn as h}from"./config-provider-q7ATIdCu.js";import{t as g}from"./api-BV_Zb8mM.js";var _={key:0,style:{"text-align":`center`,padding:`60px`}},v={style:{"font-weight":`600`}},y={style:{"font-size":`11px`,color:`#999`,"margin-top":`2px`,"white-space":`normal`}},b={style:{"font-size":`10px`,color:`#bbb`,"margin-top":`2px`,"font-family":`monospace`}},x=t({__name:`Settings`,setup(t){let x=a({}),S=a(!0),C=a(!1),w=a(null),T=a(``),E=[`llm.protocol`,`llm.base_url`,`llm.model`,`llm.max_tokens`,`llm.temperature`],D=[`limit.daily_ai_messages`,`limit.daily_ai_messages_per_user`,`limit.max_monthly_budget`],O=[`feature.ocr_enabled`,`feature.voice_enabled`,`feature.ai_auto_book`,`feature.sticker_enabled`],k=[`system.default_ledger_name`,`system.max_ledgers_per_user`,`brand.app_name`,`brand.slogan`,`brand.logo_url`],A=[{value:`chat_completions`,label:`Chat Completions`,desc:`OpenAI Chat Completions API。POST /v1/chat/completions`,endpoint:`/chat/completions`},{value:`responses`,label:`Responses`,desc:`OpenAI Responses API(新版)。POST /v1/responses`,endpoint:`/responses`},{value:`messages`,label:`Messages`,desc:`Anthropic Messages API。POST /v1/messages,用于 Claude 系列`,endpoint:`/messages`}],j={"llm.protocol":{label:`API 协议`,desc:``,type:`protocol`},"llm.base_url":{label:`API 地址`,desc:``,type:`url`},"llm.model":{label:`模型名称`,desc:``,type:`text`},"llm.max_tokens":{label:`最大输出 Token`,desc:`单次请求上限`,type:`number`},"llm.temperature":{label:`温度 (Temperature)`,desc:`0=确定 1=创意`,type:`number`},"limit.daily_ai_messages":{label:`全站每日 AI 消息上限`,desc:``,type:`number`},"limit.daily_ai_messages_per_user":{label:`每人每日 AI 消息上限`,desc:``,type:`number`},"limit.max_monthly_budget":{label:`最大月预算金额`,desc:``,type:`number`},"feature.ocr_enabled":{label:`OCR 小票识别`,desc:`拍照记账功能`,type:`switch`},"feature.voice_enabled":{label:`语音记账`,desc:`语音输入转文字`,type:`switch`},"feature.ai_auto_book":{label:`AI 自动入账`,desc:`AI 识别记账意图直接入账`,type:`switch`},"feature.sticker_enabled":{label:`表情包功能`,desc:`聊天表情包面板 + AI 表情回复`,type:`switch`},"system.default_ledger_name":{label:`新用户默认账本名`,desc:``,type:`text`},"system.max_ledgers_per_user":{label:`每人最多账本数`,desc:``,type:`number`},"brand.app_name":{label:`App 名称`,desc:``,type:`text`},"brand.slogan":{label:`App 标语`,desc:``,type:`text`},"brand.logo_url":{label:`Logo URL`,desc:``,type:`url`}};i(async()=>{try{let e=await g.configs(),t={};for(let n of e)t[n.key]=n;x.value=t,t[`llm.protocol`]||N(`llm.protocol`,`chat_completions`),P.value=M(`llm.protocol`)||`chat_completions`}finally{S.value=!1}});function M(e){let t=x.value[e];if(!t)return``;let n=j[e];return n?.type===`number`?Number(t.value)||0:n?.type===`switch`?t.value===`true`:t.value}function N(e,t){let n=String(t);x.value[e]?x.value[e].value=n:x.value[e]={id:0,key:e,value:n,version:0}}let P=a(`chat_completions`);async function F(e){N(`llm.protocol`,P.value);let t=e.filter(e=>x.value[e]).map(async e=>{let t=x.value[e];try{if(t.id>0){let e=await g.updateConfig(t.id,t.value);t&&(t.id=e.id)}else{let e=await g.createConfig(t.key,t.value);t&&(t.id=e.id)}}catch(t){c.error(e+` 保存失败: `+(t?.response?.data?.detail||t?.response?.data?.error||t.message))}});if(t.length===0){c.warning(`没有可保存的配置`);return}await Promise.all(t),c.success(`已保存 `+t.length+` 项配置`)}async function I(){C.value=!0,w.value=null,T.value=``;try{let e=await g.testLlm();w.value=e.ok,T.value=e.detail||e.error||``,e.ok?c.success(`LLM 连接正常`):c.error(e.error||`连接失败`)}catch(e){w.value=!1;let t=e?.response?.data;T.value=t?.detail||t?.error||t?.message||e.message||`未知错误`,c.error(`连接失败`)}finally{C.value=!1}}return(t,i)=>{let a=e(`a-spin`),c=e(`a-button`),g=e(`a-space`),x=e(`a-alert`),L=e(`a-radio`),R=e(`a-col`),z=e(`a-row`),B=e(`a-radio-group`),V=e(`a-descriptions-item`),H=e(`a-input`),U=e(`a-input-number`),W=e(`a-descriptions`),G=e(`a-card`),K=e(`a-switch`);return S.value?(r(),l(`div`,_,[o(a,{size:`large`})])):(r(),l(u,{key:1},[i[15]||=s(`h2`,{style:{"margin-bottom":`18px`}},`系统设置`,-1),o(G,{title:`LLM 大模型配置`,size:`small`,style:{"margin-bottom":`14px`}},{extra:n(()=>[o(g,null,{default:n(()=>[o(c,{size:`small`,onClick:I,loading:C.value},{default:n(()=>[...i[9]||=[p(`测试连接`,-1)]]),_:1},8,[`loading`]),o(c,{size:`small`,type:`primary`,onClick:i[0]||=e=>F(E)},{default:n(()=>[...i[10]||=[p(`保存`,-1)]]),_:1})]),_:1})]),default:n(()=>[w.value===null?m(``,!0):(r(),f(x,{key:0,type:w.value?`success`:`error`,message:w.value?`连接成功`:`连接失败`,description:T.value,"show-icon":``,style:{"margin-bottom":`14px`},closable:``},null,8,[`type`,`message`,`description`])),o(W,{column:2,size:`small`,bordered:``},{default:n(()=>[o(V,{label:`API 协议`,span:2},{default:n(()=>[o(B,{value:P.value,"onUpdate:value":i[1]||=e=>P.value=e,style:{width:`100%`}},{default:n(()=>[o(z,{gutter:[8,8]},{default:n(()=>[(r(),l(u,null,h(A,e=>o(R,{key:e.value,span:8},{default:n(()=>[o(L,{value:e.value,style:{display:`block`}},{default:n(()=>[s(`span`,v,d(e.label),1),s(`div`,y,d(e.desc),1),s(`div`,b,d(e.endpoint),1)]),_:2},1032,[`value`])]),_:2},1024)),64))]),_:1})]),_:1},8,[`value`])]),_:1}),o(V,{label:`API 地址`,span:2},{default:n(()=>[o(H,{value:M(`llm.base_url`),onChange:i[2]||=e=>N(`llm.base_url`,e.target.value),placeholder:`https://api.openai.com/v1`},null,8,[`value`]),i[11]||=s(`div`,{style:{color:`#999`,"font-size":`11px`,"margin-top":`2px`}},`会自动拼上协议路径`,-1)]),_:1}),o(V,{label:`API Key`,span:2},{default:n(()=>[o(x,{type:`info`,message:`API Key 仅通过服务器环境变量 LLM_API_KEY 配置,后台不会读取或显示完整密钥。`,"show-icon":``})]),_:1}),o(V,{label:`模型名称`,span:2},{default:n(()=>[o(H,{value:M(`llm.model`),onChange:i[3]||=e=>N(`llm.model`,e.target.value),placeholder:`gpt-4o-mini`},null,8,[`value`])]),_:1}),o(V,{label:`最大输出 Token`,span:1},{default:n(()=>[o(U,{value:M(`llm.max_tokens`),onChange:i[4]||=e=>N(`llm.max_tokens`,e),style:{width:`100%`},min:1},null,8,[`value`])]),_:1}),o(V,{label:`温度`,span:1},{default:n(()=>[o(U,{value:M(`llm.temperature`),onChange:i[5]||=e=>N(`llm.temperature`,e),style:{width:`100%`},min:0,max:2,step:.1},null,8,[`value`])]),_:1})]),_:1})]),_:1}),o(G,{title:`限额配置`,size:`small`,style:{"margin-bottom":`14px`}},{extra:n(()=>[o(c,{size:`small`,type:`primary`,onClick:i[6]||=e=>F(D)},{default:n(()=>[...i[12]||=[p(`保存`,-1)]]),_:1})]),default:n(()=>[o(W,{column:2,size:`small`,bordered:``},{default:n(()=>[(r(),l(u,null,h(D,e=>o(V,{key:e,label:j[e]?.label,span:1},{default:n(()=>[o(U,{value:M(e),onChange:t=>N(e,t),style:{width:`100%`},min:0},null,8,[`value`,`onChange`])]),_:2},1032,[`label`])),64))]),_:1})]),_:1}),o(G,{title:`功能开关`,size:`small`,style:{"margin-bottom":`14px`}},{extra:n(()=>[o(c,{size:`small`,type:`primary`,onClick:i[7]||=e=>F(O)},{default:n(()=>[...i[13]||=[p(`保存`,-1)]]),_:1})]),default:n(()=>[o(W,{column:2,size:`small`,bordered:``},{default:n(()=>[(r(),l(u,null,h(O,e=>o(V,{key:e,label:j[e]?.label,span:1},{default:n(()=>[o(K,{checked:M(e),onChange:t=>N(e,t)},null,8,[`checked`,`onChange`])]),_:2},1032,[`label`])),64))]),_:1})]),_:1}),o(G,{title:`系统 & 品牌`,size:`small`,style:{"margin-bottom":`14px`}},{extra:n(()=>[o(c,{size:`small`,type:`primary`,onClick:i[8]||=e=>F(k)},{default:n(()=>[...i[14]||=[p(`保存`,-1)]]),_:1})]),default:n(()=>[o(W,{column:2,size:`small`,bordered:``},{default:n(()=>[(r(),l(u,null,h(k,e=>o(V,{key:e,label:j[e]?.label,span:e===`brand.slogan`||e===`brand.logo_url`?2:1},{default:n(()=>[e===`system.max_ledgers_per_user`?(r(),f(U,{key:0,value:M(e),onChange:t=>N(e,t),style:{width:`100%`},min:1,max:50},null,8,[`value`,`onChange`])):(r(),f(H,{key:1,value:M(e),onChange:t=>N(e,t.target.value)},null,8,[`value`,`onChange`]))]),_:2},1032,[`label`,`span`])),64))]),_:1})]),_:1})],64))}}});export{x as default};