assets/admin/build was gitignored, so servers deployed by git pull kept running a stale admin bundle — the icon picker integration in the tabbar and floating-button settings pages never reached them. Track the build directory (rebuild with: cd assets/admin && npm run build) and commit the current bundle containing the universal icon picker.
2 lines
8.8 KiB
JavaScript
2 lines
8.8 KiB
JavaScript
import{X as l,a4 as I,Y as s,f as d,Z as i,a5 as m,L as k,j as _,ag as P,aj as w,ah 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.BxZIRU0_.js";import{P as U}from"./PageHeader.CtT29f8Y.js";import{a as A}from"./shared-api.DnsQ5cxS.js";import{_ as L}from"./index.js";import"./vendor-naive.CKYCZmXD.js";import"./vendor-misc.bELTaXdf.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}),a=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},a.enabled=!!t.enabled,a.provider=t.provider||"none",a.model=t.model||"gpt-3.5-turbo",a.rate_limit=t.rate_limit||10,t.api_base&&(a.api_base=t.api_base),typeof t.max_tokens=="number"&&t.max_tokens>0&&(a.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:a.enabled,provider:a.provider,api_base:a.api_base,model:a.model,max_tokens:a.max_tokens,rate_limit:a.rate_limit};a.api_key&&a.api_key!=="***"&&(t.api_key=a.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:a,saving:v,loadError:e,features:c,backendLabel:b,saveSettings:x}}},j={class:"aksrt-page-container"},N={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"},aa={key:2,class:"aksrt-form-group"},sa={key:3,class:"aksrt-form-group"},ta={key:4,class:"aksrt-form-group"},ea={class:"aksrt-form-actions"},oa=["disabled"],la={class:"aksrt-ai__form-card"},ia={class:"aksrt-table aksrt-table--sm"};function ra(n,a,v,e,b,c){const p=O("PageHeader");return r(),l("div",j,[I(p,{title:"AI 连接配置",desc:"配置 AI 生成能力的连接方式。优先使用 WordPress AI Connectors;也可填写 OpenAI 兼容接口。SEO 生成入口在文章「独立 SEO」框,摘要/标签入口在前台投稿页。"}),e.loadError?(r(),l("div",N,[a[8]||(a[8]=s("strong",null,"加载失败:",-1)),d(i(e.loadError),1)])):m("",!0),s("div",B,[s("div",M,[s("div",{class:k(["aksrt-ai__status-icon",e.status.available?"aksrt-ai__status-icon--ok":"aksrt-ai__status-icon--off"])},[...a[9]||(a[9]=[s("i",{class:"fa fab fa-android"},null,-1)])],2),s("div",R,[a[10]||(a[10]=s("div",{class:"aksrt-ai__status-label"},"可用状态",-1)),s("div",F,i(e.status.available?"可用":"不可用"),1)])]),s("div",H,[s("div",{class:k(["aksrt-ai__status-icon",e.status.wp_ai_available?"aksrt-ai__status-icon--ok":"aksrt-ai__status-icon--warn"])},[...a[11]||(a[11]=[s("i",{class:"fa fas fa-plug"},null,-1)])],2),s("div",T,[a[12]||(a[12]=s("div",{class:"aksrt-ai__status-label"},"WP AI Client",-1)),s("div",D,i(e.status.wp_ai_available?"已就绪":"不可用"),1)])]),s("div",K,[s("div",{class:k(["aksrt-ai__status-icon",e.status.theme_available?"aksrt-ai__status-icon--ok":"aksrt-ai__status-icon--warn"])},[...a[13]||(a[13]=[s("i",{class:"fa fas fa-key"},null,-1)])],2),s("div",z,[a[14]||(a[14]=s("div",{class:"aksrt-ai__status-label"},"主题 Provider",-1)),s("div",X,i(e.status.theme_available?"已配置":"未配置"),1)])]),s("div",Y,[a[16]||(a[16]=s("div",{class:"aksrt-ai__status-icon aksrt-ai__status-icon--info"},[s("i",{class:"fa fas fa-road"})],-1)),s("div",Z,[a[15]||(a[15]=s("div",{class:"aksrt-ai__status-label"},"当前后端",-1)),s("div",q,i(e.backendLabel),1)])])]),s("div",G,[a[27]||(a[27]=s("h3",null,"主题 Provider 配置(回退链路)",-1)),a[28]||(a[28]=s("p",{class:"aksrt-form-hint"},[d("已配置主题 Provider 时优先走下方接口;未配置时才尝试 WordPress AI Connectors。NewAPI/兼容网关请填到 "),s("code",null,"/v1"),d("(也可只填域名,保存时会自动补全)。")],-1)),s("div",J,[s("label",null,[_(s("input",{type:"checkbox","onUpdate:modelValue":a[0]||(a[0]=o=>e.form.enabled=o)},null,512),[[P,e.form.enabled]]),a[17]||(a[17]=d(" 启用主题 AI Provider ",-1))])]),s("div",Q,[a[19]||(a[19]=s("label",null,"AI Provider",-1)),_(s("select",{"onUpdate:modelValue":a[1]||(a[1]=o=>e.form.provider=o),class:"aksrt-select"},[...a[18]||(a[18]=[s("option",{value:"none"},"不使用",-1),s("option",{value:"openai"},"OpenAI 兼容接口",-1)])],512),[[w,e.form.provider]])]),e.form.provider!=="none"?(r(),l("div",h,[a[20]||(a[20]=s("label",null,"API Key",-1)),_(s("input",{"onUpdate:modelValue":a[2]||(a[2]=o=>e.form.api_key=o),type:"password",class:"aksrt-input",placeholder:"sk-..."},null,512),[[u,e.form.api_key]]),a[21]||(a[21]=s("p",{class:"aksrt-form-hint"},"保存后不会回显完整密钥",-1))])):m("",!0),e.form.provider==="openai"?(r(),l("div",$,[a[22]||(a[22]=s("label",null,"API Base URL",-1)),_(s("input",{"onUpdate:modelValue":a[3]||(a[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]]),a[23]||(a[23]=s("p",{class:"aksrt-form-hint"},"示例:https://api.openai.com/v1 或 https://你的网关/v1(不要填到 /chat/completions)",-1))])):m("",!0),e.form.provider!=="none"?(r(),l("div",aa,[a[24]||(a[24]=s("label",null,"模型",-1)),_(s("input",{"onUpdate:modelValue":a[4]||(a[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",sa,[a[25]||(a[25]=s("label",null,"最大 Token 数",-1)),_(s("input",{"onUpdate:modelValue":a[5]||(a[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",ta,[a[26]||(a[26]=s("label",null,"每分钟请求限制",-1)),_(s("input",{"onUpdate:modelValue":a[6]||(a[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),s("div",ea,[s("button",{class:"aksrt-button aksrt-button--primary",disabled:e.saving,onClick:a[7]||(a[7]=(...o)=>e.saveSettings&&e.saveSettings(...o))},i(e.saving?"保存中...":"保存设置"),9,oa)])]),s("div",la,[a[30]||(a[30]=s("h3",null,"已接通能力",-1)),s("table",ia,[a[29]||(a[29]=s("thead",null,[s("tr",null,[s("th",null,"能力"),s("th",null,"入口"),s("th",null,"状态")])],-1)),s("tbody",null,[(r(!0),l(S,null,E(e.features,o=>(r(),l("tr",{key:o.key},[s("td",null,i(o.name),1),s("td",null,i(o.scene),1),s("td",null,[s("span",{class:k(["aksrt-badge",o.ready?"aksrt-badge--success":"aksrt-badge--warning"])},i(o.ready?"可用":"未就绪"),3)])]))),128))])]),a[31]||(a[31]=s("p",{class:"aksrt-form-hint"},"SEO 开关与提示词请到「全局 → SEO」配置(seo_ai_enabled / ai_seo_*_prompt)。",-1))]),a[32]||(a[32]=s("div",{class:"aksrt-ai__form-card aksrt-ai__notice"},[s("h3",null,[s("i",{class:"fa fas fa-exclamation-triangle"}),d(" 重要说明")]),s("ul",null,[s("li",null,[d("AI 输出仅作为"),s("strong",null,"建议"),d(",不会自动写库;需用户点「更新/提交」才保存")]),s("li",null,"主题 API Key 已配置时优先使用;否则回退 WordPress AI Connectors"),s("li",null,"生成接口要求登录与编辑/投稿权限;配置接口仍需管理员")])],-1))])}const ka=L(W,[["render",ra],["__scopeId","data-v-290bff3b"]]);export{ka as default};
|