@wengine-ai/llms 2.3.2416 → 2.3.2418
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/cjs/server.cjs +2 -2
- package/dist/cjs/server.cjs.map +2 -2
- package/dist/esm/server.mjs +1 -1
- package/dist/esm/server.mjs.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -93,7 +93,7 @@ npm install -g @wengine-ai/claude-code-router-next@latest && ccr restart
|
|
|
93
93
|
|
|
94
94
|
| 版本 | 发布内容 |
|
|
95
95
|
| --- | --- |
|
|
96
|
-
| **v2.3.
|
|
96
|
+
| **v2.3.2418** | <ul><li>**空回复现在会重试并降级**:上游返回 200 且 `content` 为空时不再被记成成功,改为触发同模型重试与 fallback;判据是 content 集合为空(tool_use-only 等合法回合不受影响),探测有字节与时间上限,慢速流不丢字节;Codex 侧同样拦住空 `response.completed`。</li><li>**流式回合不再记录 `output_tokens: 0`**:普通流式请求此前没有 usage 读取器,健康回复被记成全零且无 TTFT;现从 tee 分支采集并按流序合并。</li><li>**不健康 provider 从模型列表降级剔除**:熔断模型对所有 provider 类型生效隐藏,恢复后自动放回;订阅类 provider 新增两级后台探活(先查账号状态,再发真实最小请求),不再依赖真实请求反复撞死账号。</li></ul> |
|
|
97
97
|
| **v2.3.2415** | <ul><li>**新增 Qoder 订阅 provider(qoder.com + qoder.cn)**: 同一插件同引擎支持国际站与国内站 PAT 订阅,双 managed provider + 卡片双区块(中英双语);含整配置写串行化、401 单次刷新重放、每帧 1MiB 上限等健壮性修复。</li><li>**修复 WorkBuddy 6004 重置时间戳时区**: 测试改用 Asia/Shanghai 渲染,UTC CI 不再挂。</li><li>**修复 tool_result 图片按 base64 文本发送**: 图片改为视觉块发送,避免 200 万+ token 膨胀与上游拒绝。</li></ul> |
|
|
98
98
|
| **v2.3.2414** | <ul><li>**CCR Desktop(可选 Tauri 客户端)与 Pi 配置生命周期修复**: 新增可选 Tauri 桌面壳(托盘快速切换全局默认模型、quota 摘要、单实例;生命周期伴侣化、退出不杀 gateway);修复 `ccr restart` 的 disable→enable 与 legacy 项目 provider 改名迁移丢失 Pi 自定义模型字段(thinkingLevelMap/modelOverrides)。</li></ul> |
|
|
99
99
|
| **v2.3.2413** | <ul><li>**修复 TTFT 永久为空**: #65(pi 会话粘连)与 #67(temp-file 重写)合并冲突解决时丢失了 #65 的 \`statsKey\` 文件名优先逻辑,handler 用会话 UUID 命名临时文件而 reader 用 requestId 查找 → 永久不匹配 → 所有流式请求的 TTFT 都是 null、tokens_per_second 退化为按完整时长重算。修复后 handler 优先用 \`metadata.statsKey\` 命名文件(对齐 reader),TTFT 与真实速度恢复。</li></ul> |
|
package/dist/cjs/server.cjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";var Il=Object.create;var yn=Object.defineProperty;var Ml=Object.getOwnPropertyDescriptor;var Ll=Object.getOwnPropertyNames;var $l=Object.getPrototypeOf,Nl=Object.prototype.hasOwnProperty;var w=(n,e)=>()=>(n&&(e=n(n=0)),e);var bn=(n,e)=>{for(var t in e)yn(n,t,{get:e[t],enumerable:!0})},Js=(n,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Ll(e))!Nl.call(n,r)&&r!==t&&yn(n,r,{get:()=>e[r],enumerable:!(o=Ml(e,r))||o.enumerable});return n};var q=(n,e,t)=>(t=n!=null?Il($l(n)):{},Js(e||!n||!n.__esModule?yn(t,"default",{value:n,enumerable:!0}):t,n)),Ws=n=>Js(yn({},"__esModule",{value:!0}),n);function Fl(n){if(n==null)return{ok:!0};let e=String(n).trim();if(!e)return{ok:!0};if(Dl.test(e))return{ok:!0};try{let t=new URL(e);return t.protocol!=="http:"&&t.protocol!=="https:"?{ok:!1,error:`Unsupported proxy protocol: ${t.protocol}. Only http:// and https:// are allowed.`}:{ok:!0}}catch{return{ok:!1,error:`Invalid proxy URL: ${e}`}}}function Vs(n){let e=[];for(let t of[...Ks,Gs]){let o=n[t];if(o==null)continue;let r=Fl(o);r.ok||e.push({key:t,error:r.error})}return e}function Vo(){return Go||(Go=new kn.Agent({connect:{timeout:15e3}})),Go}function Qs(n){let e=n.get(Gs);return(typeof e=="string"?e.trim():"")||void 0}function Ys(n){return n?Y(n):Vo()}function wt(n){for(let e of Ks){let t=n.get(e);if(t==null)continue;let o=String(t).trim();if(o)return o}}function Qo(n){if(n==null||n==="")return!0;if(typeof n=="string"){let e=n.trim().toLowerCase();return e==="false"||e==="0"?!1:e==="true"||e==="1"?!0:!!e}return n===!1||n===0?!1:n===!0||n===1?!0:!!n}function me(n,e){let t=wt(n);if(t)return Qo(n.get("PROXY_GLOBAL_ENABLED"))||e?.proxyEnabled===!0||e?.proxy_enabled===!0?t:void 0}function Y(n){let e=Ul(n),t=_n.get(e);if(t)return t;let o=new kn.ProxyAgent(e);return _n.set(e,o),o}async function Tn(){let n=Array.from(_n.values());_n.clear(),await Promise.allSettled(n.map(e=>e.close()))}function Ul(n){let e=n.trim();if(!e)throw new TypeError("Proxy URL must not be empty");let t=new URL(e);if(t.protocol!=="http:"&&t.protocol!=="https:")throw new TypeError(`Unsupported proxy protocol: ${t.protocol}`);return t.toString()}var kn,Ks,Gs,Dl,_n,Go,ae=w(()=>{"use strict";kn=require("undici"),Ks=["HTTPS_PROXY","https_proxy","httpsProxy","PROXY_URL"],Gs="SUBSCRIPTION_PROXY_URL",Dl=/\$\{[^}]+\}|\$[A-Z_][A-Z0-9_]*/;_n=new Map});var Pt,Yo,Xs,Zs,je,Xo=w(()=>{"use strict";Pt=require("fs"),Yo=require("path"),Xs=require("dotenv"),Zs=q(require("json5"),1);ae();je=class{config={};options;constructor(e={jsonPath:"./config.json"}){this.options={envPath:e.envPath||".env",jsonPath:e.jsonPath,useEnvFile:!1,useJsonFile:e.useJsonFile!==!1,useEnvironmentVariables:e.useEnvironmentVariables!==!1,...e},this.loadConfig()}loadConfig(){this.options.useJsonFile&&this.options.jsonPath&&this.loadJsonConfig(),this.options.initialConfig&&(this.config={...this.config,...this.options.initialConfig}),this.options.useEnvFile&&this.loadEnvConfig(),this.config.LOG_FILE&&(process.env.LOG_FILE=this.config.LOG_FILE),this.config.LOG&&(process.env.LOG=this.config.LOG)}loadJsonConfig(){if(!this.options.jsonPath)return;let e=this.isAbsolutePath(this.options.jsonPath)?this.options.jsonPath:(0,Yo.join)(process.cwd(),this.options.jsonPath);if((0,Pt.existsSync)(e))try{let t=(0,Pt.readFileSync)(e,"utf-8"),o=Zs.default.parse(t);this.config={...this.config,...o},console.log(`Loaded JSON config from: ${e}`)}catch(t){console.warn(`Failed to load JSON config from ${e}:`,t)}else console.warn(`JSON config file not found: ${e}`)}loadEnvConfig(){let e=this.isAbsolutePath(this.options.envPath)?this.options.envPath:(0,Yo.join)(process.cwd(),this.options.envPath);if((0,Pt.existsSync)(e))try{let t=(0,Xs.config)({path:e});t.parsed&&(this.config={...this.config,...this.parseEnvConfig(t.parsed)})}catch(t){console.warn(`Failed to load .env config from ${e}:`,t)}}loadEnvironmentVariables(){let e=this.parseEnvConfig(process.env);this.config={...this.config,...e}}parseEnvConfig(e){let t={};return Object.assign(t,e),t}isAbsolutePath(e){return e.startsWith("/")||e.includes(":")}get(e,t){let o=this.config[e];return o!==void 0?o:t}getAll(){return{...this.config}}getHttpsProxy(){return wt(this)}has(e){return this.config[e]!==void 0}set(e,t){this.config[e]=t}reload(){this.config={},this.loadConfig()}getConfigSummary(){let e=[];return this.options.initialConfig&&e.push("Initial Config"),this.options.useJsonFile&&this.options.jsonPath&&e.push(`JSON: ${this.options.jsonPath}`),this.options.useEnvFile&&e.push(`ENV: ${this.options.envPath}`),this.options.useEnvironmentVariables&&e.push("Environment Variables"),`Config sources: ${e.join(", ")}`}}});function W(n,e=500,t="internal_error",o="api_error"){let r=new Error(n);return r.statusCode=e,r.code=t,r.type=o,r}async function qs(n,e,t){e.log.error(n);let o=n.statusCode||500;if(n.rawBody)try{let s=JSON.parse(n.rawBody);return t.code(o).send(s)}catch{return t.code(o).send(n.rawBody)}let r={error:{message:n.message||"Internal Server Error",type:n.type||"api_error",code:n.code||"internal_error"}};return t.code(o).send(r)}var vn=w(()=>{"use strict"});function xn(n){Zo=n}function Et(){return Zo}function Sn(n){return Zo||n.get("DEBUG_LOG")===!0}function ni(n){let e=n.get("DEBUG_LOG_OPTIONS");return!e||typeof e!="object"?Ze:{maxBodyLength:e.maxBodyLength??Ze.maxBodyLength,maxStreamChunks:e.maxStreamChunks??Ze.maxStreamChunks}}function Cn(n){let e={};for(let[t,o]of Object.entries(n)){let r=t.toLowerCase();jl.has(r)||Hl.test(r)&&!/^(?:x-|anthropic-)?ratelimit-/.test(r)?e[t]="***MASKED***":e[t]=o}return e}function Rn(n,e){return n.length<=e?n:n.slice(0,e)+`...[truncated, total ${n.length} bytes]`}function oi(n,e,t){let o=typeof t.body=="string"?t.body:JSON.stringify(t.body);n.info({debug_log:!0,reqId:e,phase:"provider_request",url:t.url,headers:Cn(t.headers),body:Rn(o,Ze.maxBodyLength)})}function ri(n,e,t){n.info({debug_log:!0,reqId:e,phase:"provider_response",status:t.status,headers:Cn(t.headers),...t.body!==void 0?{body:Rn(t.body,Ze.maxBodyLength)}:{}})}function ei(n,e,t,o){let r=zl(o);n.info({debug_log:!0,reqId:e,phase:"provider_stream_chunk",chunkIndex:t,...r?{usage_monitor:r}:{},data:Rn(o,Ze.maxBodyLength)})}function zl(n){let e=[];for(let t of n.split(/\r?\n/)){if(!t.startsWith("data:"))continue;let o=t.slice(5).trim();if(!(!o||o==="[DONE]"))try{let r=JSON.parse(o),s=r?.usage||r?.response?.usage;s&&e.push({path:r?.usage?"usage":"response.usage",usage:s,choicesLength:Array.isArray(r?.choices)?r.choices.length:void 0,finishReason:r?.choices?.[0]?.finish_reason})}catch{e.push({parseError:!0,data:Rn(o,512)})}}if(e.length)return e.length===1?e[0]:e}function ti(n,e,t){n.info({debug_log:!0,reqId:e,phase:"provider_stream_end",totalChunks:t})}function si(n,e,t,o){(async()=>{let r=n.pipeThrough(new TextDecoderStream).getReader(),s=0;try{let i="";for(;;){let{done:a,value:l}=await r.read();if(a)break;i+=l;let c=i.split(`
|
|
2
2
|
|
|
3
3
|
`);i=c.pop()||"";for(let u of c)u.trim()&&(s<o.maxStreamChunks?ei(e,t,s,u):s===o.maxStreamChunks&&e.info({debug_log:!0,reqId:t,phase:"provider_stream_chunk_omitted",message:`[chunks after #${s} omitted, maxStreamChunks=${o.maxStreamChunks}]`}),s++)}i.trim()&&(s<o.maxStreamChunks&&ei(e,t,s,i.trim()),s++),ti(e,t,s)}catch(i){console.error(`[debug_log] Error reading debug stream for reqId=${t}:`,i),ti(e,t,s)}finally{r.releaseLock()}})()}var jl,Hl,Ze,Zo,At=w(()=>{"use strict";jl=new Set(["authorization","x-api-key","x-goog-api-key","cookie","set-cookie"]),Hl=/token|secret|credential|passwd|password/i,Ze={maxBodyLength:4096,maxStreamChunks:100},Zo=!1});function ii(n,e,t,o,r){let s=new Headers({"Content-Type":"application/json"});t.headers&&Object.entries(t.headers).forEach(([c,u])=>{u&&s.set(c,u)});let i,a=AbortSignal.timeout(t.TIMEOUT??60*1e3*60);if(t.signal){let c=new AbortController,u=()=>c.abort();t.signal.addEventListener("abort",u),a.addEventListener("abort",u),i=c.signal}else i=a;let l={method:"POST",headers:s,body:JSON.stringify(e),signal:i,...t.redirect?{redirect:t.redirect}:{}};return t.dispatcher?l.dispatcher=t.dispatcher:t.httpsProxy&&(l.dispatcher=Y(t.httpsProxy)),r?.debug({reqId:o.req.id,method:"POST",headers:Cn(Object.fromEntries(s.entries())),requestUrl:typeof n=="string"?n:n.toString(),useProxy:Bl(t.httpsProxy)},"final request"),fetch(typeof n=="string"?n:n.toString(),l)}function Bl(n){if(!(typeof n!="string"||!n.trim()))try{let e=new URL(n);return e.username||e.password?(e.username="",e.password="",`${e.toString()} (credentials redacted)`):e.toString()}catch{return"[invalid proxy URL]"}}var ai=w(()=>{ae();At()});function Wl(n){return n.includes('"delta"')?/"delta"\s*:\s*\{[^}]*"(content|tool_calls|reasoning_content|reasoning|function_call)"\s*:\s*("|\[|\{)/.test(n):!1}function ci(n){return/"type"\s*:\s*"response\.[A-Za-z0-9_.]+"/.test(n)||/(^|\n)\s*(event:\s*)?response\.[A-Za-z0-9_.]+/.test(n)}function qo(n){if(ci(n))return"pending";let e=!1,t=!1;for(let o of n.split(`
|
|
4
|
-
`)){let r=o.trim();if(!(!r.startsWith("data:")&&!r.startsWith("event:"))){if(Jl.some(s=>r.includes(s))){e=!0;break}Kl.some(s=>r.includes(s))&&(t=!0)}}return e||Wl(n)?"content":t?"empty":"pending"}async function li(n,e=65536,t=1e4){let o=n.getReader(),r=new TextDecoder,s=[],i="",a=0,l=Date.now()+t,c=(u,p)=>({verdict:u,chunks:s,bytes:a,rest:p});try{for(;;){let u=l-Date.now(),p=Symbol("timeout"),d,m=o.read(),g=u<=0?p:await Promise.race([m,new Promise(h=>{d=setTimeout(()=>h(p),u)})]);if(d&&clearTimeout(d),g===p)return c(qo(i)==="content"?"content":"pending",wn(o,m));if(g.done){i+=r.decode();let h=qo(i);return c(h==="empty"?"empty":"pending",null)}if(!g.value)continue;s.push(g.value),a+=g.value.byteLength,i+=r.decode(g.value,{stream:!0});let f=qo(i);if(f==="content")return c("content",wn(o));if(f==="empty")return await o.cancel().catch(()=>{}),c("empty",null);if(ci(i)||a>=e)return c("pending",wn(o))}}catch(u){throw await o.cancel().catch(()=>{}),u}}function wn(n,e){return new ReadableStream({start(t){let o=e,r=()=>{let s=o??n.read();o=void 0,s.then(({done:i,value:a})=>{i?t.close():(t.enqueue(a),r())}).catch(i=>t.error(i))};r()},cancel(t){return n.cancel(t)}})}function ui(n,e){let t=e?.getReader();return new ReadableStream({start(o){for(let s of n)o.enqueue(s);if(!t){o.close();return}let r=()=>{t.read().then(({done:s,value:i})=>{s?o.close():(o.enqueue(i),r())}).catch(s=>o.error(s))};r()},cancel(o){return t?.cancel(o)}})}var Jl,Kl,di=w(()=>{"use strict";Jl=["content_block_start","content_block_delta","content_block_stop"];Kl=["message_stop","response.completed","response.incomplete","[DONE]"]});function Gl(n,e){return`${n.name}|${e?.name??""}`}function er(n){return n.__ccrPluginRequestState??={budgets:new Map}}function qe(n,e,t){let o=er(n),r=Gl(e,t),s=o.budgets.get(r);return s||(s={refreshUsed:!1},o.budgets.set(r,s)),s}function tr(n,e,t,o){return!e||t?.nonRetryable!==!0?!1:(qe(n,e,o).terminalError=t,!0)}var pi=w(()=>{"use strict"});var nr=w(()=>{"use strict"});function mi(n,e){let t=new Error(e.message);return t.code=e.code,t.statusCode=e.httpStatus,e.cooldownMs&&(t.cooldownMs=e.cooldownMs),e.validationUrl&&(t.validationUrl=e.validationUrl),t.plugin=n,t.nonRetryable=!e.retryable,t.pluginClassified=!0,t}var fi,Ot,Vl,rr,Pn=w(()=>{"use strict";fi=q(require("fastify"),1);nr();Ot=class{plugins=new Map;transformerServices=new Set;disposed=!1;revision=0;attachTransformerService(e){this.assertOpen();let t=[...this.plugins.values()].flatMap(r=>[...r.transformers].map(([s,i])=>{if(e.hasTransformer(s))throw new Error(`transformer "${s}" is already registered`);return[s,e.preparePluginTransformer(i)]})),o=[];try{for(let[r,s]of t)o.push(r),e.registerTransformer(r,s);this.transformerServices.add(e)}catch(r){for(let s of o)e.removeTransformer(s);throw r}}beginActivation(e,t,o,r){if(this.assertOpen(),this.plugins.has(e.name))throw new Error(`plugin "${e.name}" is already registered`);let s={manifest:{...e},directory:r,runtimes:new Map,transformers:new Map,protectors:[],routes:[],preparedRoutes:[]},i="staging",a,l=u=>{try{if(this.assertOpen(),i!=="staging")throw new Error("plugin activation is no longer open");u()}catch(p){throw a=p,p}};return{context:{manifest:s.manifest,log:t,host:o,registerTransformer:u=>l(()=>{let p=typeof u.TransformerName=="string"?u.TransformerName:new u().name;if(typeof p!="string"||!p)throw new Error("plugin transformer has no name");if(s.transformers.has(p))throw new Error(`transformer "${p}" is already registered`);s.transformers.set(p,u)}),registerManagedRuntime:u=>l(()=>{if(!u.name||typeof u.isManaged!="function"||typeof u.signRequest!="function")throw new Error("invalid managed runtime");if(s.runtimes.has(u.name))throw new Error(`managed runtime "${u.name}" is already registered`);s.runtimes.set(u.name,u)}),registerAdminRoutes:u=>l(()=>{s.routes.push(u)}),registerConfigProtector:u=>l(()=>{s.protectors.push(u)}),registerUiCard:u=>l(()=>{if(s.cardPath)throw new Error("plugin card is already registered");if(!/^[A-Za-z0-9][A-Za-z0-9._-]*\.js$/.test(u.cardPath))throw new Error("card must be a single JavaScript file");s.cardPath=u.cardPath}),registerLocales:u=>l(()=>{s.locales=u})},commit:async(u,p)=>{this.assertOpen();let d=this.revision;if(s.routes.length){if(!p)throw new Error("plugin admin routes require a host app");s.preparedRoutes=await this.prepareRoutes(s.routes,p)}if(this.assertOpen(),this.revision!==d)throw new Error("plugin registry changed during activation; retry activation");if(i!=="staging")throw new Error("plugin activation is no longer open");if(a)throw a;if(this.plugins.has(e.name))throw new Error(`plugin "${e.name}" is already registered`);for(let f of this.plugins.values()){for(let h of s.runtimes.keys())if(f.runtimes.has(h))throw new Error(`managed runtime "${h}" is already registered`);for(let h of s.transformers.keys())if(f.transformers.has(h))throw new Error(`transformer "${h}" is already registered`)}let m=[...this.transformerServices].flatMap(f=>[...s.transformers].map(([h,b])=>{if(f.hasTransformer(h))throw new Error(`transformer "${h}" is already registered`);return{service:f,name:h,value:f.preparePluginTransformer(b)}})),g=[];try{for(let f of m)g.push(f),f.service.registerTransformer(f.name,f.value);s.card=u,this.plugins.set(e.name,s),this.revision++,i="committed"}catch(f){for(let h of g)h.service.removeTransformer(h.name);throw i="aborted",f}},get cardPath(){return s.cardPath},abort:()=>{i="aborted"}}}getManagedRuntimeFor(e){for(let t of this.plugins.values())for(let o of t.runtimes.values())try{if(o.isManaged(e))return o}catch{}}getRegisteredRuntimes(){return[...this.plugins.values()].flatMap(e=>[...e.runtimes.values()])}applyConfigProtectors(e,t){for(let o of this.plugins.values())for(let r of o.protectors)r(e,t)}listLoadedPlugins(){return[...this.plugins.values()].map(e=>({name:e.manifest.name,version:e.manifest.version,enabled:!0,...e.card?{cardUrl:`/plugins/${e.manifest.name}/${e.cardPath}`}:{},...e.locales?{locales:e.locales}:{}}))}getPublicCard(e,t){let o=this.plugins.get(e);return o?.cardPath===t&&o.card?Buffer.from(o.card):void 0}async prepareRoutes(e,t){let o=new Set(["get","post","put","patch","delete","head","options","all"]),r=[],s=new Proxy(t,{get:(a,l)=>{if(l==="route")return u=>(r.push(u),s);if(o.has(String(l)))return(u,p,d)=>(r.push({...typeof p=="function"?{}:p,method:l==="all"?["DELETE","GET","HEAD","PATCH","POST","PUT","OPTIONS"]:String(l).toUpperCase(),url:u,handler:d??p}),s);let c=Reflect.get(a,l);return typeof c=="function"?()=>{throw new Error(`plugin route registration cannot call ${String(l)}`)}:c}}),i=(0,fi.default)({logger:!1});try{for(let a of e){let l=a(s);l!==s&&await l}for(let a of this.plugins.values())for(let l of a.preparedRoutes)i.route(l);for(let a of r){let l=Array.isArray(a.method)?a.method:[a.method];for(let c of l)if(t.hasRoute({method:c,url:a.url,constraints:a.constraints}))throw new Error(`plugin route ${c} ${a.url} is already registered`);i.route(a)}return await i.ready(),r}finally{await i.close()}}async registerAllRoutes(e){this.assertOpen();for(let t of this.plugins.values())for(let o of t.preparedRoutes)e.route(o)}dispose(){if(!this.disposed){for(let e of this.transformerServices)for(let t of this.plugins.values())for(let o of t.transformers.keys())e.removeTransformer(o);this.plugins.clear(),this.transformerServices.clear(),this.disposed=!0}}assertOpen(){if(this.disposed)throw new Error("plugin host is disposed")}},Vl=new Ot,rr=()=>Vl});async function He(n,e,t,o,r){let s;try{s=n.classifyError?.(e,t,o)}catch{}let i=s&&/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,95}$/.test(s.code)?s.code:"plugin_upstream_error",a=s?{...s,code:i,message:`Provider plugin request failed (${i}).`}:{code:i,message:"Provider plugin returned an invalid upstream response.",httpStatus:e>=400&&e<=599?e:502,retryable:e===0||e>=500};try{await n.noteUpstreamError?.(a)}catch{}let l=mi(n.name,a);return l.isRateLimit=a.httpStatus===429,l.upstreamStatus=e,r?.errorName&&(l.upstreamErrorName=r.errorName),l}var gi=w(()=>{"use strict";Pn()});var En,sr=w(()=>{En="2.3.2416"});var hi={};bn(hi,{getFallbackPromotionStore:()=>et,resetFallbackPromotionStore:()=>Xl});function et(n){return ze||(ze=new ir,n&&ze.configure(n)),ze}function Xl(){ze&&(ze.clearAll(),ze=null)}var Yl,ir,ze,An=w(()=>{"use strict";ue();Yl=600*1e3,ir=class{promotions=new Map;enabled=!0;ttlMs=Yl;configure(e){e?.enabled!==void 0&&(this.enabled=e.enabled),e?.ttlMinutes!==void 0&&(this.ttlMs=e.ttlMinutes*60*1e3)}getKey(e,t,o){return`${e},${t}:${o}`}promote(e,t,o,r,s,i){if(!this.enabled)return;let a=this.getKey(e,t,o),l=`${r},${s}`;this.promotions.set(a,{promotedModel:l,timestamp:Date.now(),ttlMs:i??this.ttlMs})}getPromotion(e,t,o,r){if(!this.enabled)return null;let s=this.getKey(e,t,o),i=this.promotions.get(s);if(!i)return null;if(Date.now()-i.timestamp>=i.ttlMs)return this.promotions.delete(s),null;let[l,...c]=i.promotedModel.split(","),u=c.join(",");if(!j().isAvailable(l,u))return this.promotions.delete(s),null;let d=r.find(g=>g.name.toLowerCase()===l.toLowerCase()),m=d?.models?.find(g=>String(g).toLowerCase()===u.toLowerCase());return!d||!m||d.enabled===!1?(this.promotions.delete(s),null):`${d.name},${m}`}clear(e,t,o){let r=this.getKey(e,t,o);this.promotions.delete(r)}clearByPrimary(e,t){let o=`${e},${t}:`,r=0;for(let s of this.promotions.keys())s.startsWith(o)&&(this.promotions.delete(s),r++);return r}clearAll(){this.promotions.clear()}clearExpired(){let e=Date.now();for(let[t,o]of this.promotions)e-o.timestamp>=o.ttlMs&&this.promotions.delete(t)}getAllPromotions(){let e=Date.now(),t=[];for(let[o,r]of this.promotions){let s=r.ttlMs-(e-r.timestamp);s>0&&t.push({key:o,promotedModel:r.promotedModel,remainingMs:s})}return t}},ze=null});function tu(n){try{if(!(0,_e.existsSync)(lr))return;let e=JSON.parse((0,_e.readFileSync)(lr,"utf-8"));if(!Array.isArray(e))return;let t=Date.now();for(let o of e){if(!o||!o.provider||!o.model)continue;let r=o.updatedAt||o.lastFailureTime||0;r&&t-r>1440*60*1e3||n.restore({provider:o.provider,model:o.model,status:o.status,failureCount:o.failureCount??0,successCount:o.successCount??0,lastFailureTime:o.lastFailureTime??0,lastProbeTime:o.lastProbeTime??0,lastError:o.lastError,rateLimitUntil:o.rateLimitUntil})}}catch{}}function bi(n){try{let e=n.getAllStates();if(e.length===0)return;(0,_e.existsSync)(cr)||(0,_e.mkdirSync)(cr,{recursive:!0});let t=e.map(o=>({...o,updatedAt:Date.now()}));(0,_e.writeFileSync)(lr,JSON.stringify(t,null,2),"utf-8")}catch{}}function On(){if(yi)return;yi=!0;let n=j();tu(n),eu=setInterval(()=>bi(n),6e4),process.on("exit",()=>bi(n))}function j(n){return ar||(ar=new It(n)),ar}var _e,ur,_i,Zl,ql,It,cr,lr,yi,eu,ar,ue=w(()=>{"use strict";_e=require("fs"),ur=require("path"),_i=require("@wengine-ai/claude-code-router-shared"),Zl=120,ql={enabled:!0,failureThreshold:3,probeIntervalMinutes:5,halfOpenSuccessThreshold:2},It=class{states=new Map;config;probeTimer;constructor(e){this.config={...ql,...e}}getKey(e,t){return!e||!t?null:`${e},${t}`}recordSuccess(e,t){if(!this.config.enabled)return;let o=this.getKey(e,t);if(!o)return;let r=this.states.get(o);if(!r||(r.successCount++,r.rateLimitUntil&&r.rateLimitUntil>Date.now()))return;let s=!!r.rateLimitUntil;r.rateLimitUntil=void 0,r.status==="half-open"?r.successCount>=this.config.halfOpenSuccessThreshold&&(this.clearPromotionsForPrimary(e,t),this.states.delete(o)):r.status==="open"&&(r.status="half-open",r.successCount=1,r.failureCount=0),s&&r.status==="half-open"&&r.successCount>=this.config.halfOpenSuccessThreshold&&(this.clearPromotionsForPrimary(e,t),this.states.delete(o))}clearPromotionsForPrimary(e,t){try{let{getFallbackPromotionStore:o}=(An(),Ws(hi));o().clearByPrimary(e,t)}catch{}}recordFailure(e,t,o){if(!this.config.enabled)return;let r=this.getKey(e,t);if(!r)return;let s=this.states.get(r);s||(s={provider:e,model:t,status:"closed",failureCount:0,successCount:0,lastFailureTime:0,lastProbeTime:0},this.states.set(r,s)),s.failureCount++,s.lastFailureTime=Date.now(),s.lastError=o,s.status==="half-open"?(s.status="open",s.successCount=0,s.lastProbeTime=0):s.status==="closed"&&s.failureCount>=this.config.failureThreshold&&(s.status="open",s.lastProbeTime=0)}getState(e,t){let o=this.getKey(e,t);if(o)return this.states.get(o)}isAvailable(e,t,o=!1){if(!this.config.enabled)return!0;if(!this.getKey(e,t))return!1;let s=this.getState(e,t);return s?s.status==="open"&&s.rateLimitUntil?!(Date.now()<s.rateLimitUntil):s.status==="open"&&o&&Date.now()-Math.max(s.lastFailureTime,s.lastProbeTime)>=this.config.probeIntervalMinutes*6e4?(s.status="half-open",s.successCount=0,s.lastProbeTime=Date.now(),!0):s.status!=="open":!0}getPriority(e,t){if(!this.config.enabled)return 0;if(!this.getKey(e,t))return 2;let r=this.getState(e,t);if(!r)return 0;switch(r.status){case"closed":return 0;case"half-open":return 1;case"open":return 2}}getHealthyModels(){return[]}getFailPoolModels(){let e=[];for(let[t,o]of this.states)o.status==="open"&&e.push(t);return e}recordProbeAttempt(e,t){if(!this.config.enabled)return;let o=this.getKey(e,t);if(!o)return;let r=this.states.get(o);r&&(r.lastProbeTime=Date.now())}markParkedUntil(e,t,o){if(!this.config.enabled)return;let r=this.getKey(e,t);if(!r)return;let s=this.states.get(r);s&&(!Number.isFinite(o)||o<=Date.now()||s.rateLimitUntil&&s.rateLimitUntil>=o||(s.rateLimitUntil=o))}getHalfOpenModels(){let e=[];for(let[t,o]of this.states)o.status==="half-open"&&e.push(t);return e}forceOpen(e,t,o){if(!this.config.enabled)return;let r=this.getKey(e,t);if(!r)return;let s=this.states.get(r);s?(s.status="open",s.failureCount=Math.max(s.failureCount,this.config.failureThreshold),s.lastFailureTime=Date.now(),s.lastError=o,s.lastProbeTime=0):(s={provider:e,model:t,status:"open",failureCount:this.config.failureThreshold,successCount:0,lastFailureTime:Date.now(),lastProbeTime:0,lastError:o},this.states.set(r,s))}markRateLimited(e,t,o,r){if(!this.config.enabled)return;let s=this.getKey(e,t);if(!s)return;let i=this.states.get(s);i?(i.status="open",i.lastFailureTime=Date.now(),i.lastError=r||"rate-limited",i.lastProbeTime=0):(i={provider:e,model:t,status:"open",failureCount:0,successCount:0,lastFailureTime:Date.now(),lastProbeTime:0,lastError:r||"rate-limited"},this.states.set(s,i));let a=(o??Zl)*1e3;i.rateLimitUntil=Date.now()+a}getRateLimitedModels(){let e=[];for(let[t,o]of this.states)o.status==="open"&&o.rateLimitUntil&&e.push(t);return e}needsProbe(e){return Date.now()-e.lastProbeTime>=this.config.probeIntervalMinutes*60*1e3}markProbeAttempt(e,t){let o=this.getKey(e,t);if(!o)return;let r=this.states.get(o);r&&r.status==="open"&&(r.lastProbeTime=Date.now())}clear(){this.states.clear()}recover(e,t){let o=this.getKey(e,t);o&&this.states.delete(o)}getAllStates(){return Array.from(this.states.values())}restore(e){let t=this.getKey(e.provider,e.model);t&&this.states.set(t,{...e})}stopProbeTimer(){this.probeTimer&&(clearInterval(this.probeTimer),this.probeTimer=void 0)}},cr=(0,ur.join)(_i.HOME_DIR,"runtime"),lr=(0,ur.join)(cr,"provider-health.json"),yi=!1,eu=null;ar=null});function Mt(n,e,t){let o=a=>{if(t instanceof Headers)return t.get(a);let l=Object.keys(t).find(c=>c.toLowerCase()===a);return l?t[l]:null},r=dr(o,nu),s=dr(o,ou),i=dr(o,ru);(r||s||i)&&tt.set(n,{provider:n,remaining:vi(r),limit:vi(s),reset:su(i),capturedAt:Date.now()})}function Ci(n){return tt.get(n)}function In(){return Array.from(tt.values())}function dr(n,e){for(let t of e){let o=n(t);if(o)return o}return null}function vi(n){if(!n)return null;let e=Number(n.trim().replace(/,/g,""));return Number.isFinite(e)?e:null}function su(n){if(!n)return null;let e=n.trim();if(!e)return null;let t=Number(e);if(Number.isFinite(t))return t>1e12?Math.floor(t/1e3):t>1e9?Math.floor(t):Math.floor(Date.now()/1e3+t);let o=Date.parse(e);if(Number.isFinite(o))return Math.floor(o/1e3);let r=iu(e);return r===null?null:Math.floor((Date.now()+r)/1e3)}function iu(n){let e=/(\d+(?:\.\d+)?)(ms|s|m|h|d)/gi,t=0,o=!1;for(let r of n.matchAll(e)){o=!0;let s=Number(r[1]),i=r[2].toLowerCase();if(Number.isFinite(s))switch(i){case"ms":t+=s;break;case"s":t+=s*1e3;break;case"m":t+=s*60*1e3;break;case"h":t+=s*60*60*1e3;break;case"d":t+=s*24*60*60*1e3;break}}return o?t:null}function au(){try{if(!(0,ke.existsSync)(fr))return;let n=JSON.parse((0,ke.readFileSync)(fr,"utf-8"));if(!Array.isArray(n))return;let e=Date.now();for(let t of n)if(t&&t.provider){if(t.capturedAt&&e-t.capturedAt>3600*1e3)continue;tt.set(t.provider,t)}}catch{}}function xi(){try{if(tt.size===0)return;(0,ke.existsSync)(pr)||(0,ke.mkdirSync)(pr,{recursive:!0}),(0,ke.writeFileSync)(fr,JSON.stringify(Array.from(tt.values()),null,2),"utf-8")}catch{}}function nt(){ki||(ki=!0,au(),Ti=setInterval(xi,6e4),Ti.unref?.(),process.on("exit",xi))}var ke,mr,Si,pr,fr,tt,ki,Ti,nu,ou,ru,ot=w(()=>{"use strict";ke=require("fs"),mr=require("path"),Si=require("@wengine-ai/claude-code-router-shared"),pr=(0,mr.join)(Si.HOME_DIR,"runtime"),fr=(0,mr.join)(pr,"rate-limit.json"),tt=new Map,ki=!1,Ti=null,nu=["x-ratelimit-remaining-tokens","x-ratelimit-remaining-requests","x-ratelimit-remaining"],ou=["x-ratelimit-limit-tokens","x-ratelimit-limit-requests","x-ratelimit-limit"],ru=["x-ratelimit-reset-tokens","x-ratelimit-reset-requests","x-ratelimit-reset"]});function Ln(){return gr||(gr=new yr),gr}function _r(){return hr||(hr=new br),hr}function cu(n){return n?.sessionId||n?.clientContext?.stableSessionId||void 0}function Ri(n){let e=cu(n);if(!e)return"";let t=typeof n?.modelFamily=="string"?n.modelFamily:"",o=typeof n?.scenarioType=="string"&&n.scenarioType?n.scenarioType:"default";return`${e}:${t}:${o}`}function wi(n,e){let t=Ln(),o=n?.[Mn];if(o&&!o.released){if(o.key===e)return;t.release(o)}n[Mn]=t.acquire(e)}function kr(n){let e=n?.[Mn];e&&Ln().release(e)}function Pi(n,e){let t=Ri(n),o=n?.[Mn],r=t?_r().get(t)!==void 0:!1;!o&&!r||(t&&_r().bind(t,e),wi(n,e))}function lu(n,e,t){let o=Ln(),r=null,s=1/0;for(let i of e){if(!i||typeof i!="string")continue;let a=t(i);if(!a||a===n)continue;let l=o.count(a);l<s&&(r=a,s=l)}return r}function Ei(n,e,t){let o=Ri(n),r=_r(),s=Ln(),i=Number.isFinite(t.threshold)&&t.threshold>0?Math.floor(t.threshold):3,a;if(o){let l=r.get(o);if(l&&l!==e){let c=t.resolve(l);c?(a=c,t.log?.(`Concurrency priority: session slot ${o} sticking to bound model ${c}`)):r.unbind(o)}else l&&(a=e)}if(!a){let l=s.count(e);if(l>=i){let c=lu(e,t.fallbackModels,t.resolve);c&&(a=c,t.log?.(`Concurrency priority: model ${e} has ${l} in-flight request(s) (>= ${i}); assigning ${o?`session slot ${o} `:"request "}to overflow model ${c}`))}a=a||e,o&&r.bind(o,a)}return wi(n,a),a}var yr,br,gr,hr,Mn,$n=w(()=>{"use strict";yr=class{leases=new Map;nextId=1;acquire(e){let t={id:this.nextId++,key:e,createdAt:Date.now(),released:!1};return this.leases.set(t.id,t),t}release(e){!e||e.released||(e.released=!0,this.leases.delete(e.id))}prune(){let e=Date.now();for(let[t,o]of this.leases)e-o.createdAt>18e5&&this.leases.delete(t)}count(e){this.prune();let t=0;for(let o of this.leases.values())o.key===e&&t++;return t}clear(){this.leases.clear()}},br=class{bindings=new Map;get(e){let t=this.bindings.get(e);if(t){if(Date.now()-t.updatedAt>864e5){this.bindings.delete(e);return}return t.updatedAt=Date.now(),this.bindings.delete(e),this.bindings.set(e,t),t.modelKey}}bind(e,t){for(this.bindings.delete(e),this.bindings.set(e,{modelKey:t,updatedAt:Date.now()});this.bindings.size>2e3;){let o=this.bindings.keys().next().value;if(o===void 0)break;this.bindings.delete(o)}}unbind(e){this.bindings.delete(e)}clear(){this.bindings.clear()}},gr=null,hr=null;Mn="__concurrencyLease"});async function U(n){let e=await n.text();return uu(e,n.status)}function uu(n,e){let t=n.replace(/^/,"").trim();try{return JSON.parse(t)}catch{let o=t.length>200?`${t.slice(0,200)}...`:t,r=e!==void 0?` (HTTP ${e})`:"";throw new Error(`Upstream returned a non-JSON response${r}: ${o||"(empty body)"}`)}}function Ai(n){return(n.headers.get("Content-Type")||"").includes("text/event-stream")}function Lt(n){return/^\s*(event:|data:|:\s*[A-Z])/m.test(n)||n.startsWith("data:")}async function Te(n){if(!n.body||n.body.locked)return null;let[e,t]=n.body.tee(),o=e.getReader(),r=new TextDecoder,s="";try{for(let i=0;i<8;i++){let{value:a,done:l}=await o.read();if(l||(a&&(s+=r.decode(a,{stream:!0})),Lt(s))||/^\s*[\[{]/.test(s))break}s+=r.decode()}finally{o.releaseLock()}return e.cancel().catch(()=>{}),{body:t,isSSE:Lt(s)}}async function Pe(n){try{let e=await n.text();if(Lt(e)){let o=new TextEncoder,r=new ReadableStream({start(s){s.enqueue(o.encode(e)),s.close()}});return{response:new Response(r,{status:n.status,statusText:n.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}}),isSSE:!0}}return{response:new Response(e,{status:n.status,statusText:n.statusText,headers:n.headers}),isSSE:!1}}catch{return{response:n,isSSE:!1}}}var ne=w(()=>{"use strict"});var rt,Tr=w(()=>{"use strict";ne();rt=class{name="openai-responses";endPoint="/v1/responses";getCacheReadInputTokens(e){return e?.cache_read_input_tokens??e?.input_tokens_details?.cached_tokens??e?.prompt_tokens_details?.cached_tokens??0}getCacheCreationInputTokens(e){return e?.cache_creation_input_tokens??e?.input_tokens_details?.cache_creation_tokens??e?.input_tokens_details?.cache_write_tokens??e?.prompt_tokens_details?.cache_creation_tokens??e?.prompt_tokens_details?.cache_write_tokens??0}buildResponsesUsage(e){let t=e?.input_tokens??e?.prompt_tokens??0,o=e?.output_tokens??e?.completion_tokens??0,r=this.getCacheReadInputTokens(e),s=this.getCacheCreationInputTokens(e);return{input_tokens:t,output_tokens:o,total_tokens:e?.total_tokens??t+o,input_tokens_details:{cached_tokens:r,cache_creation_tokens:s},output_tokens_details:{reasoning_tokens:e?.output_tokens_details?.reasoning_tokens??0},cache_read_input_tokens:r,cache_creation_input_tokens:s}}async transformRequestIn(e){delete e.temperature,delete e.max_tokens,e.reasoning&&(e.reasoning={effort:e.reasoning.effort,summary:e.reasoning.summary||"auto"});let t=[],o=e.messages.filter(r=>r.role==="system");if(o.length>0){let r=o[0];Array.isArray(r.content)?r.content.forEach(s=>{let i="";typeof s=="string"?i=s:s&&typeof s=="object"&&"text"in s&&(i=s.text),t.push({role:"system",content:i})}):e.instructions=r.content}if(e.messages.forEach(r=>{if(r.role!=="system"){if(Array.isArray(r.content)){let s=r.content.map(i=>this.normalizeRequestContent(i,r.role)).filter(i=>i!==null);s.length>0?r.content=s:delete r.content}if(r.role==="tool"){let s={...r};s.type="function_call_output",s.call_id=r.tool_call_id,s.output=r.content,delete s.cache_control,delete s.role,delete s.tool_call_id,delete s.content,t.push(s);return}if(r.role==="assistant"&&Array.isArray(r.tool_calls)){r.tool_calls.forEach(s=>{t.push({type:"function_call",arguments:s.function.arguments,name:s.function.name,call_id:s.id})});return}t.push(r)}}),e.input=t,delete e.messages,Array.isArray(e.tools)){let r=e.tools.find(s=>s.function.name==="web_search");e.tools=e.tools.filter(s=>s.function.name!=="web_search").map(s=>(s.function.name==="WebSearch"&&delete s.function.parameters.properties.allowed_domains,s.function.name==="Edit"?{type:s.type,name:s.function.name,description:s.function.description,parameters:{...s.function.parameters,required:["file_path","old_string","new_string","replace_all"]},strict:!0}:{type:s.type,name:s.function.name,description:s.function.description,parameters:s.function.parameters})),r&&e.tools.push({type:"web_search"})}return e.parallel_tool_calls=!1,e}async transformResponseOut(e){let t=e.headers.get("Content-Type")||"";if(!t.includes("text/event-stream")&&!t.includes("application/json")&&e.body){let o=await Te(e);if(o?.isSSE&&o.body){let r=new Response(o.body,{status:e.status,statusText:e.statusText,headers:new Headers({...Object.fromEntries(e.headers.entries()),"content-type":"text/event-stream"})});return this.transformResponseOut(r)}o?.body&&(e=new Response(o.body,{status:e.status,statusText:e.statusText,headers:e.headers}))}if(t.includes("application/json")){let o=await Te(e);if(o?.isSSE&&o.body){let r=new Response(o.body,{status:e.status,statusText:e.statusText,headers:new Headers({...Object.fromEntries(e.headers.entries()),"content-type":"text/event-stream"})});return this.transformResponseOut(r)}if(o?.body)e=new Response(o.body,{status:e.status,statusText:e.statusText,headers:e.headers});else if(o===null){let r=await Pe(e);if(r.isSSE)return this.transformResponseOut(r.response);e=r.response}}if(t.includes("application/json")){let o=await U(e);if(o.object==="response"&&o.output){let r=this.convertResponseToChat(o);return new Response(JSON.stringify(r),{status:e.status,statusText:e.statusText,headers:e.headers})}return o.type==="message"&&Array.isArray(o.content)?new Response(JSON.stringify(o),{status:e.status,statusText:e.statusText,headers:e.headers}):new Response(JSON.stringify(o),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(t.includes("text/event-stream")){if(!e.body)return e;let[o,r]=e.body.tee(),s=o.getReader(),i="";try{let{value:f,done:h}=await s.read();!h&&f&&(i=new TextDecoder().decode(f))}finally{s.releaseLock()}if(o.cancel().catch(()=>{}),i.includes("message_start")||i.includes("content_block_start"))return new Response(r,{status:e.status,statusText:e.statusText,headers:e.headers});if(i.includes("response.created")||i.includes("response.output_text.delta")||i.includes("response.in_progress")||i.includes("response.output_item.added"))return new Response(r,{status:e.status,statusText:e.statusText,headers:e.headers});let c=new TextDecoder,u=new TextEncoder,p="",d=!1,m=this,g=new ReadableStream({async start(f){let h=r.getReader(),b=-1,_="",y=k=>(k!==_&&(b++,_=k),b);try{for(;;){let{done:k,value:v}=await h.read();if(k){d||f.enqueue(u.encode(`data: [DONE]
|
|
4
|
+
`)){let r=o.trim();if(!(!r.startsWith("data:")&&!r.startsWith("event:"))){if(Jl.some(s=>r.includes(s))){e=!0;break}Kl.some(s=>r.includes(s))&&(t=!0)}}return e||Wl(n)?"content":t?"empty":"pending"}async function li(n,e=65536,t=1e4){let o=n.getReader(),r=new TextDecoder,s=[],i="",a=0,l=Date.now()+t,c=(u,p)=>({verdict:u,chunks:s,bytes:a,rest:p});try{for(;;){let u=l-Date.now(),p=Symbol("timeout"),d,m=o.read(),g=u<=0?p:await Promise.race([m,new Promise(h=>{d=setTimeout(()=>h(p),u)})]);if(d&&clearTimeout(d),g===p)return c(qo(i)==="content"?"content":"pending",wn(o,m));if(g.done){i+=r.decode();let h=qo(i);return c(h==="empty"?"empty":"pending",null)}if(!g.value)continue;s.push(g.value),a+=g.value.byteLength,i+=r.decode(g.value,{stream:!0});let f=qo(i);if(f==="content")return c("content",wn(o));if(f==="empty")return await o.cancel().catch(()=>{}),c("empty",null);if(ci(i)||a>=e)return c("pending",wn(o))}}catch(u){throw await o.cancel().catch(()=>{}),u}}function wn(n,e){return new ReadableStream({start(t){let o=e,r=()=>{let s=o??n.read();o=void 0,s.then(({done:i,value:a})=>{i?t.close():(t.enqueue(a),r())}).catch(i=>t.error(i))};r()},cancel(t){return n.cancel(t)}})}function ui(n,e){let t=e?.getReader();return new ReadableStream({start(o){for(let s of n)o.enqueue(s);if(!t){o.close();return}let r=()=>{t.read().then(({done:s,value:i})=>{s?o.close():(o.enqueue(i),r())}).catch(s=>o.error(s))};r()},cancel(o){return t?.cancel(o)}})}var Jl,Kl,di=w(()=>{"use strict";Jl=["content_block_start","content_block_delta","content_block_stop"];Kl=["message_stop","response.completed","response.incomplete","[DONE]"]});function Gl(n,e){return`${n.name}|${e?.name??""}`}function er(n){return n.__ccrPluginRequestState??={budgets:new Map}}function qe(n,e,t){let o=er(n),r=Gl(e,t),s=o.budgets.get(r);return s||(s={refreshUsed:!1},o.budgets.set(r,s)),s}function tr(n,e,t,o){return!e||t?.nonRetryable!==!0?!1:(qe(n,e,o).terminalError=t,!0)}var pi=w(()=>{"use strict"});var nr=w(()=>{"use strict"});function mi(n,e){let t=new Error(e.message);return t.code=e.code,t.statusCode=e.httpStatus,e.cooldownMs&&(t.cooldownMs=e.cooldownMs),e.validationUrl&&(t.validationUrl=e.validationUrl),t.plugin=n,t.nonRetryable=!e.retryable,t.pluginClassified=!0,t}var fi,Ot,Vl,rr,Pn=w(()=>{"use strict";fi=q(require("fastify"),1);nr();Ot=class{plugins=new Map;transformerServices=new Set;disposed=!1;revision=0;attachTransformerService(e){this.assertOpen();let t=[...this.plugins.values()].flatMap(r=>[...r.transformers].map(([s,i])=>{if(e.hasTransformer(s))throw new Error(`transformer "${s}" is already registered`);return[s,e.preparePluginTransformer(i)]})),o=[];try{for(let[r,s]of t)o.push(r),e.registerTransformer(r,s);this.transformerServices.add(e)}catch(r){for(let s of o)e.removeTransformer(s);throw r}}beginActivation(e,t,o,r){if(this.assertOpen(),this.plugins.has(e.name))throw new Error(`plugin "${e.name}" is already registered`);let s={manifest:{...e},directory:r,runtimes:new Map,transformers:new Map,protectors:[],routes:[],preparedRoutes:[]},i="staging",a,l=u=>{try{if(this.assertOpen(),i!=="staging")throw new Error("plugin activation is no longer open");u()}catch(p){throw a=p,p}};return{context:{manifest:s.manifest,log:t,host:o,registerTransformer:u=>l(()=>{let p=typeof u.TransformerName=="string"?u.TransformerName:new u().name;if(typeof p!="string"||!p)throw new Error("plugin transformer has no name");if(s.transformers.has(p))throw new Error(`transformer "${p}" is already registered`);s.transformers.set(p,u)}),registerManagedRuntime:u=>l(()=>{if(!u.name||typeof u.isManaged!="function"||typeof u.signRequest!="function")throw new Error("invalid managed runtime");if(s.runtimes.has(u.name))throw new Error(`managed runtime "${u.name}" is already registered`);s.runtimes.set(u.name,u)}),registerAdminRoutes:u=>l(()=>{s.routes.push(u)}),registerConfigProtector:u=>l(()=>{s.protectors.push(u)}),registerUiCard:u=>l(()=>{if(s.cardPath)throw new Error("plugin card is already registered");if(!/^[A-Za-z0-9][A-Za-z0-9._-]*\.js$/.test(u.cardPath))throw new Error("card must be a single JavaScript file");s.cardPath=u.cardPath}),registerLocales:u=>l(()=>{s.locales=u})},commit:async(u,p)=>{this.assertOpen();let d=this.revision;if(s.routes.length){if(!p)throw new Error("plugin admin routes require a host app");s.preparedRoutes=await this.prepareRoutes(s.routes,p)}if(this.assertOpen(),this.revision!==d)throw new Error("plugin registry changed during activation; retry activation");if(i!=="staging")throw new Error("plugin activation is no longer open");if(a)throw a;if(this.plugins.has(e.name))throw new Error(`plugin "${e.name}" is already registered`);for(let f of this.plugins.values()){for(let h of s.runtimes.keys())if(f.runtimes.has(h))throw new Error(`managed runtime "${h}" is already registered`);for(let h of s.transformers.keys())if(f.transformers.has(h))throw new Error(`transformer "${h}" is already registered`)}let m=[...this.transformerServices].flatMap(f=>[...s.transformers].map(([h,b])=>{if(f.hasTransformer(h))throw new Error(`transformer "${h}" is already registered`);return{service:f,name:h,value:f.preparePluginTransformer(b)}})),g=[];try{for(let f of m)g.push(f),f.service.registerTransformer(f.name,f.value);s.card=u,this.plugins.set(e.name,s),this.revision++,i="committed"}catch(f){for(let h of g)h.service.removeTransformer(h.name);throw i="aborted",f}},get cardPath(){return s.cardPath},abort:()=>{i="aborted"}}}getManagedRuntimeFor(e){for(let t of this.plugins.values())for(let o of t.runtimes.values())try{if(o.isManaged(e))return o}catch{}}getRegisteredRuntimes(){return[...this.plugins.values()].flatMap(e=>[...e.runtimes.values()])}applyConfigProtectors(e,t){for(let o of this.plugins.values())for(let r of o.protectors)r(e,t)}listLoadedPlugins(){return[...this.plugins.values()].map(e=>({name:e.manifest.name,version:e.manifest.version,enabled:!0,...e.card?{cardUrl:`/plugins/${e.manifest.name}/${e.cardPath}`}:{},...e.locales?{locales:e.locales}:{}}))}getPublicCard(e,t){let o=this.plugins.get(e);return o?.cardPath===t&&o.card?Buffer.from(o.card):void 0}async prepareRoutes(e,t){let o=new Set(["get","post","put","patch","delete","head","options","all"]),r=[],s=new Proxy(t,{get:(a,l)=>{if(l==="route")return u=>(r.push(u),s);if(o.has(String(l)))return(u,p,d)=>(r.push({...typeof p=="function"?{}:p,method:l==="all"?["DELETE","GET","HEAD","PATCH","POST","PUT","OPTIONS"]:String(l).toUpperCase(),url:u,handler:d??p}),s);let c=Reflect.get(a,l);return typeof c=="function"?()=>{throw new Error(`plugin route registration cannot call ${String(l)}`)}:c}}),i=(0,fi.default)({logger:!1});try{for(let a of e){let l=a(s);l!==s&&await l}for(let a of this.plugins.values())for(let l of a.preparedRoutes)i.route(l);for(let a of r){let l=Array.isArray(a.method)?a.method:[a.method];for(let c of l)if(t.hasRoute({method:c,url:a.url,constraints:a.constraints}))throw new Error(`plugin route ${c} ${a.url} is already registered`);i.route(a)}return await i.ready(),r}finally{await i.close()}}async registerAllRoutes(e){this.assertOpen();for(let t of this.plugins.values())for(let o of t.preparedRoutes)e.route(o)}dispose(){if(!this.disposed){for(let e of this.transformerServices)for(let t of this.plugins.values())for(let o of t.transformers.keys())e.removeTransformer(o);this.plugins.clear(),this.transformerServices.clear(),this.disposed=!0}}assertOpen(){if(this.disposed)throw new Error("plugin host is disposed")}},Vl=new Ot,rr=()=>Vl});async function He(n,e,t,o,r){let s;try{s=n.classifyError?.(e,t,o)}catch{}let i=s&&/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,95}$/.test(s.code)?s.code:"plugin_upstream_error",a=s?{...s,code:i,message:`Provider plugin request failed (${i}).`}:{code:i,message:"Provider plugin returned an invalid upstream response.",httpStatus:e>=400&&e<=599?e:502,retryable:e===0||e>=500};try{await n.noteUpstreamError?.(a)}catch{}let l=mi(n.name,a);return l.isRateLimit=a.httpStatus===429,l.upstreamStatus=e,r?.errorName&&(l.upstreamErrorName=r.errorName),l}var gi=w(()=>{"use strict";Pn()});var En,sr=w(()=>{En="2.3.2418"});var hi={};bn(hi,{getFallbackPromotionStore:()=>et,resetFallbackPromotionStore:()=>Xl});function et(n){return ze||(ze=new ir,n&&ze.configure(n)),ze}function Xl(){ze&&(ze.clearAll(),ze=null)}var Yl,ir,ze,An=w(()=>{"use strict";ue();Yl=600*1e3,ir=class{promotions=new Map;enabled=!0;ttlMs=Yl;configure(e){e?.enabled!==void 0&&(this.enabled=e.enabled),e?.ttlMinutes!==void 0&&(this.ttlMs=e.ttlMinutes*60*1e3)}getKey(e,t,o){return`${e},${t}:${o}`}promote(e,t,o,r,s,i){if(!this.enabled)return;let a=this.getKey(e,t,o),l=`${r},${s}`;this.promotions.set(a,{promotedModel:l,timestamp:Date.now(),ttlMs:i??this.ttlMs})}getPromotion(e,t,o,r){if(!this.enabled)return null;let s=this.getKey(e,t,o),i=this.promotions.get(s);if(!i)return null;if(Date.now()-i.timestamp>=i.ttlMs)return this.promotions.delete(s),null;let[l,...c]=i.promotedModel.split(","),u=c.join(",");if(!j().isAvailable(l,u))return this.promotions.delete(s),null;let d=r.find(g=>g.name.toLowerCase()===l.toLowerCase()),m=d?.models?.find(g=>String(g).toLowerCase()===u.toLowerCase());return!d||!m||d.enabled===!1?(this.promotions.delete(s),null):`${d.name},${m}`}clear(e,t,o){let r=this.getKey(e,t,o);this.promotions.delete(r)}clearByPrimary(e,t){let o=`${e},${t}:`,r=0;for(let s of this.promotions.keys())s.startsWith(o)&&(this.promotions.delete(s),r++);return r}clearAll(){this.promotions.clear()}clearExpired(){let e=Date.now();for(let[t,o]of this.promotions)e-o.timestamp>=o.ttlMs&&this.promotions.delete(t)}getAllPromotions(){let e=Date.now(),t=[];for(let[o,r]of this.promotions){let s=r.ttlMs-(e-r.timestamp);s>0&&t.push({key:o,promotedModel:r.promotedModel,remainingMs:s})}return t}},ze=null});function tu(n){try{if(!(0,_e.existsSync)(lr))return;let e=JSON.parse((0,_e.readFileSync)(lr,"utf-8"));if(!Array.isArray(e))return;let t=Date.now();for(let o of e){if(!o||!o.provider||!o.model)continue;let r=o.updatedAt||o.lastFailureTime||0;r&&t-r>1440*60*1e3||n.restore({provider:o.provider,model:o.model,status:o.status,failureCount:o.failureCount??0,successCount:o.successCount??0,lastFailureTime:o.lastFailureTime??0,lastProbeTime:o.lastProbeTime??0,lastError:o.lastError,rateLimitUntil:o.rateLimitUntil})}}catch{}}function bi(n){try{let e=n.getAllStates();if(e.length===0)return;(0,_e.existsSync)(cr)||(0,_e.mkdirSync)(cr,{recursive:!0});let t=e.map(o=>({...o,updatedAt:Date.now()}));(0,_e.writeFileSync)(lr,JSON.stringify(t,null,2),"utf-8")}catch{}}function On(){if(yi)return;yi=!0;let n=j();tu(n),eu=setInterval(()=>bi(n),6e4),process.on("exit",()=>bi(n))}function j(n){return ar||(ar=new It(n)),ar}var _e,ur,_i,Zl,ql,It,cr,lr,yi,eu,ar,ue=w(()=>{"use strict";_e=require("fs"),ur=require("path"),_i=require("@wengine-ai/claude-code-router-shared"),Zl=120,ql={enabled:!0,failureThreshold:3,probeIntervalMinutes:5,halfOpenSuccessThreshold:2},It=class{states=new Map;config;probeTimer;constructor(e){this.config={...ql,...e}}getKey(e,t){return!e||!t?null:`${e},${t}`}recordSuccess(e,t){if(!this.config.enabled)return;let o=this.getKey(e,t);if(!o)return;let r=this.states.get(o);if(!r||(r.successCount++,r.rateLimitUntil&&r.rateLimitUntil>Date.now()))return;let s=!!r.rateLimitUntil;r.rateLimitUntil=void 0,r.status==="half-open"?r.successCount>=this.config.halfOpenSuccessThreshold&&(this.clearPromotionsForPrimary(e,t),this.states.delete(o)):r.status==="open"&&(r.status="half-open",r.successCount=1,r.failureCount=0),s&&r.status==="half-open"&&r.successCount>=this.config.halfOpenSuccessThreshold&&(this.clearPromotionsForPrimary(e,t),this.states.delete(o))}clearPromotionsForPrimary(e,t){try{let{getFallbackPromotionStore:o}=(An(),Ws(hi));o().clearByPrimary(e,t)}catch{}}recordFailure(e,t,o){if(!this.config.enabled)return;let r=this.getKey(e,t);if(!r)return;let s=this.states.get(r);s||(s={provider:e,model:t,status:"closed",failureCount:0,successCount:0,lastFailureTime:0,lastProbeTime:0},this.states.set(r,s)),s.failureCount++,s.lastFailureTime=Date.now(),s.lastError=o,s.status==="half-open"?(s.status="open",s.successCount=0,s.lastProbeTime=0):s.status==="closed"&&s.failureCount>=this.config.failureThreshold&&(s.status="open",s.lastProbeTime=0)}getState(e,t){let o=this.getKey(e,t);if(o)return this.states.get(o)}isAvailable(e,t,o=!1){if(!this.config.enabled)return!0;if(!this.getKey(e,t))return!1;let s=this.getState(e,t);return s?s.status==="open"&&s.rateLimitUntil?!(Date.now()<s.rateLimitUntil):s.status==="open"&&o&&Date.now()-Math.max(s.lastFailureTime,s.lastProbeTime)>=this.config.probeIntervalMinutes*6e4?(s.status="half-open",s.successCount=0,s.lastProbeTime=Date.now(),!0):s.status!=="open":!0}getPriority(e,t){if(!this.config.enabled)return 0;if(!this.getKey(e,t))return 2;let r=this.getState(e,t);if(!r)return 0;switch(r.status){case"closed":return 0;case"half-open":return 1;case"open":return 2}}getHealthyModels(){return[]}getFailPoolModels(){let e=[];for(let[t,o]of this.states)o.status==="open"&&e.push(t);return e}recordProbeAttempt(e,t){if(!this.config.enabled)return;let o=this.getKey(e,t);if(!o)return;let r=this.states.get(o);r&&(r.lastProbeTime=Date.now())}markParkedUntil(e,t,o){if(!this.config.enabled)return;let r=this.getKey(e,t);if(!r)return;let s=this.states.get(r);s&&(!Number.isFinite(o)||o<=Date.now()||s.rateLimitUntil&&s.rateLimitUntil>=o||(s.rateLimitUntil=o))}getHalfOpenModels(){let e=[];for(let[t,o]of this.states)o.status==="half-open"&&e.push(t);return e}forceOpen(e,t,o){if(!this.config.enabled)return;let r=this.getKey(e,t);if(!r)return;let s=this.states.get(r);s?(s.status="open",s.failureCount=Math.max(s.failureCount,this.config.failureThreshold),s.lastFailureTime=Date.now(),s.lastError=o,s.lastProbeTime=0):(s={provider:e,model:t,status:"open",failureCount:this.config.failureThreshold,successCount:0,lastFailureTime:Date.now(),lastProbeTime:0,lastError:o},this.states.set(r,s))}markRateLimited(e,t,o,r){if(!this.config.enabled)return;let s=this.getKey(e,t);if(!s)return;let i=this.states.get(s);i?(i.status="open",i.lastFailureTime=Date.now(),i.lastError=r||"rate-limited",i.lastProbeTime=0):(i={provider:e,model:t,status:"open",failureCount:0,successCount:0,lastFailureTime:Date.now(),lastProbeTime:0,lastError:r||"rate-limited"},this.states.set(s,i));let a=(o??Zl)*1e3;i.rateLimitUntil=Date.now()+a}getRateLimitedModels(){let e=[];for(let[t,o]of this.states)o.status==="open"&&o.rateLimitUntil&&e.push(t);return e}needsProbe(e){return Date.now()-e.lastProbeTime>=this.config.probeIntervalMinutes*60*1e3}markProbeAttempt(e,t){let o=this.getKey(e,t);if(!o)return;let r=this.states.get(o);r&&r.status==="open"&&(r.lastProbeTime=Date.now())}clear(){this.states.clear()}recover(e,t){let o=this.getKey(e,t);o&&this.states.delete(o)}getAllStates(){return Array.from(this.states.values())}restore(e){let t=this.getKey(e.provider,e.model);t&&this.states.set(t,{...e})}stopProbeTimer(){this.probeTimer&&(clearInterval(this.probeTimer),this.probeTimer=void 0)}},cr=(0,ur.join)(_i.HOME_DIR,"runtime"),lr=(0,ur.join)(cr,"provider-health.json"),yi=!1,eu=null;ar=null});function Mt(n,e,t){let o=a=>{if(t instanceof Headers)return t.get(a);let l=Object.keys(t).find(c=>c.toLowerCase()===a);return l?t[l]:null},r=dr(o,nu),s=dr(o,ou),i=dr(o,ru);(r||s||i)&&tt.set(n,{provider:n,remaining:vi(r),limit:vi(s),reset:su(i),capturedAt:Date.now()})}function Ci(n){return tt.get(n)}function In(){return Array.from(tt.values())}function dr(n,e){for(let t of e){let o=n(t);if(o)return o}return null}function vi(n){if(!n)return null;let e=Number(n.trim().replace(/,/g,""));return Number.isFinite(e)?e:null}function su(n){if(!n)return null;let e=n.trim();if(!e)return null;let t=Number(e);if(Number.isFinite(t))return t>1e12?Math.floor(t/1e3):t>1e9?Math.floor(t):Math.floor(Date.now()/1e3+t);let o=Date.parse(e);if(Number.isFinite(o))return Math.floor(o/1e3);let r=iu(e);return r===null?null:Math.floor((Date.now()+r)/1e3)}function iu(n){let e=/(\d+(?:\.\d+)?)(ms|s|m|h|d)/gi,t=0,o=!1;for(let r of n.matchAll(e)){o=!0;let s=Number(r[1]),i=r[2].toLowerCase();if(Number.isFinite(s))switch(i){case"ms":t+=s;break;case"s":t+=s*1e3;break;case"m":t+=s*60*1e3;break;case"h":t+=s*60*60*1e3;break;case"d":t+=s*24*60*60*1e3;break}}return o?t:null}function au(){try{if(!(0,ke.existsSync)(fr))return;let n=JSON.parse((0,ke.readFileSync)(fr,"utf-8"));if(!Array.isArray(n))return;let e=Date.now();for(let t of n)if(t&&t.provider){if(t.capturedAt&&e-t.capturedAt>3600*1e3)continue;tt.set(t.provider,t)}}catch{}}function xi(){try{if(tt.size===0)return;(0,ke.existsSync)(pr)||(0,ke.mkdirSync)(pr,{recursive:!0}),(0,ke.writeFileSync)(fr,JSON.stringify(Array.from(tt.values()),null,2),"utf-8")}catch{}}function nt(){ki||(ki=!0,au(),Ti=setInterval(xi,6e4),Ti.unref?.(),process.on("exit",xi))}var ke,mr,Si,pr,fr,tt,ki,Ti,nu,ou,ru,ot=w(()=>{"use strict";ke=require("fs"),mr=require("path"),Si=require("@wengine-ai/claude-code-router-shared"),pr=(0,mr.join)(Si.HOME_DIR,"runtime"),fr=(0,mr.join)(pr,"rate-limit.json"),tt=new Map,ki=!1,Ti=null,nu=["x-ratelimit-remaining-tokens","x-ratelimit-remaining-requests","x-ratelimit-remaining"],ou=["x-ratelimit-limit-tokens","x-ratelimit-limit-requests","x-ratelimit-limit"],ru=["x-ratelimit-reset-tokens","x-ratelimit-reset-requests","x-ratelimit-reset"]});function Ln(){return gr||(gr=new yr),gr}function _r(){return hr||(hr=new br),hr}function cu(n){return n?.sessionId||n?.clientContext?.stableSessionId||void 0}function Ri(n){let e=cu(n);if(!e)return"";let t=typeof n?.modelFamily=="string"?n.modelFamily:"",o=typeof n?.scenarioType=="string"&&n.scenarioType?n.scenarioType:"default";return`${e}:${t}:${o}`}function wi(n,e){let t=Ln(),o=n?.[Mn];if(o&&!o.released){if(o.key===e)return;t.release(o)}n[Mn]=t.acquire(e)}function kr(n){let e=n?.[Mn];e&&Ln().release(e)}function Pi(n,e){let t=Ri(n),o=n?.[Mn],r=t?_r().get(t)!==void 0:!1;!o&&!r||(t&&_r().bind(t,e),wi(n,e))}function lu(n,e,t){let o=Ln(),r=null,s=1/0;for(let i of e){if(!i||typeof i!="string")continue;let a=t(i);if(!a||a===n)continue;let l=o.count(a);l<s&&(r=a,s=l)}return r}function Ei(n,e,t){let o=Ri(n),r=_r(),s=Ln(),i=Number.isFinite(t.threshold)&&t.threshold>0?Math.floor(t.threshold):3,a;if(o){let l=r.get(o);if(l&&l!==e){let c=t.resolve(l);c?(a=c,t.log?.(`Concurrency priority: session slot ${o} sticking to bound model ${c}`)):r.unbind(o)}else l&&(a=e)}if(!a){let l=s.count(e);if(l>=i){let c=lu(e,t.fallbackModels,t.resolve);c&&(a=c,t.log?.(`Concurrency priority: model ${e} has ${l} in-flight request(s) (>= ${i}); assigning ${o?`session slot ${o} `:"request "}to overflow model ${c}`))}a=a||e,o&&r.bind(o,a)}return wi(n,a),a}var yr,br,gr,hr,Mn,$n=w(()=>{"use strict";yr=class{leases=new Map;nextId=1;acquire(e){let t={id:this.nextId++,key:e,createdAt:Date.now(),released:!1};return this.leases.set(t.id,t),t}release(e){!e||e.released||(e.released=!0,this.leases.delete(e.id))}prune(){let e=Date.now();for(let[t,o]of this.leases)e-o.createdAt>18e5&&this.leases.delete(t)}count(e){this.prune();let t=0;for(let o of this.leases.values())o.key===e&&t++;return t}clear(){this.leases.clear()}},br=class{bindings=new Map;get(e){let t=this.bindings.get(e);if(t){if(Date.now()-t.updatedAt>864e5){this.bindings.delete(e);return}return t.updatedAt=Date.now(),this.bindings.delete(e),this.bindings.set(e,t),t.modelKey}}bind(e,t){for(this.bindings.delete(e),this.bindings.set(e,{modelKey:t,updatedAt:Date.now()});this.bindings.size>2e3;){let o=this.bindings.keys().next().value;if(o===void 0)break;this.bindings.delete(o)}}unbind(e){this.bindings.delete(e)}clear(){this.bindings.clear()}},gr=null,hr=null;Mn="__concurrencyLease"});async function U(n){let e=await n.text();return uu(e,n.status)}function uu(n,e){let t=n.replace(/^/,"").trim();try{return JSON.parse(t)}catch{let o=t.length>200?`${t.slice(0,200)}...`:t,r=e!==void 0?` (HTTP ${e})`:"";throw new Error(`Upstream returned a non-JSON response${r}: ${o||"(empty body)"}`)}}function Ai(n){return(n.headers.get("Content-Type")||"").includes("text/event-stream")}function Lt(n){return/^\s*(event:|data:|:\s*[A-Z])/m.test(n)||n.startsWith("data:")}async function Te(n){if(!n.body||n.body.locked)return null;let[e,t]=n.body.tee(),o=e.getReader(),r=new TextDecoder,s="";try{for(let i=0;i<8;i++){let{value:a,done:l}=await o.read();if(l||(a&&(s+=r.decode(a,{stream:!0})),Lt(s))||/^\s*[\[{]/.test(s))break}s+=r.decode()}finally{o.releaseLock()}return e.cancel().catch(()=>{}),{body:t,isSSE:Lt(s)}}async function Pe(n){try{let e=await n.text();if(Lt(e)){let o=new TextEncoder,r=new ReadableStream({start(s){s.enqueue(o.encode(e)),s.close()}});return{response:new Response(r,{status:n.status,statusText:n.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}}),isSSE:!0}}return{response:new Response(e,{status:n.status,statusText:n.statusText,headers:n.headers}),isSSE:!1}}catch{return{response:n,isSSE:!1}}}var ne=w(()=>{"use strict"});var rt,Tr=w(()=>{"use strict";ne();rt=class{name="openai-responses";endPoint="/v1/responses";getCacheReadInputTokens(e){return e?.cache_read_input_tokens??e?.input_tokens_details?.cached_tokens??e?.prompt_tokens_details?.cached_tokens??0}getCacheCreationInputTokens(e){return e?.cache_creation_input_tokens??e?.input_tokens_details?.cache_creation_tokens??e?.input_tokens_details?.cache_write_tokens??e?.prompt_tokens_details?.cache_creation_tokens??e?.prompt_tokens_details?.cache_write_tokens??0}buildResponsesUsage(e){let t=e?.input_tokens??e?.prompt_tokens??0,o=e?.output_tokens??e?.completion_tokens??0,r=this.getCacheReadInputTokens(e),s=this.getCacheCreationInputTokens(e);return{input_tokens:t,output_tokens:o,total_tokens:e?.total_tokens??t+o,input_tokens_details:{cached_tokens:r,cache_creation_tokens:s},output_tokens_details:{reasoning_tokens:e?.output_tokens_details?.reasoning_tokens??0},cache_read_input_tokens:r,cache_creation_input_tokens:s}}async transformRequestIn(e){delete e.temperature,delete e.max_tokens,e.reasoning&&(e.reasoning={effort:e.reasoning.effort,summary:e.reasoning.summary||"auto"});let t=[],o=e.messages.filter(r=>r.role==="system");if(o.length>0){let r=o[0];Array.isArray(r.content)?r.content.forEach(s=>{let i="";typeof s=="string"?i=s:s&&typeof s=="object"&&"text"in s&&(i=s.text),t.push({role:"system",content:i})}):e.instructions=r.content}if(e.messages.forEach(r=>{if(r.role!=="system"){if(Array.isArray(r.content)){let s=r.content.map(i=>this.normalizeRequestContent(i,r.role)).filter(i=>i!==null);s.length>0?r.content=s:delete r.content}if(r.role==="tool"){let s={...r};s.type="function_call_output",s.call_id=r.tool_call_id,s.output=r.content,delete s.cache_control,delete s.role,delete s.tool_call_id,delete s.content,t.push(s);return}if(r.role==="assistant"&&Array.isArray(r.tool_calls)){r.tool_calls.forEach(s=>{t.push({type:"function_call",arguments:s.function.arguments,name:s.function.name,call_id:s.id})});return}t.push(r)}}),e.input=t,delete e.messages,Array.isArray(e.tools)){let r=e.tools.find(s=>s.function.name==="web_search");e.tools=e.tools.filter(s=>s.function.name!=="web_search").map(s=>(s.function.name==="WebSearch"&&delete s.function.parameters.properties.allowed_domains,s.function.name==="Edit"?{type:s.type,name:s.function.name,description:s.function.description,parameters:{...s.function.parameters,required:["file_path","old_string","new_string","replace_all"]},strict:!0}:{type:s.type,name:s.function.name,description:s.function.description,parameters:s.function.parameters})),r&&e.tools.push({type:"web_search"})}return e.parallel_tool_calls=!1,e}async transformResponseOut(e){let t=e.headers.get("Content-Type")||"";if(!t.includes("text/event-stream")&&!t.includes("application/json")&&e.body){let o=await Te(e);if(o?.isSSE&&o.body){let r=new Response(o.body,{status:e.status,statusText:e.statusText,headers:new Headers({...Object.fromEntries(e.headers.entries()),"content-type":"text/event-stream"})});return this.transformResponseOut(r)}o?.body&&(e=new Response(o.body,{status:e.status,statusText:e.statusText,headers:e.headers}))}if(t.includes("application/json")){let o=await Te(e);if(o?.isSSE&&o.body){let r=new Response(o.body,{status:e.status,statusText:e.statusText,headers:new Headers({...Object.fromEntries(e.headers.entries()),"content-type":"text/event-stream"})});return this.transformResponseOut(r)}if(o?.body)e=new Response(o.body,{status:e.status,statusText:e.statusText,headers:e.headers});else if(o===null){let r=await Pe(e);if(r.isSSE)return this.transformResponseOut(r.response);e=r.response}}if(t.includes("application/json")){let o=await U(e);if(o.object==="response"&&o.output){let r=this.convertResponseToChat(o);return new Response(JSON.stringify(r),{status:e.status,statusText:e.statusText,headers:e.headers})}return o.type==="message"&&Array.isArray(o.content)?new Response(JSON.stringify(o),{status:e.status,statusText:e.statusText,headers:e.headers}):new Response(JSON.stringify(o),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(t.includes("text/event-stream")){if(!e.body)return e;let[o,r]=e.body.tee(),s=o.getReader(),i="";try{let{value:f,done:h}=await s.read();!h&&f&&(i=new TextDecoder().decode(f))}finally{s.releaseLock()}if(o.cancel().catch(()=>{}),i.includes("message_start")||i.includes("content_block_start"))return new Response(r,{status:e.status,statusText:e.statusText,headers:e.headers});if(i.includes("response.created")||i.includes("response.output_text.delta")||i.includes("response.in_progress")||i.includes("response.output_item.added"))return new Response(r,{status:e.status,statusText:e.statusText,headers:e.headers});let c=new TextDecoder,u=new TextEncoder,p="",d=!1,m=this,g=new ReadableStream({async start(f){let h=r.getReader(),b=-1,_="",y=k=>(k!==_&&(b++,_=k),b);try{for(;;){let{done:k,value:v}=await h.read();if(k){d||f.enqueue(u.encode(`data: [DONE]
|
|
5
5
|
|
|
6
6
|
`));break}let S=c.decode(v,{stream:!0});p+=S;let T=p.split(/\r?\n/);p=T.pop()||"";for(let R of T)if(R.trim())try{if(R.startsWith("event: "))continue;if(R.startsWith("data: ")){let C=R.slice(5).trim();if(C==="[DONE]"){d=!0,f.enqueue(u.encode(`data: [DONE]
|
|
7
7
|
|
|
@@ -44,7 +44,7 @@ data: ${JSON.stringify($)}
|
|
|
44
44
|
${r}`}],_reasoningItem:!0})}else if(o.role){let r=o.content;Array.isArray(r)&&(r=r.map(s=>s.type==="input_text"?{type:"text",text:s.text}:s.type==="output_text"?{type:"text",text:s.text}:s.type==="input_image"?{type:"image_url",image_url:{url:s.image_url},media_type:s.mime_type}:s)),e.push({role:o.role,content:r})}n.messages=e,delete n.input,n.instructions&&typeof n.instructions=="string"&&(n.system=n.instructions,delete n.instructions),Array.isArray(n.tools)&&(n.tools=n.tools.filter(o=>o&&typeof o=="object").map(o=>o.type==="function"&&o.name&&!o.function?{type:"function",function:{name:o.name,description:o.description||"",parameters:o.parameters||{type:"object",properties:{}}}}:o.function?.name?o:o.type==="web_search"?{type:"function",function:{name:"web_search",description:"Search the web",parameters:{type:"object",properties:{query:{type:"string"}}}}}:null).filter(Boolean)),n.reasoning&&typeof n.reasoning=="object"&&(n.reasoning={enabled:!0,effort:n.reasoning.effort}),delete n.store,delete n.previous_response_id,delete n.include}async function ea(n,e,t,o){let r=n.body;(n.ccrHookOrder||=[]).push("handler"),er(n),o.endPoint==="/v1/responses"&&r?.input&&!r?.messages&&zt(r),o.endPoint==="/v1/responses"&&!n.provider&&typeof r?.model=="string"&&Zu.test(r.model)&&await Ht(n,e,{configService:t.configService,tokenizerService:t.tokenizerService});let s=n.provider;if(!s&&r?.model){let c=r.model.split(",");c.length>1&&(s=c[0],r.model=c.slice(1).join(","))}let i=s?t.providerService.getProvider(s):void 0;if(!i&&r?.model){let c=t.providerService.resolveModelRoute(r.model);c&&(i=c.provider,r.model=c.targetModel)}if(!i&&r?.model){let u=t.configService.get("Router")?.default;if(u&&u.includes(",")){let[p,...d]=u.split(","),m=t.providerService.getProvider(p);m&&(i=m,r.model=d.join(","))}}if(n.originalModel||(n.originalModel=r?.model),!i)throw W(`Provider '${s}' not found`,404,"provider_not_found");n.provider=i.name||s;let a=nd(n),l=o.endPoint==="/v1/messages"&&a;a&&e.header("X-Codex-Detected","true"),l&&e.header("X-Codex-On-Messages","true"),n.isCodexOnMessagesEndpoint=l,n.codexDetected=a;try{o.endPoint==="/v1/responses"&&r.input&&!r.messages&&zt(r);let c={req:n,isCodexOnMessagesEndpoint:l,pluginRegistry:t.pluginRegistry},{requestBody:u,config:p,bypass:d}=await na(r,i,o,n.headers,c);if(u?.messages&&!d&&!n.isTargetAnthropic){let h=u.messages,b=new Set,_=[],y=[];for(let k of h){if(k?.role!=="system"){y.push(k);continue}let v=JSON.stringify(k.content??"");b.has(v)||(b.add(v),_.push(k))}_.length>0&&y.length>0&&(u.messages=[..._,...y])}let m=await oa(u,p,i,t,d,o,c);try{i?.baseUrl&&m?.headers&&Mt(s,i.baseUrl,m.headers)}catch{}let g=await ra(u,m,i,o,d,c);g=await ta(r,g,i.name||s);let f=sa(g,e,r,t);try{let h=r.model||n.originalModel;s&&h&&j().recordSuccess(s,h)}catch{}return f}catch(c){if(c instanceof re)throw c;if(!tr(n,t.pluginRegistry.getManagedRuntimeFor(i),c,i)&&!n.__retryAttempted){n.__retryAttempted=!0;try{return await ea(n,e,t,o)}catch(d){if(n.__fallbackExhausted)throw d;c=d}}let p=await qu(n,e,t,o,c);if(p)return p;throw n.__fallbackExhausted=!0,c}}async function ta(n,e,t){if(!n?.stream||!e?.body)return e;let o=e.body.getReader(),r=new TextDecoder,s=[],i="";for(let u=0;u<8;u++){let p=await o.read();if(p.done||(p.value&&(s.push(p.value),i+=r.decode(p.value,{stream:!0})),i.split(`
|
|
45
45
|
`).some(d=>d.startsWith("data:"))))break}if(i+=r.decode(),s.length===0)throw o.releaseLock(),W(`Provider returned empty streaming response from ${t}`,400,"provider_response_error");if(i.includes("event: error")){o.releaseLock();let u=i.length<500?i:i.slice(0,500);throw W(`Provider ${t} returned error in SSE stream: ${u}`,400,"provider_response_error")}if(i.split(`
|
|
46
46
|
`).filter(u=>u.startsWith("data:")&&u.trim().length>5).length===0){o.releaseLock();let u=i.length<500?i:i.slice(0,500);throw W(`Provider ${t} returned streaming response with no SSE data lines: ${u}`,400,"provider_response_error")}let l=new ReadableStream({start:u=>{for(let d of s)u.enqueue(d);let p=()=>{o.read().then(({done:d,value:m})=>{d?u.close():(u.enqueue(m),p())}).catch(d=>u.error(d))};p()},cancel:()=>{o.cancel()}}),c=await li(l);if(c.verdict==="empty")throw W(`Provider ${t} returned an empty answer (200 with no content blocks)`,400,"provider_response_error");return new Response(ui(c.chunks,c.rest),{headers:e.headers,status:e.status,statusText:e.statusText})}async function qu(n,e,t,o,r){let s=n.scenarioType||"default",i=n.familyFallback,a=n.modelFamily,l=n.strictProjectRouting?n.fallbackConfig:n.fallbackConfig??t.configService.get("fallback"),c=j(),u=n.provider||"",p=n.body.model||"",d=new Set,m=r?.statusCode===429||r?.isRateLimit===!0||r?.rawBody&&Gn(r.rawBody)||r?.message&&Gn(r.message);if(u&&p&&(m?(c.markRateLimited(u,p,120,r?.message),n.log.warn(`Primary model ${u},${p} rate-limited, will try fallbacks`)):c.recordFailure(u,p,r?.message),d.add(`${u},${p}`),t.recordUsage?.({provider:u,model:p,originalModel:n.originalModel||p,scenarioType:s,modelFamily:n.modelFamily,errorMessage:r?.message||String(r),sessionId:n.sessionId||n.usageSessionId||n.id,stream:n.body.stream,inputTokens:n.tokenCount||0,req:n})),!(n.enableFallback??t.configService.get("Router")?.enableFallback===!0))return n.log.info("Fallback disabled by configuration, skipping fallback attempts"),null;let f=_=>{let[y,...k]=_.split(","),v=y?.trim(),S=k.join(",").trim();return!v||!S?null:{provider:v,model:S,key:`${v},${S}`}},h=[];if(a){let _=i?.[s];if(Array.isArray(_)&&_.length>0)h.push({name:`${a}/${s}`,models:_});else{let y=n.strictProjectRouting;n.log.warn(`No ${a} fallback configured for ${s}; ${y?"no project fallback available":"will try global fallback"}`)}}if(Array.isArray(l?.[s])&&l[s].length>0&&h.push({name:`global/${s}`,models:l[s]}),h.length===0&&s!=="image"&&n.body?.messages?.some(k=>k.role==="user"&&Array.isArray(k.content)&&k.content.some(v=>v.type==="image"||v.type==="image_url"||Array.isArray(v?.content)&&v.content.some(S=>S.type==="image"||S.type==="image_url")))&&Array.isArray(l?.image)&&l.image.length>0&&(n.log.info(`No fallback for scenario '${s}', but request has images \u2014 trying fallback.image`),h.push({name:"global/image (auto-detected)",models:l.image})),h.length===0)return null;let b=h.reduce((_,y)=>_+y.models.length,0);n.log.warn(`Request failed for ${s}, trying ${b} fallback models across ${h.length} fallback stage(s)`);for(let _ of h){n.log.info(`Trying ${_.name} fallback stage with ${_.models.length} models`);for(let y of _.models){let k=f(y);if(!k){n.log.warn(`Fallback model '${y}' is invalid, skipping`);continue}if(d.has(k.key))continue;d.add(k.key);let v=t.providerService.getProviders(),S=Dt(v,k.provider,k.model);if(!S){n.log.warn(`Fallback model ${y} is not configured or provider is disabled, skipping`);continue}let T=S.provider.name,R=S.model;if(!c.isAvailable(T,R,S.provider.apiKey?.startsWith("ccr-managed-")===!0)){n.log.warn(`Fallback model ${y} unavailable (fail pool), skipping`);continue}let C=t.pluginRegistry.getManagedRuntimeFor(S.provider);if(C&&qe(n,C,{name:T}).terminalError)continue;let x;for(let A=1;A<=2;A++)try{n.log.info(`Trying fallback model: ${T},${R}${A>1?" (retry)":""}`);let O={...n.body};O.model=R;let E={...n,provider:T,body:O},L=S.provider,$={pluginRegistry:t.pluginRegistry,req:E,isCodexOnMessagesEndpoint:n.isCodexOnMessagesEndpoint||!1},{requestBody:D,config:K,bypass:N}=await na(O,L,o,n.headers,$),F=await oa(D,K,L,t,N,o,$);try{L?.baseUrl&&F?.headers&&Mt(T,L.baseUrl,F.headers)}catch{}let J=await ra(D,F,L,o,N,$);return J=await ta(O,J,T),n.log.info(`Fallback model ${T},${R} succeeded`),c.recordSuccess(T,R),u&&p&&!n.strictProjectRouting&&(et().promote(u,p,s,T,R),n.log.info(`Promoted fallback model ${T},${R} for ${u},${p}:${s}`),m?n.log.info(`Rate-limited original model ${u},${p} already marked unavailable with cooldown`):(c.forceOpen(u,p,r?.message),n.log.info(`Marked original model ${u},${p} as unavailable`))),n.provider=T,n.body=O,Pi(n,`${T},${R}`),sa(J,e,O,t)}catch(O){if(x=O,tr(n,C,O,{name:T}))break;if(A===1){n.log.warn(`Fallback model ${T},${R} failed, retrying once: ${O.message}`);continue}}c.recordFailure(T,R,x?.message),n.log.warn(`Fallback model ${T},${R} failed after retry: ${x?.message}`),t.recordUsage?.({provider:T,model:R,originalModel:n.originalModel||p||n.body.model,scenarioType:s,modelFamily:n.modelFamily,errorMessage:x?.message||String(x),sessionId:n.sessionId||n.usageSessionId||n.id,stream:n.body.stream,inputTokens:n.tokenCount||0,req:n})}}return n.log.error(`All fallback models failed for ${s}`),null}async function na(n,e,t,o,r){if(typeof e.apiKey=="string"&&e.apiKey.startsWith("ccr-managed-")&&!r.pluginRegistry.getManagedRuntimeFor(e))throw W("Provider plugin missing or disabled; install and enable its provider plugin.",503,"plugin_missing");let s=r.pluginRegistry.getManagedRuntimeFor(e);if(s){let u=qe(r.req,s,e).terminalError;if(u)throw u;await s.ensureUsable?.()}let i=JSON.parse(JSON.stringify(n)),a=i?.system;if(typeof a=="string"&&a.includes("cch="))i.system=a.replace(/cch=[^;]+;?/g,"cch=ccr-stable;");else if(Array.isArray(a))for(let u=0;u<a.length;u++){let p=a[u],d=typeof p=="string"?p:p?.text??"";if(d.includes("cch=")){let m=d.replace(/cch=[^;]+;?/g,"cch=ccr-stable;");typeof p=="string"?a[u]=m:typeof p?.text=="string"&&(p.text=m)}}let l={},c=!1;if(c=ed(e,t,n),c&&(o instanceof Headers?o.delete("content-length"):delete o["content-length"],l.headers=o),!c&&typeof t.transformRequestOut=="function"){let u=await t.transformRequestOut(i);u.body?(i=u.body,l=u.config||{}):i=u}if(!c&&e.transformer?.use?.length)for(let u of e.transformer.use){if(!u||typeof u.transformRequestIn!="function")continue;let p=await u.transformRequestIn(i,e,r);p.body?(i=p.body,l={...l,...p.config}):i=p}if(!c&&e.transformer?.[n.model]?.use?.length)for(let u of e.transformer[n.model].use)!u||typeof u.transformRequestIn!="function"||(i=await u.transformRequestIn(i,e,r));return{requestBody:i,config:l,bypass:c}}function ed(n,e,t){return e.endPoint==="/v1/chat/completions"&&Array.isArray(t?.system)?!1:n.transformer?.use?.length===1&&n.transformer.use[0].name===e.name&&(!n.transformer?.[t.model]?.use.length||n.transformer?.[t.model]?.use.length===1&&n.transformer?.[t.model]?.use[0].name===e.name)}function td(n,e){if(e?.clientType!=="pi")return;let t=e?.clientContext?.stableSessionId;if(!(typeof t!="string"||!t)){for(let o of Object.keys(n))o.toLowerCase()==="x-litellm-session-id"&&delete n[o];n["x-litellm-session-id"]=t}}function nd(n){if(n.clientType)return n.clientType==="codex";let e=n.headers||{},t=e["x-anthropic-billing-header"]||"";if(typeof t=="string"&&t.includes("cc_version="))return!1;let o=e["user-agent"]||"";if(typeof o=="string"&&/codex/i.test(o))return!0;let r=n.pathname||n.url||"";if(typeof r=="string"&&r.split("?",1)[0].endsWith("/v1/responses"))return!0;let s=n.originalModel||n.body?.model||"";return typeof s=="string"&&s.toLowerCase()==="ccr-codex"}async function oa(n,e,t,o,r,s,i){let a=o.pluginRegistry.getManagedRuntimeFor(t);return a?.dispatchRequest?a.dispatchRequest({attempt:()=>qi(n,e,t,o,r,s,i),requestBody:n,config:e,provider:t,req:i?.req}):qi(n,e,t,o,r,s,i)}function ft(n){let e=n?.request?.systemInstruction?.parts??n?.systemInstruction?.parts;return Array.isArray(e)?e.map(t=>typeof t?.text=="string"?t.text:"").join(`
|
|
47
|
-
`):""}async function qi(n,e,t,o,r,s,i){let a=o.pluginRegistry.getManagedRuntimeFor(t);a&&(await a.ensureUsable?.(),await a.lockUpstream?.(e,t));let l=e.url||new URL(t.baseUrl);if(!e.TIMEOUT){let d=o.configService.get("API_TIMEOUT_MS");d&&(e.TIMEOUT=typeof d=="string"?parseInt(d,10):d)}if(r&&typeof s.auth=="function"){let d=await s.auth(n,t,i);if(d.body){n=d.body;let m=e.headers||{};d.config?.headers&&(m={...m,...d.config.headers},delete m.host,delete d.config.headers),e={...e,...d.config,headers:m}}else n=d}let c={Authorization:`Bearer ${t.apiKey}`,...e?.headers||{}};a&&(c=await a.signRequest({headers:c,requestBody:n,provider:t,config:e})),td(c,i?.req);for(let d in c)(c[d]==="undefined"||["authorization","Authorization"].includes(d)&&c[d]?.includes("undefined"))&&delete c[d];!a?.suppressDebugLog&&Sn(o.configService)&&oi(o.log,i.req.id,{url:String(l),headers:c,body:n});let u,p=()=>ii(l,n,{...e,headers:JSON.parse(JSON.stringify(c)),httpsProxy:a?void 0:me(o.configService,t)},i,a?void 0:o.log);try{u=await p()}catch(d){throw a?await He(a,0,void 0,ft(n),{errorName:d?.name}):d}if(!u.ok&&a?.authRefresh&&u.status===401&&!qe(i.req,a,t).refreshUsed){qe(i.req,a,t).refreshUsed=!0;try{await a.authRefresh.forceRefresh(),c=await a.signRequest({headers:c,requestBody:n,provider:t}),u=await p()}catch{}u.status===401&&(i.req.__retryAttempted=!0)}if(!u.ok){let d;try{d=await u.text()}catch(g){throw a?await He(a,u.status,void 0,ft(n)):g}if(a){let g=await He(a,u.status,d,ft(n));throw o.log.error(`[provider_response_error] Plugin(${a.name}) status=${u.status} code=${g.code}`),g}o.log.error(`[provider_response_error] Error from provider(${t.name},${n.model}: ${u.status}): ${d}`);let m=W(`Error from provider(${t.name},${n.model}: ${u.status}): ${d}`,u.status,"provider_response_error");throw m.isRateLimit=u.status===429||Gn(d),m.rawBody=d,m}if(u.ok){let d=u.headers.get("content-type")||"",m=n.stream===!0;if(o.log.info(`[hidden-error-check] provider=${t.name} model=${n.model} stream=${n.stream} isStreamRequest=${m} contentType=${d} ok=${u.ok} status=${u.status} hasBody=${!!u.body}`),!m||d.includes("application/json")){let g="";try{if(g=await u.clone().text(),!g||g.trim()==="")throw new SyntaxError("Empty JSON body");if(Lt(g))return o.log.info(`[hidden-error-check] body is SSE mislabeled as ${d}, skipping JSON validation`),u;let h=JSON.parse(g);if(a?.isErrorEnvelope?.(h))throw await He(a,u.status,g,ft(n));if(h&&typeof h=="object"&&h.error&&(typeof h.error=="string"||typeof h.error=="object"&&Object.keys(h.error).length>0)){if(a)throw await He(a,u.status,g,ft(n));o.log.error(`[provider_response_error] Hidden error from provider(${t.name},${n.model}: ${u.status}): ${g}`);let _=Gn(g),y=W(`Error from provider(${t.name},${n.model}: ${u.status}): ${g}`,400,"provider_response_error");throw y.isRateLimit=_,y.rawBody=g,y}}catch(f){if(a)throw f?.pluginClassified===!0?f:await He(a,u.status,void 0,ft(n));if(f instanceof SyntaxError){o.log.warn(`[provider_response_error] Empty or malformed JSON response from provider(${t.name},${n.model}: 200): "${g}"`);let h=W(`API returned an empty or malformed response (HTTP 200) from ${t.name} \u2014 check for a proxy or gateway intercepting the request`,400,"provider_response_error");throw h.rawBody=g,h}throw f}}}if(!a?.suppressDebugLog&&!n.stream&&Sn(o.configService)){let m=await u.clone().text();ri(o.log,i.req.id,{status:u.status,headers:Object.fromEntries(Array.from(u.headers)),body:m})}return u}async function ra(n,e,t,o,r,s){let i=e;if(!r&&t.transformer?.use?.length)for(let a of Array.from(t.transformer.use).reverse())!a||typeof a.transformResponseOut!="function"||(i=await a.transformResponseOut(i,s));if(!r&&t.transformer?.[n.model]?.use?.length)for(let a of Array.from(t.transformer[n.model].use).reverse())!a||typeof a.transformResponseOut!="function"||(i=await a.transformResponseOut(i,s));if(!r&&o.transformResponseIn&&(s.provider||(s.provider=t),i=await o.transformResponseIn(i,s)),s?.isCodexOnMessagesEndpoint)try{i=await new rt().transformResponseIn(i,{...s,provider:t})}catch(a){console.error("Failed to apply Responses API conversion for codex client:",a)}return i}async function sa(n,e,t,o){n.ok||e.code(n.status);let r=Ai(n);if(!r){let s=await Te(n);if(s)s.isSSE&&(r=!0),n=new Response(s.body,{status:n.status,statusText:n.statusText,headers:n.headers});else{let i=await Pe(n);n=i.response,i.isSSE&&(r=!0)}}if(r){if(e.header("Content-Type","text/event-stream"),e.header("Cache-Control","no-cache"),e.header("Connection","keep-alive"),o&&!o.pluginRegistry.getManagedRuntimeFor(o.providerService.getProvider(e.request.provider||""))?.suppressDebugLog&&Sn(o.configService)){let[s,i]=n.body.tee(),a=ni(o.configService);return si(s,o.log,e.request.id,a),e.send(i)}return e.send(n.body)}else return U(n)}function Gn(n){let e=n.toLowerCase();return e.includes("rate limit")||e.includes("rate_limit")||e.includes("rate_limit_error")||e.includes("too many requests")||e.includes("too many")||e.includes("quota exhausted")||e.includes("qps_limit")||e.includes("token_limit")||e.includes("\u9650\u6D41")||e.includes("\u9891\u7387\u9650\u5236")}function od(n){try{return new URL(n),!0}catch{return!1}}var Zu,ia,Vn=w(()=>{"use strict";ai();vn();di();pi();gi();At();sr();ue();ot();An();$n();Tr();ne();We();ae();Zu=/^ccr-(opus|sonnet|haiku)(\[1m\])?$/i;ia=async n=>{n.get("/",async()=>({message:"LLMs API",version:En})),n.get("/health",async()=>({status:"ok",timestamp:new Date().toISOString()})),n.get("/providers/health",async()=>({states:j().getAllStates().map(r=>({provider:r.provider,model:r.model,status:r.status,failureCount:r.failureCount,successCount:r.successCount,lastFailureTime:r.lastFailureTime,lastError:r.lastError,rateLimitUntil:r.rateLimitUntil??null})),timestamp:new Date().toISOString()}));let e=n.transformerService.getTransformersWithEndpoint();for(let{transformer:t}of e)t.endPoint&&n.post(t.endPoint,async(o,r)=>ea(o,r,n,t));n.post("/providers",{schema:{body:{type:"object",properties:{id:{type:"string"},name:{type:"string"},type:{type:"string",enum:["openai","anthropic"]},baseUrl:{type:"string"},apiKey:{type:"string"},models:{type:"array",items:{type:"string"}},proxyEnabled:{type:"boolean"}},required:["id","name","type","baseUrl","apiKey","models"]}}},async(t,o)=>{let{name:r,baseUrl:s,apiKey:i,models:a}=t.body;if(!r?.trim())throw W("Provider name is required",400,"invalid_request");if(!s||!od(s))throw W("Valid base URL is required",400,"invalid_request");if(!i?.trim())throw W("API key is required",400,"invalid_request");if(!a||!Array.isArray(a)||a.length===0)throw W("At least one model is required",400,"invalid_request");if(n.providerService.getProvider(t.body.name))throw W(`Provider with name '${t.body.name}' already exists`,400,"provider_exists");return n.providerService.registerProvider(t.body)}),n.get("/providers",async()=>n.providerService.getProviders()),n.get("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async t=>{let o=n.providerService.getProvider(t.params.id);if(!o)throw W("Provider not found",404,"provider_not_found");return o}),n.put("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]},body:{type:"object",properties:{name:{type:"string"},type:{type:"string",enum:["openai","anthropic"]},baseUrl:{type:"string"},apiKey:{type:"string"},models:{type:"array",items:{type:"string"}},proxyEnabled:{type:"boolean"},enabled:{type:"boolean"}}}}},async(t,o)=>{let r=n.providerService.updateProvider(t.params.id,t.body);if(!r)throw W("Provider not found",404,"provider_not_found");return r}),n.delete("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async t=>{if(!n.providerService.deleteProvider(t.params.id))throw W("Provider not found",404,"provider_not_found");return{message:"Provider deleted successfully"}}),n.patch("/providers/:id/toggle",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]},body:{type:"object",properties:{enabled:{type:"boolean"}},required:["enabled"]}}},async(t,o)=>{if(!n.providerService.toggleProvider(t.params.id,t.body.enabled))throw W("Provider not found",404,"provider_not_found");return{message:`Provider ${t.body.enabled?"enabled":"disabled"} successfully`}})}});var Ke,Mr=w(()=>{"use strict";Ke=class n{constructor(e,t,o){this.configService=e;this.transformerService=t;this.logger=o;this.initializeCustomProviders()}providers=new Map;modelRoutes=new Map;reload(){let e=new n(this.configService,this.transformerService,this.logger);this.providers=e.providers,this.modelRoutes=e.modelRoutes}initializeCustomProviders(){let e=this.configService.get("providers");if(e&&Array.isArray(e)){this.initializeFromProvidersArray(e);return}}initializeFromProvidersArray(e){e.forEach(t=>{try{if(!t.name||!t.api_base_url||!t.api_key)return;let o={};t.transformer&&Object.keys(t.transformer).forEach(s=>{s==="use"?Array.isArray(t.transformer.use)&&(o.use=t.transformer.use.map(i=>{if(Array.isArray(i)&&typeof i[0]=="string"){let a=this.transformerService.getTransformer(i[0]);if(a)return new a(i[1])}if(typeof i=="string"){let a=this.transformerService.getTransformer(i);return typeof a=="function"?new a:a}}).filter(i=>typeof i<"u")):Array.isArray(t.transformer[s]?.use)&&(o[s]={use:t.transformer[s].use.map(i=>{if(Array.isArray(i)&&typeof i[0]=="string"){let a=this.transformerService.getTransformer(i[0]);if(a)return new a(i[1])}if(typeof i=="string"){let a=this.transformerService.getTransformer(i);return typeof a=="function"?new a:a}}).filter(i=>typeof i<"u")})});let r=t.default_thinking_level;if(r){let s=this.transformerService.getTransformer("defaultthinking");if(s){let i=new s({level:r});o.use=[i,...o.use||[]]}else this.logger.warn(`default_thinking_level set on ${t.name} but defaultthinking transformer is not registered`)}this.registerProvider({name:t.name,baseUrl:t.api_base_url,apiKey:t.api_key,pluginManaged:t.ccr_managed===!0,models:t.models||[],quotaToken:t.quota_token,quotaSecToken:t.quota_sec_token,transformer:t.transformer?o:void 0,cacheMode:t.cache_mode||"exclusive",enabled:t.enabled!==!1,proxyEnabled:t.proxy_enabled===!0,wakeupEnabled:t.wakeup_enabled===!0,wakeupTime:t.wakeup_time||"06:00",wakeupModel:t.wakeup_model||""}),this.logger.info(`${t.name} provider registered`)}catch(o){this.logger.error(`${t.name} provider registered error: ${o}`)}})}registerProvider(e){let t={...e,enabled:e.enabled!==!1,proxyEnabled:e.proxyEnabled===!0,wakeupEnabled:e.wakeupEnabled===!0,wakeupTime:e.wakeupTime||"06:00",wakeupModel:e.wakeupModel||""};return this.providers.set(t.name,t),e.models.forEach(o=>{let r=`${t.name},${o}`,s={provider:t.name,model:o,fullModel:r};this.modelRoutes.set(r,s),this.modelRoutes.has(o)||this.modelRoutes.set(o,s)}),t}getProviders(){return Array.from(this.providers.values())}getProvider(e){return this.providers.get(e)}updateProvider(e,t){let o=this.providers.get(e);if(!o)return null;let r={...o,...t,updatedAt:new Date};return this.providers.set(e,r),t.models&&(o.models.forEach(s=>{let i=`${o.name},${s}`;this.modelRoutes.delete(i),this.modelRoutes.delete(s)}),t.models.forEach(s=>{let i=`${o.name},${s}`,a={provider:o.name,model:s,fullModel:i};this.modelRoutes.set(i,a),this.modelRoutes.has(s)||this.modelRoutes.set(s,a)})),r}deleteProvider(e){let t=this.providers.get(e);return t?(t.models.forEach(o=>{let r=`${t.name},${o}`;this.modelRoutes.delete(r),this.modelRoutes.delete(o)}),this.providers.delete(e),!0):!1}toggleProvider(e,t){let o=this.providers.get(e);if(!o)return!1;o.enabled=t;let r=this.configService.get("providers");if(r&&Array.isArray(r)){let s=r.find(i=>i.name===e);s&&(s.enabled=t)}return!0}resolveModelRoute(e){let t=this.modelRoutes.get(e);if(!t)return null;let o=this.providers.get(t.provider);return o?{provider:o,originalModel:e,targetModel:t.model}:null}getAvailableModelNames(){let e=[];return this.providers.forEach(t=>{t.enabled!==!1&&t.models.forEach(o=>{e.push(o),e.push(`${t.name},${o}`)})}),e}getModelRoutes(){return Array.from(this.modelRoutes.values())}parseTransformerConfig(e){return e?Array.isArray(e)?e.reduce((t,o)=>{if(Array.isArray(o)){let[r,s={}]=o;t[r]=s}else t[o]={};return t},{}):e:{}}async getAvailableModels(){let e=[];return this.providers.forEach(t=>{t.enabled!==!1&&t.models.forEach(o=>{e.push({id:o,object:"model",owned_by:t.name,provider:t.name}),e.push({id:`${t.name},${o}`,object:"model",owned_by:t.name,provider:t.name})})}),{object:"list",data:e}}}});var Ae,Qn,aa,rd,ca,mt=w(()=>{"use strict";Ae=n=>n>0?n<=1024?"low":n<=8192?"medium":n<=16384?"high":"max":"none",Qn=n=>n==="none"?0:n==="low"?1024:n==="medium"?8192:n==="high"?16384:32768,aa=["low","medium","high"],rd={none:"none",off:"none",disabled:"none",min:"low",minimal:"low",light:"low",low:"low",medium:"medium",mid:"medium",high:"high",xhigh:"max",max:"max",maximum:"max",ultra:"max",ultracode:"max"},ca=n=>{if(typeof n=="string")return rd[n.trim().toLowerCase()]}});var Lr,la=w(()=>{Lr=(n,e)=>(n.includes("base64")&&(n=n.split("base64").pop(),n.startsWith(",")&&(n=n.slice(1))),`data:${e};base64,${n}`)});function sd(n){return n.filter(e=>!!e?.function?.name).map(e=>({name:e.function.name,description:e.function.description,input_schema:e.function.parameters}))}function ua(n){let e=[],t=[],o=d=>{if(typeof d=="string"){t.push({type:"text",text:d});return}Array.isArray(d)&&d.forEach(m=>{if(typeof m=="string"){t.push({type:"text",text:m});return}m&&typeof m=="object"&&m.type==="text"&&m.text&&t.push({...m})})},r=()=>{let d=new Map;for(let m=0;m<t.length;m++){let g=t[m],f=g?.text??JSON.stringify(g),h=d.get(f);if(h===void 0){d.set(f,m);continue}!t[h]?.cache_control&&g?.cache_control&&(t[h]=g),t.splice(m,1),m--}};n.messages.forEach(d=>{d.role==="system"?o(d.content):e.push(d)}),r();let s=[];for(let d=0;d<e.length;d++){let m=e[d];if(m.role==="tool"){let g=m.content;try{typeof m.content=="string"&&(g=JSON.parse(m.content))}catch{}g!=null&&typeof g!="object"&&typeof g!="string"&&(g=String(g));let f={type:"tool_result",tool_use_id:m.tool_call_id,content:g};m.cache_control&&(f.cache_control=m.cache_control);let h=s[s.length-1];h&&h.role==="user"&&Array.isArray(h.content)?h.content.push(f):s.push({role:"user",content:[f]})}else if(m.role==="user"){let g=[];typeof m.content=="string"?g.push({type:"text",text:m.content}):Array.isArray(m.content)&&m.content.forEach(h=>{h&&typeof h=="object"&&h.type==="image_url"&&h.image_url?.url?g.push({type:"image",source:{type:"base64",media_type:h.media_type||"image/jpeg",data:h.image_url.url.split(",")[1]||h.image_url.url}}):g.push(h)});let f=s[s.length-1];f&&f.role==="user"&&Array.isArray(f.content)?f.content.push(...g):s.push({role:"user",content:g.length>0?g:[{type:"text",text:" "}]})}else if(m.role==="assistant"){let g=[];m.content&&(typeof m.content=="string"?g.push({type:"text",text:m.content}):Array.isArray(m.content)&&g.push(...m.content)),m.tool_calls&&m.tool_calls.length>0&&m.tool_calls.forEach(h=>{let b={};try{b=JSON.parse(h.function.arguments)}catch{b=h.function.arguments}g.push({type:"tool_use",id:h.id,name:h.function.name,input:b})}),m.thinking&&g.unshift({type:"thinking",thinking:m.thinking.content,signature:m.thinking.signature});let f=s[s.length-1];f&&f.role==="assistant"&&Array.isArray(f.content)?f.content.push(...g):s.push({role:"assistant",content:g.length>0?g:[{type:"text",text:" "}]})}}let i=()=>{let d=t.filter(m=>m?.cache_control).length;for(let m of s)Array.isArray(m.content)&&(d+=m.content.filter(g=>g?.cache_control).length);return d},a=d=>d&&typeof d=="object"?{...d}:{type:"ephemeral"},l=()=>{for(let d=s.length-1;d>=0;d--){let m=s[d]?.content;if(!Array.isArray(m))continue;let g=m.find(f=>f?.cache_control);if(g?.cache_control)return g.cache_control}for(let d=t.length-1;d>=0;d--)if(t[d]?.cache_control)return t[d].cache_control;return{type:"ephemeral"}},c=(d,m)=>{if(!Array.isArray(d?.content)||d.content.some(f=>f?.cache_control))return!1;let g=d.content.find(f=>f&&typeof f=="object"&&!f.cache_control);return g?(g.cache_control=a(m),!0):!1};(()=>{let d=4-i();if(d<=0||s.length===0)return;let m=s,g=l(),f=[];for(let h=m.length-1;h>=0;h--)m[h]?.role!=="user"||!Array.isArray(m[h].content)||f.push(h);for(let h of f){if(d<=0)break;c(m[h],g)&&d--}})();let p={messages:s,model:n.model,max_tokens:n.max_tokens||4096,temperature:n.temperature,stream:n.stream};if(n.reasoning?.enabled){let d=n.reasoning.max_tokens||Qn(n.reasoning.effort||"medium"),m=Math.min(d,p.max_tokens-1024);m>=1024&&(p.thinking={type:"enabled",budget_tokens:m});let g=n.reasoning.effort&&n.reasoning.effort!=="none"?n.reasoning.effort:Ae(d);aa.includes(g)&&(p.output_config={...p.output_config||{},effort:g})}if(t.length>0){let d=t.some(m=>m?.cache_control);p.system=d?t:t.map(m=>m.text||"").join(`
|
|
47
|
+
`):""}async function qi(n,e,t,o,r,s,i){let a=o.pluginRegistry.getManagedRuntimeFor(t);a&&(await a.ensureUsable?.(),await a.lockUpstream?.(e,t));let l=e.url||new URL(t.baseUrl);if(!e.TIMEOUT){let d=o.configService.get("API_TIMEOUT_MS");d&&(e.TIMEOUT=typeof d=="string"?parseInt(d,10):d)}if(r&&typeof s.auth=="function"){let d=await s.auth(n,t,i);if(d.body){n=d.body;let m=e.headers||{};d.config?.headers&&(m={...m,...d.config.headers},delete m.host,delete d.config.headers),e={...e,...d.config,headers:m}}else n=d}let c={Authorization:`Bearer ${t.apiKey}`,...e?.headers||{}};a&&(c=await a.signRequest({headers:c,requestBody:n,provider:t,config:e})),td(c,i?.req);for(let d in c)(c[d]==="undefined"||["authorization","Authorization"].includes(d)&&c[d]?.includes("undefined"))&&delete c[d];!a?.suppressDebugLog&&Sn(o.configService)&&oi(o.log,i.req.id,{url:String(l),headers:c,body:n});let u,p=()=>ii(l,n,{...e,headers:JSON.parse(JSON.stringify(c)),httpsProxy:a?void 0:me(o.configService,t)},i,a?void 0:o.log);try{u=await p()}catch(d){throw a?await He(a,0,void 0,ft(n),{errorName:d?.name}):d}if(!u.ok&&a?.authRefresh&&u.status===401&&!qe(i.req,a,t).refreshUsed){qe(i.req,a,t).refreshUsed=!0;try{await a.authRefresh.forceRefresh(),c=await a.signRequest({headers:c,requestBody:n,provider:t}),u=await p()}catch{}u.status===401&&(i.req.__retryAttempted=!0)}if(!u.ok){let d;try{d=await u.text()}catch(g){throw a?await He(a,u.status,void 0,ft(n)):g}if(a){let g=await He(a,u.status,d,ft(n));throw o.log.error(`[provider_response_error] Plugin(${a.name}) status=${u.status} code=${g.code}`),g}o.log.error(`[provider_response_error] Error from provider(${t.name},${n.model}: ${u.status}): ${d}`);let m=W(`Error from provider(${t.name},${n.model}: ${u.status}): ${d}`,u.status,"provider_response_error");throw m.isRateLimit=u.status===429||Gn(d),m.rawBody=d,m}if(u.ok){let d=u.headers.get("content-type")||"",m=n.stream===!0;if(o.log.info(`[hidden-error-check] provider=${t.name} model=${n.model} stream=${n.stream} isStreamRequest=${m} contentType=${d} ok=${u.ok} status=${u.status} hasBody=${!!u.body}`),!m||d.includes("application/json")){let g="";try{if(g=await u.clone().text(),!g||g.trim()==="")throw new SyntaxError("Empty JSON body");if(Lt(g))return o.log.info(`[hidden-error-check] body is SSE mislabeled as ${d}, skipping JSON validation`),u;let h=JSON.parse(g);if(a?.isErrorEnvelope?.(h))throw await He(a,u.status,g,ft(n));if(h&&typeof h=="object"&&h.error&&(typeof h.error=="string"||typeof h.error=="object"&&Object.keys(h.error).length>0)){if(a)throw await He(a,u.status,g,ft(n));o.log.error(`[provider_response_error] Hidden error from provider(${t.name},${n.model}: ${u.status}): ${g}`);let _=Gn(g),y=W(`Error from provider(${t.name},${n.model}: ${u.status}): ${g}`,400,"provider_response_error");throw y.isRateLimit=_,y.rawBody=g,y}}catch(f){if(a)throw f?.pluginClassified===!0?f:await He(a,u.status,void 0,ft(n));if(f instanceof SyntaxError){o.log.warn(`[provider_response_error] Empty or malformed JSON response from provider(${t.name},${n.model}: 200): "${g}"`);let h=W(`API returned an empty or malformed response (HTTP 200) from ${t.name} \u2014 check for a proxy or gateway intercepting the request`,400,"provider_response_error");throw h.rawBody=g,h}throw f}}}if(!a?.suppressDebugLog&&!n.stream&&Sn(o.configService)){let m=await u.clone().text();ri(o.log,i.req.id,{status:u.status,headers:Object.fromEntries(Array.from(u.headers)),body:m})}return u}async function ra(n,e,t,o,r,s){let i=e;if(!r&&t.transformer?.use?.length)for(let a of Array.from(t.transformer.use).reverse())!a||typeof a.transformResponseOut!="function"||(i=await a.transformResponseOut(i,s));if(!r&&t.transformer?.[n.model]?.use?.length)for(let a of Array.from(t.transformer[n.model].use).reverse())!a||typeof a.transformResponseOut!="function"||(i=await a.transformResponseOut(i,s));if(!r&&o.transformResponseIn&&(s.provider||(s.provider=t),i=await o.transformResponseIn(i,s)),s?.isCodexOnMessagesEndpoint)try{i=await new rt().transformResponseIn(i,{...s,provider:t})}catch(a){console.error("Failed to apply Responses API conversion for codex client:",a)}return i}async function sa(n,e,t,o){n.ok||e.code(n.status);let r=Ai(n);if(!r){let s=await Te(n);if(s)s.isSSE&&(r=!0),n=new Response(s.body,{status:n.status,statusText:n.statusText,headers:n.headers});else{let i=await Pe(n);n=i.response,i.isSSE&&(r=!0)}}if(r){if(e.header("Content-Type","text/event-stream"),e.header("Cache-Control","no-cache"),e.header("Connection","keep-alive"),o&&!o.pluginRegistry.getManagedRuntimeFor(o.providerService.getProvider(e.request.provider||""))?.suppressDebugLog&&Sn(o.configService)){let[s,i]=n.body.tee(),a=ni(o.configService);return si(s,o.log,e.request.id,a),e.send(i)}return e.send(n.body)}else return U(n)}function Gn(n){let e=n.toLowerCase();return e.includes("rate limit")||e.includes("rate_limit")||e.includes("rate_limit_error")||e.includes("too many requests")||e.includes("too many")||e.includes("quota exhausted")||e.includes("qps_limit")||e.includes("token_limit")||e.includes("\u9650\u6D41")||e.includes("\u9891\u7387\u9650\u5236")}function od(n){try{return new URL(n),!0}catch{return!1}}var Zu,ia,Vn=w(()=>{"use strict";ai();vn();di();pi();gi();At();sr();ue();ot();An();$n();Tr();ne();We();ae();Zu=/^ccr-(opus|sonnet|haiku)(\[1m\])?$/i;ia=async n=>{n.get("/",async()=>({message:"LLMs API",version:En})),n.get("/health",async()=>({status:"ok",timestamp:new Date().toISOString()})),n.get("/providers/health",async()=>({states:j().getAllStates().map(r=>({provider:r.provider,model:r.model,status:r.status,failureCount:r.failureCount,successCount:r.successCount,lastFailureTime:r.lastFailureTime,lastError:r.lastError,rateLimitUntil:r.rateLimitUntil??null})),timestamp:new Date().toISOString()}));let e=n.transformerService.getTransformersWithEndpoint();for(let{transformer:t}of e)t.endPoint&&n.post(t.endPoint,async(o,r)=>ea(o,r,n,t));n.post("/providers",{schema:{body:{type:"object",properties:{id:{type:"string"},name:{type:"string"},type:{type:"string",enum:["openai","anthropic"]},baseUrl:{type:"string"},apiKey:{type:"string"},models:{type:"array",items:{type:"string"}},proxyEnabled:{type:"boolean"}},required:["id","name","type","baseUrl","apiKey","models"]}}},async(t,o)=>{let{name:r,baseUrl:s,apiKey:i,models:a}=t.body;if(!r?.trim())throw W("Provider name is required",400,"invalid_request");if(!s||!od(s))throw W("Valid base URL is required",400,"invalid_request");if(!i?.trim())throw W("API key is required",400,"invalid_request");if(!a||!Array.isArray(a)||a.length===0)throw W("At least one model is required",400,"invalid_request");if(n.providerService.getProvider(t.body.name))throw W(`Provider with name '${t.body.name}' already exists`,400,"provider_exists");return n.providerService.registerProvider(t.body)}),n.get("/providers",async()=>n.providerService.getProviders()),n.get("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async t=>{let o=n.providerService.getProvider(t.params.id);if(!o)throw W("Provider not found",404,"provider_not_found");return o}),n.put("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]},body:{type:"object",properties:{name:{type:"string"},type:{type:"string",enum:["openai","anthropic"]},baseUrl:{type:"string"},apiKey:{type:"string"},models:{type:"array",items:{type:"string"}},proxyEnabled:{type:"boolean"},enabled:{type:"boolean"}}}}},async(t,o)=>{let r=n.providerService.updateProvider(t.params.id,t.body);if(!r)throw W("Provider not found",404,"provider_not_found");return r}),n.delete("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async t=>{if(!n.providerService.deleteProvider(t.params.id))throw W("Provider not found",404,"provider_not_found");return{message:"Provider deleted successfully"}}),n.patch("/providers/:id/toggle",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]},body:{type:"object",properties:{enabled:{type:"boolean"}},required:["enabled"]}}},async(t,o)=>{if(!n.providerService.toggleProvider(t.params.id,t.body.enabled))throw W("Provider not found",404,"provider_not_found");return{message:`Provider ${t.body.enabled?"enabled":"disabled"} successfully`}})}});var Ke,Mr=w(()=>{"use strict";Ke=class n{constructor(e,t,o){this.configService=e;this.transformerService=t;this.logger=o;this.initializeCustomProviders()}providers=new Map;modelRoutes=new Map;reload(){let e=new n(this.configService,this.transformerService,this.logger);this.providers=e.providers,this.modelRoutes=e.modelRoutes}initializeCustomProviders(){let e=this.configService.get("providers");if(e&&Array.isArray(e)){this.initializeFromProvidersArray(e);return}}initializeFromProvidersArray(e){e.forEach(t=>{try{if(!t.name||!t.api_base_url||!t.api_key)return;let o={};t.transformer&&Object.keys(t.transformer).forEach(s=>{s==="use"?Array.isArray(t.transformer.use)&&(o.use=t.transformer.use.map(i=>{if(Array.isArray(i)&&typeof i[0]=="string"){let a=this.transformerService.getTransformer(i[0]);if(a)return new a(i[1])}if(typeof i=="string"){let a=this.transformerService.getTransformer(i);return typeof a=="function"?new a:a}}).filter(i=>typeof i<"u")):Array.isArray(t.transformer[s]?.use)&&(o[s]={use:t.transformer[s].use.map(i=>{if(Array.isArray(i)&&typeof i[0]=="string"){let a=this.transformerService.getTransformer(i[0]);if(a)return new a(i[1])}if(typeof i=="string"){let a=this.transformerService.getTransformer(i);return typeof a=="function"?new a:a}}).filter(i=>typeof i<"u")})});let r=t.default_thinking_level;if(r){let s=this.transformerService.getTransformer("defaultthinking");if(s){let i=new s({level:r});o.use=[i,...o.use||[]]}else this.logger.warn(`default_thinking_level set on ${t.name} but defaultthinking transformer is not registered`)}this.registerProvider({name:t.name,baseUrl:t.api_base_url,apiKey:t.api_key,pluginManaged:t.ccr_managed===!0,models:t.models||[],quotaToken:t.quota_token,quotaSecToken:t.quota_sec_token,transformer:t.transformer?o:void 0,cacheMode:t.cache_mode||"exclusive",enabled:t.enabled!==!1,proxyEnabled:t.proxy_enabled===!0,wakeupEnabled:t.wakeup_enabled===!0,wakeupTime:t.wakeup_time||"06:00",wakeupModel:t.wakeup_model||""}),this.logger.info(`${t.name} provider registered`)}catch(o){this.logger.error(`${t.name} provider registered error: ${o}`)}})}registerProvider(e){let t={...e,enabled:e.enabled!==!1,proxyEnabled:e.proxyEnabled===!0,wakeupEnabled:e.wakeupEnabled===!0,wakeupTime:e.wakeupTime||"06:00",wakeupModel:e.wakeupModel||""};return this.providers.set(t.name,t),e.models.forEach(o=>{let r=`${t.name},${o}`,s={provider:t.name,model:o,fullModel:r};this.modelRoutes.set(r,s),this.modelRoutes.has(o)||this.modelRoutes.set(o,s)}),t}getProviders(){return Array.from(this.providers.values())}getProvider(e){return this.providers.get(e)}updateProvider(e,t){let o=this.providers.get(e);if(!o)return null;let r={...o,...t,updatedAt:new Date};return this.providers.set(e,r),t.models&&(o.models.forEach(s=>{let i=`${o.name},${s}`;this.modelRoutes.delete(i),this.modelRoutes.delete(s)}),t.models.forEach(s=>{let i=`${o.name},${s}`,a={provider:o.name,model:s,fullModel:i};this.modelRoutes.set(i,a),this.modelRoutes.has(s)||this.modelRoutes.set(s,a)})),r}deleteProvider(e){let t=this.providers.get(e);return t?(t.models.forEach(o=>{let r=`${t.name},${o}`;this.modelRoutes.delete(r),this.modelRoutes.delete(o)}),this.providers.delete(e),!0):!1}toggleProvider(e,t){let o=this.providers.get(e);if(!o)return!1;o.enabled=t;let r=this.configService.get("providers");if(r&&Array.isArray(r)){let s=r.find(i=>i.name===e);s&&(s.enabled=t)}return!0}resolveModelRoute(e){let t=this.modelRoutes.get(e);if(!t)return null;let o=this.providers.get(t.provider);return o?{provider:o,originalModel:e,targetModel:t.model}:null}getAvailableModelNames(){let e=[];return this.providers.forEach(t=>{t.enabled!==!1&&t.models.forEach(o=>{e.push(o),e.push(`${t.name},${o}`)})}),e}getModelRoutes(){return Array.from(this.modelRoutes.values())}parseTransformerConfig(e){return e?Array.isArray(e)?e.reduce((t,o)=>{if(Array.isArray(o)){let[r,s={}]=o;t[r]=s}else t[o]={};return t},{}):e:{}}async getAvailableModels(){let e=[];return this.providers.forEach(t=>{t.enabled!==!1&&t.models.forEach(o=>{e.push({id:o,object:"model",owned_by:t.name,provider:t.name}),e.push({id:`${t.name},${o}`,object:"model",owned_by:t.name,provider:t.name})})}),{object:"list",data:e}}}});var Ae,Qn,aa,rd,ca,mt=w(()=>{Ae=n=>n>0?n<=1024?"low":n<=8192?"medium":n<=16384?"high":"max":"none",Qn=n=>n==="none"?0:n==="low"?1024:n==="medium"?8192:n==="high"?16384:32768,aa=["low","medium","high"],rd={none:"none",off:"none",disabled:"none",min:"low",minimal:"low",light:"low",low:"low",medium:"medium",mid:"medium",high:"high",xhigh:"max",max:"max",maximum:"max",ultra:"max",ultracode:"max"},ca=n=>{if(typeof n=="string")return rd[n.trim().toLowerCase()]}});var Lr,la=w(()=>{Lr=(n,e)=>(n.includes("base64")&&(n=n.split("base64").pop(),n.startsWith(",")&&(n=n.slice(1))),`data:${e};base64,${n}`)});function sd(n){return n.filter(e=>!!e?.function?.name).map(e=>({name:e.function.name,description:e.function.description,input_schema:e.function.parameters}))}function ua(n){let e=[],t=[],o=d=>{if(typeof d=="string"){t.push({type:"text",text:d});return}Array.isArray(d)&&d.forEach(m=>{if(typeof m=="string"){t.push({type:"text",text:m});return}m&&typeof m=="object"&&m.type==="text"&&m.text&&t.push({...m})})},r=()=>{let d=new Map;for(let m=0;m<t.length;m++){let g=t[m],f=g?.text??JSON.stringify(g),h=d.get(f);if(h===void 0){d.set(f,m);continue}!t[h]?.cache_control&&g?.cache_control&&(t[h]=g),t.splice(m,1),m--}};n.messages.forEach(d=>{d.role==="system"?o(d.content):e.push(d)}),r();let s=[];for(let d=0;d<e.length;d++){let m=e[d];if(m.role==="tool"){let g=m.content;try{typeof m.content=="string"&&(g=JSON.parse(m.content))}catch{}g!=null&&typeof g!="object"&&typeof g!="string"&&(g=String(g));let f={type:"tool_result",tool_use_id:m.tool_call_id,content:g};m.cache_control&&(f.cache_control=m.cache_control);let h=s[s.length-1];h&&h.role==="user"&&Array.isArray(h.content)?h.content.push(f):s.push({role:"user",content:[f]})}else if(m.role==="user"){let g=[];typeof m.content=="string"?g.push({type:"text",text:m.content}):Array.isArray(m.content)&&m.content.forEach(h=>{h&&typeof h=="object"&&h.type==="image_url"&&h.image_url?.url?g.push({type:"image",source:{type:"base64",media_type:h.media_type||"image/jpeg",data:h.image_url.url.split(",")[1]||h.image_url.url}}):g.push(h)});let f=s[s.length-1];f&&f.role==="user"&&Array.isArray(f.content)?f.content.push(...g):s.push({role:"user",content:g.length>0?g:[{type:"text",text:" "}]})}else if(m.role==="assistant"){let g=[];m.content&&(typeof m.content=="string"?g.push({type:"text",text:m.content}):Array.isArray(m.content)&&g.push(...m.content)),m.tool_calls&&m.tool_calls.length>0&&m.tool_calls.forEach(h=>{let b={};try{b=JSON.parse(h.function.arguments)}catch{b=h.function.arguments}g.push({type:"tool_use",id:h.id,name:h.function.name,input:b})}),m.thinking&&g.unshift({type:"thinking",thinking:m.thinking.content,signature:m.thinking.signature});let f=s[s.length-1];f&&f.role==="assistant"&&Array.isArray(f.content)?f.content.push(...g):s.push({role:"assistant",content:g.length>0?g:[{type:"text",text:" "}]})}}let i=()=>{let d=t.filter(m=>m?.cache_control).length;for(let m of s)Array.isArray(m.content)&&(d+=m.content.filter(g=>g?.cache_control).length);return d},a=d=>d&&typeof d=="object"?{...d}:{type:"ephemeral"},l=()=>{for(let d=s.length-1;d>=0;d--){let m=s[d]?.content;if(!Array.isArray(m))continue;let g=m.find(f=>f?.cache_control);if(g?.cache_control)return g.cache_control}for(let d=t.length-1;d>=0;d--)if(t[d]?.cache_control)return t[d].cache_control;return{type:"ephemeral"}},c=(d,m)=>{if(!Array.isArray(d?.content)||d.content.some(f=>f?.cache_control))return!1;let g=d.content.find(f=>f&&typeof f=="object"&&!f.cache_control);return g?(g.cache_control=a(m),!0):!1};(()=>{let d=4-i();if(d<=0||s.length===0)return;let m=s,g=l(),f=[];for(let h=m.length-1;h>=0;h--)m[h]?.role!=="user"||!Array.isArray(m[h].content)||f.push(h);for(let h of f){if(d<=0)break;c(m[h],g)&&d--}})();let p={messages:s,model:n.model,max_tokens:n.max_tokens||4096,temperature:n.temperature,stream:n.stream};if(n.reasoning?.enabled){let d=n.reasoning.max_tokens||Qn(n.reasoning.effort||"medium"),m=Math.min(d,p.max_tokens-1024);m>=1024&&(p.thinking={type:"enabled",budget_tokens:m});let g=n.reasoning.effort&&n.reasoning.effort!=="none"?n.reasoning.effort:Ae(d);aa.includes(g)&&(p.output_config={...p.output_config||{},effort:g})}if(t.length>0){let d=t.some(m=>m?.cache_control);p.system=d?t:t.map(m=>m.text||"").join(`
|
|
48
48
|
|
|
49
49
|
`)}return n.tools&&n.tools.length>0&&(p.tools=sd(n.tools),n.tool_choice&&(n.tool_choice==="auto"?p.tool_choice={type:"auto"}:n.tool_choice==="any"||n.tool_choice==="required"?p.tool_choice={type:"any"}:typeof n.tool_choice=="string"?p.tool_choice={type:"tool",name:n.tool_choice}:typeof n.tool_choice=="object"&&n.tool_choice.type==="function"&&(p.tool_choice={type:"tool",name:n.tool_choice.function.name}))),p}var da=w(()=>{mt()});function id(n){if(n===!0)return!0;if(n===!1)return!1;if(typeof n!="string")return;let e=n.trim().toLowerCase();if(e==="enabled"||e==="adaptive"||e==="true")return!0;if(e==="disabled"||e==="off"||e==="none"||e==="false")return!1}var Yn,Xn,pa=w(()=>{"use strict";Yn=require("uuid");mt();vn();ne();la();da();We();Xn=class{constructor(e){this.options=e;this.useBearer=this.options?.UseBearer??!1}name="Anthropic";endPoint="/v1/messages";useBearer;logger;async auth(e,t){let o={};return this.useBearer?(o.authorization=`Bearer ${t.apiKey}`,o["x-api-key"]=void 0):(o["x-api-key"]=t.apiKey,o.authorization=void 0),{body:e,config:{headers:o}}}async transformRequestOut(e){let t=[];if(e.system){if(typeof e.system=="string")t.push({role:"system",content:e.system});else if(Array.isArray(e.system)&&e.system.length){let a=e.system.filter(l=>l.type==="text"&&l.text).map(l=>({type:"text",text:l.text,cache_control:l.cache_control}));t.push({role:"system",content:a})}}let o=JSON.parse(JSON.stringify(e.messages||[]));o?.forEach(a=>{a.role==="system"&&t.push({role:"system",content:a.content})}),o?.forEach(a=>{if(a.role!=="system"&&(a.role==="user"||a.role==="assistant")){if(typeof a.content=="string"){t.push({role:a.role,content:a.content});return}if(Array.isArray(a.content)){if(a.role==="user"){let l=a.content.filter(u=>u.type==="tool_result"&&u.tool_use_id);if(l.length){let u=jt(String(e.model??"")),p=[];l.forEach(d=>{let m=Array.isArray(d.content)?d.content:null,g=m?m.filter(b=>b?.type==="image"&&b?.source):[],f=typeof d.content=="string"?d.content:JSON.stringify(d.content);if(g.length>0){let b=m.filter(_=>!(_?.type==="image"&&_?.source)).map(_=>_?.type==="text"?String(_.text??""):JSON.stringify(_)).filter(_=>_.length>0).join(`
|
|
50
50
|
`);u?(f=b||"[tool image]",p.push(...g)):(f=[b,...g.map(()=>"(tool image omitted: target model does not support image input)")].filter(_=>_.length>0).join(`
|