SPA shop/forum/payment/users sections now keep configuration pages only. Operational workbenches were removed from the sidebar and loaders; legacy hash routes open NativeOpsRedirect into the matching WP native admin page. Admin SPA production build refreshed accordingly.
2 lines
8.8 KiB
JavaScript
2 lines
8.8 KiB
JavaScript
import{X as l,a4 as I,Y as a,f as d,Z as i,a5 as m,L as k,j as _,af as P,ah as w,ag as u,F as S,R as E,o as V,c as g,r as f,e as C,a1 as O,W as r}from"./vendor-vue.Bykizn0M.js";import{P as U}from"./PageHeader.Di3JTPjc.js";import{a as A}from"./shared-api.D5_fnN32.js";import{_ as L}from"./index.js";import"./vendor-naive.BuHWlEgf.js";import"./vendor-misc.1adHN6i_.js";const W={name:"ExtensionAI",components:{PageHeader:U},setup(){const n=f({enabled:!1,provider:"none",configured:!1,model:"",api_key:"",rate_limit:10,available:!1,backend:"none",wp_ai_available:!1,theme_available:!1,seo_ai_enabled:!1,write_assist:!1}),s=C({enabled:!1,provider:"none",api_key:"",api_base:"https://api.openai.com/v1",model:"gpt-3.5-turbo",max_tokens:1e3,rate_limit:10}),v=f(!1),e=f(""),b=g(()=>({wp_ai:"WP AI Client",theme:"主题 Provider",none:"无"})[n.value.backend]||n.value.backend||"无"),c=g(()=>{const t=!!n.value.available;return[{key:"seo",name:"AI 生成 SEO",scene:"文章/分类「独立 SEO」框",ready:t&&!!n.value.seo_ai_enabled},{key:"summary",name:"AI 生成摘要",scene:"前台投稿页",ready:t},{key:"tags",name:"AI 建议标签",scene:"前台投稿页",ready:t}]});function p(t){!t||typeof t!="object"||(n.value={enabled:!!t.enabled,provider:t.provider||"none",configured:!!t.configured,model:t.model||"",api_key:"",rate_limit:t.rate_limit||10,available:!!t.available,backend:t.backend||"none",wp_ai_available:!!t.wp_ai_available,theme_available:!!t.theme_available,seo_ai_enabled:!!t.seo_ai_enabled,write_assist:!!t.write_assist},s.enabled=!!t.enabled,s.provider=t.provider||"none",s.model=t.model||"gpt-3.5-turbo",s.rate_limit=t.rate_limit||10,t.api_base&&(s.api_base=t.api_base),typeof t.max_tokens=="number"&&t.max_tokens>0&&(s.max_tokens=t.max_tokens))}async function o(){e.value="";try{const t=await A.getAiStatus();p(t.data||{})}catch(t){console.error("Load AI status failed:",t),e.value=(t==null?void 0:t.message)||"加载 AI 状态失败"}}async function x(){v.value=!0;try{const t={enabled:s.enabled,provider:s.provider,api_base:s.api_base,model:s.model,max_tokens:s.max_tokens,rate_limit:s.rate_limit};s.api_key&&s.api_key!=="***"&&(t.api_key=s.api_key);const y=await A.updateAiSettings(t);alert(y.message||"设置已保存"),await o()}catch(t){console.error("Save failed:",t),alert((t==null?void 0:t.message)||"保存失败")}finally{v.value=!1}}return V(()=>o()),{status:n,form:s,saving:v,loadError:e,features:c,backendLabel:b,saveSettings:x}}},N={class:"aksrt-page-container"},j={key:0,class:"aksrt-ai__form-card aksrt-ai__load-error",role:"alert"},B={class:"aksrt-ai__status"},M={class:"aksrt-ai__status-card"},R={class:"aksrt-ai__status-info"},F={class:"aksrt-ai__status-value"},H={class:"aksrt-ai__status-card"},T={class:"aksrt-ai__status-info"},D={class:"aksrt-ai__status-value"},K={class:"aksrt-ai__status-card"},z={class:"aksrt-ai__status-info"},X={class:"aksrt-ai__status-value"},Y={class:"aksrt-ai__status-card"},Z={class:"aksrt-ai__status-info"},q={class:"aksrt-ai__status-value"},G={class:"aksrt-ai__form-card"},J={class:"aksrt-form-group"},Q={class:"aksrt-form-group"},h={key:0,class:"aksrt-form-group"},$={key:1,class:"aksrt-form-group"},ss={key:2,class:"aksrt-form-group"},as={key:3,class:"aksrt-form-group"},ts={key:4,class:"aksrt-form-group"},es={class:"aksrt-form-actions"},os=["disabled"],ls={class:"aksrt-ai__form-card"},is={class:"aksrt-table aksrt-table--sm"};function rs(n,s,v,e,b,c){const p=O("PageHeader");return r(),l("div",N,[I(p,{title:"AI 连接配置",desc:"配置 AI 生成能力的连接方式。优先使用 WordPress AI Connectors;也可填写 OpenAI 兼容接口。SEO 生成入口在文章「独立 SEO」框,摘要/标签入口在前台投稿页。"}),e.loadError?(r(),l("div",j,[s[8]||(s[8]=a("strong",null,"加载失败:",-1)),d(i(e.loadError),1)])):m("",!0),a("div",B,[a("div",M,[a("div",{class:k(["aksrt-ai__status-icon",e.status.available?"aksrt-ai__status-icon--ok":"aksrt-ai__status-icon--off"])},[...s[9]||(s[9]=[a("i",{class:"fas fa-robot"},null,-1)])],2),a("div",R,[s[10]||(s[10]=a("div",{class:"aksrt-ai__status-label"},"可用状态",-1)),a("div",F,i(e.status.available?"可用":"不可用"),1)])]),a("div",H,[a("div",{class:k(["aksrt-ai__status-icon",e.status.wp_ai_available?"aksrt-ai__status-icon--ok":"aksrt-ai__status-icon--warn"])},[...s[11]||(s[11]=[a("i",{class:"fas fa-plug"},null,-1)])],2),a("div",T,[s[12]||(s[12]=a("div",{class:"aksrt-ai__status-label"},"WP AI Client",-1)),a("div",D,i(e.status.wp_ai_available?"已就绪":"不可用"),1)])]),a("div",K,[a("div",{class:k(["aksrt-ai__status-icon",e.status.theme_available?"aksrt-ai__status-icon--ok":"aksrt-ai__status-icon--warn"])},[...s[13]||(s[13]=[a("i",{class:"fas fa-key"},null,-1)])],2),a("div",z,[s[14]||(s[14]=a("div",{class:"aksrt-ai__status-label"},"主题 Provider",-1)),a("div",X,i(e.status.theme_available?"已配置":"未配置"),1)])]),a("div",Y,[s[16]||(s[16]=a("div",{class:"aksrt-ai__status-icon aksrt-ai__status-icon--info"},[a("i",{class:"fas fa-route"})],-1)),a("div",Z,[s[15]||(s[15]=a("div",{class:"aksrt-ai__status-label"},"当前后端",-1)),a("div",q,i(e.backendLabel),1)])])]),a("div",G,[s[27]||(s[27]=a("h3",null,"主题 Provider 配置(回退链路)",-1)),s[28]||(s[28]=a("p",{class:"aksrt-form-hint"},[d("已配置主题 Provider 时优先走下方接口;未配置时才尝试 WordPress AI Connectors。NewAPI/兼容网关请填到 "),a("code",null,"/v1"),d("(也可只填域名,保存时会自动补全)。")],-1)),a("div",J,[a("label",null,[_(a("input",{type:"checkbox","onUpdate:modelValue":s[0]||(s[0]=o=>e.form.enabled=o)},null,512),[[P,e.form.enabled]]),s[17]||(s[17]=d(" 启用主题 AI Provider ",-1))])]),a("div",Q,[s[19]||(s[19]=a("label",null,"AI Provider",-1)),_(a("select",{"onUpdate:modelValue":s[1]||(s[1]=o=>e.form.provider=o),class:"aksrt-select"},[...s[18]||(s[18]=[a("option",{value:"none"},"不使用",-1),a("option",{value:"openai"},"OpenAI 兼容接口",-1)])],512),[[w,e.form.provider]])]),e.form.provider!=="none"?(r(),l("div",h,[s[20]||(s[20]=a("label",null,"API Key",-1)),_(a("input",{"onUpdate:modelValue":s[2]||(s[2]=o=>e.form.api_key=o),type:"password",class:"aksrt-input",placeholder:"sk-..."},null,512),[[u,e.form.api_key]]),s[21]||(s[21]=a("p",{class:"aksrt-form-hint"},"保存后不会回显完整密钥",-1))])):m("",!0),e.form.provider==="openai"?(r(),l("div",$,[s[22]||(s[22]=a("label",null,"API Base URL",-1)),_(a("input",{"onUpdate:modelValue":s[3]||(s[3]=o=>e.form.api_base=o),type:"text",class:"aksrt-input",placeholder:"https://llm.example.com/v1"},null,512),[[u,e.form.api_base]]),s[23]||(s[23]=a("p",{class:"aksrt-form-hint"},"示例:https://api.openai.com/v1 或 https://你的网关/v1(不要填到 /chat/completions)",-1))])):m("",!0),e.form.provider!=="none"?(r(),l("div",ss,[s[24]||(s[24]=a("label",null,"模型",-1)),_(a("input",{"onUpdate:modelValue":s[4]||(s[4]=o=>e.form.model=o),type:"text",class:"aksrt-input",placeholder:"gpt-3.5-turbo"},null,512),[[u,e.form.model]])])):m("",!0),e.form.provider!=="none"?(r(),l("div",as,[s[25]||(s[25]=a("label",null,"最大 Token 数",-1)),_(a("input",{"onUpdate:modelValue":s[5]||(s[5]=o=>e.form.max_tokens=o),type:"number",min:"100",max:"4000",class:"aksrt-input"},null,512),[[u,e.form.max_tokens,void 0,{number:!0}]])])):m("",!0),e.form.provider!=="none"?(r(),l("div",ts,[s[26]||(s[26]=a("label",null,"每分钟请求限制",-1)),_(a("input",{"onUpdate:modelValue":s[6]||(s[6]=o=>e.form.rate_limit=o),type:"number",min:"1",max:"100",class:"aksrt-input"},null,512),[[u,e.form.rate_limit,void 0,{number:!0}]])])):m("",!0),a("div",es,[a("button",{class:"aksrt-button aksrt-button--primary",disabled:e.saving,onClick:s[7]||(s[7]=(...o)=>e.saveSettings&&e.saveSettings(...o))},i(e.saving?"保存中...":"保存设置"),9,os)])]),a("div",ls,[s[30]||(s[30]=a("h3",null,"已接通能力",-1)),a("table",is,[s[29]||(s[29]=a("thead",null,[a("tr",null,[a("th",null,"能力"),a("th",null,"入口"),a("th",null,"状态")])],-1)),a("tbody",null,[(r(!0),l(S,null,E(e.features,o=>(r(),l("tr",{key:o.key},[a("td",null,i(o.name),1),a("td",null,i(o.scene),1),a("td",null,[a("span",{class:k(["aksrt-badge",o.ready?"aksrt-badge--success":"aksrt-badge--warning"])},i(o.ready?"可用":"未就绪"),3)])]))),128))])]),s[31]||(s[31]=a("p",{class:"aksrt-form-hint"},"SEO 开关与提示词请到「全局 → SEO」配置(seo_ai_enabled / ai_seo_*_prompt)。",-1))]),s[32]||(s[32]=a("div",{class:"aksrt-ai__form-card aksrt-ai__notice"},[a("h3",null,[a("i",{class:"fas fa-exclamation-triangle"}),d(" 重要说明")]),a("ul",null,[a("li",null,[d("AI 输出仅作为"),a("strong",null,"建议"),d(",不会自动写库;需用户点「更新/提交」才保存")]),a("li",null,"主题 API Key 已配置时优先使用;否则回退 WordPress AI Connectors"),a("li",null,"生成接口要求登录与编辑/投稿权限;配置接口仍需管理员")])],-1))])}const ks=L(W,[["render",rs],["__scopeId","data-v-800595b0"]]);export{ks as default};
|