@hlw-zbzs/ai 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/ai.css ADDED
@@ -0,0 +1 @@
1
+ .ai-header[data-v-fd7319b0]{height:3rem;background:#fff;border-bottom:1px solid #e2e8f0;display:flex;align-items:center;justify-content:space-between;padding:0 1rem;flex-shrink:0}.ai-header .header-title[data-v-fd7319b0]{display:flex;align-items:center;gap:.5rem}.ai-header .header-title .title-icon[data-v-fd7319b0]{color:#2563eb;font-size:1.125rem}.ai-header .header-title .title-text[data-v-fd7319b0]{font-size:.9375rem;font-weight:400;color:#0f172a}.ai-header .header-right[data-v-fd7319b0]{display:flex;align-items:center;gap:.875rem}.ai-header .header-right .status-tag[data-v-fd7319b0]{-webkit-user-select:none;user-select:none;font-weight:400;font-size:.75rem;display:inline-flex;align-items:center;gap:.25rem}.ai-header .header-right .switch-wrap[data-v-fd7319b0]{display:flex;align-items:center;gap:.375rem}.ai-header .header-right .switch-wrap .switch-label[data-v-fd7319b0]{font-size:.8125rem;font-weight:400;color:#475569}.engine-section[data-v-d3fe9eca]{display:flex;flex-direction:column;gap:.625rem;padding:1rem 1rem .875rem;border-bottom:1px solid #f1f5f9}.engine-section .section-header[data-v-d3fe9eca]{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #f1f5f9;padding-bottom:.375rem}.engine-section .section-header .section-title[data-v-d3fe9eca]{font-size:.875rem;font-weight:400;color:#1e293b}.engine-section .section-header .section-hint[data-v-d3fe9eca]{font-size:.75rem;font-weight:400;color:#94a3b8}.engine-section .engine-grid[data-v-d3fe9eca]{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:.625rem}.engine-section .engine-grid .engine-card[data-v-d3fe9eca]{background:#f8fafc;border:1px solid #e2e8f0;border-radius:.375rem;padding:.5625rem .75rem;cursor:pointer;-webkit-user-select:none;user-select:none;transition:all .15s ease;display:flex;flex-direction:column;gap:.25rem;min-width:0}.engine-section .engine-grid .engine-card .card-head[data-v-d3fe9eca]{display:flex;align-items:center;justify-content:space-between}.engine-section .engine-grid .engine-card .card-head .card-name[data-v-d3fe9eca]{font-size:.8125rem;font-weight:400;color:#334155}.engine-section .engine-grid .engine-card .card-head .free-badge[data-v-d3fe9eca]{font-size:.6875rem;font-weight:400;color:#059669;background:#ecfdf5;padding:0 .25rem;border-radius:.1875rem}.engine-section .engine-grid .engine-card .card-head .key-link[data-v-d3fe9eca]{display:inline-flex;align-items:center;gap:.125rem;font-size:.6875rem;font-weight:400;color:#2563eb;background:#eff6ff;padding:.0625rem .3125rem;border-radius:.1875rem;cursor:pointer;transition:all .15s ease}.engine-section .engine-grid .engine-card .card-head .key-link .icon-link[data-v-d3fe9eca]{font-size:.625rem}.engine-section .engine-grid .engine-card .card-head .key-link[data-v-d3fe9eca]:hover{background:#dbeafe;color:#1d4ed8}.engine-section .engine-grid .engine-card .card-desc[data-v-d3fe9eca]{font-size:.6875rem;font-weight:400;color:#94a3b8;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.engine-section .engine-grid .engine-card[data-v-d3fe9eca]:hover{border-color:#93c5fd;background:#f1f5f9}.engine-section .engine-grid .engine-card.active[data-v-d3fe9eca]{border-color:#3b82f6;background:#eff6ff}.engine-section .engine-grid .engine-card.active .card-head .card-name[data-v-d3fe9eca]{color:#2563eb}.engine-section .engine-grid .engine-card.active .card-desc[data-v-d3fe9eca]{color:#3b82f6}.params-container[data-v-83061ed2]{display:flex;flex-direction:column;gap:1rem;padding:1rem 1rem 0}.params-container .params-fields[data-v-83061ed2]{display:flex;flex-direction:column;gap:1rem}.params-container .field-section[data-v-83061ed2]{display:flex;flex-direction:column;gap:.625rem}.params-container .field-section .section-header[data-v-83061ed2]{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #f1f5f9;padding-bottom:.375rem}.params-container .field-section .section-header .section-title[data-v-83061ed2]{font-size:.875rem;font-weight:400;color:#1e293b}.params-container .field-section .form-row[data-v-83061ed2]{display:flex;gap:.75rem}.params-container .field-section .form-row .flex-1[data-v-83061ed2]{flex:1;min-width:0}.params-container .field-section .form-row .flex-2[data-v-83061ed2]{flex:2;min-width:0}.params-container .field-section .form-field[data-v-83061ed2]{display:flex;flex-direction:column;gap:.375rem}.params-container .field-section .form-field .field-label[data-v-83061ed2]{font-size:.8125rem;font-weight:400;color:#475569;display:flex;align-items:center;justify-content:space-between}.params-container .field-section .form-field .field-label .label-title[data-v-83061ed2]{display:flex;align-items:center;gap:.25rem}.params-container .field-section .form-field .field-label .req-star[data-v-83061ed2]{color:#ef4444}.params-container .field-section .form-field .field-label .free-text[data-v-83061ed2]{color:#059669;font-size:.75rem}.params-container .field-section .form-field .field-label .portal-link[data-v-83061ed2]{display:inline-flex;align-items:center;gap:.25rem;font-size:.75rem;font-weight:400;color:#2563eb;cursor:pointer;text-decoration:none;transition:all .15s ease}.params-container .field-section .form-field .field-label .portal-link .icon-link[data-v-83061ed2]{font-size:.625rem}.params-container .field-section .form-field .field-label .portal-link[data-v-83061ed2]:hover{color:#1d4ed8;text-decoration:underline}.params-container .field-section .form-field .slider-box[data-v-83061ed2]{display:flex;align-items:center;gap:.625rem}.params-container .field-section .form-field .slider-box .temp-slider[data-v-83061ed2]{flex:1}.params-container .field-section .form-field .slider-box .temp-number[data-v-83061ed2]{width:5.5rem}.params-container .params-footer[data-v-83061ed2]{height:3.375rem;margin-top:auto;border-top:1px solid #e2e8f0;display:flex;align-items:center;justify-content:space-between;padding:0 1rem;margin-left:-1rem;margin-right:-1rem;background:#fff}.params-container .params-footer .footer-actions[data-v-83061ed2]{display:flex;align-items:center;gap:.5rem}.params-container .params-footer .result-tag[data-v-83061ed2]{-webkit-user-select:none;user-select:none;font-weight:400;font-size:.75rem;display:inline-flex;align-items:center;gap:.25rem}.chat-wrapper[data-v-e8146ded]{width:100%;height:100%;display:flex;flex-direction:column;background:#fff}.chat-wrapper .prompt-bar[data-v-e8146ded]{height:2.5rem;padding:0 1rem;border-bottom:1px solid #f1f5f9;display:flex;align-items:center;gap:.375rem;overflow-x:auto;flex-shrink:0}.chat-wrapper .prompt-bar .prompt-label[data-v-e8146ded]{font-size:.8125rem;font-weight:400;color:#64748b;white-space:nowrap}.chat-wrapper .prompt-bar .prompt-chip[data-v-e8146ded]{font-size:.75rem;font-weight:400;color:#2563eb;background:#eff6ff;border:1px solid #dbeafe;padding:.1875rem .625rem;border-radius:.25rem;cursor:pointer;white-space:nowrap;-webkit-user-select:none;user-select:none;transition:all .15s ease}.chat-wrapper .prompt-bar .prompt-chip[data-v-e8146ded]:hover{background:#dbeafe}.chat-wrapper .chat-area[data-v-e8146ded]{flex:1;min-height:0;overflow-y:auto;padding:1rem}.chat-wrapper .chat-area .chat-empty[data-v-e8146ded]{height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.5rem;color:#94a3b8;text-align:center}.chat-wrapper .chat-area .chat-empty .empty-icon[data-v-e8146ded]{color:#cbd5e1;font-size:2.5rem}.chat-wrapper .chat-area .chat-empty .empty-title[data-v-e8146ded]{font-size:.9375rem;font-weight:400;color:#475569}.chat-wrapper .chat-area .chat-empty .empty-desc[data-v-e8146ded]{font-size:.8125rem;font-weight:400;color:#94a3b8;max-width:21.25rem;line-height:1.5}.chat-wrapper .chat-area .chat-list[data-v-e8146ded]{display:flex;flex-direction:column;gap:.875rem}.chat-wrapper .chat-area .chat-list .chat-row[data-v-e8146ded]{display:flex;gap:.625rem;align-items:flex-start}.chat-wrapper .chat-area .chat-list .chat-row .role-tag[data-v-e8146ded]{width:2rem;height:2rem;border-radius:.375rem;display:flex;align-items:center;justify-content:center;font-size:.75rem;font-weight:400;flex-shrink:0}.chat-wrapper .chat-area .chat-list .chat-row .role-tag.user[data-v-e8146ded]{background:#2563eb;color:#fff}.chat-wrapper .chat-area .chat-list .chat-row .role-tag.assistant[data-v-e8146ded]{background:#f1f5f9;color:#334155;border:1px solid #e2e8f0}.chat-wrapper .chat-area .chat-list .chat-row .msg-bubble[data-v-e8146ded]{max-width:85%;display:flex;flex-direction:column;gap:.375rem}.chat-wrapper .chat-area .chat-list .chat-row .msg-bubble .think-box[data-v-e8146ded]{background:#f8fafc;border-left:3px solid #64748b;padding:.5rem .75rem;font-size:.75rem;font-weight:400;color:#64748b;border-radius:0 .25rem .25rem 0;font-family:monospace}.chat-wrapper .chat-area .chat-list .chat-row .msg-bubble .think-box .think-header[data-v-e8146ded]{display:flex;align-items:center;gap:.25rem;font-weight:400;color:#475569;margin-bottom:.1875rem;font-size:.75rem}.chat-wrapper .chat-area .chat-list .chat-row .msg-bubble .think-box .think-content[data-v-e8146ded]{white-space:pre-wrap;line-height:1.5}.chat-wrapper .chat-area .chat-list .chat-row .msg-bubble .msg-text[data-v-e8146ded]{background:#f8fafc;border:1px solid #f1f5f9;color:#0f172a;padding:.625rem .875rem;border-radius:.5rem;font-size:.8125rem;font-weight:400;line-height:1.6;white-space:pre-wrap;word-break:break-word}.chat-wrapper .chat-area .chat-list .chat-row .msg-bubble .msg-text .bubble-actions[data-v-e8146ded]{display:flex;justify-content:flex-end;margin-top:.375rem;border-top:1px dashed #e2e8f0;padding-top:.3125rem}.chat-wrapper .chat-area .chat-list .chat-row .msg-bubble .msg-text .bubble-actions .copy-btn[data-v-e8146ded]{display:inline-flex;align-items:center;gap:.1875rem;background:#fff;border:1px solid #cbd5e1;border-radius:.25rem;padding:.125rem .5rem;font-size:.75rem;font-weight:400;color:#475569;cursor:pointer;-webkit-user-select:none;user-select:none;transition:all .15s ease}.chat-wrapper .chat-area .chat-list .chat-row .msg-bubble .msg-text .bubble-actions .copy-btn[data-v-e8146ded]:hover{color:#2563eb;border-color:#93c5fd;background:#eff6ff}.chat-wrapper .chat-area .chat-list .chat-row .msg-bubble .msg-text .loading-hint[data-v-e8146ded]{color:#94a3b8;font-style:italic}.chat-wrapper .chat-area .chat-list .chat-row.user[data-v-e8146ded]{flex-direction:row-reverse}.chat-wrapper .chat-area .chat-list .chat-row.user .msg-bubble[data-v-e8146ded]{align-items:flex-end}.chat-wrapper .chat-area .chat-list .chat-row.user .msg-bubble .msg-text[data-v-e8146ded]{background:#2563eb;border:none;color:#fff}.chat-wrapper .chat-area .chat-list .chat-row.user .msg-bubble .msg-text .bubble-actions[data-v-e8146ded]{border-top:1px dashed rgba(255,255,255,.3)}.chat-wrapper .chat-area .chat-list .chat-row.user .msg-bubble .msg-text .bubble-actions .copy-btn[data-v-e8146ded]{background:#ffffff26;border-color:#fff6;color:#fff}.chat-wrapper .chat-area .chat-list .chat-row.user .msg-bubble .msg-text .bubble-actions .copy-btn[data-v-e8146ded]:hover{background:#ffffff40}.chat-wrapper .chat-input-bar[data-v-e8146ded]{padding:.75rem 1rem;background:#fff;border-top:1px solid #e2e8f0;display:flex;flex-direction:column;gap:.5rem;flex-shrink:0}.chat-wrapper .chat-input-bar .input-bottom-row[data-v-e8146ded]{display:flex;align-items:center;justify-content:space-between}.chat-wrapper .chat-input-bar .input-bottom-row .shortcut-tip[data-v-e8146ded]{font-size:.75rem;font-weight:400;color:#94a3b8}.chat-wrapper .chat-input-bar .input-bottom-row .action-buttons[data-v-e8146ded]{display:flex;align-items:center;gap:.5rem}.hlw-ai[data-v-2dd89a9e]{display:flex;flex-direction:column;width:100%;height:100%;background-color:#fff;overflow:hidden;font-weight:400}.ai-body[data-v-2dd89a9e]{flex:1;display:flex;min-height:0;overflow:hidden;background:#fff}.left-pane[data-v-2dd89a9e]{flex:1;min-width:0;border-right:1px solid #e2e8f0;display:flex;flex-direction:column;background:#fff}.left-pane .pane-content[data-v-2dd89a9e]{flex:1;overflow-y:auto;padding:0;display:flex;flex-direction:column}.right-pane[data-v-2dd89a9e]{flex:1;min-width:0;display:flex;flex-direction:column;background:#fff}
package/dist/env.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ /// <reference types="vite/client" />
2
+
3
+ declare module '*.vue' {
4
+ import type { DefineComponent } from 'vue'
5
+ const component: DefineComponent<{}, {}, any>
6
+ export default component
7
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @file @hlw-zbzs/ai 统一入口 (遵循单单词极简原则)
3
+ */
4
+ export type * from './src/types';
5
+ export * from './src/engines';
6
+ export * from './src/store';
7
+ export * from './src/composables';
8
+ export * from './src/components';
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ "use strict";var j=Object.defineProperty;var F=(t,n,o)=>n in t?j(t,n,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[n]=o;var S=(t,n,o)=>F(t,typeof n!="symbol"?n+"":n,o);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const J=require("openai"),H=require("pinia"),v=require("@hlw-zbzs/vue"),e=require("vue"),K=require("primevue/tag"),Q=require("primevue/toggleswitch"),P=require("@hlw-zbzs/core"),W=require("primevue/slider"),D=require("primevue/inputnumber"),X=require("primevue/password"),x={deepseek:{type:"deepseek",name:"DeepSeek",tag:"超高性价比 / 深度思考",enable:!0,models:["deepseek-chat","deepseek-reasoner"],model:"deepseek-chat",apiUrl:"https://api.deepseek.com/v1",website:"https://www.deepseek.com"},qwen:{type:"qwen",name:"通义千问",tag:"阿里百炼 / 国产领先",enable:!0,models:["qwen-max","qwen-plus","qwen-turbo","qwen-long","qwen2.5-72b-instruct"],model:"qwen-plus",apiUrl:"https://dashscope.aliyuncs.com/compatible-mode/v1",website:"https://tongyi.aliyun.com"},chatgpt:{type:"chatgpt",name:"ChatGPT",tag:"OpenAI / 强大通用",enable:!0,models:["gpt-4o","gpt-4o-mini","o1","o3-mini","gpt-4-turbo","gpt-3.5-turbo"],model:"gpt-4o-mini",apiUrl:"https://api.openai.com/v1",website:"https://openai.com"},zhipu:{type:"zhipu",name:"智谱 GLM",tag:"清华基座 / 智能体",enable:!0,models:["glm-4-plus","glm-4-air","glm-4-flash","glm-4-long","glm-zero-preview"],model:"glm-4-flash",apiUrl:"https://open.bigmodel.cn/api/paas/v4",website:"https://www.zhipuai.cn"},doubao:{type:"doubao",name:"字节豆包",tag:"火山引擎 / 低延迟",enable:!0,models:["doubao-pro-32k","doubao-lite-32k","doubao-pro-128k"],model:"doubao-pro-32k",apiUrl:"https://ark.cn-beijing.volces.com/api/v3",website:"https://www.doubao.com"},moonshot:{type:"moonshot",name:"Moonshot",tag:"Kimi / 超长上下文",enable:!0,models:["moonshot-v1-8k","moonshot-v1-32k","moonshot-v1-128k"],model:"moonshot-v1-8k",apiUrl:"https://api.moonshot.cn/v1",website:"https://www.moonshot.cn"},claude:{type:"claude",name:"Claude",tag:"Anthropic / 顶尖逻辑",enable:!0,models:["claude-3-5-sonnet-20241022","claude-3-5-haiku-20241022","claude-3-opus-20240229"],model:"claude-3-5-sonnet-20241022",apiUrl:"https://api.anthropic.com/v1",website:"https://claude.ai"},ollama:{type:"ollama",name:"Ollama",tag:"本地私有 / 免密免Key",free:!0,enable:!0,models:["deepseek-r1","llama3.3","qwen2.5","gemma2","mistral"],model:"deepseek-r1",apiUrl:"http://localhost:11434/v1",website:"https://ollama.com"},custom:{type:"custom",name:"自定义 API",tag:"第三方中转 / 兼容协议",enable:!0,models:["default"],model:"default",apiUrl:"https://api.openai.com/v1",website:"https://openai.com"}},U=Object.values(x);function Y(t){var n;return((n=x[t])==null?void 0:n.name)||t}class T{constructor(n,o){S(this,"type");S(this,"conf");S(this,"client",null);this.type=n,this.conf={...o},this.init()}init(){var l;const n=(this.conf.url||"").trim().replace(/\/+$/,"")||((l=x[this.type])==null?void 0:l.apiUrl)||"https://api.openai.com/v1",o=(this.conf.key||"").trim()||"dummy-key";this.client=new J({baseURL:n,apiKey:o,dangerouslyAllowBrowser:!0})}save(n){Object.assign(this.conf,n),this.init()}build(n){const o=[],l=n.sys??this.conf.sys;l&&l.trim()&&o.push({role:"system",content:l.trim()});for(const s of n.list)s.role==="system"&&l||o.push({role:s.role,content:s.text});return o}async chat(n){var y,V,p;this.client||this.init();const o=this.build(n),s=(y=(await this.client.chat.completions.create({model:n.model||this.conf.model,messages:o,temperature:n.temp??this.conf.temp??.7,max_tokens:n.tokens??this.conf.tokens??2048,stream:!1},{signal:n.signal})).choices)==null?void 0:y[0],r=((V=s==null?void 0:s.message)==null?void 0:V.content)||"",u=((p=s==null?void 0:s.message)==null?void 0:p.reasoning_content)||"";return{text:r,think:u}}async stream(n,o={}){var u,y,V,p,f,h;this.client||this.init();const l=this.build(n);let s="",r="";try{const m=await this.client.chat.completions.create({model:n.model||this.conf.model,messages:l,temperature:n.temp??this.conf.temp??.7,max_tokens:n.tokens??this.conf.tokens??2048,stream:!0},{signal:n.signal});for await(const d of m){const c=(y=(u=d.choices)==null?void 0:u[0])==null?void 0:y.delta;if(!c)continue;const _=c==null?void 0:c.reasoning_content;_&&(r+=_,(V=o.onThink)==null||V.call(o,_)),c.content&&(s+=c.content,(p=o.onToken)==null||p.call(o,c.content))}return(f=o.onDone)==null||f.call(o,s,r),{text:s,think:r}}catch(m){throw(h=o.onError)==null||h.call(o,m),m}}async test(n){const o={...this.conf};n&&this.save(n);const l=Date.now();try{return await this.chat({list:[{role:"user",text:"Hi"}],tokens:5}),{success:!0,msg:"连接成功",latency:Date.now()-l}}catch(s){return{success:!1,msg:(s==null?void 0:s.message)||"连接失败",latency:Date.now()-l}}finally{this.save(o)}}}function Z(t,n){return new T(t,n)}function $(){const t={};for(const n of U)t[n.type]={key:"",url:n.apiUrl,model:n.model,temp:.7,tokens:2048,sys:"你是一名专业热情的直播间智能助手,负责协助主播进行弹幕互动与话术生成。"};return t}const R=H.defineStore("ai",{state:()=>({engine:"deepseek",isEnabled:!0,configs:$(),remoteList:[]}),getters:{conf:t=>t.configs[t.engine]||$()[t.engine],isReady:t=>{var n,o;return t.engine==="ollama"||!!((o=(n=t.configs[t.engine])==null?void 0:n.key)!=null&&o.trim())},list:t=>t.remoteList.length>0?t.remoteList:U,info:t=>t.remoteList.find(o=>o.type===t.engine)||x[t.engine]||x.deepseek},actions:{set(t){this.engine=t},toggle(){this.isEnabled=!this.isEnabled},save(t,n){this.configs[t]||(this.configs[t]=$()[t]),Object.assign(this.configs[t],n)},reset(t){if(t){this.configs[t]=$()[t];return}this.configs=$(),this.engine="deepseek",this.isEnabled=!0},async sync(){try{const t=await v.get("/plugin-base/api.v1.ai/index");if(t.code===1&&Array.isArray(t.data)&&t.data.length>0){this.remoteList=t.data;for(const n of t.data)this.configs[n.type]||(this.configs[n.type]={key:"",url:n.apiUrl,model:n.model,temp:.7,tokens:2048,sys:"你是一名专业热情的直播间智能助手,负责协助主播进行弹幕互动与话术生成。"});return t.data}}catch{}return this.remoteList.length>0?this.remoteList:U}},persist:{key:"ai.config",storage:v.electronStorage}}),L=new Map;function I(t,n){let o=L.get(t);return o?o.save(n):(o=new T(t,n),L.set(t,o)),o}function B(){const t=R(),{engine:n,isEnabled:o}=H.storeToRefs(t),l=e.ref(!1),s=e.ref(""),r=e.ref("");let u=null;const y=e.computed(()=>I(t.engine,t.conf)),V=e.computed(()=>t.info),p=e.computed(()=>t.conf),f=e.computed(()=>t.isReady),h=e.computed(()=>t.list);function m(E){t.set(E)}function d(){u&&(u.abort(),u=null),l.value=!1}async function c(E,k,b){if(!o.value)throw new Error("AI 功能已停用");l.value=!0,s.value="",r.value="",u=new AbortController;const i=b?I(b,t.configs[b]||t.conf):y.value;try{const a=typeof E=="string"?[{role:"user",text:E}]:E,g=await i.chat({list:a,signal:u.signal,...k});return s.value=g.text,r.value=g.think||"",g.text}finally{l.value=!1,u=null}}async function _(E,k={},b){if(!o.value)throw new Error("AI 功能已停用");l.value=!0,s.value="",r.value="",u=new AbortController;const i=b?I(b,t.configs[b]||t.conf):y.value;try{const a=typeof E=="string"?[{role:"user",text:E}]:E;return(await i.stream({list:a,signal:u.signal},{onToken:w=>{var N;s.value+=w,(N=k.onToken)==null||N.call(k,w)},onThink:w=>{var N;r.value+=w,(N=k.onThink)==null||N.call(k,w)},onDone:(w,N)=>{var q;s.value=w,r.value=N||"",(q=k.onDone)==null||q.call(k,w,N)},onError:w=>{var N;(N=k.onError)==null||N.call(k,w)}})).text}finally{l.value=!1,u=null}}async function A(E,k){const b=E||t.engine,i=t.configs[b]||t.conf;return I(b,i).test(k)}return{store:t,engine:n,isEnabled:o,conf:p,info:V,list:h,isReady:f,isLoading:e.computed(()=>l.value),text:e.computed(()=>s.value),think:e.computed(()=>r.value),select:m,chat:c,stream:_,test:A,abort:d,save:t.save.bind(t),reset:t.reset.bind(t),sync:t.sync.bind(t)}}const ee={class:"ai-header"},te={class:"header-right"},ne={class:"switch-wrap"},oe=e.defineComponent({__name:"header",setup(t){const{info:n,isReady:o,isEnabled:l}=B();function s(){v.toast(`AI 功能已${l.value?"开启":"停用"}`,l.value?"success":"info")}return(r,u)=>(e.openBlock(),e.createElementBlock("div",ee,[u[2]||(u[2]=e.createElementVNode("div",{class:"header-title"},[e.createElementVNode("i",{class:"pi pi-microchip title-icon"}),e.createElementVNode("span",{class:"title-text"},"大模型配置与测试")],-1)),e.createElementVNode("div",te,[e.createVNode(e.unref(K),{severity:e.unref(o)?"success":"warn",rounded:"",class:"status-tag"},{icon:e.withCtx(()=>[e.createElementVNode("i",{class:e.normalizeClass(e.unref(o)?"pi pi-check-circle":"pi pi-exclamation-circle")},null,2)]),default:e.withCtx(()=>[e.createTextVNode(" "+e.toDisplayString(e.unref(o)?`${e.unref(n).name} 已就绪`:`${e.unref(n).name} 未配 Key`),1)]),_:1},8,["severity"]),e.createElementVNode("div",ne,[u[1]||(u[1]=e.createElementVNode("span",{class:"switch-label"},"启用 AI:",-1)),e.createVNode(e.unref(Q),{modelValue:e.unref(l),"onUpdate:modelValue":u[0]||(u[0]=y=>e.isRef(l)?l.value=y:null),onChange:s},null,8,["modelValue"])])])]))}}),C=(t,n)=>{const o=t.__vccOpts||t;for(const[l,s]of n)o[l]=s;return o},M=C(oe,[["__scopeId","data-v-fd7319b0"]]),se={class:"engine-section"},le={class:"engine-grid"},ae=["onClick"],ie={class:"card-head"},ce={class:"card-name"},re={key:0,class:"free-badge"},de=["onClick"],ue={class:"card-desc"},me=e.defineComponent({__name:"grid",emits:["change"],setup(t,{emit:n}){const o=n,{engine:l,list:s,select:r,sync:u}=B();e.onMounted(()=>{u()});function y(p){p!=null&&p.website&&(P.tools.openExternal(p.website),v.toast(`已为你打开【${p.name}】开发者控制台`,"info"))}function V(p){r(p.type),o("change",p.type)}return(p,f)=>(e.openBlock(),e.createElementBlock("div",se,[f[1]||(f[1]=e.createElementVNode("div",{class:"section-header"},[e.createElementVNode("span",{class:"section-title"},"选择大模型服务商"),e.createElementVNode("span",{class:"section-hint"},"点击一键切换引擎")],-1)),e.createElementVNode("div",le,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(s),h=>(e.openBlock(),e.createElementBlock("div",{key:h.type,class:e.normalizeClass(["engine-card",{active:e.unref(l)===h.type}]),onClick:m=>V(h)},[e.createElementVNode("div",ie,[e.createElementVNode("span",ce,e.toDisplayString(h.name),1),h.free?(e.openBlock(),e.createElementBlock("span",re,"免密")):h.website?(e.openBlock(),e.createElementBlock("span",{key:1,class:"key-link",title:"点击打开官网获取 Key",onClick:e.withModifiers(m=>y(h),["stop"])},[...f[0]||(f[0]=[e.createElementVNode("span",null,"获取Key",-1),e.createElementVNode("i",{class:"pi pi-external-link icon-link"},null,-1)])],8,de)):e.createCommentVNode("",!0)]),e.createElementVNode("span",ue,e.toDisplayString(h.tag),1)],10,ae))),128))])]))}}),z=C(me,[["__scopeId","data-v-d3fe9eca"]]),pe={class:"params-container"},fe={class:"params-fields"},ve={class:"field-section"},ge={class:"form-row"},ke={class:"form-field flex-2"},he={class:"field-label"},ye={class:"label-title"},Ve={key:0,class:"req-star"},Ee={key:1,class:"free-text"},be={class:"form-field flex-1"},Ne={class:"form-field"},_e={class:"field-section"},we={class:"form-row"},$e={class:"form-field flex-1"},xe={class:"field-label"},Be={class:"slider-box"},Ce={class:"form-field flex-1"},Ae={class:"form-field"},Se={class:"params-footer"},Ie={class:"footer-actions"},Ue=e.defineComponent({__name:"params",setup(t,{expose:n}){const{engine:o,conf:l,info:s,save:r,reset:u,test:y}=B();function V(i){i&&P.tools.openExternal(i)}const p=e.ref(!1),f=e.ref(null),h=e.computed(()=>(s.value.models||[]).map(a=>({label:a,value:a}))),m=e.computed({get:()=>l.value.temp??.7,set:i=>{i!=null&&r(o.value,{temp:i})}}),d=e.computed({get:()=>l.value.tokens??2048,set:i=>{i&&r(o.value,{tokens:i})}});function c(){r(o.value,{key:(l.value.key||"").trim()})}function _(i){r(o.value,{url:String(i||"").trim()})}function A(i){const a=(i==null?void 0:i.value)!==void 0?i.value:i;r(o.value,{model:String(a||"").trim()})}function E(i){r(o.value,{sys:String(i||"")})}async function k(){p.value=!0,f.value=null;try{const i=await y();f.value=i,i.success?v.toast(`连接成功,耗时 ${i.latency}ms`,"success"):v.toast(`连接失败: ${i.msg}`,"error")}catch(i){f.value={success:!1,msg:(i==null?void 0:i.message)||"连接异常",latency:0},v.toast(`连接异常: ${(i==null?void 0:i.message)||"未知错误"}`,"error")}finally{p.value=!1}}function b(){u(o.value),f.value=null,v.toast(`已恢复【${s.value.name}】为默认配置`,"info")}return n({clearTest:()=>{f.value=null}}),(i,a)=>(e.openBlock(),e.createElementBlock("div",pe,[e.createElementVNode("div",fe,[e.createElementVNode("div",ve,[a[12]||(a[12]=e.createElementVNode("div",{class:"section-header"},[e.createElementVNode("span",{class:"section-title"},"API 凭证与模型")],-1)),e.createElementVNode("div",ge,[e.createElementVNode("div",ke,[e.createElementVNode("label",he,[e.createElementVNode("span",ye,[a[8]||(a[8]=e.createElementVNode("span",null,"API Key",-1)),e.unref(s).free?(e.openBlock(),e.createElementBlock("span",Ee,"(本地模型无需填写)")):(e.openBlock(),e.createElementBlock("span",Ve,"*"))]),e.unref(s).website?(e.openBlock(),e.createElementBlock("a",{key:0,class:"portal-link",title:"在浏览器中打开开发者平台获取 Key",onClick:a[0]||(a[0]=e.withModifiers(g=>V(e.unref(s).website),["stop"]))},[e.createElementVNode("span",null,"获取 "+e.toDisplayString(e.unref(s).name)+" 密钥",1),a[9]||(a[9]=e.createElementVNode("i",{class:"pi pi-external-link icon-link"},null,-1))])):e.createCommentVNode("",!0)]),e.createVNode(e.unref(X),{modelValue:e.unref(l).key,"onUpdate:modelValue":a[1]||(a[1]=g=>e.unref(l).key=g),feedback:!1,"toggle-mask":"",fluid:"",placeholder:e.unref(s).free?"免密模型":"请输入 API Key (sk-...)",onChange:c},null,8,["modelValue","placeholder"])]),e.createElementVNode("div",be,[a[10]||(a[10]=e.createElementVNode("label",{class:"field-label"},"模型 (Model)",-1)),e.createVNode(e.unref(v.HlwSelect),{modelValue:e.unref(l).model,"onUpdate:modelValue":a[2]||(a[2]=g=>e.unref(l).model=g),options:h.value,"option-label":"label","option-value":"value",editable:"",fluid:"",filter:"",placeholder:"选择或输入模型",onChange:A},null,8,["modelValue","options"])])]),e.createElementVNode("div",Ne,[a[11]||(a[11]=e.createElementVNode("label",{class:"field-label"},"接口地址 (Base URL)",-1)),e.createVNode(e.unref(v.HlwInput),{modelValue:e.unref(l).url,"onUpdate:modelValue":[a[3]||(a[3]=g=>e.unref(l).url=g),_],fluid:"",clearable:"",placeholder:"https://api.openai.com/v1"},null,8,["modelValue"])])]),e.createElementVNode("div",_e,[a[15]||(a[15]=e.createElementVNode("div",{class:"section-header"},[e.createElementVNode("span",{class:"section-title"},"生成参数")],-1)),e.createElementVNode("div",we,[e.createElementVNode("div",$e,[e.createElementVNode("label",xe,"随机温度 (Temperature): "+e.toDisplayString(m.value),1),e.createElementVNode("div",Be,[e.createVNode(e.unref(W),{modelValue:m.value,"onUpdate:modelValue":a[4]||(a[4]=g=>m.value=g),min:0,max:2,step:.05,class:"temp-slider"},null,8,["modelValue"]),e.createVNode(e.unref(D),{modelValue:m.value,"onUpdate:modelValue":a[5]||(a[5]=g=>m.value=g),min:0,max:2,step:.05,"min-fraction-digits":2,"max-fraction-digits":2,class:"temp-number"},null,8,["modelValue"])])]),e.createElementVNode("div",Ce,[a[13]||(a[13]=e.createElementVNode("label",{class:"field-label"},"最大 Token 数",-1)),e.createVNode(e.unref(D),{modelValue:d.value,"onUpdate:modelValue":a[6]||(a[6]=g=>d.value=g),min:128,max:16384,step:256,fluid:""},null,8,["modelValue"])])]),e.createElementVNode("div",Ae,[a[14]||(a[14]=e.createElementVNode("label",{class:"field-label"},"系统人设 (System Prompt)",-1)),e.createVNode(e.unref(v.HlwInput),{modelValue:e.unref(l).sys,"onUpdate:modelValue":[a[7]||(a[7]=g=>e.unref(l).sys=g),E],type:"textarea",fluid:"",rows:3,placeholder:"定义 AI 的角色定位与回答风格..."},null,8,["modelValue"])])])]),e.createElementVNode("div",Se,[e.createElementVNode("div",Ie,[e.createVNode(e.unref(v.HlwButton),{variant:"outlined",loading:p.value,icon:"pi pi-bolt",label:"测试连接",onClick:k},null,8,["loading"]),e.createVNode(e.unref(v.HlwButton),{variant:"outlined",severity:"secondary",icon:"pi pi-refresh",label:"恢复默认",onClick:b})]),f.value?(e.openBlock(),e.createBlock(e.unref(K),{key:0,severity:f.value.success?"success":"danger",rounded:"",class:"result-tag"},{icon:e.withCtx(()=>[e.createElementVNode("i",{class:e.normalizeClass(f.value.success?"pi pi-check-circle":"pi pi-times-circle")},null,2)]),default:e.withCtx(()=>[e.createTextVNode(" "+e.toDisplayString(f.value.success?`已连通 (${f.value.latency}ms)`:"连接失败"),1)]),_:1},8,["severity"])):e.createCommentVNode("",!0)])]))}}),O=C(Ue,[["__scopeId","data-v-83061ed2"]]),Te={class:"chat-wrapper"},qe={class:"prompt-bar"},De={class:"chat-area"},Le={key:0,class:"chat-empty"},He={key:1,class:"chat-list"},Ke={class:"msg-bubble"},Pe={key:0,class:"think-box"},Re={class:"think-content"},Me={class:"msg-text"},ze={class:"text-content"},Oe={key:0},Ge={key:1,class:"loading-hint"},je={key:0,class:"bubble-actions"},Fe=["onClick"],Je={class:"chat-input-bar"},Qe={class:"input-bottom-row"},We={class:"action-buttons"},Xe=e.defineComponent({__name:"chat",setup(t){const{isLoading:n,stream:o,abort:l}=B(),s=e.ref(""),r=e.ref([]);function u(m){s.value=m}async function y(m){if(m)try{await navigator.clipboard.writeText(m),v.toast("已复制话术到剪贴板","success")}catch{v.toast("复制失败,请手动复制","error")}}function V(m){m.key==="Enter"&&!m.shiftKey&&(m.preventDefault(),s.value.trim()&&!n.value&&p())}async function p(){const m=s.value.trim();if(!m||n.value)return;s.value="",r.value.push({role:"user",text:m});const d={role:"assistant",text:"",think:""};r.value.push(d);try{await o(r.value.slice(0,-1),{onToken:c=>{d.text+=c},onThink:c=>{d.think||(d.think=""),d.think+=c},onError:c=>{v.toast(`生成错误: ${c.message}`,"error")}})}catch(c){d.text=`[请求失败]: ${(c==null?void 0:c.message)||"网络异常"}`}}function f(){l(),v.toast("已中止当前生成","info")}function h(){r.value=[]}return(m,d)=>(e.openBlock(),e.createElementBlock("div",Te,[e.createElementVNode("div",qe,[d[5]||(d[5]=e.createElementVNode("span",{class:"prompt-label"},"常用话术:",-1)),e.createElementVNode("span",{class:"prompt-chip",onClick:d[0]||(d[0]=c=>u("帮我写一段幽默风趣的直播间求点赞话术"))}," 求点赞 "),e.createElementVNode("span",{class:"prompt-chip",onClick:d[1]||(d[1]=c=>u("观众送出了嘉年华,写一段热情霸气的感谢词"))}," 感谢大哥 "),e.createElementVNode("span",{class:"prompt-chip",onClick:d[2]||(d[2]=c=>u("有观众在弹幕质疑商品价格偏高,给出高情商回复话术"))}," 高情商解围 "),e.createElementVNode("span",{class:"prompt-chip",onClick:d[3]||(d[3]=c=>u("直播间准备开始抽奖,帮我写一段炒热气氛的话术"))}," 抽奖倒计时 ")]),e.createElementVNode("div",De,[r.value.length===0?(e.openBlock(),e.createElementBlock("div",Le,[...d[6]||(d[6]=[e.createElementVNode("i",{class:"pi pi-microchip empty-icon"},null,-1),e.createElementVNode("span",{class:"empty-title"},"AI 对话演练沙箱",-1),e.createElementVNode("span",{class:"empty-desc"},"选择服务商后,在下方输入话术需求或点击上方预设,实时体验大模型流式输出与思考推理",-1)])])):(e.openBlock(),e.createElementBlock("div",He,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.value,(c,_)=>(e.openBlock(),e.createElementBlock("div",{key:_,class:e.normalizeClass(["chat-row",c.role])},[e.createElementVNode("div",{class:e.normalizeClass(["role-tag",c.role])},e.toDisplayString(c.role==="user"?"主播":"AI"),3),e.createElementVNode("div",Ke,[c.think?(e.openBlock(),e.createElementBlock("div",Pe,[d[7]||(d[7]=e.createElementVNode("div",{class:"think-header"},[e.createElementVNode("i",{class:"pi pi-code"}),e.createElementVNode("span",null,"思考过程")],-1)),e.createElementVNode("div",Re,e.toDisplayString(c.think),1)])):e.createCommentVNode("",!0),e.createElementVNode("div",Me,[e.createElementVNode("div",ze,[c.text?(e.openBlock(),e.createElementBlock("span",Oe,e.toDisplayString(c.text),1)):e.unref(n)&&_===r.value.length-1?(e.openBlock(),e.createElementBlock("span",Ge," 正在思考与生成回复... ")):e.createCommentVNode("",!0)]),c.text?(e.openBlock(),e.createElementBlock("div",je,[e.createElementVNode("button",{class:"copy-btn",title:"复制话术内容",onClick:e.withModifiers(A=>y(c.text),["stop"])},[...d[8]||(d[8]=[e.createElementVNode("i",{class:"pi pi-copy"},null,-1),e.createElementVNode("span",null,"复制话术",-1)])],8,Fe)])):e.createCommentVNode("",!0)])])],2))),128))]))]),e.createElementVNode("div",Je,[e.createVNode(e.unref(v.HlwInput),{modelValue:s.value,"onUpdate:modelValue":d[4]||(d[4]=c=>s.value=c),type:"textarea",rows:3,placeholder:"输入提问内容 (快捷键 Enter 发送,Shift + Enter 换行)...",disabled:e.unref(n),fluid:"",onKeydown:V},null,8,["modelValue","disabled"]),e.createElementVNode("div",Qe,[d[9]||(d[9]=e.createElementVNode("span",{class:"shortcut-tip"},"Enter 发送 / Shift + Enter 换行",-1)),e.createElementVNode("div",We,[e.createVNode(e.unref(v.HlwButton),{variant:"outlined",severity:"secondary",icon:"pi pi-trash",disabled:r.value.length===0||e.unref(n),label:"清空记录",onClick:h},null,8,["disabled"]),e.unref(n)?(e.openBlock(),e.createBlock(e.unref(v.HlwButton),{key:0,severity:"warn",variant:"outlined",icon:"pi pi-stop-circle",label:"停止生成",onClick:f})):(e.openBlock(),e.createBlock(e.unref(v.HlwButton),{key:1,severity:"primary",icon:"pi pi-send",disabled:!s.value.trim(),label:"发送测试",onClick:p},null,8,["disabled"]))])])])]))}}),G=C(Xe,[["__scopeId","data-v-e8146ded"]]),Ye={class:"hlw-ai"},Ze={class:"ai-body"},et={class:"left-pane"},tt={class:"pane-content"},nt={class:"right-pane"},ot=e.defineComponent({__name:"ai",setup(t){const{refs:n,setRefs:o}=v.useRefs();function l(){var s,r;(r=(s=n.value.params)==null?void 0:s.clearTest)==null||r.call(s)}return(s,r)=>(e.openBlock(),e.createElementBlock("div",Ye,[e.createVNode(M),e.createElementVNode("div",Ze,[e.createElementVNode("div",et,[e.createElementVNode("div",tt,[e.createVNode(z,{onChange:l}),e.createVNode(O,{ref:e.unref(o)("params")},null,512)])]),e.createElementVNode("div",nt,[e.createVNode(G)])])]))}}),st=C(ot,[["__scopeId","data-v-2dd89a9e"]]);exports.AiChat=G;exports.AiGrid=z;exports.AiHeader=M;exports.AiParams=O;exports.ENGINES=U;exports.Engine=T;exports.HlwAi=st;exports.createEngine=Z;exports.engineName=Y;exports.engines=x;exports.getDefaults=$;exports.useAi=B;exports.useAiStore=R;