343 lines
44 KiB
JavaScript
343 lines
44 KiB
JavaScript
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{Ci as t,bn as n,er as r}from"./control-ui-foundation-CeFMP1Ly.js";import{Es as i,S as a,Ys as o,bc as s,f as c,fl as l,fs as u,ks as d,ml as f,ms as p,ps as m,qs as ee,u as te,vr as ne,w as h,yr as re}from"./control-ui-core-pH6nakZ-.js";import{G as g,J as _,W as v,Z as ie,at as ae,rt as y}from"./lit-runtime-BEtFSUCp.js";import{Cn as oe,Jt as se,Ut as ce,ln as le,m as ue,p as de}from"./control-ui-core-DGVkFhVB.js";import{Ht as b,qt as x}from"./control-ui-core-Br5DB0Zj.js";import{F as fe,I as pe,In as me,L as he,Ln as ge,N as _e,P as S}from"./control-ui-boot-wpHCbPL9.js";import{a as ve,r as ye}from"./gateway-runtime-DUNO4Mi1.js";import{Cn as be,Gs as xe,Kl as Se,Ws as Ce,Yl as we,bn as C,cn as Te,dn as w,fn as Ee,gn as T,hn as De,ln as E,mn as D,on as O,ql as k,qs as Oe,un as A,v as ke,vn as j,y as Ae,yn as M}from"./control-ui-boot-Cdpgu1Gm.js";import{a as je,i as Me}from"./control-ui-boot-CKTkvwFZ.js";import{c as Ne,l as Pe}from"./control-ui-boot-BPFwXC8p.js";import{t as Fe}from"./web-awesome-popover-DTDr8XNA.js";import{n as Ie,t as Le}from"./settings-workspace-Bo4nqRhI.js";import{n as Re,t as ze}from"./gateway-page-controller-bzyUg03c.js";import{n as N,t as Be}from"./model-picker-CTfQ10Hi.js";import{n as Ve,t as He}from"./agent-scope-control-C6P46hJO.js";import{a as Ue,i as We,n as P,r as Ge,t as Ke}from"./load-Bj0HzefF.js";import{a as qe,i as Je,n as Ye,r as Xe}from"./usage-D9bQwLsK.js";function F(e){return u(e,x(`modelProviders.requestFailed`))}async function Ze(e,t){let{agentEpoch:n,runtimeConfig:r}=e;e.setBusy(!0),e.setMessage(null);try{if(await r.ensureLoaded(),!e.isCurrentClient())return{ok:!1};let i=await r.patch({raw:t.raw,note:t.note,...t.replacePaths?{replacePaths:t.replacePaths}:{}});if(!e.isCurrentClient())return{ok:!1};if(!i)return e.isCurrentAgent()&&e.setMessage({kind:`error`,text:r.state.lastError??x(`modelProviders.configUnavailable`)}),{ok:!1};let a=null;try{await r.refresh(),a=r.state.lastError,!a&&e.isCurrentClient()&&await e.refreshProviders()}catch(e){a=F(e)}return e.isCurrentClient()?(e.isCurrentAgent()&&e.setMessage({kind:`success`,text:t.success,...a?{warning:a}:{}}),{ok:!0,agentEpoch:n,warning:a}):{ok:!1}}catch(t){return e.isCurrentClient()&&e.isCurrentAgent()&&e.setMessage({kind:`error`,text:F(t)}),{ok:!1}}finally{e.isCurrentClient()&&e.isCurrentAgent()&&e.setBusy(!1)}}function I(){return(I=e((()=>{b(),p()})))()}function L(e){return Ce(e)}function Qe(e){switch(e.status){case`ok`:case`expiring`:case`expired`:case`missing`:return e.status;default:return`api-key`}}function R(e,t){return e.find(e=>t.some(t=>e.ids.has(t)))}function z(e,t,n){let r=R(e,[t]);if(r)return r;let i={ids:new Set([t]),card:{id:t,displayName:n,profiles:[],credentialProviderIds:[],logoutTargets:[],hasConfigApiKey:!1,modelCount:0,availableModelCount:0},hasAuthRow:!1,hasUsageSnapshot:!1};return e.push(i),i}function $e(e,t){let n=S(t);n&&!e.some(e=>S(e)===n)&&e.push(t)}function et(e,t,n){if(n.length===0)return;let r=S(t),i=e.find(e=>S(e.provider)===r);if(!i){e.push({provider:t,profileIds:[...new Set(n)]});return}i.profileIds=[...new Set([...i.profileIds,...n])]}function tt(e){let t=[],n=new Map;for(let t of e.authStatus?.providerCapabilities??[]){let e=L(t.provider);e&&n.set(e,n.get(e)===!0||t.apiKeySupported)}for(let n of e.configProviderIds??[]){let e=L(n);e&&(z(t,e,k(e)).card.configKey??=n)}for(let n of e.configApiKeyProviderIds??[]){let e=L(n);if(e){let r=z(t,e,k(e)).card;r.configKey=n,r.hasConfigApiKey=!0,$e(r.credentialProviderIds,n)}}for(let[n,r]of Object.entries(e.configProviderAuthModes??{})){let e=L(n);e&&(z(t,e,k(e)).card.configAuthMode=r)}let r=[`auth-rejected`,`unavailable`,`ready`];for(let n of e.providerOutcomes??[]){let e=L(n.provider);if(!e)continue;let i=z(t,e,k(e)).card;(!i.catalogStatus||r.indexOf(n.status)<r.indexOf(i.catalogStatus))&&(i.catalogStatus=n.status)}for(let n of e.models??[]){let e=L(n.provider);if(!e)continue;let r=z(t,e,k(e));r.card.modelCount+=1,n.available===!0&&(r.card.availableModelCount+=1)}for(let n of e.authStatus?.providers??[]){let e=L(n.provider);if(!e)continue;let r=n.usage?L(n.usage.providerId):e,i=[...new Set([e,r])],a=R(t,i)??z(t,r,k(r));for(let e of i)a.ids.add(e);a.card.displayName=n.displayName||a.card.displayName,a.card.profiles.push(...n.profiles),(n.apiKey||n.profiles.length>0)&&$e(a.card.credentialProviderIds,n.provider),et(a.card.logoutTargets,n.provider,n.profiles.filter(e=>e.logoutSupported===!0).map(e=>e.profileId)),a.card.apiKey??=n.apiKey,a.hasAuthRow=!0;let o=n.usage;o&&!a.card.usage&&(a.card.usage={provider:o.providerId,displayName:n.displayName,windows:o.windows,...o.summary?{summary:o.summary}:{},...o.plan?{plan:o.plan}:{},...o.billing?.length?{billing:o.billing}:{}})}for(let n of Oe(e.authStatus?.providers??[])){let e=R(t,[L(n.provider)]);e&&(e.card.auth={kind:Qe(n),profileCount:n.profiles.length,...n.expiry?.label?{expiryLabel:n.expiry.label}:{}})}for(let n of e.providerUsage?.providers??[]){let e=L(n.provider);if(!e)continue;let r=R(t,[e])??z(t,e,n.displayName||k(e));r.ids.add(e),r.card.usage=n,r.hasUsageSnapshot=!0}for(let n of e.costByProvider??[]){let e=L(n.provider??``);if(!e)continue;let r=R(t,[e])??z(t,e,k(e)),i={totalCost:n.totals.totalCost,totalTokens:n.totals.totalTokens,sessionCount:n.count},a=r.card.localCost;r.card.localCost=a?{totalCost:a.totalCost+i.totalCost,totalTokens:a.totalTokens+i.totalTokens,sessionCount:a.sessionCount+i.sessionCount}:i}return t.filter(t=>t.hasAuthRow||(e.configProviderIds??[]).some(e=>L(e)===t.card.id)||t.hasUsageSnapshot||!!t.card.usage||t.card.modelCount>0||!!t.card.catalogStatus||(t.card.localCost?.totalTokens??0)>0).map(e=>{let t=n.get(e.card.id);return Object.assign({},e.card,t===void 0?{}:{apiKeySupported:t})}).toSorted((e,t)=>e.displayName.localeCompare(t.displayName))}function B(e){return e.selectionRef===void 0?e.id.startsWith(`${e.provider}/`)?e.id:`${e.provider}/${e.id}`:e.selectionRef}function nt(e,t){let n=new Set([t.primary,...t.fallbacks,t.utilityModel].filter(e=>typeof e==`string`&&e.length>0)),r=(e??[]).filter(e=>e.available!==!1||n.has(B(e))),i=new Set(r.map(B)),a=e===null?{}:{available:!1};for(let t of n){if(i.has(t))continue;let n=t.indexOf(`/`);if(n<=0||n===t.length-1){let n=t.trim().toLowerCase(),i=(e??[]).find(e=>e.alias?.trim().toLowerCase()===n||e.id.trim()===t.trim());r.push({...i??{provider:``,id:t,name:t,...a},selectionRef:t});continue}r.push({provider:t.slice(0,n),id:t.slice(n+1),name:t,...a})}return r}function rt(e){let t=n(e?.models),r=n(t?.providers),i=n(e?.agents),a=n(i?.defaults),o=a?.model,s=n(o),c=typeof o==`string`?o:typeof s?.primary==`string`?s.primary:``,l=Array.isArray(s?.fallbacks)?s.fallbacks.filter(e=>typeof e==`string`):[];return{providerIds:Object.keys(r??{}),apiKeyProviderIds:Object.entries(r??{}).filter(([,e])=>{let t=n(e);return t?Object.hasOwn(t,`apiKey`)&&t.apiKey!=null:!1}).map(([e])=>e),providerAuthModes:Object.fromEntries(Object.entries(r??{}).flatMap(([e,t])=>{let r=n(t)?.auth;return typeof r==`string`?[[e,r]]:[]})),defaults:{primary:c,fallbacks:l,utilityModel:typeof a?.utilityModel==`string`?a.utilityModel:null}}}function it(e,t){let n=new Set(Array.from(t,L)),r=new Map;for(let t of e??[]){let e=L(t.provider);t.quickApiKeySetup&&e&&!n.has(e)&&!r.has(e)&&r.set(e,{id:e,displayName:k(e)})}return[...r.values()].toSorted((e,t)=>e.displayName.localeCompare(t.displayName))}function V(){return(V=e((()=>{_e(),Se(),xe()})))()}function at(e){let t=e?.thinkingDefault,n=e?.fastModeDefault;return{thinkingLevel:typeof t==`string`?t:void 0,thinkingOverridden:e!==null&&Object.hasOwn(e,`thinkingDefault`),fastMode:n===`auto`||typeof n==`boolean`?n:void 0,fastModeOverridden:e!==null&&Object.hasOwn(e,`fastModeDefault`)}}function H(e,t){return{models:{providers:{[e]:{apiKey:t}}}}}function ot(e,t,n){return{agents:{defaults:{model:t.length>0?{primary:e,fallbacks:[...t]}:e,utilityModel:n}}}}var st;function ct(){return(ct=e((()=>{st=[`agents.defaults.model.fallbacks`]})))()}function lt(e){return/method (?:not found|not supported)|unknown method/iu.test(F(e))}function ut(e,t){if(t.length===1)return t[0];let n=t.some(e=>e.status===`ok`)?`ok`:dt.find(e=>t.some(t=>t.status===e))??`unknown`,r=t.find(e=>e.status===n)?.error;return{provider:e,status:n,...r?{error:r}:{},results:t.flatMap(e=>e.results.map(t=>({...t,label:`${e.provider}: ${t.label}`})))}}var dt;function ft(){return(ft=e((()=>{I(),dt=[`auth`,`billing`,`rate_limit`,`timeout`,`format`,`no_model`,`unknown`]})))()}var pt;function mt(){return(mt=e((()=>{fe(),P(),pt=class{constructor(e,t){this.options=t,this.pending=new Set,this.usageTask=this.createTask(e,`usage`,We,e=>({providerUsage:e}),(e,t)=>this.options.refreshPolicy.markProviderUsage(e,Date.now(),t)),this.costTask=this.createTask(e,`cost`,Ge,e=>({costByProvider:e}))}get loading(){return this.pending.size>0}get usageLoading(){return this.pending.has(`usage`)}adoptCoreData(e,t){let n=e===this.options.getDataClient()?this.options.getData():null;this.options.setData({...t,providerUsage:n?.providerUsage??t.providerUsage,costByProvider:n?.costByProvider??t.costByProvider}),this.options.setDataClient(e),t.providerUsage!==null&&this.options.refreshPolicy.markProviderUsage(t.providerUsage,t.updatedAt,this.options.getGateway().epoch),e&&!this.loading&&t.providerUsage===null&&t.costByProvider===null&&this.load(e)}invalidate(){this.options.refreshPolicy.interrupt(),this.cancelGeneration()}beginCoreRefresh(e){this.cancelGeneration(),e&&this.options.refreshPolicy.resetPayload()}cancelGeneration(){this.pending.clear();let e=this.options.getGateway().epoch;this.usageTask.run([null,e]),this.costTask.run([null,e])}load(e){return this.loadRequests(e,!0)}loadUsage(){return this.loadRequests(void 0,!1)}async loadRequests(e,t){let n=this.options.getGateway(),r=e??n.client;if(!n.connected||!r){this.options.refreshPolicy.markLoadDeferred();return}this.options.refreshPolicy.beginLoad(),this.pending.add(`usage`);let i=this.usageTask.run([r,n.epoch]);if(!t){await i;return}this.pending.add(`cost`),await Promise.all([i,this.costTask.run([r,n.epoch])])}createTask(e,t,n,r,i){return new pe(e,{autoRun:!1,task:([e,t],{signal:r})=>e?n(e,r).then(n=>({client:e,data:n,epoch:t})):he,onComplete:({client:e,data:n,epoch:a})=>{this.pending.delete(t);let o=this.options.getData();o&&e===this.options.getDataClient()&&this.options.getGateway().isCurrent({client:e,epoch:a})&&(this.options.setData({...o,...r(n)}),i?.(n,a)),this.options.refreshPolicy.flushPending()},onError:()=>{this.pending.delete(t),this.options.refreshPolicy.flushPending()}})}}})))()}function U(e){let t=new Set,n=[];for(let r of e){let e=B(r);t.has(e)||(t.add(e),n.push({value:e,label:r.name||e,...r.provider?{provider:r.provider}:{}}))}return n.toSorted((e,t)=>e.label.localeCompare(t.label))}function ht(e){let t=e.currentTarget;e.key!==`Escape`||!t.open||(e.preventDefault(),t.addEventListener(`wa-after-hide`,()=>document.getElementById(K)?.focus({preventScroll:!0}),{once:!0}))}function gt(e){let t=!e.canMutate||e.models.length===0,n=!!e.busy.defaults,r=e.mutationBlockedReason??``,i=_`
|
|
<div class="settings-row settings-row--stacked model-providers__defaults">
|
|
${e.models.length===0?_`<div class="callout warning">${x(`modelProviders.defaults.noModels`)}</div>`:g}
|
|
<div class="model-providers__default-grid">
|
|
<label class="field">
|
|
<span>${x(`modelProviders.defaults.primary`)}</span>
|
|
${N({label:x(`modelProviders.defaults.primary`),value:e.selection.primary,options:[{value:``,label:x(`modelProviders.defaults.selectModel`),disabled:!!e.selection.primary},...U(e.models)],disabled:t||n,title:r,onChange:e.onPrimaryChange})}
|
|
</label>
|
|
<div class="field">
|
|
<span class="model-providers__utility-label">
|
|
<label for=${G}>${x(`modelProviders.defaults.utility`)}</label>
|
|
<span class="settings-section__docs">
|
|
${Ee({id:K,label:x(`modelProviders.defaults.utilityHelpLabel`),tooltip:x(`modelProviders.defaults.utilityHelpPurpose`),icon:`info`,popoverId:q})}
|
|
<wa-popover
|
|
id=${q}
|
|
class="settings-section__help-popover model-providers__utility-help-popover"
|
|
for=${K}
|
|
placement="top"
|
|
@keydown=${ht}
|
|
>
|
|
<div class="settings-section__help-panel">
|
|
<p>${x(`modelProviders.defaults.utilityHelpPurpose`)}</p>
|
|
<p>${x(`modelProviders.defaults.utilityHelpAutomatic`)}</p>
|
|
</div>
|
|
</wa-popover>
|
|
</span>
|
|
</span>
|
|
${N({id:G,label:x(`modelProviders.defaults.utility`),value:e.selection.utilityModel??W,options:[{value:W,label:x(`modelProviders.defaults.automatic`)},{value:``,label:x(`modelProviders.defaults.disabled`)},...U(e.models)],disabled:t||n,title:r,onChange:t=>e.onUtilityChange(t===W?null:t)})}
|
|
</div>
|
|
</div>
|
|
<div class="model-providers__fallbacks">
|
|
<div class="model-providers__fallback-heading">
|
|
<span>${x(`modelProviders.defaults.fallbacks`)}</span>
|
|
${n?_`<span class="muted">${x(`modelProviders.saving`)}</span>`:g}
|
|
</div>
|
|
${e.selection.fallbacks.length===0?_`<div class="card-sub">${x(`modelProviders.defaults.noFallbacks`)}</div>`:e.selection.fallbacks.map((i,a)=>_`
|
|
<div class="model-providers__fallback-row">
|
|
<code>${i}</code>
|
|
<button
|
|
class="btn btn--sm"
|
|
?disabled=${t||n}
|
|
title=${r}
|
|
@click=${()=>e.onFallbackRemove(a)}
|
|
>
|
|
${x(`common.remove`)}
|
|
</button>
|
|
</div>
|
|
`)}
|
|
<label class="field model-providers__fallback-add">
|
|
<span>${x(`modelProviders.defaults.addFallback`)}</span>
|
|
${N({label:x(`modelProviders.defaults.addFallback`),value:``,options:[{value:``,label:x(`modelProviders.defaults.selectFallback`)},...U(e.models.filter(t=>{let n=B(t);return n!==e.selection.primary&&!e.selection.fallbacks.includes(n)}))],disabled:t||n||!e.selection.primary,title:r,onChange:t=>{t&&e.onFallbackAdd(t)}})}
|
|
</label>
|
|
</div>
|
|
${e.message?_`<div
|
|
class="callout ${e.message.kind}"
|
|
role=${e.message.kind===`error`?`alert`:`status`}
|
|
>
|
|
${e.message.text}
|
|
</div>`:g}
|
|
${e.message?.warning?_`<div class="callout warning" role="status">${e.message.warning}</div>`:g}
|
|
</div>
|
|
`;return j({title:x(`modelProviders.defaults.title`),description:x(`modelProviders.defaults.subtitle`),actions:_`
|
|
<div class="model-providers__form-actions">
|
|
${e.dirty?_`<span class="muted">${x(`modelProviders.defaults.unsaved`)}</span>`:g}
|
|
<button class="btn btn--sm" ?disabled=${n||!e.dirty} @click=${e.onReset}>
|
|
${x(`common.cancel`)}
|
|
</button>
|
|
<button
|
|
class="btn primary btn--sm"
|
|
?disabled=${t||n||!e.dirty||!e.selection.primary}
|
|
title=${r}
|
|
@click=${e.onSave}
|
|
>
|
|
${x(n?`modelProviders.saving`:`common.save`)}
|
|
</button>
|
|
</div>
|
|
`},i)}var W,G,K,q;function _t(){return(_t=e((()=>{v(),Be(),O(),Fe(),b(),V(),W=`__openclaw_automatic_utility__`,G=`model-providers-utility-model`,K=`model-providers-utility-help`,q=`model-providers-utility-help-popover`})))()}function vt(e){let t=e.auth;if(!t)return g;let n=x(xt[t.kind]),r=t.expiryLabel?x(`modelProviders.expiresIn`,{time:t.expiryLabel}):void 0;return _`
|
|
<span title=${r??n}>
|
|
${C({kind:St[t.kind],label:n})}
|
|
</span>
|
|
`}function yt(e){return e.hasConfigApiKey||!!e.apiKey||e.profiles.length>0}function J(e){return e.catalogStatus===`ready`&&e.auth?.kind!==`expired`&&e.auth?.kind!==`missing`&&e.auth?.kind!==`expiring`}function bt(e){return e.auth?.kind===`expired`||e.auth?.kind===`missing`||e.auth?.kind===`expiring`?vt(e):e.catalogStatus===`auth-rejected`?C({kind:`danger`,label:x(`modelProviders.status.denied`)}):e.catalogStatus===`unavailable`?C({kind:`warn`,label:x(`common.failed`)}):yt(e)?J(e)&&e.availableModelCount>0?C({kind:`ok`,label:x(`modelProviders.status.ready`)}):J(e)?C({kind:`muted`,label:x(`modelProviders.status.ok`)}):C({kind:`muted`,label:x(`modelProviders.status.configured`)}):vt(e)}var xt,St;function Y(){return(Y=e((()=>{v(),O(),b(),xt={ok:`modelProviders.status.ok`,expiring:`modelProviders.status.expiring`,expired:`modelProviders.status.expired`,missing:`modelProviders.status.missing`,"api-key":`modelProviders.status.apiKey`},St={ok:`ok`,expiring:`warn`,expired:`danger`,missing:`danger`,"api-key":`muted`}})))()}function Ct(e){return e===`auto`?`auto`:e===`on`}function X(e){return!e.canMutate||e.configBusy}function wt(e){return e?_`
|
|
<div class="callout ${e.kind}" role=${e.kind===`error`?`alert`:`status`}>
|
|
${e.text}
|
|
</div>
|
|
${e.warning?_`<div class="callout warning" role="status">${e.warning}</div>`:g}
|
|
`:g}function Tt(e){let t=e.thinkingLevel&&!Q.has(e.thinkingLevel)?[...Z,e.thinkingLevel]:Z,n=e.fastMode===void 0?``:Ne(e.fastMode);return _`
|
|
<div id=${i.behavior}>
|
|
${j({title:x(`quickSettings.model.title`)},[T({title:x(`quickSettings.model.thinking`),description:E(x(`quickSettings.model.modelPolicy`),e.thinkingOverridden),control:M({value:e.thinkingLevel??``,options:[{value:``,label:x(`quickSettings.model.default`)},...t.map(e=>({value:e,label:Q.has(e)?x(`quickSettings.model.thinkingLevels.${e}`):ke(e)}))],disabled:e.configBusy,onChange:(t,n)=>t===``?e.onThinkingReset():e.onThinkingChange(t,n)})}),T({title:x(`quickSettings.model.fastMode`),description:E(x(`quickSettings.model.modelPolicy`),e.fastModeOverridden),control:M({value:n,options:[{value:``,label:x(`quickSettings.model.default`)},{value:`auto`,label:x(`quickSettings.model.fastModes.auto`)},{value:`on`,label:x(`quickSettings.model.fastModes.fast`)},{value:`off`,label:x(`quickSettings.model.fastModes.standard`)}],disabled:e.configBusy,onChange:t=>{t===``?e.onFastModeReset():t!==n&&e.onFastModeChange(Ct(t))}})})])}
|
|
</div>
|
|
`}function Et(e){return e.modelCount===0?null:e.availableModelCount<e.modelCount?x(`modelProviders.modelsAvailable`,{available:String(e.availableModelCount),count:String(e.modelCount)}):e.modelCount===1?x(`modelProviders.modelOne`):x(`modelProviders.models`,{count:String(e.modelCount)})}function Dt(e,t){let n=e.localCost;return!n||n.totalTokens===0&&n.totalCost===0?g:_`
|
|
<div class="model-providers__local-cost">
|
|
<div class="provider-usage-billing-row">
|
|
<span>${x(`modelProviders.localCost`,{days:String(t)})}</span>
|
|
<strong>${c(n.totalCost)}</strong>
|
|
</div>
|
|
<div class="model-providers__local-cost-detail">
|
|
${x(`modelProviders.localCostDetail`,{tokens:te(n.totalTokens),sessions:String(n.sessionCount)})}
|
|
</div>
|
|
</div>
|
|
`}function Ot(e,t){let n=e.profiles.filter(e=>e.type===`oauth`).length,r=e.profiles.filter(e=>e.type===`token`).length,i=e.profiles.filter(e=>e.type===`api_key`).length,a=[];return n>0&&a.push(x(`modelProviders.credentials.oauth`,{count:String(n)})),r>0&&a.push(x(`modelProviders.credentials.tokenProfiles`,{count:String(r)})),e.apiKey?.source===`config`?a.push(x(`modelProviders.credentials.configKey`)):e.apiKey?.source===`env`?a.push(e.apiKey.envVar?x(`modelProviders.credentials.envKeyNamed`,{name:e.apiKey.envVar}):x(`modelProviders.credentials.envKey`)):i>0&&a.push(x(`modelProviders.credentials.profileKey`,{count:String(i)})),_`
|
|
<div class="model-providers__credentials">
|
|
<span>${x(`modelProviders.credentials.label`,{agent:t})}</span>
|
|
<strong
|
|
>${a.length>0?a.join(` · `):x(`modelProviders.credentials.none`)}</strong
|
|
>
|
|
</div>
|
|
`}function kt(e){if(!e)return g;let t=e.status===`ok`&&e.results.some(e=>e.status!==`ok`),n=t?`warning`:e.status===`ok`?`success`:`error`;return _`
|
|
<div class="model-providers__probe model-providers__probe--${n}" role="status">
|
|
<div class="model-providers__probe-summary">
|
|
<strong
|
|
>${x(t?`modelProviders.probe.status.partial`:`modelProviders.probe.status.${e.status}`)}</strong
|
|
>
|
|
${e.latencyMs===void 0?g:_`<span
|
|
>${x(`modelProviders.probe.latency`,{ms:String(e.latencyMs)})}</span
|
|
>`}
|
|
</div>
|
|
${e.error?_`<div>${m(e.error)}</div>`:g}
|
|
${e.results.map(e=>_`
|
|
<div class="model-providers__probe-target">
|
|
<span>${e.label}</span>
|
|
<span>
|
|
${x(`modelProviders.probe.status.${e.status}`)}${e.latencyMs===void 0?``:` · ${x(`modelProviders.probe.latency`,{ms:String(e.latencyMs)})}`}
|
|
</span>
|
|
${e.error?_`<small>${m(e.error)}</small>`:g}
|
|
</div>
|
|
`)}
|
|
</div>
|
|
`}function At(e,t){if(t.keyEditorProvider!==e.id)return g;let n=!!t.busy[`key:${e.id}`],r=e.apiKeySupported===!1||!!(e.configAuthMode&&e.configAuthMode!==`api-key`),i=X(t);return _`
|
|
<div class="model-providers__inline-form">
|
|
<label class="field">
|
|
<span>${x(`modelProviders.apiKey.label`)}</span>
|
|
<input
|
|
type="password"
|
|
autocomplete="off"
|
|
placeholder=${e.apiKey?.source===`config`?x(`modelProviders.apiKey.replacePlaceholder`):x(`modelProviders.apiKey.placeholder`)}
|
|
.value=${t.keyDraft}
|
|
?disabled=${n||i||r}
|
|
@input=${e=>t.onKeyDraftChange(e.target.value)}
|
|
/>
|
|
</label>
|
|
<div class="model-providers__form-actions">
|
|
<button
|
|
class="btn primary btn--sm"
|
|
?disabled=${n||i||r||!t.keyDraft.trim()}
|
|
@click=${()=>t.onSaveKey(e.id,e.configKey??e.id)}
|
|
>
|
|
${x(n?`modelProviders.saving`:`common.save`)}
|
|
</button>
|
|
<button class="btn btn--sm" ?disabled=${n} @click=${()=>t.onCloseKeyEditor()}>
|
|
${x(`common.cancel`)}
|
|
</button>
|
|
</div>
|
|
</div>
|
|
`}function jt(e,t){let n=e.credentialProviderIds.length?e.credentialProviderIds:[e.id],r=e.hasConfigApiKey||!!e.apiKey||e.profiles.length>0,i=e.logoutTargets.length>0,a=!!t.busy[`probe:${e.id}`],o=!!t.busy[`key:${e.id}`],s=!!t.busy[`logout:${e.id}`],c=t.mutationBlockedReason??``,l=!!(e.configAuthMode&&e.configAuthMode!==`api-key`),u=e.apiKeySupported===!1,d=X(t),f=l?x(`modelProviders.apiKey.authModeBlocked`,{mode:e.configAuthMode??``}):c;return _`
|
|
<div class="model-providers__card-actions">
|
|
${r?_`
|
|
<button
|
|
class="btn btn--sm"
|
|
?disabled=${a||!t.canMutate||!t.probeAvailable}
|
|
title=${t.probeAvailable?c:x(`modelProviders.probe.unavailable`)}
|
|
@click=${()=>t.onProbe(e.id,n)}
|
|
>
|
|
${x(a?`modelProviders.probe.testing`:`modelProviders.probe.test`)}
|
|
</button>
|
|
`:g}
|
|
${u?g:_`
|
|
<button
|
|
class="btn btn--sm"
|
|
?disabled=${o||d||l}
|
|
title=${f}
|
|
@click=${()=>t.onOpenKeyEditor(e.id)}
|
|
>
|
|
${e.hasConfigApiKey?x(`modelProviders.apiKey.replace`):x(`modelProviders.apiKey.set`)}
|
|
</button>
|
|
`}
|
|
${e.hasConfigApiKey?_`
|
|
<button
|
|
class="btn btn--sm danger"
|
|
?disabled=${o||d||l}
|
|
title=${f}
|
|
@click=${()=>t.onRemoveKey(e.id,e.configKey??e.id)}
|
|
>
|
|
${x(`modelProviders.apiKey.remove`)}
|
|
</button>
|
|
`:g}
|
|
${i?_`
|
|
<button
|
|
class="btn btn--sm"
|
|
?disabled=${s||d}
|
|
title=${c}
|
|
@click=${()=>t.onRequestLogout(e.id)}
|
|
>
|
|
${x(`modelProviders.logout.action`)}
|
|
</button>
|
|
`:g}
|
|
</div>
|
|
${t.pendingLogoutProvider===e.id?_`
|
|
<div class="model-providers__confirm" role="alert">
|
|
<span>${x(`modelProviders.logout.confirm`,{provider:e.displayName})}</span>
|
|
<div class="model-providers__form-actions">
|
|
<button
|
|
class="btn danger btn--sm"
|
|
?disabled=${s||d}
|
|
@click=${()=>t.onLogout(e.id,e.logoutTargets)}
|
|
>
|
|
${x(s?`modelProviders.logout.loggingOut`:`modelProviders.logout.action`)}
|
|
</button>
|
|
<button class="btn btn--sm" ?disabled=${s} @click=${t.onCancelLogout}>
|
|
${x(`common.cancel`)}
|
|
</button>
|
|
</div>
|
|
</div>
|
|
`:g}
|
|
`}function Mt(e,t){let n=Et(e),r=t.messages[`key:${e.id}`]??t.messages[e.id];return _`
|
|
<div
|
|
class="settings-row settings-row--stacked model-providers__row"
|
|
data-provider-id=${e.id}
|
|
>
|
|
<div class="model-providers__head">
|
|
<div class="model-providers__identity">
|
|
${we(e.id,{className:`model-providers__icon`})}
|
|
<div class="settings-row__text">
|
|
<span class="settings-row__title">${e.displayName}</span>
|
|
<span class="settings-row__desc"
|
|
>${e.id}${n?_` · ${n}`:g}</span
|
|
>
|
|
</div>
|
|
</div>
|
|
<div class="settings-row__control">
|
|
${e.usage?.plan?be(e.usage.plan):g}
|
|
${bt(e)}
|
|
</div>
|
|
</div>
|
|
${Ot(e,t.credentialAgentLabel)}
|
|
<div
|
|
class="model-providers__global-metrics"
|
|
aria-busy=${t.supplementalLoading?`true`:`false`}
|
|
>
|
|
<div class="model-providers__global-metrics-title">${x(`modelProviders.globalUsage`)}</div>
|
|
${e.usage?Xe(e.usage):_`<div class="model-providers__no-stats">
|
|
${x(t.supplementalLoading?`common.loading`:`modelProviders.noStats`)}
|
|
</div>`}
|
|
${Dt(e,t.costDays)}
|
|
</div>
|
|
${jt(e,t)} ${At(e,t)}
|
|
${kt(t.probeResults[e.id])} ${wt(r)}
|
|
</div>
|
|
`}function Nt(e){let t=!!e.busy.add,n=X(e)||t,r=_`
|
|
${e.unconfiguredProviders.length===0?A(x(`modelProviders.add.none`)):g}
|
|
${e.addProviderOpen?_`
|
|
<div class="settings-row settings-row--stacked">
|
|
<div class="model-providers__add-form">
|
|
<label class="field">
|
|
<span>${x(`modelProviders.add.provider`)}</span>
|
|
<select
|
|
class="settings-select"
|
|
.value=${e.addProviderId}
|
|
?disabled=${n}
|
|
@change=${t=>e.onAddProviderIdChange(t.target.value)}
|
|
>
|
|
<option value="">${x(`modelProviders.add.selectProvider`)}</option>
|
|
${e.unconfiguredProviders.map(e=>_`<option value=${e.id}>${e.displayName}</option>`)}
|
|
</select>
|
|
</label>
|
|
<label class="field">
|
|
<span>${x(`modelProviders.apiKey.label`)}</span>
|
|
<input
|
|
type="password"
|
|
autocomplete="off"
|
|
placeholder=${x(`modelProviders.apiKey.placeholder`)}
|
|
.value=${e.addProviderKey}
|
|
?disabled=${n}
|
|
@input=${t=>e.onAddProviderKeyChange(t.target.value)}
|
|
/>
|
|
</label>
|
|
<button
|
|
class="btn primary"
|
|
?disabled=${n||!e.addProviderId||!e.addProviderKey.trim()}
|
|
@click=${e.onAddProvider}
|
|
>
|
|
${e.busy.add?x(`modelProviders.saving`):x(`modelProviders.add.save`)}
|
|
</button>
|
|
</div>
|
|
${wt(e.messages.add)}
|
|
</div>
|
|
`:g}
|
|
`;return j({title:x(`modelProviders.add.title`),description:x(`modelProviders.add.subtitle`),actions:_`
|
|
<button
|
|
class="btn btn--sm"
|
|
?disabled=${t||!e.addProviderOpen&&(X(e)||e.unconfiguredProviders.length===0)}
|
|
title=${e.mutationBlockedReason??``}
|
|
@click=${e.onAddProviderToggle}
|
|
>
|
|
${e.addProviderOpen?x(`common.cancel`):x(`modelProviders.add.action`)}
|
|
</button>
|
|
`},r)}function Pt(e){let t=e.cards.some(J);return _`
|
|
<div class="model-providers__setup" data-model-readiness="model-required">
|
|
${j({title:x(`modelProviders.readiness.title`)},T({title:x(`modelProviders.readiness.heading`),description:x(t?`modelProviders.readiness.signedInNoModels`:`modelProviders.readiness.notConfigured`),control:_`
|
|
${C({kind:`warn`,label:x(t?`modelProviders.readiness.noModels`:`modelProviders.readiness.modelRequired`)})}
|
|
<button class="btn primary" @click=${e.onOpenModelSetup}>
|
|
${x(t?`modelProviders.readiness.chooseProvider`:`modelSetup.heading`)}
|
|
</button>
|
|
`}))}
|
|
</div>
|
|
`}function Ft(e){return _`
|
|
<div class="settings-row">
|
|
<div class="settings-row__text">
|
|
<span class="settings-row__desc provider-usage-error">${e}</span>
|
|
</div>
|
|
</div>
|
|
`}function It(e){if(!e.connected)return D(w(A(x(`modelProviders.disconnected`))));if(e.loading)return D(_`
|
|
${Tt(e)}
|
|
<div aria-busy="true">${w(A(x(`common.loading`)))}</div>
|
|
`);let t=_`
|
|
${e.error?Ft(e.error):g}
|
|
${e.providerUsageFailed?Ft(x(`usage.providerUsage.unavailable`)):g}
|
|
${e.cards.length===0?A(_`<strong>${x(`modelProviders.emptyTitle`)}</strong><br />${x(`modelProviders.emptySubtitle`)}`):e.cards.map(t=>Mt(t,e))}
|
|
`,n=!e.configuredModels.some(e=>e.available!==!1);return D(_`
|
|
${n?Pt(e):gt({models:e.configuredModels,selection:e.defaultModels,dirty:e.defaultModelsDirty,canMutate:!X(e),mutationBlockedReason:e.mutationBlockedReason,busy:e.busy,message:e.messages.defaults,onPrimaryChange:e.onPrimaryChange,onFallbackAdd:e.onFallbackAdd,onFallbackRemove:e.onFallbackRemove,onUtilityChange:e.onUtilityChange,onSave:e.onDefaultModelsSave,onReset:e.onDefaultModelsReset})}
|
|
${Tt(e)}
|
|
${j({title:x(`modelProviders.title`),description:e.updatedAt?x(`modelProviders.updated`,{time:a(e.updatedAt)}):x(`modelProviders.subtitle`),count:e.cards.length,actions:_`
|
|
<button
|
|
class="btn btn--sm"
|
|
?disabled=${e.refreshing}
|
|
@click=${()=>e.onRefresh()}
|
|
>
|
|
${e.refreshing?x(`modelProviders.refreshing`):x(`common.refresh`)}
|
|
</button>
|
|
`},t)}
|
|
${e.quickAddSupported?Nt(e):g}
|
|
${e.providerUsageStalled?_`<div class="callout warning" role="status">${x(`usage.providerUsage.stalled`)}</div>`:g}
|
|
${e.mutationBlockedReason?_`<div class="callout warning">${e.mutationBlockedReason}</div>`:g}
|
|
`)}var Z,Q;function Lt(){return(Lt=e((()=>{v(),je(),Pe(),Se(),Ye(),O(),b(),Ae(),p(),h(),d(),_t(),Y(),Z=Me.filter(e=>e!==`minimal`),Q=new Set(Z)})))()}var Rt,$;function zt(){return(zt=e((()=>{ge(),fe(),v(),ie(),le(),ue(),se(),He(),O(),Le(),b(),ee(),ye(),s(),Re(),f(),re(),qe(),I(),V(),P(),ct(),ft(),mt(),Lt(),Rt=`https://docs.openclaw.ai/concepts/model-providers`,$=class extends l{constructor(...e){super(...e),this.data=null,this.busy={},this.messages={},this.probeResults={},this.probeUnsupported=!1,this.keyEditorProvider=null,this.keyDraft=``,this.pendingLogoutProvider=null,this.addProviderOpen=!1,this.addProviderId=``,this.addProviderKey=``,this.defaultsDraft=null,this.selectedAgentId=``,this.dataClient=null,this.loadClient=null,this.routeDataObserved=!1,this.agentEpoch=0,this.probeEpochs=new Map,this.refreshTask=new pe(this,{autoRun:!1,task:([e,t,n],{signal:r})=>!e||!t?he:Ue(e,{agentId:t,...n?{refresh:!0}:{},signal:r}).then(t=>({client:e,data:t})),onComplete:({client:e,data:t})=>{this.loadClient=null,this.adoptLoadedData(e,t)},onError:()=>{this.loadClient=null}}),this.refreshPolicy=new Je({isLoading:()=>this.loadClient!==null||this.supplemental.usageLoading,reload:()=>this.supplemental.loadUsage(),onIncompleteUsageExhausted:()=>this.requestUpdate()}),this.supplemental=new pt(this,{getGateway:()=>this.gateway,getData:()=>this.data,getDataClient:()=>this.dataClient,setData:e=>this.data=e,setDataClient:e=>this.dataClient=e,refreshPolicy:this.refreshPolicy}),this.gateway=new ze(this,{getGateway:()=>this.context?.gateway,onIdentityChange:()=>this.resetConnectionState(),invalidateRequests:()=>this.invalidateRequests(),ensureInitialData:()=>this.ensureInitialData(),onSnapshot:e=>{e.initial?this.resetConnectionState():e.connectionChanged&&!e.identityChanged&&this.resetConnectionState({preserveVisibleData:!0}),e.becameConnected&&!e.initial&&this.refresh({force:!1})},onPageActivation:()=>this.refreshPolicy.request(`focus`)}),this.subscriptions=new ne(this).watch(()=>this.context?.runtimeConfig,(e,t)=>e.subscribe(t),e=>{!e.state.configSnapshot&&!e.state.configLoading&&e.ensureLoaded().catch(()=>void 0)}).watch(()=>this.context?.overlays,(e,t)=>e.subscribe(t)).watch(()=>this.context?.agents,(e,t)=>e.subscribe(t),()=>this.syncSelectedAgent()).effect(()=>this.context?.agentSelection,e=>e.subscribe(()=>this.syncSelectedAgent()))}disconnectedCallback(){this.subscriptions.clear(),this.refreshPolicy.dispose(),super.disconnectedCallback()}willUpdate(e){if(e.has(`routeData`)&&this.routeData!==void 0){this.routeDataObserved=!0;let e=this.resolveSelectedAgentId();this.setSelectedAgent(e),(this.routeData.agentId??``)===e&&this.gateway.isRouteDataCurrent(this.routeData)?this.adoptLoadedData(this.routeData.client,this.routeData.data):(this.data=null,this.dataClient=null,this.refreshPolicy.resetPayload()),this.ensureInitialData()}}ensureInitialData(){if(!this.context.agents.state.agentsList&&!this.context.agents.state.agentsLoading&&!this.context.agents.state.agentsError&&this.context.agents.ensureList(),!this.routeDataObserved&&this.routeData!==void 0)return;let e=this.gateway.client;!this.gateway.connected||!e||!this.selectedAgentId||this.loadClient!==null||this.data!==null&&this.data.updatedAt!==null&&e===this.dataClient||this.refresh({force:!1})}adoptLoadedData(e,t){this.supplemental.adoptCoreData(e,t)}invalidateRequests(){this.loadClient=null,this.refreshTask.run([null,this.selectedAgentId,!1]),this.supplemental.invalidate()}resetConnectionState(e={}){e.preserveVisibleData||(this.data=null,this.dataClient=null),this.refreshPolicy.resetPayload(),this.resetAgentScopeState(),this.probeEpochs=new Map,this.probeUnsupported=!1,this.defaultsDraft=null}resetAgentScopeState(){this.busy={},this.messages={},this.probeResults={},this.closeKeyEditor(),this.pendingLogoutProvider=null,this.addProviderOpen=!1,this.addProviderId=``,this.addProviderKey=``}isCurrentClient(e,t){return this.gateway.isCurrent({client:e,epoch:t})}resolveSelectedAgentId(){let e=this.context.agentSelection.state.selectedId;return e?t(e):``}setSelectedAgent(e){return e!==this.selectedAgentId&&(this.selectedAgentId=e,this.agentEpoch+=1,this.resetAgentScopeState(),!0)}syncSelectedAgent(){let e=this.resolveSelectedAgentId();this.setSelectedAgent(e)&&(this.invalidateRequests(),this.data=null,this.dataClient=null,this.refreshPolicy.resetPayload(),this.requestUpdate(),this.ensureInitialData())}refresh(e){if(!this.selectedAgentId)return Promise.resolve();let t=this.gateway.client;return!this.gateway.connected||!t?(this.refreshPolicy.markLoadDeferred(),Promise.resolve()):(this.supplemental.beginCoreRefresh(e.force),this.loadClient=t,this.refreshTask.run([t,this.selectedAgentId,e.force]))}mutationBlockedReason(){let e=this.context.gateway.snapshot;return e.phase===`connected`?ce(e.hello?.auth??null)?!e.client||!this.selectedAgentId||!this.data?.config?x(`modelProviders.configUnavailable`):null:x(`modelProviders.readOnly.adminRequired`):x(`modelProviders.readOnly.disconnected`)}canMutate(){return this.mutationBlockedReason()===null&&!this.configBusy()}configBusy(){let e=this.context.runtimeConfig.state,t=this.context.overlays.snapshot;return e.configLoading||e.configSaving||e.configApplying||t.updateRunning||t.updateReconciliationPending}setBusy(e,t){let n={...this.busy};t?n[e]=!0:delete n[e],this.busy=n}setMessage(e,t){let n={...this.messages};t?n[e]=t:delete n[e],this.messages=n}clearProbe(e){this.probeEpochs.set(e,(this.probeEpochs.get(e)??0)+1),this.setBusy(`probe:${e}`,!1);let t={...this.probeResults};delete t[e],this.probeResults=t}async patchConfig(e){if(!this.canMutate()||this.busy[e.key])return{ok:!1};let t=this.context.gateway.snapshot.client;if(!t)return{ok:!1};let n=this.gateway.epoch,r=this.agentEpoch;return Ze({runtimeConfig:this.context.runtimeConfig,agentEpoch:r,isCurrentClient:()=>this.isCurrentClient(t,n),isCurrentAgent:()=>this.agentEpoch===r,refreshProviders:()=>this.refresh({force:!0}),setBusy:t=>this.setBusy(e.key,t),setMessage:t=>this.setMessage(e.key,t)},e)}openKeyEditor(e){this.keyEditorProvider=e,this.keyDraft=``,this.setMessage(e,null)}closeKeyEditor(){this.keyEditorProvider=null,this.keyDraft=``}async saveKey(e,t){let n=this.keyDraft.trim();if(!n)return;this.clearProbe(e),this.setMessage(e,null),this.setMessage(`key:${e}`,null);let r=await this.patchConfig({key:`key:${e}`,raw:H(t,n),note:x(`modelProviders.notes.saveKey`,{provider:e}),success:x(`modelProviders.apiKey.saved`)});r.ok&&this.agentEpoch===r.agentEpoch&&(this.setMessage(`key:${e}`,null),this.keyEditorProvider===e&&this.keyDraft.trim()===n&&this.closeKeyEditor(),this.setMessage(e,{kind:`success`,text:x(`modelProviders.apiKey.saved`),...r.warning?{warning:r.warning}:{}}))}async removeKey(e,t){this.clearProbe(e),this.setMessage(e,null),this.setMessage(`key:${e}`,null);let n=await this.patchConfig({key:`key:${e}`,raw:H(t,null),note:x(`modelProviders.notes.removeKey`,{provider:e}),success:x(`modelProviders.apiKey.removed`)});n.ok&&this.agentEpoch===n.agentEpoch&&(this.setMessage(`key:${e}`,null),this.keyEditorProvider===e&&this.closeKeyEditor(),this.setMessage(e,{kind:`success`,text:x(`modelProviders.apiKey.removed`),...n.warning?{warning:n.warning}:{}}))}async probe(e,t){let n=this.context.gateway.snapshot.client,r=`probe:${e}`;if(!n||!this.canMutate()||this.busy[r]||this.probeUnsupported)return;let i=this.gateway.epoch,a=this.selectedAgentId,o=this.agentEpoch,s=(this.probeEpochs.get(e)??0)+1;this.probeEpochs.set(e,s);let c=()=>this.isCurrentClient(n,i)&&this.agentEpoch===o&&this.selectedAgentId===a&&this.probeEpochs.get(e)===s;this.setBusy(r,!0),this.setMessage(e,null);try{let r=[];for(let e of t){if(!c())return;r.push(await n.request(`models.probe`,{provider:e,agentId:a}))}c()&&(this.probeResults={...this.probeResults,[e]:ut(e,r)})}catch(t){if(!c())return;lt(t)?(this.probeUnsupported=!0,this.setMessage(e,{kind:`error`,text:x(`modelProviders.probe.unavailable`)})):this.setMessage(e,{kind:`error`,text:F(t)})}finally{c()&&this.setBusy(r,!1)}}async logout(e,t){let n=this.context.gateway.snapshot.client,r=`logout:${e}`;if(!n||!this.canMutate()||this.busy[r])return;let i=this.gateway.epoch,a=this.selectedAgentId,o=this.agentEpoch;this.clearProbe(e),this.setBusy(r,!0),this.setMessage(e,null);try{let r;for(let e of t){if(!this.isCurrentClient(n,i)||this.agentEpoch!==o)return;try{await n.request(`models.authLogout`,{...e,agentId:a})}catch(e){r??=e}}if(!this.isCurrentClient(n,i)||this.agentEpoch!==o||(await this.refresh({force:!0}),!this.isCurrentClient(n,i)||this.agentEpoch!==o))return;if(r){this.setMessage(e,{kind:`error`,text:F(r)});return}this.pendingLogoutProvider=null,this.setMessage(e,{kind:`success`,text:x(`modelProviders.logout.done`)})}catch(t){this.isCurrentClient(n,i)&&this.agentEpoch===o&&this.setMessage(e,{kind:`error`,text:F(t)})}finally{this.isCurrentClient(n,i)&&this.agentEpoch===o&&this.setBusy(r,!1)}}async addProvider(){let e=this.addProviderId,t=this.addProviderKey.trim();if(!e||!t)return;let n=await this.patchConfig({key:`add`,raw:H(e,t),note:x(`modelProviders.notes.addProvider`,{provider:e}),success:x(`modelProviders.add.saved`,{provider:e})});n.ok&&this.agentEpoch===n.agentEpoch&&(this.addProviderId===e&&this.addProviderKey.trim()===t&&(this.addProviderOpen=!!n.warning,n.warning||(this.addProviderId=``),this.addProviderKey=``),this.setMessage(e,{kind:`success`,text:x(`modelProviders.add.saved`,{provider:e}),...n.warning?{warning:n.warning}:{}}))}async saveDefaultModels(){let e=this.defaultsDraft;if(!e?.primary)return;let t=await this.patchConfig({key:`defaults`,raw:ot(e.primary,e.fallbacks,e.utilityModel),note:x(`modelProviders.notes.defaultModel`),success:x(`modelProviders.defaults.saved`),replacePaths:st});t.ok&&!t.warning&&this.agentEpoch===t.agentEpoch&&this.defaultsDraft===e&&(this.defaultsDraft=null)}render(){let e=this.context.gateway.snapshot,r=this.context.agents.state,i=r.agentsList?.agents??[],a=r.agentsList?null:r.agentsError,s=i.find(e=>t(e.id)===this.selectedAgentId),c=s?o(s):this.selectedAgentId,l=this.data??Ke,u=rt(l.config),d=this.defaultsDraft??u.defaults,f=this.context.runtimeConfig,p=f.state,m=n(p.configForm??p.configSnapshot?.config)??n(l.config)??{},ee=at(n(n(m.agents)?.defaults)),te=tt({...l,providerUsage:l.providerUsage?.ok?l.providerUsage.value:null,configProviderIds:u.providerIds,configApiKeyProviderIds:u.apiKeyProviderIds,configProviderAuthModes:u.providerAuthModes}),ne=new Set([...u.providerIds,...l.authStatus?.providers.filter(e=>!!e.apiKey||e.profiles.length>0).map(e=>e.provider)??[]]),h=ve(e,`models.probe`),re=It({connected:e.phase===`connected`,loading:e.phase===`connected`&&this.data===null&&!a,refreshing:this.loadClient!==null,error:a??l.error??l.catalogError,providerUsageFailed:l.providerUsage?.ok===!1,supplementalLoading:this.supplemental.loading,updatedAt:l.updatedAt,costDays:30,credentialAgentLabel:c,cards:te,configuredModels:nt(l.models,d),defaultModels:d,defaultModelsDirty:this.defaultsDraft!==null,...ee,configBusy:this.configBusy(),quickAddSupported:l.authStatus?.providerCapabilities!==void 0,unconfiguredProviders:it(l.authStatus?.providerCapabilities,ne),canMutate:this.canMutate(),mutationBlockedReason:this.mutationBlockedReason(),providerUsageStalled:this.refreshPolicy.incompleteUsageExhausted,probeAvailable:!this.probeUnsupported&&h!==!1,busy:this.busy,messages:this.messages,probeResults:this.probeResults,keyEditorProvider:this.keyEditorProvider,keyDraft:this.keyDraft,pendingLogoutProvider:this.pendingLogoutProvider,addProviderOpen:this.addProviderOpen,addProviderId:this.addProviderId,addProviderKey:this.addProviderKey,onRefresh:()=>void(a?this.context.agents.refreshList():this.refresh({force:!0})),onOpenKeyEditor:e=>this.openKeyEditor(e),onCloseKeyEditor:()=>this.closeKeyEditor(),onKeyDraftChange:e=>this.keyDraft=e,onSaveKey:(e,t)=>void this.saveKey(e,t),onRemoveKey:(e,t)=>void this.removeKey(e,t),onProbe:(e,t)=>void this.probe(e,t),onRequestLogout:e=>this.pendingLogoutProvider=e,onCancelLogout:()=>this.pendingLogoutProvider=null,onLogout:(e,t)=>void this.logout(e,t),onAddProviderToggle:()=>{this.addProviderOpen=!this.addProviderOpen,this.addProviderKey=``,this.setMessage(`add`,null)},onAddProviderIdChange:e=>this.addProviderId=e,onAddProviderKeyChange:e=>this.addProviderKey=e,onAddProvider:()=>void this.addProvider(),onPrimaryChange:e=>{this.defaultsDraft={...d,primary:e,fallbacks:d.fallbacks.filter(t=>t!==e)},this.setMessage(`defaults`,null)},onFallbackAdd:e=>{this.defaultsDraft={...d,fallbacks:[...d.fallbacks,e]},this.setMessage(`defaults`,null)},onFallbackRemove:e=>{this.defaultsDraft={...d,fallbacks:d.fallbacks.filter((t,n)=>n!==e)},this.setMessage(`defaults`,null)},onUtilityChange:e=>{this.defaultsDraft={...d,utilityModel:e},this.setMessage(`defaults`,null)},onDefaultModelsSave:()=>void this.saveDefaultModels(),onDefaultModelsReset:()=>{this.defaultsDraft=null,this.setMessage(`defaults`,null)},onThinkingChange:e=>f.patchForm([`agents`,`defaults`,`thinkingDefault`],e),onThinkingReset:()=>f.removeFormValue([`agents`,`defaults`,`thinkingDefault`]),onFastModeChange:e=>f.patchForm([`agents`,`defaults`,`fastModeDefault`],e),onFastModeReset:()=>f.removeFormValue([`agents`,`defaults`,`fastModeDefault`]),onOpenModelSetup:()=>this.context.navigate(`model-setup`)});return _`
|
|
${De({title:oe(`model-providers`),subtitle:_`${x(`modelProviders.subtitle`)}
|
|
${Te(Rt)}`,actions:_`
|
|
${Ve({agents:i,selection:this.context.agentSelection,allowAll:!1,selectedId:this.selectedAgentId})}
|
|
<button class="btn" @click=${()=>this.context.navigate(`model-setup`)}>
|
|
${x(`tabs.modelSetup`)}
|
|
</button>
|
|
`})}
|
|
${Ie(re)}
|
|
`}},r([me({context:de,subscribe:!0})],$.prototype,`context`,void 0),r([ae({attribute:!1})],$.prototype,`routeData`,void 0),r([y()],$.prototype,`data`,void 0),r([y()],$.prototype,`busy`,void 0),r([y()],$.prototype,`messages`,void 0),r([y()],$.prototype,`probeResults`,void 0),r([y()],$.prototype,`probeUnsupported`,void 0),r([y()],$.prototype,`keyEditorProvider`,void 0),r([y()],$.prototype,`keyDraft`,void 0),r([y()],$.prototype,`pendingLogoutProvider`,void 0),r([y()],$.prototype,`addProviderOpen`,void 0),r([y()],$.prototype,`addProviderId`,void 0),r([y()],$.prototype,`addProviderKey`,void 0),r([y()],$.prototype,`defaultsDraft`,void 0),r([y()],$.prototype,`selectedAgentId`,void 0),customElements.get(`openclaw-model-providers-page`)||customElements.define(`openclaw-model-providers-page`,$)})))()}zt();
|
|
//# sourceMappingURL=model-providers-page-CWpIZmie.js.map
|