openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
333 lines • 45.8 kB
JavaScript
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{Ii as t,R as n,Vn as r,wr as i,z as a}from"./control-ui-foundation-Cydpkyqa.js";import{As as o,Bn as s,Bo as c,Do as l,E as u,Eo as d,Oo as f,Sc as p,Uo as m,bc as h,cs as ee,g as te,k as ne,m as re,os as g,zn as ie}from"./control-ui-core-Rwzhj6nO.js";import{$ as ae,K as _,X as v,at as y,q as b,st as oe}from"./lit-runtime-CV_MH99K.js";import{_ as se,_n as ce,g as le,jn as ue}from"./control-ui-core-YphAl4aM.js";import{Gt as x,Wt as S,Yt as C,en as w}from"./control-ui-core-vvcQQV2m.js";import{B as de,L as fe,R as T,V as pe,d as me,f as he,z as ge}from"./control-ui-boot-shared-BYq7Cchl.js";import{a as _e,r as ve}from"./gateway-runtime-Bqqcp9-I.js";import{Ca as E,H as ye,Sa as be,Ta as xe,U as Se}from"./control-ui-boot-shared-DfZ39Yj9.js";import{H as D,J as O,K as k,L as A,Q as j,V as M,W as Ce,X as N,Z as P,q as we,tt as Te,z as Ee}from"./control-ui-boot-chat-_QSl8fbH.js";import{Cs as De,Is as Oe,Ls as ke,Ss as Ae,bs as je,xs as Me}from"./control-ui-boot-shared-CXVvK2AW.js";import{n as Ne,t as Pe}from"./en-settings-D_ebb5Hk.js";import{a as Fe,i as Ie}from"./control-ui-boot-shared-Deak_Sjt.js";import{n as Le,t as Re}from"./settings-workspace-Bseic8Tf.js";import{n as F,t as ze}from"./model-picker-CB45-l8O.js";import{n as Be,t as Ve}from"./agent-scope-control-6x2VZZ2e.js";import{a as He,i as Ue,n as I,r as We,t as Ge}from"./load-Bbhf1Rrb.js";import{a as Ke,i as qe,n as Je,r as Ye}from"./usage-BoX28Uwf.js";function L(e){return d(e,w(`modelProviders.requestFailed`))}async function Xe(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??w(`modelProviders.configUnavailable`)}),{ok:!1};let a=null;try{await r.refresh(),a=r.state.lastError,!a&&e.isCurrentClient()&&await e.refreshProviders()}catch(e){a=L(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:L(t)}),{ok:!1}}finally{e.isCurrentClient()&&e.isCurrentAgent()&&e.setBusy(!1)}}function R(){return(R=e((()=>{C(),f()})))()}function z(e){return je(e)}function Ze(e){switch(e.status){case`ok`:case`expiring`:case`expired`:case`missing`:return e.status;default:return`api-key`}}function B(e,t){return e.find(e=>t.some(t=>e.ids.has(t)))}function V(e,t,n){let r=B(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},hasModelAuth:!1};return e.push(i),i}function Qe(e,t){let n=T(t);n&&!e.some(e=>T(e)===n)&&e.push(t)}function $e(e,t,n){if(n.length===0)return;let r=T(t),i=e.find(e=>T(e.provider)===r);if(!i){e.push({provider:t,profileIds:[...new Set(n)]});return}i.profileIds=[...new Set([...i.profileIds,...n])]}function et(e){let t=[],n=new Map;for(let t of e.authStatus?.providerCapabilities??[]){let e=z(t.provider);e&&n.set(e,n.get(e)===!0||t.apiKeySupported)}for(let n of e.configProviderIds??[]){let e=z(n);e&&(V(t,e,E(e)).card.configKey??=n)}for(let n of e.configApiKeyProviderIds??[]){let e=z(n);if(e){let r=V(t,e,E(e)).card;r.configKey=n,r.hasConfigApiKey=!0,Qe(r.credentialProviderIds,n)}}for(let[n,r]of Object.entries(e.configProviderAuthModes??{})){let e=z(n);e&&(V(t,e,E(e)).card.configAuthMode=r)}for(let n of e.providerOutcomes??[]){let e=z(n.provider);if(!e)continue;let r=V(t,e,E(e)),i=r.catalogOutcome,a=n.profileId===void 0,o=it[a?`provider`:`profile`];(!i||(a===(i.profileId===void 0)?o.indexOf(n.status)<o.indexOf(i.status):a))&&(r.catalogOutcome=n)}for(let n of e.models??[]){let e=z(n.provider);if(!e)continue;let r=V(t,e,E(e));r.card.modelCount+=1,n.available===!0&&(r.card.availableModelCount+=1)}for(let r of e.authStatus?.providers??[]){let e=z(r.provider);if(!e)continue;let i=r.usage?z(r.usage.providerId):e,a=[...new Set([e,i])],o=B(t,a)??V(t,i,E(i));for(let e of a)o.ids.add(e);o.card.displayName=r.displayName||o.card.displayName,o.card.profiles.push(...r.profiles),(r.apiKey||r.profiles.length>0)&&Qe(o.card.credentialProviderIds,r.provider),$e(o.card.logoutTargets,r.provider,r.profiles.filter(e=>e.logoutSupported===!0).map(e=>e.profileId)),o.card.apiKey??=r.apiKey,o.hasModelAuth||=Ae(r)||n.has(e);let s=r.usage;s&&!o.card.usage&&(o.card.usage={provider:s.providerId,displayName:r.displayName,windows:s.windows,...s.summary?{summary:s.summary}:{},...s.plan?{plan:s.plan}:{},...s.billing?.length?{billing:s.billing}:{}})}for(let n of De(e.authStatus?.providers??[])){let e=B(t,[z(n.provider)]);e&&(e.card.auth={kind:Ze(n),profileCount:n.profiles.length,...n.expiry?.label?{expiryLabel:n.expiry.label}:{}})}for(let n of e.providerUsage?.providers??[]){let e=z(n.provider);if(!e)continue;let r=B(t,[e])??V(t,e,n.displayName||E(e));r.ids.add(e),r.card.usage=n}for(let n of e.costByProvider??[]){let e=z(n.provider??``);if(!e)continue;let r=B(t,[e])??V(t,e,E(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.hasModelAuth||(e.configProviderIds??[]).some(e=>z(e)===t.card.id)||!!t.card.usage||t.card.modelCount>0||!!t.catalogOutcome||(t.card.localCost?.totalTokens??0)>0).map(e=>{let t=n.get(e.card.id);return Object.assign({},e.card,e.catalogOutcome?{catalogStatus:e.catalogOutcome.status}:{},t===void 0?{}:{apiKeySupported:t})}).toSorted((e,t)=>e.displayName.localeCompare(t.displayName))}function H(e){return e.selectionRef===void 0?e.id.startsWith(`${e.provider}/`)?e.id:`${e.provider}/${e.id}`:e.selectionRef}function tt(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(H(e))),i=new Set(r.map(H)),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 nt(e){let t=r(e?.models),n=r(t?.providers),i=r(e?.agents),a=r(i?.defaults),o=a?.model,s=r(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(n??{}),apiKeyProviderIds:Object.entries(n??{}).filter(([,e])=>{let t=r(e);return t?Object.hasOwn(t,`apiKey`)&&t.apiKey!=null:!1}).map(([e])=>e),providerAuthModes:Object.fromEntries(Object.entries(n??{}).flatMap(([e,t])=>{let n=r(t)?.auth;return typeof n==`string`?[[e,n]]:[]})),defaults:{primary:c,fallbacks:l,utilityModel:typeof a?.utilityModel==`string`?a.utilityModel:null}}}function rt(e,t){let n=new Set(Array.from(t,z)),r=new Map;for(let t of e??[]){let e=z(t.provider);t.quickApiKeySetup&&e&&!n.has(e)&&!r.has(e)&&r.set(e,{id:e,displayName:E(e)})}return[...r.values()].toSorted((e,t)=>e.displayName.localeCompare(t.displayName))}var it;function U(){return(U=e((()=>{fe(),be(),Me(),it={provider:[`auth-rejected`,`unavailable`,`ready`],profile:[`ready`,`auth-rejected`,`unavailable`]}})))()}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 W(e,t){return{models:{providers:{[e]:{apiKey:t}}}}}function ot(e){return{agents:{defaults:{...e.primary?{model:e.fallbacks.length>0?{primary:e.primary,fallbacks:[...e.fallbacks]}:e.primary}:{},utilityModel:e.utilityModel,thinkingDefault:e.thinkingOverridden&&e.thinkingLevel?e.thinkingLevel:null,fastModeDefault:e.fastModeOverridden&&e.fastMode!==void 0?e.fastMode:null}}}}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(L(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((()=>{R(),dt=[`auth`,`billing`,`rate_limit`,`timeout`,`format`,`no_model`,`unknown`]})))()}var pt;function mt(){return(mt=e((()=>{ge(),I(),pt=class{constructor(e,t){this.options=t,this.pending=new Set,this.usageTask=this.createTask(e,`usage`,Ue,e=>({providerUsage:e}),(e,t)=>this.options.refreshPolicy.markProviderUsage(e,Date.now(),t)),this.costTask=this.createTask(e,`cost`,We,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.options.isCoreLoading()&&!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 de(e,{autoRun:!1,task:([e,t],{signal:r})=>e?n(e,r).then(n=>({client:e,data:n,epoch:t})):pe,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 G(e){let t=new Set,n=[];for(let r of e){let e=H(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 K(e){return v`
<span class="model-providers__label-with-help">
<span>${e.title}</span>
<span class="settings-section__docs">
<openclaw-tooltip open-on-click>
<button
id=${e.triggerId}
type="button"
class="settings-section__help-button model-providers__help-button"
aria-label=${e.label}
@keydown=${e=>{e.key===`Escape`&&e.stopPropagation()}}
>
${S.info}
</button>
<div slot="content" class="settings-section__help-panel">${e.body}</div>
</openclaw-tooltip>
</span>
</span>
`}function ht(e){return v`
<span class="model-providers__segment-label">
<span>${e.label}</span>
<openclaw-tooltip open-on-click .content=${e.help}>
<button
type="button"
class="model-providers__segment-info"
aria-label=${e.help}
@click=${e=>e.stopPropagation()}
@keydown=${e=>{e.key===`Escape`&&e.stopPropagation()}}
>
${S.info}
</button>
</openclaw-tooltip>
</span>
`}function gt(e){return e===`auto`?`auto`:e===`on`}function _t(e){let t=!e.canMutate||e.models.length===0,n=!e.canMutate,r=!!e.busy.defaults,i=e.mutationBlockedReason??``,a=e.thinkingLevel&&!Y.has(e.thinkingLevel)?[...J,e.thinkingLevel]:J,o=e.fastMode===void 0?``:Ie(e.fastMode),s=e.selection.fallbacks[0]??``,c=v`
<div class="model-providers__defaults">
${!e.loading&&e.models.length===0?v`<div class="callout warning">${w(`modelProviders.defaults.noModels`)}</div>`:b}
${O({title:w(`modelProviders.defaults.primary`),stackedOnNarrow:!0,control:F({label:w(`modelProviders.defaults.primary`),value:e.selection.primary,options:[{value:``,label:w(`modelProviders.defaults.selectModel`),disabled:!!e.selection.primary},...G(e.models)],disabled:t||r,title:i,onChange:e.onPrimaryChange})})}
${O({title:K({title:w(`modelProviders.defaults.utility`),label:w(`modelProviders.defaults.utilityHelpLabel`),triggerId:yt,body:v`
<p>${w(`modelProviders.defaults.utilityHelpPurpose`)}</p>
<p>${w(`modelProviders.defaults.utilityHelpAutomatic`)}</p>
`}),stackedOnNarrow:!0,control:F({id:vt,label:w(`modelProviders.defaults.utility`),value:e.selection.utilityModel??q,options:[{value:q,label:w(`quickSettings.model.fastModes.auto`)},{value:``,label:w(`modelProviders.defaults.disabled`)},...G(e.models)],disabled:t||r,title:i,onChange:t=>e.onUtilityChange(t===q?null:t)})})}
${O({title:w(`modelProviders.defaults.fallback`),stackedOnNarrow:!0,control:F({label:w(`modelProviders.defaults.fallback`),value:s,options:[{value:``,label:w(`modelProviders.defaults.noFallback`)},...G(e.models.filter(t=>H(t)!==e.selection.primary))],disabled:t||r||!e.selection.primary,title:i,onChange:t=>e.onFallbackChange(t||null)})})}
${O({title:K({title:w(`quickSettings.model.thinking`),label:w(`modelProviders.defaults.thinkingHelpLabel`),triggerId:bt,body:v`<p>${w(`modelProviders.defaults.thinkingHelp`)}</p>`}),stackedOnNarrow:!0,control:v`
${P({value:e.thinkingLevel??``,options:[{value:``,label:ht({label:w(`quickSettings.model.default`),help:w(`modelProviders.defaults.thinkingDefaultHelp`)})},...a.map(e=>({value:e,label:Y.has(e)?w(`quickSettings.model.thinkingLevels.${e}`):ye(e)}))],disabled:r||n,onChange:(t,n)=>t===``?e.onThinkingReset():e.onThinkingChange(t,n),onReselect:t=>{t===``&&e.thinkingOverridden&&e.onThinkingReset()}})}
`})}
${O({title:K({title:w(`quickSettings.model.fastMode`),label:w(`modelProviders.defaults.fastModeHelpLabel`),triggerId:xt,body:v`<p>${w(`modelProviders.defaults.fastModeHelp`)}</p>`}),stackedOnNarrow:!0,control:v`
${P({value:o,options:[{value:``,label:ht({label:w(`quickSettings.model.default`),help:w(`modelProviders.defaults.fastModeDefaultHelp`)})},{value:`auto`,label:w(`quickSettings.model.fastModes.auto`)},{value:`on`,label:w(`quickSettings.model.fastModes.on`)},{value:`off`,label:w(`quickSettings.model.fastModes.off`)}],disabled:r||n,onChange:t=>{t===``?e.onFastModeReset():t!==o&&e.onFastModeChange(gt(t))},onReselect:t=>{t===``&&e.fastModeOverridden&&e.onFastModeReset()}})}
`})}
${e.canMutate&&e.message?v`<div
class="callout ${e.message.kind}"
role=${e.message.kind===`error`?`alert`:`status`}
>
${e.message.text}
</div>`:b}
${e.canMutate&&e.message?.warning?v`<div class="callout warning" role="status">${e.message.warning}</div>`:b}
</div>
`;return N({title:w(`modelProviders.defaults.title`),description:w(`modelProviders.defaults.subtitle`)},c)}var q,vt,yt,bt,xt,J,Y;function X(){return(X=e((()=>{_(),he(),Fe(),x(),ze(),A(),C(),Se(),U(),q=`__openclaw_automatic_utility__`,vt=`model-providers-utility-model`,yt=`model-providers-utility-help`,bt=`model-providers-thinking-help`,xt=`model-providers-fast-mode-help`,J=me.filter(e=>e!==`minimal`),Y=new Set(J)})))()}function St(e){let t=e.auth;if(!t)return b;let n=w(Tt[t.kind]),r=t.expiryLabel?w(`modelProviders.expiresIn`,{time:t.expiryLabel}):void 0;return v`
<span title=${r??n}>
${j({kind:Et[t.kind],label:n})}
</span>
`}function Ct(e){return e.hasConfigApiKey||!!e.apiKey||e.profiles.length>0}function Z(e){return e.catalogStatus===`ready`&&e.auth?.kind!==`expired`&&e.auth?.kind!==`missing`&&e.auth?.kind!==`expiring`}function wt(e){return e.auth?.kind===`expired`||e.auth?.kind===`missing`||e.auth?.kind===`expiring`?St(e):e.catalogStatus===`auth-rejected`?j({kind:`danger`,label:w(`modelProviders.status.denied`)}):e.catalogStatus===`unavailable`?j({kind:`warn`,label:w(`common.failed`)}):Ct(e)?Z(e)&&e.availableModelCount>0?j({kind:`ok`,label:w(`modelProviders.status.ready`)}):Z(e)?j({kind:`muted`,label:w(`modelProviders.status.ok`)}):j({kind:`muted`,label:w(`modelProviders.status.configured`)}):St(e)}var Tt,Et;function Dt(){return(Dt=e((()=>{_(),A(),C(),Tt={ok:`modelProviders.status.ok`,expiring:`modelProviders.status.expiring`,expired:`modelProviders.status.expired`,missing:`modelProviders.status.missing`,"api-key":`modelProviders.status.apiKey`},Et={ok:`ok`,expiring:`warn`,expired:`danger`,missing:`danger`,"api-key":`muted`}})))()}function Q(e){return!e.canMutate||e.configBusy}function Ot(e){return e?v`
<div class="callout ${e.kind}" role=${e.kind===`error`?`alert`:`status`}>
${e.text}
</div>
${e.warning?v`<div class="callout warning" role="status">${e.warning}</div>`:b}
`:b}function kt(e){return e.modelCount===0?null:e.availableModelCount<e.modelCount?w(`modelProviders.modelsAvailable`,{available:String(e.availableModelCount),count:String(e.modelCount)}):e.modelCount===1?w(`modelProviders.modelOne`):w(`modelProviders.models`,{count:String(e.modelCount)})}function At(e,t){let n=e.localCost;return!n||n.totalTokens===0&&n.totalCost===0?b:v`
<div class="model-providers__local-cost">
<div class="provider-usage-billing-row">
<span>${w(`modelProviders.localCost`,{days:String(t)})}</span>
<strong>${te(n.totalCost)}</strong>
</div>
<div class="model-providers__local-cost-detail">
${w(`modelProviders.localCostDetail`,{tokens:re(n.totalTokens),sessions:String(n.sessionCount)})}
</div>
</div>
`}function jt(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(w(`modelProviders.credentials.oauth`,{count:String(n)})),r>0&&a.push(w(`modelProviders.credentials.tokenProfiles`,{count:String(r)})),e.apiKey?.source===`config`?a.push(w(`modelProviders.credentials.configKey`)):e.apiKey?.source===`env`?a.push(e.apiKey.envVar?w(`modelProviders.credentials.envKeyNamed`,{name:e.apiKey.envVar}):w(`modelProviders.credentials.envKey`)):i>0&&a.push(w(`modelProviders.credentials.profileKey`,{count:String(i)})),v`
<div class="model-providers__credentials">
<span>${w(`modelProviders.credentials.label`,{agent:t})}</span>
<strong
>${a.length>0?a.join(` · `):w(`modelProviders.credentials.none`)}</strong
>
</div>
`}function Mt(e){if(!e)return b;let t=e.status===`ok`&&e.results.some(e=>e.status!==`ok`),n=t?`warning`:e.status===`ok`?`success`:`error`;return v`
<div class="model-providers__probe model-providers__probe--${n}" role="status">
<div class="model-providers__probe-summary">
<strong
>${w(t?`modelProviders.probe.status.partial`:`modelProviders.probe.status.${e.status}`)}</strong
>
${e.latencyMs===void 0?b:v`<span
>${w(`modelProviders.probe.latency`,{ms:String(e.latencyMs)})}</span
>`}
</div>
${e.error?v`<div>${l(e.error)}</div>`:b}
${e.results.map(e=>v`
<div class="model-providers__probe-target">
<span>${e.label}</span>
<span>
${w(`modelProviders.probe.status.${e.status}`)}${e.latencyMs===void 0?``:` · ${w(`modelProviders.probe.latency`,{ms:String(e.latencyMs)})}`}
</span>
${e.error?v`<small>${l(e.error)}</small>`:b}
</div>
`)}
</div>
`}function Nt(e,t){if(t.keyEditorProvider!==e.id)return b;let n=!!t.busy[`key:${e.id}`],r=e.apiKeySupported===!1||!!(e.configAuthMode&&e.configAuthMode!==`api-key`),i=Q(t);return v`
<div class="model-providers__inline-form">
<label class="field">
<span>${w(`modelProviders.apiKey.label`)}</span>
<input
type="password"
autocomplete="off"
placeholder=${e.apiKey?.source===`config`?w(`modelProviders.apiKey.replacePlaceholder`):w(`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)}
>
${w(n?`modelProviders.saving`:`common.save`)}
</button>
<button class="btn btn--sm" ?disabled=${n} @click=${()=>t.onCloseKeyEditor()}>
${w(`common.cancel`)}
</button>
</div>
</div>
`}function Pt(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=Q(t),f=l?w(`modelProviders.apiKey.authModeBlocked`,{mode:e.configAuthMode??``}):c;return v`
<div class="model-providers__card-actions">
${r?v`
<button
class="btn btn--sm"
?disabled=${a||!t.canMutate||!t.probeAvailable}
title=${t.probeAvailable?c:w(`modelProviders.probe.unavailable`)}
@click=${()=>t.onProbe(e.id,n)}
>
${w(a?`modelProviders.probe.testing`:`modelProviders.probe.test`)}
</button>
`:b}
${u?b:v`
<button
class="btn btn--sm"
?disabled=${o||d||l}
title=${f}
@click=${()=>t.onOpenKeyEditor(e.id)}
>
${e.hasConfigApiKey?w(`modelProviders.apiKey.replace`):w(`modelProviders.apiKey.set`)}
</button>
`}
${e.hasConfigApiKey?v`
<button
class="btn btn--sm danger"
?disabled=${o||d||l}
title=${f}
@click=${()=>t.onRemoveKey(e.id,e.configKey??e.id)}
>
${w(`modelProviders.apiKey.remove`)}
</button>
`:b}
${i?v`
<button
class="btn btn--sm"
?disabled=${s||d}
title=${c}
@click=${()=>t.onRequestLogout(e.id)}
>
${w(`modelProviders.logout.action`)}
</button>
`:b}
</div>
${t.pendingLogoutProvider===e.id?v`
<div class="model-providers__confirm" role="alert">
<span>${w(`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)}
>
${w(s?`modelProviders.logout.loggingOut`:`modelProviders.logout.action`)}
</button>
<button class="btn btn--sm" ?disabled=${s} @click=${t.onCancelLogout}>
${w(`common.cancel`)}
</button>
</div>
</div>
`:b}
`}function Ft(e,t){let n=kt(e),r=t.messages[`key:${e.id}`]??t.messages[e.id];return v`
<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">
${xe(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?v` · ${n}`:b}</span
>
</div>
</div>
<div class="settings-row__control">
${e.usage?.plan?Te(e.usage.plan):b}
${wt(e)}
</div>
</div>
${jt(e,t.credentialAgentLabel)}
<div
class="model-providers__global-metrics"
aria-busy=${t.supplementalLoading?`true`:`false`}
>
<div class="model-providers__global-metrics-title">${w(`modelProviders.globalUsage`)}</div>
${e.usage?Ye(e.usage):v`<div class="model-providers__no-stats">
${w(t.supplementalLoading?`common.loading`:`modelProviders.noStats`)}
</div>`}
${At(e,t.costDays)}
</div>
${Pt(e,t)} ${Nt(e,t)}
${Mt(t.probeResults[e.id])} ${Ot(r)}
</div>
`}function It(e){let t=!!e.busy.add,n=Q(e)||t,r=v`
${e.unconfiguredProviders.length===0?M(w(`modelProviders.add.none`)):b}
${e.addProviderOpen?v`
<div class="settings-row settings-row--stacked">
<div class="model-providers__add-form">
<label class="field">
<span>${w(`modelProviders.add.provider`)}</span>
<select
class="settings-select"
.value=${e.addProviderId}
?disabled=${n}
@change=${t=>e.onAddProviderIdChange(t.target.value)}
>
<option value="">${w(`modelProviders.add.selectProvider`)}</option>
${e.unconfiguredProviders.map(e=>v`<option value=${e.id}>${e.displayName}</option>`)}
</select>
</label>
<label class="field">
<span>${w(`modelProviders.apiKey.label`)}</span>
<input
type="password"
autocomplete="off"
placeholder=${w(`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?w(`modelProviders.saving`):w(`modelProviders.add.save`)}
</button>
</div>
${Ot(e.messages.add)}
</div>
`:b}
`;return N({title:w(`modelProviders.add.title`),description:w(`modelProviders.add.subtitle`),actions:v`
<button
class="btn btn--sm"
?disabled=${t||!e.addProviderOpen&&(Q(e)||e.unconfiguredProviders.length===0)}
title=${e.mutationBlockedReason??``}
@click=${e.onAddProviderToggle}
>
${e.addProviderOpen?w(`common.cancel`):w(`modelProviders.add.action`)}
</button>
`},r)}function Lt(e){let t=e.cards.some(Z);return v`
<div class="model-providers__setup" data-model-readiness="model-required">
${N({title:w(`modelProviders.readiness.title`)},O({title:w(`modelProviders.readiness.heading`),description:w(t?`modelProviders.readiness.signedInNoModels`:`modelProviders.readiness.notConfigured`),control:v`
${j({kind:`warn`,label:w(t?`modelProviders.readiness.noModels`:`modelProviders.readiness.modelRequired`)})}
<button class="btn primary" @click=${e.onOpenModelSetup}>
${w(t?`modelProviders.readiness.chooseProvider`:`modelSetup.heading`)}
</button>
`}))}
</div>
`}function Rt(e){return v`
<div class="settings-row">
<div class="settings-row__text">
<span class="settings-row__desc provider-usage-error">${e}</span>
</div>
</div>
`}function zt(e){if(!e.connected)return k(D(M(w(`modelProviders.disconnected`))));if(e.loading)return k(v`
<div id=${c.behavior}>
${_t({models:e.configuredModels,selection:e.defaultModels,thinkingLevel:e.thinkingLevel,thinkingOverridden:e.thinkingOverridden,fastMode:e.fastMode,fastModeOverridden:e.fastModeOverridden,loading:!0,canMutate:!Q(e),mutationBlockedReason:e.mutationBlockedReason,busy:e.busy,message:e.messages.defaults,onPrimaryChange:e.onPrimaryChange,onFallbackChange:e.onFallbackChange,onUtilityChange:e.onUtilityChange,onThinkingChange:e.onThinkingChange,onThinkingReset:e.onThinkingReset,onFastModeChange:e.onFastModeChange,onFastModeReset:e.onFastModeReset})}
</div>
${D(Ce())}
`);let t=v`
<div class="model-providers__provider-list">
${e.error?D(Rt(e.error)):b}
${e.providerUsageFailed?D(Rt(w(`usage.providerUsage.unavailable`))):b}
${e.cards.length===0?D(M(v`<strong>${w(`modelProviders.emptyTitle`)}</strong><br />${w(`modelProviders.emptySubtitle`)}`)):e.cards.map(t=>D(Ft(t,e)))}
</div>
`,n=!e.configuredModels.some(e=>e.available!==!1);return k(v`
${n?Lt(e):b}
<div id=${c.behavior}>
${_t({models:e.configuredModels,selection:e.defaultModels,thinkingLevel:e.thinkingLevel,thinkingOverridden:e.thinkingOverridden,fastMode:e.fastMode,fastModeOverridden:e.fastModeOverridden,canMutate:!Q(e),mutationBlockedReason:e.mutationBlockedReason,busy:e.busy,message:e.messages.defaults,onPrimaryChange:e.onPrimaryChange,onFallbackChange:e.onFallbackChange,onUtilityChange:e.onUtilityChange,onThinkingChange:e.onThinkingChange,onThinkingReset:e.onThinkingReset,onFastModeChange:e.onFastModeChange,onFastModeReset:e.onFastModeReset})}
</div>
${N({title:w(`modelProviders.title`),count:e.cards.length,actions:v`
${e.updatedAt?v`<span class="model-providers__updated"
>${w(`modelProviders.updated`,{time:u(e.updatedAt,{hour:`numeric`,minute:`2-digit`})})}</span
>`:b}
<openclaw-tooltip
.content=${e.refreshing?w(`modelProviders.refreshing`):w(`common.refresh`)}
>
<button
type="button"
class="btn btn--icon btn--ghost btn--xs model-providers__refresh-button"
aria-label=${e.refreshing?w(`modelProviders.refreshing`):w(`common.refresh`)}
?disabled=${e.refreshing}
@click=${()=>e.onRefresh()}
>
${S.refresh}
</button>
</openclaw-tooltip>
`},t)}
${e.quickAddSupported?It(e):b}
${e.providerUsageStalled?v`<div class="callout warning" role="status">${w(`usage.providerUsage.stalled`)}</div>`:b}
`)}function Bt(){return(Bt=e((()=>{_(),x(),be(),Je(),A(),C(),Pe(),f(),ne(),m(),X(),Dt(),Ne()})))()}var Vt,$;function Ht(){return(Ht=e((()=>{a(),ge(),_(),ae(),ce(),se(),Ve(),x(),A(),Re(),C(),g(),ve(),o(),ke(),p(),s(),Ke(),R(),U(),I(),ct(),ft(),mt(),Bt(),Vt=`https://docs.openclaw.ai/concepts/model-providers`,$=class extends h{constructor(...e){super(...e),this.loaderPending=!1,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 de(this,{autoRun:!1,task:([e,t,n],{signal:r})=>!e||!t?pe:He(e,{agentId:t,...n?{refresh:!0}:{},signal:r}).then(t=>({client:e,data:t})),onComplete:({client:e,data:t})=>{this.loadClient=null,this.supplemental.adoptCoreData(e,t)},onError:()=>{this.loadClient=null}}),this.refreshPolicy=new qe({isLoading:()=>this.loaderPending||!this.routeDataObserved||this.loadClient!==null||this.supplemental.usageLoading,reload:()=>this.supplemental.loadUsage(),onIncompleteUsageExhausted:()=>this.requestUpdate()}),this.supplemental=new pt(this,{isCoreLoading:()=>this.loaderPending,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 Oe(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.routeDataObserved&&!this.loaderPending&&this.refresh({force:!1})},onPageActivation:()=>this.refreshPolicy.request(`focus`)}),this.subscriptions=new ie(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`)||e.has(`loaderPending`))&&this.routeData!==void 0){this.routeDataObserved=!0;let e=this.resolveSelectedAgentId();this.setSelectedAgent(e),(this.routeData.agentId??``)===e&&this.gateway.isRouteDataCurrent(this.routeData)?this.supplemental.adoptCoreData(this.routeData.client,this.routeData.data):(this.data=null,this.dataClient=null,this.refreshPolicy.resetPayload()),this.ensureInitialData()}}ensureInitialData(){!this.context.agents.state.agentsList&&!this.context.agents.state.agentsLoading&&!this.context.agents.state.agentsError&&this.context.agents.ensureList();let e=this.gateway.client;!this.routeDataObserved||this.loaderPending||!this.gateway.connected||!e||!this.selectedAgentId||this.loadClient!==null||this.data!==null&&this.data.updatedAt!==null&&e===this.dataClient||this.refresh({force:!1})}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`?this.context.runtimeConfig.canPatch===!0?!e.client||!this.selectedAgentId||!this.data?.config?w(`modelProviders.configUnavailable`):null:w(`modelProviders.readOnly.adminRequired`):w(`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 Xe({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:W(t,n),note:w(`modelProviders.notes.saveKey`,{provider:e}),success:w(`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:w(`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:W(t,null),note:w(`modelProviders.notes.removeKey`,{provider:e}),success:w(`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:w(`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:w(`modelProviders.probe.unavailable`)})):this.setMessage(e,{kind:`error`,text:L(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:L(r)});return}this.pendingLogoutProvider=null,this.setMessage(e,{kind:`success`,text:w(`modelProviders.logout.done`)})}catch(t){this.isCurrentClient(n,i)&&this.agentEpoch===o&&this.setMessage(e,{kind:`error`,text:L(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:W(e,t),note:w(`modelProviders.notes.addProvider`,{provider:e}),success:w(`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:w(`modelProviders.add.saved`,{provider:e}),...n.warning?{warning:n.warning}:{}}))}async saveDefaults(e=this.defaultsDraft){if(!e)return;let t=this.agentEpoch,n=await this.patchConfig({key:`defaults`,raw:ot(e),note:w(`modelProviders.notes.defaultModel`),success:w(`modelProviders.defaults.saved`),replacePaths:st});this.agentEpoch===t&&this.defaultsDraft===e&&(!n.ok||!n.warning)&&(this.defaultsDraft=null)}render(){let e=this.context.gateway.snapshot,n=this.context.agents.state,i=n.agentsList?.agents??[],a=n.agentsList?null:n.agentsError,o=i.find(e=>t(e.id)===this.selectedAgentId),s=o?ee(o):this.selectedAgentId,c=this.data??Ge,l=nt(c.config),u=this.context.runtimeConfig.state,d=r(u.configForm??u.configSnapshot?.config)??r(c.config)??{},f=r(r(d.agents)?.defaults),p={...l.defaults,...at(f)},m=this.defaultsDraft??p,h=e=>{this.defaultsDraft={...this.defaultsDraft??p,...e},this.setMessage(`defaults`,null),this.saveDefaults(this.defaultsDraft)},te=et({...c,providerUsage:c.providerUsage?.ok?c.providerUsage.value:null,configProviderIds:l.providerIds,configApiKeyProviderIds:l.apiKeyProviderIds,configProviderAuthModes:l.providerAuthModes}),ne=new Set([...l.providerIds,...c.authStatus?.providers.filter(e=>!!e.apiKey||e.profiles.length>0).map(e=>e.provider)??[]]),re=_e(e,`models.probe`),g=zt({connected:e.phase===`connected`,loading:e.phase===`connected`&&this.data===null&&!a,refreshing:this.loadClient!==null,error:a??c.error??c.catalogError,providerUsageFailed:c.providerUsage?.ok===!1,supplementalLoading:this.loaderPending||this.supplemental.loading,updatedAt:c.updatedAt,costDays:30,credentialAgentLabel:s,cards:te,configuredModels:tt(c.models,m),defaultModels:m,thinkingLevel:m.thinkingLevel,thinkingOverridden:m.thinkingOverridden,fastMode:m.fastMode,fastModeOverridden:m.fastModeOverridden,configBusy:this.configBusy(),quickAddSupported:c.authStatus?.providerCapabilities!==void 0,unconfiguredProviders:rt(c.authStatus?.providerCapabilities,ne),canMutate:this.canMutate(),mutationBlockedReason:this.mutationBlockedReason(),providerUsageStalled:this.refreshPolicy.incompleteUsageExhausted,probeAvailable:!this.probeUnsupported&&re!==!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=>{let t=this.defaultsDraft??p;h({primary:e,fallbacks:t.fallbacks.filter(t=>t!==e)})},onFallbackChange:e=>{let t=this.defaultsDraft??p;h({fallbacks:e?[e,...t.fallbacks.slice(1).filter(t=>t!==e)]:[]})},onUtilityChange:e=>h({utilityModel:e}),onThinkingChange:e=>h({thinkingLevel:e,thinkingOverridden:!0}),onThinkingReset:()=>h({thinkingLevel:void 0,thinkingOverridden:!1}),onFastModeChange:e=>h({fastMode:e,fastModeOverridden:!0}),onFastModeReset:()=>h({fastMode:void 0,fastModeOverridden:!1}),onOpenModelSetup:()=>this.context.navigate(`model-setup`)});return v`
${we({title:ue(`model-providers`),subtitle:v`${w(`modelProviders.subtitle`)}
${Ee(Vt)}`,actions:v`
${Be({agents:i,selection:this.context.agentSelection,allowAll:!1,selectedId:this.selectedAgentId})}
<button class="btn" @click=${()=>this.context.navigate(`model-setup`)}>
${S.settings}<span>${w(`modelProviders.configureModels`)}</span>
</button>
`})}
${Le(g)}
`}},i([n({context:le,subscribe:!0})],$.prototype,`context`,void 0),i([oe({attribute:!1})],$.prototype,`routeData`,void 0),i([oe({attribute:!1})],$.prototype,`loaderPending`,void 0),i([y()],$.prototype,`data`,void 0),i([y()],$.prototype,`busy`,void 0),i([y()],$.prototype,`messages`,void 0),i([y()],$.prototype,`probeResults`,void 0),i([y()],$.prototype,`probeUnsupported`,void 0),i([y()],$.prototype,`keyEditorProvider`,void 0),i([y()],$.prototype,`keyDraft`,void 0),i([y()],$.prototype,`pendingLogoutProvider`,void 0),i([y()],$.prototype,`addProviderOpen`,void 0),i([y()],$.prototype,`addProviderId`,void 0),i([y()],$.prototype,`addProviderKey`,void 0),i([y()],$.prototype,`defaultsDraft`,void 0),i([y()],$.prototype,`selectedAgentId`,void 0),customElements.get(`openclaw-model-providers-page`)||customElements.define(`openclaw-model-providers-page`,$)})))()}Ht();
//# sourceMappingURL=model-providers-page-CvuVsNlr.js.map