@wengine-ai/llms 2.3.2420 → 2.3.2421
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 -0
- package/dist/cjs/server.cjs +148 -148
- package/dist/cjs/server.cjs.map +3 -3
- package/dist/esm/server.mjs +148 -148
- package/dist/esm/server.mjs.map +3 -3
- package/dist/index.html +20 -20
- package/package.json +2 -2
package/dist/esm/server.mjs
CHANGED
|
@@ -1,56 +1,56 @@
|
|
|
1
1
|
import { createRequire as __createRequire } from "node:module"; import { fileURLToPath as __fileURLToPath } from "node:url"; import { dirname as __pathDirname } from "node:path"; const require = __createRequire(import.meta.url); const __filename = __fileURLToPath(import.meta.url); const __dirname = __pathDirname(__filename);
|
|
2
|
-
var fo=Object.defineProperty;var qc=Object.getOwnPropertyDescriptor;var el=Object.getOwnPropertyNames;var tl=Object.prototype.hasOwnProperty;var ot=(n=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(n,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):n)(function(n){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+n+'" is not supported')});var R=(n,e)=>()=>(n&&(e=n(n=0)),e);var mo=(n,e)=>{for(var t in e)fo(n,t,{get:e[t],enumerable:!0})},nl=(n,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of el(e))!tl.call(n,r)&&r!==t&&fo(n,r,{get:()=>e[r],enumerable:!(o=qc(e,r))||o.enumerable});return n};var ol=n=>nl(fo({},"__esModule",{value:!0}),n);import{Agent as rl,ProxyAgent as sl}from"undici";function al(n){if(n==null)return{ok:!0};let e=String(n).trim();if(!e)return{ok:!0};if(il.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 Ts(n){let e=[];for(let t of[...bs,ks]){let o=n[t];if(o==null)continue;let r=al(o);r.ok||e.push({key:t,error:r.error})}return e}function ho(){return go||(go=new rl({connect:{timeout:15e3}})),go}function vs(n){let e=n.get(ks);return(typeof e=="string"?e.trim():"")||void 0}function xs(n){return n?K(n):ho()}function jt(n){for(let e of bs){let t=n.get(e);if(t==null)continue;let o=String(t).trim();if(o)return o}}function Ss(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 ue(n,e){let t=jt(n);if(t)return Ss(n.get("PROXY_GLOBAL_ENABLED"))||e?.proxyEnabled===!0||e?.proxy_enabled===!0?t:void 0}function K(n){let e=cl(n),t=Ut.get(e);if(t)return t;let o=new sl(e);return Ut.set(e,o),o}async function yo(){let n=Array.from(Ut.values());Ut.clear(),await Promise.allSettled(n.map(e=>e.close()))}function cl(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 bs,ks,il,Ut,go,q=R(()=>{"use strict";bs=["HTTPS_PROXY","https_proxy","httpsProxy","PROXY_URL"],ks="SUBSCRIPTION_PROXY_URL",il=/\$\{[^}]+\}|\$[A-Z_][A-Z0-9_]*/;Ut=new Map});import{readFileSync as ll,existsSync as Cs}from"fs";import{join as Rs}from"path";import{config as ul}from"dotenv";import dl from"json5";var
|
|
2
|
+
var fo=Object.defineProperty;var qc=Object.getOwnPropertyDescriptor;var el=Object.getOwnPropertyNames;var tl=Object.prototype.hasOwnProperty;var ot=(n=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(n,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):n)(function(n){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+n+'" is not supported')});var R=(n,e)=>()=>(n&&(e=n(n=0)),e);var mo=(n,e)=>{for(var t in e)fo(n,t,{get:e[t],enumerable:!0})},nl=(n,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of el(e))!tl.call(n,r)&&r!==t&&fo(n,r,{get:()=>e[r],enumerable:!(o=qc(e,r))||o.enumerable});return n};var ol=n=>nl(fo({},"__esModule",{value:!0}),n);import{Agent as rl,ProxyAgent as sl}from"undici";function al(n){if(n==null)return{ok:!0};let e=String(n).trim();if(!e)return{ok:!0};if(il.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 Ts(n){let e=[];for(let t of[...bs,ks]){let o=n[t];if(o==null)continue;let r=al(o);r.ok||e.push({key:t,error:r.error})}return e}function ho(){return go||(go=new rl({connect:{timeout:15e3}})),go}function vs(n){let e=n.get(ks);return(typeof e=="string"?e.trim():"")||void 0}function xs(n){return n?K(n):ho()}function jt(n){for(let e of bs){let t=n.get(e);if(t==null)continue;let o=String(t).trim();if(o)return o}}function Ss(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 ue(n,e){let t=jt(n);if(t)return Ss(n.get("PROXY_GLOBAL_ENABLED"))||e?.proxyEnabled===!0||e?.proxy_enabled===!0?t:void 0}function K(n){let e=cl(n),t=Ut.get(e);if(t)return t;let o=new sl(e);return Ut.set(e,o),o}async function yo(){let n=Array.from(Ut.values());Ut.clear(),await Promise.allSettled(n.map(e=>e.close()))}function cl(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 bs,ks,il,Ut,go,q=R(()=>{"use strict";bs=["HTTPS_PROXY","https_proxy","httpsProxy","PROXY_URL"],ks="SUBSCRIPTION_PROXY_URL",il=/\$\{[^}]+\}|\$[A-Z_][A-Z0-9_]*/;Ut=new Map});import{readFileSync as ll,existsSync as Cs}from"fs";import{join as Rs}from"path";import{config as ul}from"dotenv";import dl from"json5";var Ae,_o=R(()=>{"use strict";q();Ae=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:Rs(process.cwd(),this.options.jsonPath);if(Cs(e))try{let t=ll(e,"utf-8"),o=dl.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:Rs(process.cwd(),this.options.envPath);if(Cs(e))try{let t=ul({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 jt(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 B(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 ws(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 Ht=R(()=>{"use strict"});function ko(n){bo=n}function zt(){return bo}function Bt(n){return bo||n.get("DEBUG_LOG")===!0}function As(n){let e=n.get("DEBUG_LOG_OPTIONS");return!e||typeof e!="object"?Oe:{maxBodyLength:e.maxBodyLength??Oe.maxBodyLength,maxStreamChunks:e.maxStreamChunks??Oe.maxStreamChunks}}function Jt(n){let e={};for(let[t,o]of Object.entries(n)){let r=t.toLowerCase();pl.has(r)||fl.test(r)&&!/^(?:x-|anthropic-)?ratelimit-/.test(r)?e[t]="***MASKED***":e[t]=o}return e}function Wt(n,e){return n.length<=e?n:n.slice(0,e)+`...[truncated, total ${n.length} bytes]`}function Os(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:Jt(t.headers),body:Wt(o,Oe.maxBodyLength)})}function Is(n,e,t){n.info({debug_log:!0,reqId:e,phase:"provider_response",status:t.status,headers:Jt(t.headers),...t.body!==void 0?{body:Wt(t.body,Oe.maxBodyLength)}:{}})}function Ps(n,e,t,o){let r=ml(o);n.info({debug_log:!0,reqId:e,phase:"provider_stream_chunk",chunkIndex:t,...r?{usage_monitor:r}:{},data:Wt(o,Oe.maxBodyLength)})}function ml(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:Wt(o,512)})}}if(e.length)return e.length===1?e[0]:e}function Es(n,e,t){n.info({debug_log:!0,reqId:e,phase:"provider_stream_end",totalChunks:t})}function Ms(n,e,t,o){(async()=>{let r=n.pipeThrough(new TextDecoderStream).getReader(),s=0;try{let a="";for(;;){let{done:i,value:c}=await r.read();if(i)break;a+=c;let l=a.split(`
|
|
3
3
|
|
|
4
|
-
`);a=l.pop()||"";for(let u of l)u.trim()&&(s<o.maxStreamChunks?Ps(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++)}a.trim()&&(s<o.maxStreamChunks&&Ps(e,t,s,a.trim()),s++),Es(e,t,s)}catch(a){console.error(`[debug_log] Error reading debug stream for reqId=${t}:`,a),Es(e,t,s)}finally{r.releaseLock()}})()}var pl,fl,
|
|
5
|
-
`)){let r=o.trim();if(!(!r.startsWith("data:")&&!r.startsWith("event:"))){if(hl.some(s=>r.includes(s))){e=!0;break}_l.some(s=>r.includes(s))&&(t=!0)}}return e||yl(n)?"content":t?"empty":"pending"}async function Ds(n,e=65536,t=1e4){let o=n.getReader(),r=new TextDecoder,s=[],a="",i=0,c=Date.now()+t,l=(u,p)=>({verdict:u,chunks:s,bytes:i,rest:p});try{for(;;){let u=c-Date.now(),p=Symbol("timeout"),d,m=o.read(),h=u<=0?p:await Promise.race([m,new Promise(g=>{d=setTimeout(()=>g(p),u)})]);if(d&&clearTimeout(d),h===p)return l(To(a)==="content"?"content":"pending",Kt(o,m));if(h.done){a+=r.decode();let g=To(a);return l(g==="empty"?"empty":"pending",null)}if(!h.value)continue;s.push(h.value),i+=h.value.byteLength,a+=r.decode(h.value,{stream:!0});let f=To(a);if(f==="content")return l("content",Kt(o));if(f==="empty")return await o.cancel().catch(()=>{}),l("empty",null);if($s(a)||i>=e)return l("pending",Kt(o))}}catch(u){throw await o.cancel().catch(()=>{}),u}}function Kt(n,e){return new ReadableStream({start(t){let o=e,r=()=>{let s=o??n.read();o=void 0,s.then(({done:a,value:i})=>{a?t.close():(t.enqueue(i),r())}).catch(a=>t.error(a))};r()},cancel(t){return n.cancel(t)}})}function Fs(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:a})=>{s?o.close():(o.enqueue(a),r())}).catch(s=>o.error(s))};r()},cancel(o){return t?.cancel(o)}})}var hl,_l,Us=R(()=>{"use strict";hl=["content_block_start","content_block_delta","content_block_stop"];_l=["message_stop","response.completed","response.incomplete","[DONE]"]});function bl(n,e){return`${n.name}|${e?.name??""}`}function vo(n){return n.__ccrPluginRequestState??={budgets:new Map}}function Oe(n,e,t){let o=vo(n),r=bl(e,t),s=o.budgets.get(r);return s||(s={refreshUsed:!1},o.budgets.set(r,s)),s}function xo(n,e,t,o){return!e||t?.nonRetryable!==!0?!1:(Oe(n,e,o).terminalError=t,!0)}var js=R(()=>{"use strict"});var So=R(()=>{"use strict"});import kl from"fastify";function Hs(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 st,Tl,Ro,Gt=R(()=>{"use strict";So();st=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,a])=>{if(e.hasTransformer(s))throw new Error(`transformer "${s}" is already registered`);return[s,e.preparePluginTransformer(a)]})),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:[]},a="staging",i,c=u=>{try{if(this.assertOpen(),a!=="staging")throw new Error("plugin activation is no longer open");u()}catch(p){throw i=p,p}};return{context:{manifest:s.manifest,log:t,host:o,registerTransformer:u=>c(()=>{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=>c(()=>{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=>c(()=>{s.routes.push(u)}),registerConfigProtector:u=>c(()=>{s.protectors.push(u)}),registerUiCard:u=>c(()=>{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=>c(()=>{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(a!=="staging")throw new Error("plugin activation is no longer open");if(i)throw i;if(this.plugins.has(e.name))throw new Error(`plugin "${e.name}" is already registered`);for(let f of this.plugins.values()){for(let g of s.runtimes.keys())if(f.runtimes.has(g))throw new Error(`managed runtime "${g}" is already registered`);for(let g of s.transformers.keys())if(f.transformers.has(g))throw new Error(`transformer "${g}" is already registered`)}let m=[...this.transformerServices].flatMap(f=>[...s.transformers].map(([g,_])=>{if(f.hasTransformer(g))throw new Error(`transformer "${g}" is already registered`);return{service:f,name:g,value:f.preparePluginTransformer(_)}})),h=[];try{for(let f of m)h.push(f),f.service.registerTransformer(f.name,f.value);s.card=u,this.plugins.set(e.name,s),this.revision++,a="committed"}catch(f){for(let g of h)g.service.removeTransformer(g.name);throw a="aborted",f}},get cardPath(){return s.cardPath},abort:()=>{a="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:(i,c)=>{if(c==="route")return u=>(r.push(u),s);if(o.has(String(c)))return(u,p,d)=>(r.push({...typeof p=="function"?{}:p,method:c==="all"?["DELETE","GET","HEAD","PATCH","POST","PUT","OPTIONS"]:String(c).toUpperCase(),url:u,handler:d??p}),s);let l=Reflect.get(i,c);return typeof l=="function"?()=>{throw new Error(`plugin route registration cannot call ${String(c)}`)}:l}}),a=kl({logger:!1});try{for(let i of e){let c=i(s);c!==s&&await c}for(let i of this.plugins.values())for(let c of i.preparedRoutes)a.route(c);for(let i of r){let c=Array.isArray(i.method)?i.method:[i.method];for(let l of c)if(t.hasRoute({method:l,url:i.url,constraints:i.constraints}))throw new Error(`plugin route ${l} ${i.url} is already registered`);a.route(i)}return await a.ready(),r}finally{await a.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")}},Tl=new st,Ro=()=>Tl});async function Te(n,e,t,o,r){let s;try{s=n.classifyError?.(e,t,o)}catch{}let a=s&&/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,95}$/.test(s.code)?s.code:"plugin_upstream_error",i=s?{...s,code:a,message:`Provider plugin request failed (${a}).`}:{code:a,message:"Provider plugin returned an invalid upstream response.",httpStatus:e>=400&&e<=599?e:502,retryable:e===0||e>=500};try{await n.noteUpstreamError?.(i)}catch{}let c=Hs(n.name,i);return c.isRateLimit=i.httpStatus===429,c.upstreamStatus=e,r?.errorName&&(c.upstreamErrorName=r.errorName),c}var zs=R(()=>{"use strict";Gt()});var Vt,wo=R(()=>{Vt="2.3.2419"});var Bs={};mo(Bs,{getFallbackPromotionStore:()=>Ie,resetFallbackPromotionStore:()=>Sl});function Ie(n){return ve||(ve=new Po,n&&ve.configure(n)),ve}function Sl(){ve&&(ve.clearAll(),ve=null)}var xl,Po,ve,Qt=R(()=>{"use strict";re();xl=600*1e3,Po=class{promotions=new Map;enabled=!0;ttlMs=xl;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,a){if(!this.enabled)return;let i=this.getKey(e,t,o),c=`${r},${s}`;this.promotions.set(i,{promotedModel:c,timestamp:Date.now(),ttlMs:a??this.ttlMs})}getPromotion(e,t,o,r){if(!this.enabled)return null;let s=this.getKey(e,t,o),a=this.promotions.get(s);if(!a)return null;if(Date.now()-a.timestamp>=a.ttlMs)return this.promotions.delete(s),null;let[c,...l]=a.promotedModel.split(","),u=l.join(",");if(!j().isAvailable(c,u))return this.promotions.delete(s),null;let d=r.find(h=>h.name.toLowerCase()===c.toLowerCase()),m=d?.models?.find(h=>String(h).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}},ve=null});import{existsSync as Ks,mkdirSync as Cl,readFileSync as Rl,writeFileSync as wl}from"fs";import{join as Gs}from"path";import{HOME_DIR as Pl}from"@wengine-ai/claude-code-router-shared";function Il(n){try{if(!Ks(Oo))return;let e=JSON.parse(Rl(Oo,"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 Ws(n){try{let e=n.getAllStates();if(e.length===0)return;Ks(Ao)||Cl(Ao,{recursive:!0});let t=e.map(o=>({...o,updatedAt:Date.now()}));wl(Oo,JSON.stringify(t,null,2),"utf-8")}catch{}}function Io(){if(Js)return;Js=!0;let n=j();Il(n),Ol=setInterval(()=>Ws(n),6e4),process.on("exit",()=>Ws(n))}function j(n){return Eo||(Eo=new Yt(n)),Eo}var El,Al,Yt,Ao,Oo,Js,Ol,Eo,re=R(()=>{"use strict";El=120,Al={enabled:!0,failureThreshold:3,probeIntervalMinutes:5,halfOpenSuccessThreshold:2},Yt=class{states=new Map;config;probeTimer;constructor(e){this.config={...Al,...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}=(Qt(),ol(Bs));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 a=this.states.get(s);a?(a.status="open",a.lastFailureTime=Date.now(),a.lastError=r||"rate-limited",a.lastProbeTime=0):(a={provider:e,model:t,status:"open",failureCount:0,successCount:0,lastFailureTime:Date.now(),lastProbeTime:0,lastError:r||"rate-limited"},this.states.set(s,a));let i=(o??El)*1e3;a.rateLimitUntil=Date.now()+i}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)}},Ao=Gs(Pl,"runtime"),Oo=Gs(Ao,"provider-health.json"),Js=!1,Ol=null;Eo=null});import{existsSync as Zs,mkdirSync as Ml,readFileSync as Ll,writeFileSync as Nl}from"fs";import{join as qs}from"path";import{HOME_DIR as $l}from"@wengine-ai/claude-code-router-shared";function it(n,e,t){let o=i=>{if(t instanceof Headers)return t.get(i);let c=Object.keys(t).find(l=>l.toLowerCase()===i);return c?t[c]:null},r=Mo(o,Dl),s=Mo(o,Fl),a=Mo(o,Ul);(r||s||a)&&Me.set(n,{provider:n,remaining:Ys(r),limit:Ys(s),reset:Hl(a),capturedAt:Date.now()})}function jl(n){return Me.get(n)}function $o(){return Array.from(Me.values())}function Mo(n,e){for(let t of e){let o=n(t);if(o)return o}return null}function Ys(n){if(!n)return null;let e=Number(n.trim().replace(/,/g,""));return Number.isFinite(e)?e:null}function Hl(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=zl(e);return r===null?null:Math.floor((Date.now()+r)/1e3)}function zl(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]),a=r[2].toLowerCase();if(Number.isFinite(s))switch(a){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 Bl(){try{if(!Zs(No))return;let n=JSON.parse(Ll(No,"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;Me.set(t.provider,t)}}catch{}}function Xs(){try{if(Me.size===0)return;Zs(Lo)||Ml(Lo,{recursive:!0}),Nl(No,JSON.stringify(Array.from(Me.values()),null,2),"utf-8")}catch{}}function at(){Vs||(Vs=!0,Bl(),Qs=setInterval(Xs,6e4),Qs.unref?.(),process.on("exit",Xs))}var Lo,No,Me,Vs,Qs,Dl,Fl,Ul,Le=R(()=>{"use strict";Lo=qs($l,"runtime"),No=qs(Lo,"rate-limit.json"),Me=new Map,Vs=!1,Qs=null,Dl=["x-ratelimit-remaining-tokens","x-ratelimit-remaining-requests","x-ratelimit-remaining"],Fl=["x-ratelimit-limit-tokens","x-ratelimit-limit-requests","x-ratelimit-limit"],Ul=["x-ratelimit-reset-tokens","x-ratelimit-reset-requests","x-ratelimit-reset"]});function Zt(){return Do||(Do=new Uo),Do}function Ho(){return Fo||(Fo=new jo),Fo}function Jl(n){return n?.sessionId||n?.clientContext?.stableSessionId||void 0}function ei(n){let e=Jl(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 ti(n,e){let t=Zt(),o=n?.[Xt];if(o&&!o.released){if(o.key===e)return;t.release(o)}n[Xt]=t.acquire(e)}function zo(n){let e=n?.[Xt];e&&Zt().release(e)}function ni(n,e){let t=ei(n),o=n?.[Xt],r=t?Ho().get(t)!==void 0:!1;!o&&!r||(t&&Ho().bind(t,e),ti(n,e))}function Wl(n,e,t){let o=Zt(),r=null,s=1/0;for(let a of e){if(!a||typeof a!="string")continue;let i=t(a);if(!i||i===n)continue;let c=o.count(i);c<s&&(r=i,s=c)}return r}function oi(n,e,t){let o=ei(n),r=Ho(),s=Zt(),a=Number.isFinite(t.threshold)&&t.threshold>0?Math.floor(t.threshold):3,i;if(o){let c=r.get(o);if(c&&c!==e){let l=t.resolve(c);l?(i=l,t.log?.(`Concurrency priority: session slot ${o} sticking to bound model ${l}`)):r.unbind(o)}else c&&(i=e)}if(!i){let c=s.count(e);if(c>=a){let l=Wl(e,t.fallbackModels,t.resolve);l&&(i=l,t.log?.(`Concurrency priority: model ${e} has ${c} in-flight request(s) (>= ${a}); assigning ${o?`session slot ${o} `:"request "}to overflow model ${l}`))}i=i||e,o&&r.bind(o,i)}return ti(n,i),i}var Uo,jo,Do,Fo,Xt,qt=R(()=>{"use strict";Uo=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()}},jo=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()}},Do=null,Fo=null;Xt="__concurrencyLease"});async function F(n){let e=await n.text();return Kl(e,n.status)}function Kl(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 ri(n){return(n.headers.get("Content-Type")||"").includes("text/event-stream")}function ct(n){return/^\s*(event:|data:|:\s*[A-Z])/m.test(n)||n.startsWith("data:")}async function de(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 a=0;a<8;a++){let{value:i,done:c}=await o.read();if(c||(i&&(s+=r.decode(i,{stream:!0})),ct(s))||/^\s*[\[{]/.test(s))break}s+=r.decode()}finally{o.releaseLock()}return e.cancel().catch(()=>{}),{body:t,isSSE:ct(s)}}async function me(n){try{let e=await n.text();if(ct(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 V=R(()=>{"use strict"});function Gl(n){if(!n||typeof n!="object")return;let e=Number(n.input_tokens??n.prompt_tokens??0)||0,t=Number(n.output_tokens??n.completion_tokens??0)||0,o=Number(n.input_tokens_details?.cached_tokens??n.prompt_tokens_details?.cached_tokens??n.cache_read_input_tokens??0)||0,r=Number(n.input_tokens_details?.cache_write_tokens??n.input_tokens_details?.cache_creation_tokens??n.cache_creation_input_tokens??0)||0;return{prompt_tokens:e,completion_tokens:t,total_tokens:Number(n.total_tokens??e+t)||0,prompt_tokens_details:{cached_tokens:o,cache_write_tokens:r},completion_tokens_details:{reasoning_tokens:Number(n.output_tokens_details?.reasoning_tokens??0)||0}}}var Ne,Bo=R(()=>{"use strict";V();Ne=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 a="";typeof s=="string"?a=s:s&&typeof s=="object"&&"text"in s&&(a=s.text),t.push({role:"system",content:a})}):e.instructions=r.content}if(e.messages.forEach(r=>{if(r.role!=="system"){if(Array.isArray(r.content)){let s=r.content.map(a=>this.normalizeRequestContent(a,r.role)).filter(a=>a!==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,t){let o=e.headers.get("Content-Type")||"";if(!o.includes("text/event-stream")&&!o.includes("application/json")&&e.body){let r=await de(e);if(r?.isSSE&&r.body){let s=new Response(r.body,{status:e.status,statusText:e.statusText,headers:new Headers({...Object.fromEntries(e.headers.entries()),"content-type":"text/event-stream"})});return this.transformResponseOut(s)}r?.body&&(e=new Response(r.body,{status:e.status,statusText:e.statusText,headers:e.headers}))}if(o.includes("application/json")){let r=await de(e);if(r?.isSSE&&r.body){let s=new Response(r.body,{status:e.status,statusText:e.statusText,headers:new Headers({...Object.fromEntries(e.headers.entries()),"content-type":"text/event-stream"})});return this.transformResponseOut(s)}if(r?.body)e=new Response(r.body,{status:e.status,statusText:e.statusText,headers:e.headers});else if(r===null){let s=await me(e);if(s.isSSE)return this.transformResponseOut(s.response);e=s.response}}if(o.includes("application/json")){let r=await F(e);if(r.object==="response"&&r.output){let s=this.convertResponseToChat(r);return new Response(JSON.stringify(s),{status:e.status,statusText:e.statusText,headers:e.headers})}return r.type==="message"&&Array.isArray(r.content)?new Response(JSON.stringify(r),{status:e.status,statusText:e.statusText,headers:e.headers}):new Response(JSON.stringify(r),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(o.includes("text/event-stream")){if(!e.body)return e;let[r,s]=e.body.tee(),a=r.getReader(),i=new TextDecoder,c="",l=["message_start","content_block_start","response.created","response.output_text.delta","response.in_progress","response.output_item.added","chat.completion.chunk"];try{for(let y=0;y<8;y++){let{value:k,done:T}=await a.read();if(T||(k&&(c+=i.decode(k,{stream:!0})),l.some(x=>c.includes(x)))||/^\s*[{[]/.test(c))break}c+=i.decode()}finally{a.releaseLock()}if(r.cancel().catch(()=>{}),c.includes("message_start")||c.includes("content_block_start"))return new Response(s,{status:e.status,statusText:e.statusText,headers:e.headers});if((c.includes("response.created")||c.includes("response.output_text.delta")||c.includes("response.in_progress")||c.includes("response.output_item.added"))&&t?.req?.codexDetected)return new Response(s,{status:e.status,statusText:e.statusText,headers:e.headers});let d=new TextDecoder,m=new TextEncoder,h=String(t?.req?.body?.model??t?.req?.originalModel??"unknown"),f="",g=!1,_=this,b=new ReadableStream({async start(y){let k=s.getReader(),T=-1,x="",v=C=>(C!==x&&(T++,x=C),T);try{for(;;){let{done:C,value:S}=await k.read();if(C){g||y.enqueue(m.encode(`data: [DONE]
|
|
4
|
+
`);a=l.pop()||"";for(let u of l)u.trim()&&(s<o.maxStreamChunks?Ps(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++)}a.trim()&&(s<o.maxStreamChunks&&Ps(e,t,s,a.trim()),s++),Es(e,t,s)}catch(a){console.error(`[debug_log] Error reading debug stream for reqId=${t}:`,a),Es(e,t,s)}finally{r.releaseLock()}})()}var pl,fl,Oe,bo,rt=R(()=>{"use strict";pl=new Set(["authorization","x-api-key","x-goog-api-key","cookie","set-cookie"]),fl=/token|secret|credential|passwd|password/i,Oe={maxBodyLength:4096,maxStreamChunks:100},bo=!1});function Ls(n,e,t,o,r){let s=new Headers({"Content-Type":"application/json"});t.headers&&Object.entries(t.headers).forEach(([l,u])=>{u&&s.set(l,u)});let a,i=AbortSignal.timeout(t.TIMEOUT??60*1e3*60);if(t.signal){let l=new AbortController,u=()=>l.abort();t.signal.addEventListener("abort",u),i.addEventListener("abort",u),a=l.signal}else a=i;let c={method:"POST",headers:s,body:JSON.stringify(e),signal:a,...t.redirect?{redirect:t.redirect}:{}};return t.dispatcher?c.dispatcher=t.dispatcher:t.httpsProxy&&(c.dispatcher=K(t.httpsProxy)),r?.debug({reqId:o.req.id,method:"POST",headers:Jt(Object.fromEntries(s.entries())),requestUrl:typeof n=="string"?n:n.toString(),useProxy:gl(t.httpsProxy)},"final request"),fetch(typeof n=="string"?n:n.toString(),c)}function gl(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 Ns=R(()=>{q();rt()});function yl(n){return n.includes('"delta"')?/"delta"\s*:\s*\{[^}]*"(content|tool_calls|reasoning_content|reasoning|function_call)"\s*:\s*("|\[|\{)/.test(n):!1}function $s(n){return/"type"\s*:\s*"response\.[A-Za-z0-9_.]+"/.test(n)||/(^|\n)\s*(event:\s*)?response\.[A-Za-z0-9_.]+/.test(n)}function To(n){if($s(n))return"pending";let e=!1,t=!1;for(let o of n.split(`
|
|
5
|
+
`)){let r=o.trim();if(!(!r.startsWith("data:")&&!r.startsWith("event:"))){if(hl.some(s=>r.includes(s))){e=!0;break}_l.some(s=>r.includes(s))&&(t=!0)}}return e||yl(n)?"content":t?"empty":"pending"}async function Ds(n,e=65536,t=1e4){let o=n.getReader(),r=new TextDecoder,s=[],a="",i=0,c=Date.now()+t,l=(u,p)=>({verdict:u,chunks:s,bytes:i,rest:p});try{for(;;){let u=c-Date.now(),p=Symbol("timeout"),d,f=o.read(),h=u<=0?p:await Promise.race([f,new Promise(m=>{d=setTimeout(()=>m(p),u)})]);if(d&&clearTimeout(d),h===p)return l(To(a)==="content"?"content":"pending",Kt(o,f));if(h.done){a+=r.decode();let m=To(a);return l(m==="empty"?"empty":"pending",null)}if(!h.value)continue;s.push(h.value),i+=h.value.byteLength,a+=r.decode(h.value,{stream:!0});let g=To(a);if(g==="content")return l("content",Kt(o));if(g==="empty")return await o.cancel().catch(()=>{}),l("empty",null);if($s(a)||i>=e)return l("pending",Kt(o))}}catch(u){throw await o.cancel().catch(()=>{}),u}}function Kt(n,e){return new ReadableStream({start(t){let o=e,r=()=>{let s=o??n.read();o=void 0,s.then(({done:a,value:i})=>{a?t.close():(t.enqueue(i),r())}).catch(a=>t.error(a))};r()},cancel(t){return n.cancel(t)}})}function Fs(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:a})=>{s?o.close():(o.enqueue(a),r())}).catch(s=>o.error(s))};r()},cancel(o){return t?.cancel(o)}})}var hl,_l,Us=R(()=>{"use strict";hl=["content_block_start","content_block_delta","content_block_stop"];_l=["message_stop","response.completed","response.incomplete","[DONE]"]});function bl(n,e){return`${n.name}|${e?.name??""}`}function vo(n){return n.__ccrPluginRequestState??={budgets:new Map}}function Ie(n,e,t){let o=vo(n),r=bl(e,t),s=o.budgets.get(r);return s||(s={refreshUsed:!1},o.budgets.set(r,s)),s}function xo(n,e,t,o){return!e||t?.nonRetryable!==!0?!1:(Ie(n,e,o).terminalError=t,!0)}var js=R(()=>{"use strict"});var So=R(()=>{"use strict"});import kl from"fastify";function Hs(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 st,Tl,Ro,Gt=R(()=>{"use strict";So();st=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,a])=>{if(e.hasTransformer(s))throw new Error(`transformer "${s}" is already registered`);return[s,e.preparePluginTransformer(a)]})),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:[]},a="staging",i,c=u=>{try{if(this.assertOpen(),a!=="staging")throw new Error("plugin activation is no longer open");u()}catch(p){throw i=p,p}};return{context:{manifest:s.manifest,log:t,host:o,registerTransformer:u=>c(()=>{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=>c(()=>{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=>c(()=>{s.routes.push(u)}),registerConfigProtector:u=>c(()=>{s.protectors.push(u)}),registerUiCard:u=>c(()=>{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=>c(()=>{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(a!=="staging")throw new Error("plugin activation is no longer open");if(i)throw i;if(this.plugins.has(e.name))throw new Error(`plugin "${e.name}" is already registered`);for(let g of this.plugins.values()){for(let m of s.runtimes.keys())if(g.runtimes.has(m))throw new Error(`managed runtime "${m}" is already registered`);for(let m of s.transformers.keys())if(g.transformers.has(m))throw new Error(`transformer "${m}" is already registered`)}let f=[...this.transformerServices].flatMap(g=>[...s.transformers].map(([m,_])=>{if(g.hasTransformer(m))throw new Error(`transformer "${m}" is already registered`);return{service:g,name:m,value:g.preparePluginTransformer(_)}})),h=[];try{for(let g of f)h.push(g),g.service.registerTransformer(g.name,g.value);s.card=u,this.plugins.set(e.name,s),this.revision++,a="committed"}catch(g){for(let m of h)m.service.removeTransformer(m.name);throw a="aborted",g}},get cardPath(){return s.cardPath},abort:()=>{a="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:(i,c)=>{if(c==="route")return u=>(r.push(u),s);if(o.has(String(c)))return(u,p,d)=>(r.push({...typeof p=="function"?{}:p,method:c==="all"?["DELETE","GET","HEAD","PATCH","POST","PUT","OPTIONS"]:String(c).toUpperCase(),url:u,handler:d??p}),s);let l=Reflect.get(i,c);return typeof l=="function"?()=>{throw new Error(`plugin route registration cannot call ${String(c)}`)}:l}}),a=kl({logger:!1});try{for(let i of e){let c=i(s);c!==s&&await c}for(let i of this.plugins.values())for(let c of i.preparedRoutes)a.route(c);for(let i of r){let c=Array.isArray(i.method)?i.method:[i.method];for(let l of c)if(t.hasRoute({method:l,url:i.url,constraints:i.constraints}))throw new Error(`plugin route ${l} ${i.url} is already registered`);a.route(i)}return await a.ready(),r}finally{await a.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")}},Tl=new st,Ro=()=>Tl});async function Te(n,e,t,o,r){let s;try{s=n.classifyError?.(e,t,o)}catch{}let a=s&&/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,95}$/.test(s.code)?s.code:"plugin_upstream_error",i=s?{...s,code:a,message:`Provider plugin request failed (${a}).`}:{code:a,message:"Provider plugin returned an invalid upstream response.",httpStatus:e>=400&&e<=599?e:502,retryable:e===0||e>=500};try{await n.noteUpstreamError?.(i)}catch{}let c=Hs(n.name,i);return c.isRateLimit=i.httpStatus===429,c.upstreamStatus=e,r?.errorName&&(c.upstreamErrorName=r.errorName),c}var zs=R(()=>{"use strict";Gt()});var Vt,wo=R(()=>{Vt="2.3.2421"});var Bs={};mo(Bs,{getFallbackPromotionStore:()=>Me,resetFallbackPromotionStore:()=>Sl});function Me(n){return ve||(ve=new Po,n&&ve.configure(n)),ve}function Sl(){ve&&(ve.clearAll(),ve=null)}var xl,Po,ve,Qt=R(()=>{"use strict";re();xl=600*1e3,Po=class{promotions=new Map;enabled=!0;ttlMs=xl;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,a){if(!this.enabled)return;let i=this.getKey(e,t,o),c=`${r},${s}`;this.promotions.set(i,{promotedModel:c,timestamp:Date.now(),ttlMs:a??this.ttlMs})}getPromotion(e,t,o,r){if(!this.enabled)return null;let s=this.getKey(e,t,o),a=this.promotions.get(s);if(!a)return null;if(Date.now()-a.timestamp>=a.ttlMs)return this.promotions.delete(s),null;let[c,...l]=a.promotedModel.split(","),u=l.join(",");if(!j().isAvailable(c,u))return this.promotions.delete(s),null;let d=r.find(h=>h.name.toLowerCase()===c.toLowerCase()),f=d?.models?.find(h=>String(h).toLowerCase()===u.toLowerCase());return!d||!f||d.enabled===!1?(this.promotions.delete(s),null):`${d.name},${f}`}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}},ve=null});import{existsSync as Ks,mkdirSync as Cl,readFileSync as Rl,writeFileSync as wl}from"fs";import{join as Gs}from"path";import{HOME_DIR as Pl}from"@wengine-ai/claude-code-router-shared";function Il(n){try{if(!Ks(Oo))return;let e=JSON.parse(Rl(Oo,"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 Ws(n){try{let e=n.getAllStates();if(e.length===0)return;Ks(Ao)||Cl(Ao,{recursive:!0});let t=e.map(o=>({...o,updatedAt:Date.now()}));wl(Oo,JSON.stringify(t,null,2),"utf-8")}catch{}}function Io(){if(Js)return;Js=!0;let n=j();Il(n),Ol=setInterval(()=>Ws(n),6e4),process.on("exit",()=>Ws(n))}function j(n){return Eo||(Eo=new Yt(n)),Eo}var El,Al,Yt,Ao,Oo,Js,Ol,Eo,re=R(()=>{"use strict";El=120,Al={enabled:!0,failureThreshold:3,probeIntervalMinutes:5,halfOpenSuccessThreshold:2},Yt=class{states=new Map;config;probeTimer;constructor(e){this.config={...Al,...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}=(Qt(),ol(Bs));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 a=this.states.get(s);a?(a.status="open",a.lastFailureTime=Date.now(),a.lastError=r||"rate-limited",a.lastProbeTime=0):(a={provider:e,model:t,status:"open",failureCount:0,successCount:0,lastFailureTime:Date.now(),lastProbeTime:0,lastError:r||"rate-limited"},this.states.set(s,a));let i=(o??El)*1e3;a.rateLimitUntil=Date.now()+i}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)}},Ao=Gs(Pl,"runtime"),Oo=Gs(Ao,"provider-health.json"),Js=!1,Ol=null;Eo=null});import{existsSync as Zs,mkdirSync as Ml,readFileSync as Ll,writeFileSync as Nl}from"fs";import{join as qs}from"path";import{HOME_DIR as $l}from"@wengine-ai/claude-code-router-shared";function it(n,e,t){let o=i=>{if(t instanceof Headers)return t.get(i);let c=Object.keys(t).find(l=>l.toLowerCase()===i);return c?t[c]:null},r=Mo(o,Dl),s=Mo(o,Fl),a=Mo(o,Ul);(r||s||a)&&Le.set(n,{provider:n,remaining:Ys(r),limit:Ys(s),reset:Hl(a),capturedAt:Date.now()})}function jl(n){return Le.get(n)}function $o(){return Array.from(Le.values())}function Mo(n,e){for(let t of e){let o=n(t);if(o)return o}return null}function Ys(n){if(!n)return null;let e=Number(n.trim().replace(/,/g,""));return Number.isFinite(e)?e:null}function Hl(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=zl(e);return r===null?null:Math.floor((Date.now()+r)/1e3)}function zl(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]),a=r[2].toLowerCase();if(Number.isFinite(s))switch(a){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 Bl(){try{if(!Zs(No))return;let n=JSON.parse(Ll(No,"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;Le.set(t.provider,t)}}catch{}}function Xs(){try{if(Le.size===0)return;Zs(Lo)||Ml(Lo,{recursive:!0}),Nl(No,JSON.stringify(Array.from(Le.values()),null,2),"utf-8")}catch{}}function at(){Vs||(Vs=!0,Bl(),Qs=setInterval(Xs,6e4),Qs.unref?.(),process.on("exit",Xs))}var Lo,No,Le,Vs,Qs,Dl,Fl,Ul,Ne=R(()=>{"use strict";Lo=qs($l,"runtime"),No=qs(Lo,"rate-limit.json"),Le=new Map,Vs=!1,Qs=null,Dl=["x-ratelimit-remaining-tokens","x-ratelimit-remaining-requests","x-ratelimit-remaining"],Fl=["x-ratelimit-limit-tokens","x-ratelimit-limit-requests","x-ratelimit-limit"],Ul=["x-ratelimit-reset-tokens","x-ratelimit-reset-requests","x-ratelimit-reset"]});function Zt(){return Do||(Do=new Uo),Do}function Ho(){return Fo||(Fo=new jo),Fo}function Jl(n){return n?.sessionId||n?.clientContext?.stableSessionId||void 0}function ei(n){let e=Jl(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 ti(n,e){let t=Zt(),o=n?.[Xt];if(o&&!o.released){if(o.key===e)return;t.release(o)}n[Xt]=t.acquire(e)}function zo(n){let e=n?.[Xt];e&&Zt().release(e)}function ni(n,e){let t=ei(n),o=n?.[Xt],r=t?Ho().get(t)!==void 0:!1;!o&&!r||(t&&Ho().bind(t,e),ti(n,e))}function Wl(n,e,t){let o=Zt(),r=null,s=1/0;for(let a of e){if(!a||typeof a!="string")continue;let i=t(a);if(!i||i===n)continue;let c=o.count(i);c<s&&(r=i,s=c)}return r}function oi(n,e,t){let o=ei(n),r=Ho(),s=Zt(),a=Number.isFinite(t.threshold)&&t.threshold>0?Math.floor(t.threshold):3,i;if(o){let c=r.get(o);if(c&&c!==e){let l=t.resolve(c);l?(i=l,t.log?.(`Concurrency priority: session slot ${o} sticking to bound model ${l}`)):r.unbind(o)}else c&&(i=e)}if(!i){let c=s.count(e);if(c>=a){let l=Wl(e,t.fallbackModels,t.resolve);l&&(i=l,t.log?.(`Concurrency priority: model ${e} has ${c} in-flight request(s) (>= ${a}); assigning ${o?`session slot ${o} `:"request "}to overflow model ${l}`))}i=i||e,o&&r.bind(o,i)}return ti(n,i),i}var Uo,jo,Do,Fo,Xt,qt=R(()=>{"use strict";Uo=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()}},jo=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()}},Do=null,Fo=null;Xt="__concurrencyLease"});async function F(n){let e=await n.text();return Kl(e,n.status)}function Kl(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 ri(n){return(n.headers.get("Content-Type")||"").includes("text/event-stream")}function ct(n){return/^\s*(event:|data:|:\s*[A-Z])/m.test(n)||n.startsWith("data:")}async function de(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 a=0;a<8;a++){let{value:i,done:c}=await o.read();if(c||(i&&(s+=r.decode(i,{stream:!0})),ct(s))||/^\s*[\[{]/.test(s))break}s+=r.decode()}finally{o.releaseLock()}return e.cancel().catch(()=>{}),{body:t,isSSE:ct(s)}}async function me(n){try{let e=await n.text();if(ct(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 V=R(()=>{"use strict"});function Gl(n){if(!n||typeof n!="object")return;let e=Number(n.input_tokens??n.prompt_tokens??0)||0,t=Number(n.output_tokens??n.completion_tokens??0)||0,o=Number(n.input_tokens_details?.cached_tokens??n.prompt_tokens_details?.cached_tokens??n.cache_read_input_tokens??0)||0,r=Number(n.input_tokens_details?.cache_write_tokens??n.input_tokens_details?.cache_creation_tokens??n.cache_creation_input_tokens??0)||0;return{prompt_tokens:e,completion_tokens:t,total_tokens:Number(n.total_tokens??e+t)||0,prompt_tokens_details:{cached_tokens:o,cache_write_tokens:r},completion_tokens_details:{reasoning_tokens:Number(n.output_tokens_details?.reasoning_tokens??0)||0}}}var $e,Bo=R(()=>{"use strict";V();$e=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 a="";typeof s=="string"?a=s:s&&typeof s=="object"&&"text"in s&&(a=s.text),t.push({role:"system",content:a})}):e.instructions=r.content}if(e.messages.forEach(r=>{if(r.role!=="system"){if(Array.isArray(r.content)){let s=r.content.map(a=>this.normalizeRequestContent(a,r.role)).filter(a=>a!==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,t){let o=e.headers.get("Content-Type")||"";if(!o.includes("text/event-stream")&&!o.includes("application/json")&&e.body){let r=await de(e);if(r?.isSSE&&r.body){let s=new Response(r.body,{status:e.status,statusText:e.statusText,headers:new Headers({...Object.fromEntries(e.headers.entries()),"content-type":"text/event-stream"})});return this.transformResponseOut(s)}r?.body&&(e=new Response(r.body,{status:e.status,statusText:e.statusText,headers:e.headers}))}if(o.includes("application/json")){let r=await de(e);if(r?.isSSE&&r.body){let s=new Response(r.body,{status:e.status,statusText:e.statusText,headers:new Headers({...Object.fromEntries(e.headers.entries()),"content-type":"text/event-stream"})});return this.transformResponseOut(s)}if(r?.body)e=new Response(r.body,{status:e.status,statusText:e.statusText,headers:e.headers});else if(r===null){let s=await me(e);if(s.isSSE)return this.transformResponseOut(s.response);e=s.response}}if(o.includes("application/json")){let r=await F(e);if(r.object==="response"&&r.output){let s=this.convertResponseToChat(r);return new Response(JSON.stringify(s),{status:e.status,statusText:e.statusText,headers:e.headers})}return r.type==="message"&&Array.isArray(r.content)?new Response(JSON.stringify(r),{status:e.status,statusText:e.statusText,headers:e.headers}):new Response(JSON.stringify(r),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(o.includes("text/event-stream")){if(!e.body)return e;let[r,s]=e.body.tee(),a=r.getReader(),i=new TextDecoder,c="",l=["message_start","content_block_start","response.created","response.output_text.delta","response.in_progress","response.output_item.added","chat.completion.chunk"];try{for(let y=0;y<8;y++){let{value:k,done:v}=await a.read();if(v||(k&&(c+=i.decode(k,{stream:!0})),l.some(x=>c.includes(x)))||/^\s*[{[]/.test(c))break}c+=i.decode()}finally{a.releaseLock()}if(r.cancel().catch(()=>{}),c.includes("message_start")||c.includes("content_block_start"))return new Response(s,{status:e.status,statusText:e.statusText,headers:e.headers});if((c.includes("response.created")||c.includes("response.output_text.delta")||c.includes("response.in_progress")||c.includes("response.output_item.added"))&&t?.req?.codexDetected)return new Response(s,{status:e.status,statusText:e.statusText,headers:e.headers});let d=new TextDecoder,f=new TextEncoder,h=String(t?.req?.model??t?.req?.body?.model??t?.req?.originalModel??"unknown"),g="",m=!1,_=this,b=new ReadableStream({async start(y){let k=s.getReader(),v=-1,x="",T=C=>(C!==x&&(v++,x=C),v);try{for(;;){let{done:C,value:S}=await k.read();if(C){m||y.enqueue(f.encode(`data: [DONE]
|
|
6
6
|
|
|
7
|
-
`));break}let P=d.decode(S,{stream:!0});
|
|
7
|
+
`));break}let P=d.decode(S,{stream:!0});g+=P;let I=g.split(/\r?\n/);g=I.pop()||"";for(let O of I)if(O.trim())try{if(O.startsWith("event: "))continue;if(O.startsWith("data: ")){let E=O.slice(5).trim();if(E==="[DONE]"){m=!0,y.enqueue(f.encode(`data: [DONE]
|
|
8
8
|
|
|
9
|
-
`));continue}try{let w=JSON.parse(E);if(w.type==="response.output_text.delta"){let A={id:w.item_id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:w.response?.model,choices:[{index:
|
|
9
|
+
`));continue}try{let w=JSON.parse(E);if(w.type==="response.output_text.delta"){let A={id:w.item_id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:w.response?.model,choices:[{index:T(w.type),delta:{content:w.delta||""},finish_reason:null}]};y.enqueue(f.encode(`data: ${JSON.stringify(A)}
|
|
10
10
|
|
|
11
|
-
`))}else if(w.type==="response.output_item.added"&&w.item?.type==="function_call"){let A={id:w.item.call_id||w.item.id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:w.response?.model||h,choices:[{index:
|
|
11
|
+
`))}else if(w.type==="response.output_item.added"&&w.item?.type==="function_call"){let A={id:w.item.call_id||w.item.id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:w.response?.model||h,choices:[{index:T(w.type),delta:{role:"assistant",tool_calls:[{index:0,id:w.item.call_id||w.item.id,function:{name:w.item.name||"",arguments:""},type:"function"}]},finish_reason:null}]};y.enqueue(f.encode(`data: ${JSON.stringify(A)}
|
|
12
12
|
|
|
13
|
-
`))}else if(w.type==="response.output_item.added"&&w.item?.type==="message"){let A=[];(w.item.content||[]).forEach(U=>{U.type==="output_text"&&A.push({type:"text",text:U.text||""})});let N={role:"assistant"};if(A.length===1&&A[0].type==="text"?N.content=A[0].text:A.length>0&&(N.content=A),N.content){let U={id:w.item.id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:w.response?.model,choices:[{index:
|
|
13
|
+
`))}else if(w.type==="response.output_item.added"&&w.item?.type==="message"){let A=[];(w.item.content||[]).forEach(U=>{U.type==="output_text"&&A.push({type:"text",text:U.text||""})});let N={role:"assistant"};if(A.length===1&&A[0].type==="text"?N.content=A[0].text:A.length>0&&(N.content=A),N.content){let U={id:w.item.id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:w.response?.model,choices:[{index:T(w.type),delta:N,finish_reason:null}]};y.enqueue(f.encode(`data: ${JSON.stringify(U)}
|
|
14
14
|
|
|
15
|
-
`))}}else if(w.type==="response.output_text.annotation.added"){let A={id:w.item_id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:w.response?.model||h,choices:[{index:
|
|
15
|
+
`))}}else if(w.type==="response.output_text.annotation.added"){let A={id:w.item_id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:w.response?.model||h,choices:[{index:T(w.type),delta:{annotations:[{type:"url_citation",url_citation:{url:w.annotation?.url||"",title:w.annotation?.title||"",content:"",start_index:w.annotation?.start_index||0,end_index:w.annotation?.end_index||0}}]},finish_reason:null}]};y.enqueue(f.encode(`data: ${JSON.stringify(A)}
|
|
16
16
|
|
|
17
|
-
`))}else if(w.type==="response.function_call_arguments.delta"){let A={id:w.item_id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:w.response?.model||h,choices:[{index:
|
|
17
|
+
`))}else if(w.type==="response.function_call_arguments.delta"){let A={id:w.item_id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:w.response?.model||h,choices:[{index:T(w.type),delta:{tool_calls:[{index:0,function:{arguments:w.delta||""}}]},finish_reason:null}]};y.enqueue(f.encode(`data: ${JSON.stringify(A)}
|
|
18
18
|
|
|
19
|
-
`))}else if(w.type==="response.completed"){let A=w.response?.output?.some(U=>U.type==="function_call")?"tool_calls":"stop",N={id:w.response?.id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:w.response?.model||h,choices:[{index:0,delta:{},finish_reason:A}],...w.response?.usage?{usage:Gl(w.response.usage)}:{}};y.enqueue(
|
|
19
|
+
`))}else if(w.type==="response.completed"){let A=w.response?.output?.some(U=>U.type==="function_call")?"tool_calls":"stop",N={id:w.response?.id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:w.response?.model||h,choices:[{index:0,delta:{},finish_reason:A}],...w.response?.usage?{usage:Gl(w.response.usage)}:{}};y.enqueue(f.encode(`data: ${JSON.stringify(N)}
|
|
20
20
|
|
|
21
|
-
`)),
|
|
21
|
+
`)),m=!0}else if(w.type==="response.reasoning_summary_text.delta"){let A={id:w.item_id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:w.response?.model,choices:[{index:T(w.type),delta:{thinking:{content:w.delta||""}},finish_reason:null}]};y.enqueue(f.encode(`data: ${JSON.stringify(A)}
|
|
22
22
|
|
|
23
|
-
`))}else if(w.type==="response.reasoning_summary_part.done"&&w.part){let A={id:w.item_id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:w.response?.model,choices:[{index:
|
|
23
|
+
`))}else if(w.type==="response.reasoning_summary_part.done"&&w.part){let A={id:w.item_id||"chatcmpl-"+Date.now(),object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:w.response?.model,choices:[{index:v,delta:{thinking:{signature:w.item_id}},finish_reason:null}]};y.enqueue(f.encode(`data: ${JSON.stringify(A)}
|
|
24
24
|
|
|
25
|
-
`))}}catch{y.enqueue(
|
|
26
|
-
`))}}else y.enqueue(
|
|
27
|
-
`))}catch(E){console.error("Error processing line:",O,E),y.enqueue(
|
|
28
|
-
`))}}
|
|
29
|
-
`)),
|
|
25
|
+
`))}}catch{y.enqueue(f.encode(O+`
|
|
26
|
+
`))}}else y.enqueue(f.encode(O+`
|
|
27
|
+
`))}catch(E){console.error("Error processing line:",O,E),y.enqueue(f.encode(O+`
|
|
28
|
+
`))}}g.trim()&&y.enqueue(f.encode(g+`
|
|
29
|
+
`)),m||y.enqueue(f.encode(`data: [DONE]
|
|
30
30
|
|
|
31
|
-
`))}catch(C){console.error("Stream error:",C),y.error(C)}finally{try{k.releaseLock()}catch(C){console.error("Error releasing reader lock:",C)}y.close()}}});return new Response(b,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","Access-Control-Allow-Origin":"*"}})}return e}normalizeRequestContent(e,t){let o={...e};if(delete o.cache_control,e.type==="text")return{type:t==="assistant"?"output_text":"input_text",text:e.text};if(e.type==="image_url"){let r={type:t==="assistant"?"output_image":"input_image"};return typeof e.image_url?.url=="string"&&(r.image_url=e.image_url.url),r}return null}async transformResponseIn(e,t){if(e.headers.get("Content-Type")?.includes("text/event-stream")&&e.body){let[r,s]=e.body.tee(),a=r.getReader(),i=new TextDecoder,c="",l=["message_start","content_block_start","response.created","response.output_text.delta","response.in_progress","response.output_item.added","chat.completion.chunk"];try{for(let h=0;h<8;h++){let{value:
|
|
32
|
-
data: ${JSON.stringify(
|
|
31
|
+
`))}catch(C){console.error("Stream error:",C),y.error(C)}finally{try{k.releaseLock()}catch(C){console.error("Error releasing reader lock:",C)}y.close()}}});return new Response(b,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","Access-Control-Allow-Origin":"*"}})}return e}normalizeRequestContent(e,t){let o={...e};if(delete o.cache_control,e.type==="text")return{type:t==="assistant"?"output_text":"input_text",text:e.text};if(e.type==="image_url"){let r={type:t==="assistant"?"output_image":"input_image"};return typeof e.image_url?.url=="string"&&(r.image_url=e.image_url.url),r}return null}async transformResponseIn(e,t){if(e.headers.get("Content-Type")?.includes("text/event-stream")&&e.body){let[r,s]=e.body.tee(),a=r.getReader(),i=new TextDecoder,c="",l=["message_start","content_block_start","response.created","response.output_text.delta","response.in_progress","response.output_item.added","chat.completion.chunk"];try{for(let h=0;h<8;h++){let{value:g,done:m}=await a.read();if(m||(g&&(c+=i.decode(g,{stream:!0})),l.some(_=>c.includes(_)))||/^\s*[{[]/.test(c))break}c+=i.decode()}finally{a.releaseLock()}r.cancel().catch(()=>{});let u=c.includes("message_start")||c.includes("content_block_start"),p=c.includes("chat.completion.chunk");if(c.includes("response.created")||c.includes("response.output_text.delta")||c.includes("response.in_progress")||c.includes("response.output_item.added"))return new Response(s,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}});if(p&&!u){let h=this.convertOpenAIChatStreamToResponsesAPI(s,t);return new Response(h,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}let f=this.convertAnthropicStreamToResponsesAPI(s,t);return new Response(f,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}try{let r=await F(e);return new Response(JSON.stringify(this.wrapChatInResponses(r)),{headers:{"Content-Type":"application/json"}})}catch{return e}}convertOpenAIChatStreamToResponsesAPI(e,t){let o=new TextDecoder,r=new TextEncoder,s=t?.provider?.models?.[0]||"gpt-5.4",a=`resp_${Date.now()}`,i=0,c=!1,l=!1,u="",p=-1,d=[],f=(g,m)=>r.encode(`event: ${g}
|
|
32
|
+
data: ${JSON.stringify(m)}
|
|
33
33
|
|
|
34
|
-
`),h=(
|
|
35
|
-
`);_=x.pop()||"";for(let
|
|
34
|
+
`),h=(g,m=[])=>({id:a,object:"response",created_at:Math.floor(Date.now()/1e3),status:g,model:s,output:m,usage:this.buildResponsesUsage()});return new ReadableStream({async start(g){try{let m=e.getReader(),_="",b=!1,y=k=>{if(!b){b=!0;for(let v of d)if(v.type==="function_call"){let x=d.indexOf(v);g.enqueue(f("response.function_call_arguments.done",{type:"response.function_call_arguments.done",item_id:v.call_id||v.id,output_index:x,arguments:v.arguments||""})),v.status="completed",g.enqueue(f("response.output_item.done",{type:"response.output_item.done",output_index:x,item:v}))}for(let v of d)if(v.type==="message"){let x=d.indexOf(v);v.status="completed",g.enqueue(f("response.output_item.done",{type:"response.output_item.done",output_index:x,item:v}))}g.enqueue(f("response.completed",{type:"response.completed",response:{id:a,object:"response",created_at:Math.floor(Date.now()/1e3),status:"completed",model:k?.model||s,output:d.slice(),usage:k?.usage?{...this.buildResponsesUsage(k.usage)}:this.buildResponsesUsage()}}))}};for(;;){let{done:k,value:v}=await m.read();if(k)break;_+=o.decode(v,{stream:!0});let x=_.split(`
|
|
35
|
+
`);_=x.pop()||"";for(let T of x){let C=T.trim();if(!C||C.startsWith("event:")||!C.startsWith("data:"))continue;let S=C.slice(5).trim();if(S==="[DONE]"){y({}),g.enqueue(r.encode(`data: [DONE]
|
|
36
36
|
|
|
37
|
-
`));continue}let P;try{P=JSON.parse(S)}catch{continue}c||(c=!0,
|
|
37
|
+
`));continue}let P;try{P=JSON.parse(S)}catch{continue}c||(c=!0,g.enqueue(f("response.created",{type:"response.created",response:h("in_progress")})),g.enqueue(f("response.in_progress",{type:"response.in_progress",response:h("in_progress")})));let I=P.choices?.[0];if(!I)continue;let O=I.delta;if(O?.content){if(!l){l=!0;let E=i++,w={id:`${a}_msg`,type:"message",status:"in_progress",role:"assistant",content:[]};d.push(w),g.enqueue(f("response.output_item.added",{type:"response.output_item.added",output_index:E,item:w}))}g.enqueue(f("response.output_text.delta",{type:"response.output_text.delta",item_id:`${a}_msg`,output_index:i-1,content_index:0,delta:O.content}))}if(Array.isArray(O?.tool_calls))for(let E of O.tool_calls){if(E.id){u=E.id,p=i++;let w={id:E.id,type:"function_call",status:"in_progress",call_id:E.id,name:E.function?.name||"",arguments:""};d.push(w),g.enqueue(f("response.output_item.added",{type:"response.output_item.added",output_index:p,item:w}))}if(E.function?.arguments){g.enqueue(f("response.function_call_arguments.delta",{type:"response.function_call_arguments.delta",item_id:u,output_index:p,delta:E.function.arguments}));let w=d.find(A=>A.call_id===u);w&&(w.arguments+=E.function.arguments)}}I.finish_reason&&y(P)}}b||y({}),g.close()}catch(m){g.error(m)}}})}convertAnthropicStreamToResponsesAPI(e,t){let o=new TextDecoder,r=new TextEncoder,s=t?.provider?.models?.[0]||"gpt-5.4",a=`resp_${Date.now()}`,i="",c="",l=-1,u="",p="",d="",f=-1,h="",g="",m=-1,_=0,b=!1,y=!1,k=!1,v=!1,x=null,T=[],C=(w,A)=>r.encode(`event: ${w}
|
|
38
38
|
data: ${JSON.stringify(A)}
|
|
39
39
|
|
|
40
|
-
`),S=(w,A=[])=>({id:a,object:"response",created_at:Math.floor(Date.now()/1e3),status:w,model:s,output:A,usage:this.buildResponsesUsage()}),P=()=>{b||(b=!0,E.enqueue(C("response.created",{type:"response.created",response:S("in_progress")})),E.enqueue(C("response.in_progress",{type:"response.in_progress",response:S("in_progress")})))},I=(w,A)=>{E.enqueue(C("response.output_item.done",{type:"response.output_item.done",output_index:w,item:{...A,status:"completed"}}))},O=w=>{if(!
|
|
41
|
-
`);N=z.pop()||"";for(let fe of z){let H=fe.trim();if(!H||H.startsWith("event:")||!H.startsWith("data:"))continue;let Z=H.slice(5).trim();if(Z==="[DONE]")continue;let J;try{J=JSON.parse(Z)}catch{continue}if(J.type==="message_start"&&(a=J.message?.id||a,P()),J.type==="content_block_start"){let M=J.content_block;if(x=M?.type||null,M?.type==="tool_use"){u=M.id||"",p=M.name||"",d="",
|
|
40
|
+
`),S=(w,A=[])=>({id:a,object:"response",created_at:Math.floor(Date.now()/1e3),status:w,model:s,output:A,usage:this.buildResponsesUsage()}),P=()=>{b||(b=!0,E.enqueue(C("response.created",{type:"response.created",response:S("in_progress")})),E.enqueue(C("response.in_progress",{type:"response.in_progress",response:S("in_progress")})))},I=(w,A)=>{E.enqueue(C("response.output_item.done",{type:"response.output_item.done",output_index:w,item:{...A,status:"completed"}}))},O=w=>{if(!v){if(v=!0,y){let A=T.find(N=>N.type==="message");A&&(A.content=[{type:"output_text",text:i}],A.status="completed")}for(let A of T)A.type==="function_call"&&(A.status="completed");return C("response.completed",{type:"response.completed",response:{id:a,object:"response",created_at:Math.floor(Date.now()/1e3),status:"completed",model:s,output:T,usage:w?{...this.buildResponsesUsage(w)}:this.buildResponsesUsage()}})}},E;return new ReadableStream({async start(w){E=w;try{let A=e.getReader(),N="";for(;;){let{done:$,value:D}=await A.read();if($)break;N+=o.decode(D,{stream:!0});let z=N.split(`
|
|
41
|
+
`);N=z.pop()||"";for(let fe of z){let H=fe.trim();if(!H||H.startsWith("event:")||!H.startsWith("data:"))continue;let Z=H.slice(5).trim();if(Z==="[DONE]")continue;let J;try{J=JSON.parse(Z)}catch{continue}if(J.type==="message_start"&&(a=J.message?.id||a,P()),J.type==="content_block_start"){let M=J.content_block;if(x=M?.type||null,M?.type==="tool_use"){u=M.id||"",p=M.name||"",d="",f=_++;let W={id:u,type:"function_call",status:"in_progress",call_id:u,name:p,arguments:""};T.push(W),E.enqueue(C("response.output_item.added",{type:"response.output_item.added",output_index:f,item:W}))}if(M?.type==="thinking"&&(h=M.thinking||"",!k)){k=!0,m=_++,g=`rs_${a}`;let W={id:g,type:"reasoning",status:"in_progress",summary:[]};T.push(W),E.enqueue(C("response.output_item.added",{type:"response.output_item.added",output_index:m,item:W}))}if(M?.type==="text"&&(i=M?.text||"",!y)){y=!0,l=_++,c=`${a}_msg`;let W={id:c,type:"message",status:"in_progress",role:"assistant",content:[]};T.push(W),E.enqueue(C("response.output_item.added",{type:"response.output_item.added",output_index:l,item:W}))}}if(J.type==="content_block_delta"){let M=J.delta;if(M?.type==="text_delta"){if(!y){y=!0,l=_++,c=`${a}_msg`;let W={id:c,type:"message",status:"in_progress",role:"assistant",content:[]};T.push(W),E.enqueue(C("response.output_item.added",{type:"response.output_item.added",output_index:l,item:W}))}i+=M.text||"",E.enqueue(C("response.output_text.delta",{type:"response.output_text.delta",item_id:c,output_index:l,content_index:0,delta:M.text||""}))}M?.type==="thinking_delta"&&(h+=M.thinking||"",E.enqueue(C("response.reasoning_summary_text.delta",{type:"response.reasoning_summary_text.delta",item_id:g||`rs_${a}`,output_index:m>=0?m:0,summary_index:0,delta:M.thinking||""}))),M?.type==="input_json_delta"&&(d+=M.partial_json||"",E.enqueue(C("response.function_call_arguments.delta",{type:"response.function_call_arguments.delta",item_id:u||"call_0",output_index:f>=0?f:0,delta:M.partial_json||""})))}if(J.type==="content_block_stop"){if(x==="tool_use"&&u){E.enqueue(C("response.function_call_arguments.done",{type:"response.function_call_arguments.done",item_id:u,output_index:f,arguments:d}));let M=T.find(W=>W.call_id===u);M&&(M.arguments=d,M.status="completed"),M&&I(f,M)}if(x==="text"&&y){E.enqueue(C("response.output_text.done",{type:"response.output_text.done",item_id:c,output_index:l,content_index:0,text:i}));let M=T.find(W=>W.type==="message");M&&(M.content=[{type:"output_text",text:i}],I(l,M))}if(x==="thinking"&&k){let M=T.find(W=>W.type==="reasoning");M&&(M.summary=[{type:"summary_text",text:h}],I(m,M))}x=null}if(J.type==="message_delta"){let M=O(J.usage);M&&E.enqueue(M)}if(J.type==="message_stop"){let M=O();M&&E.enqueue(M),E.enqueue(r.encode(`data: [DONE]
|
|
42
42
|
|
|
43
|
-
`))}}}P();let U=O();U&&E.enqueue(U),N="",E.close()}catch(A){E.error(A)}}})}wrapChatInResponses(e){let t=e?.choices?.[0],o=[],r=[];if(t?.message?.content&&r.push({type:"output_text",text:t.message.content}),o.push({type:"message",role:"assistant",content:r}),Array.isArray(t?.message?.tool_calls))for(let s of t.message.tool_calls)o.push({type:"function_call",id:s.id,call_id:s.id,name:s.function?.name||"",arguments:s.function?.arguments||"{}"});return{id:e.id||`resp_${Date.now()}`,object:"response",model:e.model,output:o,usage:e.usage?{...this.buildResponsesUsage(e.usage)}:void 0}}convertResponseToChat(e){let t=e.output?.find(l=>l.type==="message"),o=e.output?.find(l=>l.type==="function_call"),r;t?.content?.length&&t?.content[0].annotations&&(r=t.content[0].annotations.map(l=>({type:"url_citation",url_citation:{url:l.url||"",title:l.title||"",content:"",start_index:l.start_index||0,end_index:l.end_index||0}}))),this.logger.debug({data:r,type:"url_citation"});let s=null,a=null,i=null;if(t&&t.reasoning&&(i={content:t.reasoning}),t&&t.content){let l=[],u=[];if(t.content.forEach(p=>{if(p.type==="output_text")l.push(p.text||"");else if(p.type==="output_image"){let d=this.buildImageContent({url:p.image_url,mime_type:p.mime_type});d&&u.push(d)}else if(p.type==="output_image_base64"){let d=this.buildImageContent({b64_json:p.image_base64,mime_type:p.mime_type});d&&u.push(d)}}),u.length>0){let p=[];l.length>0&&p.push({type:"text",text:l.join("")}),p.push(...u),s=p}else s=l.join("")}return o&&(a=[{id:o.call_id||o.id,function:{name:o.name,arguments:o.arguments},type:"function"}]),{id:e.id||"chatcmpl-"+Date.now(),object:"chat.completion",created:e.created_at,model:e.model,choices:[{index:0,message:{role:"assistant",content:s||null,tool_calls:a,thinking:i,annotations:r},logprobs:null,finish_reason:a?"tool_calls":"stop"}],usage:e.usage?{prompt_tokens:e.usage.input_tokens||0,completion_tokens:e.usage.output_tokens||0,total_tokens:e.usage.total_tokens||0,prompt_tokens_details:{cached_tokens:this.getCacheReadInputTokens(e.usage),cache_creation_tokens:this.getCacheCreationInputTokens(e.usage)},cache_read_input_tokens:this.getCacheReadInputTokens(e.usage),cache_creation_input_tokens:this.getCacheCreationInputTokens(e.usage)}:null}}buildImageContent(e){return e&&(e.url||e.b64_json)?{type:"image_url",image_url:{url:e.url||"",b64_json:e.b64_json},media_type:e.mime_type}:null}}});var Jo,Q,en=R(()=>{"use strict";Jo=class{capacity;cache;constructor(e){this.capacity=e,this.cache=new Map}get(e){if(!this.cache.has(e))return;let t=this.cache.get(e);return this.cache.delete(e),this.cache.set(e,t),t}put(e,t){if(this.cache.has(e))this.cache.delete(e);else if(this.cache.size>=this.capacity){let o=this.cache.keys().next().value;o!==void 0&&this.cache.delete(o)}this.cache.set(e,t)}values(){return Array.from(this.cache.values())}delete(e){return this.cache.delete(e)}},Q=new Jo(100)});import{existsSync as ci,mkdirSync as Vl,readFileSync as Ql,writeFileSync as Yl}from"fs";import{join as li}from"path";import{HOME_DIR as Xl}from"@wengine-ai/claude-code-router-shared";function Go(n,e){n&&$e.set(n,{...e,provider:n,capturedAt:Date.now()})}function tn(n){let e=$e.get(n);return e?{...e}:void 0}function Vo(){return Array.from($e.values()).map(n=>({...n}))}function Zl(){try{if(!ci(Ko))return;let n=JSON.parse(Ql(Ko,"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>1440*60*1e3)continue;$e.set(t.provider,t)}}catch{}}function ai(){try{if($e.size===0)return;ci(Wo)||Vl(Wo,{recursive:!0}),Yl(Ko,JSON.stringify(Array.from($e.values()),null,2),"utf-8")}catch{}}function lt(){si||(si=!0,Zl(),ii=setInterval(ai,6e4),ii.unref?.(),process.on("exit",ai))}var Wo,Ko,$e,si,ii,De=R(()=>{"use strict";Wo=li(Xl,"runtime"),Ko=li(Wo,"quota-store.json"),$e=new Map,si=!1,ii=null});function ge(n){if(typeof n!="string")return;let e=n.trim();if(!(!e||!ql.test(e)))return e}function he(n){if(!n)return;if(typeof n=="object")return ge(n.session_id??n.sessionId);if(typeof n!="string")return;let e=n.trim();if(!e)return;try{let r=JSON.parse(e),s=ge(r?.session_id??r?.sessionId);if(s)return s}catch{}let t="_session_",o=e.lastIndexOf(t);if(o!==-1)return ge(e.slice(o+t.length))}var ql,Fe=R(()=>{"use strict";ql=/^[A-Za-z0-9_-]+$/});import{existsSync as pi}from"fs";import{readFile as eu,readdir as tu}from"fs/promises";import{homedir as nu}from"os";import{isAbsolute as ou,join as ut,normalize as ru}from"path";import{openSqliteDatabase as su}from"@wengine-ai/claude-code-router-shared";function fu(){if(Ue.size<=ui)return;let n=[...Ue.keys()].slice(0,Ue.size-ui);for(let e of n)Ue.delete(e)}function mu(){if(je.size<=di)return;let n=[...je].slice(0,je.size-di);for(let e of n)je.delete(e)}function gu(n){let e=n.trim();if(!e||e==="."||e===".."||/[/\\\0]/.test(e))return[];let t=e.replace(/^sess_/,"");return[...new Set([e,t,`sess_${t}`])].filter(Boolean)}function hu(n,e){let t;try{t=su(n,{readonly:!0}).db;let o=t.prepare("SELECT workspace_path FROM tasks WHERE task_id = ? OR acp_session_id = ? ORDER BY updated_at DESC LIMIT 1");for(let r of e){let a=o.get(r,r)?.workspace_path;if(typeof a=="string"&&a.trim())return a.trim()}return null}catch{return null}finally{try{t?.close()}catch{}}}async function yu(n,e){let t;try{t=await tu(n)}catch{return null}for(let o of t)for(let r of e){let s=ut(n,o,`${r}.json`);if(pi(s))try{let a=JSON.parse(await eu(s,"utf8")),i=a?.meta?.workspacePath??a?.workspacePath;if(typeof i=="string"&&i.trim())return i.trim()}catch{}}return null}async function fi(n){let e=typeof n=="string"?n.trim():"";if(!e)return null;let t=Ue.get(e);if(t)return t;let o=async()=>{let r=gu(e);if(r.length===0)return null;let s=ut(iu(),au),a=ut(s,cu);if(pi(a)){let i=hu(a,r);if(i)return i}return yu(ut(s,lu),r)};try{let r=await o();if(!r&&!je.has(e)){je.add(e),mu();for(let a=0;a<uu&&!r;a++)await pu(du),r=await o()}if(!r||!ou(r))return null;let s=ru(r);return Ue.set(e,s),fu(),s}catch{return null}}var iu,au,cu,lu,ui,di,uu,du,Ue,je,pu,mi=R(()=>{"use strict";iu=()=>process.env.CCR_ZCODE_DIR||ut(nu(),".zcode"),au="v2",cu="tasks-index.sqlite",lu="sessions",ui=500,di=500,uu=3,du=50,Ue=new Map,je=new Set,pu=n=>new Promise(e=>setTimeout(e,n))});import{randomUUID as _u}from"node:crypto";import{CCR_PROJECT_HEADER as Qo}from"@wengine-ai/claude-code-router-shared";function yi(n){return typeof n=="string"&&n.length<=bu}function ku(n){if(!(!n?.headers||typeof n.headers!="object"))for(let e of hi){let{value:t}=nn(n,e);if(!yi(t))continue;let o=ge(t);if(o)return o}}function vu(n){if(typeof n=="string")return n.slice(0,1e3);if(Array.isArray(n)){let e=n.find(t=>t&&typeof t.text=="string");return e?String(e.text).slice(0,1e3):""}return""}function xu(n){if(typeof n?.pathname=="string")return n.pathname;if(typeof n?.url!="string")return"";try{return new URL(n.url,"http://127.0.0.1").pathname}catch{return n.url}}function nn(n,e){let t=n?.headers;if(!t||typeof t!="object")return{present:!1};let o=Object.keys(t).find(s=>s.toLowerCase()===e);if(!o)return{present:!1};let r=t[o];return typeof r=="string"?{present:!0,value:r.trim()}:Array.isArray(r)&&typeof r[0]=="string"?{present:!0,value:r[0].trim()}:{present:!0}}function gi(n,e){if(!(!n?.headers||typeof n.headers!="object"))for(let t of Object.keys(n.headers))t.toLowerCase()===e&&delete n.headers[t]}function dt(n,e=!0){return{clientType:n,usageScope:"request",supportsExplicitExtendedContext:e}}function Yo(n,e,t=!0){let o=he(n?.body?.metadata?.user_id);return{clientType:e,usageScope:o?"session":"request",stableSessionId:o,supportsExplicitExtendedContext:t}}function bi(n){return typeof n=="string"&&Tu.includes(n)}function Iu(n,e){return/zcode/i.test(e)?!0:Object.keys(n).some(t=>t.toLowerCase().startsWith("x-zcode"))}function He(n){if(bi(n?.clientType))return n.clientType;let e=xu(n),t=n?.headers||{},o=typeof t["user-agent"]=="string"?t["user-agent"]:"",r=n?.body||{},s=vu(r.system);if(/\bYou are Qwen Code\b/i.test(s)||/Qwen Code, an interactive CLI agent/i.test(s))return"qwen-code";if(/operating inside pi\b/i.test(s)||/a coding agent harness/i.test(s))return"pi";if(/\bYou are opencode\b/i.test(s))return"opencode";if(nn(n,Qo).present||nn(n,"x-session-affinity").present)return"pi";if(Iu(t,o))return"zcode";let a=t["x-anthropic-billing-header"];if(typeof a=="string"&&a.includes("cc_version="))return"claude-code";if(o.includes("codex")||o.includes("Codex")||e.endsWith("/v1/responses"))return"codex";if(r.metadata&&typeof r.metadata=="object"&&typeof r.metadata.user_id=="string")return"claude-code";if(o.includes("opencode"))return"opencode";if(o.includes("pi-coding-agent"))return"pi";if(o.includes("QwenCode"))return"qwen-code";let i=n?.originalModel||r.model||"";return/^ccr-(opus|sonnet|haiku)(\[1m\])?$/i.test(i)?o.includes("Anthropic/")?"pi":o.includes("claude-cli")||o.includes("Claude-CLI")?"qwen-code":typeof t["x-stainless-package-version"]=="string"?"pi":"claude-code":o.includes("claude-cli")||o.includes("Claude-CLI")?"claude-code":String(i).toLowerCase()==="ccr-codex"?"codex":e.endsWith("/v1/messages")?"api":"unknown"}function ki(n){return _i[n]}function Mu(n){if(typeof n?.__ccrRequestScopeId=="string"&&n.__ccrRequestScopeId)return n.__ccrRequestScopeId;let e=typeof n?.id=="string"&&n.id||_u();return n.__ccrRequestScopeId=e,e}function xe(n,e={}){let t=He(n),o=ki(t).createContext(n,e),r=o.usageScope==="session"&&o.stableSessionId?o.stableSessionId:Mu(n),s=o.usageScope==="session"?"session":"request";n.clientType=t,n.clientContext=o,o.stableSessionId?n.sessionId=o.stableSessionId:delete n.sessionId,o.projectHeaderPresent?n.projectId=o.projectId:delete n.projectId,gi(n,Qo),t==="pi"&&o.stableSessionId&&(n.__ccrSessionAffinity=o.stableSessionId);for(let a of hi)gi(n,a);return n.usageSessionId=r,n.usageCacheKey=`${t}:${s}:${r}`,o}function Lu(){}var hi,bu,Tu,Su,Cu,Ru,wu,Pu,Eu,Au,Ou,_i,ze=R(()=>{"use strict";Fe();hi=["x-session-affinity","x-session-id","x-litellm-session-id"],bu=256;Tu=["claude-code","zcode","pi","qwen-code","opencode","codex","api","unknown"];Su={type:"claude-code",createContext(n){return Yo(n,"claude-code")}},Cu={type:"zcode",createContext(n){return Yo(n,"zcode")}},Ru={type:"pi",createContext(n){let e=nn(n,Qo),t=ku(n)||(typeof n?.__ccrSessionAffinity=="string"?n.__ccrSessionAffinity:void 0)||he(n?.body?.metadata?.user_id),o=yi(t)?t:void 0;return{...dt("pi",!1),stableSessionId:o,projectId:e.value,projectHeaderPresent:e.present}}},wu={type:"qwen-code",createContext(n){return Yo(n,"qwen-code")}},Pu={type:"opencode",createContext(){return dt("opencode")}},Eu={type:"codex",createContext(){return dt("codex")}},Au={type:"api",createContext(){return dt("api")}},Ou={type:"unknown",createContext(){return dt("unknown")}},_i={"claude-code":Su,zcode:Cu,pi:Ru,"qwen-code":wu,opencode:Pu,codex:Eu,api:Au,unknown:Ou}});import{get_encoding as $u}from"tiktoken";import{readFile as Xo}from"fs/promises";import{opendir as Du,stat as Fu}from"fs/promises";import{join as Zo}from"path";import{CLAUDE_PROJECTS_DIR as Ti,HOME_DIR as vi,getClaudeProjectId as xi,isZcodeProjectTakeoverActive as Uu}from"@wengine-ai/claude-code-router-shared";function ee(n,e,t,o){let r=Pi(e,t);if(r.code==="model_unhealthy"){let i=G(e,t,!0);if(i)return n.log.warn(`Strict project target ${e} is in the health fail-pool; retrying it anyway (no fallback available). scenario=${o}`),i}let s=n.sessionId||n.clientContext?.stableSessionId,a=wi[r.code]||502;throw new te(`Project routing error (${o}): ${r.reason}. Project-level Router target: "${e}". Session: "${s||"unknown"}".`,{sessionId:s,configuredTarget:e,code:r.code,statusCode:a})}function rn(n){let e=n||"";return e.includes(",")&&(e=e.split(",").pop()||e),e.includes("/")&&(e=e.split("/").pop()||e),e.includes(":")&&(e=e.split(":")[0]),e.trim().toLowerCase()}function ft(n){let e=rn(n),t=e.includes("[1m]")||e.endsWith("[1m"),o=e.replace(/\[1m\]|\[1m$/g,""),r=o.match(/^ccr-(opus|sonnet|haiku)$/i);if(r)return{family:r[1].toLowerCase(),extended:t,isCcrAlias:!0};let s=o.match(/claude-(?:\d+-\d+-|\d+-)?(sonnet|opus|haiku)(?:-|$)/i)||o.match(/claude-(sonnet|opus|haiku)(?:-|$)/i);return s?{family:s[1].toLowerCase(),extended:t,isCcrAlias:!1}:{family:null,extended:t,isCcrAlias:!1}}function Hu(n,e){if(!e||!n)return null;let t=rn(n);if(e[n])return e[n];if(e[t])return e[t];let{family:o}=ft(n);if(o&&e[o])return e[o];for(let[r,s]of Object.entries(e)){let a=rn(r);if(a&&t.includes(a))return s}return null}function zu(n){return n?(n.input_tokens||0)+(n.cache_read_input_tokens||0)+(n.cache_creation_input_tokens||0):0}function on(n){if(!n?.includes(","))return null;let[e,...t]=n.split(","),o=e.trim(),r=t.join(",").trim();return!o||!r?null:{providerName:o,routeModel:r}}function pt(n,e,t){let o=n.find(s=>s.name.toLowerCase()===e.toLowerCase());if(!o||o.enabled===!1)return null;let r=o.models?.find(s=>String(s).toLowerCase()===t.toLowerCase());return r?{provider:o,model:String(r)}:null}function Pi(n,e){let t=on(n);if(!t)return{reason:`invalid model format "${n}" (expected "provider,model")`,code:"invalid_model_format"};let{providerName:o,routeModel:r}=t,s=e.find(l=>l.name?.toLowerCase()===o.toLowerCase());if(!s)return{reason:`provider "${o}" not found`,code:"provider_not_found"};if(s.enabled===!1)return{reason:`provider "${o}" is disabled`,code:"provider_disabled"};let a=s.models?.find(l=>String(l).toLowerCase()===r.toLowerCase());if(!a)return{reason:`model "${r}" not found in provider "${o}"`,code:"model_not_found"};if(!j().isAvailable(s.name,String(a),s.apiKey?.startsWith("ccr-managed-")===!0||s.api_key?.startsWith("ccr-managed-")===!0))return{reason:`model "${r}" in provider "${o}" is temporarily unavailable (health fail-pool)`,code:"model_unhealthy"};let c=tn(s.name);if(c){let l=c.limitDaily!==void 0&&c.usedDailyBalance!==void 0&&c.usedDailyBalance>=c.limitDaily,u=c.totalBalance!==void 0&&c.usedBalance!==void 0&&c.usedBalance>=c.totalBalance;if(l||u)return{reason:`provider "${o}" quota is exhausted`,code:"quota_exhausted"}}return{reason:`unable to resolve model "${n}"`,code:"resolution_failed"}}function G(n,e,t,o,r,s,a){let i=on(n);if(!i)return a?null:n;let{providerName:c,routeModel:l}=i,u=pt(e,c,l);if(!u){if(r===!0&&o&&!t&&s!==!1){let d=Ie(),m=d.getPromotion(c,l,o,e);if(m){let h=on(m);if(h){let f=pt(e,h.providerName,h.routeModel);if(f)return`${f.provider.name},${f.model}`}d.clear(c,l,o)}}return null}if(r===!0&&o&&!t&&s!==!1){let d=Ie(),m=d.getPromotion(c,l,o,e);if(m){let h=on(m);if(h){let f=pt(e,h.providerName,h.routeModel);if(f)return`${f.provider.name},${f.model}`}d.clear(c,l,o)}}if(!t&&!j().isAvailable(u.provider.name,u.model,u.provider.apiKey?.startsWith("ccr-managed-")===!0||u.provider.api_key?.startsWith("ccr-managed-")===!0))return null;let p=tn(u.provider.name);if(p){let d=p.limitDaily!==void 0&&p.usedDailyBalance!==void 0&&p.usedDailyBalance>=p.limitDaily,m=p.totalBalance!==void 0&&p.usedBalance!==void 0&&p.usedBalance>=p.totalBalance;if(d||m)return null}return`${u.provider.name},${u.model}`}function X(n,e,t,o,r,s){let a=j(),i=[t?.[n],o?.[n]];for(let c of i)if(!(!Array.isArray(c)||c.length===0))for(let l of c){let u=G(l,e,!1,n,void 0,void 0,s);if(u)return u}return null}function Bu(n){return n.body.messages?.some(e=>e.role==="user"&&Array.isArray(e.content)&&e.content.some(t=>t.type==="image"||t.type==="image_url"||Array.isArray(t?.content)&&t.content.some(o=>o.type==="image"||o.type==="image_url")))}function mt(n){let e=rn(n);return[/claude/i,/gemini/i,/gpt-4o/i,/gpt-4\.1/i,/gpt-4-vision/i,/qwen.*vl/i,/glm-4v/i,/grok.*vision/i,/pixtral/i,/llava/i].some(o=>o.test(e))}function Ei(n,e,t){return t?.usageScope!=="session"?n:Math.max(n,zu(e))}function Ai(n,e,t){return n?.extendedContextThreshold??e?.extendedContextThreshold??t??2e5}function Ju(n,e,t,o,r,s,a,i,c,l,u,p){let d=n.clientContext,m=d?.longContextThreshold??t.longContextThreshold??c??6e4,h=Ei(e,r,d),f=n.modelFamily,g=Ai(d,t,l),_=d?.supportsExplicitExtendedContext!==!1&&s===!0;if((_||h>g)&&t.extendedContext){let k=G(t.extendedContext,o,!1,"extendedContext",i,p,u);if(k)return n.log.info(`Family: using extended context model (1M+), tokens: ${h}, estimated: ${e}, explicit: ${_}, threshold: ${g}`),{model:k,scenarioType:"extendedContext",isFallback:!1};let T=i?X("extendedContext",o,t.fallback,a,f,u):null;if(T)return n.log.info(`Family: using extended context fallback model (1M+), tokens: ${h}, estimated: ${e}, explicit: ${_}, threshold: ${g}`),{model:T,scenarioType:"extendedContext",isFallback:!0};if(u){let x=ee(n,t.extendedContext,o,"extendedContext");if(x)return{model:x,scenarioType:"extendedContext",isFallback:!1}}n.log.warn("Family: extendedContext model unavailable (fail pool), skipping")}if(h>m&&(t.longContext||t.fallback?.longContext?.length||a?.longContext?.length)){let k=t.longContext?G(t.longContext,o,!1,"longContext",i,p,u):null;if(k)return n.log.info(`Family: using long context model, tokens: ${h}, estimated: ${e}`),{model:k,scenarioType:"longContext",isFallback:!1};let T=i?X("longContext",o,t.fallback,a,f,u):null;if(T)return n.log.info(`Family: using long context fallback model, tokens: ${h}, estimated: ${e}`),{model:T,scenarioType:"longContext",isFallback:!0};if(u&&t.longContext){let x=ee(n,t.longContext,o,"longContext");if(x)return{model:x,scenarioType:"longContext",isFallback:!1}}n.log.warn("Family: no healthy longContext model available, falling through to other scenarios")}if(Array.isArray(n.body.tools)&&n.body.tools.some(k=>k.type?.startsWith("web_search"))&&t.webSearch){let k=G(t.webSearch,o,!1,"webSearch",i,p,u);if(k)return{model:k,scenarioType:"webSearch",isFallback:!1};let T=i?X("webSearch",o,t.fallback,a,f,u):null;if(T)return n.log.info("Family: using webSearch fallback model"),{model:T,scenarioType:"webSearch",isFallback:!0};if(u){let x=ee(n,t.webSearch,o,"webSearch");if(x)return{model:x,scenarioType:"webSearch",isFallback:!1}}n.log.warn("Family: webSearch model unavailable (fail pool), skipping")}if(n.body.thinking?.type==="enabled"&&t.think){let k=G(t.think,o,!1,"think",i,p,u);if(k)return{model:k,scenarioType:"think",isFallback:!1};let T=i?X("think",o,t.fallback,a,f,u):null;if(T)return n.log.info("Family: using think fallback model"),{model:T,scenarioType:"think",isFallback:!0};if(u){let x=ee(n,t.think,o,"think");if(x)return{model:x,scenarioType:"think",isFallback:!1}}n.log.warn("Family: think model unavailable (fail pool), skipping")}if(t.default){let k=G(t.default,o,!1,"default",i,p,u);if(k)return{model:k,scenarioType:"default",isFallback:!1};let T=i?X("default",o,t.fallback,a,f,u):null;if(T)return n.log.info("Family: using default fallback model"),{model:T,scenarioType:"default",isFallback:!0};if(u){let x=ee(n,t.default,o,"default");if(x)return{model:x,scenarioType:"default",isFallback:!1}}n.log.warn("Family: default model unavailable (fail pool), skipping")}return null}function Qu(){if(Se.size<=Si)return;let n=[...Se.keys()].slice(0,Se.size-Si);for(let e of n)Se.delete(e)}function Yu(){if(Be.size<=Ci)return;let n=[...Be].slice(0,Be.size-Ci);for(let e of n)Be.delete(e)}var wi,te,ce,sn,ju,Wu,an,Se,Si,Be,Ci,Ku,Gu,Vu,Ri,Oi,Ce=R(()=>{"use strict";en();re();De();Qt();qt();Fe();mi();ze();wi={provider_not_found:404,model_not_found:404,invalid_model_format:400,provider_disabled:503,model_unhealthy:503,quota_exhausted:503,resolution_failed:502,project_config_error:500,invalid_project_id:400,project_config_not_found:404},te=class extends Error{statusCode;code;type;sessionId;configuredTarget;constructor(e,t){super(e),this.name="ProjectRoutingError",this.statusCode=t?.statusCode||wi[t?.code||""]||502,this.code=t?.code||"project_routing_error",this.type="api_error",this.sessionId=t?.sessionId,this.configuredTarget=t?.configuredTarget}};ce=$u("cl100k_base"),sn=(n,e,t)=>{let o=0;return Array.isArray(n)&&n.forEach(r=>{typeof r.content=="string"?o+=ce.encode(r.content).length:Array.isArray(r.content)&&r.content.forEach(s=>{if(s.type==="text")o+=ce.encode(s.text).length;else if(s.type==="tool_use")o+=ce.encode(JSON.stringify(s.input)).length;else if(s.type==="tool_result"){let a=s.content;if(Array.isArray(a))for(let i of a)i?.type!=="image"&&(o+=ce.encode(i?.type==="text"?String(i.text??""):JSON.stringify(i)).length);else o+=ce.encode(typeof a=="string"?a:JSON.stringify(a)).length}})}),typeof e=="string"?o+=ce.encode(e).length:Array.isArray(e)&&e.forEach(r=>{r.type==="text"&&(typeof r.text=="string"?o+=ce.encode(r.text).length:Array.isArray(r.text)&&r.text.forEach(s=>{o+=ce.encode(s||"").length}))}),t&&t.forEach(r=>{r.description&&(o+=ce.encode(r.name+r.description).length),r.input_schema&&(o+=ce.encode(JSON.stringify(r.input_schema)).length)}),o},ju=async(n,e)=>{let t=n.clientContext?.projectHeaderPresent===!0,o=n.clientContext?.projectId;if(t&&(typeof o!="string"||o.length===0||o.length>1024||o==="."||o===".."||/[/\\\0]/.test(o)))throw new te(`Project routing error: invalid managed project id "${String(o)}".`,{configuredTarget:String(o),code:"invalid_project_id"});let r=t?o:n.sessionId?await Oi(n.sessionId):null;if(!r&&!t&&n.clientType==="zcode"&&n.sessionId){let s=await fi(n.sessionId);s&&Uu(s)&&(r=xi(s))}if(r){n.projectId=r;let s=Zo(vi,r,"config.json");if(!t&&n.sessionId){let a=Zo(vi,r,`${n.sessionId}.json`);try{let i=JSON.parse(await Xo(a,"utf8"));if(i&&i.Router&&Object.keys(i.Router).length>0)return i.Router}catch{}}try{let a=JSON.parse(await Xo(s,"utf8"));if(t&&(typeof a?.projectPath!="string"||xi(a.projectPath)!==o))throw new te(`Project routing error: managed project id "${o}" does not match its stored project path.`,{configuredTarget:s,code:"invalid_project_id"});if(a&&a.Router&&Object.keys(a.Router).length>0)return a.Router}catch(a){if(a instanceof te)throw a;if(t&&a?.code==="ENOENT")throw new te(`Project routing error: managed project "${o}" no longer has a project config.`,{configuredTarget:s,code:"project_config_not_found"});if(!a||a.code!=="ENOENT"){let i=n.sessionId||n.clientContext?.stableSessionId;throw new te(`Project routing error: project config.json is malformed or unreadable in project "${r}". ${a.message}. Session: "${i||"unknown"}".`,{sessionId:i,configuredTarget:s,code:"project_config_error",statusCode:500})}}}};Wu=async(n,e,t,o,r,s)=>{let a=t.get("providers")||[],i=r||t.get("Router"),c=i?.enableFallback===!0,l=c?i?.fallback:void 0,u=c&&!s?l||t.get("fallback"):l,p=!s,d=null;if(n.body?.system?.length>1&&n.body?.system[1]?.text?.includes("<CCR-SUBAGENT-MODEL>")){let v=n.body?.system[1].text.match(/<CCR-SUBAGENT-MODEL>(.*?)<\/CCR-SUBAGENT-MODEL>/s);v&&(n.body.system[1].text=n.body.system[1].text.replace(`<CCR-SUBAGENT-MODEL>${v[1]}</CCR-SUBAGENT-MODEL>`,""),d=v[1])}let{family:m,extended:h,isCcrAlias:f}=ft(n.body.model),g=i?.families?.[m||""];if(g&&i?.enableFamilyRouting){n.log.info(`Using model family routing for: ${m}${h?" (1M)":""}`),n.modelFamily=m,n.familyFallback=g.fallback;let v=Ju(n,e,g,a,o,h,u,c,i?.longContextThreshold,i?.extendedContextThreshold,s,p);if(v)return{model:v.model,scenarioType:v.scenarioType}}if(n.body.model.includes(",")&&!s){let v=G(n.body.model,a,!1,"default",c,p,s);if(v)return{model:v,scenarioType:"default"};n.log.warn(`Explicit model ${n.body.model} unavailable (fail pool), trying fallback`);let C=c?X("default",a,void 0,u,void 0,s):null;if(C)return n.log.info(`Using fallback for explicit model: ${C}`),{model:C,scenarioType:"default"};n.log.warn(`No fallback available for explicit model ${n.body.model}, continuing through routing logic`)}let _=f&&!i?.enableFamilyRouting?null:Hu(n.body.model,i?.models);if(_){let v=G(_,a,!1,"modelMapping",c,p,s);if(v)return n.log.info(`Using mapped model for ${n.body.model}: ${_}`),{model:v,scenarioType:"modelMapping"};let C=c?X("modelMapping",a,void 0,u,void 0,s):null;if(C)return{model:C,scenarioType:"modelMapping"};if(s){let S=ee(n,_,a,"modelMapping");if(S)return{model:S,scenarioType:"modelMapping"}}n.log.warn(`Mapped model ${_} unavailable (fail pool), skipping`)}let b=n.clientContext,y=Ei(e,o,b),k=Ai(b,void 0,i?.extendedContextThreshold);if(y>k&&i?.extendedContext){n.log.info(`Using extended context (1M) model due to token count: ${y}, estimated: ${e}, threshold: ${k}`);let v=G(i.extendedContext,a,!1,"extendedContext",c,p,s);if(v)return{model:v,scenarioType:"extendedContext"};n.log.warn(`Extended context model ${i.extendedContext} unavailable (fail pool), trying fallback`);let C=c?X("extendedContext",a,void 0,u,void 0,s):null;if(C)return{model:C,scenarioType:"extendedContext"};if(s){let S=ee(n,i.extendedContext,a,"extendedContext");if(S)return{model:S,scenarioType:"extendedContext"}}}let T=b?.longContextThreshold??i?.longContextThreshold??6e4;if(y>T&&i?.longContext){n.log.info(`Using long context model due to token count: ${y}, estimated: ${e}, threshold: ${T}`);let v=G(i.longContext,a,!1,"longContext",c,p,s);if(v)return{model:v,scenarioType:"longContext"};n.log.warn(`Long context model ${i.longContext} unavailable (fail pool), trying fallback`);let C=c?X("longContext",a,void 0,u,void 0,s):null;if(C)return{model:C,scenarioType:"longContext"};if(s){let S=ee(n,i.longContext,a,"longContext");if(S)return{model:S,scenarioType:"longContext"}}}if(!s&&d)return n.subagentOverrideModel=d,{model:d,scenarioType:"default"};if(n.body.model?.includes("claude")&&n.body.model?.includes("haiku")&&i?.background){n.log.info(`Using background model for ${n.body.model}`);let v=G(i.background,a,!1,"background",c,p,s);if(v)return{model:v,scenarioType:"background"};let C=c?X("background",a,void 0,u,void 0,s):null;if(C)return{model:C,scenarioType:"background"};if(s){let S=ee(n,i.background,a,"background");if(S)return{model:S,scenarioType:"background"}}n.log.warn(`Background model ${i.background} unavailable (fail pool), falling through`)}if(Array.isArray(n.body.tools)&&n.body.tools.some(v=>v.type?.startsWith("web_search"))&&i?.webSearch){let v=G(i.webSearch,a,!1,"webSearch",c,p,s);if(v)return{model:v,scenarioType:"webSearch"};n.log.warn(`WebSearch model ${i.webSearch} unavailable (fail pool), trying fallback`);let C=c?X("webSearch",a,void 0,u,void 0,s):null;if(C)return{model:C,scenarioType:"webSearch"};if(s){let S=ee(n,i.webSearch,a,"webSearch");if(S)return{model:S,scenarioType:"webSearch"}}}if(n.body.thinking?.type==="enabled"&&i?.think){n.log.info(`Using think model for ${n.body.thinking}`);let v=G(i.think,a,!1,"think",c,p,s);if(v)return{model:v,scenarioType:"think"};n.log.warn(`Think model ${i.think} unavailable (fail pool), trying fallback`);let C=c?X("think",a,void 0,u,void 0,s):null;if(C)return{model:C,scenarioType:"think"};if(s){let S=ee(n,i.think,a,"think");if(S)return{model:S,scenarioType:"think"}}}if(i?.default){let v=G(i.default,a,!1,"default",c,p,s);if(v)return{model:v,scenarioType:"default"};n.log.warn(`Default model ${i.default} unavailable (fail pool), trying fallback`);let C=c?X("default",a,void 0,u,void 0,s):null;if(C)return{model:C,scenarioType:"default"};let S=G(i.default,a,!0,"default",c,p,s);if(S)return n.log.warn(`No fallback available; retrying default model ${i.default} despite fail-pool state (strict=${s})`),{model:S,scenarioType:"default"}}if(s){let v=ee(n,i?.default||n.body.model,a,"default");if(v)return{model:v,scenarioType:"default"}}return{model:void 0,scenarioType:"default"}},an=async(n,e,t)=>{let{configService:o,event:r}=t;!n.originalModel&&n.body.model&&(n.originalModel=n.body.model),(!n.clientContext||!n.usageCacheKey||!n.usageSessionId)&&xe(n,o.getAll());let s=await ju(n,o),a=s||o.get("Router"),i=a?.enableFallback===!0,c=o.get("providers")||[],l=!!s;n.enableFallback=i,n.strictProjectRouting=l,n.fallbackConfig=l?a?.fallback:a?.fallback||o.get("fallback");let u=n.clientContext?.usageScope==="session"?n.previousUsage??Q.get(n.usageCacheKey):void 0,{messages:p,system:d=[],tools:m}=n.body,h=o.get("REWRITE_SYSTEM_PROMPT");if(h&&d.length>1&&d[1]?.text?.includes("<env>")){let f=await Xo(h,"utf-8");d[1].text=`${f}<env>${d[1].text.split("<env>").pop()}`}try{let[f,g]=n.body.model.split(","),_=t.tokenizerService?.getTokenizerConfigForModel(f,g),b;t.tokenizerService?b=(await t.tokenizerService.countTokens({messages:p,system:d,tools:m},_,f)).tokenCount:b=sn(p,d,m),n.tokenCount=b;let y,k=l?void 0:o.get("CUSTOM_ROUTER_PATH");if(k)try{y=await ot(k)(n,o.getAll(),{event:r})}catch(C){n.log.error(`failed to load custom router: ${C.message}`)}if(y)n.scenarioType="default";else{let C=await Wu(n,b,o,u,s,!!s);y=C.model,n.scenarioType=C.scenarioType}let{family:T}=ft(n.originalModel||n.body.model),x=a?.enableFamilyRouting&&T?a.families?.[T]:void 0,v=[x?.image,a?.image].filter((C,S,P)=>!!C&&P.indexOf(C)===S);if(v.length>0&&Bu(n)&&!mt(y))if(v.includes(y))n.scenarioType="image";else{let C=v.map(S=>G(S,c,!1,"image",i,!l,l)).find(S=>!!S);if(C)n.log.info(`Using image model fallback for ${y}`),y=C,n.scenarioType="image";else{let S=i?X("image",c,x?.fallback,n.fallbackConfig,T||void 0,l):null;if(S)n.log.info(`Using image fallback model: ${S}`),y=S,n.scenarioType="image";else if(l){let P=ee(n,v[0],c,"image");P&&(y=P,n.scenarioType="image")}else n.log.warn(`Image models ${v.join(", ")} unavailable (fail pool), keeping ${y}`),n.scenarioType="image"}}if(a?.enableConcurrencyPriority===!0&&!(n.originalModel||"").includes(",")&&!n.subagentOverrideModel&&typeof y=="string"&&y.trim()){let C=n.scenarioType||"default",S=[...(n.familyFallback||{})[C]||[],...(n.fallbackConfig||{})[C]||[]];y=oi(n,y,{threshold:Number(a?.concurrencyThreshold)||3,fallbackModels:S,resolve:P=>G(P,c,!1,C,i,!l,l),log:P=>n.log.info(P)})}typeof y=="string"&&y.trim()?n.body.model=y:(n.log.warn(`Router could not resolve a valid model for ${n.originalModel||n.body.model}; keeping original request model`),n.scenarioType=n.scenarioType||"default")}catch(f){if(f instanceof te)throw f;if(n.log.error(`Error in router middleware: ${f.message}`),l){let g=n.sessionId||n.clientContext?.stableSessionId;throw new te(`Project routing error: router failure in project mode. ${f.message}. Session: "${g||"unknown"}".`,{sessionId:g,configuredTarget:a?.default,code:"project_router_failure",statusCode:502})}n.body.model=a?.default,n.scenarioType="default"}},Se=new Map,Si=1e3,Be=new Set,Ci=1e3,Ku=3,Gu=50,Vu=n=>new Promise(e=>setTimeout(e,n));Ri=async n=>{let e=await Du(Ti),t=[];for await(let s of e)s.isDirectory()&&t.push(s.name);let o=t.map(async s=>{let a=Zo(Ti,s,`${n}.jsonl`);try{return(await Fu(a)).isFile()?s:null}catch{return null}}),r=await Promise.all(o);for(let s of r)if(s)return s;return null},Oi=async n=>{let e=ge(n);if(!e)return null;if(Se.has(e))return Se.get(e)||null;try{let t=await Ri(e);if(!t&&!Be.has(e)){Be.add(e),Yu();for(let o=0;o<Ku&&!t;o++)await Vu(Gu),t=await Ri(e)}return t?(Se.set(e,t),Qu(),t):null}catch(t){return console.error("Error searching for project by session:",t),null}}});function gt(n){let e=[],t=Array.isArray(n.input)?n.input:[n.input];for(let o of t)if(o.type==="function_call")e.push({role:"assistant",tool_calls:[{id:o.call_id,type:"function",function:{name:o.name,arguments:o.arguments||"{}"}}]});else if(o.type==="function_call_output")e.push({role:"tool",tool_call_id:o.call_id,content:typeof o.output=="string"?o.output:JSON.stringify(o.output)});else if(o.type==="reasoning"){let r=Array.isArray(o.summary)?o.summary.filter(s=>s.type==="summary_text"&&s.text).map(s=>s.text).join(`
|
|
43
|
+
`))}}}P();let U=O();U&&E.enqueue(U),N="",E.close()}catch(A){E.error(A)}}})}wrapChatInResponses(e){let t=e?.choices?.[0],o=[],r=[];if(t?.message?.content&&r.push({type:"output_text",text:t.message.content}),o.push({type:"message",role:"assistant",content:r}),Array.isArray(t?.message?.tool_calls))for(let s of t.message.tool_calls)o.push({type:"function_call",id:s.id,call_id:s.id,name:s.function?.name||"",arguments:s.function?.arguments||"{}"});return{id:e.id||`resp_${Date.now()}`,object:"response",model:e.model,output:o,usage:e.usage?{...this.buildResponsesUsage(e.usage)}:void 0}}convertResponseToChat(e){let t=e.output?.find(l=>l.type==="message"),o=e.output?.find(l=>l.type==="function_call"),r;t?.content?.length&&t?.content[0].annotations&&(r=t.content[0].annotations.map(l=>({type:"url_citation",url_citation:{url:l.url||"",title:l.title||"",content:"",start_index:l.start_index||0,end_index:l.end_index||0}}))),this.logger.debug({data:r,type:"url_citation"});let s=null,a=null,i=null;if(t&&t.reasoning&&(i={content:t.reasoning}),t&&t.content){let l=[],u=[];if(t.content.forEach(p=>{if(p.type==="output_text")l.push(p.text||"");else if(p.type==="output_image"){let d=this.buildImageContent({url:p.image_url,mime_type:p.mime_type});d&&u.push(d)}else if(p.type==="output_image_base64"){let d=this.buildImageContent({b64_json:p.image_base64,mime_type:p.mime_type});d&&u.push(d)}}),u.length>0){let p=[];l.length>0&&p.push({type:"text",text:l.join("")}),p.push(...u),s=p}else s=l.join("")}return o&&(a=[{id:o.call_id||o.id,function:{name:o.name,arguments:o.arguments},type:"function"}]),{id:e.id||"chatcmpl-"+Date.now(),object:"chat.completion",created:e.created_at,model:e.model,choices:[{index:0,message:{role:"assistant",content:s||null,tool_calls:a,thinking:i,annotations:r},logprobs:null,finish_reason:a?"tool_calls":"stop"}],usage:e.usage?{prompt_tokens:e.usage.input_tokens||0,completion_tokens:e.usage.output_tokens||0,total_tokens:e.usage.total_tokens||0,prompt_tokens_details:{cached_tokens:this.getCacheReadInputTokens(e.usage),cache_creation_tokens:this.getCacheCreationInputTokens(e.usage)},cache_read_input_tokens:this.getCacheReadInputTokens(e.usage),cache_creation_input_tokens:this.getCacheCreationInputTokens(e.usage)}:null}}buildImageContent(e){return e&&(e.url||e.b64_json)?{type:"image_url",image_url:{url:e.url||"",b64_json:e.b64_json},media_type:e.mime_type}:null}}});var Jo,Q,en=R(()=>{"use strict";Jo=class{capacity;cache;constructor(e){this.capacity=e,this.cache=new Map}get(e){if(!this.cache.has(e))return;let t=this.cache.get(e);return this.cache.delete(e),this.cache.set(e,t),t}put(e,t){if(this.cache.has(e))this.cache.delete(e);else if(this.cache.size>=this.capacity){let o=this.cache.keys().next().value;o!==void 0&&this.cache.delete(o)}this.cache.set(e,t)}values(){return Array.from(this.cache.values())}delete(e){return this.cache.delete(e)}},Q=new Jo(100)});import{existsSync as ci,mkdirSync as Vl,readFileSync as Ql,writeFileSync as Yl}from"fs";import{join as li}from"path";import{HOME_DIR as Xl}from"@wengine-ai/claude-code-router-shared";function Go(n,e){n&&De.set(n,{...e,provider:n,capturedAt:Date.now()})}function tn(n){let e=De.get(n);return e?{...e}:void 0}function Vo(){return Array.from(De.values()).map(n=>({...n}))}function Zl(){try{if(!ci(Ko))return;let n=JSON.parse(Ql(Ko,"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>1440*60*1e3)continue;De.set(t.provider,t)}}catch{}}function ai(){try{if(De.size===0)return;ci(Wo)||Vl(Wo,{recursive:!0}),Yl(Ko,JSON.stringify(Array.from(De.values()),null,2),"utf-8")}catch{}}function lt(){si||(si=!0,Zl(),ii=setInterval(ai,6e4),ii.unref?.(),process.on("exit",ai))}var Wo,Ko,De,si,ii,Fe=R(()=>{"use strict";Wo=li(Xl,"runtime"),Ko=li(Wo,"quota-store.json"),De=new Map,si=!1,ii=null});function ge(n){if(typeof n!="string")return;let e=n.trim();if(!(!e||!ql.test(e)))return e}function he(n){if(!n)return;if(typeof n=="object")return ge(n.session_id??n.sessionId);if(typeof n!="string")return;let e=n.trim();if(!e)return;try{let r=JSON.parse(e),s=ge(r?.session_id??r?.sessionId);if(s)return s}catch{}let t="_session_",o=e.lastIndexOf(t);if(o!==-1)return ge(e.slice(o+t.length))}var ql,Ue=R(()=>{"use strict";ql=/^[A-Za-z0-9_-]+$/});import{existsSync as pi}from"fs";import{readFile as eu,readdir as tu}from"fs/promises";import{homedir as nu}from"os";import{isAbsolute as ou,join as ut,normalize as ru}from"path";import{openSqliteDatabase as su}from"@wengine-ai/claude-code-router-shared";function fu(){if(je.size<=ui)return;let n=[...je.keys()].slice(0,je.size-ui);for(let e of n)je.delete(e)}function mu(){if(He.size<=di)return;let n=[...He].slice(0,He.size-di);for(let e of n)He.delete(e)}function gu(n){let e=n.trim();if(!e||e==="."||e===".."||/[/\\\0]/.test(e))return[];let t=e.replace(/^sess_/,"");return[...new Set([e,t,`sess_${t}`])].filter(Boolean)}function hu(n,e){let t;try{t=su(n,{readonly:!0}).db;let o=t.prepare("SELECT workspace_path FROM tasks WHERE task_id = ? OR acp_session_id = ? ORDER BY updated_at DESC LIMIT 1");for(let r of e){let a=o.get(r,r)?.workspace_path;if(typeof a=="string"&&a.trim())return a.trim()}return null}catch{return null}finally{try{t?.close()}catch{}}}async function yu(n,e){let t;try{t=await tu(n)}catch{return null}for(let o of t)for(let r of e){let s=ut(n,o,`${r}.json`);if(pi(s))try{let a=JSON.parse(await eu(s,"utf8")),i=a?.meta?.workspacePath??a?.workspacePath;if(typeof i=="string"&&i.trim())return i.trim()}catch{}}return null}async function fi(n){let e=typeof n=="string"?n.trim():"";if(!e)return null;let t=je.get(e);if(t)return t;let o=async()=>{let r=gu(e);if(r.length===0)return null;let s=ut(iu(),au),a=ut(s,cu);if(pi(a)){let i=hu(a,r);if(i)return i}return yu(ut(s,lu),r)};try{let r=await o();if(!r&&!He.has(e)){He.add(e),mu();for(let a=0;a<uu&&!r;a++)await pu(du),r=await o()}if(!r||!ou(r))return null;let s=ru(r);return je.set(e,s),fu(),s}catch{return null}}var iu,au,cu,lu,ui,di,uu,du,je,He,pu,mi=R(()=>{"use strict";iu=()=>process.env.CCR_ZCODE_DIR||ut(nu(),".zcode"),au="v2",cu="tasks-index.sqlite",lu="sessions",ui=500,di=500,uu=3,du=50,je=new Map,He=new Set,pu=n=>new Promise(e=>setTimeout(e,n))});import{randomUUID as _u}from"node:crypto";import{CCR_PROJECT_HEADER as Qo}from"@wengine-ai/claude-code-router-shared";function yi(n){return typeof n=="string"&&n.length<=bu}function ku(n){if(!(!n?.headers||typeof n.headers!="object"))for(let e of hi){let{value:t}=nn(n,e);if(!yi(t))continue;let o=ge(t);if(o)return o}}function vu(n){if(typeof n=="string")return n.slice(0,1e3);if(Array.isArray(n)){let e=n.find(t=>t&&typeof t.text=="string");return e?String(e.text).slice(0,1e3):""}return""}function xu(n){if(typeof n?.pathname=="string")return n.pathname;if(typeof n?.url!="string")return"";try{return new URL(n.url,"http://127.0.0.1").pathname}catch{return n.url}}function nn(n,e){let t=n?.headers;if(!t||typeof t!="object")return{present:!1};let o=Object.keys(t).find(s=>s.toLowerCase()===e);if(!o)return{present:!1};let r=t[o];return typeof r=="string"?{present:!0,value:r.trim()}:Array.isArray(r)&&typeof r[0]=="string"?{present:!0,value:r[0].trim()}:{present:!0}}function gi(n,e){if(!(!n?.headers||typeof n.headers!="object"))for(let t of Object.keys(n.headers))t.toLowerCase()===e&&delete n.headers[t]}function dt(n,e=!0){return{clientType:n,usageScope:"request",supportsExplicitExtendedContext:e}}function Yo(n,e,t=!0){let o=he(n?.body?.metadata?.user_id);return{clientType:e,usageScope:o?"session":"request",stableSessionId:o,supportsExplicitExtendedContext:t}}function bi(n){return typeof n=="string"&&Tu.includes(n)}function Iu(n,e){return/zcode/i.test(e)?!0:Object.keys(n).some(t=>t.toLowerCase().startsWith("x-zcode"))}function ze(n){if(bi(n?.clientType))return n.clientType;let e=xu(n),t=n?.headers||{},o=typeof t["user-agent"]=="string"?t["user-agent"]:"",r=n?.body||{},s=vu(r.system);if(/\bYou are Qwen Code\b/i.test(s)||/Qwen Code, an interactive CLI agent/i.test(s))return"qwen-code";if(/operating inside pi\b/i.test(s)||/a coding agent harness/i.test(s))return"pi";if(/\bYou are opencode\b/i.test(s))return"opencode";if(nn(n,Qo).present||nn(n,"x-session-affinity").present)return"pi";if(Iu(t,o))return"zcode";let a=t["x-anthropic-billing-header"];if(typeof a=="string"&&a.includes("cc_version="))return"claude-code";if(o.includes("codex")||o.includes("Codex")||e.endsWith("/v1/responses"))return"codex";if(r.metadata&&typeof r.metadata=="object"&&typeof r.metadata.user_id=="string")return"claude-code";if(o.includes("opencode"))return"opencode";if(o.includes("pi-coding-agent"))return"pi";if(o.includes("QwenCode"))return"qwen-code";let i=n?.originalModel||r.model||"";return/^ccr-(opus|sonnet|haiku)(\[1m\])?$/i.test(i)?o.includes("Anthropic/")?"pi":o.includes("claude-cli")||o.includes("Claude-CLI")?"qwen-code":typeof t["x-stainless-package-version"]=="string"?"pi":"claude-code":o.includes("claude-cli")||o.includes("Claude-CLI")?"claude-code":String(i).toLowerCase()==="ccr-codex"?"codex":e.endsWith("/v1/messages")?"api":"unknown"}function ki(n){return _i[n]}function Mu(n){if(typeof n?.__ccrRequestScopeId=="string"&&n.__ccrRequestScopeId)return n.__ccrRequestScopeId;let e=typeof n?.id=="string"&&n.id||_u();return n.__ccrRequestScopeId=e,e}function xe(n,e={}){let t=ze(n),o=ki(t).createContext(n,e),r=o.usageScope==="session"&&o.stableSessionId?o.stableSessionId:Mu(n),s=o.usageScope==="session"?"session":"request";n.clientType=t,n.clientContext=o,o.stableSessionId?n.sessionId=o.stableSessionId:delete n.sessionId,o.projectHeaderPresent?n.projectId=o.projectId:delete n.projectId,gi(n,Qo),t==="pi"&&o.stableSessionId&&(n.__ccrSessionAffinity=o.stableSessionId);for(let a of hi)gi(n,a);return n.usageSessionId=r,n.usageCacheKey=`${t}:${s}:${r}`,o}function Lu(){}var hi,bu,Tu,Su,Cu,Ru,wu,Pu,Eu,Au,Ou,_i,Be=R(()=>{"use strict";Ue();hi=["x-session-affinity","x-session-id","x-litellm-session-id"],bu=256;Tu=["claude-code","zcode","pi","qwen-code","opencode","codex","api","unknown"];Su={type:"claude-code",createContext(n){return Yo(n,"claude-code")}},Cu={type:"zcode",createContext(n){return Yo(n,"zcode")}},Ru={type:"pi",createContext(n){let e=nn(n,Qo),t=ku(n)||(typeof n?.__ccrSessionAffinity=="string"?n.__ccrSessionAffinity:void 0)||he(n?.body?.metadata?.user_id),o=yi(t)?t:void 0;return{...dt("pi",!1),stableSessionId:o,projectId:e.value,projectHeaderPresent:e.present}}},wu={type:"qwen-code",createContext(n){return Yo(n,"qwen-code")}},Pu={type:"opencode",createContext(){return dt("opencode")}},Eu={type:"codex",createContext(){return dt("codex")}},Au={type:"api",createContext(){return dt("api")}},Ou={type:"unknown",createContext(){return dt("unknown")}},_i={"claude-code":Su,zcode:Cu,pi:Ru,"qwen-code":wu,opencode:Pu,codex:Eu,api:Au,unknown:Ou}});import{get_encoding as $u}from"tiktoken";import{readFile as Xo}from"fs/promises";import{opendir as Du,stat as Fu}from"fs/promises";import{join as Zo}from"path";import{CLAUDE_PROJECTS_DIR as Ti,HOME_DIR as vi,getClaudeProjectId as xi,isZcodeProjectTakeoverActive as Uu}from"@wengine-ai/claude-code-router-shared";function ee(n,e,t,o){let r=Pi(e,t);if(r.code==="model_unhealthy"){let i=G(e,t,!0);if(i)return n.log.warn(`Strict project target ${e} is in the health fail-pool; retrying it anyway (no fallback available). scenario=${o}`),i}let s=n.sessionId||n.clientContext?.stableSessionId,a=wi[r.code]||502;throw new te(`Project routing error (${o}): ${r.reason}. Project-level Router target: "${e}". Session: "${s||"unknown"}".`,{sessionId:s,configuredTarget:e,code:r.code,statusCode:a})}function rn(n){let e=n||"";return e.includes(",")&&(e=e.split(",").pop()||e),e.includes("/")&&(e=e.split("/").pop()||e),e.includes(":")&&(e=e.split(":")[0]),e.trim().toLowerCase()}function ft(n){let e=rn(n),t=e.includes("[1m]")||e.endsWith("[1m"),o=e.replace(/\[1m\]|\[1m$/g,""),r=o.match(/^ccr-(opus|sonnet|haiku)$/i);if(r)return{family:r[1].toLowerCase(),extended:t,isCcrAlias:!0};let s=o.match(/claude-(?:\d+-\d+-|\d+-)?(sonnet|opus|haiku)(?:-|$)/i)||o.match(/claude-(sonnet|opus|haiku)(?:-|$)/i);return s?{family:s[1].toLowerCase(),extended:t,isCcrAlias:!1}:{family:null,extended:t,isCcrAlias:!1}}function Hu(n,e){if(!e||!n)return null;let t=rn(n);if(e[n])return e[n];if(e[t])return e[t];let{family:o}=ft(n);if(o&&e[o])return e[o];for(let[r,s]of Object.entries(e)){let a=rn(r);if(a&&t.includes(a))return s}return null}function zu(n){return n?(n.input_tokens||0)+(n.cache_read_input_tokens||0)+(n.cache_creation_input_tokens||0):0}function on(n){if(!n?.includes(","))return null;let[e,...t]=n.split(","),o=e.trim(),r=t.join(",").trim();return!o||!r?null:{providerName:o,routeModel:r}}function pt(n,e,t){let o=n.find(s=>s.name.toLowerCase()===e.toLowerCase());if(!o||o.enabled===!1)return null;let r=o.models?.find(s=>String(s).toLowerCase()===t.toLowerCase());return r?{provider:o,model:String(r)}:null}function Pi(n,e){let t=on(n);if(!t)return{reason:`invalid model format "${n}" (expected "provider,model")`,code:"invalid_model_format"};let{providerName:o,routeModel:r}=t,s=e.find(l=>l.name?.toLowerCase()===o.toLowerCase());if(!s)return{reason:`provider "${o}" not found`,code:"provider_not_found"};if(s.enabled===!1)return{reason:`provider "${o}" is disabled`,code:"provider_disabled"};let a=s.models?.find(l=>String(l).toLowerCase()===r.toLowerCase());if(!a)return{reason:`model "${r}" not found in provider "${o}"`,code:"model_not_found"};if(!j().isAvailable(s.name,String(a),s.apiKey?.startsWith("ccr-managed-")===!0||s.api_key?.startsWith("ccr-managed-")===!0))return{reason:`model "${r}" in provider "${o}" is temporarily unavailable (health fail-pool)`,code:"model_unhealthy"};let c=tn(s.name);if(c){let l=c.limitDaily!==void 0&&c.usedDailyBalance!==void 0&&c.usedDailyBalance>=c.limitDaily,u=c.totalBalance!==void 0&&c.usedBalance!==void 0&&c.usedBalance>=c.totalBalance;if(l||u)return{reason:`provider "${o}" quota is exhausted`,code:"quota_exhausted"}}return{reason:`unable to resolve model "${n}"`,code:"resolution_failed"}}function G(n,e,t,o,r,s,a){let i=on(n);if(!i)return a?null:n;let{providerName:c,routeModel:l}=i,u=pt(e,c,l);if(!u){if(r===!0&&o&&!t&&s!==!1){let d=Me(),f=d.getPromotion(c,l,o,e);if(f){let h=on(f);if(h){let g=pt(e,h.providerName,h.routeModel);if(g)return`${g.provider.name},${g.model}`}d.clear(c,l,o)}}return null}if(r===!0&&o&&!t&&s!==!1){let d=Me(),f=d.getPromotion(c,l,o,e);if(f){let h=on(f);if(h){let g=pt(e,h.providerName,h.routeModel);if(g)return`${g.provider.name},${g.model}`}d.clear(c,l,o)}}if(!t&&!j().isAvailable(u.provider.name,u.model,u.provider.apiKey?.startsWith("ccr-managed-")===!0||u.provider.api_key?.startsWith("ccr-managed-")===!0))return null;let p=tn(u.provider.name);if(p){let d=p.limitDaily!==void 0&&p.usedDailyBalance!==void 0&&p.usedDailyBalance>=p.limitDaily,f=p.totalBalance!==void 0&&p.usedBalance!==void 0&&p.usedBalance>=p.totalBalance;if(d||f)return null}return`${u.provider.name},${u.model}`}function X(n,e,t,o,r,s){let a=j(),i=[t?.[n],o?.[n]];for(let c of i)if(!(!Array.isArray(c)||c.length===0))for(let l of c){let u=G(l,e,!1,n,void 0,void 0,s);if(u)return u}return null}function Bu(n){return n.body.messages?.some(e=>e.role==="user"&&Array.isArray(e.content)&&e.content.some(t=>t.type==="image"||t.type==="image_url"||Array.isArray(t?.content)&&t.content.some(o=>o.type==="image"||o.type==="image_url")))}function mt(n){let e=rn(n);return[/claude/i,/gemini/i,/gpt-4o/i,/gpt-4\.1/i,/gpt-4-vision/i,/qwen.*vl/i,/glm-4v/i,/grok.*vision/i,/pixtral/i,/llava/i].some(o=>o.test(e))}function Ei(n,e,t){return t?.usageScope!=="session"?n:Math.max(n,zu(e))}function Ai(n,e,t){return n?.extendedContextThreshold??e?.extendedContextThreshold??t??2e5}function Ju(n,e,t,o,r,s,a,i,c,l,u,p){let d=n.clientContext,f=d?.longContextThreshold??t.longContextThreshold??c??6e4,h=Ei(e,r,d),g=n.modelFamily,m=Ai(d,t,l),_=d?.supportsExplicitExtendedContext!==!1&&s===!0;if((_||h>m)&&t.extendedContext){let k=G(t.extendedContext,o,!1,"extendedContext",i,p,u);if(k)return n.log.info(`Family: using extended context model (1M+), tokens: ${h}, estimated: ${e}, explicit: ${_}, threshold: ${m}`),{model:k,scenarioType:"extendedContext",isFallback:!1};let v=i?X("extendedContext",o,t.fallback,a,g,u):null;if(v)return n.log.info(`Family: using extended context fallback model (1M+), tokens: ${h}, estimated: ${e}, explicit: ${_}, threshold: ${m}`),{model:v,scenarioType:"extendedContext",isFallback:!0};if(u){let x=ee(n,t.extendedContext,o,"extendedContext");if(x)return{model:x,scenarioType:"extendedContext",isFallback:!1}}n.log.warn("Family: extendedContext model unavailable (fail pool), skipping")}if(h>f&&(t.longContext||t.fallback?.longContext?.length||a?.longContext?.length)){let k=t.longContext?G(t.longContext,o,!1,"longContext",i,p,u):null;if(k)return n.log.info(`Family: using long context model, tokens: ${h}, estimated: ${e}`),{model:k,scenarioType:"longContext",isFallback:!1};let v=i?X("longContext",o,t.fallback,a,g,u):null;if(v)return n.log.info(`Family: using long context fallback model, tokens: ${h}, estimated: ${e}`),{model:v,scenarioType:"longContext",isFallback:!0};if(u&&t.longContext){let x=ee(n,t.longContext,o,"longContext");if(x)return{model:x,scenarioType:"longContext",isFallback:!1}}n.log.warn("Family: no healthy longContext model available, falling through to other scenarios")}if(Array.isArray(n.body.tools)&&n.body.tools.some(k=>k.type?.startsWith("web_search"))&&t.webSearch){let k=G(t.webSearch,o,!1,"webSearch",i,p,u);if(k)return{model:k,scenarioType:"webSearch",isFallback:!1};let v=i?X("webSearch",o,t.fallback,a,g,u):null;if(v)return n.log.info("Family: using webSearch fallback model"),{model:v,scenarioType:"webSearch",isFallback:!0};if(u){let x=ee(n,t.webSearch,o,"webSearch");if(x)return{model:x,scenarioType:"webSearch",isFallback:!1}}n.log.warn("Family: webSearch model unavailable (fail pool), skipping")}if(n.body.thinking?.type==="enabled"&&t.think){let k=G(t.think,o,!1,"think",i,p,u);if(k)return{model:k,scenarioType:"think",isFallback:!1};let v=i?X("think",o,t.fallback,a,g,u):null;if(v)return n.log.info("Family: using think fallback model"),{model:v,scenarioType:"think",isFallback:!0};if(u){let x=ee(n,t.think,o,"think");if(x)return{model:x,scenarioType:"think",isFallback:!1}}n.log.warn("Family: think model unavailable (fail pool), skipping")}if(t.default){let k=G(t.default,o,!1,"default",i,p,u);if(k)return{model:k,scenarioType:"default",isFallback:!1};let v=i?X("default",o,t.fallback,a,g,u):null;if(v)return n.log.info("Family: using default fallback model"),{model:v,scenarioType:"default",isFallback:!0};if(u){let x=ee(n,t.default,o,"default");if(x)return{model:x,scenarioType:"default",isFallback:!1}}n.log.warn("Family: default model unavailable (fail pool), skipping")}return null}function Qu(){if(Se.size<=Si)return;let n=[...Se.keys()].slice(0,Se.size-Si);for(let e of n)Se.delete(e)}function Yu(){if(Je.size<=Ci)return;let n=[...Je].slice(0,Je.size-Ci);for(let e of n)Je.delete(e)}var wi,te,ce,sn,ju,Wu,an,Se,Si,Je,Ci,Ku,Gu,Vu,Ri,Oi,Ce=R(()=>{"use strict";en();re();Fe();Qt();qt();Ue();mi();Be();wi={provider_not_found:404,model_not_found:404,invalid_model_format:400,provider_disabled:503,model_unhealthy:503,quota_exhausted:503,resolution_failed:502,project_config_error:500,invalid_project_id:400,project_config_not_found:404},te=class extends Error{statusCode;code;type;sessionId;configuredTarget;constructor(e,t){super(e),this.name="ProjectRoutingError",this.statusCode=t?.statusCode||wi[t?.code||""]||502,this.code=t?.code||"project_routing_error",this.type="api_error",this.sessionId=t?.sessionId,this.configuredTarget=t?.configuredTarget}};ce=$u("cl100k_base"),sn=(n,e,t)=>{let o=0;return Array.isArray(n)&&n.forEach(r=>{typeof r.content=="string"?o+=ce.encode(r.content).length:Array.isArray(r.content)&&r.content.forEach(s=>{if(s.type==="text")o+=ce.encode(s.text).length;else if(s.type==="tool_use")o+=ce.encode(JSON.stringify(s.input)).length;else if(s.type==="tool_result"){let a=s.content;if(Array.isArray(a))for(let i of a)i?.type!=="image"&&(o+=ce.encode(i?.type==="text"?String(i.text??""):JSON.stringify(i)).length);else o+=ce.encode(typeof a=="string"?a:JSON.stringify(a)).length}})}),typeof e=="string"?o+=ce.encode(e).length:Array.isArray(e)&&e.forEach(r=>{r.type==="text"&&(typeof r.text=="string"?o+=ce.encode(r.text).length:Array.isArray(r.text)&&r.text.forEach(s=>{o+=ce.encode(s||"").length}))}),t&&t.forEach(r=>{r.description&&(o+=ce.encode(r.name+r.description).length),r.input_schema&&(o+=ce.encode(JSON.stringify(r.input_schema)).length)}),o},ju=async(n,e)=>{let t=n.clientContext?.projectHeaderPresent===!0,o=n.clientContext?.projectId;if(t&&(typeof o!="string"||o.length===0||o.length>1024||o==="."||o===".."||/[/\\\0]/.test(o)))throw new te(`Project routing error: invalid managed project id "${String(o)}".`,{configuredTarget:String(o),code:"invalid_project_id"});let r=t?o:n.sessionId?await Oi(n.sessionId):null;if(!r&&!t&&n.clientType==="zcode"&&n.sessionId){let s=await fi(n.sessionId);s&&Uu(s)&&(r=xi(s))}if(r){n.projectId=r;let s=Zo(vi,r,"config.json");if(!t&&n.sessionId){let a=Zo(vi,r,`${n.sessionId}.json`);try{let i=JSON.parse(await Xo(a,"utf8"));if(i&&i.Router&&Object.keys(i.Router).length>0)return i.Router}catch{}}try{let a=JSON.parse(await Xo(s,"utf8"));if(t&&(typeof a?.projectPath!="string"||xi(a.projectPath)!==o))throw new te(`Project routing error: managed project id "${o}" does not match its stored project path.`,{configuredTarget:s,code:"invalid_project_id"});if(a&&a.Router&&Object.keys(a.Router).length>0)return a.Router}catch(a){if(a instanceof te)throw a;if(t&&a?.code==="ENOENT")throw new te(`Project routing error: managed project "${o}" no longer has a project config.`,{configuredTarget:s,code:"project_config_not_found"});if(!a||a.code!=="ENOENT"){let i=n.sessionId||n.clientContext?.stableSessionId;throw new te(`Project routing error: project config.json is malformed or unreadable in project "${r}". ${a.message}. Session: "${i||"unknown"}".`,{sessionId:i,configuredTarget:s,code:"project_config_error",statusCode:500})}}}};Wu=async(n,e,t,o,r,s)=>{let a=t.get("providers")||[],i=r||t.get("Router"),c=i?.enableFallback===!0,l=c?i?.fallback:void 0,u=c&&!s?l||t.get("fallback"):l,p=!s,d=null;if(n.body?.system?.length>1&&n.body?.system[1]?.text?.includes("<CCR-SUBAGENT-MODEL>")){let T=n.body?.system[1].text.match(/<CCR-SUBAGENT-MODEL>(.*?)<\/CCR-SUBAGENT-MODEL>/s);T&&(n.body.system[1].text=n.body.system[1].text.replace(`<CCR-SUBAGENT-MODEL>${T[1]}</CCR-SUBAGENT-MODEL>`,""),d=T[1])}let{family:f,extended:h,isCcrAlias:g}=ft(n.body.model),m=i?.families?.[f||""];if(m&&i?.enableFamilyRouting){n.log.info(`Using model family routing for: ${f}${h?" (1M)":""}`),n.modelFamily=f,n.familyFallback=m.fallback;let T=Ju(n,e,m,a,o,h,u,c,i?.longContextThreshold,i?.extendedContextThreshold,s,p);if(T)return{model:T.model,scenarioType:T.scenarioType}}if(n.body.model.includes(",")&&!s){let T=G(n.body.model,a,!1,"default",c,p,s);if(T)return{model:T,scenarioType:"default"};n.log.warn(`Explicit model ${n.body.model} unavailable (fail pool), trying fallback`);let C=c?X("default",a,void 0,u,void 0,s):null;if(C)return n.log.info(`Using fallback for explicit model: ${C}`),{model:C,scenarioType:"default"};n.log.warn(`No fallback available for explicit model ${n.body.model}, continuing through routing logic`)}let _=g&&!i?.enableFamilyRouting?null:Hu(n.body.model,i?.models);if(_){let T=G(_,a,!1,"modelMapping",c,p,s);if(T)return n.log.info(`Using mapped model for ${n.body.model}: ${_}`),{model:T,scenarioType:"modelMapping"};let C=c?X("modelMapping",a,void 0,u,void 0,s):null;if(C)return{model:C,scenarioType:"modelMapping"};if(s){let S=ee(n,_,a,"modelMapping");if(S)return{model:S,scenarioType:"modelMapping"}}n.log.warn(`Mapped model ${_} unavailable (fail pool), skipping`)}let b=n.clientContext,y=Ei(e,o,b),k=Ai(b,void 0,i?.extendedContextThreshold);if(y>k&&i?.extendedContext){n.log.info(`Using extended context (1M) model due to token count: ${y}, estimated: ${e}, threshold: ${k}`);let T=G(i.extendedContext,a,!1,"extendedContext",c,p,s);if(T)return{model:T,scenarioType:"extendedContext"};n.log.warn(`Extended context model ${i.extendedContext} unavailable (fail pool), trying fallback`);let C=c?X("extendedContext",a,void 0,u,void 0,s):null;if(C)return{model:C,scenarioType:"extendedContext"};if(s){let S=ee(n,i.extendedContext,a,"extendedContext");if(S)return{model:S,scenarioType:"extendedContext"}}}let v=b?.longContextThreshold??i?.longContextThreshold??6e4;if(y>v&&i?.longContext){n.log.info(`Using long context model due to token count: ${y}, estimated: ${e}, threshold: ${v}`);let T=G(i.longContext,a,!1,"longContext",c,p,s);if(T)return{model:T,scenarioType:"longContext"};n.log.warn(`Long context model ${i.longContext} unavailable (fail pool), trying fallback`);let C=c?X("longContext",a,void 0,u,void 0,s):null;if(C)return{model:C,scenarioType:"longContext"};if(s){let S=ee(n,i.longContext,a,"longContext");if(S)return{model:S,scenarioType:"longContext"}}}if(!s&&d)return n.subagentOverrideModel=d,{model:d,scenarioType:"default"};if(n.body.model?.includes("claude")&&n.body.model?.includes("haiku")&&i?.background){n.log.info(`Using background model for ${n.body.model}`);let T=G(i.background,a,!1,"background",c,p,s);if(T)return{model:T,scenarioType:"background"};let C=c?X("background",a,void 0,u,void 0,s):null;if(C)return{model:C,scenarioType:"background"};if(s){let S=ee(n,i.background,a,"background");if(S)return{model:S,scenarioType:"background"}}n.log.warn(`Background model ${i.background} unavailable (fail pool), falling through`)}if(Array.isArray(n.body.tools)&&n.body.tools.some(T=>T.type?.startsWith("web_search"))&&i?.webSearch){let T=G(i.webSearch,a,!1,"webSearch",c,p,s);if(T)return{model:T,scenarioType:"webSearch"};n.log.warn(`WebSearch model ${i.webSearch} unavailable (fail pool), trying fallback`);let C=c?X("webSearch",a,void 0,u,void 0,s):null;if(C)return{model:C,scenarioType:"webSearch"};if(s){let S=ee(n,i.webSearch,a,"webSearch");if(S)return{model:S,scenarioType:"webSearch"}}}if(n.body.thinking?.type==="enabled"&&i?.think){n.log.info(`Using think model for ${n.body.thinking}`);let T=G(i.think,a,!1,"think",c,p,s);if(T)return{model:T,scenarioType:"think"};n.log.warn(`Think model ${i.think} unavailable (fail pool), trying fallback`);let C=c?X("think",a,void 0,u,void 0,s):null;if(C)return{model:C,scenarioType:"think"};if(s){let S=ee(n,i.think,a,"think");if(S)return{model:S,scenarioType:"think"}}}if(i?.default){let T=G(i.default,a,!1,"default",c,p,s);if(T)return{model:T,scenarioType:"default"};n.log.warn(`Default model ${i.default} unavailable (fail pool), trying fallback`);let C=c?X("default",a,void 0,u,void 0,s):null;if(C)return{model:C,scenarioType:"default"};let S=G(i.default,a,!0,"default",c,p,s);if(S)return n.log.warn(`No fallback available; retrying default model ${i.default} despite fail-pool state (strict=${s})`),{model:S,scenarioType:"default"}}if(s){let T=ee(n,i?.default||n.body.model,a,"default");if(T)return{model:T,scenarioType:"default"}}return{model:void 0,scenarioType:"default"}},an=async(n,e,t)=>{let{configService:o,event:r}=t;!n.originalModel&&n.body.model&&(n.originalModel=n.body.model),(!n.clientContext||!n.usageCacheKey||!n.usageSessionId)&&xe(n,o.getAll());let s=await ju(n,o),a=s||o.get("Router"),i=a?.enableFallback===!0,c=o.get("providers")||[],l=!!s;n.enableFallback=i,n.strictProjectRouting=l,n.fallbackConfig=l?a?.fallback:a?.fallback||o.get("fallback");let u=n.clientContext?.usageScope==="session"?n.previousUsage??Q.get(n.usageCacheKey):void 0,{messages:p,system:d=[],tools:f}=n.body,h=o.get("REWRITE_SYSTEM_PROMPT");if(h&&d.length>1&&d[1]?.text?.includes("<env>")){let g=await Xo(h,"utf-8");d[1].text=`${g}<env>${d[1].text.split("<env>").pop()}`}try{let[g,m]=n.body.model.split(","),_=t.tokenizerService?.getTokenizerConfigForModel(g,m),b;t.tokenizerService?b=(await t.tokenizerService.countTokens({messages:p,system:d,tools:f},_,g)).tokenCount:b=sn(p,d,f),n.tokenCount=b;let y,k=l?void 0:o.get("CUSTOM_ROUTER_PATH");if(k)try{y=await ot(k)(n,o.getAll(),{event:r})}catch(C){n.log.error(`failed to load custom router: ${C.message}`)}if(y)n.scenarioType="default";else{let C=await Wu(n,b,o,u,s,!!s);y=C.model,n.scenarioType=C.scenarioType}let{family:v}=ft(n.originalModel||n.body.model),x=a?.enableFamilyRouting&&v?a.families?.[v]:void 0,T=[x?.image,a?.image].filter((C,S,P)=>!!C&&P.indexOf(C)===S);if(T.length>0&&Bu(n)&&!mt(y))if(T.includes(y))n.scenarioType="image";else{let C=T.map(S=>G(S,c,!1,"image",i,!l,l)).find(S=>!!S);if(C)n.log.info(`Using image model fallback for ${y}`),y=C,n.scenarioType="image";else{let S=i?X("image",c,x?.fallback,n.fallbackConfig,v||void 0,l):null;if(S)n.log.info(`Using image fallback model: ${S}`),y=S,n.scenarioType="image";else if(l){let P=ee(n,T[0],c,"image");P&&(y=P,n.scenarioType="image")}else n.log.warn(`Image models ${T.join(", ")} unavailable (fail pool), keeping ${y}`),n.scenarioType="image"}}if(a?.enableConcurrencyPriority===!0&&!(n.originalModel||"").includes(",")&&!n.subagentOverrideModel&&typeof y=="string"&&y.trim()){let C=n.scenarioType||"default",S=[...(n.familyFallback||{})[C]||[],...(n.fallbackConfig||{})[C]||[]];y=oi(n,y,{threshold:Number(a?.concurrencyThreshold)||3,fallbackModels:S,resolve:P=>G(P,c,!1,C,i,!l,l),log:P=>n.log.info(P)})}typeof y=="string"&&y.trim()?n.body.model=y:(n.log.warn(`Router could not resolve a valid model for ${n.originalModel||n.body.model}; keeping original request model`),n.scenarioType=n.scenarioType||"default")}catch(g){if(g instanceof te)throw g;if(n.log.error(`Error in router middleware: ${g.message}`),l){let m=n.sessionId||n.clientContext?.stableSessionId;throw new te(`Project routing error: router failure in project mode. ${g.message}. Session: "${m||"unknown"}".`,{sessionId:m,configuredTarget:a?.default,code:"project_router_failure",statusCode:502})}n.body.model=a?.default,n.scenarioType="default"}},Se=new Map,Si=1e3,Je=new Set,Ci=1e3,Ku=3,Gu=50,Vu=n=>new Promise(e=>setTimeout(e,n));Ri=async n=>{let e=await Du(Ti),t=[];for await(let s of e)s.isDirectory()&&t.push(s.name);let o=t.map(async s=>{let a=Zo(Ti,s,`${n}.jsonl`);try{return(await Fu(a)).isFile()?s:null}catch{return null}}),r=await Promise.all(o);for(let s of r)if(s)return s;return null},Oi=async n=>{let e=ge(n);if(!e)return null;if(Se.has(e))return Se.get(e)||null;try{let t=await Ri(e);if(!t&&!Je.has(e)){Je.add(e),Yu();for(let o=0;o<Ku&&!t;o++)await Vu(Gu),t=await Ri(e)}return t?(Se.set(e,t),Qu(),t):null}catch(t){return console.error("Error searching for project by session:",t),null}}});function gt(n){let e=[],t=Array.isArray(n.input)?n.input:[n.input];for(let o of t)if(o.type==="function_call")e.push({role:"assistant",tool_calls:[{id:o.call_id,type:"function",function:{name:o.name,arguments:o.arguments||"{}"}}]});else if(o.type==="function_call_output")e.push({role:"tool",tool_call_id:o.call_id,content:typeof o.output=="string"?o.output:JSON.stringify(o.output)});else if(o.type==="reasoning"){let r=Array.isArray(o.summary)?o.summary.filter(s=>s.type==="summary_text"&&s.text).map(s=>s.text).join(`
|
|
44
44
|
`):"";r&&e.push({role:"assistant",content:[{type:"text",text:`[reasoning]
|
|
45
|
-
${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 Mi(n,e,t,o){let r=n.body;(n.ccrHookOrder||=[]).push("handler"),vo(n),o.endPoint==="/v1/responses"&&r?.input&&!r?.messages&>(r),o.endPoint==="/v1/responses"&&!n.provider&&typeof r?.model=="string"&&Xu.test(r.model)&&await an(n,e,{configService:t.configService,tokenizerService:t.tokenizerService});let s=n.provider;if(!s&&r?.model){let l=r.model.split(",");l.length>1&&(s=l[0],r.model=l.slice(1).join(","))}let a=s?t.providerService.getProvider(s):void 0;if(!a&&r?.model){let l=t.providerService.resolveModelRoute(r.model);l&&(a=l.provider,r.model=l.targetModel)}if(!a&&r?.model){let u=t.configService.get("Router")?.default;if(u&&u.includes(",")){let[p,...d]=u.split(","),
|
|
45
|
+
${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 Mi(n,e,t,o){let r=n.body;(n.ccrHookOrder||=[]).push("handler"),vo(n),o.endPoint==="/v1/responses"&&r?.input&&!r?.messages&>(r),o.endPoint==="/v1/responses"&&!n.provider&&typeof r?.model=="string"&&Xu.test(r.model)&&await an(n,e,{configService:t.configService,tokenizerService:t.tokenizerService});let s=n.provider;if(!s&&r?.model){let l=r.model.split(",");l.length>1&&(s=l[0],r.model=l.slice(1).join(","))}let a=s?t.providerService.getProvider(s):void 0;if(!a&&r?.model){let l=t.providerService.resolveModelRoute(r.model);l&&(a=l.provider,r.model=l.targetModel)}if(!a&&r?.model){let u=t.configService.get("Router")?.default;if(u&&u.includes(",")){let[p,...d]=u.split(","),f=t.providerService.getProvider(p);f&&(a=f,r.model=d.join(","))}}if(n.originalModel||(n.originalModel=r?.model),!a)throw B(`Provider '${s}' not found`,404,"provider_not_found");n.provider=a.name||s;let i=td(n),c=o.endPoint==="/v1/messages"&&i;i&&e.header("X-Codex-Detected","true"),c&&e.header("X-Codex-On-Messages","true"),n.isCodexOnMessagesEndpoint=c,n.codexDetected=i;try{o.endPoint==="/v1/responses"&&r.input&&!r.messages&>(r);let l={req:n,isCodexOnMessagesEndpoint:c,pluginRegistry:t.pluginRegistry},{requestBody:u,config:p,bypass:d}=await Ni(r,a,o,n.headers,l);if(u?.messages&&!d&&!n.isTargetAnthropic){let m=u.messages,_=new Set,b=[],y=[];for(let k of m){if(k?.role!=="system"){y.push(k);continue}let v=JSON.stringify(k.content??"");_.has(v)||(_.add(v),b.push(k))}b.length>0&&y.length>0&&(u.messages=[...b,...y])}let f=await $i(u,p,a,t,d,o,l);try{a?.baseUrl&&f?.headers&&it(s,a.baseUrl,f.headers)}catch{}let h=await Di(u,f,a,o,d,l);h=await Li(r,h,a.name||s);let g=Fi(h,e,r,t);try{let m=r.model||n.originalModel;s&&m&&j().recordSuccess(s,m)}catch{}return g}catch(l){if(l instanceof te)throw l;if(!xo(n,t.pluginRegistry.getManagedRuntimeFor(a),l,a)&&!n.__retryAttempted){n.__retryAttempted=!0;try{return await Mi(n,e,t,o)}catch(d){if(n.__fallbackExhausted)throw d;l=d}}let p=await Zu(n,e,t,o,l);if(p)return p;throw n.__fallbackExhausted=!0,l}}async function Li(n,e,t){if(!e?.body||!(e.headers?.get?.("content-type")??"").includes("text/event-stream")&&!n?.stream)return e;let s=e.body.getReader(),a=new TextDecoder,i=[],c="";for(let d=0;d<8;d++){let f=await s.read();if(f.done||(f.value&&(i.push(f.value),c+=a.decode(f.value,{stream:!0})),c.split(`
|
|
46
46
|
`).some(h=>h.startsWith("data:"))))break}if(c+=a.decode(),i.length===0)throw s.releaseLock(),B(`Provider returned empty streaming response from ${t}`,400,"provider_response_error");if(c.includes("event: error")){s.releaseLock();let d=c.length<500?c:c.slice(0,500);throw B(`Provider ${t} returned error in SSE stream: ${d}`,400,"provider_response_error")}if(c.split(`
|
|
47
|
-
`).filter(d=>d.startsWith("data:")&&d.trim().length>5).length===0){s.releaseLock();let d=c.length<500?c:c.slice(0,500);throw B(`Provider ${t} returned streaming response with no SSE data lines: ${d}`,400,"provider_response_error")}let u=new ReadableStream({start:d=>{for(let h of i)d.enqueue(h);let
|
|
48
|
-
`):""}async function Ii(n,e,t,o,r,s,a){let i=o.pluginRegistry.getManagedRuntimeFor(t);i&&(await i.ensureUsable?.(),await i.lockUpstream?.(e,t));let c=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,a);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 l={Authorization:`Bearer ${t.apiKey}`,...e?.headers||{}};i&&(l=await i.signRequest({headers:l,requestBody:n,provider:t,config:e})),ed(l,a?.req);for(let d in l)(l[d]==="undefined"||["authorization","Authorization"].includes(d)&&l[d]?.includes("undefined"))&&delete l[d];!i?.suppressDebugLog&&Bt(o.configService)&&Os(o.log,a.req.id,{url:String(c),headers:l,body:n});let u,p=()=>Ls(c,n,{...e,headers:JSON.parse(JSON.stringify(l)),httpsProxy:i?void 0:ue(o.configService,t)},a,i?void 0:o.log);try{u=await p()}catch(d){throw i?await Te(i,0,void 0,Je(n),{errorName:d?.name}):d}if(!u.ok&&i?.authRefresh&&u.status===401&&!Oe(a.req,i,t).refreshUsed){Oe(a.req,i,t).refreshUsed=!0;try{await i.authRefresh.forceRefresh(),l=await i.signRequest({headers:l,requestBody:n,provider:t}),u=await p()}catch{}u.status===401&&(a.req.__retryAttempted=!0)}if(!u.ok){let d;try{d=await u.text()}catch(h){throw i?await Te(i,u.status,void 0,Je(n)):h}if(i){let h=await Te(i,u.status,d,Je(n));throw o.log.error(`[provider_response_error] Plugin(${i.name}) status=${u.status} code=${h.code}`),h}o.log.error(`[provider_response_error] Error from provider(${t.name},${n.model}: ${u.status}): ${d}`);let m=B(`Error from provider(${t.name},${n.model}: ${u.status}): ${d}`,u.status,"provider_response_error");throw m.isRateLimit=u.status===429||cn(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 h="";try{if(h=await u.clone().text(),!h||h.trim()==="")throw new SyntaxError("Empty JSON body");if(ct(h))return o.log.info(`[hidden-error-check] body is SSE mislabeled as ${d}, skipping JSON validation`),u;let g=JSON.parse(h);if(i?.isErrorEnvelope?.(g))throw await Te(i,u.status,h,Je(n));if(g&&typeof g=="object"&&g.error&&(typeof g.error=="string"||typeof g.error=="object"&&Object.keys(g.error).length>0)){if(i)throw await Te(i,u.status,h,Je(n));o.log.error(`[provider_response_error] Hidden error from provider(${t.name},${n.model}: ${u.status}): ${h}`);let b=cn(h),y=B(`Error from provider(${t.name},${n.model}: ${u.status}): ${h}`,400,"provider_response_error");throw y.isRateLimit=b,y.rawBody=h,y}}catch(f){if(i)throw f?.pluginClassified===!0?f:await Te(i,u.status,void 0,Je(n));if(f instanceof SyntaxError){o.log.warn(`[provider_response_error] Empty or malformed JSON response from provider(${t.name},${n.model}: 200): "${h}"`);let g=B(`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 g.rawBody=h,g}throw f}}}if(!i?.suppressDebugLog&&!n.stream&&Bt(o.configService)){let m=await u.clone().text();Is(o.log,a.req.id,{status:u.status,headers:Object.fromEntries(Array.from(u.headers)),body:m})}return u}async function Di(n,e,t,o,r,s){let a=e;if(!r&&t.transformer?.use?.length)for(let i of Array.from(t.transformer.use).reverse())!i||typeof i.transformResponseOut!="function"||(a=await i.transformResponseOut(a,s));if(!r&&t.transformer?.[n.model]?.use?.length)for(let i of Array.from(t.transformer[n.model].use).reverse())!i||typeof i.transformResponseOut!="function"||(a=await i.transformResponseOut(a,s));if(!r&&o.transformResponseIn&&(s.provider||(s.provider=t),a=await o.transformResponseIn(a,s)),s?.isCodexOnMessagesEndpoint)try{a=await new Ne().transformResponseIn(a,{...s,provider:t})}catch(i){console.error("Failed to apply Responses API conversion for codex client:",i)}return a}async function Fi(n,e,t,o){n.ok||e.code(n.status);let r=ri(n);if(!r){let s=await de(n);if(s)s.isSSE&&(r=!0),n=new Response(s.body,{status:n.status,statusText:n.statusText,headers:n.headers});else{let a=await me(n);n=a.response,a.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&&Bt(o.configService)){let[s,a]=n.body.tee(),i=As(o.configService);return Ms(s,o.log,e.request.id,i),e.send(a)}return e.send(n.body)}else return F(n)}function cn(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 nd(n){try{return new URL(n),!0}catch{return!1}}var Xu,Ui,ln=R(()=>{"use strict";Ns();Ht();Us();js();zs();rt();wo();re();Le();Qt();qt();Bo();V();Ce();q();Xu=/^ccr-(opus|sonnet|haiku)(\[1m\])?$/i;Ui=async n=>{n.get("/",async()=>({message:"LLMs API",version:Vt})),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)=>Mi(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:a,models:i}=t.body;if(!r?.trim())throw B("Provider name is required",400,"invalid_request");if(!s||!nd(s))throw B("Valid base URL is required",400,"invalid_request");if(!a?.trim())throw B("API key is required",400,"invalid_request");if(!i||!Array.isArray(i)||i.length===0)throw B("At least one model is required",400,"invalid_request");if(n.providerService.getProvider(t.body.name))throw B(`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 B("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 B("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 B("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 B("Provider not found",404,"provider_not_found");return{message:`Provider ${t.body.enabled?"enabled":"disabled"} successfully`}})}});var We,qo=R(()=>{"use strict";We=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(a=>{if(Array.isArray(a)&&typeof a[0]=="string"){let i=this.transformerService.getTransformer(a[0]);if(i)return new i(a[1])}if(typeof a=="string"){let i=this.transformerService.getTransformer(a);return typeof i=="function"?new i:i}}).filter(a=>typeof a<"u")):Array.isArray(t.transformer[s]?.use)&&(o[s]={use:t.transformer[s].use.map(a=>{if(Array.isArray(a)&&typeof a[0]=="string"){let i=this.transformerService.getTransformer(a[0]);if(i)return new i(a[1])}if(typeof a=="string"){let i=this.transformerService.getTransformer(a);return typeof i=="function"?new i:i}}).filter(a=>typeof a<"u")})});let r=t.default_thinking_level;if(r){let s=this.transformerService.getTransformer("defaultthinking");if(s){let a=new s({level:r});o.use=[a,...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 a=`${o.name},${s}`;this.modelRoutes.delete(a),this.modelRoutes.delete(s)}),t.models.forEach(s=>{let a=`${o.name},${s}`,i={provider:o.name,model:s,fullModel:a};this.modelRoutes.set(a,i),this.modelRoutes.has(s)||this.modelRoutes.set(s,i)})),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(a=>a.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 ye,un,ji,od,Hi,Ke=R(()=>{"use strict";ye=n=>n>0?n<=1024?"low":n<=8192?"medium":n<=16384?"high":"max":"none",un=n=>n==="none"?0:n==="low"?1024:n==="medium"?8192:n==="high"?16384:32768,ji=["low","medium","high"],od={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"},Hi=n=>{if(typeof n=="string")return od[n.trim().toLowerCase()]}});var er,zi=R(()=>{er=(n,e)=>(n.includes("base64")&&(n=n.split("base64").pop(),n.startsWith(",")&&(n=n.slice(1))),`data:${e};base64,${n}`)});function rd(n){return n.filter(e=>!!e?.function?.name).map(e=>({name:e.function.name,description:e.function.description,input_schema:e.function.parameters}))}function Bi(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 h=t[m],f=h?.text??JSON.stringify(h),g=d.get(f);if(g===void 0){d.set(f,m);continue}!t[g]?.cache_control&&h?.cache_control&&(t[g]=h),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 h=m.content;try{typeof m.content=="string"&&(h=JSON.parse(m.content))}catch{}h!=null&&typeof h!="object"&&typeof h!="string"&&(h=String(h));let f={type:"tool_result",tool_use_id:m.tool_call_id,content:h};m.cache_control&&(f.cache_control=m.cache_control);let g=s[s.length-1];g&&g.role==="user"&&Array.isArray(g.content)?g.content.push(f):s.push({role:"user",content:[f]})}else if(m.role==="user"){let h=[];typeof m.content=="string"?h.push({type:"text",text:m.content}):Array.isArray(m.content)&&m.content.forEach(g=>{g&&typeof g=="object"&&g.type==="image_url"&&g.image_url?.url?h.push({type:"image",source:{type:"base64",media_type:g.media_type||"image/jpeg",data:g.image_url.url.split(",")[1]||g.image_url.url}}):h.push(g)});let f=s[s.length-1];f&&f.role==="user"&&Array.isArray(f.content)?f.content.push(...h):s.push({role:"user",content:h.length>0?h:[{type:"text",text:" "}]})}else if(m.role==="assistant"){let h=[];m.content&&(typeof m.content=="string"?h.push({type:"text",text:m.content}):Array.isArray(m.content)&&h.push(...m.content)),m.tool_calls&&m.tool_calls.length>0&&m.tool_calls.forEach(g=>{let _={};try{_=JSON.parse(g.function.arguments)}catch{_=g.function.arguments}h.push({type:"tool_use",id:g.id,name:g.function.name,input:_})}),m.thinking&&h.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(...h):s.push({role:"assistant",content:h.length>0?h:[{type:"text",text:" "}]})}}let a=()=>{let d=t.filter(m=>m?.cache_control).length;for(let m of s)Array.isArray(m.content)&&(d+=m.content.filter(h=>h?.cache_control).length);return d},i=d=>d&&typeof d=="object"?{...d}:{type:"ephemeral"},c=()=>{for(let d=s.length-1;d>=0;d--){let m=s[d]?.content;if(!Array.isArray(m))continue;let h=m.find(f=>f?.cache_control);if(h?.cache_control)return h.cache_control}for(let d=t.length-1;d>=0;d--)if(t[d]?.cache_control)return t[d].cache_control;return{type:"ephemeral"}},l=(d,m)=>{if(!Array.isArray(d?.content)||d.content.some(f=>f?.cache_control))return!1;let h=d.content.find(f=>f&&typeof f=="object"&&!f.cache_control);return h?(h.cache_control=i(m),!0):!1};(()=>{let d=4-a();if(d<=0||s.length===0)return;let m=s,h=c(),f=[];for(let g=m.length-1;g>=0;g--)m[g]?.role!=="user"||!Array.isArray(m[g].content)||f.push(g);for(let g of f){if(d<=0)break;l(m[g],h)&&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||un(n.reasoning.effort||"medium"),m=Math.min(d,p.max_tokens-1024);m>=1024&&(p.thinking={type:"enabled",budget_tokens:m});let h=n.reasoning.effort&&n.reasoning.effort!=="none"?n.reasoning.effort:ye(d);ji.includes(h)&&(p.output_config={...p.output_config||{},effort:h})}if(t.length>0){let d=t.some(m=>m?.cache_control);p.system=d?t:t.map(m=>m.text||"").join(`
|
|
47
|
+
`).filter(d=>d.startsWith("data:")&&d.trim().length>5).length===0){s.releaseLock();let d=c.length<500?c:c.slice(0,500);throw B(`Provider ${t} returned streaming response with no SSE data lines: ${d}`,400,"provider_response_error")}let u=new ReadableStream({start:d=>{for(let h of i)d.enqueue(h);let f=()=>{s.read().then(({done:h,value:g})=>{h?d.close():(d.enqueue(g),f())}).catch(h=>d.error(h))};f()},cancel:()=>{s.cancel()}}),p=await Ds(u);if(p.verdict==="empty")throw B(`Provider ${t} returned an empty answer (200 with no content blocks)`,400,"provider_response_error");return new Response(Fs(p.chunks,p.rest),{headers:e.headers,status:e.status,statusText:e.statusText})}async function Zu(n,e,t,o,r){let s=n.scenarioType||"default",a=n.familyFallback,i=n.modelFamily,c=n.strictProjectRouting?n.fallbackConfig:n.fallbackConfig??t.configService.get("fallback"),l=j(),u=n.provider||"",p=n.body.model||"",d=new Set,f=r?.statusCode===429||r?.isRateLimit===!0||r?.rawBody&&cn(r.rawBody)||r?.message&&cn(r.message);if(u&&p&&(f?(l.markRateLimited(u,p,120,r?.message),n.log.warn(`Primary model ${u},${p} rate-limited, will try fallbacks`)):l.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 g=b=>{let[y,...k]=b.split(","),v=y?.trim(),x=k.join(",").trim();return!v||!x?null:{provider:v,model:x,key:`${v},${x}`}},m=[];if(i){let b=a?.[s];if(Array.isArray(b)&&b.length>0)m.push({name:`${i}/${s}`,models:b});else{let y=n.strictProjectRouting;n.log.warn(`No ${i} fallback configured for ${s}; ${y?"no project fallback available":"will try global fallback"}`)}}if(Array.isArray(c?.[s])&&c[s].length>0&&m.push({name:`global/${s}`,models:c[s]}),m.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(x=>x.type==="image"||x.type==="image_url")))&&Array.isArray(c?.image)&&c.image.length>0&&(n.log.info(`No fallback for scenario '${s}', but request has images \u2014 trying fallback.image`),m.push({name:"global/image (auto-detected)",models:c.image})),m.length===0)return null;let _=m.reduce((b,y)=>b+y.models.length,0);n.log.warn(`Request failed for ${s}, trying ${_} fallback models across ${m.length} fallback stage(s)`);for(let b of m){n.log.info(`Trying ${b.name} fallback stage with ${b.models.length} models`);for(let y of b.models){let k=g(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(),x=pt(v,k.provider,k.model);if(!x){n.log.warn(`Fallback model ${y} is not configured or provider is disabled, skipping`);continue}let T=x.provider.name,C=x.model;if(!l.isAvailable(T,C,x.provider.apiKey?.startsWith("ccr-managed-")===!0)){n.log.warn(`Fallback model ${y} unavailable (fail pool), skipping`);continue}let S=t.pluginRegistry.getManagedRuntimeFor(x.provider);if(S&&Ie(n,S,{name:T}).terminalError)continue;let P;for(let I=1;I<=2;I++)try{n.log.info(`Trying fallback model: ${T},${C}${I>1?" (retry)":""}`);let O={...n.body};O.model=C;let E={...n,provider:T,body:O},w=x.provider,A={pluginRegistry:t.pluginRegistry,req:E,isCodexOnMessagesEndpoint:n.isCodexOnMessagesEndpoint||!1},{requestBody:N,config:U,bypass:$}=await Ni(O,w,o,n.headers,A),D=await $i(N,U,w,t,$,o,A);try{w?.baseUrl&&D?.headers&&it(T,w.baseUrl,D.headers)}catch{}let z=await Di(N,D,w,o,$,A);return z=await Li(O,z,T),n.log.info(`Fallback model ${T},${C} succeeded`),l.recordSuccess(T,C),u&&p&&!n.strictProjectRouting&&(Me().promote(u,p,s,T,C),n.log.info(`Promoted fallback model ${T},${C} for ${u},${p}:${s}`),f?n.log.info(`Rate-limited original model ${u},${p} already marked unavailable with cooldown`):(l.forceOpen(u,p,r?.message),n.log.info(`Marked original model ${u},${p} as unavailable`))),n.provider=T,n.body=O,ni(n,`${T},${C}`),Fi(z,e,O,t)}catch(O){if(P=O,xo(n,S,O,{name:T}))break;if(I===1){n.log.warn(`Fallback model ${T},${C} failed, retrying once: ${O.message}`);continue}}l.recordFailure(T,C,P?.message),n.log.warn(`Fallback model ${T},${C} failed after retry: ${P?.message}`),t.recordUsage?.({provider:T,model:C,originalModel:n.originalModel||p||n.body.model,scenarioType:s,modelFamily:n.modelFamily,errorMessage:P?.message||String(P),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 Ni(n,e,t,o,r){if(typeof e.apiKey=="string"&&e.apiKey.startsWith("ccr-managed-")&&!r.pluginRegistry.getManagedRuntimeFor(e))throw B("Provider plugin missing or disabled; install and enable its provider plugin.",503,"plugin_missing");let s=r.pluginRegistry.getManagedRuntimeFor(e);if(s){let u=Ie(r.req,s,e).terminalError;if(u)throw u;await s.ensureUsable?.()}let a=JSON.parse(JSON.stringify(n)),i=a?.system;if(typeof i=="string"&&i.includes("cch="))a.system=i.replace(/cch=[^;]+;?/g,"cch=ccr-stable;");else if(Array.isArray(i))for(let u=0;u<i.length;u++){let p=i[u],d=typeof p=="string"?p:p?.text??"";if(d.includes("cch=")){let f=d.replace(/cch=[^;]+;?/g,"cch=ccr-stable;");typeof p=="string"?i[u]=f:typeof p?.text=="string"&&(p.text=f)}}let c={},l=!1;if(l=qu(e,t,n),l&&(o instanceof Headers?o.delete("content-length"):delete o["content-length"],c.headers=o),!l&&typeof t.transformRequestOut=="function"){let u=await t.transformRequestOut(a);u.body?(a=u.body,c=u.config||{}):a=u}if(!l&&e.transformer?.use?.length)for(let u of e.transformer.use){if(!u||typeof u.transformRequestIn!="function")continue;let p=await u.transformRequestIn(a,e,r);p.body?(a=p.body,c={...c,...p.config}):a=p}if(!l&&e.transformer?.[n.model]?.use?.length)for(let u of e.transformer[n.model].use)!u||typeof u.transformRequestIn!="function"||(a=await u.transformRequestIn(a,e,r));return{requestBody:a,config:c,bypass:l}}function qu(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 ed(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 td(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 $i(n,e,t,o,r,s,a){let i=o.pluginRegistry.getManagedRuntimeFor(t);return i?.dispatchRequest?i.dispatchRequest({attempt:()=>Ii(n,e,t,o,r,s,a),requestBody:n,config:e,provider:t,req:a?.req}):Ii(n,e,t,o,r,s,a)}function We(n){let e=n?.request?.systemInstruction?.parts??n?.systemInstruction?.parts;return Array.isArray(e)?e.map(t=>typeof t?.text=="string"?t.text:"").join(`
|
|
48
|
+
`):""}async function Ii(n,e,t,o,r,s,a){let i=o.pluginRegistry.getManagedRuntimeFor(t);i&&(await i.ensureUsable?.(),await i.lockUpstream?.(e,t));let c=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,a);if(d.body){n=d.body;let f=e.headers||{};d.config?.headers&&(f={...f,...d.config.headers},delete f.host,delete d.config.headers),e={...e,...d.config,headers:f}}else n=d}let l={Authorization:`Bearer ${t.apiKey}`,...e?.headers||{}};i&&(l=await i.signRequest({headers:l,requestBody:n,provider:t,config:e})),ed(l,a?.req);for(let d in l)(l[d]==="undefined"||["authorization","Authorization"].includes(d)&&l[d]?.includes("undefined"))&&delete l[d];!i?.suppressDebugLog&&Bt(o.configService)&&Os(o.log,a.req.id,{url:String(c),headers:l,body:n});let u,p=()=>Ls(c,n,{...e,headers:JSON.parse(JSON.stringify(l)),httpsProxy:i?void 0:ue(o.configService,t)},a,i?void 0:o.log);try{u=await p()}catch(d){throw i?await Te(i,0,void 0,We(n),{errorName:d?.name}):d}if(!u.ok&&i?.authRefresh&&u.status===401&&!Ie(a.req,i,t).refreshUsed){Ie(a.req,i,t).refreshUsed=!0;try{await i.authRefresh.forceRefresh(),l=await i.signRequest({headers:l,requestBody:n,provider:t}),u=await p()}catch{}u.status===401&&(a.req.__retryAttempted=!0)}if(!u.ok){let d;try{d=await u.text()}catch(h){throw i?await Te(i,u.status,void 0,We(n)):h}if(i){let h=await Te(i,u.status,d,We(n));throw o.log.error(`[provider_response_error] Plugin(${i.name}) status=${u.status} code=${h.code}`),h}o.log.error(`[provider_response_error] Error from provider(${t.name},${n.model}: ${u.status}): ${d}`);let f=B(`Error from provider(${t.name},${n.model}: ${u.status}): ${d}`,u.status,"provider_response_error");throw f.isRateLimit=u.status===429||cn(d),f.rawBody=d,f}if(u.ok){let d=u.headers.get("content-type")||"",f=n.stream===!0;if(o.log.info(`[hidden-error-check] provider=${t.name} model=${n.model} stream=${n.stream} isStreamRequest=${f} contentType=${d} ok=${u.ok} status=${u.status} hasBody=${!!u.body}`),!f||d.includes("application/json")){let h="";try{if(h=await u.clone().text(),!h||h.trim()==="")throw new SyntaxError("Empty JSON body");if(ct(h))return o.log.info(`[hidden-error-check] body is SSE mislabeled as ${d}, skipping JSON validation`),u;let m=JSON.parse(h);if(i?.isErrorEnvelope?.(m))throw await Te(i,u.status,h,We(n));if(m&&typeof m=="object"&&m.error&&(typeof m.error=="string"||typeof m.error=="object"&&Object.keys(m.error).length>0)){if(i)throw await Te(i,u.status,h,We(n));o.log.error(`[provider_response_error] Hidden error from provider(${t.name},${n.model}: ${u.status}): ${h}`);let b=cn(h),y=B(`Error from provider(${t.name},${n.model}: ${u.status}): ${h}`,400,"provider_response_error");throw y.isRateLimit=b,y.rawBody=h,y}}catch(g){if(i)throw g?.pluginClassified===!0?g:await Te(i,u.status,void 0,We(n));if(g instanceof SyntaxError){o.log.warn(`[provider_response_error] Empty or malformed JSON response from provider(${t.name},${n.model}: 200): "${h}"`);let m=B(`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 m.rawBody=h,m}throw g}}}if(!i?.suppressDebugLog&&!n.stream&&Bt(o.configService)){let f=await u.clone().text();Is(o.log,a.req.id,{status:u.status,headers:Object.fromEntries(Array.from(u.headers)),body:f})}return u}async function Di(n,e,t,o,r,s){let a=e;if(!r&&t.transformer?.use?.length)for(let i of Array.from(t.transformer.use).reverse())!i||typeof i.transformResponseOut!="function"||(a=await i.transformResponseOut(a,s));if(!r&&t.transformer?.[n.model]?.use?.length)for(let i of Array.from(t.transformer[n.model].use).reverse())!i||typeof i.transformResponseOut!="function"||(a=await i.transformResponseOut(a,s));if(!r&&o.transformResponseIn&&(s.provider||(s.provider=t),a=await o.transformResponseIn(a,s)),s?.isCodexOnMessagesEndpoint)try{a=await new $e().transformResponseIn(a,{...s,provider:t})}catch(i){console.error("Failed to apply Responses API conversion for codex client:",i)}return a}async function Fi(n,e,t,o){n.ok||e.code(n.status);let r=ri(n);if(!r){let s=await de(n);if(s)s.isSSE&&(r=!0),n=new Response(s.body,{status:n.status,statusText:n.statusText,headers:n.headers});else{let a=await me(n);n=a.response,a.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&&Bt(o.configService)){let[s,a]=n.body.tee(),i=As(o.configService);return Ms(s,o.log,e.request.id,i),e.send(a)}return e.send(n.body)}else return F(n)}function cn(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 nd(n){try{return new URL(n),!0}catch{return!1}}var Xu,Ui,ln=R(()=>{"use strict";Ns();Ht();Us();js();zs();rt();wo();re();Ne();Qt();qt();Bo();V();Ce();q();Xu=/^ccr-(opus|sonnet|haiku)(\[1m\])?$/i;Ui=async n=>{n.get("/",async()=>({message:"LLMs API",version:Vt})),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)=>Mi(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:a,models:i}=t.body;if(!r?.trim())throw B("Provider name is required",400,"invalid_request");if(!s||!nd(s))throw B("Valid base URL is required",400,"invalid_request");if(!a?.trim())throw B("API key is required",400,"invalid_request");if(!i||!Array.isArray(i)||i.length===0)throw B("At least one model is required",400,"invalid_request");if(n.providerService.getProvider(t.body.name))throw B(`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 B("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 B("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 B("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 B("Provider not found",404,"provider_not_found");return{message:`Provider ${t.body.enabled?"enabled":"disabled"} successfully`}})}});var Ke,qo=R(()=>{"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(a=>{if(Array.isArray(a)&&typeof a[0]=="string"){let i=this.transformerService.getTransformer(a[0]);if(i)return new i(a[1])}if(typeof a=="string"){let i=this.transformerService.getTransformer(a);return typeof i=="function"?new i:i}}).filter(a=>typeof a<"u")):Array.isArray(t.transformer[s]?.use)&&(o[s]={use:t.transformer[s].use.map(a=>{if(Array.isArray(a)&&typeof a[0]=="string"){let i=this.transformerService.getTransformer(a[0]);if(i)return new i(a[1])}if(typeof a=="string"){let i=this.transformerService.getTransformer(a);return typeof i=="function"?new i:i}}).filter(a=>typeof a<"u")})});let r=t.default_thinking_level;if(r){let s=this.transformerService.getTransformer("defaultthinking");if(s){let a=new s({level:r});o.use=[a,...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 a=`${o.name},${s}`;this.modelRoutes.delete(a),this.modelRoutes.delete(s)}),t.models.forEach(s=>{let a=`${o.name},${s}`,i={provider:o.name,model:s,fullModel:a};this.modelRoutes.set(a,i),this.modelRoutes.has(s)||this.modelRoutes.set(s,i)})),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(a=>a.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 ye,un,ji,od,Hi,Ge=R(()=>{"use strict";ye=n=>n>0?n<=1024?"low":n<=8192?"medium":n<=16384?"high":"max":"none",un=n=>n==="none"?0:n==="low"?1024:n==="medium"?8192:n==="high"?16384:32768,ji=["low","medium","high"],od={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"},Hi=n=>{if(typeof n=="string")return od[n.trim().toLowerCase()]}});var er,zi=R(()=>{er=(n,e)=>(n.includes("base64")&&(n=n.split("base64").pop(),n.startsWith(",")&&(n=n.slice(1))),`data:${e};base64,${n}`)});function rd(n){return n.filter(e=>!!e?.function?.name).map(e=>({name:e.function.name,description:e.function.description,input_schema:e.function.parameters}))}function Bi(n){let e=[],t=[],o=d=>{if(typeof d=="string"){t.push({type:"text",text:d});return}Array.isArray(d)&&d.forEach(f=>{if(typeof f=="string"){t.push({type:"text",text:f});return}f&&typeof f=="object"&&f.type==="text"&&f.text&&t.push({...f})})},r=()=>{let d=new Map;for(let f=0;f<t.length;f++){let h=t[f],g=h?.text??JSON.stringify(h),m=d.get(g);if(m===void 0){d.set(g,f);continue}!t[m]?.cache_control&&h?.cache_control&&(t[m]=h),t.splice(f,1),f--}};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 f=e[d];if(f.role==="tool"){let h=f.content;try{typeof f.content=="string"&&(h=JSON.parse(f.content))}catch{}h!=null&&typeof h!="object"&&typeof h!="string"&&(h=String(h));let g={type:"tool_result",tool_use_id:f.tool_call_id,content:h};f.cache_control&&(g.cache_control=f.cache_control);let m=s[s.length-1];m&&m.role==="user"&&Array.isArray(m.content)?m.content.push(g):s.push({role:"user",content:[g]})}else if(f.role==="user"){let h=[];typeof f.content=="string"?h.push({type:"text",text:f.content}):Array.isArray(f.content)&&f.content.forEach(m=>{m&&typeof m=="object"&&m.type==="image_url"&&m.image_url?.url?h.push({type:"image",source:{type:"base64",media_type:m.media_type||"image/jpeg",data:m.image_url.url.split(",")[1]||m.image_url.url}}):h.push(m)});let g=s[s.length-1];g&&g.role==="user"&&Array.isArray(g.content)?g.content.push(...h):s.push({role:"user",content:h.length>0?h:[{type:"text",text:" "}]})}else if(f.role==="assistant"){let h=[];f.content&&(typeof f.content=="string"?h.push({type:"text",text:f.content}):Array.isArray(f.content)&&h.push(...f.content)),f.tool_calls&&f.tool_calls.length>0&&f.tool_calls.forEach(m=>{let _={};try{_=JSON.parse(m.function.arguments)}catch{_=m.function.arguments}h.push({type:"tool_use",id:m.id,name:m.function.name,input:_})}),f.thinking&&h.unshift({type:"thinking",thinking:f.thinking.content,signature:f.thinking.signature});let g=s[s.length-1];g&&g.role==="assistant"&&Array.isArray(g.content)?g.content.push(...h):s.push({role:"assistant",content:h.length>0?h:[{type:"text",text:" "}]})}}let a=()=>{let d=t.filter(f=>f?.cache_control).length;for(let f of s)Array.isArray(f.content)&&(d+=f.content.filter(h=>h?.cache_control).length);return d},i=d=>d&&typeof d=="object"?{...d}:{type:"ephemeral"},c=()=>{for(let d=s.length-1;d>=0;d--){let f=s[d]?.content;if(!Array.isArray(f))continue;let h=f.find(g=>g?.cache_control);if(h?.cache_control)return h.cache_control}for(let d=t.length-1;d>=0;d--)if(t[d]?.cache_control)return t[d].cache_control;return{type:"ephemeral"}},l=(d,f)=>{if(!Array.isArray(d?.content)||d.content.some(g=>g?.cache_control))return!1;let h=d.content.find(g=>g&&typeof g=="object"&&!g.cache_control);return h?(h.cache_control=i(f),!0):!1};(()=>{let d=4-a();if(d<=0||s.length===0)return;let f=s,h=c(),g=[];for(let m=f.length-1;m>=0;m--)f[m]?.role!=="user"||!Array.isArray(f[m].content)||g.push(m);for(let m of g){if(d<=0)break;l(f[m],h)&&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||un(n.reasoning.effort||"medium"),f=Math.min(d,p.max_tokens-1024);f>=1024&&(p.thinking={type:"enabled",budget_tokens:f});let h=n.reasoning.effort&&n.reasoning.effort!=="none"?n.reasoning.effort:ye(d);ji.includes(h)&&(p.output_config={...p.output_config||{},effort:h})}if(t.length>0){let d=t.some(f=>f?.cache_control);p.system=d?t:t.map(f=>f.text||"").join(`
|
|
49
49
|
|
|
50
|
-
`)}return n.tools&&n.tools.length>0&&(p.tools=rd(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 Ji=R(()=>{
|
|
51
|
-
`);u?(
|
|
52
|
-
`),this.logger?.debug?.({type:"tool_image_omitted",model:String(e.model??""),count:h.length}))}let
|
|
53
|
-
`));let u=i.content.filter(d=>d.type==="tool_use"&&d.id);u.length&&(c.tool_calls=u.map(d=>({id:d.id,type:"function",function:{name:d.name,arguments:JSON.stringify(d.input||{})}})));let p=i.content.find(d=>d.type==="thinking");p&&(c.thinking={content:p.thinking,signature:p.signature}),t.push(c)}return}}});let r={messages:t,model:e.model,max_tokens:e.max_tokens,temperature:e.temperature,stream:e.stream,tools:e.tools?.length?this.convertAnthropicToolsToUnified(e.tools):void 0,tool_choice:e.tool_choice},s=Hi(e.output_config?.effort),a=typeof e.thinking?.budget_tokens=="number"?e.thinking.budget_tokens:void 0;if(e.thinking!==void 0||s!==void 0){let i={},l=sd(e.thinking?.type)??(s!==void 0||(a??0)>0);l!==void 0&&(i.enabled=l),s!==void 0?i.effort=s:a!==void 0&&(i.effort=ye(a)),a!==void 0&&a>0&&(i.max_tokens=a),Object.keys(i).length>0&&(r.reasoning=i)}return e.tool_choice&&(e.tool_choice.type==="tool"?r.tool_choice={type:"function",function:{name:e.tool_choice.name}}:r.tool_choice=e.tool_choice.type),r}async transformRequestIn(e,t,o){if(!this.isAnthropicMessagesEndpoint(t.baseUrl))return e;o&&o.req&&(o.req.isTargetAnthropic=!0);let r=Bi(e),s={};return this.useBearer?(s.authorization=`Bearer ${t.apiKey}`,s["x-api-key"]=void 0):(s["x-api-key"]=t.apiKey,s.authorization=void 0),s["anthropic-version"]="2023-06-01",s["content-type"]="application/json",{body:r,config:{headers:s}}}isAnthropicMessagesEndpoint(e){try{return new URL(e.trim()).pathname.replace(/\/+$/,"").endsWith("/messages")}catch{return!1}}async transformResponseIn(e,t){if(t?.req?.isTargetAnthropic)return e;if(e.headers.get("Content-Type")?.includes("text/event-stream")){if(!e.body)throw new Error("Stream response body is null");let r=await this.convertOpenAIStreamToAnthropic(e.body,t);return new Response(r,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}else{let r=await de(e);if((r?.isSSE??!1)&&r?.body){let l=await this.convertOpenAIStreamToAnthropic(r.body,t);return new Response(l,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}let a;if(r?.body)a=new Response(r.body,{status:e.status,statusText:e.statusText,headers:e.headers});else{let l=await me(e);if(l.isSSE){let u=await this.convertOpenAIStreamToAnthropic(l.response.body,t);return new Response(u,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}a=l.response}let i=await F(a),c=this.convertOpenAIResponseToAnthropic(i,t);return new Response(JSON.stringify(c),{headers:{"Content-Type":"application/json"}})}}convertAnthropicToolsToUnified(e){return e.map(t=>({type:"function",function:{name:t.name,description:t.description||"",parameters:t.input_schema}}))}async convertOpenAIStreamToAnthropic(e,t){return new ReadableStream({start:async r=>{let s=new TextEncoder,a=`msg_${Date.now()}`,i=null,c=String(t?.req?.body?.model??"unknown"),l=!1,u=!1,p=!1,d=new Map,
|
|
50
|
+
`)}return n.tools&&n.tools.length>0&&(p.tools=rd(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 Ji=R(()=>{Ge()});import{v4 as tr}from"uuid";function sd(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 dn,Wi=R(()=>{"use strict";Ge();Ht();V();zi();Ji();Ce();dn=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 i=e.system.filter(c=>c.type==="text"&&c.text).map(c=>({type:"text",text:c.text,cache_control:c.cache_control}));t.push({role:"system",content:i})}}let o=JSON.parse(JSON.stringify(e.messages||[]));o?.forEach(i=>{i.role==="system"&&t.push({role:"system",content:i.content})}),o?.forEach(i=>{if(i.role!=="system"&&(i.role==="user"||i.role==="assistant")){if(typeof i.content=="string"){t.push({role:i.role,content:i.content});return}if(Array.isArray(i.content)){if(i.role==="user"){let c=i.content.filter(u=>u.type==="tool_result"&&u.tool_use_id);if(c.length){let u=mt(String(e.model??"")),p=[];c.forEach(d=>{let f=Array.isArray(d.content)?d.content:null,h=f?f.filter(_=>_?.type==="image"&&_?.source):[],g=typeof d.content=="string"?d.content:JSON.stringify(d.content);if(h.length>0){let _=f.filter(b=>!(b?.type==="image"&&b?.source)).map(b=>b?.type==="text"?String(b.text??""):JSON.stringify(b)).filter(b=>b.length>0).join(`
|
|
51
|
+
`);u?(g=_||"[tool image]",p.push(...h)):(g=[_,...h.map(()=>"(tool image omitted: target model does not support image input)")].filter(b=>b.length>0).join(`
|
|
52
|
+
`),this.logger?.debug?.({type:"tool_image_omitted",model:String(e.model??""),count:h.length}))}let m={role:"tool",content:g,tool_call_id:d.tool_use_id,cache_control:d.cache_control};t.push(m)}),p.length>0&&t.push({role:"user",content:p.map(d=>({type:"image_url",image_url:{url:d.source?.type==="base64"?er(d.source.data,d.source.media_type):d.source.url},media_type:d.source.media_type}))})}let l=i.content.filter(u=>u.type==="text"&&u.text||u.type==="image"&&u.source);l.length&&t.push({role:"user",content:l.map(u=>u?.type==="image"?{type:"image_url",image_url:{url:u.source?.type==="base64"?er(u.source.data,u.source.media_type):u.source.url},media_type:u.source.media_type}:u)})}else if(i.role==="assistant"){let c={role:"assistant",content:""},l=i.content.filter(d=>d.type==="text"&&d.text);l.length&&(c.content=l.map(d=>d.text).join(`
|
|
53
|
+
`));let u=i.content.filter(d=>d.type==="tool_use"&&d.id);u.length&&(c.tool_calls=u.map(d=>({id:d.id,type:"function",function:{name:d.name,arguments:JSON.stringify(d.input||{})}})));let p=i.content.find(d=>d.type==="thinking");p&&(c.thinking={content:p.thinking,signature:p.signature}),t.push(c)}return}}});let r={messages:t,model:e.model,max_tokens:e.max_tokens,temperature:e.temperature,stream:e.stream,tools:e.tools?.length?this.convertAnthropicToolsToUnified(e.tools):void 0,tool_choice:e.tool_choice},s=Hi(e.output_config?.effort),a=typeof e.thinking?.budget_tokens=="number"?e.thinking.budget_tokens:void 0;if(e.thinking!==void 0||s!==void 0){let i={},l=sd(e.thinking?.type)??(s!==void 0||(a??0)>0);l!==void 0&&(i.enabled=l),s!==void 0?i.effort=s:a!==void 0&&(i.effort=ye(a)),a!==void 0&&a>0&&(i.max_tokens=a),Object.keys(i).length>0&&(r.reasoning=i)}return e.tool_choice&&(e.tool_choice.type==="tool"?r.tool_choice={type:"function",function:{name:e.tool_choice.name}}:r.tool_choice=e.tool_choice.type),r}async transformRequestIn(e,t,o){if(!this.isAnthropicMessagesEndpoint(t.baseUrl))return e;o&&o.req&&(o.req.isTargetAnthropic=!0);let r=Bi(e),s={};return this.useBearer?(s.authorization=`Bearer ${t.apiKey}`,s["x-api-key"]=void 0):(s["x-api-key"]=t.apiKey,s.authorization=void 0),s["anthropic-version"]="2023-06-01",s["content-type"]="application/json",{body:r,config:{headers:s}}}isAnthropicMessagesEndpoint(e){try{return new URL(e.trim()).pathname.replace(/\/+$/,"").endsWith("/messages")}catch{return!1}}async transformResponseIn(e,t){if(t?.req?.isTargetAnthropic)return e;if(e.headers.get("Content-Type")?.includes("text/event-stream")){if(!e.body)throw new Error("Stream response body is null");let r=await this.convertOpenAIStreamToAnthropic(e.body,t);return new Response(r,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}else{let r=await de(e);if((r?.isSSE??!1)&&r?.body){let l=await this.convertOpenAIStreamToAnthropic(r.body,t);return new Response(l,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}let a;if(r?.body)a=new Response(r.body,{status:e.status,statusText:e.statusText,headers:e.headers});else{let l=await me(e);if(l.isSSE){let u=await this.convertOpenAIStreamToAnthropic(l.response.body,t);return new Response(u,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}a=l.response}let i=await F(a),c=this.convertOpenAIResponseToAnthropic(i,t);return new Response(JSON.stringify(c),{headers:{"Content-Type":"application/json"}})}}convertAnthropicToolsToUnified(e){return e.map(t=>({type:"function",function:{name:t.name,description:t.description||"",parameters:t.input_schema}}))}async convertOpenAIStreamToAnthropic(e,t){return new ReadableStream({start:async r=>{let s=new TextEncoder,a=`msg_${Date.now()}`,i=null,c=String(t?.req?.body?.model??"unknown"),l=!1,u=!1,p=!1,d=new Map,f=new Map,h=0,g=0,m=0,_=!1,b=!1,y=0,k=-1,v=()=>{let S=y;return y++,S},x=S=>{if(!_)try{r.enqueue(S);let P=new TextDecoder().decode(S);this.logger.debug({reqId:t.req.id,data:P,type:"send data"})}catch(P){if(P instanceof TypeError&&P.message.includes("Controller is already closed"))_=!0;else throw this.logger.debug({reqId:t.req.id,error:P instanceof Error?P.message:String(P),type:"send data error"}),P}},T=()=>{if(!_)try{if(!l){this.logger?.warn("[empty_stream] Upstream produced no data, closing silently"),r.close(),_=!0;return}if(k>=0){let P={type:"content_block_stop",index:k};x(s.encode(`event: content_block_stop
|
|
54
54
|
data: ${JSON.stringify(P)}
|
|
55
55
|
|
|
56
56
|
`)),k=-1}if(i)x(s.encode(`event: message_delta
|
|
@@ -69,7 +69,7 @@ data: ${JSON.stringify($)}
|
|
|
69
69
|
`));continue}if(c=N.model||c,!l&&!_&&!p){l=!0;let $=t?.req?.tokenCount||0,D={type:"message_start",message:{id:a,type:"message",role:"assistant",content:[],model:c,stop_reason:null,stop_sequence:null,usage:{input_tokens:$,output_tokens:0}}};x(s.encode(`event: message_start
|
|
70
70
|
data: ${JSON.stringify(D)}
|
|
71
71
|
|
|
72
|
-
`))}let U=N.choices?.[0];if(N.usage){let $=N.usage?.prompt_tokens_details?.cached_tokens??N.usage?.prompt_cache_hit_tokens??0,z=(N.usage?.prompt_tokens||0)-$,fe=N.usage?.completion_tokens||0;this.logger?.info({debug_log:!0,reqId:t.req.id,phase:"anthropic_transformer_usage",providerUsage:N.usage,mappedUsage:{input_tokens:z,output_tokens:fe,cache_read_input_tokens:$},choicesLength:Array.isArray(N.choices)?N.choices.length:void 0,finishReason:U?.finish_reason});let H={input_tokens:z,output_tokens:fe,cache_read_input_tokens:$};if(!i)i={type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{...H}};else{let Z=i.usage||{};i.usage={input_tokens:H.input_tokens||Z.input_tokens||0,output_tokens:H.output_tokens||Z.output_tokens||0,cache_read_input_tokens:H.cache_read_input_tokens||Z.cache_read_input_tokens||0}}}if(!U)continue;if(U?.delta?.thinking&&!_&&!p&&!u){if(!b){let $=
|
|
72
|
+
`))}let U=N.choices?.[0];if(N.usage){let $=N.usage?.prompt_tokens_details?.cached_tokens??N.usage?.prompt_cache_hit_tokens??0,z=(N.usage?.prompt_tokens||0)-$,fe=N.usage?.completion_tokens||0;this.logger?.info({debug_log:!0,reqId:t.req.id,phase:"anthropic_transformer_usage",providerUsage:N.usage,mappedUsage:{input_tokens:z,output_tokens:fe,cache_read_input_tokens:$},choicesLength:Array.isArray(N.choices)?N.choices.length:void 0,finishReason:U?.finish_reason});let H={input_tokens:z,output_tokens:fe,cache_read_input_tokens:$};if(!i)i={type:"message_delta",delta:{stop_reason:"end_turn",stop_sequence:null},usage:{...H}};else{let Z=i.usage||{};i.usage={input_tokens:H.input_tokens||Z.input_tokens||0,output_tokens:H.output_tokens||Z.output_tokens||0,cache_read_input_tokens:H.cache_read_input_tokens||Z.cache_read_input_tokens||0}}}if(!U)continue;if(U?.delta?.thinking&&!_&&!p&&!u){if(!b){let $=v(),D={type:"content_block_start",index:$,content_block:{type:"thinking",thinking:""}};x(s.encode(`event: content_block_start
|
|
73
73
|
data: ${JSON.stringify(D)}
|
|
74
74
|
|
|
75
75
|
`)),k=$,b=!0}if(U.delta.thinking.signature){let $={type:"content_block_delta",index:k,delta:{type:"signature_delta",signature:U.delta.thinking.signature}};x(s.encode(`event: content_block_delta
|
|
@@ -81,10 +81,10 @@ data: ${JSON.stringify(D)}
|
|
|
81
81
|
`)),k=-1}else if(U.delta.thinking.content){let $={type:"content_block_delta",index:k,delta:{type:"thinking_delta",thinking:U.delta.thinking.content||""}};x(s.encode(`event: content_block_delta
|
|
82
82
|
data: ${JSON.stringify($)}
|
|
83
83
|
|
|
84
|
-
`))}}if(U?.delta?.content&&!_&&!p){if(
|
|
84
|
+
`))}}if(U?.delta?.content&&!_&&!p){if(g++,k>=0&&!u){let D={type:"content_block_stop",index:k};x(s.encode(`event: content_block_stop
|
|
85
85
|
data: ${JSON.stringify(D)}
|
|
86
86
|
|
|
87
|
-
`)),k=-1}if(!u&&!p){u=!0;let $=
|
|
87
|
+
`)),k=-1}if(!u&&!p){u=!0;let $=v(),D={type:"content_block_start",index:$,content_block:{type:"text",text:""}};x(s.encode(`event: content_block_start
|
|
88
88
|
data: ${JSON.stringify(D)}
|
|
89
89
|
|
|
90
90
|
`)),k=$}if(!_&&!p){let $={type:"content_block_delta",index:k,delta:{type:"text_delta",text:U.delta.content}};x(s.encode(`event: content_block_delta
|
|
@@ -93,131 +93,131 @@ data: ${JSON.stringify($)}
|
|
|
93
93
|
`))}}if(U?.delta?.annotations?.length&&!_&&!p){if(k>=0&&u){let $={type:"content_block_stop",index:k};x(s.encode(`event: content_block_stop
|
|
94
94
|
data: ${JSON.stringify($)}
|
|
95
95
|
|
|
96
|
-
`)),k=-1,u=!1}U?.delta?.annotations.forEach($=>{let D=
|
|
96
|
+
`)),k=-1,u=!1}U?.delta?.annotations.forEach($=>{let D=v(),z={type:"content_block_start",index:D,content_block:{type:"web_search_tool_result",tool_use_id:`srvtoolu_${tr()}`,content:[{type:"web_search_result",title:$.url_citation.title,url:$.url_citation.url}]}};x(s.encode(`event: content_block_start
|
|
97
97
|
data: ${JSON.stringify(z)}
|
|
98
98
|
|
|
99
99
|
`));let fe={type:"content_block_stop",index:D};x(s.encode(`event: content_block_stop
|
|
100
100
|
data: ${JSON.stringify(fe)}
|
|
101
101
|
|
|
102
|
-
`)),k=-1})}if(U?.delta?.tool_calls&&!_&&!p){
|
|
102
|
+
`)),k=-1})}if(U?.delta?.tool_calls&&!_&&!p){m++;let $=new Set;for(let D of U.delta.tool_calls){if(_)break;let z=D.index??0;if($.has(z))continue;if($.add(z),!f.has(z)){if(k>=0){let Zc={type:"content_block_stop",index:k};x(s.encode(`event: content_block_stop
|
|
103
103
|
data: ${JSON.stringify(Zc)}
|
|
104
104
|
|
|
105
|
-
`)),k=-1}let H=
|
|
105
|
+
`)),k=-1}let H=v();f.set(z,H);let Z=D.id||`call_ccr_${z}`,J=D.function?.name||`tool_${z}`,M={type:"content_block_start",index:H,content_block:{type:"tool_use",id:Z,name:J,input:{}}};x(s.encode(`event: content_block_start
|
|
106
106
|
data: ${JSON.stringify(M)}
|
|
107
107
|
|
|
108
|
-
`)),k=H;let W={id:Z,name:J,arguments:"",contentBlockIndex:H};d.set(z,W)}else if(D.id&&D.function?.name){let H=d.get(z);H.id.startsWith("call_")&&H.name.startsWith("tool_")&&(H.id=D.id,H.name=D.function.name)}if(D.function?.arguments&&!_&&!p){let H=
|
|
108
|
+
`)),k=H;let W={id:Z,name:J,arguments:"",contentBlockIndex:H};d.set(z,W)}else if(D.id&&D.function?.name){let H=d.get(z);H.id.startsWith("call_")&&H.name.startsWith("tool_")&&(H.id=D.id,H.name=D.function.name)}if(D.function?.arguments&&!_&&!p){let H=f.get(z);if(H===void 0)continue;let Z=d.get(z);Z&&(Z.arguments+=D.function.arguments);try{let J={type:"content_block_delta",index:H,delta:{type:"input_json_delta",partial_json:D.function.arguments}};x(s.encode(`event: content_block_delta
|
|
109
109
|
data: ${JSON.stringify(J)}
|
|
110
110
|
|
|
111
111
|
`))}catch{try{let J=D.function.arguments.replace(/[\x00-\x1F\x7F-\x9F]/g,"").replace(/\\/g,"\\\\").replace(/"/g,'\\"'),M={type:"content_block_delta",index:H,delta:{type:"input_json_delta",partial_json:J}};x(s.encode(`event: content_block_delta
|
|
112
112
|
data: ${JSON.stringify(M)}
|
|
113
113
|
|
|
114
|
-
`))}catch(J){console.error(J)}}}}}if(U?.finish_reason&&!_&&!p){if(
|
|
114
|
+
`))}catch(J){console.error(J)}}}}}if(U?.finish_reason&&!_&&!p){if(g===0&&m===0&&console.error("Warning: No content in the stream response!"),k>=0){let $={type:"content_block_stop",index:k};x(s.encode(`event: content_block_stop
|
|
115
115
|
data: ${JSON.stringify($)}
|
|
116
116
|
|
|
117
|
-
`)),k=-1}if(!_){let D={stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"stop_sequence"}[U.finish_reason]||"end_turn";i?i.delta={...i.delta,stop_reason:D,stop_sequence:null}:i={type:"message_delta",delta:{stop_reason:D,stop_sequence:null},usage:{input_tokens:0,output_tokens:0,cache_read_input_tokens:0}}}p=!0}}catch(N){this.logger?.error(`parseError: ${N.name} message: ${N.message} stack: ${N.stack} data: ${A}`)}}}
|
|
118
|
-
`)||"",u={id:o.responseId,choices:[{finish_reason:o.candidates[0].finishReason?.toLowerCase()||null,index:0,message:{content:l,role:"assistant",tool_calls:c.length>0?c:void 0,...s&&{thinking:{content:r||"(no content)",signature:s}}}}],created:parseInt(new Date().getTime()/1e3+"",10),model:o.modelVersion,object:"chat.completion",usage:{completion_tokens:o.usageMetadata?.candidatesTokenCount||0,prompt_tokens:o.usageMetadata?.promptTokenCount||0,prompt_tokens_details:{cached_tokens:o.usageMetadata?.cachedContentTokenCount||0},total_tokens:o.usageMetadata?.totalTokenCount||0,output_tokens_details:{reasoning_tokens:o.usageMetadata?.thoughtsTokenCount||0}}};return new Response(JSON.stringify(u),{status:n.status,statusText:n.statusText,headers:n.headers})}else if(n.headers.get("Content-Type")?.includes("stream")){if(!n.body)return n;let o=new TextDecoder,r=new TextEncoder,s=!1,a=!1,i=!1,c="",l=0,u=-1,p=new ReadableStream({async start(d){let
|
|
117
|
+
`)),k=-1}if(!_){let D={stop:"end_turn",length:"max_tokens",tool_calls:"tool_use",content_filter:"stop_sequence"}[U.finish_reason]||"end_turn";i?i.delta={...i.delta,stop_reason:D,stop_sequence:null}:i={type:"message_delta",delta:{stop_reason:D,stop_sequence:null},usage:{input_tokens:0,output_tokens:0,cache_read_input_tokens:0}}}p=!0}}catch(N){this.logger?.error(`parseError: ${N.name} message: ${N.message} stack: ${N.stack} data: ${A}`)}}}T()}catch(S){if(!_)try{r.error(S)}catch(P){console.error(P)}}finally{if(C)try{C.releaseLock()}catch(S){console.error(S)}}},cancel:r=>{this.logger.debug({reqId:t.req.id},`cancle stream: ${r}`)}})}convertOpenAIResponseToAnthropic(e,t){this.logger.debug({reqId:t.req.id,response:e},"Original OpenAI response");try{let o=e.choices[0];if(!o)throw new Error("No choices found in OpenAI response");let r=[];if(o.message.annotations){let c=`srvtoolu_${tr()}`;r.push({type:"server_tool_use",id:c,name:"web_search",input:{query:""}}),r.push({type:"web_search_tool_result",tool_use_id:c,content:o.message.annotations.map(l=>({type:"web_search_result",url:l.url_citation.url,title:l.url_citation.title}))})}o.message.content&&r.push({type:"text",text:o.message.content}),o.message.tool_calls&&o.message.tool_calls.length>0&&o.message.tool_calls.forEach(c=>{let l={};try{let u=c.function.arguments||"{}";typeof u=="object"?l=u:typeof u=="string"&&(l=JSON.parse(u))}catch{l={text:c.function.arguments||""}}r.push({type:"tool_use",id:c.id,name:c.function.name,input:l})}),o.message?.thinking?.content&&r.push({type:"thinking",thinking:o.message.thinking.content,signature:o.message.thinking.signature});let s=e.usage?.prompt_tokens_details?.cached_tokens??e.usage?.prompt_cache_hit_tokens??0,a=(e.usage?.prompt_tokens||0)-s,i={id:e.id?.startsWith("msg_")?e.id:`msg_${tr().replace(/-/g,"")}`,type:"message",role:"assistant",model:e.model,content:r,stop_reason:o.finish_reason==="stop"?"end_turn":o.finish_reason==="length"?"max_tokens":o.finish_reason==="tool_calls"?"tool_use":o.finish_reason==="content_filter"?"stop_sequence":"end_turn",stop_sequence:null,usage:{input_tokens:a,cache_creation_input_tokens:0,cache_read_input_tokens:s,output_tokens:e.usage?.completion_tokens||0,server_tool_use:{web_search_requests:0,web_fetch_requests:0},service_tier:"standard",cache_creation:{ephemeral_1h_input_tokens:0,ephemeral_5m_input_tokens:0},inference_geo:"",iterations:[],speed:"standard"},stop_details:null,context_management:null};return this.logger.debug({reqId:t.req.id,result:i},"Conversion complete, final Anthropic response"),i}catch{throw B(`Provider error: ${JSON.stringify(e)}`,500,"provider_error")}}}});function id(n,e){n.includes("null")&&(e.nullable=!0);let t=n.filter(o=>o!=="null");if(t.length===1){let o=t[0].toUpperCase();e.type=Object.values(Ve).includes(o)?o:Ve.TYPE_UNSPECIFIED}else{e.anyOf=[];for(let o of t){let r=o.toUpperCase();e.anyOf.push({type:Object.values(Ve).includes(r)?r:Ve.TYPE_UNSPECIFIED})}}}function ht(n){let e={},t=["items"],o=["anyOf"],r=["properties"];if(n.type&&n.anyOf)throw new Error("type and anyOf cannot be both populated.");let s=n.anyOf;s!=null&&Array.isArray(s)&&s.length==2&&(s[0]&&s[0].type==="null"?(e.nullable=!0,n=s[1]):s[1]&&s[1].type==="null"&&(e.nullable=!0,n=s[0])),n.type&&Array.isArray(n.type)&&id(n.type,e);for(let[a,i]of Object.entries(n))if(i!=null)if(a=="type"){if(i==="null")throw new Error("type: null can not be the only possible type for the field.");if(Array.isArray(i))continue;let c=i.toUpperCase();e.type=Object.values(Ve).includes(c)?c:Ve.TYPE_UNSPECIFIED}else if(t.includes(a))e[a]=ht(i);else if(o.includes(a)){let c=[];for(let l of i){if(l.type=="null"){e.nullable=!0;continue}c.push(ht(l))}e[a]=c}else if(r.includes(a)){let c={};for(let[l,u]of Object.entries(i))c[l]=ht(u);e[a]=c}else{if(a==="additionalProperties")continue;e[a]=i}return e}function ad(n){if(n.functionDeclarations)for(let e of n.functionDeclarations)e.parameters&&(Object.keys(e.parameters).includes("$schema")?e.parametersJsonSchema||(e.parametersJsonSchema=e.parameters,delete e.parameters):e.parameters=ht(e.parameters)),e.response&&(Object.keys(e.response).includes("$schema")?e.responseJsonSchema||(e.responseJsonSchema=e.response,delete e.response):e.response=ht(e.response));return n}function pn(n){let e=[],t=n.tools?.filter(c=>c.function.name!=="web_search")?.map(c=>({name:c.function.name,description:c.function.description,parametersJsonSchema:c.function.parameters}));t?.length&&e.push(ad({functionDeclarations:t})),n.tools?.find(c=>c.function.name==="web_search")&&e.push({googleSearch:{}});let r=[],s=n.messages.filter(c=>c.role==="tool");n.messages.filter(c=>c.role!=="tool").forEach(c=>{let l;c.role==="assistant"?l="model":(["user","system"].includes(c.role),l="user");let u=[];if(typeof c.content=="string"){let p={text:c.content};c.thinking?.signature&&(p.thoughtSignature=c.thinking.signature),u.push(p)}else Array.isArray(c.content)?u.push(...c.content.map(p=>{if(p.type==="text")return{text:p.text||""};if(p.type==="image_url")return p.image_url.url.startsWith("http")?{file_data:{mime_type:p.media_type,file_uri:p.image_url.url}}:{inlineData:{mime_type:p.media_type,data:p.image_url.url?.split(",")?.pop()||p.image_url.url}}})):c.content&&typeof c.content=="object"&&(c.content.text?u.push({text:c.content.text}):u.push({text:JSON.stringify(c.content)}));if(Array.isArray(c.tool_calls)&&u.push(...c.tool_calls.map(p=>{let d={functionCall:{id:p.id||`tool_${Math.random().toString(36).substring(2,15)}`,name:p.function.name,args:JSON.parse(p.function.arguments||"{}")}};return c.thinking?.signature&&(d.thoughtSignature=c.thinking.signature),d})),u.length===0&&u.push({text:""}),r.push({role:l,parts:u}),l==="model"&&c.tool_calls){let p=c.tool_calls.map(d=>{let f=s.find(h=>h.tool_call_id===d.id);return{functionResponse:{name:d?.function?.name,response:{result:f?.content}}}});r.push({role:"user",parts:p})}});let a={};if(n.reasoning&&n.reasoning.effort&&n.reasoning.effort!=="none")if(a.thinkingConfig={includeThoughts:!0},n.model.includes("gemini-3"))a.thinkingConfig.thinkingLevel=n.reasoning.effort;else{let c=n.model.includes("pro")?[128,32768]:[0,24576],l,u=n.reasoning.max_tokens;typeof u<"u"&&(u>=c[0]&&u<=c[1]?l=u:u<c[0]?l=c[0]:u>c[1]&&(l=c[1]),a.thinkingConfig.thinkingBudget=l)}let i={contents:r,tools:e.length?e:void 0,generationConfig:a};if(n.tool_choice){let c={functionCallingConfig:{}};n.tool_choice==="auto"?c.functionCallingConfig.mode="auto":n.tool_choice==="none"?c.functionCallingConfig.mode="none":n.tool_choice==="required"?c.functionCallingConfig.mode="any":n.tool_choice?.function?.name&&(c.functionCallingConfig.mode="any",c.functionCallingConfig.allowedFunctionNames=[n.tool_choice?.function?.name]),i.toolConfig=c}return i}function fn(n){let e=n.contents,t=n.tools,o=n.model,r=n.max_tokens,s=n.temperature,a=n.stream,i=n.tool_choice,c={messages:[],model:o,max_tokens:r,temperature:s,stream:a,tool_choice:i};return Array.isArray(e)&&e.forEach(l=>{typeof l=="string"?c.messages.push({role:"user",content:l}):typeof l.text=="string"?c.messages.push({role:"user",content:l.text||null}):l.role==="user"?c.messages.push({role:"user",content:l?.parts?.map(u=>({type:"text",text:u.text||""}))||[]}):l.role==="model"&&c.messages.push({role:"assistant",content:l?.parts?.map(u=>({type:"text",text:u.text||""}))||[]})}),Array.isArray(t)&&(c.tools=[],t.forEach(l=>{Array.isArray(l.functionDeclarations)&&l.functionDeclarations.forEach(u=>{c.tools.push({type:"function",function:{name:u.name,description:u.description,parameters:u.parameters}})})})),c}async function mn(n,e,t){if(n.headers.get("Content-Type")?.includes("application/json")){let o=await n.json();t?.debug({response:o},`${e} response:`);let r="",s="",a=o.candidates[0]?.content?.parts||[],i=[];for(let p of a)p.text&&p.thought===!0?r+=p.text:i.push(p);s=a.find(p=>p.thoughtSignature)?.thoughtSignature;let c=i?.filter(p=>p.functionCall)?.map(p=>({id:p.functionCall?.id||`tool_${Math.random().toString(36).substring(2,15)}`,type:"function",function:{name:p.functionCall?.name,arguments:JSON.stringify(p.functionCall?.args||{})}}))||[],l=i?.filter(p=>p.text)?.map(p=>p.text)?.join(`
|
|
118
|
+
`)||"",u={id:o.responseId,choices:[{finish_reason:o.candidates[0].finishReason?.toLowerCase()||null,index:0,message:{content:l,role:"assistant",tool_calls:c.length>0?c:void 0,...s&&{thinking:{content:r||"(no content)",signature:s}}}}],created:parseInt(new Date().getTime()/1e3+"",10),model:o.modelVersion,object:"chat.completion",usage:{completion_tokens:o.usageMetadata?.candidatesTokenCount||0,prompt_tokens:o.usageMetadata?.promptTokenCount||0,prompt_tokens_details:{cached_tokens:o.usageMetadata?.cachedContentTokenCount||0},total_tokens:o.usageMetadata?.totalTokenCount||0,output_tokens_details:{reasoning_tokens:o.usageMetadata?.thoughtsTokenCount||0}}};return new Response(JSON.stringify(u),{status:n.status,statusText:n.statusText,headers:n.headers})}else if(n.headers.get("Content-Type")?.includes("stream")){if(!n.body)return n;let o=new TextDecoder,r=new TextEncoder,s=!1,a=!1,i=!1,c="",l=0,u=-1,p=new ReadableStream({async start(d){let f=async(m,_)=>{if(m.startsWith("data: ")){let b=m.slice(6).trim();if(b){t?.debug({chunkStr:b},`${e} chunk:`);try{let y=JSON.parse(b);if(!y.candidates||!y.candidates[0]){t?.debug({chunkStr:b},"Invalid chunk structure");return}let k=y.candidates[0],v=k.content?.parts||[];v.filter(S=>S.text&&S.thought===!0).forEach(S=>{i||(i=!0);let P={choices:[{delta:{role:"assistant",content:null,thinking:{content:S.text}},finish_reason:null,index:l,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:y.responseId||"",model:y.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1"};_.enqueue(r.encode(`data: ${JSON.stringify(P)}
|
|
119
119
|
|
|
120
|
-
`))});let x=
|
|
120
|
+
`))});let x=v.find(S=>S.thoughtSignature)?.thoughtSignature;if(x&&!s){if(!i){let P={choices:[{delta:{role:"assistant",content:null,thinking:{content:"(no content)"}},finish_reason:null,index:l,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:y.responseId||"",model:y.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1"};_.enqueue(r.encode(`data: ${JSON.stringify(P)}
|
|
121
121
|
|
|
122
122
|
`))}let S={choices:[{delta:{role:"assistant",content:null,thinking:{signature:x}},finish_reason:null,index:l,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:y.responseId||"",model:y.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1"};if(_.enqueue(r.encode(`data: ${JSON.stringify(S)}
|
|
123
123
|
|
|
124
124
|
`)),s=!0,l++,c){let P={choices:[{delta:{role:"assistant",content:c},finish_reason:null,index:l,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:y.responseId||"",model:y.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1"};_.enqueue(r.encode(`data: ${JSON.stringify(P)}
|
|
125
125
|
|
|
126
|
-
`)),c="",a||(a=!0)}}let v
|
|
126
|
+
`)),c="",a||(a=!0)}}let T=v.filter(S=>S.functionCall).map(S=>({id:S.functionCall?.id||`ccr_tool_${Math.random().toString(36).substring(2,15)}`,type:"function",function:{name:S.functionCall?.name,arguments:JSON.stringify(S.functionCall?.args||{})}})),C=v.filter(S=>S.text&&S.thought!==!0).map(S=>S.text).join(`
|
|
127
127
|
`);if(!C&&s&&!a){let S={choices:[{delta:{role:"assistant",content:"(no content)"},index:l,finish_reason:null,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:y.responseId||"",model:y.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1"};_.enqueue(r.encode(`data: ${JSON.stringify(S)}
|
|
128
128
|
|
|
129
129
|
`)),a||(a=!0)}if(i&&C&&!s)if(y.modelVersion.includes("3")){c+=C;return}else{let S={choices:[{delta:{role:"assistant",content:null,thinking:{signature:`ccr_${+new Date}`}},finish_reason:null,index:l,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:y.responseId||"",model:y.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1"};_.enqueue(r.encode(`data: ${JSON.stringify(S)}
|
|
130
130
|
|
|
131
131
|
`)),s=!0}if(C){c||l++;let S={choices:[{delta:{role:"assistant",content:C},finish_reason:k.finishReason?.toLowerCase()||null,index:l,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:y.responseId||"",model:y.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1",usage:{completion_tokens:y.usageMetadata?.candidatesTokenCount||0,prompt_tokens:y.usageMetadata?.promptTokenCount||0,prompt_tokens_details:{cached_tokens:y.usageMetadata?.cachedContentTokenCount||0},total_tokens:y.usageMetadata?.totalTokenCount||0,output_tokens_details:{reasoning_tokens:y.usageMetadata?.thoughtsTokenCount||0}}};k?.groundingMetadata?.groundingChunks?.length&&(S.choices[0].delta.annotations=k.groundingMetadata.groundingChunks.map((P,I)=>{let O=k?.groundingMetadata?.groundingSupports?.filter(E=>E.groundingChunkIndices?.includes(I));return{type:"url_citation",url_citation:{url:P?.web?.uri||"",title:P?.web?.title||"",content:O?.[0]?.segment?.text||"",start_index:O?.[0]?.segment?.startIndex||0,end_index:O?.[0]?.segment?.endIndex||0}}})),_.enqueue(r.encode(`data: ${JSON.stringify(S)}
|
|
132
132
|
|
|
133
|
-
`)),!a&&C&&(a=!0)}
|
|
133
|
+
`)),!a&&C&&(a=!0)}T.length>0&&(T.forEach(S=>{l++,u++;let P={choices:[{delta:{role:"assistant",tool_calls:[{...S,index:u}]},finish_reason:k.finishReason?.toLowerCase()||null,index:l,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:y.responseId||"",model:y.modelVersion||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1",usage:{completion_tokens:y.usageMetadata?.candidatesTokenCount||0,prompt_tokens:y.usageMetadata?.promptTokenCount||0,prompt_tokens_details:{cached_tokens:y.usageMetadata?.cachedContentTokenCount||0},total_tokens:y.usageMetadata?.totalTokenCount||0,output_tokens_details:{reasoning_tokens:y.usageMetadata?.thoughtsTokenCount||0}}};k?.groundingMetadata?.groundingChunks?.length&&(P.choices[0].delta.annotations=k.groundingMetadata.groundingChunks.map((I,O)=>{let E=k?.groundingMetadata?.groundingSupports?.filter(w=>w.groundingChunkIndices?.includes(O));return{type:"url_citation",url_citation:{url:I?.web?.uri||"",title:I?.web?.title||"",content:E?.[0]?.segment?.text||"",start_index:E?.[0]?.segment?.startIndex||0,end_index:E?.[0]?.segment?.endIndex||0}}})),_.enqueue(r.encode(`data: ${JSON.stringify(P)}
|
|
134
134
|
|
|
135
|
-
`))}),!a&&C&&(a=!0))}catch(y){t?.error(`Error parsing ${e} stream chunk`,b,y.message)}}}},h=n.body.getReader(),
|
|
136
|
-
`);
|
|
135
|
+
`))}),!a&&C&&(a=!0))}catch(y){t?.error(`Error parsing ${e} stream chunk`,b,y.message)}}}},h=n.body.getReader(),g="";try{for(;;){let{done:m,value:_}=await h.read();if(m){g&&await f(g,d);break}g+=o.decode(_,{stream:!0});let b=g.split(`
|
|
136
|
+
`);g=b.pop()||"";for(let y of b)await f(y,d)}}catch(m){d.error(m)}finally{d.close()}}});return new Response(p,{status:n.status,statusText:n.statusText,headers:n.headers})}}var Ve,nr=R(()=>{"use strict";Ve={TYPE_UNSPECIFIED:"TYPE_UNSPECIFIED",STRING:"STRING",NUMBER:"NUMBER",INTEGER:"INTEGER",BOOLEAN:"BOOLEAN",ARRAY:"ARRAY",OBJECT:"OBJECT",NULL:"NULL"}});var gn,Ki=R(()=>{"use strict";nr();gn=class{name="gemini";endPoint="/v1beta/models/:modelAndAction";async transformRequestIn(e,t){return{body:pn(e),config:{url:new URL(`./${e.model}:${e.stream?"streamGenerateContent?alt=sse":"generateContent"}`,t.baseUrl),headers:{"x-goog-api-key":t.apiKey,Authorization:void 0}}}}transformRequestOut=fn;async transformResponseOut(e){return mn(e,this.name,this.logger)}}});async function cd(){try{let{GoogleAuth:n}=await import("google-auth-library");return(await(await new n({scopes:["https://www.googleapis.com/auth/cloud-platform"]}).getClient()).getAccessToken()).token||""}catch(n){throw console.error("Error getting access token:",n),new Error(`Failed to get access token for Vertex AI. Please ensure you have set up authentication using one of these methods:
|
|
137
137
|
1. Set GOOGLE_APPLICATION_CREDENTIALS to point to service account key file
|
|
138
138
|
2. Run "gcloud auth application-default login"
|
|
139
|
-
3. Use Google Cloud environment with default service account`)}}var hn,Gi=R(()=>{"use strict";nr();hn=class{name="vertex-gemini";async transformRequestIn(e,t){let o=process.env.GOOGLE_CLOUD_PROJECT,r=process.env.GOOGLE_CLOUD_LOCATION||"us-central1";if(!o&&process.env.GOOGLE_APPLICATION_CREDENTIALS)try{let i=(await import("fs")).readFileSync(process.env.GOOGLE_APPLICATION_CREDENTIALS,"utf8"),c=JSON.parse(i);c&&c.project_id&&(o=c.project_id)}catch(a){console.error("Error extracting project_id from GOOGLE_APPLICATION_CREDENTIALS:",a)}if(!o)throw new Error("Project ID is required for Vertex AI. Set GOOGLE_CLOUD_PROJECT environment variable or ensure project_id is in GOOGLE_APPLICATION_CREDENTIALS file.");let s=await cd();return{body:pn(e),config:{url:new URL(`./v1beta1/projects/${o}/locations/${r}/publishers/google/models/${e.model}:${e.stream?"streamGenerateContent":"generateContent"}`,t.baseUrl.endsWith("/")?t.baseUrl:t.baseUrl+"/"||`https://${r}-aiplatform.googleapis.com`),headers:{Authorization:`Bearer ${s}`,"x-goog-api-key":void 0}}}}async transformRequestOut(e){return fn(e)}async transformResponseOut(e){return mn(e,this.name)}}});var yn,Vi=R(()=>{"use strict";V();yn=class{name="deepseek";async transformRequestIn(e){e.max_tokens&&e.max_tokens>8192&&(e.max_tokens=8192);let t=e.model?.includes("reasoner")||e.model?.includes("v4")||e.model?.includes("pro")||e.model?.includes("think"),o=e.thinking||e.reasoning?.enabled||e.messages.some(r=>r.thinking?.content)||t;return o&&e.tool_choice&&delete e.tool_choice,e.messages.forEach(r=>{if(r.role==="assistant"){let s=r.thinking?.content,a=r.thinking?.signature,i="";if(typeof r.content=="string"){let l=/<thinking>([\s\S]*?)<\/thinking>/g.exec(r.content);l&&(i=l[1].trim(),r.content=r.content.replace(l[0],"").trim())}s&&typeof s=="string"&&s.trim()?(r.reasoning_content=s,a&&(r.reasoning_content_signature=a)):i&&(r.reasoning_content=i),o&&!r.reasoning_content&&(r.reasoning_content=" "),r.thinking&&delete r.thinking}}),e}async transformResponseOut(e){if(e.headers.get("Content-Type")?.includes("application/json")){let t=await F(e);return new Response(JSON.stringify(t),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let t=new TextDecoder,o=new TextEncoder,r="",s=!1,a="",i=new ReadableStream({async start(c){let l=e.body.getReader(),u=(d,
|
|
140
|
-
`);for(let
|
|
141
|
-
`))},p=(d,
|
|
139
|
+
3. Use Google Cloud environment with default service account`)}}var hn,Gi=R(()=>{"use strict";nr();hn=class{name="vertex-gemini";async transformRequestIn(e,t){let o=process.env.GOOGLE_CLOUD_PROJECT,r=process.env.GOOGLE_CLOUD_LOCATION||"us-central1";if(!o&&process.env.GOOGLE_APPLICATION_CREDENTIALS)try{let i=(await import("fs")).readFileSync(process.env.GOOGLE_APPLICATION_CREDENTIALS,"utf8"),c=JSON.parse(i);c&&c.project_id&&(o=c.project_id)}catch(a){console.error("Error extracting project_id from GOOGLE_APPLICATION_CREDENTIALS:",a)}if(!o)throw new Error("Project ID is required for Vertex AI. Set GOOGLE_CLOUD_PROJECT environment variable or ensure project_id is in GOOGLE_APPLICATION_CREDENTIALS file.");let s=await cd();return{body:pn(e),config:{url:new URL(`./v1beta1/projects/${o}/locations/${r}/publishers/google/models/${e.model}:${e.stream?"streamGenerateContent":"generateContent"}`,t.baseUrl.endsWith("/")?t.baseUrl:t.baseUrl+"/"||`https://${r}-aiplatform.googleapis.com`),headers:{Authorization:`Bearer ${s}`,"x-goog-api-key":void 0}}}}async transformRequestOut(e){return fn(e)}async transformResponseOut(e){return mn(e,this.name)}}});var yn,Vi=R(()=>{"use strict";V();yn=class{name="deepseek";async transformRequestIn(e){e.max_tokens&&e.max_tokens>8192&&(e.max_tokens=8192);let t=e.model?.includes("reasoner")||e.model?.includes("v4")||e.model?.includes("pro")||e.model?.includes("think"),o=e.thinking||e.reasoning?.enabled||e.messages.some(r=>r.thinking?.content)||t;return o&&e.tool_choice&&delete e.tool_choice,e.messages.forEach(r=>{if(r.role==="assistant"){let s=r.thinking?.content,a=r.thinking?.signature,i="";if(typeof r.content=="string"){let l=/<thinking>([\s\S]*?)<\/thinking>/g.exec(r.content);l&&(i=l[1].trim(),r.content=r.content.replace(l[0],"").trim())}s&&typeof s=="string"&&s.trim()?(r.reasoning_content=s,a&&(r.reasoning_content_signature=a)):i&&(r.reasoning_content=i),o&&!r.reasoning_content&&(r.reasoning_content=" "),r.thinking&&delete r.thinking}}),e}async transformResponseOut(e){if(e.headers.get("Content-Type")?.includes("application/json")){let t=await F(e);return new Response(JSON.stringify(t),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let t=new TextDecoder,o=new TextEncoder,r="",s=!1,a="",i=new ReadableStream({async start(c){let l=e.body.getReader(),u=(d,f,h)=>{let g=d.split(`
|
|
140
|
+
`);for(let m of g)m.trim()&&f.enqueue(h.encode(m+`
|
|
141
|
+
`))},p=(d,f)=>{let{controller:h,encoder:g}=f;if(d.startsWith("data: ")&&d.trim()!=="data: [DONE]")try{let m=JSON.parse(d.slice(6));if(m.choices?.[0]?.delta?.reasoning_content){f.appendReasoningContent(m.choices[0].delta.reasoning_content);let _={...m,choices:[{...m.choices[0],delta:{...m.choices[0].delta,thinking:{content:m.choices[0].delta.reasoning_content}}}]};delete _.choices[0].delta.reasoning_content;let b=`data: ${JSON.stringify(_)}
|
|
142
142
|
|
|
143
|
-
`;h.enqueue(
|
|
143
|
+
`;h.enqueue(g.encode(b));return}if(m.choices?.[0]?.delta?.content&&f.reasoningContent()&&!f.isReasoningComplete()){f.setReasoningComplete(!0);let _="ccr_think_signature",b=m.choices[0].delta.content,y={...m,choices:[{...m.choices[0],delta:{...m.choices[0].delta,content:null,thinking:{content:f.reasoningContent(),signature:_}}}]};delete y.choices[0].delta.reasoning_content;let k=`data: ${JSON.stringify(y)}
|
|
144
144
|
|
|
145
|
-
`;h.enqueue(
|
|
145
|
+
`;h.enqueue(g.encode(k));let v={...m,choices:[{...m.choices[0],delta:{...m.choices[0].delta,content:b}}]};delete v.choices[0].delta.reasoning_content;let x=`data: ${JSON.stringify(v)}
|
|
146
146
|
|
|
147
|
-
`;h.enqueue(
|
|
147
|
+
`;h.enqueue(g.encode(x));return}if(m.choices[0]?.delta?.reasoning_content&&delete m.choices[0].delta.reasoning_content,m.choices?.[0]?.delta&&Object.keys(m.choices[0].delta).length>0){let _=`data: ${JSON.stringify(m)}
|
|
148
148
|
|
|
149
|
-
`;h.enqueue(
|
|
150
|
-
`))}else h.enqueue(
|
|
151
|
-
`))};try{for(;;){let{done:d,value:
|
|
152
|
-
`);a=
|
|
149
|
+
`;h.enqueue(g.encode(_))}}catch{h.enqueue(g.encode(d+`
|
|
150
|
+
`))}else h.enqueue(g.encode(d+`
|
|
151
|
+
`))};try{for(;;){let{done:d,value:f}=await l.read();if(d){a.trim()&&u(a,c,o);break}let h=t.decode(f,{stream:!0});a+=h;let g=a.split(`
|
|
152
|
+
`);a=g.pop()||"";for(let m of g)if(m.trim())try{p(m,{controller:c,encoder:o,reasoningContent:()=>r,appendReasoningContent:_=>r+=_,isReasoningComplete:()=>s,setReasoningComplete:_=>s=_})}catch(_){console.error("Error processing line:",m,_),c.enqueue(o.encode(m+`
|
|
153
153
|
`))}}}catch(d){console.error("Stream error:",d),c.error(d)}finally{try{l.releaseLock()}catch(d){console.error("Error releasing reader lock:",d)}c.close()}}});return new Response(i,{status:e.status,statusText:e.statusText,headers:{"Content-Type":e.headers.get("Content-Type")||"text/plain","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});var _n,Qi=R(()=>{"use strict";V();_n=class{name="tooluse";transformRequestIn(e){return e.messages.push({role:"system",content:"<system-reminder>Tool mode is active. The user expects you to proactively execute the most suitable tool to help complete the task. \nBefore invoking a tool, you must carefully evaluate whether it matches the current task. If no available tool is appropriate for the task, you MUST call the `ExitTool` to exit tool mode \u2014 this is the only valid way to terminate tool mode.\nAlways prioritize completing the user's task effectively and efficiently by using tools whenever appropriate.</system-reminder>"}),e.tools?.length&&(e.tool_choice="required",e.tools.push({type:"function",function:{name:"ExitTool",description:`Use this tool when you are in tool mode and have completed the task. This is the only valid way to exit tool mode.
|
|
154
154
|
IMPORTANT: Before using this tool, ensure that none of the available tools are applicable to the current task. You must evaluate all available options \u2014 only if no suitable tool can help you complete the task should you use ExitTool to terminate tool mode.
|
|
155
155
|
Examples:
|
|
156
156
|
1. Task: "Use a tool to summarize this document" \u2014 Do not use ExitTool if a summarization tool is available.
|
|
157
|
-
2. Task: "What\u2019s the weather today?" \u2014 If no tool is available to answer, use ExitTool after reasoning that none can fulfill the task.`,parameters:{type:"object",properties:{response:{type:"string",description:"Your response will be forwarded to the user exactly as returned \u2014 the tool will not modify or post-process it in any way."}},required:["response"]}}})),e}async transformResponseOut(e){if(e.headers.get("Content-Type")?.includes("application/json")){let t=await F(e);if(t?.choices?.[0]?.message.tool_calls?.length&&t?.choices?.[0]?.message.tool_calls[0]?.function?.name==="ExitTool"){let o=t?.choices[0]?.message.tool_calls[0],r=JSON.parse(o.function.arguments||"{}");t.choices[0].message.content=r.response||"",delete t.choices[0].message.tool_calls}return new Response(JSON.stringify(t),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let t=new TextDecoder,o=new TextEncoder,r=-1,s="",a="",i=new ReadableStream({async start(c){let l=e.body.getReader(),u=(d,
|
|
158
|
-
`);for(let
|
|
159
|
-
`))},p=(d,
|
|
157
|
+
2. Task: "What\u2019s the weather today?" \u2014 If no tool is available to answer, use ExitTool after reasoning that none can fulfill the task.`,parameters:{type:"object",properties:{response:{type:"string",description:"Your response will be forwarded to the user exactly as returned \u2014 the tool will not modify or post-process it in any way."}},required:["response"]}}})),e}async transformResponseOut(e){if(e.headers.get("Content-Type")?.includes("application/json")){let t=await F(e);if(t?.choices?.[0]?.message.tool_calls?.length&&t?.choices?.[0]?.message.tool_calls[0]?.function?.name==="ExitTool"){let o=t?.choices[0]?.message.tool_calls[0],r=JSON.parse(o.function.arguments||"{}");t.choices[0].message.content=r.response||"",delete t.choices[0].message.tool_calls}return new Response(JSON.stringify(t),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let t=new TextDecoder,o=new TextEncoder,r=-1,s="",a="",i=new ReadableStream({async start(c){let l=e.body.getReader(),u=(d,f,h)=>{let g=d.split(`
|
|
158
|
+
`);for(let m of g)m.trim()&&f.enqueue(h.encode(m+`
|
|
159
|
+
`))},p=(d,f)=>{let{controller:h,encoder:g,exitToolIndex:m,setExitToolIndex:_,appendExitToolResponse:b}=f;if(d.startsWith("data: ")&&d.trim()!=="data: [DONE]")try{let y=JSON.parse(d.slice(6));if(y.choices[0]?.delta?.tool_calls?.length){let k=y.choices[0].delta.tool_calls[0];if(k.function?.name==="ExitTool"){_(k.index);return}else if(m()>-1&&k.index===m()&&k.function.arguments){b(k.function.arguments);try{let v=JSON.parse(f.exitToolResponse());y.choices=[{delta:{role:"assistant",content:v.response||""}}];let x=`data: ${JSON.stringify(y)}
|
|
160
160
|
|
|
161
|
-
`;h.enqueue(
|
|
161
|
+
`;h.enqueue(g.encode(x))}catch{}return}}if(y.choices?.[0]?.delta&&Object.keys(y.choices[0].delta).length>0){let k=`data: ${JSON.stringify(y)}
|
|
162
162
|
|
|
163
|
-
`;h.enqueue(
|
|
164
|
-
`))}else h.enqueue(
|
|
165
|
-
`))};try{for(;;){let{done:d,value:
|
|
166
|
-
`);a=
|
|
167
|
-
`))}}}catch(d){console.error("Stream error:",d),c.error(d)}finally{try{l.releaseLock()}catch(d){console.error("Error releasing reader lock:",d)}c.close()}}});return new Response(i,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});import{v4 as ld}from"uuid";var bn,Yi=R(()=>{"use strict";V();bn=class{constructor(e){this.options=e}static TransformerName="openrouter";async transformRequestIn(e){return e.model.includes("claude")?e.messages.forEach(t=>{Array.isArray(t.content)&&t.content.forEach(o=>{o.type==="image_url"&&(o.image_url.url.startsWith("http")||(o.image_url.url=`data:${o.media_type};base64,${o.image_url.url}`),delete o.media_type)})}):e.messages.forEach(t=>{Array.isArray(t.content)?t.content.forEach(o=>{o.cache_control&&delete o.cache_control,o.type==="image_url"&&(o.image_url.url.startsWith("http")||(o.image_url.url=`${o.image_url.url}`),delete o.media_type)}):t.cache_control&&delete t.cache_control}),Object.assign(e,this.options||{}),e}async transformResponseOut(e){if(e.headers.get("Content-Type")?.includes("application/json")){let t=await F(e);return new Response(JSON.stringify(t),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let t=new TextDecoder,o=new TextEncoder,r=!1,s="",a=!1,i=!1,c="",l=new ReadableStream({async start(u){let p=e.body.getReader(),d=(h,
|
|
168
|
-
`);for(let b of _)b.trim()&&
|
|
169
|
-
`))},
|
|
163
|
+
`;h.enqueue(g.encode(k))}}catch{h.enqueue(g.encode(d+`
|
|
164
|
+
`))}else h.enqueue(g.encode(d+`
|
|
165
|
+
`))};try{for(;;){let{done:d,value:f}=await l.read();if(d){a.trim()&&u(a,c,o);break}let h=t.decode(f,{stream:!0});a+=h;let g=a.split(`
|
|
166
|
+
`);a=g.pop()||"";for(let m of g)if(m.trim())try{p(m,{controller:c,encoder:o,exitToolIndex:()=>r,setExitToolIndex:_=>r=_,exitToolResponse:()=>s,appendExitToolResponse:_=>s+=_})}catch(_){console.error("Error processing line:",m,_),c.enqueue(o.encode(m+`
|
|
167
|
+
`))}}}catch(d){console.error("Stream error:",d),c.error(d)}finally{try{l.releaseLock()}catch(d){console.error("Error releasing reader lock:",d)}c.close()}}});return new Response(i,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});import{v4 as ld}from"uuid";var bn,Yi=R(()=>{"use strict";V();bn=class{constructor(e){this.options=e}static TransformerName="openrouter";async transformRequestIn(e){return e.model.includes("claude")?e.messages.forEach(t=>{Array.isArray(t.content)&&t.content.forEach(o=>{o.type==="image_url"&&(o.image_url.url.startsWith("http")||(o.image_url.url=`data:${o.media_type};base64,${o.image_url.url}`),delete o.media_type)})}):e.messages.forEach(t=>{Array.isArray(t.content)?t.content.forEach(o=>{o.cache_control&&delete o.cache_control,o.type==="image_url"&&(o.image_url.url.startsWith("http")||(o.image_url.url=`${o.image_url.url}`),delete o.media_type)}):t.cache_control&&delete t.cache_control}),Object.assign(e,this.options||{}),e}async transformResponseOut(e){if(e.headers.get("Content-Type")?.includes("application/json")){let t=await F(e);return new Response(JSON.stringify(t),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let t=new TextDecoder,o=new TextEncoder,r=!1,s="",a=!1,i=!1,c="",l=new ReadableStream({async start(u){let p=e.body.getReader(),d=(h,g,m)=>{let _=h.split(`
|
|
168
|
+
`);for(let b of _)b.trim()&&g.enqueue(m.encode(b+`
|
|
169
|
+
`))},f=(h,g)=>{let{controller:m,encoder:_}=g;if(h.startsWith("data: ")&&h.trim()!=="data: [DONE]"){let b=h.slice(6);try{let y=JSON.parse(b);if(y.usage&&(this.logger?.debug({usage:y.usage,hasToolCall:i},"usage"),y.choices[0].finish_reason=i?"tool_calls":"stop"),y.choices?.[0]?.finish_reason==="error"){m.enqueue(_.encode(`data: ${JSON.stringify({error:y.choices?.[0].error})}
|
|
170
170
|
|
|
171
|
-
`));return}y.choices?.[0]?.delta?.content&&!
|
|
171
|
+
`));return}y.choices?.[0]?.delta?.content&&!g.hasTextContent()&&g.setHasTextContent(!0);let k=y.choices?.[0]?.delta?.reasoning||y.choices?.[0]?.delta?.reasoning_content;if(k){g.appendReasoningContent(k);let S={...y,choices:[{...y.choices?.[0],delta:{...y.choices[0].delta,thinking:{content:k}}}]};S.choices?.[0]?.delta&&(delete S.choices[0].delta.reasoning,delete S.choices[0].delta.reasoning_content);let P=`data: ${JSON.stringify(S)}
|
|
172
172
|
|
|
173
|
-
`;
|
|
173
|
+
`;m.enqueue(_.encode(P));return}if(y.choices?.[0]?.delta?.content&&g.reasoningContent()&&!g.isReasoningComplete()){g.setReasoningComplete(!0);let S="ccr_think_signature",P=y.choices[0].delta.content,I={...y,choices:[{...y.choices?.[0],delta:{...y.choices[0].delta,content:null,thinking:{content:g.reasoningContent(),signature:S}}}]};I.choices?.[0]?.delta&&delete I.choices[0].delta.reasoning;let O=`data: ${JSON.stringify(I)}
|
|
174
174
|
|
|
175
|
-
`;
|
|
175
|
+
`;m.enqueue(_.encode(O));let E={...y,choices:[{...y.choices?.[0],delta:{...y.choices[0].delta,content:P}}]};E.choices?.[0]?.delta&&(delete E.choices[0].delta.reasoning,delete E.choices[0].delta.reasoning_content);let w=`data: ${JSON.stringify(E)}
|
|
176
176
|
|
|
177
|
-
`;
|
|
177
|
+
`;m.enqueue(_.encode(w));return}y.choices?.[0]?.delta?.reasoning&&delete y.choices[0].delta.reasoning,y.choices?.[0]?.delta?.reasoning_content&&delete y.choices[0].delta.reasoning_content,y.choices?.[0]?.delta?.tool_calls?.length&&!Number.isNaN(parseInt(y.choices?.[0]?.delta?.tool_calls[0].id,10))&&y.choices?.[0]?.delta?.tool_calls.forEach(S=>{S.id=`call_${ld()}`}),y.choices?.[0]?.delta?.tool_calls?.length&&!i&&(i=!0);let v=y.choices?.[0]?.delta,x=v&&Object.keys(v).length>0,T=y.choices?.[0]?.finish_reason,C=y.usage;if(x||T||C){let S=`data: ${JSON.stringify(y)}
|
|
178
178
|
|
|
179
|
-
`;
|
|
180
|
-
`))}}else
|
|
181
|
-
`))};try{for(;;){let{done:h,value:
|
|
182
|
-
`);c=b.pop()||"";for(let y of b)if(y.trim())try{
|
|
179
|
+
`;m.enqueue(_.encode(S))}}catch{m.enqueue(_.encode(h+`
|
|
180
|
+
`))}}else m.enqueue(_.encode(h+`
|
|
181
|
+
`))};try{for(;;){let{done:h,value:g}=await p.read();if(h){c.trim()&&d(c,u,o);break}if(!g||g.length===0)continue;let m;try{m=t.decode(g,{stream:!0})}catch(b){console.warn("Failed to decode chunk",b);continue}if(m.length===0)continue;if(c+=m,c.length>1e6){console.warn("Buffer size exceeds limit, processing partial data");let b=c.split(`
|
|
182
|
+
`);c=b.pop()||"";for(let y of b)if(y.trim())try{f(y,{controller:u,encoder:o,hasTextContent:()=>r,setHasTextContent:k=>r=k,reasoningContent:()=>s,appendReasoningContent:k=>s+=k,isReasoningComplete:()=>a,setReasoningComplete:k=>a=k})}catch(k){console.error("Error processing line:",y,k),u.enqueue(o.encode(y+`
|
|
183
183
|
`))}continue}let _=c.split(`
|
|
184
|
-
`);c=_.pop()||"";for(let b of _)if(b.trim())try{
|
|
185
|
-
`))}}}catch(h){console.error("Stream error:",h),u.error(h)}finally{try{p.releaseLock()}catch(h){console.error("Error releasing reader lock:",h)}u.close()}}});return new Response(l,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});var kn,Xi=R(()=>{"use strict";kn=class{constructor(e){this.options=e;this.max_tokens=this.options?.max_tokens}static TransformerName="maxtoken";max_tokens;async transformRequestIn(e){return e.max_tokens&&e.max_tokens>this.max_tokens&&(e.max_tokens=this.max_tokens),e}}});import{v4 as ud}from"uuid";var Tn,Zi=R(()=>{"use strict";V();Tn=class{name="groq";async transformRequestIn(e){return e.messages.forEach(t=>{Array.isArray(t.content)?t.content.forEach(o=>{o.cache_control&&delete o.cache_control}):t.cache_control&&delete t.cache_control}),Array.isArray(e.tools)&&e.tools.forEach(t=>{delete t.function.parameters.$schema}),e}async transformResponseOut(e){if(e.headers.get("Content-Type")?.includes("application/json")){let t=await F(e);return new Response(JSON.stringify(t),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let t=new TextDecoder,o=new TextEncoder,r=!1,s="",a=!1,i="",c=new ReadableStream({async start(l){let u=e.body.getReader(),p=(
|
|
186
|
-
`);for(let _ of
|
|
187
|
-
`))},d=(
|
|
188
|
-
|
|
189
|
-
`;
|
|
190
|
-
`))}}else
|
|
191
|
-
`))};try{for(;;){let{done:
|
|
184
|
+
`);c=_.pop()||"";for(let b of _)if(b.trim())try{f(b,{controller:u,encoder:o,hasTextContent:()=>r,setHasTextContent:y=>r=y,reasoningContent:()=>s,appendReasoningContent:y=>s+=y,isReasoningComplete:()=>a,setReasoningComplete:y=>a=y})}catch(y){console.error("Error processing line:",b,y),u.enqueue(o.encode(b+`
|
|
185
|
+
`))}}}catch(h){console.error("Stream error:",h),u.error(h)}finally{try{p.releaseLock()}catch(h){console.error("Error releasing reader lock:",h)}u.close()}}});return new Response(l,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});var kn,Xi=R(()=>{"use strict";kn=class{constructor(e){this.options=e;this.max_tokens=this.options?.max_tokens}static TransformerName="maxtoken";max_tokens;async transformRequestIn(e){return e.max_tokens&&e.max_tokens>this.max_tokens&&(e.max_tokens=this.max_tokens),e}}});import{v4 as ud}from"uuid";var Tn,Zi=R(()=>{"use strict";V();Tn=class{name="groq";async transformRequestIn(e){return e.messages.forEach(t=>{Array.isArray(t.content)?t.content.forEach(o=>{o.cache_control&&delete o.cache_control}):t.cache_control&&delete t.cache_control}),Array.isArray(e.tools)&&e.tools.forEach(t=>{delete t.function.parameters.$schema}),e}async transformResponseOut(e){if(e.headers.get("Content-Type")?.includes("application/json")){let t=await F(e);return new Response(JSON.stringify(t),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let t=new TextDecoder,o=new TextEncoder,r=!1,s="",a=!1,i="",c=new ReadableStream({async start(l){let u=e.body.getReader(),p=(f,h,g)=>{let m=f.split(`
|
|
186
|
+
`);for(let _ of m)_.trim()&&h.enqueue(g.encode(_+`
|
|
187
|
+
`))},d=(f,h)=>{let{controller:g,encoder:m}=h;if(f.startsWith("data: ")&&f.trim()!=="data: [DONE]"){let _=f.slice(6);try{let b=JSON.parse(_);if(b.error)throw new Error(JSON.stringify(b));b.choices?.[0]?.delta?.content&&!h.hasTextContent()&&h.setHasTextContent(!0),b.choices?.[0]?.delta?.tool_calls?.length&&b.choices?.[0]?.delta?.tool_calls.forEach(k=>{k.id=`call_${ud()}`}),b.choices?.[0]?.delta?.tool_calls?.length&&h.hasTextContent()&&(typeof b.choices[0].index=="number"?b.choices[0].index+=1:b.choices[0].index=1);let y=`data: ${JSON.stringify(b)}
|
|
188
|
+
|
|
189
|
+
`;g.enqueue(m.encode(y))}catch{g.enqueue(m.encode(f+`
|
|
190
|
+
`))}}else g.enqueue(m.encode(f+`
|
|
191
|
+
`))};try{for(;;){let{done:f,value:h}=await u.read();if(f){i.trim()&&p(i,l,o);break}if(!h||h.length===0)continue;let g;try{g=t.decode(h,{stream:!0})}catch(_){console.warn("Failed to decode chunk",_);continue}if(g.length===0)continue;if(i+=g,i.length>1e6){console.warn("Buffer size exceeds limit, processing partial data");let _=i.split(`
|
|
192
192
|
`);i=_.pop()||"";for(let b of _)if(b.trim())try{d(b,{controller:l,encoder:o,hasTextContent:()=>r,setHasTextContent:y=>r=y,reasoningContent:()=>s,appendReasoningContent:y=>s+=y,isReasoningComplete:()=>a,setReasoningComplete:y=>a=y})}catch(y){console.error("Error processing line:",b,y),l.enqueue(o.encode(b+`
|
|
193
|
-
`))}continue}let
|
|
194
|
-
`);i=
|
|
195
|
-
`))}}}catch(
|
|
193
|
+
`))}continue}let m=i.split(`
|
|
194
|
+
`);i=m.pop()||"";for(let _ of m)if(_.trim())try{d(_,{controller:l,encoder:o,hasTextContent:()=>r,setHasTextContent:b=>r=b,reasoningContent:()=>s,appendReasoningContent:b=>s+=b,isReasoningComplete:()=>a,setReasoningComplete:b=>a=b})}catch(b){console.error("Error processing line:",_,b),l.enqueue(o.encode(_+`
|
|
195
|
+
`))}}}catch(f){console.error("Stream error:",f),l.error(f)}finally{try{u.releaseLock()}catch(f){console.error("Error releasing reader lock:",f)}l.close()}}});return new Response(c,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});var vn,qi=R(()=>{"use strict";vn=class{name="cleancache";async transformRequestIn(e){return Array.isArray(e.messages)&&e.messages.forEach(t=>{Array.isArray(t.content)?t.content.forEach(o=>{o.cache_control&&delete o.cache_control}):t.cache_control&&delete t.cache_control}),e}}});import dd from"json5";import{jsonrepair as pd}from"jsonrepair";function or(n,e){if(!n||n.trim()===""||n==="{}")return"{}";try{return JSON.parse(n),e?.debug("\u5DE5\u5177\u8C03\u7528\u53C2\u6570\u6807\u51C6JSON\u89E3\u6790\u6210\u529F / Tool arguments standard JSON parsing successful"),n}catch(t){try{let o=dd.parse(n);return e?.debug("Tool arguments JSON5 parsing successful"),JSON.stringify(o)}catch(o){try{let r=pd(n);return e?.debug("Tool arguments safely repaired"),r}catch(r){return e?.error(`JSON parsing failed: ${t.message}. JSON5 parsing failed: ${o.message}. JSON repair failed: ${r.message}. Input data: ${JSON.stringify(n)}`),e?.debug("Returning safe empty object as fallback"),"{}"}}}}var ea=R(()=>{});var xn,ta=R(()=>{"use strict";ea();V();xn=class{name="enhancetool";async transformResponseOut(e){if(e.headers.get("Content-Type")?.includes("application/json")){let t=await F(e);if(t?.choices?.[0]?.message?.tool_calls?.length)for(let o of t.choices[0].message.tool_calls)o.function?.arguments&&(o.function.arguments=or(o.function.arguments,this.logger));return new Response(JSON.stringify(t),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let t=new TextDecoder,o=new TextEncoder,r={},s=!1,a="",i=!1,c=!1,l="",u=new ReadableStream({async start(p){let d=e.body.getReader(),f=(m,_,b)=>{let y=m.split(`
|
|
196
196
|
`);for(let k of y)k.trim()&&_.enqueue(b.encode(k+`
|
|
197
|
-
`))},h=(
|
|
197
|
+
`))},h=(m,_,b)=>{let y="";try{y=or(r.arguments||"",this.logger)}catch(T){console.error(`${T.message} ${T.stack} \u5DE5\u5177\u8C03\u7528\u53C2\u6570\u89E3\u6790\u5931\u8D25: ${JSON.stringify(r)}`),y=r.arguments||""}let k={role:"assistant",tool_calls:[{function:{name:r.name,arguments:y},id:r.id,index:r.index,type:"function"}]},v={...m,choices:[{...m.choices[0],delta:k}]};v.choices[0].delta.content!==void 0&&delete v.choices[0].delta.content;let x=`data: ${JSON.stringify(v)}
|
|
198
198
|
|
|
199
|
-
`;_.enqueue(b.encode(x))},
|
|
199
|
+
`;_.enqueue(b.encode(x))},g=(m,_)=>{let{controller:b,encoder:y}=_;if(m.startsWith("data: ")&&m.trim()!=="data: [DONE]"){let k=m.slice(6);try{let v=JSON.parse(k);if(v.choices?.[0]?.delta?.tool_calls?.length){let T=v.choices[0].delta.tool_calls[0];if(typeof r.index>"u"){r={index:T.index,name:T.function?.name||"",id:T.id||"",arguments:T.function?.arguments||""},T.function?.arguments&&(T.function.arguments="");let C=`data: ${JSON.stringify(v)}
|
|
200
200
|
|
|
201
|
-
`;b.enqueue(y.encode(C));return}else if(r.index===
|
|
201
|
+
`;b.enqueue(y.encode(C));return}else if(r.index===T.index){T.function?.arguments&&(r.arguments+=T.function.arguments);return}else{h(v,b,y),r={index:T.index,name:T.function?.name||"",id:T.id||"",arguments:T.function?.arguments||""};return}}if(v.choices?.[0]?.finish_reason==="tool_calls"&&r.index!==void 0){h(v,b,y),r={};return}v.choices?.[0]?.delta?.tool_calls?.length&&_.hasTextContent()&&(typeof v.choices[0].index=="number"?v.choices[0].index+=1:v.choices[0].index=1);let x=`data: ${JSON.stringify(v)}
|
|
202
202
|
|
|
203
|
-
`;b.enqueue(y.encode(x))}catch{b.enqueue(y.encode(
|
|
204
|
-
`))}}else b.enqueue(y.encode(
|
|
205
|
-
`))};try{for(;;){let{done:
|
|
206
|
-
`);l=k.pop()||"";for(let
|
|
203
|
+
`;b.enqueue(y.encode(x))}catch{b.enqueue(y.encode(m+`
|
|
204
|
+
`))}}else b.enqueue(y.encode(m+`
|
|
205
|
+
`))};try{for(;;){let{done:m,value:_}=await d.read();if(m){l.trim()&&f(l,p,o);break}if(!_||_.length===0)continue;let b;try{b=t.decode(_,{stream:!0})}catch(k){console.warn("Failed to decode chunk",k);continue}if(b.length===0)continue;if(l+=b,l.length>1e6){console.warn("Buffer size exceeds limit, processing partial data");let k=l.split(`
|
|
206
|
+
`);l=k.pop()||"";for(let v of k)if(v.trim())try{g(v,{controller:p,encoder:o,hasTextContent:()=>s,setHasTextContent:x=>s=x,reasoningContent:()=>a,appendReasoningContent:x=>a+=x,isReasoningComplete:()=>i,setReasoningComplete:x=>i=x})}catch(x){console.error("Error processing line:",v,x),p.enqueue(o.encode(v+`
|
|
207
207
|
`))}continue}let y=l.split(`
|
|
208
|
-
`);l=y.pop()||"";for(let k of y)if(k.trim())try{
|
|
209
|
-
`))}}}catch(
|
|
210
|
-
`);for(let
|
|
211
|
-
`))},p=(d,
|
|
208
|
+
`);l=y.pop()||"";for(let k of y)if(k.trim())try{g(k,{controller:p,encoder:o,hasTextContent:()=>s,setHasTextContent:v=>s=v,reasoningContent:()=>a,appendReasoningContent:v=>a+=v,isReasoningComplete:()=>i,setReasoningComplete:v=>i=v})}catch(v){console.error("Error processing line:",k,v),p.enqueue(o.encode(k+`
|
|
209
|
+
`))}}}catch(m){console.error("Stream error:",m),p.error(m)}finally{try{d.releaseLock()}catch(m){console.error("Error releasing reader lock:",m)}p.close()}}});return new Response(u,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});var Sn,na=R(()=>{"use strict";V();Ge();Sn=class{constructor(e){this.options=e;this.enable=this.options?.enable??!0}static TransformerName="reasoning";enable;async transformRequestIn(e){return this.enable?(e.reasoning&&(e.thinking={type:"enabled",budget_tokens:e.reasoning.max_tokens??un(e.reasoning.effort||"medium")},e.enable_thinking=!0),e):(e.thinking={type:"disabled",budget_tokens:-1},e.enable_thinking=!1,e)}async transformResponseOut(e){if(!this.enable)return e;if(e.headers.get("Content-Type")?.includes("application/json")){let t=await F(e);return t.choices[0]?.message.reasoning_content&&(t.thinking={content:t.choices[0]?.message.reasoning_content}),new Response(JSON.stringify(t),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let t=new TextDecoder,o=new TextEncoder,r="",s=!1,a="",i=new ReadableStream({async start(c){let l=e.body.getReader(),u=(d,f,h)=>{let g=d.split(`
|
|
210
|
+
`);for(let m of g)m.trim()&&f.enqueue(h.encode(m+`
|
|
211
|
+
`))},p=(d,f)=>{let{controller:h,encoder:g}=f;if(this.logger?.debug({line:d},"Processing reason line"),d.startsWith("data: ")&&d.trim()!=="data: [DONE]")try{let m=JSON.parse(d.slice(6));if(console.log(JSON.stringify(m)),m.choices?.[0]?.delta?.reasoning_content){f.appendReasoningContent(m.choices[0].delta.reasoning_content);let _={...m,choices:[{...m.choices[0],delta:{...m.choices[0].delta,thinking:{content:m.choices[0].delta.reasoning_content}}}]};delete _.choices[0].delta.reasoning_content;let b=`data: ${JSON.stringify(_)}
|
|
212
212
|
|
|
213
|
-
`;h.enqueue(
|
|
213
|
+
`;h.enqueue(g.encode(b));return}if(m.choices?.[0]?.delta?.content&&f.reasoningContent()&&!f.isReasoningComplete()){f.setReasoningComplete(!0);let _="ccr_think_signature",b=m.choices[0].delta.content,y={...m,choices:[{...m.choices[0],delta:{...m.choices[0].delta,content:null,thinking:{content:f.reasoningContent(),signature:_}}}]};delete y.choices[0].delta.reasoning_content;let k=`data: ${JSON.stringify(y)}
|
|
214
214
|
|
|
215
|
-
`;h.enqueue(
|
|
215
|
+
`;h.enqueue(g.encode(k))}if(m.choices?.[0]?.delta?.reasoning_content&&delete m.choices[0].delta.reasoning_content,m.choices?.[0]?.delta&&Object.keys(m.choices[0].delta).length>0){f.isReasoningComplete()&&m.choices[0].index++;let _=`data: ${JSON.stringify(m)}
|
|
216
216
|
|
|
217
|
-
`;h.enqueue(
|
|
218
|
-
`))}else h.enqueue(
|
|
219
|
-
`))};try{for(;;){let{done:d,value:
|
|
220
|
-
`);a=
|
|
217
|
+
`;h.enqueue(g.encode(_))}}catch{h.enqueue(g.encode(d+`
|
|
218
|
+
`))}else h.enqueue(g.encode(d+`
|
|
219
|
+
`))};try{for(;;){let{done:d,value:f}=await l.read();if(d){a.trim()&&u(a,c,o);break}let h=t.decode(f,{stream:!0});a+=h;let g=a.split(`
|
|
220
|
+
`);a=g.pop()||"";for(let m of g)if(m.trim())try{p(m,{controller:c,encoder:o,reasoningContent:()=>r,appendReasoningContent:_=>r+=_,isReasoningComplete:()=>s,setReasoningComplete:_=>s=_})}catch(_){console.error("Error processing line:",m,_),c.enqueue(o.encode(m+`
|
|
221
221
|
`))}}}catch(d){console.error("Stream error:",d),c.error(d)}finally{try{l.releaseLock()}catch(d){console.error("Error releasing reader lock:",d)}c.close()}}});return new Response(i,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});var Cn,oa=R(()=>{"use strict";Cn=class{constructor(e){this.options=e;this.max_tokens=this.options?.max_tokens,this.temperature=this.options?.temperature,this.top_p=this.options?.top_p,this.top_k=this.options?.top_k,this.repetition_penalty=this.options?.repetition_penalty}static TransformerName="sampling";max_tokens;temperature;top_p;top_k;repetition_penalty;async transformRequestIn(e){return e.max_tokens&&e.max_tokens>this.max_tokens&&(e.max_tokens=this.max_tokens),typeof this.temperature<"u"&&(e.temperature=this.temperature),typeof this.top_p<"u"&&(e.top_p=this.top_p),typeof this.top_k<"u"&&(e.top_k=this.top_k),typeof this.repetition_penalty<"u"&&(e.repetition_penalty=this.repetition_penalty),e}}});var Rn,ra=R(()=>{"use strict";Rn=class{static TransformerName="maxcompletiontokens";async transformRequestIn(e){return e.max_tokens&&(e.max_completion_tokens=e.max_tokens,delete e.max_tokens),e}}});function sa(n){let e=[];for(let o=0;o<n.messages.length;o++){let r=n.messages[o],s=o===n.messages.length-1,a=r.role==="assistant",i=[];typeof r.content=="string"?i.push({type:"text",text:r.content}):Array.isArray(r.content)&&r.content.forEach(c=>{c.type==="text"?i.push({type:"text",text:c.text||""}):c.type==="image_url"&&i.push({type:"image",source:{type:"base64",media_type:c.media_type||"image/jpeg",data:c.image_url.url}})}),!(!s&&i.length===0&&!r.tool_calls&&!r.content)&&(s&&a&&i.length===0&&r.tool_calls&&i.push({type:"text",text:""}),e.push({role:r.role==="assistant"?"assistant":"user",content:i}))}let t={anthropic_version:"vertex-2023-10-16",messages:e,max_tokens:n.max_tokens||1e3,stream:n.stream||!1,...n.temperature&&{temperature:n.temperature}};return n.tools&&n.tools.length>0&&(t.tools=n.tools.map(o=>({name:o.function.name,description:o.function.description,input_schema:o.function.parameters}))),n.tool_choice&&(n.tool_choice==="auto"||n.tool_choice==="none"?t.tool_choice=n.tool_choice:typeof n.tool_choice=="string"&&(t.tool_choice={type:"tool",name:n.tool_choice})),t}function ia(n){let e=n,o={messages:e.messages.map(r=>{let s=r.content.map(a=>a.type==="text"?{type:"text",text:a.text||""}:a.type==="image"&&a.source?{type:"image_url",image_url:{url:a.source.data},media_type:a.source.media_type}:{type:"text",text:""});return{role:r.role,content:s}}),model:n.model||"claude-sonnet-4@20250514",max_tokens:e.max_tokens,temperature:e.temperature,stream:e.stream};return e.tools&&e.tools.length>0&&(o.tools=e.tools.map(r=>({type:"function",function:{name:r.name,description:r.description,parameters:{type:"object",properties:r.input_schema.properties,required:r.input_schema.required,additionalProperties:r.input_schema.additionalProperties,$schema:r.input_schema.$schema}}}))),e.tool_choice&&(typeof e.tool_choice=="string"?o.tool_choice=e.tool_choice:e.tool_choice.type==="tool"&&(o.tool_choice=e.tool_choice.name)),o}async function aa(n,e,t){if(n.headers.get("Content-Type")?.includes("application/json")){let o=await n.json(),r;o.tool_use&&o.tool_use.length>0&&(r=o.tool_use.map(a=>({id:a.id,type:"function",function:{name:a.name,arguments:JSON.stringify(a.input)}})));let s={id:o.id,choices:[{finish_reason:o.stop_reason||null,index:0,message:{content:o.content[0]?.text||"",role:"assistant",...r&&{tool_calls:r}}}],created:parseInt(new Date().getTime()/1e3+"",10),model:o.model,object:"chat.completion",usage:{completion_tokens:o.usage.output_tokens,prompt_tokens:o.usage.input_tokens,total_tokens:o.usage.input_tokens+o.usage.output_tokens}};return new Response(JSON.stringify(s),{status:n.status,statusText:n.statusText,headers:n.headers})}else if(n.headers.get("Content-Type")?.includes("stream")){if(!n.body)return n;let o=new TextDecoder,r=new TextEncoder,s=(i,c)=>{if(i.startsWith("data: ")){let l=i.slice(6).trim();if(l){t?.debug({chunkStr:l},`${e} chunk:`);try{let u=JSON.parse(l);if(u.type==="content_block_delta"&&u.delta?.type==="text_delta"){let p={choices:[{delta:{role:"assistant",content:u.delta.text||""},finish_reason:null,index:0,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:u.id||"",model:u.model||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1",usage:{completion_tokens:u.usage?.output_tokens||0,prompt_tokens:u.usage?.input_tokens||0,total_tokens:(u.usage?.input_tokens||0)+(u.usage?.output_tokens||0)}};c.enqueue(r.encode(`data: ${JSON.stringify(p)}
|
|
222
222
|
|
|
223
223
|
`))}else if(u.type==="content_block_delta"&&u.delta?.type==="input_json_delta"){let p={choices:[{delta:{tool_calls:[{index:u.index||0,function:{arguments:u.delta.partial_json||""}}]},finish_reason:null,index:0,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:u.id||"",model:u.model||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1",usage:{completion_tokens:u.usage?.output_tokens||0,prompt_tokens:u.usage?.input_tokens||0,total_tokens:(u.usage?.input_tokens||0)+(u.usage?.output_tokens||0)}};c.enqueue(r.encode(`data: ${JSON.stringify(p)}
|
|
@@ -231,25 +231,25 @@ Examples:
|
|
|
231
231
|
`));else{let p={choices:[{delta:{role:"assistant",content:u.content?.[0]?.text||""},finish_reason:u.stop_reason?.toLowerCase()||null,index:0,logprobs:null}],created:parseInt(new Date().getTime()/1e3+"",10),id:u.id||"",model:u.model||"",object:"chat.completion.chunk",system_fingerprint:"fp_a49d71b8a1",usage:{completion_tokens:u.usage?.output_tokens||0,prompt_tokens:u.usage?.input_tokens||0,total_tokens:(u.usage?.input_tokens||0)+(u.usage?.output_tokens||0)}};c.enqueue(r.encode(`data: ${JSON.stringify(p)}
|
|
232
232
|
|
|
233
233
|
`))}}catch(u){t?.error(`Error parsing ${e} stream chunk`,l,u.message)}}}},a=new ReadableStream({async start(i){let c=n.body.getReader(),l="";try{for(;;){let{done:u,value:p}=await c.read();if(u){l&&s(l,i);break}l+=o.decode(p,{stream:!0});let d=l.split(`
|
|
234
|
-
`);l=d.pop()||"";for(let
|
|
234
|
+
`);l=d.pop()||"";for(let f of d)s(f,i)}}catch(u){i.error(u)}finally{i.close()}}});return new Response(a,{status:n.status,statusText:n.statusText,headers:n.headers})}return n}var ca=R(()=>{"use strict"});async function fd(){try{let{GoogleAuth:n}=await import("google-auth-library");return(await(await new n({scopes:["https://www.googleapis.com/auth/cloud-platform"]}).getClient()).getAccessToken()).token||""}catch(n){throw console.error("Error getting access token:",n),new Error(`Failed to get access token for Vertex AI. Please ensure you have set up authentication using one of these methods:
|
|
235
235
|
1. Set GOOGLE_APPLICATION_CREDENTIALS to point to service account key file
|
|
236
236
|
2. Run "gcloud auth application-default login"
|
|
237
|
-
3. Use Google Cloud environment with default service account`)}}var wn,la=R(()=>{"use strict";ca();wn=class{name="vertex-claude";async transformRequestIn(e,t){let o=process.env.GOOGLE_CLOUD_PROJECT,r=process.env.GOOGLE_CLOUD_LOCATION||"us-east5";if(!o&&process.env.GOOGLE_APPLICATION_CREDENTIALS)try{let i=(await import("fs")).readFileSync(process.env.GOOGLE_APPLICATION_CREDENTIALS,"utf8"),c=JSON.parse(i);c&&c.project_id&&(o=c.project_id)}catch(a){console.error("Error extracting project_id from GOOGLE_APPLICATION_CREDENTIALS:",a)}if(!o)throw new Error("Project ID is required for Vertex AI. Set GOOGLE_CLOUD_PROJECT environment variable or ensure project_id is in GOOGLE_APPLICATION_CREDENTIALS file.");let s=await fd();return{body:sa(e),config:{url:new URL(`/v1/projects/${o}/locations/${r}/publishers/anthropic/models/${e.model}:${e.stream?"streamRawPredict":"rawPredict"}`,`https://${r}-aiplatform.googleapis.com`).toString(),headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json"}}}}async transformRequestOut(e){return ia(e)}async transformResponseOut(e){return aa(e,this.name,this.logger)}}});var Pn,ua=R(()=>{"use strict";Pn=class{name="cerebras";async transformRequestIn(e,t){let o=JSON.parse(JSON.stringify(e));return o.reasoning?delete o.reasoning:o.disable_reasoning=!1,{body:o,config:{headers:{Authorization:`Bearer ${t.apiKey}`,"Content-Type":"application/json"}}}}async transformResponseOut(e){return e}}});var En,da=R(()=>{"use strict";En=class{name="streamoptions";async transformRequestIn(e){return e.stream&&(e.stream_options={include_usage:!0}),e}}});var An,pa=R(()=>{"use strict";An=class{name="OpenAI";endPoint="/v1/chat/completions"}});var On,fa=R(()=>{"use strict";On=class{static TransformerName="customparams";options;constructor(e={}){this.options=e}async transformRequestIn(e){let t={...e},o=Object.entries(this.options);for(let[r,s]of o)if(r in t)if(typeof t[r]=="object"&&typeof s=="object"&&!Array.isArray(t[r])&&!Array.isArray(s)&&t[r]!==null&&s!==null)t[r]=this.deepMergeObjects(t[r],s);else continue;else t[r]=this.cloneValue(s);return t}async transformResponseOut(e){return e}deepMergeObjects(e,t){let o={...e};for(let[r,s]of Object.entries(t))r in o&&typeof o[r]=="object"&&typeof s=="object"&&!Array.isArray(o[r])&&!Array.isArray(s)&&o[r]!==null&&s!==null?o[r]=this.deepMergeObjects(o[r],s):o[r]=this.cloneValue(s);return o}cloneValue(e){if(e===null||typeof e!="object")return e;if(Array.isArray(e))return e.map(o=>this.cloneValue(o));let t={};for(let[o,r]of Object.entries(e))t[o]=this.cloneValue(r);return t}}});import{v4 as md}from"uuid";var In,ma=R(()=>{"use strict";V();In=class{constructor(e){this.options=e}static TransformerName="vercel";endPoint="/v1/chat/completions";async transformRequestIn(e){return e.model.includes("claude")?e.messages.forEach(t=>{Array.isArray(t.content)&&t.content.forEach(o=>{o.type==="image_url"&&(o.image_url.url.startsWith("http")||(o.image_url.url=`data:${o.media_type};base64,${o.image_url.url}`),delete o.media_type)})}):e.messages.forEach(t=>{Array.isArray(t.content)?t.content.forEach(o=>{o.cache_control&&delete o.cache_control,o.type==="image_url"&&(o.image_url.url.startsWith("http")||(o.image_url.url=`data:${o.media_type};base64,${o.image_url.url}`),delete o.media_type)}):t.cache_control&&delete t.cache_control}),Object.assign(e,this.options||{}),e}async transformResponseOut(e){if(e.headers.get("Content-Type")?.includes("application/json")){let t=await F(e);return new Response(JSON.stringify(t),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let t=new TextDecoder,o=new TextEncoder,r=!1,s="",a=!1,i=!1,c="",l=new ReadableStream({async start(u){let p=e.body.getReader(),d=(h,
|
|
238
|
-
`);for(let b of _)b.trim()&&
|
|
239
|
-
`))},
|
|
237
|
+
3. Use Google Cloud environment with default service account`)}}var wn,la=R(()=>{"use strict";ca();wn=class{name="vertex-claude";async transformRequestIn(e,t){let o=process.env.GOOGLE_CLOUD_PROJECT,r=process.env.GOOGLE_CLOUD_LOCATION||"us-east5";if(!o&&process.env.GOOGLE_APPLICATION_CREDENTIALS)try{let i=(await import("fs")).readFileSync(process.env.GOOGLE_APPLICATION_CREDENTIALS,"utf8"),c=JSON.parse(i);c&&c.project_id&&(o=c.project_id)}catch(a){console.error("Error extracting project_id from GOOGLE_APPLICATION_CREDENTIALS:",a)}if(!o)throw new Error("Project ID is required for Vertex AI. Set GOOGLE_CLOUD_PROJECT environment variable or ensure project_id is in GOOGLE_APPLICATION_CREDENTIALS file.");let s=await fd();return{body:sa(e),config:{url:new URL(`/v1/projects/${o}/locations/${r}/publishers/anthropic/models/${e.model}:${e.stream?"streamRawPredict":"rawPredict"}`,`https://${r}-aiplatform.googleapis.com`).toString(),headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json"}}}}async transformRequestOut(e){return ia(e)}async transformResponseOut(e){return aa(e,this.name,this.logger)}}});var Pn,ua=R(()=>{"use strict";Pn=class{name="cerebras";async transformRequestIn(e,t){let o=JSON.parse(JSON.stringify(e));return o.reasoning?delete o.reasoning:o.disable_reasoning=!1,{body:o,config:{headers:{Authorization:`Bearer ${t.apiKey}`,"Content-Type":"application/json"}}}}async transformResponseOut(e){return e}}});var En,da=R(()=>{"use strict";En=class{name="streamoptions";async transformRequestIn(e){return e.stream&&(e.stream_options={include_usage:!0}),e}}});var An,pa=R(()=>{"use strict";An=class{name="OpenAI";endPoint="/v1/chat/completions"}});var On,fa=R(()=>{"use strict";On=class{static TransformerName="customparams";options;constructor(e={}){this.options=e}async transformRequestIn(e){let t={...e},o=Object.entries(this.options);for(let[r,s]of o)if(r in t)if(typeof t[r]=="object"&&typeof s=="object"&&!Array.isArray(t[r])&&!Array.isArray(s)&&t[r]!==null&&s!==null)t[r]=this.deepMergeObjects(t[r],s);else continue;else t[r]=this.cloneValue(s);return t}async transformResponseOut(e){return e}deepMergeObjects(e,t){let o={...e};for(let[r,s]of Object.entries(t))r in o&&typeof o[r]=="object"&&typeof s=="object"&&!Array.isArray(o[r])&&!Array.isArray(s)&&o[r]!==null&&s!==null?o[r]=this.deepMergeObjects(o[r],s):o[r]=this.cloneValue(s);return o}cloneValue(e){if(e===null||typeof e!="object")return e;if(Array.isArray(e))return e.map(o=>this.cloneValue(o));let t={};for(let[o,r]of Object.entries(e))t[o]=this.cloneValue(r);return t}}});import{v4 as md}from"uuid";var In,ma=R(()=>{"use strict";V();In=class{constructor(e){this.options=e}static TransformerName="vercel";endPoint="/v1/chat/completions";async transformRequestIn(e){return e.model.includes("claude")?e.messages.forEach(t=>{Array.isArray(t.content)&&t.content.forEach(o=>{o.type==="image_url"&&(o.image_url.url.startsWith("http")||(o.image_url.url=`data:${o.media_type};base64,${o.image_url.url}`),delete o.media_type)})}):e.messages.forEach(t=>{Array.isArray(t.content)?t.content.forEach(o=>{o.cache_control&&delete o.cache_control,o.type==="image_url"&&(o.image_url.url.startsWith("http")||(o.image_url.url=`data:${o.media_type};base64,${o.image_url.url}`),delete o.media_type)}):t.cache_control&&delete t.cache_control}),Object.assign(e,this.options||{}),e}async transformResponseOut(e){if(e.headers.get("Content-Type")?.includes("application/json")){let t=await F(e);return new Response(JSON.stringify(t),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let t=new TextDecoder,o=new TextEncoder,r=!1,s="",a=!1,i=!1,c="",l=new ReadableStream({async start(u){let p=e.body.getReader(),d=(h,g,m)=>{let _=h.split(`
|
|
238
|
+
`);for(let b of _)b.trim()&&g.enqueue(m.encode(b+`
|
|
239
|
+
`))},f=(h,g)=>{let{controller:m,encoder:_}=g;if(h.startsWith("data: ")&&h.trim()!=="data: [DONE]"){let b=h.slice(6);try{let y=JSON.parse(b);if(y.usage&&(this.logger?.debug({usage:y.usage,hasToolCall:i},"usage"),y.choices[0].finish_reason=i?"tool_calls":"stop"),y.choices?.[0]?.finish_reason==="error"&&m.enqueue(_.encode(`data: ${JSON.stringify({error:y.choices?.[0].error})}
|
|
240
240
|
|
|
241
|
-
`)),y.choices?.[0]?.delta?.content&&!
|
|
241
|
+
`)),y.choices?.[0]?.delta?.content&&!g.hasTextContent()&&g.setHasTextContent(!0),y.choices?.[0]?.delta?.reasoning){g.appendReasoningContent(y.choices[0].delta.reasoning);let v={...y,choices:[{...y.choices?.[0],delta:{...y.choices[0].delta,thinking:{content:y.choices[0].delta.reasoning}}}]};v.choices?.[0]?.delta&&delete v.choices[0].delta.reasoning;let x=`data: ${JSON.stringify(v)}
|
|
242
242
|
|
|
243
|
-
`;
|
|
243
|
+
`;m.enqueue(_.encode(x));return}if(y.choices?.[0]?.delta?.content&&g.reasoningContent()&&!g.isReasoningComplete()){g.setReasoningComplete(!0);let x={...y,choices:[{...y.choices?.[0],delta:{...y.choices[0].delta,content:null,thinking:{content:g.reasoningContent(),signature:"ccr_think_signature"}}}]};x.choices?.[0]?.delta&&delete x.choices[0].delta.reasoning;let T=`data: ${JSON.stringify(x)}
|
|
244
244
|
|
|
245
|
-
`;
|
|
245
|
+
`;m.enqueue(_.encode(T))}y.choices?.[0]?.delta?.reasoning&&delete y.choices[0].delta.reasoning,y.choices?.[0]?.delta?.tool_calls?.length&&!Number.isNaN(parseInt(y.choices?.[0]?.delta?.tool_calls[0].id,10))&&y.choices?.[0]?.delta?.tool_calls.forEach(v=>{v.id=`call_${md()}`}),y.choices?.[0]?.delta?.tool_calls?.length&&!i&&(i=!0),y.choices?.[0]?.delta?.tool_calls?.length&&g.hasTextContent()&&(typeof y.choices[0].index=="number"?y.choices[0].index+=1:y.choices[0].index=1);let k=`data: ${JSON.stringify(y)}
|
|
246
246
|
|
|
247
|
-
`;
|
|
248
|
-
`))}}else
|
|
249
|
-
`))};try{for(;;){let{done:h,value:
|
|
250
|
-
`);c=b.pop()||"";for(let y of b)if(y.trim())try{
|
|
247
|
+
`;m.enqueue(_.encode(k))}catch{m.enqueue(_.encode(h+`
|
|
248
|
+
`))}}else m.enqueue(_.encode(h+`
|
|
249
|
+
`))};try{for(;;){let{done:h,value:g}=await p.read();if(h){c.trim()&&d(c,u,o);break}if(!g||g.length===0)continue;let m;try{m=t.decode(g,{stream:!0})}catch(b){console.warn("Failed to decode chunk",b);continue}if(m.length===0)continue;if(c+=m,c.length>1e6){console.warn("Buffer size exceeds limit, processing partial data");let b=c.split(`
|
|
250
|
+
`);c=b.pop()||"";for(let y of b)if(y.trim())try{f(y,{controller:u,encoder:o,hasTextContent:()=>r,setHasTextContent:k=>r=k,reasoningContent:()=>s,appendReasoningContent:k=>s+=k,isReasoningComplete:()=>a,setReasoningComplete:k=>a=k})}catch(k){console.error("Error processing line:",y,k),u.enqueue(o.encode(y+`
|
|
251
251
|
`))}continue}let _=c.split(`
|
|
252
|
-
`);c=_.pop()||"";for(let b of _)if(b.trim())try{
|
|
252
|
+
`);c=_.pop()||"";for(let b of _)if(b.trim())try{f(b,{controller:u,encoder:o,hasTextContent:()=>r,setHasTextContent:y=>r=y,reasoningContent:()=>s,appendReasoningContent:y=>s+=y,isReasoningComplete:()=>a,setReasoningComplete:y=>a=y})}catch(y){console.error("Error processing line:",b,y),u.enqueue(o.encode(b+`
|
|
253
253
|
`))}}}catch(h){console.error("Stream error:",h),u.error(h)}finally{try{p.releaseLock()}catch(h){console.error("Error releasing reader lock:",h)}u.close()}}});return new Response(l,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});var rr,gd,Mn,ga=R(()=>{"use strict";V();rr=`Always think before answering. Even if the problem seems simple, always write down your reasoning process explicitly.
|
|
254
254
|
|
|
255
255
|
Output format:
|
|
@@ -257,57 +257,57 @@ Output format:
|
|
|
257
257
|
Your detailed thinking process goes here
|
|
258
258
|
</reasoning_content>
|
|
259
259
|
Your final answer must follow after the closing tag above.`,gd=10,Mn=class{name="forcereasoning";async transformRequestIn(e){let t=0;e.messages.filter(r=>r.role==="assistant").reverse().forEach(r=>{r.thinking&&(r.thinking.content&&(!r.content||t<gd)&&(t++,r.content=`<reasoning_content>${r.thinking.content}</reasoning_content>
|
|
260
|
-
${r.content}`),delete r.thinking)});let o=e.messages[e.messages.length-1];return o.role==="user"&&(Array.isArray(o.content)?o.content.push({type:"text",text:rr}):o.content=[{type:"text",text:rr},{type:"text",text:o.content||""}]),o.role==="tool"&&e.messages.push({role:"user",content:[{type:"text",text:rr}]}),e}async transformResponseOut(e){let t="<reasoning_content>",o="</reasoning_content>";if(e.headers.get("Content-Type")?.includes("application/json")){let r=await F(e);if(r.choices[0]?.message.content){let s=/<reasoning_content>(.*?)<\/reasoning_content>/s,a=r.choices[0]?.message.content.match(s);a&&a[1]&&(r.thinking={content:a[1]})}return new Response(JSON.stringify(r),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let r=0,s=new TextDecoder,a=new TextEncoder,i=new ReadableStream({async start(c){let l=e.body.getReader(),u="",p="SEARCHING",d="",
|
|
260
|
+
${r.content}`),delete r.thinking)});let o=e.messages[e.messages.length-1];return o.role==="user"&&(Array.isArray(o.content)?o.content.push({type:"text",text:rr}):o.content=[{type:"text",text:rr},{type:"text",text:o.content||""}]),o.role==="tool"&&e.messages.push({role:"user",content:[{type:"text",text:rr}]}),e}async transformResponseOut(e){let t="<reasoning_content>",o="</reasoning_content>";if(e.headers.get("Content-Type")?.includes("application/json")){let r=await F(e);if(r.choices[0]?.message.content){let s=/<reasoning_content>(.*?)<\/reasoning_content>/s,a=r.choices[0]?.message.content.match(s);a&&a[1]&&(r.thinking={content:a[1]})}return new Response(JSON.stringify(r),{status:e.status,statusText:e.statusText,headers:e.headers})}else if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let r=0,s=new TextDecoder,a=new TextEncoder,i=new ReadableStream({async start(c){let l=e.body.getReader(),u="",p="SEARCHING",d="",f="",h=(g,m)=>{if(typeof m!="string"){g.choices?.[0]?.delta&&Object.keys(g.choices[0].delta).length>0&&!g.choices[0].delta.content&&(g.choices[0].index=r,c.enqueue(a.encode(`data: ${JSON.stringify(g)}
|
|
261
261
|
|
|
262
|
-
`)));return}let _=d+
|
|
262
|
+
`)));return}let _=d+m;for(d="";_.length>0;)if(p==="SEARCHING"){let b=_.indexOf(t);if(b!==-1)_=_.substring(b+t.length),p="REASONING";else{for(let y=t.length-1;y>0;y--)if(_.endsWith(t.substring(0,y))){d=_.substring(_.length-y);break}_=""}}else if(p==="REASONING"){let b=_.indexOf(o);if(b!==-1){let y=_.substring(0,b);if(y.length>0){let x={...g.choices[0].delta,thinking:{content:y}};delete x.content;let T={...g,choices:[{...g.choices[0],delta:x,index:r}]};c.enqueue(a.encode(`data: ${JSON.stringify(T)}
|
|
263
263
|
|
|
264
|
-
`))}let k={...
|
|
264
|
+
`))}let k={...g.choices[0].delta,thinking:{signature:"ccr_think_signature"}};delete k.content;let v={...g,choices:[{...g.choices[0],delta:k,index:r}]};c.enqueue(a.encode(`data: ${JSON.stringify(v)}
|
|
265
265
|
|
|
266
|
-
`)),r++,_=_.substring(b+o.length),p="FINAL"}else{let y=_;for(let k=o.length-1;k>0;k--)if(_.endsWith(o.substring(0,k))){d=_.substring(_.length-k),y=_.substring(0,_.length-k);break}if(y.length>0){let k={...
|
|
266
|
+
`)),r++,_=_.substring(b+o.length),p="FINAL"}else{let y=_;for(let k=o.length-1;k>0;k--)if(_.endsWith(o.substring(0,k))){d=_.substring(_.length-k),y=_.substring(0,_.length-k);break}if(y.length>0){let k={...g.choices[0].delta,thinking:{content:y}};delete k.content;let v={...g,choices:[{...g.choices[0],delta:k,index:r}]};c.enqueue(a.encode(`data: ${JSON.stringify(v)}
|
|
267
267
|
|
|
268
|
-
`))}_=""}}else if(p==="FINAL"){if(_.length>0)if(/^\s*$/.test(_))
|
|
268
|
+
`))}_=""}}else if(p==="FINAL"){if(_.length>0)if(/^\s*$/.test(_))f+=_;else{let y=f+_,k={...g.choices[0].delta,content:y};k.thinking&&delete k.thinking;let v={...g,choices:[{...g.choices[0],delta:k}]};c.enqueue(a.encode(`data: ${JSON.stringify(v)}
|
|
269
269
|
|
|
270
|
-
`)),
|
|
270
|
+
`)),f=""}r++,_=""}};try{for(;;){let{done:g,value:m}=await l.read();if(g)break;let _=s.decode(m,{stream:!0});u+=_;let b=u.split(`
|
|
271
271
|
`);u=b.pop()||"";for(let y of b)if(y.trim()){if(y.trim()==="data: [DONE]"){c.enqueue(a.encode(y+`
|
|
272
272
|
|
|
273
273
|
`));break}if(y.startsWith("data:"))try{let k=JSON.parse(y.slice(5));h(k,k.choices?.[0]?.delta?.content)}catch{c.enqueue(a.encode(y+`
|
|
274
274
|
`))}else c.enqueue(a.encode(y+`
|
|
275
|
-
`))}}}catch(
|
|
275
|
+
`))}}}catch(g){console.error("Stream error:",g),c.error(g)}finally{try{l.releaseLock()}catch(g){console.error("Error releasing reader lock:",g)}if(p==="REASONING"){let m={choices:[{delta:{thinking:{signature:"ccr_think_signature"}}}]};c.enqueue(a.encode(`data: ${JSON.stringify(m)}
|
|
276
276
|
|
|
277
277
|
`))}c.close()}}});return new Response(i,{status:e.status,statusText:e.statusText,headers:{"Content-Type":e.headers.get("Content-Type")||"text/plain","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});var Ln,ha=R(()=>{"use strict";V();Ln=class{name="kimi";async transformRequestIn(e){return(e.thinking||e.reasoning?.enabled||e.messages.some(o=>o.thinking?.content))&&e.messages.forEach(o=>{if(o.role==="assistant"){let r=o.thinking?.content,s=o.thinking?.signature;r&&typeof r=="string"&&r.trim()&&(o.reasoning_content=r,s&&(o.reasoning_content_signature=s)),o.tool_calls&&o.tool_calls.length>0&&(o.reasoning_content||(o.reasoning_content="")),o.thinking&&delete o.thinking}}),e}async transformResponseOut(e){let t=e.headers.get("Content-Type");if(t?.includes("stream")){if(!e.body)return e;let o=new TextDecoder,r=new TextEncoder,s="",a="",i=new ReadableStream({async start(c){let l=e.body.getReader();try{for(;;){let{done:u,value:p}=await l.read();if(u){a.trim()&&c.enqueue(r.encode(a+`
|
|
278
|
-
`));break}let d=o.decode(p,{stream:!0});a+=d;let
|
|
279
|
-
`);a=
|
|
278
|
+
`));break}let d=o.decode(p,{stream:!0});a+=d;let f=a.split(`
|
|
279
|
+
`);a=f.pop()||"";for(let h of f)if(h.trim())if(h.startsWith("data: ")&&h.trim()!=="data: [DONE]")try{let g=JSON.parse(h.slice(6));if(g.choices?.[0]?.delta?.reasoning_content){s+=g.choices[0].delta.reasoning_content;let m={...g,choices:[{...g.choices[0],delta:{thinking:{content:g.choices[0].delta.reasoning_content}}}]};delete m.choices[0].delta.reasoning_content,c.enqueue(r.encode(`data: ${JSON.stringify(m)}
|
|
280
280
|
|
|
281
|
-
`));continue}if(
|
|
281
|
+
`));continue}if(g.choices?.[0]?.delta?.content&&s&&!g.choices[0]?.delta?.reasoning_content){let m=Date.now().toString(),_={...g,choices:[{...g.choices[0],delta:{content:null,thinking:{content:s,signature:m}}}]};c.enqueue(r.encode(`data: ${JSON.stringify(_)}
|
|
282
282
|
|
|
283
|
-
`)),s=""}
|
|
283
|
+
`)),s=""}g.choices?.[0]?.delta?.reasoning_content&&delete g.choices[0].delta.reasoning_content,g.choices?.[0]?.delta&&Object.keys(g.choices[0].delta).length>0&&c.enqueue(r.encode(`data: ${JSON.stringify(g)}
|
|
284
284
|
|
|
285
285
|
`))}catch{c.enqueue(r.encode(h+`
|
|
286
286
|
`))}else c.enqueue(r.encode(h+`
|
|
287
|
-
`))}}catch(u){c.error(u)}finally{try{l.releaseLock()}catch{}c.close()}}});return new Response(i,{status:e.status,statusText:e.statusText,headers:{"Content-Type":t||"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}if(t?.includes("application/json")){let o=await F(e);return o.choices?.[0]?.message?.reasoning_content&&(o.choices[0].message.thinking={content:o.choices[0].message.reasoning_content},delete o.choices[0].message.reasoning_content),new Response(JSON.stringify(o),{status:e.status,statusText:e.statusText,headers:e.headers})}return e}}});import{v4 as ya}from"uuid";var Nn,_a=R(()=>{"use strict";V();
|
|
288
|
-
`);for(let b of _)b.trim()&&
|
|
289
|
-
`))},
|
|
287
|
+
`))}}catch(u){c.error(u)}finally{try{l.releaseLock()}catch{}c.close()}}});return new Response(i,{status:e.status,statusText:e.statusText,headers:{"Content-Type":t||"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}if(t?.includes("application/json")){let o=await F(e);return o.choices?.[0]?.message?.reasoning_content&&(o.choices[0].message.thinking={content:o.choices[0].message.reasoning_content},delete o.choices[0].message.reasoning_content),new Response(JSON.stringify(o),{status:e.status,statusText:e.statusText,headers:e.headers})}return e}}});import{v4 as ya}from"uuid";var Nn,_a=R(()=>{"use strict";V();Ue();Nn=class{constructor(e){this.options=e}static TransformerName="opencode";endPoint="/v1/chat/completions";resolveSessionId(e,t){let o=t?.req,r=o?.headers||{},s=a=>{let i=Object.keys(r).find(l=>l.toLowerCase()===a),c=i?r[i]:void 0;return typeof c=="string"&&c.trim()?c.trim():void 0};return s("x-opencode-session")||o?.clientContext?.stableSessionId||o?.sessionId||he(e.metadata?.user_id)||s("session_id")||ya()}async transformRequestIn(e,t,o){let r=e.reasoning?.enabled||e.messages.some(s=>s.thinking?.content);return e.messages.forEach(s=>{if(Array.isArray(s.content)&&s.content.forEach(a=>{a.type==="image_url"&&(a.image_url.url.startsWith("http")||(a.image_url.url=`data:${a.media_type};base64,${a.image_url.url}`),delete a.media_type)}),s.role==="assistant"){let a=s.thinking?.content,i=s.thinking?.signature;a&&typeof a=="string"&&a.trim()?(s.reasoning_content=a,i&&(s.reasoning_content_signature=i)):r&&s.tool_calls?.length&&!s.reasoning_content&&(s.reasoning_content=" "),s.thinking&&delete s.thinking}}),Object.assign(e,this.options||{}),{body:e,config:{headers:{"x-opencode-session":this.resolveSessionId(e,o)}}}}async transformResponseOut(e){if(e.headers.get("Content-Type")?.includes("application/json")){let t=await F(e);return t.choices?.[0]?.message?.reasoning_content&&(t.choices[0].message.thinking={content:t.choices[0].message.reasoning_content},delete t.choices[0].message.reasoning_content),new Response(JSON.stringify(t),{status:e.status,statusText:e.statusText,headers:e.headers})}if(e.headers.get("Content-Type")?.includes("stream")){if(!e.body)return e;let t=new TextDecoder,o=new TextEncoder,r=!1,s="",a=!1,i=!1,c="",l=new ReadableStream({async start(u){let p=e.body.getReader(),d=(h,g,m)=>{let _=h.split(`
|
|
288
|
+
`);for(let b of _)b.trim()&&g.enqueue(m.encode(b+`
|
|
289
|
+
`))},f=(h,g)=>{let{controller:m,encoder:_}=g;if(h.startsWith("data: ")&&h.trim()!=="data: [DONE]")try{let b=JSON.parse(h.slice(6));if(b.usage&&(b.choices[0].finish_reason=i?"tool_calls":"stop"),b.choices?.[0]?.finish_reason==="error"){m.enqueue(_.encode(`data: ${JSON.stringify({error:b.choices?.[0]?.error})}
|
|
290
290
|
|
|
291
|
-
`));return}b.choices?.[0]?.delta?.content&&!
|
|
291
|
+
`));return}b.choices?.[0]?.delta?.content&&!g.hasTextContent()&&g.setHasTextContent(!0);let y=b.choices?.[0]?.delta?.reasoning||b.choices?.[0]?.delta?.reasoning_content;if(y){g.appendReasoningContent(y);let C={...b,choices:[{...b.choices?.[0],delta:{...b.choices[0].delta,thinking:{content:y}}}]};C.choices?.[0]?.delta&&(delete C.choices[0].delta.reasoning,delete C.choices[0].delta.reasoning_content),m.enqueue(_.encode(`data: ${JSON.stringify(C)}
|
|
292
292
|
|
|
293
|
-
`));return}if(b.choices?.[0]?.delta?.content&&
|
|
293
|
+
`));return}if(b.choices?.[0]?.delta?.content&&g.reasoningContent()&&!g.isReasoningComplete()){g.setReasoningComplete(!0);let C="ccr_think_signature",S=b.choices[0].delta.content,P={...b,choices:[{...b.choices?.[0],delta:{...b.choices[0].delta,content:null,thinking:{content:g.reasoningContent(),signature:C}}}]};P.choices?.[0]?.delta&&(delete P.choices[0].delta.reasoning,delete P.choices[0].delta.reasoning_content),m.enqueue(_.encode(`data: ${JSON.stringify(P)}
|
|
294
294
|
|
|
295
|
-
`));let I={...b,choices:[{...b.choices?.[0],delta:{...b.choices[0].delta,content:S}}]};I.choices?.[0]?.delta&&(delete I.choices[0].delta.reasoning,delete I.choices[0].delta.reasoning_content),
|
|
295
|
+
`));let I={...b,choices:[{...b.choices?.[0],delta:{...b.choices[0].delta,content:S}}]};I.choices?.[0]?.delta&&(delete I.choices[0].delta.reasoning,delete I.choices[0].delta.reasoning_content),m.enqueue(_.encode(`data: ${JSON.stringify(I)}
|
|
296
296
|
|
|
297
|
-
`));return}b.choices?.[0]?.delta?.reasoning&&delete b.choices[0].delta.reasoning,b.choices?.[0]?.delta?.reasoning_content&&delete b.choices[0].delta.reasoning_content,b.choices?.[0]?.delta?.tool_calls?.length&&!Number.isNaN(parseInt(b.choices?.[0]?.delta?.tool_calls[0].id,10))&&b.choices?.[0]?.delta?.tool_calls.forEach(C=>{C.id=`call_${ya()}`}),b.choices?.[0]?.delta?.tool_calls?.length&&!i&&(i=!0);let k=b.choices?.[0]?.delta,
|
|
297
|
+
`));return}b.choices?.[0]?.delta?.reasoning&&delete b.choices[0].delta.reasoning,b.choices?.[0]?.delta?.reasoning_content&&delete b.choices[0].delta.reasoning_content,b.choices?.[0]?.delta?.tool_calls?.length&&!Number.isNaN(parseInt(b.choices?.[0]?.delta?.tool_calls[0].id,10))&&b.choices?.[0]?.delta?.tool_calls.forEach(C=>{C.id=`call_${ya()}`}),b.choices?.[0]?.delta?.tool_calls?.length&&!i&&(i=!0);let k=b.choices?.[0]?.delta,v=k&&Object.keys(k).length>0,x=b.choices?.[0]?.finish_reason,T=b.usage;(v||x||T)&&m.enqueue(_.encode(`data: ${JSON.stringify(b)}
|
|
298
298
|
|
|
299
|
-
`))}catch{
|
|
300
|
-
`))}else
|
|
301
|
-
`))};try{for(;;){let{done:h,value:
|
|
302
|
-
`);c=b.pop()||"";for(let y of b)if(y.trim())try{
|
|
299
|
+
`))}catch{m.enqueue(_.encode(h+`
|
|
300
|
+
`))}else m.enqueue(_.encode(h+`
|
|
301
|
+
`))};try{for(;;){let{done:h,value:g}=await p.read();if(h){c.trim()&&d(c,u,o);break}if(!g||g.length===0)continue;let m;try{m=t.decode(g,{stream:!0})}catch(b){console.warn("Failed to decode chunk",b);continue}if(m.length===0)continue;if(c+=m,c.length>1e6){console.warn("Buffer size exceeds limit, processing partial data");let b=c.split(`
|
|
302
|
+
`);c=b.pop()||"";for(let y of b)if(y.trim())try{f(y,{controller:u,encoder:o,hasTextContent:()=>r,setHasTextContent:k=>r=k,reasoningContent:()=>s,appendReasoningContent:k=>s+=k,isReasoningComplete:()=>a,setReasoningComplete:k=>a=k})}catch(k){console.error("Error processing line:",y,k),u.enqueue(o.encode(y+`
|
|
303
303
|
`))}continue}let _=c.split(`
|
|
304
|
-
`);c=_.pop()||"";for(let b of _)if(b.trim())try{
|
|
305
|
-
`))}}}catch(h){console.error("Stream error:",h),u.error(h)}finally{try{p.releaseLock()}catch(h){console.error("Error releasing reader lock:",h)}u.close()}}});return new Response(l,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});function yd(n){if(typeof n=="number")return Number.isFinite(n)?n:void 0;if(typeof n!="string")return;let e=n.trim();if(!e)return;let t=e.toLowerCase();return["none","low","medium","high","max"].includes(t)?t:/^\d+$/.test(e)?parseInt(e,10):e}function _d(n){let e="";try{e=new URL(String(n||"")).pathname.replace(/\/+$/,"")}catch{return"chat"}return e.endsWith("/messages")?"anthropic":e.endsWith("/responses")?"responses":"chat"}var hd,$n,ba=R(()=>{"use strict";
|
|
304
|
+
`);c=_.pop()||"";for(let b of _)if(b.trim())try{f(b,{controller:u,encoder:o,hasTextContent:()=>r,setHasTextContent:y=>r=y,reasoningContent:()=>s,appendReasoningContent:y=>s+=y,isReasoningComplete:()=>a,setReasoningComplete:y=>a=y})}catch(y){console.error("Error processing line:",b,y),u.enqueue(o.encode(b+`
|
|
305
|
+
`))}}}catch(h){console.error("Stream error:",h),u.error(h)}finally{try{p.releaseLock()}catch(h){console.error("Error releasing reader lock:",h)}u.close()}}});return new Response(l,{status:e.status,statusText:e.statusText,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}return e}}});function yd(n){if(typeof n=="number")return Number.isFinite(n)?n:void 0;if(typeof n!="string")return;let e=n.trim();if(!e)return;let t=e.toLowerCase();return["none","low","medium","high","max"].includes(t)?t:/^\d+$/.test(e)?parseInt(e,10):e}function _d(n){let e="";try{e=new URL(String(n||"")).pathname.replace(/\/+$/,"")}catch{return"chat"}return e.endsWith("/messages")?"anthropic":e.endsWith("/responses")?"responses":"chat"}var hd,$n,ba=R(()=>{"use strict";Ge();hd={min:"low",minimal:"low",light:"low",xhigh:"max",maximum:"max",ultra:"max",ultracode:"max"};$n=class{constructor(e){this.options=e}static TransformerName="defaultthinking";async transformRequestIn(e,t){let o=yd(this.options?.level??this.options?.value);if(o===void 0||o==="none"||e.reasoning)return e;let r=_d(t?.baseUrl);if(typeof o=="number"){if(o<=0)return e;if(r==="anthropic")e.reasoning={enabled:!0,max_tokens:Math.max(1024,Math.floor(o))};else{let a=ye(o);r==="chat"?e.reasoning_effort=a:e.reasoning={enabled:!0,effort:a}}return e}if(o==="low"||o==="medium"||o==="high"||o==="max")return r==="chat"?e.reasoning_effort=o:e.reasoning={enabled:!0,effort:o},e;let s=hd[o.toLowerCase()];return s?(r==="anthropic"?e.reasoning={enabled:!0,effort:s}:r==="chat"?e.reasoning_effort=o:e.reasoning={enabled:!0,effort:o},e):(r==="chat"?e.reasoning_effort=o:r==="responses"&&(e.reasoning={enabled:!0,effort:o}),e)}}});function ka(n,e=!1){if(!n||typeof n!="object"||n.thinking)return!1;let t=n.reasoning,o=typeof t=="string"?t:t?.content;return typeof o=="string"&&o.length>0?(e&&typeof t=="object"?n.thinking={content:o}:(n.thinking=typeof t=="string"?{content:o}:{...t},delete n.reasoning),!0):typeof n.reasoning_content=="string"&&n.reasoning_content?(n.thinking={content:n.reasoning_content},!0):!1}var Dn,Ta=R(()=>{"use strict";Ge();V();Dn=class{static TransformerName="amd";name="amd";resolveEffort(e,t){if(!e)return;let o=(t??"").toLowerCase(),r=o.includes("glm"),s=!r&&o.includes("qwen"),a=!r&&!s&&o.includes("deepseek");if(e==="none")return a||o.split("/").pop()==="qwen3.8-flash-next"?"none":void 0;switch(e){case"minimal":return a?"minimal":"low";case"low":case"medium":return e;case"high":return s?"xhigh":"high";case"xhigh":case"max":return a?e:s?"xhigh":"high";default:return"medium"}}async transformRequestIn(e){let t=JSON.parse(JSON.stringify(e)),o=t.model,r=t.reasoning,s,a=r?.enabled===!1;r&&typeof r.effort=="string"?(s=r.effort===""?void 0:r.effort,a=a||r.effort==="none"):typeof r?.max_tokens=="number"?s=ye(r.max_tokens):r?.enabled===!0?s=t.reasoning_effort??"medium":(s=t.reasoning_effort,!a&&(t.enable_thinking===!1||t.thinking?.type==="disabled")&&(a=!0));let i=this.resolveEffort(a?"none":s,o);return i?t.reasoning_effort=i:delete t.reasoning_effort,delete t.reasoning,delete t.thinking,delete t.enable_thinking,t}async transformResponseOut(e){let t=e.headers.get("Content-Type")??"";if(t.includes("application/json")){if(!e.body)return e;let o=await de(e);if(o){let a=new Headers(e.headers);if(o.isSSE&&a.set("Content-Type","text/event-stream"),e=new Response(o.body,{status:e.status,statusText:e.statusText,headers:a}),o.isSSE)return this.transformStream(e)}else{let a=await me(e);if(e=a.response,a.isSSE)return this.transformStream(e)}let r=await F(e);this.liftMessageReasoning(r);let s=new Headers(e.headers);return s.delete("content-length"),new Response(JSON.stringify(r),{status:e.status,statusText:e.statusText,headers:s})}return(t.includes("stream")||t.includes("event-stream"))&&e.body?this.transformStream(e):e}liftMessageReasoning(e){if(Array.isArray(e?.choices))for(let t of e.choices)ka(t?.message)}transformStream(e){let t=new TextDecoder,o=new TextEncoder,r="",s=l=>{if(!l.startsWith("data:"))return l;let u=l.slice(5).trim();if(u==="[DONE]")return l;let p;try{p=JSON.parse(u)}catch{return l}let d=!1,f=Array.isArray(p?.choices)?p.choices:[];for(let h of f)ka(h?.delta,!0)&&(d=!0);return d?`data: ${JSON.stringify(p)}`:l},a=(l,u=!1)=>{let p=/\r\n|\r|\n/g,d=0,f,h="";for(;(f=p.exec(r))!==null&&!(!u&&f[0]==="\r"&&p.lastIndex===r.length);)h+=s(r.slice(d,f.index))+f[0],d=p.lastIndex;r=r.slice(d),u&&(h+=s(r),r=""),h&&l.enqueue(o.encode(h))},i=e.body.pipeThrough(new TransformStream({transform(l,u){r+=t.decode(l,{stream:!0}),a(u)},flush(l){r+=t.decode(),a(l,!0)}})),c=new Headers(e.headers);return c.delete("content-length"),new Response(i,{status:e.status,statusText:e.statusText,headers:c})}}});var va,xa=R(()=>{Wi();Ki();Gi();Vi();Qi();Yi();Xi();Zi();qi();ta();na();oa();ra();la();ua();da();pa();fa();ma();Bo();ga();ha();_a();ba();Ta();va={AnthropicTransformer:dn,GeminiTransformer:gn,VertexGeminiTransformer:hn,VertexClaudeTransformer:wn,DeepseekTransformer:yn,TooluseTransformer:_n,OpenrouterTransformer:bn,OpenAITransformer:An,MaxTokenTransformer:kn,GroqTransformer:Tn,CleancacheTransformer:vn,EnhanceToolTransformer:xn,ReasoningTransformer:Sn,SamplingTransformer:Cn,MaxCompletionTokens:Rn,CerebrasTransformer:Pn,StreamOptionsTransformer:En,CustomParamsTransformer:On,VercelTransformer:In,OpenAIResponsesTransformer:$e,ForceReasoningTransformer:Mn,KimiTransformer:Ln,OpenCodeTransformer:Nn,DefaultThinkingTransformer:$n,AmdTransformer:Dn}});var Qe,sr=R(()=>{"use strict";xa();Qe=class{constructor(e,t){this.configService=e;this.logger=t}transformers=new Map;preparePluginTransformer(e){if(typeof e.TransformerName=="string")return e;let t=new e;if(!t?.name)throw new Error("plugin transformer has no name");return t.logger=this.logger,t}registerTransformer(e,t){this.transformers.set(e,t),this.logger.info(`register transformer: ${e}${t.endPoint?` (endpoint: ${t.endPoint})`:" (no endpoint)"}`)}getTransformer(e){return this.transformers.get(e)}getAllTransformers(){return new Map(this.transformers)}getTransformersWithEndpoint(){let e=[];return this.transformers.forEach((t,o)=>{typeof t=="object"&&t.endPoint&&e.push({name:o,transformer:t})}),e}getTransformersWithoutEndpoint(){let e=[];return this.transformers.forEach((t,o)=>{typeof t=="object"&&!t.endPoint&&e.push({name:o,transformer:t})}),e}removeTransformer(e){return this.transformers.delete(e)}hasTransformer(e){return this.transformers.has(e)}async registerTransformerFromConfig(e){try{if(e.path){let t=ot(ot.resolve(e.path));if(t){let o=new t(e.options);if(o&&typeof o=="object"&&(o.logger=this.logger),!o.name)throw new Error(`Transformer instance from ${e.path} does not have a name property.`);return this.registerTransformer(o.name,o),!0}}return!1}catch(t){return this.logger.error(`load transformer (${e.path})
|
|
306
306
|
error: ${t.message}
|
|
307
307
|
stack: ${t.stack}`),!1}}async initialize(){try{await this.registerDefaultTransformersInternal(),await this.loadFromConfig()}catch(e){this.logger.error(`TransformerService init error: ${e.message}
|
|
308
308
|
Stack: ${e.stack}`)}}async registerDefaultTransformersInternal(){try{Object.values(va).forEach(e=>{if("TransformerName"in e&&typeof e.TransformerName=="string")this.registerTransformer(e.TransformerName,e);else{let t=new e;t&&typeof t=="object"&&(t.logger=this.logger),this.registerTransformer(t.name,t)}})}catch(e){this.logger.error({error:e},"transformer regist error:")}}async loadFromConfig(){let e=this.configService.get("transformers",[]);for(let t of e)await this.registerTransformerFromConfig(t)}}});import{get_encoding as bd}from"tiktoken";var yt,Sa=R(()=>{"use strict";yt=class{type="tiktoken";name;encoding;constructor(e="cl100k_base"){this.name=`tiktoken-${e}`;try{this.encoding=bd(e)}catch{throw new Error(`Failed to initialize tiktoken encoding: ${e}`)}}async initialize(){if(!this.encoding)throw new Error("Tiktoken encoding not initialized")}async countTokens(e){let t=this.encoding;if(!t)throw new Error("Encoding not initialized");let o=0,{messages:r,system:s,tools:a}=e;return Array.isArray(r)&&r.forEach(i=>{typeof i.content=="string"?o+=t.encode(i.content).length:Array.isArray(i.content)&&i.content.forEach(c=>{if(c.type==="text")o+=t.encode(c.text).length;else if(c.type==="tool_use")o+=t.encode(JSON.stringify(c.input)).length;else if(c.type==="tool_result"){let l=c.content;if(Array.isArray(l))for(let u of l)u?.type!=="image"&&(o+=t.encode(u?.type==="text"?String(u.text??""):JSON.stringify(u)).length);else{let u=typeof l=="string"?l:JSON.stringify(l);o+=t.encode(u).length}}})}),typeof s=="string"?o+=t.encode(s).length:Array.isArray(s)&&s.forEach(i=>{i.type==="text"&&(typeof i.text=="string"?o+=t.encode(i.text).length:Array.isArray(i.text)&&i.text.forEach(c=>{o+=t.encode(c||"").length}))}),a&&a.forEach(i=>{i.description&&(o+=t.encode(i.name+i.description).length),i.input_schema&&(o+=t.encode(JSON.stringify(i.input_schema)).length)}),o}isInitialized(){return this.encoding!==void 0}encodeText(e){let t=this.encoding;if(!t)throw new Error("Encoding not initialized");return Array.from(t.encode(e))}dispose(){this.encoding&&(this.encoding.free(),this.encoding=void 0)}}});import{join as Fn}from"path";import{homedir as kd}from"os";import{existsSync as ir,mkdirSync as Td}from"fs";import{promises as Un}from"fs";import{Tokenizer as vd}from"@huggingface/tokenizers";var jn,Ca=R(()=>{"use strict";jn=class{type="huggingface";name;modelId;logger;options;tokenizer=null;cacheDir;safeModelName;constructor(e,t,o={}){this.modelId=e,this.logger=t,this.options=o,this.cacheDir=o.cacheDir||Fn(kd(),".claude-code-router",".huggingface"),this.safeModelName=e.replace(/\//g,"_").replace(/[^a-zA-Z0-9_-]/g,"_"),this.name=`huggingface-${e.split("/").pop()}`}getCachePaths(){let e=Fn(this.cacheDir,this.safeModelName);return{modelDir:e,tokenizerJson:Fn(e,"tokenizer.json"),tokenizerConfig:Fn(e,"tokenizer_config.json")}}ensureDir(e){ir(e)||Td(e,{recursive:!0})}async loadFromCache(){try{let e=this.getCachePaths();if(!ir(e.tokenizerJson)||!ir(e.tokenizerConfig))return null;let[t,o]=await Promise.all([Un.readFile(e.tokenizerJson,"utf-8"),Un.readFile(e.tokenizerConfig,"utf-8")]);return{tokenizerJson:JSON.parse(t),tokenizerConfig:JSON.parse(o)}}catch(e){return this.logger?.warn(`Failed to load from cache: ${e.message}`),null}}async downloadAndCache(){let e=this.getCachePaths(),t={json:`https://huggingface.co/${this.modelId}/resolve/main/tokenizer.json`,config:`https://huggingface.co/${this.modelId}/resolve/main/tokenizer_config.json`};this.logger?.info(`Downloading tokenizer files for ${this.modelId}`);let o=new AbortController,r=setTimeout(()=>o.abort(),this.options.timeout||3e4);try{let[s,a]=await Promise.all([fetch(t.json,{signal:o.signal}),fetch(t.config,{signal:o.signal})]);if(!s.ok)throw new Error(`Failed to fetch tokenizer.json: ${s.statusText}`);let[i,c]=await Promise.all([s.json(),a.ok?a.json():Promise.resolve({})]);return this.ensureDir(e.modelDir),await Promise.all([Un.writeFile(e.tokenizerJson,JSON.stringify(i,null,2)),Un.writeFile(e.tokenizerConfig,JSON.stringify(c,null,2))]),{tokenizerJson:i,tokenizerConfig:c}}finally{clearTimeout(r)}}async initialize(){try{this.logger?.info(`Initializing HuggingFace tokenizer: ${this.modelId}`);let e=this.getCachePaths();this.ensureDir(this.cacheDir);let t=await this.loadFromCache()||await this.downloadAndCache();this.tokenizer=new vd(t.tokenizerJson,t.tokenizerConfig),this.logger?.info(`Tokenizer initialized: ${this.name}`)}catch(e){throw this.logger?.error(`Failed to initialize tokenizer: ${e.message}`),new Error(`Failed to initialize HuggingFace tokenizer for ${this.modelId}: ${e.message}`)}}async countTokens(e){if(!this.tokenizer)throw new Error("Tokenizer not initialized");try{let t=this.extractTextFromRequest(e);return this.tokenizer.encode(t).ids.length}catch(t){throw this.logger?.error(`Error counting tokens: ${t.message}`),t}}isInitialized(){return this.tokenizer!==null}encodeText(e){if(!this.tokenizer)throw new Error("Tokenizer not initialized");return this.tokenizer.encode(e).ids}dispose(){this.tokenizer=null}extractTextFromRequest(e){let t=[],{messages:o,system:r,tools:s}=e;if(Array.isArray(o)){for(let a of o)if(typeof a.content=="string")t.push(a.content);else if(Array.isArray(a.content)){for(let i of a.content)if(i.type==="text"&&i.text)t.push(i.text);else if(i.type==="tool_use"&&i.input)t.push(JSON.stringify(i.input));else if(i.type==="tool_result")if(Array.isArray(i.content))for(let c of i.content)c?.type!=="image"&&t.push(c?.type==="text"?String(c.text??""):JSON.stringify(c));else t.push(typeof i.content=="string"?i.content:JSON.stringify(i.content))}}if(typeof r=="string")t.push(r);else if(Array.isArray(r)){for(let a of r)if(a.type==="text"){if(typeof a.text=="string")t.push(a.text);else if(Array.isArray(a.text))for(let i of a.text)i&&t.push(i)}}if(s)for(let a of s)a.name&&t.push(a.name),a.description&&t.push(a.description),a.input_schema&&t.push(JSON.stringify(a.input_schema));return t.join(" ")}}});var Hn,Ra=R(()=>{"use strict";q();Hn=class{type="api";name;config;logger;options;constructor(e,t,o={}){if(!e.url||!e.apiKey)throw new Error("API tokenizer requires url and apiKey");this.config={url:e.url,apiKey:e.apiKey,requestFormat:e.requestFormat||"standard",responseField:e.responseField||"token_count",headers:e.headers||{}},this.logger=t,this.options=o;try{let r=new URL(e.url);this.name=`api-${r.hostname}`}catch{this.name=`api-${e.url}`}}async initialize(){try{new URL(this.config.url)}catch{throw new Error(`Invalid API URL: ${this.config.url}`)}}async countTokens(e){try{let t=this.formatRequestBody(e),o={"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`,...this.config.headers},r=new AbortController,s=setTimeout(()=>r.abort(),this.options.timeout||3e4),a={method:"POST",headers:o,body:JSON.stringify(t),signal:r.signal},i=this.options.resolveProxyUrl?.();i&&(a.dispatcher=K(i));let c=await fetch(this.config.url,a);if(clearTimeout(s),!c.ok)throw new Error(`API tokenizer request failed: ${c.status} ${c.statusText}`);let l=await c.json();return this.extractTokenCount(l)}catch(t){throw t.name==="AbortError"?new Error("API tokenizer request timed out"):t}}isInitialized(){return!0}dispose(){}formatRequestBody(e){switch(this.config.requestFormat){case"standard":return e;case"openai":return{model:"gpt-3.5-turbo",messages:this.extractMessagesAsOpenAIFormat(e)};case"anthropic":return{messages:e.messages||[],system:e.system,tools:e.tools};case"custom":return{text:this.extractConcatenatedText(e)};default:return e}}extractMessagesAsOpenAIFormat(e){return e.messages?e.messages.map(t=>({role:t.role,content:this.extractTextFromMessage(t)})):[]}extractTextFromMessage(e){return typeof e.content=="string"?e.content:Array.isArray(e.content)?e.content.map(t=>t.type==="text"&&t.text?t.text:t.type==="tool_use"&&t.input?JSON.stringify(t.input):t.type==="tool_result"?Array.isArray(t.content)?t.content.filter(o=>o?.type!=="image").map(o=>o?.type==="text"?String(o.text??""):JSON.stringify(o)).join(`
|
|
309
|
-
`):typeof t.content=="string"?t.content:JSON.stringify(t.content):"").join(" "):""}extractConcatenatedText(e){let t=[];return e.messages&&e.messages.forEach(o=>{t.push(this.extractTextFromMessage(o))}),typeof e.system=="string"?t.push(e.system):Array.isArray(e.system)&&e.system.forEach(o=>{o.type==="text"&&(typeof o.text=="string"?t.push(o.text):Array.isArray(o.text)&&o.text.forEach(r=>{r&&t.push(r)}))}),e.tools&&e.tools.forEach(o=>{o.name&&t.push(o.name),o.description&&t.push(o.description),o.input_schema&&t.push(JSON.stringify(o.input_schema))}),t.join(" ")}extractTokenCount(e){try{let t=this.config.responseField,o=t.split("."),r=e;for(let s of o){if(r==null)throw new Error(`Field path '${t}' not found in response`);r=r[s]}if(typeof r!="number")throw new Error(`Expected number at field path '${t}', got ${typeof r}`);return r}catch(t){throw this.logger?.error(`Failed to extract token count from API response: ${t.message}. Response: ${JSON.stringify(e)}`),new Error(`Invalid response from API tokenizer: ${t.message}`)}}}});var Qe,ar=R(()=>{"use strict";Sa();Ca();Ra();q();Qe=class{tokenizers=new Map;configService;logger;options;fallbackTokenizer;constructor(e,t,o={}){this.configService=e,this.logger=t,this.options={timeout:o.timeout??3e4,...o}}async initialize(){try{this.fallbackTokenizer=new yt("cl100k_base"),await this.fallbackTokenizer.initialize(),this.tokenizers.set("fallback",this.fallbackTokenizer),this.logger?.info("TokenizerService initialized successfully")}catch(e){throw this.logger?.error(`TokenizerService initialization error: ${e.message}`),e}}async getTokenizer(e,t){let o=this.getCacheKey(e,t);if(this.tokenizers.has(o))return this.tokenizers.get(o);let r;try{switch(e.type){case"tiktoken":r=new yt(e.encoding||"cl100k_base");break;case"huggingface":this.logger?.info(`Initializing HuggingFace tokenizer for model: ${e.model}`),r=new jn(e.model,this.logger,{timeout:this.options.timeout});break;case"api":r=new Hn(e,this.logger,{timeout:this.options.timeout,resolveProxyUrl:()=>{let s=t?this.getRawProvider(t):void 0;return ue(this.configService,s)}});break;default:throw new Error(`Unknown tokenizer type: ${e.type}`)}return this.logger?.info(`Calling initialize() on ${e.type} tokenizer...`),await r.initialize(),this.tokenizers.set(o,r),this.logger?.info(`Tokenizer initialized successfully: ${e.type} (${o})`),r}catch(s){return this.logger?.error(`Failed to initialize ${e.type} tokenizer: ${s.message}`),this.logger?.error(`Error stack: ${s.stack}`),this.fallbackTokenizer||await this.initialize(),this.fallbackTokenizer}}async countTokens(e,t,o){let r=t?await this.getTokenizer(t,o):this.fallbackTokenizer;return{tokenCount:await r.countTokens(e),tokenizerUsed:r.name,cached:!1}}getTokenizerConfigForModel(e,t){let r=(this.configService.get("providers")||[]).find(s=>s.name===e);if(r?.tokenizer)return r.tokenizer.models?.[t]?r.tokenizer.models[t]:r.tokenizer.default}dispose(){this.tokenizers.forEach(e=>{try{e.dispose()}catch(t){this.logger?.error(`Error disposing tokenizer: ${t}`)}}),this.tokenizers.clear()}getCacheKey(e,t){switch(e.type){case"tiktoken":return`tiktoken:${e.encoding||"cl100k_base"}`;case"huggingface":return`hf:${e.model}`;case"api":return`api:${t||"unscoped"}:${e.url}`;default:return`unknown:${JSON.stringify(e)}`}}getRawProvider(e){return(this.configService.get("providers")||[]).find(o=>o?.name===e)}}});function wa(n){if(!n||typeof n!="object"||Ed(n))return null;for(let t of Pd(n)){let o=wd(t);if(o)return o}return null}function wd(n){if(!n||typeof n!="object")return null;let e={},t=zn(n,xd);if(t!==void 0){let a=Pa(t);e.usedDailyBalance=a,e.limitDaily=100}let o=zn(n,Sd);if(o!==void 0){let a=Pa(o);e.usedBalance=a,e.totalBalance=100}let r=zn(n,Cd);if(r!==void 0){let a=Ea(r);a&&(e.resetTime=a)}let s=zn(n,Rd);if(s!==void 0){let a=Ea(s);a&&(e.resetTime7d=a,e.resetTime||(e.resetTime=a))}return e.usedDailyBalance===void 0&&e.limitDaily===void 0&&e.usedBalance===void 0&&e.totalBalance===void 0&&e.resetTime===void 0?null:e}function Pa(n){return!Number.isFinite(n)||n<=0?0:Math.round(n*1e4)/100}function zn(n,e){for(let t of e){let o=L(n?.[t]);if(o!==void 0)return o}}function Pd(n){let e=[],t=new WeakSet,o=["data","Data","DataV2"],r=s=>{if(!(!s||typeof s!="object")&&!t.has(s)){t.add(s),e.push(s);for(let a of o)s[a]&&typeof s[a]=="object"&&r(s[a])}};return r(n),e}function Ed(n){let e=n?.data;return e&&typeof e=="object"&&(e.success===!1||e.errorCode||e.errorMsg)?String(e.errorCode||e.errorMsg||"gateway-error"):null}function Ea(n){if(typeof n!="string"&&typeof n!="number")return;let e=n;if(typeof n=="number"&&n<1e12&&(e=n*1e3),typeof n=="string"){let o=Number(n.trim());Number.isFinite(o)&&o<1e12&&(e=o*1e3)}let t=new Date(e);return isNaN(t.getTime())?void 0:t.toISOString()}function br(n){let e=kr(n);return e?e==="kimi.com"||e.endsWith(".kimi.com")||e==="moonshot.cn"||e.endsWith(".moonshot.cn")?Dd:e==="minimaxi.com"||e.endsWith(".minimaxi.com")||e==="minimax.io"||e.endsWith(".minimax.io")?Fd:e==="deepseek.com"||e.endsWith(".deepseek.com")?Ad:e==="openrouter.ai"||e.endsWith(".openrouter.ai")?Od:e==="siliconflow.com"||e.endsWith(".siliconflow.com")||e==="siliconflow.cn"||e.endsWith(".siliconflow.cn")?Id:e==="bigmodel.cn"||e.endsWith(".bigmodel.cn")?Md:e==="dashscope.aliyuncs.com"||e.endsWith(".dashscope.aliyuncs.com")?Ld:e==="maas.aliyuncs.com"||e.endsWith(".maas.aliyuncs.com")?Nd:e==="xf-yun.com"||e.endsWith(".xf-yun.com")||e==="xfyun.cn"||e.endsWith(".xfyun.cn")||e==="xfyun.com"||e.endsWith(".xfyun.com")?$d:null:null}function Ud(n){let e=kr(n);return e?.endsWith(".siliconflow.cn")||e==="siliconflow.cn"?"https://api.siliconflow.cn/v1/user/info":"https://api.siliconflow.com/v1/user/info"}function jd(n,e){let t=yr(n);if(t.length===0)return null;let o=String(e||"").split(":").map(s=>s.trim()).filter(Boolean);return t.find(s=>{let a=s?.codingPlanAppCredentialDTO||s?.appCredential||s,i=String(a?.apiKey||a?.api_key||"").trim();return i&&o.some(c=>c.includes(i)||i.includes(c))})||t[0]}function yr(n){return!n||typeof n!="object"?[]:!Array.isArray(n)&&n.codingPlanUsageDTO?[n]:Array.isArray(n)?n.flatMap(e=>yr(e)):Object.values(n).flatMap(e=>yr(e))}function _r(n,e){let t=n.match(new RegExp(`(?:^|;\\s*)${e}=([^;]+)`));return t?decodeURIComponent(t[1]):void 0}function kr(n){try{return new URL(n).hostname.toLowerCase()}catch{return null}}function L(n){if(typeof n=="number")return Number.isFinite(n)?n:void 0;if(typeof n!="string")return;let e=n.trim().replace(/,/g,"");if(!e)return;let t=Number(e);return Number.isFinite(t)?t:void 0}var se,cr,lr,ur,dr,pr,xd,Sd,Cd,Rd,fr,mr,gr,hr,Ad,Od,Id,Md,Ld,Nd,$d,Dd,Fd,Tr=R(()=>{"use strict";q();se=class{async fetchJson(e,t,o,r,s){let a=s||t.apiKey;if(!a)return null;let i={method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${a}`},signal:AbortSignal.timeout(o)};try{r&&(i.dispatcher=K(r));let c=await fetch(e,i);return c.ok?await c.json():null}catch{return null}}hasQuotaData(e){return e.totalBalance!==void 0||e.usedBalance!==void 0||e.remainingBalance!==void 0||e.usedDailyBalance!==void 0||e.limitDaily!==void 0||e.resetTime!==void 0}},cr=class extends se{async queryQuota(e,t,o){let r=await this.fetchJson("https://api.deepseek.com/user/balance",e,t,o),a=(Array.isArray(r?.balance_infos)?r.balance_infos:[]).find(c=>L(c?.total_balance)!==void 0);if(!a)return null;let i=L(a.total_balance);return i===void 0?null:{totalBalance:i,currency:typeof a.currency=="string"?a.currency:void 0}}},lr=class extends se{async queryQuota(e,t,o){let s=(await this.fetchJson("https://openrouter.ai/api/v1/key",e,t,o))?.data;if(!s||typeof s!="object")return null;let a={},i=L(s.limit),c=L(s.limit_remaining),l=L(s.usage),u=L(s.usage_daily);return i!==void 0&&(a.totalBalance=i),c!==void 0&&(a.remainingBalance=c),l!==void 0&&(a.usedBalance=l),u!==void 0&&(a.usedDailyBalance=u),this.hasQuotaData(a)?a:null}},ur=class extends se{async queryQuota(e,t,o){let r=Ud(e.baseUrl),a=(await this.fetchJson(r,e,t,o))?.data;if(!a||typeof a!="object")return null;let i={},c=L(a.totalBalance),l=L(a.balance);return c!==void 0&&(i.totalBalance=c),l!==void 0&&(i.remainingBalance=l),c!==void 0&&l!==void 0&&(i.usedBalance=Math.max(0,c-l)),this.hasQuotaData(i)?i:null}},dr=class extends se{async queryQuota(e,t,o){if(!e.apiKey)return null;let s={method:"GET",headers:{Accept:"application/json",Authorization:e.apiKey.trim()},signal:AbortSignal.timeout(t)};try{o&&(s.dispatcher=K(o));let a=await fetch("https://api.z.ai/api/monitor/usage/quota/limit",s);if(!a.ok)return null;let i=await a.json(),c=Array.isArray(i?.data?.limits)?i.data.limits:[],l=null,u=null,p=null;for(let m of c)m.type==="TOKENS_LIMIT"?m.unit===3?l=m:m.unit===6?u=m:l||(l=m):m.type==="TIME_LIMIT"&&(p=m);let d={};if(l){let m=L(l.currentValue),h=L(l.usage),f=L(l.remaining),g=L(l.percentage);m!==void 0?d.usedDailyBalance=m:g!==void 0&&(d.usedDailyBalance=g,d.limitDaily=100),h!==void 0?d.limitDaily=h:m!==void 0&&f!==void 0&&(d.limitDaily=m+f),l.nextResetTime&&(d.resetTime=new Date(l.nextResetTime).toISOString())}if(u){let m=L(u.currentValue),h=L(u.usage),f=L(u.remaining),g=L(u.percentage);m!==void 0?d.usedBalance=m:g!==void 0&&(d.usedBalance=g,d.totalBalance=100),h!==void 0?d.totalBalance=h:m!==void 0&&f!==void 0&&(d.totalBalance=m+f),u.nextResetTime&&!d.resetTime&&(d.resetTime=new Date(u.nextResetTime).toISOString())}if(p){if(d.usedDailyBalance===void 0){let m=L(p.currentValue);m!==void 0&&(d.usedDailyBalance=m)}if(d.limitDaily===void 0){let m=L(p.usage),h=L(p.currentValue),f=L(p.remaining);m!==void 0?d.limitDaily=m:h!==void 0&&f!==void 0&&(d.limitDaily=h+f)}p.nextResetTime&&!d.resetTime&&(d.resetTime=new Date(p.nextResetTime).toISOString())}return this.hasQuotaData(d)?d:null}catch{return null}}},pr=class extends se{async queryQuota(e,t,o){if(!e.quotaToken)return null;let r={method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)",Origin:"https://bailian.console.aliyun.com",Referer:"https://bailian.console.aliyun.com/cn-beijing",Cookie:e.quotaToken},signal:AbortSignal.timeout(t)},s=JSON.stringify({Api:"zeldaEasy.broadscope-bailian.codingPlan.queryCodingPlanInstanceInfoV2",V:"1.0",Data:{queryCodingPlanInstanceInfoRequest:{commodityCode:"sfm_codingplan_public_cn",onlyLatestOne:!0},cornerstoneParam:{feTraceId:`ccr-${Date.now()}`,feURL:"https://bailian.console.aliyun.com/cn-beijing",protocol:"V2",console:"ONE_CONSOLE",productCode:"p_efm",switchAgent:10736808,switchUserType:3,domain:"bailian.console.aliyun.com",consoleSite:"BAILIAN_ALIYUN",userNickName:"",userPrincipalName:"",xsp_lang:"zh-CN"}}}),a=new URLSearchParams({params:s,region:"cn-beijing"}).toString();try{o&&(r.dispatcher=K(o));let i=await fetch("https://bailian-cs.console.aliyun.com/data/api.json?action=BroadScopeAspnGateway&product=sfm_bailian&api=zeldaEasy.broadscope-bailian.codingPlan.queryCodingPlanInstanceInfoV2",{...r,body:a});if(!i.ok)return null;let l=(await i.json())?.data?.DataV2?.data?.data?.codingPlanInstanceInfos;if(!Array.isArray(l)||l.length===0)return null;let u=l[0]?.codingPlanQuotaInfo;if(!u)return null;let p={},d=L(u.per5HourUsedQuota),m=L(u.per5HourTotalQuota);d!==void 0&&(p.usedDailyBalance=d),m!==void 0&&(p.limitDaily=m);let h=L(u.perWeekUsedQuota),f=L(u.perWeekTotalQuota);return h!==void 0&&(p.usedBalance=h),f!==void 0&&(p.totalBalance=f),this.hasQuotaData(p)?p:null}catch{return null}}};xd=["per5HourPercentage","per5HourUsedPercentage","fiveHourPercentage"],Sd=["per1WeekPercentage","perWeekPercentage","per1WeekUsedPercentage"],Cd=["per5HourResetTime","per5HourNextResetTime","fiveHourResetTime"],Rd=["per1WeekResetTime","per1WeekNextResetTime","perWeekResetTime"];fr=class extends se{async queryQuota(e,t,o){let r=e.quotaToken?.trim();if(!r)return null;let s=e.quotaSecToken?.trim();if(s){try{let a=await this.queryOfficialEndpoint(r,s,t,o);if(a)return a}catch{}return this.queryLegacyEndpoint(r,t,o)}return this.queryLegacyEndpoint(r,t,o)}async queryOfficialEndpoint(e,t,o,r){let s="zeldaHttp.apikeyMgr./tokenplan/personal/api/v2/usage",a=_r(e,"cna")||"",i=JSON.stringify({Api:s,V:"1.0",Data:{cornerstoneParam:{feTraceId:`ccr-${Date.now()}`,feURL:"https://bailian.console.aliyun.com/cn-beijing/?tab=plan#/efm/subscription/token-plan/personal",protocol:"V2",console:"ONE_CONSOLE",productCode:"p_efm",switchAgent:10736808,switchUserType:3,domain:"bailian.console.aliyun.com",consoleSite:"BAILIAN_ALIYUN",userNickName:"",userPrincipalName:"",xsp_lang:"zh-CN","X-Anonymous-Id":a}}}),c=new URLSearchParams({params:i,region:"cn-beijing",sec_token:t}).toString(),l={method:"POST",headers:{Accept:"application/json","Content-Type":"application/x-www-form-urlencoded",Cookie:e,"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)",Origin:"https://bailian.console.aliyun.com",Referer:"https://bailian.console.aliyun.com/cn-beijing/?tab=plan"},body:c,signal:AbortSignal.timeout(o)};try{r&&(l.dispatcher=K(r));let u=await fetch(`https://bailian-cs.console.aliyun.com/data/api.json?action=BroadScopeAspnGateway&product=sfm_bailian&api=${encodeURIComponent(s)}&_v=undefined`,l);if(!u.ok)return null;let p=await u.json();return wa(p)}catch{return null}}async queryLegacyEndpoint(e,t,o){let r="zeldaHttp.apikeyMgr./tokenplan/personal/api/v2/usage",s=JSON.stringify({Api:r,V:"1.0",Data:{cornerstoneParam:{feTraceId:`ccr-${Date.now()}`,feURL:"https://bailian.console.aliyun.com/",protocol:"V2",console:"ONE_CONSOLE",productCode:"p_efm",domain:"bailian.console.aliyun.com",consoleSite:"BAILIAN_ALIYUN",xsp_lang:"zh-CN"}}}),a=new URLSearchParams({params:s,region:"cn-beijing"}).toString(),i={method:"POST",headers:{Accept:"application/json","Content-Type":"application/x-www-form-urlencoded",Cookie:e,"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)",Origin:"https://bailian.console.aliyun.com",Referer:"https://bailian.console.aliyun.com/"},body:a,signal:AbortSignal.timeout(t)};try{o&&(i.dispatcher=K(o));let c=await fetch(`https://cs-data.qianwenai.com/data/api.json?product=sfm_bailian&action=BroadScopeAspnGateway&api=${encodeURIComponent(r)}`,i);if(!c.ok)return null;let l=await c.json();return wa(l)}catch{return null}}},mr=class extends se{async queryQuota(e,t,o){if(!e.quotaToken)return null;let s={method:"GET",headers:{Accept:"application/json","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)",Origin:"https://maas.xfyun.cn",Referer:"https://maas.xfyun.cn/packageSubscription",Authorization:(_r(e.quotaToken,"atp-auth-token")||_r(e.quotaToken,"tenantToken")||e.quotaToken).trim(),Cookie:e.quotaToken},signal:AbortSignal.timeout(t)};try{o&&(s.dispatcher=K(o));let a=await fetch("https://maas.xfyun.cn/api/v1/gpt-finetune/coding-plan/list?page=1&size=10",s);if(!a.ok)return null;let i=await a.json();if(i?.succeed===!1||i?.failed===!0)return null;let c=jd(i,e.apiKey),l=c?.codingPlanUsageDTO||c?.usage||c;if(!l||typeof l!="object")return null;let u={},p=L(l.rp5hUsage),d=L(l.rp5hLimit);p!==void 0&&(u.usedDailyBalance=p),d!==void 0&&(u.limitDaily=d);let m=L(l.rpwUsage),h=L(l.rpwLimit);return m!==void 0&&(u.usedBalance=m),h!==void 0&&(u.totalBalance=h),u.remainingBalance===void 0&&h!==void 0&&m!==void 0&&(u.remainingBalance=Math.max(0,h-m)),this.hasQuotaData(u)?u:null}catch{return null}}},gr=class extends se{async queryQuota(e,t,o){let r=e.quotaToken||e.apiKey;if(!r)return null;let s={method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${r.trim()}`},signal:AbortSignal.timeout(t)};try{o&&(s.dispatcher=K(o));let a=await fetch("https://api.kimi.com/coding/v1/usages",s);if(!a.ok)return null;let i=await a.json(),c={},l=Array.isArray(i?.limits)?i.limits:[];if(l.length>0&&l[0]?.detail){let p=l[0].detail,d=L(p.limit),m=L(p.remaining),h=p.resetTime;d!==void 0&&m!==void 0&&(c.usedDailyBalance=Math.max(0,d-m),c.limitDaily=d),h&&(c.resetTime=new Date(h).toISOString())}let u=i?.usage;if(u){let p=L(u.limit),d=L(u.remaining),m=L(u.used),h=u.resetTime;p!==void 0&&(c.totalBalance=p,m!==void 0?c.usedBalance=m:d!==void 0&&(c.usedBalance=Math.max(0,p-d),c.remainingBalance=d)),h&&(c.resetTime7d=new Date(h).toISOString(),c.resetTime||(c.resetTime=c.resetTime7d))}return this.hasQuotaData(c)?c:null}catch{return null}}},hr=class extends se{async queryQuota(e,t,o){let r=e.quotaToken||e.apiKey;if(!r)return null;let s=kr(e.baseUrl)||"api.minimaxi.com",a=s.endsWith(".minimax.io")||s==="minimax.io"?"api.minimax.io":"api.minimaxi.com";try{let i=[`https://${a}/v1/token_plan/remains`,`https://${a}/v1/api/openplatform/coding_plan/remains`],c=null;for(let k of i)if(c=await this.fetchJson(k,e,t,o,r.trim()),c)break;if(!c)return null;if(c?.base_resp){let k=c.base_resp.status_code;if(k!==void 0&&k!==0)return null}let l=Array.isArray(c?.model_remains)?c.model_remains:[];if(l.length===0)return null;let u=l[0],p={},d=L(u.current_interval_total_count),m=L(u.current_interval_usage_count),h=L(u.current_interval_remaining_percent),f=L(u.end_time);d!==void 0&&m!==void 0&&d>0?(p.usedDailyBalance=Math.max(0,d-m),p.limitDaily=d):h!==void 0&&(p.limitDaily=100,p.usedDailyBalance=Math.max(0,100-h)),f&&(p.resetTime=new Date(f).toISOString());let g=L(u.current_weekly_total_count),_=L(u.current_weekly_usage_count),b=L(u.current_weekly_remaining_percent),y=L(u.weekly_end_time);return g!==void 0&&_!==void 0&&g>0?(p.usedBalance=Math.max(0,g-_),p.remainingBalance=_,p.totalBalance=g):b!==void 0&&(p.totalBalance=100,p.usedBalance=Math.max(0,100-b),p.remainingBalance=b),y&&!p.resetTime&&(p.resetTime=new Date(y).toISOString()),this.hasQuotaData(p)?p:null}catch{return null}}},Ad=new cr,Od=new lr,Id=new ur,Md=new dr,Ld=new pr,Nd=new fr,$d=new mr,Dd=new gr,Fd=new hr});function Aa(n){return{[Hd]:n,[zd]:Vt}}function Re(n){return typeof n.apiKey=="string"&&n.apiKey.startsWith("ccr-managed-")}function Jd(n){return n===!0||n==="true"||n===1||n==="1"}function Wd(n){let e=n.getFullYear(),t=String(n.getMonth()+1).padStart(2,"0"),o=String(n.getDate()).padStart(2,"0");return`${e}-${t}-${o}`}function Kd(n){try{let e=new URL(n),t=e.pathname;return t.endsWith("/v1/messages")?t=t.slice(0,-12):t.endsWith("/messages")?t=t.slice(0,-9):t.endsWith("/v1/chat/completions")?t=t.slice(0,-20):t.endsWith("/chat/completions")&&(t=t.slice(0,-17)),t.endsWith("/v1")||(t=t.endsWith("/")?`${t}v1`:`${t}/v1`),e.pathname=`${t}/models`,e.toString()}catch{return null}}function Gd(n){try{let e=new URL(n).hostname.toLowerCase();return e.includes("moonshot")||e.includes("kimi")}catch{return!1}}async function vr(n,e,t){let o=performance.now(),r=()=>Math.max(0,Math.round(performance.now()-o));if(Re(n))return{success:!1,skipped:!0,error:xr,latencyMs:r()};let s=Kd(n.baseUrl);if(!s)return{success:!1,error:"Cannot derive models endpoint from baseUrl",errorKind:"network",latencyMs:r()};try{let a={method:"GET",headers:{Authorization:`Bearer ${n.apiKey}`},signal:AbortSignal.timeout(e)};t&&(a.dispatcher=K(t));let i=await fetch(s,a);if(i.headers&&it(n.name,n.baseUrl,i.headers),i.ok)return{success:!0,headers:i.headers,latencyMs:r()};if(i.status===429)return{success:!1,error:`HTTP 429: ${(await i.text().catch(()=>"")).slice(0,100)||"Rate limited"}`,headers:i.headers,latencyMs:r(),errorKind:"http"};if(i.status>=400&&i.status<500)return{success:!0,headers:i.headers,latencyMs:r()};let c=await i.text().catch(()=>"");return{success:!1,error:`HTTP ${i.status}: ${c.slice(0,100)}`,headers:i.headers,latencyMs:r(),errorKind:"http"}}catch(a){let i=a?.message||a?.toString()||"Unknown probe error",c=a?.name==="TimeoutError"||a?.name==="AbortError"||a?.code===20||a?.code==="ABORT_ERR";return{success:!1,error:i,latencyMs:r(),errorKind:c?"timeout":"network"}}}async function Vd(n,e,t,o){if(Re(n))return{success:!1,skipped:!0,error:xr};let r=n.wakeupModel||(Array.isArray(n.models)?n.models[0]:void 0);if(!r)return{success:!1,error:"No models configured for provider"};let s=n.baseUrl,a=n.baseUrl.includes("/messages")||r.includes("claude");try{let i={"Content-Type":"application/json",...Aa("scheduled-wakeup")};a?(i["x-api-key"]=n.apiKey,i["anthropic-version"]="2023-06-01"):i.Authorization=`Bearer ${n.apiKey}`;let c={method:"POST",headers:i,body:JSON.stringify({model:r,messages:[{role:"user",content:"Wake up and acknowledge with a short greeting."}],max_tokens:10}),signal:AbortSignal.timeout(e)};t&&(c.dispatcher=K(t)),o?.info(`Sending scheduled wake-up call to provider ${n.name} using model ${r}...`);let l=await fetch(s,c);if(l.ok)return{success:!0};let u=await l.text().catch(()=>"");return{success:!1,error:`HTTP ${l.status}: ${u.slice(0,200)||"Unknown error"}`}}catch(i){return{success:!1,error:i?.message||i?.toString()||"Unknown wake-up error"}}}async function Qd(n,e,t,o,r){if(Re(n))return{success:!1,skipped:!0,error:xr};let s=n.baseUrl,a=n.baseUrl.includes("/messages")||e.includes("claude");try{let i={"Content-Type":"application/json",...Aa("rate-limit-probe")};a?(i["x-api-key"]=n.apiKey,i["anthropic-version"]="2023-06-01"):i.Authorization=`Bearer ${n.apiKey}`;let c={method:"POST",headers:i,body:JSON.stringify({model:e,messages:[{role:"user",content:"Hello, please reply briefly."}],max_tokens:10}),signal:AbortSignal.timeout(t)};o&&(c.dispatcher=K(o)),r?.debug?.(`Sending independent ping to rate-limited model ${n.name} (${e})...`);let l=await fetch(s,c);if(l.ok)return{success:!0};let u=await l.text().catch(()=>"");return{success:!1,error:`HTTP ${l.status}: ${u.slice(0,200)||"Unknown error"}`}}catch(i){return{success:!1,error:i?.message||i?.toString()||"Unknown ping error"}}}function Oa(n,e,t,o,r,s){return _e||(_e=new Bn(n,e,t,o,r,s)),_e}function _t(n,e,t,o,r,s){let a=Oa(n,e,t,o,r,s);return a.start(),a}function Sr(){_e&&_e.stop()}function Cr(){_e&&(_e.stop(),_e=null)}var Hd,zd,Bd,xr,Bn,_e,Jn=R(()=>{"use strict";re();Le();Tr();De();wo();q();Hd="x-claude-code-router-source",zd="x-claude-code-router-version";Bd={enabled:!0,quotaProbeIntervalMinutes:10,probeTimeoutMs:15e3,slowThresholdMs:3e3,initialDelayMs:5e3,excludeProviders:[]};xr="Managed provider requires its plugin's authenticated model sync";Bn=class{config;quotaProbeTimer;healthProbeTimer;wakeupTimer;rateLimitProbeTimer;lastWakeupDate=new Map;getProviders;resolveProxyUrl;logger;getConfig;resolveManagedRuntime;managedProbeTimer;running=!1;probeTelemetry=new Map;constructor(e,t,o,r,s,a){this.config={...Bd,...t},this.getProviders=e,this.resolveProxyUrl=o,this.logger=r,this.getConfig=s,this.resolveManagedRuntime=a}recordProbe(e,t,o){let r=Date.now(),s=t.success&&t.latencyMs>this.config.slowThresholdMs,a;t.success?a=s?"slow":"healthy":a=t.errorKind==="timeout"?"timeout":"error";let i=this.probeTelemetry.get(e),c={provider:e,latencyMs:t.latencyMs,status:a,isSlow:s,errorKind:t.errorKind,errorMessage:t.error,lastProbeAt:r,lastSuccessAt:t.success?r:i?.lastSuccessAt,source:o};return this.probeTelemetry.set(e,c),s&&this.logger?.warn?.(`Slow network detected for provider ${e}: probe took ${t.latencyMs} ms (threshold ${this.config.slowThresholdMs} ms)`),c}getProbeTelemetry(){return Array.from(this.probeTelemetry.values()).map(e=>({...e}))}getProviderProbeTelemetry(e){let t=this.probeTelemetry.get(e);return t?{...t}:void 0}start(){if(this.running)return;let e=this.isWakeupGloballyEnabled();!this.config.enabled&&!e||(this.running=!0,setTimeout(()=>{this.running&&(this.config.enabled&&(this.runQuotaProbe(),this.runHealthProbe(),this.runRateLimitProbe()),this.runScheduledWakeup())},this.config.initialDelayMs),this.config.enabled&&(this.quotaProbeTimer=setInterval(()=>this.runQuotaProbe(),this.config.quotaProbeIntervalMinutes*60*1e3),this.healthProbeTimer=setInterval(()=>this.runHealthProbe(),300*1e3),this.rateLimitProbeTimer=setInterval(()=>this.runRateLimitProbe(),120*1e3),this.managedProbeTimer=setInterval(()=>this.runManagedRecoveryProbe(),this.config.quotaProbeIntervalMinutes*60*1e3)),this.wakeupTimer=setInterval(()=>this.runScheduledWakeup(),60*1e3),this.logger?.info("Active probe service started"))}stop(){this.running=!1,this.quotaProbeTimer&&(clearInterval(this.quotaProbeTimer),this.quotaProbeTimer=void 0),this.healthProbeTimer&&(clearInterval(this.healthProbeTimer),this.healthProbeTimer=void 0),this.managedProbeTimer&&(clearInterval(this.managedProbeTimer),this.managedProbeTimer=void 0),this.rateLimitProbeTimer&&(clearInterval(this.rateLimitProbeTimer),this.rateLimitProbeTimer=void 0),this.wakeupTimer&&(clearInterval(this.wakeupTimer),this.wakeupTimer=void 0),this.logger?.info("Active probe service stopped")}async runQuotaProbe(){let e=this.getProviders().filter(s=>s?.name&&s.enabled!==!1&&!Re(s)&&!this.config.excludeProviders.includes(s.name)),t=j();if(e.length===0)return;let o=[];for(let s of e){let a=br(s.baseUrl),i=Array.isArray(s.models)?s.models:[],c=this.resolveProxyUrl?.(s);if(!a){let l;try{l=new URL(s.baseUrl).hostname}catch{l=void 0}this.logger?.debug?.(`No quota adapter for provider ${s.name}`+(l?` (host: ${l})`:"")+" \u2014 skipping quota probe")}a&&o.push({provider:s.name,models:i,type:"quota-adapter",promise:a.queryQuota(s,this.config.probeTimeoutMs,c).then(l=>{if(l){Go(s.name,l),this.logger?.debug?.(`Stored quota probe result for ${s.name}`);let u=l.limitDaily!==void 0&&l.usedDailyBalance!==void 0&&l.usedDailyBalance>=l.limitDaily,p=l.totalBalance!==void 0&&l.usedBalance!==void 0&&l.usedBalance>=l.totalBalance;if(u||p){let d=u?`Quota exhausted: 5h limit reached (${l.usedDailyBalance}/${l.limitDaily})`:`Quota exhausted: 7d balance depleted (${l.usedBalance}/${l.totalBalance})`;for(let m of i){if(t.getState(s.name,m)?.rateLimitUntil){this.logger?.debug?.(`Skip forceOpen for ${s.name} (${m}): already rate-limited with active cooldown`);continue}t.forceOpen(s.name,m,d)}this.logger?.warn?.(`${d} for ${s.name}, marked as unhealthy`)}else for(let d of i){let m=t.getState(s.name,d);m&&m.status==="open"&&m.lastError?.includes("Quota exhausted")&&(t.recover(s.name,d),this.logger?.info?.(`Quota recovered for ${s.name} (${d}), marked as healthy`))}}})}),Gd(s.baseUrl)&&o.push({provider:s.name,models:i,type:"rate-limit-headers",promise:vr(s,this.config.probeTimeoutMs,c).then(l=>{this.recordProbe(s.name,l,"rate-limit-headers")})})}if(o.length===0)return;this.logger?.debug?.(`Running quota probe with ${o.length} tasks for ${e.length} providers`);let r=await Promise.allSettled(o.map(s=>s.promise));for(let s=0;s<o.length;s++){let a=r[s];if(a.status==="rejected"){let i=o[s];this.logger?.warn?.(`Quota probe failed for ${i.provider} (${i.type}): ${a.reason}`)}}}async runHealthProbe(){let e=j(),t=this.getProviders().filter(r=>r?.name&&r.enabled!==!1&&!Re(r)&&!this.config.excludeProviders.includes(r.name));if(t.length===0)return;this.logger?.debug?.(`Running health probe for ${t.length} providers`);let o=await Promise.allSettled(t.map(r=>vr(r,this.config.probeTimeoutMs,this.resolveProxyUrl?.(r))));for(let r=0;r<t.length;r++){let s=t[r],a=o[r],i=Array.isArray(s.models)?s.models:[];if(a.status==="fulfilled"){let c=a.value;if(c.skipped)continue;if(this.recordProbe(s.name,c,"health"),c.success){let l=0;for(let u of i){let p=e.getState(s.name,u);if(p&&p.status==="open"){let d=p.lastError?.includes("Quota exhausted"),m=p.rateLimitUntil||p.lastError&&(p.lastError.includes("429")||p.lastError.toLowerCase().includes("rate limit")||p.lastError.toLowerCase().includes("rate_limit")||p.lastError.toLowerCase().includes("too many requests")||p.lastError.toLowerCase().includes("\u9650\u6D41"));if(d){this.logger?.debug?.(`Skipping health probe recovery for ${s.name} (${u}) because quota is exhausted`);continue}if(m||p.rateLimitUntil){this.logger?.debug?.(`Skipping health probe recovery for rate-limited ${s.name} (${u})`);continue}}e.recordSuccess(s.name,u),l++}l>0&&this.logger?.info?.(`Health probe succeeded for ${s.name}`)}else{for(let l of i)e.recordFailure(s.name,l,c.error);this.logger?.warn?.(`Health probe failed for ${s.name}: ${c.error}`)}}else{this.recordProbe(s.name,{success:!1,error:a.reason?.message||String(a.reason||"Probe error"),latencyMs:0,errorKind:"network"},"health");for(let c of i)e.recordFailure(s.name,c,a.reason?.message||"Probe error");this.logger?.warn?.(`Health probe error for ${s.name}: ${a.reason}`)}}}async runManagedRecoveryProbe(){let e=j();if(!this.resolveManagedRuntime)return;let t=e.getFailPoolModels();if(t.length===0)return;let o=new Map;for(let r of t){let[s,...a]=r.split(","),i=a.join(",");if(!s||!i)continue;let c=o.get(s)??[];c.push(i),o.set(s,c)}for(let[r,s]of o){let a=this.getProviders().find(d=>d?.name===r&&d.enabled!==!1);if(!a)continue;let i=this.resolveManagedRuntime(a);if(!i)continue;let c=s[0],l=e.getState(r,c);if(!l||l.status!=="open"||l.rateLimitUntil&&Date.now()<l.rateLimitUntil)continue;let u=Math.max(l.lastFailureTime??0,l.lastProbeTime??0);Date.now()-u<this.config.quotaProbeIntervalMinutes*6e4||!await this.probeManagedAccountState(r,i,a,c,s,e)||await this.probeManagedLiveness(r,i,a,c,s,e)}}async probeManagedAccountState(e,t,o,r,s,a){try{if(typeof t.probeAccountState=="function"){let i=await t.probeAccountState();return i&&i.available===!1?(a.recordProbeAttempt?.(e,r),typeof i.parkedUntil=="number"&&i.parkedUntil>Date.now()&&a.markParkedUntil?.(e,r,i.parkedUntil),this.logger?.debug?.(`Managed probe: ${e} account parked (${i.reason??"unavailable"}), skipping liveness`),!1):!0}return typeof t.ensureUsable=="function"&&await t.ensureUsable(),!0}catch(i){return a.recordProbeAttempt?.(e,r),this.logger?.debug?.(`Managed probe: ${e} account unusable (${i?.code||i?.message||i}), skipping liveness`),!1}}async probeManagedLiveness(e,t,o,r,s,a){let i=this.config.probeTimeoutMs,c={model:r,max_tokens:1,messages:[{role:"user",content:"ping"}],stream:!1},l=async()=>{let p=o.baseUrl||o.api_base_url;return await fetch(p,{method:"POST",headers:{"content-type":"application/json",...o.apiKey?{authorization:`Bearer ${o.apiKey}`}:{}},body:JSON.stringify(c),signal:AbortSignal.timeout(i)})},u={TIMEOUT:i};try{this.logger?.debug?.(`Managed liveness probe for ${e} (${r})`);let p=typeof t.probeLiveness=="function"?await t.probeLiveness({attempt:l,model:r,provider:o,config:u}):typeof t.dispatchRequest=="function"?await t.dispatchRequest({attempt:l,requestBody:c,config:u,provider:o}):await l();if(p?.ok){for(let d of s)a.recover(e,d);this.logger?.info?.(`Managed liveness probe succeeded for ${e}, restored ${s.length} model(s)`)}else a.recordProbeAttempt?.(e,r),this.logger?.debug?.(`Managed liveness probe failed for ${e}: HTTP ${p?.status}`)}catch(p){a.recordProbeAttempt?.(e,r),this.logger?.debug?.(`Managed liveness probe errored for ${e}: ${p?.message||p}`)}}async runRateLimitProbe(){let e=j(),t=e.getRateLimitedModels();if(t.length===0)return;let o=this.getProviders(),r=this.config.probeTimeoutMs;this.logger?.debug?.(`Running rate-limit recovery probe for ${t.length} model(s)`);for(let s of t){let[a,...i]=s.split(","),c=i.join(",");if(!a||!c)continue;let l=o.find(d=>d?.name===a);if(l&&Re(l))continue;let u=e.getState(a,c);if(!u||!u.rateLimitUntil)continue;if(Date.now()>=u.rateLimitUntil){e.recover(a,c),this.logger?.info?.(`Rate-limit cooldown expired, auto-recovered ${s}`);continue}let p=o.find(d=>d?.name===a&&d.enabled!==!1);if(!p){this.logger?.warn?.(`Provider ${a} not found or disabled for rate-limit probe`);continue}try{let d=await Qd(p,c,r,this.resolveProxyUrl?.(p),this.logger);if(d.success)this.logger?.info?.(`Rate-limit probe succeeded for ${s}, recovering model`),e.recover(a,c);else if(d.error&&(d.error.includes("429")||d.error.toLowerCase().includes("rate limit")||d.error.toLowerCase().includes("rate_limit")||d.error.toLowerCase().includes("too many requests")||d.error.toLowerCase().includes("\u9650\u6D41"))){let m=Date.now();u.rateLimitUntil&&u.rateLimitUntil>m?u.rateLimitUntil+=120*1e3:u.rateLimitUntil=m+120*1e3,this.logger?.debug?.(`Rate-limit probe for ${s} confirmed still limited, extending cooldown`)}else this.logger?.debug?.(`Rate-limit probe for ${s} returned non-rate-limit error: ${d.error?.slice(0,100)}`)}catch(d){this.logger?.warn?.(`Rate-limit probe exception for ${s}: ${d?.message||d}`)}}}async runScheduledWakeup(){if(!this.isWakeupGloballyEnabled())return;let e=this.getProviders().filter(i=>i?.name&&i.enabled!==!1&&!Re(i)&&i.wakeupEnabled===!0);if(e.length===0)return;let t=new Date,o=t.getHours(),r=t.getMinutes(),s=Wd(t),a=this.getConfig&&this.getConfig("WAKEUP_TIME")||"06:00";for(let i of e){let c=i.wakeupTime||a,[l,u]=c.split(":"),p=parseInt(l,10),d=parseInt(u,10);if(isNaN(p)||isNaN(d))continue;let m=o>p||o===p&&r>=d,h=(p*60+d)*6e4-(o*60+r)*6e4,f=h>0&&h<=300*1e3;(m||f)&&!this.hasWakeupFiredToday(i.name,s)&&(this.logger?.info?.(`Scheduled wake-up triggered for provider ${i.name} at ${c}`),Vd(i,3e4,this.resolveProxyUrl?.(i),this.logger).then(g=>{g.success?this.logger?.info?.(`Successfully woke up provider ${i.name}`):this.logger?.error?.(`Failed to wake up provider ${i.name}: ${g.error}`)}).catch(g=>{this.logger?.error?.(`Error in wake-up task for ${i.name}: ${g}`)}))}}isWakeupGloballyEnabled(){return this.getConfig?Jd(this.getConfig("WAKEUP_ENABLED")):!1}hasWakeupFiredToday(e,t){return this.lastWakeupDate.get(e)===t?!0:(this.lastWakeupDate.set(e,t),!1)}async probeProviderManually(e){let o=this.getProviders().find(i=>i.name===e);if(!o)return this.logger?.warn?.(`Provider ${e} not found for manual probe`),{success:!1,latencyMs:0,status:"error",isSlow:!1,error:`Provider ${e} not found`};if(o.enabled===!1)return this.logger?.warn?.(`Provider ${e} is disabled, skipping manual probe`),{success:!1,latencyMs:0,status:"error",isSlow:!1,error:`Provider ${e} is disabled`};let r=await vr(o,this.config.probeTimeoutMs,this.resolveProxyUrl?.(o));if(r.skipped)return{success:!1,skipped:!0,latencyMs:r.latencyMs,status:"skipped",isSlow:!1,error:r.error};let s=this.recordProbe(o.name,r,"manual"),a=Array.isArray(o.models)?o.models:[];if(r.success)for(let i of a)j().recordSuccess(o.name,i);else for(let i of a)j().recordFailure(o.name,i,r.error);return{success:r.success,latencyMs:r.latencyMs,status:s.status,isSlow:s.isSlow,errorKind:r.errorKind,error:r.error}}},_e=null});var Ia=R(()=>{"use strict"});var Rr,bt,Ma=R(()=>{"use strict";Rr=class{plugins=new Map;pluginInstances=new Map;registerPlugin(e,t={}){this.pluginInstances.set(e.name,e),this.plugins.set(e.name,{name:e.name,enabled:t.enabled!==!1,options:t})}async enablePlugin(e,t){let o=this.plugins.get(e),r=this.pluginInstances.get(e);if(!o||!r)throw new Error(`Plugin ${e} not found`);o.enabled&&await t.register(r.register,o.options)}async enablePlugins(e){for(let[t,o]of this.plugins)if(o.enabled)try{await this.enablePlugin(t,e)}catch(r){let s=r instanceof Error?r.message:String(r);e.log?.error(`Failed to enable plugin ${t}: ${s}`)}}getPlugins(){return Array.from(this.plugins.values())}getPlugin(e){return this.pluginInstances.get(e)}hasPlugin(e){return this.pluginInstances.has(e)}isPluginEnabled(e){return this.plugins.get(e)?.enabled||!1}setPluginEnabled(e,t){let o=this.plugins.get(e);o&&(o.enabled=t)}removePlugin(e){this.plugins.delete(e),this.pluginInstances.delete(e)}clear(){this.plugins.clear(),this.pluginInstances.clear()}},bt=new Rr});var ie,wr=R(()=>{"use strict";ie=class extends TransformStream{buffer="";currentEvent={};constructor(){super({transform:(e,t)=>{this.buffer+=e;let o=this.buffer.split(`
|
|
310
|
-
`);this.buffer=o.pop()||"";for(let r of o){let s=this.processLine(r);s&&t.enqueue(s)}},flush:e=>{if(this.buffer.trim()){let t=[];this.processLine(this.buffer.trim(),t),t.forEach(o=>e.enqueue(o))}Object.keys(this.currentEvent).length>0&&e.enqueue(this.currentEvent)}})}processLine(e,t){if(!e.trim()){if(Object.keys(this.currentEvent).length>0){let o={...this.currentEvent};return this.currentEvent={},t?(t.push(o),null):o}return null}if(e.startsWith("event:"))this.currentEvent.event=e.slice(6).trim();else if(e.startsWith("data:")){let o=e.slice(5).trim();if(o==="[DONE]")this.currentEvent.data={type:"done"};else try{this.currentEvent.data=JSON.parse(o)}catch{this.currentEvent.data={raw:o,error:"JSON parse failed"}}}else e.startsWith("id:")?this.currentEvent.id=e.slice(3).trim():e.startsWith("retry:")&&(this.currentEvent.retry=parseInt(e.slice(6).trim()));return null}}});var
|
|
309
|
+
`):typeof t.content=="string"?t.content:JSON.stringify(t.content):"").join(" "):""}extractConcatenatedText(e){let t=[];return e.messages&&e.messages.forEach(o=>{t.push(this.extractTextFromMessage(o))}),typeof e.system=="string"?t.push(e.system):Array.isArray(e.system)&&e.system.forEach(o=>{o.type==="text"&&(typeof o.text=="string"?t.push(o.text):Array.isArray(o.text)&&o.text.forEach(r=>{r&&t.push(r)}))}),e.tools&&e.tools.forEach(o=>{o.name&&t.push(o.name),o.description&&t.push(o.description),o.input_schema&&t.push(JSON.stringify(o.input_schema))}),t.join(" ")}extractTokenCount(e){try{let t=this.config.responseField,o=t.split("."),r=e;for(let s of o){if(r==null)throw new Error(`Field path '${t}' not found in response`);r=r[s]}if(typeof r!="number")throw new Error(`Expected number at field path '${t}', got ${typeof r}`);return r}catch(t){throw this.logger?.error(`Failed to extract token count from API response: ${t.message}. Response: ${JSON.stringify(e)}`),new Error(`Invalid response from API tokenizer: ${t.message}`)}}}});var Ye,ar=R(()=>{"use strict";Sa();Ca();Ra();q();Ye=class{tokenizers=new Map;configService;logger;options;fallbackTokenizer;constructor(e,t,o={}){this.configService=e,this.logger=t,this.options={timeout:o.timeout??3e4,...o}}async initialize(){try{this.fallbackTokenizer=new yt("cl100k_base"),await this.fallbackTokenizer.initialize(),this.tokenizers.set("fallback",this.fallbackTokenizer),this.logger?.info("TokenizerService initialized successfully")}catch(e){throw this.logger?.error(`TokenizerService initialization error: ${e.message}`),e}}async getTokenizer(e,t){let o=this.getCacheKey(e,t);if(this.tokenizers.has(o))return this.tokenizers.get(o);let r;try{switch(e.type){case"tiktoken":r=new yt(e.encoding||"cl100k_base");break;case"huggingface":this.logger?.info(`Initializing HuggingFace tokenizer for model: ${e.model}`),r=new jn(e.model,this.logger,{timeout:this.options.timeout});break;case"api":r=new Hn(e,this.logger,{timeout:this.options.timeout,resolveProxyUrl:()=>{let s=t?this.getRawProvider(t):void 0;return ue(this.configService,s)}});break;default:throw new Error(`Unknown tokenizer type: ${e.type}`)}return this.logger?.info(`Calling initialize() on ${e.type} tokenizer...`),await r.initialize(),this.tokenizers.set(o,r),this.logger?.info(`Tokenizer initialized successfully: ${e.type} (${o})`),r}catch(s){return this.logger?.error(`Failed to initialize ${e.type} tokenizer: ${s.message}`),this.logger?.error(`Error stack: ${s.stack}`),this.fallbackTokenizer||await this.initialize(),this.fallbackTokenizer}}async countTokens(e,t,o){let r=t?await this.getTokenizer(t,o):this.fallbackTokenizer;return{tokenCount:await r.countTokens(e),tokenizerUsed:r.name,cached:!1}}getTokenizerConfigForModel(e,t){let r=(this.configService.get("providers")||[]).find(s=>s.name===e);if(r?.tokenizer)return r.tokenizer.models?.[t]?r.tokenizer.models[t]:r.tokenizer.default}dispose(){this.tokenizers.forEach(e=>{try{e.dispose()}catch(t){this.logger?.error(`Error disposing tokenizer: ${t}`)}}),this.tokenizers.clear()}getCacheKey(e,t){switch(e.type){case"tiktoken":return`tiktoken:${e.encoding||"cl100k_base"}`;case"huggingface":return`hf:${e.model}`;case"api":return`api:${t||"unscoped"}:${e.url}`;default:return`unknown:${JSON.stringify(e)}`}}getRawProvider(e){return(this.configService.get("providers")||[]).find(o=>o?.name===e)}}});function wa(n){if(!n||typeof n!="object"||Ed(n))return null;for(let t of Pd(n)){let o=wd(t);if(o)return o}return null}function wd(n){if(!n||typeof n!="object")return null;let e={},t=zn(n,xd);if(t!==void 0){let a=Pa(t);e.usedDailyBalance=a,e.limitDaily=100}let o=zn(n,Sd);if(o!==void 0){let a=Pa(o);e.usedBalance=a,e.totalBalance=100}let r=zn(n,Cd);if(r!==void 0){let a=Ea(r);a&&(e.resetTime=a)}let s=zn(n,Rd);if(s!==void 0){let a=Ea(s);a&&(e.resetTime7d=a,e.resetTime||(e.resetTime=a))}return e.usedDailyBalance===void 0&&e.limitDaily===void 0&&e.usedBalance===void 0&&e.totalBalance===void 0&&e.resetTime===void 0?null:e}function Pa(n){return!Number.isFinite(n)||n<=0?0:Math.round(n*1e4)/100}function zn(n,e){for(let t of e){let o=L(n?.[t]);if(o!==void 0)return o}}function Pd(n){let e=[],t=new WeakSet,o=["data","Data","DataV2"],r=s=>{if(!(!s||typeof s!="object")&&!t.has(s)){t.add(s),e.push(s);for(let a of o)s[a]&&typeof s[a]=="object"&&r(s[a])}};return r(n),e}function Ed(n){let e=n?.data;return e&&typeof e=="object"&&(e.success===!1||e.errorCode||e.errorMsg)?String(e.errorCode||e.errorMsg||"gateway-error"):null}function Ea(n){if(typeof n!="string"&&typeof n!="number")return;let e=n;if(typeof n=="number"&&n<1e12&&(e=n*1e3),typeof n=="string"){let o=Number(n.trim());Number.isFinite(o)&&o<1e12&&(e=o*1e3)}let t=new Date(e);return isNaN(t.getTime())?void 0:t.toISOString()}function br(n){let e=kr(n);return e?e==="kimi.com"||e.endsWith(".kimi.com")||e==="moonshot.cn"||e.endsWith(".moonshot.cn")?Dd:e==="minimaxi.com"||e.endsWith(".minimaxi.com")||e==="minimax.io"||e.endsWith(".minimax.io")?Fd:e==="deepseek.com"||e.endsWith(".deepseek.com")?Ad:e==="openrouter.ai"||e.endsWith(".openrouter.ai")?Od:e==="siliconflow.com"||e.endsWith(".siliconflow.com")||e==="siliconflow.cn"||e.endsWith(".siliconflow.cn")?Id:e==="bigmodel.cn"||e.endsWith(".bigmodel.cn")?Md:e==="dashscope.aliyuncs.com"||e.endsWith(".dashscope.aliyuncs.com")?Ld:e==="maas.aliyuncs.com"||e.endsWith(".maas.aliyuncs.com")?Nd:e==="xf-yun.com"||e.endsWith(".xf-yun.com")||e==="xfyun.cn"||e.endsWith(".xfyun.cn")||e==="xfyun.com"||e.endsWith(".xfyun.com")?$d:null:null}function Ud(n){let e=kr(n);return e?.endsWith(".siliconflow.cn")||e==="siliconflow.cn"?"https://api.siliconflow.cn/v1/user/info":"https://api.siliconflow.com/v1/user/info"}function jd(n,e){let t=yr(n);if(t.length===0)return null;let o=String(e||"").split(":").map(s=>s.trim()).filter(Boolean);return t.find(s=>{let a=s?.codingPlanAppCredentialDTO||s?.appCredential||s,i=String(a?.apiKey||a?.api_key||"").trim();return i&&o.some(c=>c.includes(i)||i.includes(c))})||t[0]}function yr(n){return!n||typeof n!="object"?[]:!Array.isArray(n)&&n.codingPlanUsageDTO?[n]:Array.isArray(n)?n.flatMap(e=>yr(e)):Object.values(n).flatMap(e=>yr(e))}function _r(n,e){let t=n.match(new RegExp(`(?:^|;\\s*)${e}=([^;]+)`));return t?decodeURIComponent(t[1]):void 0}function kr(n){try{return new URL(n).hostname.toLowerCase()}catch{return null}}function L(n){if(typeof n=="number")return Number.isFinite(n)?n:void 0;if(typeof n!="string")return;let e=n.trim().replace(/,/g,"");if(!e)return;let t=Number(e);return Number.isFinite(t)?t:void 0}var se,cr,lr,ur,dr,pr,xd,Sd,Cd,Rd,fr,mr,gr,hr,Ad,Od,Id,Md,Ld,Nd,$d,Dd,Fd,Tr=R(()=>{"use strict";q();se=class{async fetchJson(e,t,o,r,s){let a=s||t.apiKey;if(!a)return null;let i={method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${a}`},signal:AbortSignal.timeout(o)};try{r&&(i.dispatcher=K(r));let c=await fetch(e,i);return c.ok?await c.json():null}catch{return null}}hasQuotaData(e){return e.totalBalance!==void 0||e.usedBalance!==void 0||e.remainingBalance!==void 0||e.usedDailyBalance!==void 0||e.limitDaily!==void 0||e.resetTime!==void 0}},cr=class extends se{async queryQuota(e,t,o){let r=await this.fetchJson("https://api.deepseek.com/user/balance",e,t,o),a=(Array.isArray(r?.balance_infos)?r.balance_infos:[]).find(c=>L(c?.total_balance)!==void 0);if(!a)return null;let i=L(a.total_balance);return i===void 0?null:{totalBalance:i,currency:typeof a.currency=="string"?a.currency:void 0}}},lr=class extends se{async queryQuota(e,t,o){let s=(await this.fetchJson("https://openrouter.ai/api/v1/key",e,t,o))?.data;if(!s||typeof s!="object")return null;let a={},i=L(s.limit),c=L(s.limit_remaining),l=L(s.usage),u=L(s.usage_daily);return i!==void 0&&(a.totalBalance=i),c!==void 0&&(a.remainingBalance=c),l!==void 0&&(a.usedBalance=l),u!==void 0&&(a.usedDailyBalance=u),this.hasQuotaData(a)?a:null}},ur=class extends se{async queryQuota(e,t,o){let r=Ud(e.baseUrl),a=(await this.fetchJson(r,e,t,o))?.data;if(!a||typeof a!="object")return null;let i={},c=L(a.totalBalance),l=L(a.balance);return c!==void 0&&(i.totalBalance=c),l!==void 0&&(i.remainingBalance=l),c!==void 0&&l!==void 0&&(i.usedBalance=Math.max(0,c-l)),this.hasQuotaData(i)?i:null}},dr=class extends se{async queryQuota(e,t,o){if(!e.apiKey)return null;let s={method:"GET",headers:{Accept:"application/json",Authorization:e.apiKey.trim()},signal:AbortSignal.timeout(t)};try{o&&(s.dispatcher=K(o));let a=await fetch("https://api.z.ai/api/monitor/usage/quota/limit",s);if(!a.ok)return null;let i=await a.json(),c=Array.isArray(i?.data?.limits)?i.data.limits:[],l=null,u=null,p=null;for(let f of c)f.type==="TOKENS_LIMIT"?f.unit===3?l=f:f.unit===6?u=f:l||(l=f):f.type==="TIME_LIMIT"&&(p=f);let d={};if(l){let f=L(l.currentValue),h=L(l.usage),g=L(l.remaining),m=L(l.percentage);f!==void 0?d.usedDailyBalance=f:m!==void 0&&(d.usedDailyBalance=m,d.limitDaily=100),h!==void 0?d.limitDaily=h:f!==void 0&&g!==void 0&&(d.limitDaily=f+g),l.nextResetTime&&(d.resetTime=new Date(l.nextResetTime).toISOString())}if(u){let f=L(u.currentValue),h=L(u.usage),g=L(u.remaining),m=L(u.percentage);f!==void 0?d.usedBalance=f:m!==void 0&&(d.usedBalance=m,d.totalBalance=100),h!==void 0?d.totalBalance=h:f!==void 0&&g!==void 0&&(d.totalBalance=f+g),u.nextResetTime&&!d.resetTime&&(d.resetTime=new Date(u.nextResetTime).toISOString())}if(p){if(d.usedDailyBalance===void 0){let f=L(p.currentValue);f!==void 0&&(d.usedDailyBalance=f)}if(d.limitDaily===void 0){let f=L(p.usage),h=L(p.currentValue),g=L(p.remaining);f!==void 0?d.limitDaily=f:h!==void 0&&g!==void 0&&(d.limitDaily=h+g)}p.nextResetTime&&!d.resetTime&&(d.resetTime=new Date(p.nextResetTime).toISOString())}return this.hasQuotaData(d)?d:null}catch{return null}}},pr=class extends se{async queryQuota(e,t,o){if(!e.quotaToken)return null;let r={method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)",Origin:"https://bailian.console.aliyun.com",Referer:"https://bailian.console.aliyun.com/cn-beijing",Cookie:e.quotaToken},signal:AbortSignal.timeout(t)},s=JSON.stringify({Api:"zeldaEasy.broadscope-bailian.codingPlan.queryCodingPlanInstanceInfoV2",V:"1.0",Data:{queryCodingPlanInstanceInfoRequest:{commodityCode:"sfm_codingplan_public_cn",onlyLatestOne:!0},cornerstoneParam:{feTraceId:`ccr-${Date.now()}`,feURL:"https://bailian.console.aliyun.com/cn-beijing",protocol:"V2",console:"ONE_CONSOLE",productCode:"p_efm",switchAgent:10736808,switchUserType:3,domain:"bailian.console.aliyun.com",consoleSite:"BAILIAN_ALIYUN",userNickName:"",userPrincipalName:"",xsp_lang:"zh-CN"}}}),a=new URLSearchParams({params:s,region:"cn-beijing"}).toString();try{o&&(r.dispatcher=K(o));let i=await fetch("https://bailian-cs.console.aliyun.com/data/api.json?action=BroadScopeAspnGateway&product=sfm_bailian&api=zeldaEasy.broadscope-bailian.codingPlan.queryCodingPlanInstanceInfoV2",{...r,body:a});if(!i.ok)return null;let l=(await i.json())?.data?.DataV2?.data?.data?.codingPlanInstanceInfos;if(!Array.isArray(l)||l.length===0)return null;let u=l[0]?.codingPlanQuotaInfo;if(!u)return null;let p={},d=L(u.per5HourUsedQuota),f=L(u.per5HourTotalQuota);d!==void 0&&(p.usedDailyBalance=d),f!==void 0&&(p.limitDaily=f);let h=L(u.perWeekUsedQuota),g=L(u.perWeekTotalQuota);return h!==void 0&&(p.usedBalance=h),g!==void 0&&(p.totalBalance=g),this.hasQuotaData(p)?p:null}catch{return null}}};xd=["per5HourPercentage","per5HourUsedPercentage","fiveHourPercentage"],Sd=["per1WeekPercentage","perWeekPercentage","per1WeekUsedPercentage"],Cd=["per5HourResetTime","per5HourNextResetTime","fiveHourResetTime"],Rd=["per1WeekResetTime","per1WeekNextResetTime","perWeekResetTime"];fr=class extends se{async queryQuota(e,t,o){let r=e.quotaToken?.trim();if(!r)return null;let s=e.quotaSecToken?.trim();if(s){try{let a=await this.queryOfficialEndpoint(r,s,t,o);if(a)return a}catch{}return this.queryLegacyEndpoint(r,t,o)}return this.queryLegacyEndpoint(r,t,o)}async queryOfficialEndpoint(e,t,o,r){let s="zeldaHttp.apikeyMgr./tokenplan/personal/api/v2/usage",a=_r(e,"cna")||"",i=JSON.stringify({Api:s,V:"1.0",Data:{cornerstoneParam:{feTraceId:`ccr-${Date.now()}`,feURL:"https://bailian.console.aliyun.com/cn-beijing/?tab=plan#/efm/subscription/token-plan/personal",protocol:"V2",console:"ONE_CONSOLE",productCode:"p_efm",switchAgent:10736808,switchUserType:3,domain:"bailian.console.aliyun.com",consoleSite:"BAILIAN_ALIYUN",userNickName:"",userPrincipalName:"",xsp_lang:"zh-CN","X-Anonymous-Id":a}}}),c=new URLSearchParams({params:i,region:"cn-beijing",sec_token:t}).toString(),l={method:"POST",headers:{Accept:"application/json","Content-Type":"application/x-www-form-urlencoded",Cookie:e,"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)",Origin:"https://bailian.console.aliyun.com",Referer:"https://bailian.console.aliyun.com/cn-beijing/?tab=plan"},body:c,signal:AbortSignal.timeout(o)};try{r&&(l.dispatcher=K(r));let u=await fetch(`https://bailian-cs.console.aliyun.com/data/api.json?action=BroadScopeAspnGateway&product=sfm_bailian&api=${encodeURIComponent(s)}&_v=undefined`,l);if(!u.ok)return null;let p=await u.json();return wa(p)}catch{return null}}async queryLegacyEndpoint(e,t,o){let r="zeldaHttp.apikeyMgr./tokenplan/personal/api/v2/usage",s=JSON.stringify({Api:r,V:"1.0",Data:{cornerstoneParam:{feTraceId:`ccr-${Date.now()}`,feURL:"https://bailian.console.aliyun.com/",protocol:"V2",console:"ONE_CONSOLE",productCode:"p_efm",domain:"bailian.console.aliyun.com",consoleSite:"BAILIAN_ALIYUN",xsp_lang:"zh-CN"}}}),a=new URLSearchParams({params:s,region:"cn-beijing"}).toString(),i={method:"POST",headers:{Accept:"application/json","Content-Type":"application/x-www-form-urlencoded",Cookie:e,"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)",Origin:"https://bailian.console.aliyun.com",Referer:"https://bailian.console.aliyun.com/"},body:a,signal:AbortSignal.timeout(t)};try{o&&(i.dispatcher=K(o));let c=await fetch(`https://cs-data.qianwenai.com/data/api.json?product=sfm_bailian&action=BroadScopeAspnGateway&api=${encodeURIComponent(r)}`,i);if(!c.ok)return null;let l=await c.json();return wa(l)}catch{return null}}},mr=class extends se{async queryQuota(e,t,o){if(!e.quotaToken)return null;let s={method:"GET",headers:{Accept:"application/json","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)",Origin:"https://maas.xfyun.cn",Referer:"https://maas.xfyun.cn/packageSubscription",Authorization:(_r(e.quotaToken,"atp-auth-token")||_r(e.quotaToken,"tenantToken")||e.quotaToken).trim(),Cookie:e.quotaToken},signal:AbortSignal.timeout(t)};try{o&&(s.dispatcher=K(o));let a=await fetch("https://maas.xfyun.cn/api/v1/gpt-finetune/coding-plan/list?page=1&size=10",s);if(!a.ok)return null;let i=await a.json();if(i?.succeed===!1||i?.failed===!0)return null;let c=jd(i,e.apiKey),l=c?.codingPlanUsageDTO||c?.usage||c;if(!l||typeof l!="object")return null;let u={},p=L(l.rp5hUsage),d=L(l.rp5hLimit);p!==void 0&&(u.usedDailyBalance=p),d!==void 0&&(u.limitDaily=d);let f=L(l.rpwUsage),h=L(l.rpwLimit);return f!==void 0&&(u.usedBalance=f),h!==void 0&&(u.totalBalance=h),u.remainingBalance===void 0&&h!==void 0&&f!==void 0&&(u.remainingBalance=Math.max(0,h-f)),this.hasQuotaData(u)?u:null}catch{return null}}},gr=class extends se{async queryQuota(e,t,o){let r=e.quotaToken||e.apiKey;if(!r)return null;let s={method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${r.trim()}`},signal:AbortSignal.timeout(t)};try{o&&(s.dispatcher=K(o));let a=await fetch("https://api.kimi.com/coding/v1/usages",s);if(!a.ok)return null;let i=await a.json(),c={},l=Array.isArray(i?.limits)?i.limits:[];if(l.length>0&&l[0]?.detail){let p=l[0].detail,d=L(p.limit),f=L(p.remaining),h=p.resetTime;d!==void 0&&f!==void 0&&(c.usedDailyBalance=Math.max(0,d-f),c.limitDaily=d),h&&(c.resetTime=new Date(h).toISOString())}let u=i?.usage;if(u){let p=L(u.limit),d=L(u.remaining),f=L(u.used),h=u.resetTime;p!==void 0&&(c.totalBalance=p,f!==void 0?c.usedBalance=f:d!==void 0&&(c.usedBalance=Math.max(0,p-d),c.remainingBalance=d)),h&&(c.resetTime7d=new Date(h).toISOString(),c.resetTime||(c.resetTime=c.resetTime7d))}return this.hasQuotaData(c)?c:null}catch{return null}}},hr=class extends se{async queryQuota(e,t,o){let r=e.quotaToken||e.apiKey;if(!r)return null;let s=kr(e.baseUrl)||"api.minimaxi.com",a=s.endsWith(".minimax.io")||s==="minimax.io"?"api.minimax.io":"api.minimaxi.com";try{let i=[`https://${a}/v1/token_plan/remains`,`https://${a}/v1/api/openplatform/coding_plan/remains`],c=null;for(let k of i)if(c=await this.fetchJson(k,e,t,o,r.trim()),c)break;if(!c)return null;if(c?.base_resp){let k=c.base_resp.status_code;if(k!==void 0&&k!==0)return null}let l=Array.isArray(c?.model_remains)?c.model_remains:[];if(l.length===0)return null;let u=l[0],p={},d=L(u.current_interval_total_count),f=L(u.current_interval_usage_count),h=L(u.current_interval_remaining_percent),g=L(u.end_time);d!==void 0&&f!==void 0&&d>0?(p.usedDailyBalance=Math.max(0,d-f),p.limitDaily=d):h!==void 0&&(p.limitDaily=100,p.usedDailyBalance=Math.max(0,100-h)),g&&(p.resetTime=new Date(g).toISOString());let m=L(u.current_weekly_total_count),_=L(u.current_weekly_usage_count),b=L(u.current_weekly_remaining_percent),y=L(u.weekly_end_time);return m!==void 0&&_!==void 0&&m>0?(p.usedBalance=Math.max(0,m-_),p.remainingBalance=_,p.totalBalance=m):b!==void 0&&(p.totalBalance=100,p.usedBalance=Math.max(0,100-b),p.remainingBalance=b),y&&!p.resetTime&&(p.resetTime=new Date(y).toISOString()),this.hasQuotaData(p)?p:null}catch{return null}}},Ad=new cr,Od=new lr,Id=new ur,Md=new dr,Ld=new pr,Nd=new fr,$d=new mr,Dd=new gr,Fd=new hr});function Aa(n){return{[Hd]:n,[zd]:Vt}}function Re(n){return typeof n.apiKey=="string"&&n.apiKey.startsWith("ccr-managed-")}function Jd(n){return n===!0||n==="true"||n===1||n==="1"}function Wd(n){let e=n.getFullYear(),t=String(n.getMonth()+1).padStart(2,"0"),o=String(n.getDate()).padStart(2,"0");return`${e}-${t}-${o}`}function Kd(n){try{let e=new URL(n),t=e.pathname;return t.endsWith("/v1/messages")?t=t.slice(0,-12):t.endsWith("/messages")?t=t.slice(0,-9):t.endsWith("/v1/chat/completions")?t=t.slice(0,-20):t.endsWith("/chat/completions")&&(t=t.slice(0,-17)),t.endsWith("/v1")||(t=t.endsWith("/")?`${t}v1`:`${t}/v1`),e.pathname=`${t}/models`,e.toString()}catch{return null}}function Gd(n){try{let e=new URL(n).hostname.toLowerCase();return e.includes("moonshot")||e.includes("kimi")}catch{return!1}}async function vr(n,e,t){let o=performance.now(),r=()=>Math.max(0,Math.round(performance.now()-o));if(Re(n))return{success:!1,skipped:!0,error:xr,latencyMs:r()};let s=Kd(n.baseUrl);if(!s)return{success:!1,error:"Cannot derive models endpoint from baseUrl",errorKind:"network",latencyMs:r()};try{let a={method:"GET",headers:{Authorization:`Bearer ${n.apiKey}`},signal:AbortSignal.timeout(e)};t&&(a.dispatcher=K(t));let i=await fetch(s,a);if(i.headers&&it(n.name,n.baseUrl,i.headers),i.ok)return{success:!0,headers:i.headers,latencyMs:r()};if(i.status===429)return{success:!1,error:`HTTP 429: ${(await i.text().catch(()=>"")).slice(0,100)||"Rate limited"}`,headers:i.headers,latencyMs:r(),errorKind:"http"};if(i.status>=400&&i.status<500)return{success:!0,headers:i.headers,latencyMs:r()};let c=await i.text().catch(()=>"");return{success:!1,error:`HTTP ${i.status}: ${c.slice(0,100)}`,headers:i.headers,latencyMs:r(),errorKind:"http"}}catch(a){let i=a?.message||a?.toString()||"Unknown probe error",c=a?.name==="TimeoutError"||a?.name==="AbortError"||a?.code===20||a?.code==="ABORT_ERR";return{success:!1,error:i,latencyMs:r(),errorKind:c?"timeout":"network"}}}async function Vd(n,e,t,o){if(Re(n))return{success:!1,skipped:!0,error:xr};let r=n.wakeupModel||(Array.isArray(n.models)?n.models[0]:void 0);if(!r)return{success:!1,error:"No models configured for provider"};let s=n.baseUrl,a=n.baseUrl.includes("/messages")||r.includes("claude");try{let i={"Content-Type":"application/json",...Aa("scheduled-wakeup")};a?(i["x-api-key"]=n.apiKey,i["anthropic-version"]="2023-06-01"):i.Authorization=`Bearer ${n.apiKey}`;let c={method:"POST",headers:i,body:JSON.stringify({model:r,messages:[{role:"user",content:"Wake up and acknowledge with a short greeting."}],max_tokens:10}),signal:AbortSignal.timeout(e)};t&&(c.dispatcher=K(t)),o?.info(`Sending scheduled wake-up call to provider ${n.name} using model ${r}...`);let l=await fetch(s,c);if(l.ok)return{success:!0};let u=await l.text().catch(()=>"");return{success:!1,error:`HTTP ${l.status}: ${u.slice(0,200)||"Unknown error"}`}}catch(i){return{success:!1,error:i?.message||i?.toString()||"Unknown wake-up error"}}}async function Qd(n,e,t,o,r){if(Re(n))return{success:!1,skipped:!0,error:xr};let s=n.baseUrl,a=n.baseUrl.includes("/messages")||e.includes("claude");try{let i={"Content-Type":"application/json",...Aa("rate-limit-probe")};a?(i["x-api-key"]=n.apiKey,i["anthropic-version"]="2023-06-01"):i.Authorization=`Bearer ${n.apiKey}`;let c={method:"POST",headers:i,body:JSON.stringify({model:e,messages:[{role:"user",content:"Hello, please reply briefly."}],max_tokens:10}),signal:AbortSignal.timeout(t)};o&&(c.dispatcher=K(o)),r?.debug?.(`Sending independent ping to rate-limited model ${n.name} (${e})...`);let l=await fetch(s,c);if(l.ok)return{success:!0};let u=await l.text().catch(()=>"");return{success:!1,error:`HTTP ${l.status}: ${u.slice(0,200)||"Unknown error"}`}}catch(i){return{success:!1,error:i?.message||i?.toString()||"Unknown ping error"}}}function Oa(n,e,t,o,r,s){return _e||(_e=new Bn(n,e,t,o,r,s)),_e}function _t(n,e,t,o,r,s){let a=Oa(n,e,t,o,r,s);return a.start(),a}function Sr(){_e&&_e.stop()}function Cr(){_e&&(_e.stop(),_e=null)}var Hd,zd,Bd,xr,Bn,_e,Jn=R(()=>{"use strict";re();Ne();Tr();Fe();wo();q();Hd="x-claude-code-router-source",zd="x-claude-code-router-version";Bd={enabled:!0,quotaProbeIntervalMinutes:10,probeTimeoutMs:15e3,slowThresholdMs:3e3,initialDelayMs:5e3,excludeProviders:[]};xr="Managed provider requires its plugin's authenticated model sync";Bn=class{config;quotaProbeTimer;healthProbeTimer;wakeupTimer;rateLimitProbeTimer;lastWakeupDate=new Map;getProviders;resolveProxyUrl;logger;getConfig;resolveManagedRuntime;managedProbeTimer;running=!1;probeTelemetry=new Map;constructor(e,t,o,r,s,a){this.config={...Bd,...t},this.getProviders=e,this.resolveProxyUrl=o,this.logger=r,this.getConfig=s,this.resolveManagedRuntime=a}recordProbe(e,t,o){let r=Date.now(),s=t.success&&t.latencyMs>this.config.slowThresholdMs,a;t.success?a=s?"slow":"healthy":a=t.errorKind==="timeout"?"timeout":"error";let i=this.probeTelemetry.get(e),c={provider:e,latencyMs:t.latencyMs,status:a,isSlow:s,errorKind:t.errorKind,errorMessage:t.error,lastProbeAt:r,lastSuccessAt:t.success?r:i?.lastSuccessAt,source:o};return this.probeTelemetry.set(e,c),s&&this.logger?.warn?.(`Slow network detected for provider ${e}: probe took ${t.latencyMs} ms (threshold ${this.config.slowThresholdMs} ms)`),c}getProbeTelemetry(){return Array.from(this.probeTelemetry.values()).map(e=>({...e}))}getProviderProbeTelemetry(e){let t=this.probeTelemetry.get(e);return t?{...t}:void 0}start(){if(this.running)return;let e=this.isWakeupGloballyEnabled();!this.config.enabled&&!e||(this.running=!0,setTimeout(()=>{this.running&&(this.config.enabled&&(this.runQuotaProbe(),this.runHealthProbe(),this.runRateLimitProbe()),this.runScheduledWakeup())},this.config.initialDelayMs),this.config.enabled&&(this.quotaProbeTimer=setInterval(()=>this.runQuotaProbe(),this.config.quotaProbeIntervalMinutes*60*1e3),this.healthProbeTimer=setInterval(()=>this.runHealthProbe(),300*1e3),this.rateLimitProbeTimer=setInterval(()=>this.runRateLimitProbe(),120*1e3),this.managedProbeTimer=setInterval(()=>this.runManagedRecoveryProbe(),this.config.quotaProbeIntervalMinutes*60*1e3)),this.wakeupTimer=setInterval(()=>this.runScheduledWakeup(),60*1e3),this.logger?.info("Active probe service started"))}stop(){this.running=!1,this.quotaProbeTimer&&(clearInterval(this.quotaProbeTimer),this.quotaProbeTimer=void 0),this.healthProbeTimer&&(clearInterval(this.healthProbeTimer),this.healthProbeTimer=void 0),this.managedProbeTimer&&(clearInterval(this.managedProbeTimer),this.managedProbeTimer=void 0),this.rateLimitProbeTimer&&(clearInterval(this.rateLimitProbeTimer),this.rateLimitProbeTimer=void 0),this.wakeupTimer&&(clearInterval(this.wakeupTimer),this.wakeupTimer=void 0),this.logger?.info("Active probe service stopped")}async runQuotaProbe(){let e=this.getProviders().filter(s=>s?.name&&s.enabled!==!1&&!Re(s)&&!this.config.excludeProviders.includes(s.name)),t=j();if(e.length===0)return;let o=[];for(let s of e){let a=br(s.baseUrl),i=Array.isArray(s.models)?s.models:[],c=this.resolveProxyUrl?.(s);if(!a){let l;try{l=new URL(s.baseUrl).hostname}catch{l=void 0}this.logger?.debug?.(`No quota adapter for provider ${s.name}`+(l?` (host: ${l})`:"")+" \u2014 skipping quota probe")}a&&o.push({provider:s.name,models:i,type:"quota-adapter",promise:a.queryQuota(s,this.config.probeTimeoutMs,c).then(l=>{if(l){Go(s.name,l),this.logger?.debug?.(`Stored quota probe result for ${s.name}`);let u=l.limitDaily!==void 0&&l.usedDailyBalance!==void 0&&l.usedDailyBalance>=l.limitDaily,p=l.totalBalance!==void 0&&l.usedBalance!==void 0&&l.usedBalance>=l.totalBalance;if(u||p){let d=u?`Quota exhausted: 5h limit reached (${l.usedDailyBalance}/${l.limitDaily})`:`Quota exhausted: 7d balance depleted (${l.usedBalance}/${l.totalBalance})`;for(let f of i){if(t.getState(s.name,f)?.rateLimitUntil){this.logger?.debug?.(`Skip forceOpen for ${s.name} (${f}): already rate-limited with active cooldown`);continue}t.forceOpen(s.name,f,d)}this.logger?.warn?.(`${d} for ${s.name}, marked as unhealthy`)}else for(let d of i){let f=t.getState(s.name,d);f&&f.status==="open"&&f.lastError?.includes("Quota exhausted")&&(t.recover(s.name,d),this.logger?.info?.(`Quota recovered for ${s.name} (${d}), marked as healthy`))}}})}),Gd(s.baseUrl)&&o.push({provider:s.name,models:i,type:"rate-limit-headers",promise:vr(s,this.config.probeTimeoutMs,c).then(l=>{this.recordProbe(s.name,l,"rate-limit-headers")})})}if(o.length===0)return;this.logger?.debug?.(`Running quota probe with ${o.length} tasks for ${e.length} providers`);let r=await Promise.allSettled(o.map(s=>s.promise));for(let s=0;s<o.length;s++){let a=r[s];if(a.status==="rejected"){let i=o[s];this.logger?.warn?.(`Quota probe failed for ${i.provider} (${i.type}): ${a.reason}`)}}}async runHealthProbe(){let e=j(),t=this.getProviders().filter(r=>r?.name&&r.enabled!==!1&&!Re(r)&&!this.config.excludeProviders.includes(r.name));if(t.length===0)return;this.logger?.debug?.(`Running health probe for ${t.length} providers`);let o=await Promise.allSettled(t.map(r=>vr(r,this.config.probeTimeoutMs,this.resolveProxyUrl?.(r))));for(let r=0;r<t.length;r++){let s=t[r],a=o[r],i=Array.isArray(s.models)?s.models:[];if(a.status==="fulfilled"){let c=a.value;if(c.skipped)continue;if(this.recordProbe(s.name,c,"health"),c.success){let l=0;for(let u of i){let p=e.getState(s.name,u);if(p&&p.status==="open"){let d=p.lastError?.includes("Quota exhausted"),f=p.rateLimitUntil||p.lastError&&(p.lastError.includes("429")||p.lastError.toLowerCase().includes("rate limit")||p.lastError.toLowerCase().includes("rate_limit")||p.lastError.toLowerCase().includes("too many requests")||p.lastError.toLowerCase().includes("\u9650\u6D41"));if(d){this.logger?.debug?.(`Skipping health probe recovery for ${s.name} (${u}) because quota is exhausted`);continue}if(f||p.rateLimitUntil){this.logger?.debug?.(`Skipping health probe recovery for rate-limited ${s.name} (${u})`);continue}}e.recordSuccess(s.name,u),l++}l>0&&this.logger?.info?.(`Health probe succeeded for ${s.name}`)}else{for(let l of i)e.recordFailure(s.name,l,c.error);this.logger?.warn?.(`Health probe failed for ${s.name}: ${c.error}`)}}else{this.recordProbe(s.name,{success:!1,error:a.reason?.message||String(a.reason||"Probe error"),latencyMs:0,errorKind:"network"},"health");for(let c of i)e.recordFailure(s.name,c,a.reason?.message||"Probe error");this.logger?.warn?.(`Health probe error for ${s.name}: ${a.reason}`)}}}async runManagedRecoveryProbe(){let e=j();if(!this.resolveManagedRuntime)return;let t=e.getFailPoolModels();if(t.length===0)return;let o=new Map;for(let r of t){let[s,...a]=r.split(","),i=a.join(",");if(!s||!i)continue;let c=o.get(s)??[];c.push(i),o.set(s,c)}for(let[r,s]of o){let a=this.getProviders().find(d=>d?.name===r&&d.enabled!==!1);if(!a)continue;let i=this.resolveManagedRuntime(a);if(!i)continue;let c=s[0],l=e.getState(r,c);if(!l||l.status!=="open"||l.rateLimitUntil&&Date.now()<l.rateLimitUntil)continue;let u=Math.max(l.lastFailureTime??0,l.lastProbeTime??0);Date.now()-u<this.config.quotaProbeIntervalMinutes*6e4||!await this.probeManagedAccountState(r,i,a,c,s,e)||await this.probeManagedLiveness(r,i,a,c,s,e)}}async probeManagedAccountState(e,t,o,r,s,a){try{if(typeof t.probeAccountState=="function"){let i=await t.probeAccountState();return i&&i.available===!1?(a.recordProbeAttempt?.(e,r),typeof i.parkedUntil=="number"&&i.parkedUntil>Date.now()&&a.markParkedUntil?.(e,r,i.parkedUntil),this.logger?.debug?.(`Managed probe: ${e} account parked (${i.reason??"unavailable"}), skipping liveness`),!1):!0}return typeof t.ensureUsable=="function"&&await t.ensureUsable(),!0}catch(i){return a.recordProbeAttempt?.(e,r),this.logger?.debug?.(`Managed probe: ${e} account unusable (${i?.code||i?.message||i}), skipping liveness`),!1}}async probeManagedLiveness(e,t,o,r,s,a){let i=this.config.probeTimeoutMs,c={model:r,max_tokens:1,messages:[{role:"user",content:"ping"}],stream:!1},l=async()=>{let p=o.baseUrl||o.api_base_url;return await fetch(p,{method:"POST",headers:{"content-type":"application/json",...o.apiKey?{authorization:`Bearer ${o.apiKey}`}:{}},body:JSON.stringify(c),signal:AbortSignal.timeout(i)})},u={TIMEOUT:i};try{this.logger?.debug?.(`Managed liveness probe for ${e} (${r})`);let p=typeof t.probeLiveness=="function"?await t.probeLiveness({attempt:l,model:r,provider:o,config:u}):typeof t.dispatchRequest=="function"?await t.dispatchRequest({attempt:l,requestBody:c,config:u,provider:o}):await l();if(p?.ok){for(let d of s)a.recover(e,d);this.logger?.info?.(`Managed liveness probe succeeded for ${e}, restored ${s.length} model(s)`)}else a.recordProbeAttempt?.(e,r),this.logger?.debug?.(`Managed liveness probe failed for ${e}: HTTP ${p?.status}`)}catch(p){a.recordProbeAttempt?.(e,r),this.logger?.debug?.(`Managed liveness probe errored for ${e}: ${p?.message||p}`)}}async runRateLimitProbe(){let e=j(),t=e.getRateLimitedModels();if(t.length===0)return;let o=this.getProviders(),r=this.config.probeTimeoutMs;this.logger?.debug?.(`Running rate-limit recovery probe for ${t.length} model(s)`);for(let s of t){let[a,...i]=s.split(","),c=i.join(",");if(!a||!c)continue;let l=o.find(d=>d?.name===a);if(l&&Re(l))continue;let u=e.getState(a,c);if(!u||!u.rateLimitUntil)continue;if(Date.now()>=u.rateLimitUntil){e.recover(a,c),this.logger?.info?.(`Rate-limit cooldown expired, auto-recovered ${s}`);continue}let p=o.find(d=>d?.name===a&&d.enabled!==!1);if(!p){this.logger?.warn?.(`Provider ${a} not found or disabled for rate-limit probe`);continue}try{let d=await Qd(p,c,r,this.resolveProxyUrl?.(p),this.logger);if(d.success)this.logger?.info?.(`Rate-limit probe succeeded for ${s}, recovering model`),e.recover(a,c);else if(d.error&&(d.error.includes("429")||d.error.toLowerCase().includes("rate limit")||d.error.toLowerCase().includes("rate_limit")||d.error.toLowerCase().includes("too many requests")||d.error.toLowerCase().includes("\u9650\u6D41"))){let f=Date.now();u.rateLimitUntil&&u.rateLimitUntil>f?u.rateLimitUntil+=120*1e3:u.rateLimitUntil=f+120*1e3,this.logger?.debug?.(`Rate-limit probe for ${s} confirmed still limited, extending cooldown`)}else this.logger?.debug?.(`Rate-limit probe for ${s} returned non-rate-limit error: ${d.error?.slice(0,100)}`)}catch(d){this.logger?.warn?.(`Rate-limit probe exception for ${s}: ${d?.message||d}`)}}}async runScheduledWakeup(){if(!this.isWakeupGloballyEnabled())return;let e=this.getProviders().filter(i=>i?.name&&i.enabled!==!1&&!Re(i)&&i.wakeupEnabled===!0);if(e.length===0)return;let t=new Date,o=t.getHours(),r=t.getMinutes(),s=Wd(t),a=this.getConfig&&this.getConfig("WAKEUP_TIME")||"06:00";for(let i of e){let c=i.wakeupTime||a,[l,u]=c.split(":"),p=parseInt(l,10),d=parseInt(u,10);if(isNaN(p)||isNaN(d))continue;let f=o>p||o===p&&r>=d,h=(p*60+d)*6e4-(o*60+r)*6e4,g=h>0&&h<=300*1e3;(f||g)&&!this.hasWakeupFiredToday(i.name,s)&&(this.logger?.info?.(`Scheduled wake-up triggered for provider ${i.name} at ${c}`),Vd(i,3e4,this.resolveProxyUrl?.(i),this.logger).then(m=>{m.success?this.logger?.info?.(`Successfully woke up provider ${i.name}`):this.logger?.error?.(`Failed to wake up provider ${i.name}: ${m.error}`)}).catch(m=>{this.logger?.error?.(`Error in wake-up task for ${i.name}: ${m}`)}))}}isWakeupGloballyEnabled(){return this.getConfig?Jd(this.getConfig("WAKEUP_ENABLED")):!1}hasWakeupFiredToday(e,t){return this.lastWakeupDate.get(e)===t?!0:(this.lastWakeupDate.set(e,t),!1)}async probeProviderManually(e){let o=this.getProviders().find(i=>i.name===e);if(!o)return this.logger?.warn?.(`Provider ${e} not found for manual probe`),{success:!1,latencyMs:0,status:"error",isSlow:!1,error:`Provider ${e} not found`};if(o.enabled===!1)return this.logger?.warn?.(`Provider ${e} is disabled, skipping manual probe`),{success:!1,latencyMs:0,status:"error",isSlow:!1,error:`Provider ${e} is disabled`};let r=await vr(o,this.config.probeTimeoutMs,this.resolveProxyUrl?.(o));if(r.skipped)return{success:!1,skipped:!0,latencyMs:r.latencyMs,status:"skipped",isSlow:!1,error:r.error};let s=this.recordProbe(o.name,r,"manual"),a=Array.isArray(o.models)?o.models:[];if(r.success)for(let i of a)j().recordSuccess(o.name,i);else for(let i of a)j().recordFailure(o.name,i,r.error);return{success:r.success,latencyMs:r.latencyMs,status:s.status,isSlow:s.isSlow,errorKind:r.errorKind,error:r.error}}},_e=null});var Ia=R(()=>{"use strict"});var Rr,bt,Ma=R(()=>{"use strict";Rr=class{plugins=new Map;pluginInstances=new Map;registerPlugin(e,t={}){this.pluginInstances.set(e.name,e),this.plugins.set(e.name,{name:e.name,enabled:t.enabled!==!1,options:t})}async enablePlugin(e,t){let o=this.plugins.get(e),r=this.pluginInstances.get(e);if(!o||!r)throw new Error(`Plugin ${e} not found`);o.enabled&&await t.register(r.register,o.options)}async enablePlugins(e){for(let[t,o]of this.plugins)if(o.enabled)try{await this.enablePlugin(t,e)}catch(r){let s=r instanceof Error?r.message:String(r);e.log?.error(`Failed to enable plugin ${t}: ${s}`)}}getPlugins(){return Array.from(this.plugins.values())}getPlugin(e){return this.pluginInstances.get(e)}hasPlugin(e){return this.pluginInstances.has(e)}isPluginEnabled(e){return this.plugins.get(e)?.enabled||!1}setPluginEnabled(e,t){let o=this.plugins.get(e);o&&(o.enabled=t)}removePlugin(e){this.plugins.delete(e),this.pluginInstances.delete(e)}clear(){this.plugins.clear(),this.pluginInstances.clear()}},bt=new Rr});var ie,wr=R(()=>{"use strict";ie=class extends TransformStream{buffer="";currentEvent={};constructor(){super({transform:(e,t)=>{this.buffer+=e;let o=this.buffer.split(`
|
|
310
|
+
`);this.buffer=o.pop()||"";for(let r of o){let s=this.processLine(r);s&&t.enqueue(s)}},flush:e=>{if(this.buffer.trim()){let t=[];this.processLine(this.buffer.trim(),t),t.forEach(o=>e.enqueue(o))}Object.keys(this.currentEvent).length>0&&e.enqueue(this.currentEvent)}})}processLine(e,t){if(!e.trim()){if(Object.keys(this.currentEvent).length>0){let o={...this.currentEvent};return this.currentEvent={},t?(t.push(o),null):o}return null}if(e.startsWith("event:"))this.currentEvent.event=e.slice(6).trim();else if(e.startsWith("data:")){let o=e.slice(5).trim();if(o==="[DONE]")this.currentEvent.data={type:"done"};else try{this.currentEvent.data=JSON.parse(o)}catch{this.currentEvent.data={raw:o,error:"JSON parse failed"}}}else e.startsWith("id:")?this.currentEvent.id=e.slice(3).trim():e.startsWith("retry:")&&(this.currentEvent.retry=parseInt(e.slice(6).trim()));return null}}});var Xe,Pr=R(()=>{"use strict";Xe=class extends TransformStream{constructor(){super({transform:(e,t)=>{let o="";e.event&&(o+=`event: ${e.event}
|
|
311
311
|
`),e.id&&(o+=`id: ${e.id}
|
|
312
312
|
`),e.retry&&(o+=`retry: ${e.retry}
|
|
313
313
|
`),e.data&&(e.data.type==="done"?o+=`data: [DONE]
|
|
@@ -318,7 +318,7 @@ Stack: ${e.stack}`)}}async registerDefaultTransformersInternal(){try{Object.valu
|
|
|
318
318
|
${this.toMarkdown(r,t+1)}`:`${o}- ${r}`).join(`
|
|
319
319
|
`):typeof e=="object"&&e!==null?Object.entries(e).map(([r,s])=>typeof s=="object"&&s!==null?`${o}${r}:
|
|
320
320
|
${this.toMarkdown(s,t+1)}`:`${o}${r}: ${s}`).join(`
|
|
321
|
-
`):`${o}${e}`}async output(e,t={}){try{let o=this.formatData(e,t);switch(this.config.level||"log"){case"info":console.info(o);break;case"warn":console.warn(o);break;case"error":console.error(o);break;case"debug":console.debug(o);break;case"log":default:console.log(o);break}return!0}catch(o){return console.error("[ConsoleOutputHandler] Output failed:",o),!1}}}});var Tt,Ir=R(()=>{"use strict";Tt=class{type="webhook";config;defaultTimeout=3e4;constructor(e){if(!e.url)throw new Error("Webhook URL is required");this.config={method:"POST",retry:{maxAttempts:3,backoffMs:1e3},silent:!1,...e}}buildHeaders(){let e={"Content-Type":"application/json",...this.config.headers||{}};if(this.config.auth)switch(this.config.auth.type){case"bearer":this.config.auth.token&&(e.Authorization=`Bearer ${this.config.auth.token}`);break;case"basic":if(this.config.auth.username&&this.config.auth.password){let t=Buffer.from(`${this.config.auth.username}:${this.config.auth.password}`).toString("base64");e.Authorization=`Basic ${t}`}break;case"custom":this.config.auth.custom&&(e[this.config.auth.custom.header]=this.config.auth.custom.value);break}return e}buildBody(e,t){let{format:o="json",timestamp:r=!0,prefix:s,metadata:a}=t||{},i={data:e};return r&&(i.timestamp=new Date().toISOString()),s&&(i.prefix=s),a&&Object.keys(a).length>0&&(i.metadata=a),i}async sendRequest(e,t,o,r,s){let a=new AbortController,i=setTimeout(()=>a.abort(),s);try{let c=await fetch(e,{method:t,headers:o,body:JSON.stringify(r),signal:a.signal});if(clearTimeout(i),!c.ok)throw new Error(`HTTP ${c.status}: ${c.statusText}`);return c}catch(c){throw clearTimeout(i),c}}delay(e){return new Promise(t=>setTimeout(t,e))}async sendWithRetry(e,t,o,r,s,a){let i=null;for(let c=1;c<=a.maxAttempts;c++)try{return await this.sendRequest(e,t,o,r,s)}catch(l){if(i=l,c===a.maxAttempts)break;let u=a.backoffMs*Math.pow(2,c-1);console.warn(`[WebhookOutputHandler] Request failed (attempt ${c}/${a.maxAttempts}), retrying in ${u}ms...`,l.message),await this.delay(u)}throw i}async output(e,t={}){let o=t.timeout||this.defaultTimeout;try{let r=this.buildHeaders(),s=this.buildBody(e,t),a=await this.sendWithRetry(this.config.url,this.config.method,r,s,o,this.config.retry);return!0}catch(r){let s=r instanceof Error?r.message:String(r);if(this.config.silent)return console.error(`[WebhookOutputHandler] Failed to send data: ${s}`),!1;throw new Error(`Webhook output failed: ${s}`)}}}});import{lstat as Gn,opendir as Xd,unlink as Zd}from"node:fs/promises";import{join as $a,resolve as Nr}from"node:path";import{tmpdir as qd}from"node:os";async function Vn(n,e){let t=Nr(n),o=Kn.get(t),r,s=new Promise(a=>{r=a});Kn.set(t,s);try{return await o,await e()}finally{r(),Kn.get(t)===s&&Kn.delete(t)}}function Da(n,e){return n.dev===e.dev&&n.ino===e.ino}async function Na(n,e){try{let t=await Gn(n);return t.isDirectory()&&!t.isSymbolicLink()&&Da(e,t)}catch{return!1}}function rp(){return new Promise(n=>{setTimeout(n,10).unref()})}async function Fa(n,e,t,o){let r=Nr(n);if(o?.aborted||Mr.has(r))return 0;Mr.add(r);let s=0;try{let a=await Gn(r);if(!a.isDirectory()||a.isSymbolicLink()||o?.aborted)return 0;let i=await Xd(r,{bufferSize:32});try{let c=0,l=!0;for await(let u of i){if(o?.aborted||!l)break;try{if(!u.isFile()||u.isSymbolicLink()||!t(u.name))continue;let p=$a(r,u.name);try{let d=await Gn(p);if(!d.isFile()||d.isSymbolicLink()||d.mtimeMs>=e)continue;await Vn(p,async()=>{if(o?.aborted||!await Na(r,a))return!1;let h=await Gn(p);return!h.isFile()||h.isSymbolicLink()||!Da(d,h)||h.mtimeMs!==d.mtimeMs||h.mtimeMs>=e||o?.aborted?!1:(await Zd(p),!0)})&&s++}catch{}}finally{++c%64===0&&(await rp(),l=!o?.aborted&&await Na(r,a))}}}finally{await i.close().catch(()=>{})}}catch{}finally{Mr.delete(r)}return s}function Ua(n,e,t,o,r){if(!Number.isFinite(o)||o<=0)return Promise.resolve(0);let s=`${e}-`,a=t?`.${t}`:"";return Fa(n,Date.now()-o,i=>op.test(i)?!0:!i.endsWith(".tmp")&&i.startsWith(s)&&i.endsWith(a),r)}function sp(n,e){let t=Date.now()-ep;return Fa(n,t,o=>{let r=np.exec(o);return r!==null&&Number(r[1])<t},e)}function $r(n,e,t){let o=Lr.get(n);if(!o){let s=new AbortController,a,i=()=>{s.signal.aborted||Promise.resolve().then(()=>e(s.signal)).catch(()=>{})},c=setTimeout(()=>{s.signal.aborted||(i(),a=setInterval(i,tp),a.unref())},t);c.unref(),o={users:0,stop:()=>{s.abort(),clearTimeout(c),a&&clearInterval(a)}},Lr.set(n,o)}o.users++;let r=!1;return()=>{r||(r=!0,--o.users===0&&(o.stop(),Lr.delete(n)))}}function ja(n=$a(qd(),"claude-code-router")){return $r(`legacy:${Nr(n)}`,e=>sp(n,e),1e3)}var ep,tp,np,op,Mr,Kn,Lr,Dr=R(()=>{"use strict";ep=3600*1e3,tp=600*1e3,np=/^session-[A-Za-z0-9_.-]+-(\d{13})\.json$/,op=/^\.ccr-tmp-[1-9]\d*-[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\.tmp$/,Mr=new Set,Kn=new Map,Lr=new Map});import{lstat as ip,mkdir as ap,open as cp,rename as lp,unlink as up}from"node:fs/promises";import{randomUUID as dp}from"node:crypto";import{sanitizeTempFileKey as pp}from"@wengine-ai/claude-code-router-shared";import{basename as fp,join as Fr,resolve as mp}from"node:path";import{tmpdir as gp}from"node:os";var vt,Ur=R(()=>{"use strict";Dr();vt=class{type="temp-file";config;baseDir;controller=new AbortController;stopSchedule;constructor(e={}){if(this.config={subdirectory:"claude-code-router",extension:"json",includeTimestamp:!1,prefix:"session",retentionMs:36e5,...e},this.baseDir=mp(Fr(gp(),this.config.subdirectory)),Number.isFinite(this.config.retentionMs)&&this.config.retentionMs>0){let t=JSON.stringify([this.baseDir,this.config.prefix,this.config.extension,this.config.retentionMs]);this.stopSchedule=$r(`handler:${t}`,o=>this.pruneOldFiles(o),6e4)}}async ensureDir(){await ap(this.baseDir,{recursive:!0});let e=await ip(this.baseDir);if(!e.isDirectory()||e.isSymbolicLink())throw new Error("Unsafe temp output directory")}getFilePath(e){let t=this.config.prefix||"session",o=this.config.extension?`.${this.config.extension}`:"",r=this.config.includeTimestamp?`-${Date.now()}`:"",s=`${t}-${pp(e)}${r}${o}`;if(fp(s)!==s||s.includes("\\"))throw new Error("Temp file configuration must not contain path separators");return Fr(this.baseDir,s)}async output(e,t={}){try{let o=typeof t.metadata?.statsKey=="string"&&t.metadata.statsKey?t.metadata.statsKey:t.metadata?.sessionId;if(!o)return!1;let r=t.metadata?.sessionId??o,s=JSON.stringify({...e,timestamp:Date.now(),sessionId:r},null,2),a=this.getFilePath(o);return await Vn(a,async()=>{await this.ensureDir();let i=Fr(this.baseDir,`.ccr-tmp-${process.pid}-${dp()}.tmp`);return Vn(i,async()=>{let c=!1;try{let l=await cp(i,"wx");c=!0;try{await l.writeFile(s,"utf-8")}finally{await l.close()}return await lp(i,a),!0}finally{c&&await up(i).catch(()=>{})}})})}catch{return!1}}pruneOldFiles(e=this.controller.signal){return Ua(this.baseDir,this.config.prefix||"session",this.config.extension||"",this.config.retentionMs,e)}dispose(){this.controller.abort(),this.stopSchedule?.()}getBaseDir(){return this.baseDir}}});var jr,Xe,Ha=R(()=>{"use strict";Or();Ir();Ur();jr=class{handlers=new Map;defaultOptions={};registerHandler(e,t){this.handlers.set(e,t)}registerHandlers(e){for(let t of e)if(t.enabled!==!1)try{let o=this.createHandler(t),r=t.type+"_"+Date.now();this.registerHandler(r,o)}catch(o){console.error(`[OutputManager] Failed to register ${t.type} handler:`,o)}}createHandler(e){switch(e.type){case"console":return new kt(e.config);case"webhook":return new Tt(e.config);case"temp-file":return new vt(e.config);default:throw new Error(`Unknown output handler type: ${e.type}`)}}unregisterHandler(e){return this.handlers.delete(e)}getHandler(e){return this.handlers.get(e)}getAllHandlers(){return new Map(this.handlers)}clearHandlers(){this.handlers.clear()}setDefaultOptions(e){this.defaultOptions={...this.defaultOptions,...e}}getDefaultOptions(){return{...this.defaultOptions}}async output(e,t){let o={...this.defaultOptions,...t},r={success:[],failed:[]},s=Array.from(this.handlers.entries()).map(async([a,i])=>{try{await i.output(e,o)?r.success.push(a):r.failed.push(a)}catch(c){console.error(`[OutputManager] Handler ${a} failed:`,c),r.failed.push(a)}});return await Promise.all(s),r}async outputTo(e,t,o){let r={...this.defaultOptions,...o},s={success:[],failed:[]},a=e.map(async i=>{let c=this.handlers.get(i);if(!c){console.warn(`[OutputManager] Handler ${i} not found`),s.failed.push(i);return}try{await c.output(t,r)?s.success.push(i):s.failed.push(i)}catch(l){console.error(`[OutputManager] Handler ${i} failed:`,l),s.failed.push(i)}});return await Promise.all(a),s}async outputToType(e,t,o){let r=Array.from(this.handlers.entries()).filter(([s,a])=>a.type===e).map(([s])=>s);return this.outputTo(r,t,o)}},Xe=new jr});var Hr=R(()=>{"use strict";La();Or();Ir();Ur();Ha()});import hp from"fastify-plugin";import{TOKEN_SPEED_TEMP_SUBDIRECTORY as yp}from"@wengine-ai/claude-code-router-shared";function Qn(){return{subdirectory:yp,extension:"json",includeTimestamp:!1,prefix:"session"}}function za(n,e,t=0){if(n<=0)return 0;let o=Math.max((e-t)/1e3,_p);return Math.round(n/o)}function St(n){let e=(n.match(/[\u4e00-\u9fa5]/g)||[]).length,t=n.length-e;return Math.ceil(e/1.5+t/4)}async function Ba(n,e,t,o=!1){let r=o?"[Token Speed Final]":"[Token Speed]",s={requestId:n.requestId.substring(0,8),sessionId:n.sessionId,stream:n.stream,tokenCount:n.tokenCount,tokensPerSecond:n.tokensPerSecond,timeToFirstToken:n.timeToFirstToken?`${n.timeToFirstToken}ms`:"N/A",duration:`${((n.lastTokenTime-n.startTime)/1e3).toFixed(2)}s`,timestamp:Date.now()},a={prefix:r,metadata:{sessionId:n.sessionId,statsKey:n.statsKey},...t};for(let i of e)try{await Xe.outputToType(i,s,a)}catch(c){console.error(`[TokenSpeedPlugin] Failed to output to ${i}:`,c)}}var xt,zr,_p,Yn,Ja=R(()=>{"use strict";Ar();Hr();Fe();xt=new Map,zr=new Map,_p=1,Yn={name:"token-speed",version:"1.0.0",description:"Statistics for streaming response token generation speed",register:hp(async(n,e)=>{let t={reporter:["console","temp-file"],...e},o=Array.isArray(t.reporter)?t.reporter:[t.reporter];if(t.outputHandlers&&t.outputHandlers.length>0)Xe.registerHandlers(t.outputHandlers);else{let a=[];for(let i of o)i==="console"?a.push({type:"console",enabled:!0,config:{colors:!0,level:"log"}}):i==="temp-file"?a.push({type:"temp-file",enabled:!0,config:Qn()}):i==="webhook"&&console.warn("[TokenSpeedPlugin] Webhook reporter requires explicit configuration in outputHandlers");a.length>0&&Xe.registerHandlers(a)}t.outputOptions&&Xe.setDefaultOptions(t.outputOptions);let r=async a=>{let i=n.tokenizerService;if(!i)return n.log?.warn("TokenizerService not available"),null;if(!a.provider||!a.model)return null;let c=a.provider,l=a.model,u=`${c}:${l}`;if(zr.has(u))return zr.get(u);let p=i.getTokenizerConfigForModel(c,l);if(!p)return n.log?.debug(`No tokenizer config for ${c}:${l}, using fallback`),null;try{let d=await i.getTokenizer(p,c);return zr.set(u,d),n.log?.info(`Created tokenizer for ${c}:${l} - ${d.name}`),d}catch(d){return n.log?.warn(`Failed to create tokenizer for ${c}:${l}: ${d.message}`),null}},s=a=>{let i=new URL(`http://127.0.0.1${a}`).pathname;return i.endsWith("/v1/messages")||i.endsWith("/v1/responses")};n.addHook("onRequest",async a=>{s(a.url)&&(a.requestStartTime=performance.now())}),n.addHook("onSend",async(a,i,c)=>{let l=a.requestStartTime;if(!l)return;let u=a.id||Date.now().toString(),p=a.usageSessionId||u,d=a.sessionId;if(!d)try{d=he(a.body?.metadata?.user_id)||p}catch{d=p}let m=await r(a);if(c instanceof ReadableStream){xt.set(u,{requestId:u,sessionId:d,statsKey:p,startTime:l,lastTokenTime:l,tokenCount:0,tokensPerSecond:0,stream:!0});let[_,b]=c.tee(),y=async()=>{let k=null,T=async x=>{let v=xt.get(u);if(!v)return;let C=v.firstTokenTime?v.firstTokenTime-v.startTime:0,P=(x?v.lastTokenTime:performance.now())-v.startTime;v.tokensPerSecond=za(v.tokenCount,P,C),await Ba(v,o,t.outputOptions,x).catch(I=>{n.log?.warn(`Failed to output streaming stats: ${I.message}`)})};try{let v=b.pipeThrough(new TextDecoderStream).pipeThrough(new ie).getReader();for(k=setInterval(async()=>{xt.get(u)&&await T(!1)},1e3);;){let{done:C,value:S}=await v.read();if(C)break;let P=S,I=xt.get(u);if(!I)continue;let O=performance.now(),E=P.event||P.data?.type,w=P.event==="content_block_start"||P.event==="content_block_delta"||P.event==="text_block"||P.event==="content_block"||E==="response.output_text.delta"||E==="response.function_call_arguments.delta"||E==="response.reasoning_summary_text.delta";!I.firstTokenTime&&w&&(I.firstTokenTime=O,I.timeToFirstToken=Math.round(O-I.startTime));let A="";if(P.event==="content_block_delta"&&P.data?.delta){let N=P.data.delta.type;N==="text_delta"?A=P.data.delta.text||"":N==="input_json_delta"?A=P.data.delta.partial_json||"":N==="thinking_delta"&&(A=P.data.delta.thinking||"")}if((E==="response.output_text.delta"||E==="response.function_call_arguments.delta"||E==="response.reasoning_summary_text.delta")&&(A=typeof P.data?.delta=="string"?P.data.delta:""),A){let N=m&&m.encodeText?m.encodeText(A).length:St(A);I.tokenCount+=N,I.lastTokenTime=O}(P.event==="message_stop"||E==="response.completed"||E==="response.failed")&&(k&&(clearInterval(k),k=null),await T(!0),xt.delete(u))}}catch(x){k&&clearInterval(k),x.name!=="AbortError"&&x.code!=="ERR_STREAM_PREMATURE_CLOSE"&&n.log?.warn(`Error processing token stats: ${x.message}`)}};return a.tokenSpeedCapturePromise=y().catch(k=>{console.log(k),n.log?.warn(`Background stats processing failed: ${k.message}`)}),_}let h=performance.now(),f=0,g=!1;if(c&&typeof c=="string")try{let _=JSON.parse(c);if(typeof _.usage?.output_tokens=="number")f=_.usage.output_tokens,g=!0;else{let b=_.content??_.message?.content;if(b!==void 0)if(g=!0,m)Array.isArray(b)?f=b.reduce((y,k)=>{if(k.type==="text"){let T=k.text||"";return y+(m.encodeText?m.encodeText(T).length:St(T))}return y},0):typeof b=="string"&&(f=m.encodeText?m.encodeText(b).length:St(b));else{let y=Array.isArray(b)?b.map(k=>k.text).join(""):typeof b=="string"?b:"";f=St(y)}}}catch{}if(g){let _=h-l,b={requestId:u,sessionId:d,statsKey:p,startTime:l,lastTokenTime:h,tokenCount:f,tokensPerSecond:za(f,_),stream:!1};await Ba(b,o,t.outputOptions,!0)}return c})})}});var Br=R(()=>{"use strict";Ia();Ma();Ja();Hr()});import ne from"node:fs/promises";import Wa from"json5";import we from"node:path";import{CONFIG_FILE as oe,HOME_DIR as Xn,PLUGINS_DIR as bp}from"@wengine-ai/claude-code-router-shared";function Ka(){if(process.env.VITEST||process.env.CI)throw new Error("Config write attempted during test/CI. Set CCR_CONFIG_DIR to a temp dir to isolate.")}var Jr,Ct,Zn,Rt,Y,qn,le,kp,Wr,wt=R(()=>{"use strict";Jr=n=>{if(typeof n=="string")return n.replace(/\$\{([^}]+)\}|\$([A-Z_][A-Z0-9_]*)/g,(e,t,o)=>{let r=t||o;return process.env[r]||e});if(Array.isArray(n))return n.map(Jr);if(n!==null&&typeof n=="object"){let e={};for(let[t,o]of Object.entries(n))e[t]=Jr(o);return e}return n},Ct=async n=>{try{await ne.access(n)}catch{await ne.mkdir(n,{recursive:!0})}},Zn=async()=>{await Ct(Xn),await Ct(bp),await Ct(we.join(Xn,"logs"))},Rt=async()=>{let n=await ne.readFile(oe,"utf-8");return Wa.parse(n)},Y=async()=>{try{let n=await ne.readFile(oe,"utf-8");try{let e=Wa.parse(n);return Jr(e)}catch(e){console.error(`Failed to parse config file at ${oe}`),console.error("Error details:",e.message),console.error("Please check your config file syntax."),process.exit(1)}}catch(n){if(n.code==="ENOENT")try{await Zn();let e=await qn();e&&console.log(`Backed up existing configuration file to ${e}`);let t={PORT:3456,Providers:[],Router:{}};return await le(t),console.log("Created minimal default configuration file at ~/.claude-code-router/config.json"),console.log("Please edit this file with your actual configuration."),t}catch(e){console.error("Failed to create default configuration:",e.message),process.exit(1)}else console.error(`Failed to read config file at ${oe}`),console.error("Error details:",n.message),process.exit(1)}};qn=async()=>{Ka();try{if(await ne.access(oe).then(()=>!0).catch(()=>!1)){let n=new Date().toISOString().replace(/[:.]/g,"-"),e=`${oe}.${n}.bak`;await ne.copyFile(oe,e);try{let t=we.dirname(oe),o=we.basename(oe),s=(await ne.readdir(t)).filter(a=>a.startsWith(o)&&a.endsWith(".bak")).sort().reverse();if(s.length>3)for(let a=3;a<s.length;a++){let i=we.join(t,s[a]);await ne.unlink(i)}}catch(t){console.warn("Failed to clean up old backups:",t)}return e}}catch(n){console.error("Failed to backup config file:",n)}return null},le=async n=>{Ka(),await Ct(Xn),await kp();let e=`${JSON.stringify(n,null,2)}`;await ne.writeFile(oe,e)},kp=async()=>{if(!await ne.access(oe).then(()=>!0).catch(()=>!1))return;let e=we.join(Xn,"config-history");await Ct(e);let t=new Date().toISOString().replace(/[:.]/g,"-"),o=we.join(e,`config-${t}.json`);await ne.copyFile(oe,o);try{let s=(await ne.readdir(e)).filter(a=>a.startsWith("config-")&&a.endsWith(".json")).sort().reverse();if(s.length>50)for(let a of s.slice(50))await ne.unlink(we.join(e,a))}catch(r){console.warn("Failed to prune config-history:",r)}},Wr=async()=>{let n=await Y();return Object.assign(process.env,n),n}});function Tp(n){return n?.cache_read_input_tokens??n?.input_tokens_details?.cached_tokens??n?.prompt_tokens_details?.cached_tokens??0}function vp(n){return n?.cache_creation_input_tokens??n?.input_tokens_details?.cache_creation_tokens??n?.input_tokens_details?.cache_write_tokens??n?.prompt_tokens_details?.cache_creation_tokens??n?.prompt_tokens_details?.cache_write_tokens??0}function Pe(n){if(!(!n||typeof n!="object"))return{...n,input_tokens:n.input_tokens??n.prompt_tokens??0,output_tokens:n.output_tokens??n.completion_tokens??0,cache_read_input_tokens:Tp(n),cache_creation_input_tokens:vp(n)}}function Pt(n,e,t){let o=t?{}:n||{},r=e||{};return{...o,input_tokens:r.input_tokens||o.input_tokens||0,output_tokens:r.output_tokens||o.output_tokens||0,cache_read_input_tokens:r.cache_read_input_tokens||o.cache_read_input_tokens||0,cache_creation_input_tokens:r.cache_creation_input_tokens||o.cache_creation_input_tokens||0}}var Kr=R(()=>{"use strict"});function eo(n,e,t){if(n){if(typeof n=="string"){let o=n.indexOf(",");if(o>0){let r=n.slice(0,o).trim(),s=n.slice(o+1).trim();r&&s&&e.has(r)&&t.add(Gr(r,s))}return}if(Array.isArray(n)){for(let o of n)eo(o,e,t);return}if(typeof n=="object")for(let o of Object.values(n))eo(o,e,t)}}function Ga(n){let e=n?.Providers||n?.providers||[],t=new Set,o=new Set;for(let r of e){let s=r?.name;if(!s)continue;t.add(s);let a=Array.isArray(r?.models)?r.models:[];for(let i of a)i&&o.add(Gr(s,i))}return eo(n?.Router,t,o),eo(n?.fallback,t,o),o}function Et(n,e){try{let t=j();if(!t?.getAllStates||!t?.recover)return 0;let o=Ga(n),r=0;for(let s of t.getAllStates()||[]){let a=s?.provider,i=s?.model;!a||!i||o.has(Gr(a,i))||(t.recover(a,i),r++)}return r>0&&e?.info?.(`[health-reconcile] Pruned ${r} orphaned provider-health entr${r===1?"y":"ies"}`),r}catch(t){return e?.warn?.(`[health-reconcile] Failed to reconcile health store: ${t?.message||t}`),0}}function to(n,e){try{if(!n)return 0;let t=j();if(!t?.getAllStates||!t?.recover)return 0;let o=0;for(let r of t.getAllStates()||[])r?.provider===n&&r?.model&&(t.recover(n,r.model),o++);return o>0&&e?.info?.(`[health-reconcile] Cleared ${o} health entr${o===1?"y":"ies"} for probed provider ${n}`),o}catch(t){return e?.warn?.(`[health-reconcile] Failed to clear provider health for ${n}: ${t?.message||t}`),0}}var xp,Gr,At=R(()=>{"use strict";re();xp="\0",Gr=(n,e)=>`${n}${xp}${e}`});function Sp(n){return/\[1m\]/i.test(n)?1e6:2e5}function Cp(n){let e=n.toLowerCase();return e.includes("haiku")||e.includes("mini")?8192:32e3}function Rp(n,e=n){let t=Sp(n),o=Cp(n);return{type:"model",id:n,display_name:e,created_at:"2024-01-01T00:00:00Z",context_window:t,contextWindow:t,max_input_tokens:t,maxInputTokens:t,max_tokens:o,maxTokens:o,max_output_tokens:o,maxOutputTokens:o,capabilities:{context_window:t,contextWindow:t,max_input_tokens:t,maxInputTokens:t,max_tokens:o,maxTokens:o,max_output_tokens:o,maxOutputTokens:o}}}function wp(n,e,t){if(!n)return!1;try{return!n(e,t)}catch{return!1}}function Vr(n,e){let t=new Map,o=(r,s=r)=>{!r||t.has(r)||t.set(r,Rp(r,s))};o("ccr-opus","CCR Opus"),o("ccr-sonnet","CCR Sonnet"),o("ccr-haiku","CCR Haiku"),o("ccr-opus[1m]","CCR Opus 1M"),o("ccr-sonnet[1m]","CCR Sonnet 1M"),o("ccr-haiku[1m]","CCR Haiku 1M");for(let r of n.Providers||n.providers||[])if(!(!r?.name||!Array.isArray(r.models)))for(let s of r.models){if(typeof s!="string"||!s)continue;let a=wp(e,r.name,s);a||o(s,s),a||o(`${r.name},${s}`,`${r.name}/${s}`)}return Array.from(t.values())}var Qr=R(()=>{"use strict"});function Pp(n){let e=n.ip||n.connection?.remoteAddress||"";return e==="127.0.0.1"||e==="::1"||e==="::ffff:127.0.0.1"}var no,Yr=R(()=>{"use strict";no=n=>async(e,t,o)=>{if(["/","/health"].includes(e.url)||e.url.startsWith("/ui")||Pp(e))return o();let s=n.Providers||n.providers||[];if(!s||s.length===0)return o();let a=n.APIKEY;if(!a){let u=[`http://127.0.0.1:${n.PORT||3456}`,`http://localhost:${n.PORT||3456}`];if(e.headers.origin&&!u.includes(e.headers.origin)){t.status(403).send("CORS not allowed for this origin");return}else t.header("Access-Control-Allow-Origin",`http://127.0.0.1:${n.PORT||3456}`),t.header("Access-Control-Allow-Origin",`http://localhost:${n.PORT||3456}`);return o()}let i=e.headers.authorization||e.headers["x-api-key"],c=Array.isArray(i)?i[0]:i||"";if(!c){t.log.warn({url:e.url,headers:Object.keys(e.headers)},"[AUTH] No auth header"),t.status(401).send("APIKEY is missing");return}let l="";if(c.startsWith("Bearer")?l=c.split(" ")[1]:l=c,l!==a){t.log.warn({url:e.url,gotPrefix:l.slice(0,10),gotSuffix:l.slice(-6),gotLen:l.length,expectedPrefix:a.slice(0,6),expectedSuffix:a.slice(-6),expectedLen:a.length},"[AUTH] Key mismatch"),t.status(401).send("Invalid API key");return}o()}});var oc={};mo(oc,{append:()=>Nt,clear:()=>es,close:()=>Yp,getOldestRecordTimestamp:()=>Xp,query:()=>qr,querySummary:()=>$t,readTokenSpeedStats:()=>ts});import{existsSync as Ya,mkdirSync as Ep,readFileSync as Xa}from"fs";import{join as so}from"path";import{tmpdir as Ap}from"os";import{openSqliteDatabase as Op}from"@wengine-ai/claude-code-router-shared";import{HOME_DIR as Ip,sanitizeTempFileKey as Mp,TOKEN_SPEED_TEMP_SUBDIRECTORY as Lp}from"@wengine-ai/claude-code-router-shared";function Up(){Ya(ro)||Ep(ro,{recursive:!0})}function Lt(){if(ke)return ke;Up();let n=Op(Np),e=n.db;n.driver==="node:sqlite"&&console.error(`[usage] better-sqlite3 unavailable, using built-in node:sqlite fallback. Reason: ${n.fallbackReason}`),e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("busy_timeout = 5000");let t=e.pragma("user_version",{simple:!0})||0;return t<1&&(jp(e),e.pragma("user_version = 1")),t<2&&(e.prepare("PRAGMA table_info(usage_records)").all().some(r=>r.name==="upstream_model")||e.exec("ALTER TABLE usage_records ADD COLUMN upstream_model TEXT"),e.pragma("user_version = 2")),zp(e),ec(e,!0),Zr=e.prepare(`
|
|
321
|
+
`):`${o}${e}`}async output(e,t={}){try{let o=this.formatData(e,t);switch(this.config.level||"log"){case"info":console.info(o);break;case"warn":console.warn(o);break;case"error":console.error(o);break;case"debug":console.debug(o);break;case"log":default:console.log(o);break}return!0}catch(o){return console.error("[ConsoleOutputHandler] Output failed:",o),!1}}}});var Tt,Ir=R(()=>{"use strict";Tt=class{type="webhook";config;defaultTimeout=3e4;constructor(e){if(!e.url)throw new Error("Webhook URL is required");this.config={method:"POST",retry:{maxAttempts:3,backoffMs:1e3},silent:!1,...e}}buildHeaders(){let e={"Content-Type":"application/json",...this.config.headers||{}};if(this.config.auth)switch(this.config.auth.type){case"bearer":this.config.auth.token&&(e.Authorization=`Bearer ${this.config.auth.token}`);break;case"basic":if(this.config.auth.username&&this.config.auth.password){let t=Buffer.from(`${this.config.auth.username}:${this.config.auth.password}`).toString("base64");e.Authorization=`Basic ${t}`}break;case"custom":this.config.auth.custom&&(e[this.config.auth.custom.header]=this.config.auth.custom.value);break}return e}buildBody(e,t){let{format:o="json",timestamp:r=!0,prefix:s,metadata:a}=t||{},i={data:e};return r&&(i.timestamp=new Date().toISOString()),s&&(i.prefix=s),a&&Object.keys(a).length>0&&(i.metadata=a),i}async sendRequest(e,t,o,r,s){let a=new AbortController,i=setTimeout(()=>a.abort(),s);try{let c=await fetch(e,{method:t,headers:o,body:JSON.stringify(r),signal:a.signal});if(clearTimeout(i),!c.ok)throw new Error(`HTTP ${c.status}: ${c.statusText}`);return c}catch(c){throw clearTimeout(i),c}}delay(e){return new Promise(t=>setTimeout(t,e))}async sendWithRetry(e,t,o,r,s,a){let i=null;for(let c=1;c<=a.maxAttempts;c++)try{return await this.sendRequest(e,t,o,r,s)}catch(l){if(i=l,c===a.maxAttempts)break;let u=a.backoffMs*Math.pow(2,c-1);console.warn(`[WebhookOutputHandler] Request failed (attempt ${c}/${a.maxAttempts}), retrying in ${u}ms...`,l.message),await this.delay(u)}throw i}async output(e,t={}){let o=t.timeout||this.defaultTimeout;try{let r=this.buildHeaders(),s=this.buildBody(e,t),a=await this.sendWithRetry(this.config.url,this.config.method,r,s,o,this.config.retry);return!0}catch(r){let s=r instanceof Error?r.message:String(r);if(this.config.silent)return console.error(`[WebhookOutputHandler] Failed to send data: ${s}`),!1;throw new Error(`Webhook output failed: ${s}`)}}}});import{lstat as Gn,opendir as Xd,unlink as Zd}from"node:fs/promises";import{join as $a,resolve as Nr}from"node:path";import{tmpdir as qd}from"node:os";async function Vn(n,e){let t=Nr(n),o=Kn.get(t),r,s=new Promise(a=>{r=a});Kn.set(t,s);try{return await o,await e()}finally{r(),Kn.get(t)===s&&Kn.delete(t)}}function Da(n,e){return n.dev===e.dev&&n.ino===e.ino}async function Na(n,e){try{let t=await Gn(n);return t.isDirectory()&&!t.isSymbolicLink()&&Da(e,t)}catch{return!1}}function rp(){return new Promise(n=>{setTimeout(n,10).unref()})}async function Fa(n,e,t,o){let r=Nr(n);if(o?.aborted||Mr.has(r))return 0;Mr.add(r);let s=0;try{let a=await Gn(r);if(!a.isDirectory()||a.isSymbolicLink()||o?.aborted)return 0;let i=await Xd(r,{bufferSize:32});try{let c=0,l=!0;for await(let u of i){if(o?.aborted||!l)break;try{if(!u.isFile()||u.isSymbolicLink()||!t(u.name))continue;let p=$a(r,u.name);try{let d=await Gn(p);if(!d.isFile()||d.isSymbolicLink()||d.mtimeMs>=e)continue;await Vn(p,async()=>{if(o?.aborted||!await Na(r,a))return!1;let h=await Gn(p);return!h.isFile()||h.isSymbolicLink()||!Da(d,h)||h.mtimeMs!==d.mtimeMs||h.mtimeMs>=e||o?.aborted?!1:(await Zd(p),!0)})&&s++}catch{}}finally{++c%64===0&&(await rp(),l=!o?.aborted&&await Na(r,a))}}}finally{await i.close().catch(()=>{})}}catch{}finally{Mr.delete(r)}return s}function Ua(n,e,t,o,r){if(!Number.isFinite(o)||o<=0)return Promise.resolve(0);let s=`${e}-`,a=t?`.${t}`:"";return Fa(n,Date.now()-o,i=>op.test(i)?!0:!i.endsWith(".tmp")&&i.startsWith(s)&&i.endsWith(a),r)}function sp(n,e){let t=Date.now()-ep;return Fa(n,t,o=>{let r=np.exec(o);return r!==null&&Number(r[1])<t},e)}function $r(n,e,t){let o=Lr.get(n);if(!o){let s=new AbortController,a,i=()=>{s.signal.aborted||Promise.resolve().then(()=>e(s.signal)).catch(()=>{})},c=setTimeout(()=>{s.signal.aborted||(i(),a=setInterval(i,tp),a.unref())},t);c.unref(),o={users:0,stop:()=>{s.abort(),clearTimeout(c),a&&clearInterval(a)}},Lr.set(n,o)}o.users++;let r=!1;return()=>{r||(r=!0,--o.users===0&&(o.stop(),Lr.delete(n)))}}function ja(n=$a(qd(),"claude-code-router")){return $r(`legacy:${Nr(n)}`,e=>sp(n,e),1e3)}var ep,tp,np,op,Mr,Kn,Lr,Dr=R(()=>{"use strict";ep=3600*1e3,tp=600*1e3,np=/^session-[A-Za-z0-9_.-]+-(\d{13})\.json$/,op=/^\.ccr-tmp-[1-9]\d*-[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\.tmp$/,Mr=new Set,Kn=new Map,Lr=new Map});import{lstat as ip,mkdir as ap,open as cp,rename as lp,unlink as up}from"node:fs/promises";import{randomUUID as dp}from"node:crypto";import{sanitizeTempFileKey as pp}from"@wengine-ai/claude-code-router-shared";import{basename as fp,join as Fr,resolve as mp}from"node:path";import{tmpdir as gp}from"node:os";var vt,Ur=R(()=>{"use strict";Dr();vt=class{type="temp-file";config;baseDir;controller=new AbortController;stopSchedule;constructor(e={}){if(this.config={subdirectory:"claude-code-router",extension:"json",includeTimestamp:!1,prefix:"session",retentionMs:36e5,...e},this.baseDir=mp(Fr(gp(),this.config.subdirectory)),Number.isFinite(this.config.retentionMs)&&this.config.retentionMs>0){let t=JSON.stringify([this.baseDir,this.config.prefix,this.config.extension,this.config.retentionMs]);this.stopSchedule=$r(`handler:${t}`,o=>this.pruneOldFiles(o),6e4)}}async ensureDir(){await ap(this.baseDir,{recursive:!0});let e=await ip(this.baseDir);if(!e.isDirectory()||e.isSymbolicLink())throw new Error("Unsafe temp output directory")}getFilePath(e){let t=this.config.prefix||"session",o=this.config.extension?`.${this.config.extension}`:"",r=this.config.includeTimestamp?`-${Date.now()}`:"",s=`${t}-${pp(e)}${r}${o}`;if(fp(s)!==s||s.includes("\\"))throw new Error("Temp file configuration must not contain path separators");return Fr(this.baseDir,s)}async output(e,t={}){try{let o=typeof t.metadata?.statsKey=="string"&&t.metadata.statsKey?t.metadata.statsKey:t.metadata?.sessionId;if(!o)return!1;let r=t.metadata?.sessionId??o,s=JSON.stringify({...e,timestamp:Date.now(),sessionId:r},null,2),a=this.getFilePath(o);return await Vn(a,async()=>{await this.ensureDir();let i=Fr(this.baseDir,`.ccr-tmp-${process.pid}-${dp()}.tmp`);return Vn(i,async()=>{let c=!1;try{let l=await cp(i,"wx");c=!0;try{await l.writeFile(s,"utf-8")}finally{await l.close()}return await lp(i,a),!0}finally{c&&await up(i).catch(()=>{})}})})}catch{return!1}}pruneOldFiles(e=this.controller.signal){return Ua(this.baseDir,this.config.prefix||"session",this.config.extension||"",this.config.retentionMs,e)}dispose(){this.controller.abort(),this.stopSchedule?.()}getBaseDir(){return this.baseDir}}});var jr,Ze,Ha=R(()=>{"use strict";Or();Ir();Ur();jr=class{handlers=new Map;defaultOptions={};registerHandler(e,t){this.handlers.set(e,t)}registerHandlers(e){for(let t of e)if(t.enabled!==!1)try{let o=this.createHandler(t),r=t.type+"_"+Date.now();this.registerHandler(r,o)}catch(o){console.error(`[OutputManager] Failed to register ${t.type} handler:`,o)}}createHandler(e){switch(e.type){case"console":return new kt(e.config);case"webhook":return new Tt(e.config);case"temp-file":return new vt(e.config);default:throw new Error(`Unknown output handler type: ${e.type}`)}}unregisterHandler(e){return this.handlers.delete(e)}getHandler(e){return this.handlers.get(e)}getAllHandlers(){return new Map(this.handlers)}clearHandlers(){this.handlers.clear()}setDefaultOptions(e){this.defaultOptions={...this.defaultOptions,...e}}getDefaultOptions(){return{...this.defaultOptions}}async output(e,t){let o={...this.defaultOptions,...t},r={success:[],failed:[]},s=Array.from(this.handlers.entries()).map(async([a,i])=>{try{await i.output(e,o)?r.success.push(a):r.failed.push(a)}catch(c){console.error(`[OutputManager] Handler ${a} failed:`,c),r.failed.push(a)}});return await Promise.all(s),r}async outputTo(e,t,o){let r={...this.defaultOptions,...o},s={success:[],failed:[]},a=e.map(async i=>{let c=this.handlers.get(i);if(!c){console.warn(`[OutputManager] Handler ${i} not found`),s.failed.push(i);return}try{await c.output(t,r)?s.success.push(i):s.failed.push(i)}catch(l){console.error(`[OutputManager] Handler ${i} failed:`,l),s.failed.push(i)}});return await Promise.all(a),s}async outputToType(e,t,o){let r=Array.from(this.handlers.entries()).filter(([s,a])=>a.type===e).map(([s])=>s);return this.outputTo(r,t,o)}},Ze=new jr});var Hr=R(()=>{"use strict";La();Or();Ir();Ur();Ha()});import hp from"fastify-plugin";import{TOKEN_SPEED_TEMP_SUBDIRECTORY as yp}from"@wengine-ai/claude-code-router-shared";function Qn(){return{subdirectory:yp,extension:"json",includeTimestamp:!1,prefix:"session"}}function za(n,e,t=0){if(n<=0)return 0;let o=Math.max((e-t)/1e3,_p);return Math.round(n/o)}function St(n){let e=(n.match(/[\u4e00-\u9fa5]/g)||[]).length,t=n.length-e;return Math.ceil(e/1.5+t/4)}async function Ba(n,e,t,o=!1){let r=o?"[Token Speed Final]":"[Token Speed]",s={requestId:n.requestId.substring(0,8),sessionId:n.sessionId,stream:n.stream,tokenCount:n.tokenCount,tokensPerSecond:n.tokensPerSecond,timeToFirstToken:n.timeToFirstToken?`${n.timeToFirstToken}ms`:"N/A",duration:`${((n.lastTokenTime-n.startTime)/1e3).toFixed(2)}s`,timestamp:Date.now()},a={prefix:r,metadata:{sessionId:n.sessionId,statsKey:n.statsKey},...t};for(let i of e)try{await Ze.outputToType(i,s,a)}catch(c){console.error(`[TokenSpeedPlugin] Failed to output to ${i}:`,c)}}var xt,zr,_p,Yn,Ja=R(()=>{"use strict";Ar();Hr();Ue();xt=new Map,zr=new Map,_p=1,Yn={name:"token-speed",version:"1.0.0",description:"Statistics for streaming response token generation speed",register:hp(async(n,e)=>{let t={reporter:["console","temp-file"],...e},o=Array.isArray(t.reporter)?t.reporter:[t.reporter];if(t.outputHandlers&&t.outputHandlers.length>0)Ze.registerHandlers(t.outputHandlers);else{let a=[];for(let i of o)i==="console"?a.push({type:"console",enabled:!0,config:{colors:!0,level:"log"}}):i==="temp-file"?a.push({type:"temp-file",enabled:!0,config:Qn()}):i==="webhook"&&console.warn("[TokenSpeedPlugin] Webhook reporter requires explicit configuration in outputHandlers");a.length>0&&Ze.registerHandlers(a)}t.outputOptions&&Ze.setDefaultOptions(t.outputOptions);let r=async a=>{let i=n.tokenizerService;if(!i)return n.log?.warn("TokenizerService not available"),null;if(!a.provider||!a.model)return null;let c=a.provider,l=a.model,u=`${c}:${l}`;if(zr.has(u))return zr.get(u);let p=i.getTokenizerConfigForModel(c,l);if(!p)return n.log?.debug(`No tokenizer config for ${c}:${l}, using fallback`),null;try{let d=await i.getTokenizer(p,c);return zr.set(u,d),n.log?.info(`Created tokenizer for ${c}:${l} - ${d.name}`),d}catch(d){return n.log?.warn(`Failed to create tokenizer for ${c}:${l}: ${d.message}`),null}},s=a=>{let i=new URL(`http://127.0.0.1${a}`).pathname;return i.endsWith("/v1/messages")||i.endsWith("/v1/responses")};n.addHook("onRequest",async a=>{s(a.url)&&(a.requestStartTime=performance.now())}),n.addHook("onSend",async(a,i,c)=>{let l=a.requestStartTime;if(!l)return;let u=a.id||Date.now().toString(),p=a.usageSessionId||u,d=a.sessionId;if(!d)try{d=he(a.body?.metadata?.user_id)||p}catch{d=p}let f=await r(a);if(c instanceof ReadableStream){xt.set(u,{requestId:u,sessionId:d,statsKey:p,startTime:l,lastTokenTime:l,tokenCount:0,tokensPerSecond:0,stream:!0});let[_,b]=c.tee(),y=async()=>{let k=null,v=async x=>{let T=xt.get(u);if(!T)return;let C=T.firstTokenTime?T.firstTokenTime-T.startTime:0,P=(x?T.lastTokenTime:performance.now())-T.startTime;T.tokensPerSecond=za(T.tokenCount,P,C),await Ba(T,o,t.outputOptions,x).catch(I=>{n.log?.warn(`Failed to output streaming stats: ${I.message}`)})};try{let T=b.pipeThrough(new TextDecoderStream).pipeThrough(new ie).getReader();for(k=setInterval(async()=>{xt.get(u)&&await v(!1)},1e3);;){let{done:C,value:S}=await T.read();if(C)break;let P=S,I=xt.get(u);if(!I)continue;let O=performance.now(),E=P.event||P.data?.type,w=P.event==="content_block_start"||P.event==="content_block_delta"||P.event==="text_block"||P.event==="content_block"||E==="response.output_text.delta"||E==="response.function_call_arguments.delta"||E==="response.reasoning_summary_text.delta";!I.firstTokenTime&&w&&(I.firstTokenTime=O,I.timeToFirstToken=Math.round(O-I.startTime));let A="";if(P.event==="content_block_delta"&&P.data?.delta){let N=P.data.delta.type;N==="text_delta"?A=P.data.delta.text||"":N==="input_json_delta"?A=P.data.delta.partial_json||"":N==="thinking_delta"&&(A=P.data.delta.thinking||"")}if((E==="response.output_text.delta"||E==="response.function_call_arguments.delta"||E==="response.reasoning_summary_text.delta")&&(A=typeof P.data?.delta=="string"?P.data.delta:""),A){let N=f&&f.encodeText?f.encodeText(A).length:St(A);I.tokenCount+=N,I.lastTokenTime=O}(P.event==="message_stop"||E==="response.completed"||E==="response.failed")&&(k&&(clearInterval(k),k=null),await v(!0),xt.delete(u))}}catch(x){k&&clearInterval(k),x.name!=="AbortError"&&x.code!=="ERR_STREAM_PREMATURE_CLOSE"&&n.log?.warn(`Error processing token stats: ${x.message}`)}};return a.tokenSpeedCapturePromise=y().catch(k=>{console.log(k),n.log?.warn(`Background stats processing failed: ${k.message}`)}),_}let h=performance.now(),g=0,m=!1;if(c&&typeof c=="string")try{let _=JSON.parse(c);if(typeof _.usage?.output_tokens=="number")g=_.usage.output_tokens,m=!0;else{let b=_.content??_.message?.content;if(b!==void 0)if(m=!0,f)Array.isArray(b)?g=b.reduce((y,k)=>{if(k.type==="text"){let v=k.text||"";return y+(f.encodeText?f.encodeText(v).length:St(v))}return y},0):typeof b=="string"&&(g=f.encodeText?f.encodeText(b).length:St(b));else{let y=Array.isArray(b)?b.map(k=>k.text).join(""):typeof b=="string"?b:"";g=St(y)}}}catch{}if(m){let _=h-l,b={requestId:u,sessionId:d,statsKey:p,startTime:l,lastTokenTime:h,tokenCount:g,tokensPerSecond:za(g,_),stream:!1};await Ba(b,o,t.outputOptions,!0)}return c})})}});var Br=R(()=>{"use strict";Ia();Ma();Ja();Hr()});import ne from"node:fs/promises";import Wa from"json5";import we from"node:path";import{CONFIG_FILE as oe,HOME_DIR as Xn,PLUGINS_DIR as bp}from"@wengine-ai/claude-code-router-shared";function Ka(){if(process.env.VITEST||process.env.CI)throw new Error("Config write attempted during test/CI. Set CCR_CONFIG_DIR to a temp dir to isolate.")}var Jr,Ct,Zn,Rt,Y,qn,le,kp,Wr,wt=R(()=>{"use strict";Jr=n=>{if(typeof n=="string")return n.replace(/\$\{([^}]+)\}|\$([A-Z_][A-Z0-9_]*)/g,(e,t,o)=>{let r=t||o;return process.env[r]||e});if(Array.isArray(n))return n.map(Jr);if(n!==null&&typeof n=="object"){let e={};for(let[t,o]of Object.entries(n))e[t]=Jr(o);return e}return n},Ct=async n=>{try{await ne.access(n)}catch{await ne.mkdir(n,{recursive:!0})}},Zn=async()=>{await Ct(Xn),await Ct(bp),await Ct(we.join(Xn,"logs"))},Rt=async()=>{let n=await ne.readFile(oe,"utf-8");return Wa.parse(n)},Y=async()=>{try{let n=await ne.readFile(oe,"utf-8");try{let e=Wa.parse(n);return Jr(e)}catch(e){console.error(`Failed to parse config file at ${oe}`),console.error("Error details:",e.message),console.error("Please check your config file syntax."),process.exit(1)}}catch(n){if(n.code==="ENOENT")try{await Zn();let e=await qn();e&&console.log(`Backed up existing configuration file to ${e}`);let t={PORT:3456,Providers:[],Router:{}};return await le(t),console.log("Created minimal default configuration file at ~/.claude-code-router/config.json"),console.log("Please edit this file with your actual configuration."),t}catch(e){console.error("Failed to create default configuration:",e.message),process.exit(1)}else console.error(`Failed to read config file at ${oe}`),console.error("Error details:",n.message),process.exit(1)}};qn=async()=>{Ka();try{if(await ne.access(oe).then(()=>!0).catch(()=>!1)){let n=new Date().toISOString().replace(/[:.]/g,"-"),e=`${oe}.${n}.bak`;await ne.copyFile(oe,e);try{let t=we.dirname(oe),o=we.basename(oe),s=(await ne.readdir(t)).filter(a=>a.startsWith(o)&&a.endsWith(".bak")).sort().reverse();if(s.length>3)for(let a=3;a<s.length;a++){let i=we.join(t,s[a]);await ne.unlink(i)}}catch(t){console.warn("Failed to clean up old backups:",t)}return e}}catch(n){console.error("Failed to backup config file:",n)}return null},le=async n=>{Ka(),await Ct(Xn),await kp();let e=`${JSON.stringify(n,null,2)}`;await ne.writeFile(oe,e)},kp=async()=>{if(!await ne.access(oe).then(()=>!0).catch(()=>!1))return;let e=we.join(Xn,"config-history");await Ct(e);let t=new Date().toISOString().replace(/[:.]/g,"-"),o=we.join(e,`config-${t}.json`);await ne.copyFile(oe,o);try{let s=(await ne.readdir(e)).filter(a=>a.startsWith("config-")&&a.endsWith(".json")).sort().reverse();if(s.length>50)for(let a of s.slice(50))await ne.unlink(we.join(e,a))}catch(r){console.warn("Failed to prune config-history:",r)}},Wr=async()=>{let n=await Y();return Object.assign(process.env,n),n}});function Tp(n){return n?.cache_read_input_tokens??n?.input_tokens_details?.cached_tokens??n?.prompt_tokens_details?.cached_tokens??0}function vp(n){return n?.cache_creation_input_tokens??n?.input_tokens_details?.cache_creation_tokens??n?.input_tokens_details?.cache_write_tokens??n?.prompt_tokens_details?.cache_creation_tokens??n?.prompt_tokens_details?.cache_write_tokens??0}function Pe(n){if(!(!n||typeof n!="object"))return{...n,input_tokens:n.input_tokens??n.prompt_tokens??0,output_tokens:n.output_tokens??n.completion_tokens??0,cache_read_input_tokens:Tp(n),cache_creation_input_tokens:vp(n)}}function Pt(n,e,t){let o=t?{}:n||{},r=e||{};return{...o,input_tokens:r.input_tokens||o.input_tokens||0,output_tokens:r.output_tokens||o.output_tokens||0,cache_read_input_tokens:r.cache_read_input_tokens||o.cache_read_input_tokens||0,cache_creation_input_tokens:r.cache_creation_input_tokens||o.cache_creation_input_tokens||0}}var Kr=R(()=>{"use strict"});function eo(n,e,t){if(n){if(typeof n=="string"){let o=n.indexOf(",");if(o>0){let r=n.slice(0,o).trim(),s=n.slice(o+1).trim();r&&s&&e.has(r)&&t.add(Gr(r,s))}return}if(Array.isArray(n)){for(let o of n)eo(o,e,t);return}if(typeof n=="object")for(let o of Object.values(n))eo(o,e,t)}}function Ga(n){let e=n?.Providers||n?.providers||[],t=new Set,o=new Set;for(let r of e){let s=r?.name;if(!s)continue;t.add(s);let a=Array.isArray(r?.models)?r.models:[];for(let i of a)i&&o.add(Gr(s,i))}return eo(n?.Router,t,o),eo(n?.fallback,t,o),o}function Et(n,e){try{let t=j();if(!t?.getAllStates||!t?.recover)return 0;let o=Ga(n),r=0;for(let s of t.getAllStates()||[]){let a=s?.provider,i=s?.model;!a||!i||o.has(Gr(a,i))||(t.recover(a,i),r++)}return r>0&&e?.info?.(`[health-reconcile] Pruned ${r} orphaned provider-health entr${r===1?"y":"ies"}`),r}catch(t){return e?.warn?.(`[health-reconcile] Failed to reconcile health store: ${t?.message||t}`),0}}function to(n,e){try{if(!n)return 0;let t=j();if(!t?.getAllStates||!t?.recover)return 0;let o=0;for(let r of t.getAllStates()||[])r?.provider===n&&r?.model&&(t.recover(n,r.model),o++);return o>0&&e?.info?.(`[health-reconcile] Cleared ${o} health entr${o===1?"y":"ies"} for probed provider ${n}`),o}catch(t){return e?.warn?.(`[health-reconcile] Failed to clear provider health for ${n}: ${t?.message||t}`),0}}var xp,Gr,At=R(()=>{"use strict";re();xp="\0",Gr=(n,e)=>`${n}${xp}${e}`});function Sp(n){return/\[1m\]/i.test(n)?1e6:2e5}function Cp(n){let e=n.toLowerCase();return e.includes("haiku")||e.includes("mini")?8192:32e3}function Rp(n,e=n){let t=Sp(n),o=Cp(n);return{type:"model",id:n,display_name:e,created_at:"2024-01-01T00:00:00Z",context_window:t,contextWindow:t,max_input_tokens:t,maxInputTokens:t,max_tokens:o,maxTokens:o,max_output_tokens:o,maxOutputTokens:o,capabilities:{context_window:t,contextWindow:t,max_input_tokens:t,maxInputTokens:t,max_tokens:o,maxTokens:o,max_output_tokens:o,maxOutputTokens:o}}}function wp(n,e,t){if(!n)return!1;try{return!n(e,t)}catch{return!1}}function Vr(n,e){let t=new Map,o=(r,s=r)=>{!r||t.has(r)||t.set(r,Rp(r,s))};o("ccr-opus","CCR Opus"),o("ccr-sonnet","CCR Sonnet"),o("ccr-haiku","CCR Haiku"),o("ccr-opus[1m]","CCR Opus 1M"),o("ccr-sonnet[1m]","CCR Sonnet 1M"),o("ccr-haiku[1m]","CCR Haiku 1M");for(let r of n.Providers||n.providers||[])if(!(!r?.name||!Array.isArray(r.models)))for(let s of r.models){if(typeof s!="string"||!s)continue;let a=wp(e,r.name,s);a||o(s,s),a||o(`${r.name},${s}`,`${r.name}/${s}`)}return Array.from(t.values())}var Qr=R(()=>{"use strict"});function Pp(n){let e=n.ip||n.connection?.remoteAddress||"";return e==="127.0.0.1"||e==="::1"||e==="::ffff:127.0.0.1"}var no,Yr=R(()=>{"use strict";no=n=>async(e,t,o)=>{if(["/","/health"].includes(e.url)||e.url.startsWith("/ui")||Pp(e))return o();let s=n.Providers||n.providers||[];if(!s||s.length===0)return o();let a=n.APIKEY;if(!a){let u=[`http://127.0.0.1:${n.PORT||3456}`,`http://localhost:${n.PORT||3456}`];if(e.headers.origin&&!u.includes(e.headers.origin)){t.status(403).send("CORS not allowed for this origin");return}else t.header("Access-Control-Allow-Origin",`http://127.0.0.1:${n.PORT||3456}`),t.header("Access-Control-Allow-Origin",`http://localhost:${n.PORT||3456}`);return o()}let i=e.headers.authorization||e.headers["x-api-key"],c=Array.isArray(i)?i[0]:i||"";if(!c){t.log.warn({url:e.url,headers:Object.keys(e.headers)},"[AUTH] No auth header"),t.status(401).send("APIKEY is missing");return}let l="";if(c.startsWith("Bearer")?l=c.split(" ")[1]:l=c,l!==a){t.log.warn({url:e.url,gotPrefix:l.slice(0,10),gotSuffix:l.slice(-6),gotLen:l.length,expectedPrefix:a.slice(0,6),expectedSuffix:a.slice(-6),expectedLen:a.length},"[AUTH] Key mismatch"),t.status(401).send("Invalid API key");return}o()}});var oc={};mo(oc,{append:()=>Nt,clear:()=>es,close:()=>Yp,getOldestRecordTimestamp:()=>Xp,query:()=>qr,querySummary:()=>$t,readTokenSpeedStats:()=>ts});import{existsSync as Ya,mkdirSync as Ep,readFileSync as Xa}from"fs";import{join as so}from"path";import{tmpdir as Ap}from"os";import{openSqliteDatabase as Op}from"@wengine-ai/claude-code-router-shared";import{HOME_DIR as Ip,sanitizeTempFileKey as Mp,TOKEN_SPEED_TEMP_SUBDIRECTORY as Lp}from"@wengine-ai/claude-code-router-shared";function Up(){Ya(ro)||Ep(ro,{recursive:!0})}function Lt(){if(ke)return ke;Up();let n=Op(Np),e=n.db;n.driver==="node:sqlite"&&console.error(`[usage] better-sqlite3 unavailable, using built-in node:sqlite fallback. Reason: ${n.fallbackReason}`),e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("busy_timeout = 5000");let t=e.pragma("user_version",{simple:!0})||0;return t<1&&(jp(e),e.pragma("user_version = 1")),t<2&&(e.prepare("PRAGMA table_info(usage_records)").all().some(r=>r.name==="upstream_model")||e.exec("ALTER TABLE usage_records ADD COLUMN upstream_model TEXT"),e.pragma("user_version = 2")),zp(e),ec(e,!0),Zr=e.prepare(`
|
|
322
322
|
INSERT INTO usage_records (
|
|
323
323
|
id, timestamp, session_id, provider, original_model, model, upstream_model, model_family,
|
|
324
324
|
scenario_type, client_type,
|
|
@@ -388,7 +388,7 @@ ${this.toMarkdown(s,t+1)}`:`${o}${r}: ${s}`).join(`
|
|
|
388
388
|
@cache_read_input_tokens, @cache_creation_input_tokens, @ttft,
|
|
389
389
|
@tokens_per_second, @duration_ms, @status, @error_message, @response_body
|
|
390
390
|
)
|
|
391
|
-
`)}function Wp(n,e,t){if(n<=0||e==null||!Number.isFinite(e))return null;let o=t!=null&&Number.isFinite(t)?t:0,r=Math.max((e-o)/1e3,$p);return Math.round(n/r)}function io(n){let e=Number(n.outputTokens)||0,t=Number(n.durationMs),o=Number.isFinite(t)?t:null,r=n.stream?Mt(n.ttft):null;return{...n,ttft:r,tokensPerSecond:Wp(e,o,r)}}function be(n){return typeof n=="string"?n:n==null?"":String(n)}function oo(n){if(n==null)return;let e=String(n);return e.length>0?e:void 0}function It(n){let e=Number(n);return Number.isFinite(e)?e:0}function Za(n){return n==="success"?"success":"error"}function qa(n){let e=io(n);return{id:be(e.id),timestamp:be(e.timestamp),session_id:be(e.sessionId),provider:be(e.provider),original_model:be(e.originalModel),model:be(e.model),upstream_model:oo(e.upstreamModel)??null,model_family:be(e.modelFamily),scenario_type:be(e.scenarioType),client_type:oo(e.clientType)??null,stream:e.stream?1:0,input_tokens:Math.trunc(It(e.inputTokens)),output_tokens:Math.trunc(It(e.outputTokens)),cache_read_input_tokens:Math.trunc(It(e.cacheReadInputTokens)),cache_creation_input_tokens:Math.trunc(It(e.cacheCreationInputTokens)),ttft:Mt(e.ttft),tokens_per_second:Mt(e.tokensPerSecond),duration_ms:Math.trunc(It(e.durationMs)),status:Za(e.status),error_message:oo(e.errorMessage)??null,response_body:oo(e.responseBody)??null}}function Kp(n){return io({id:n.id,timestamp:n.timestamp,sessionId:n.session_id,provider:n.provider,originalModel:n.original_model,model:n.model,upstreamModel:n.upstream_model??void 0,modelFamily:n.model_family,scenarioType:n.scenario_type,clientType:n.client_type??void 0,stream:n.stream===1,inputTokens:n.input_tokens,outputTokens:n.output_tokens,cacheReadInputTokens:n.cache_read_input_tokens,cacheCreationInputTokens:n.cache_creation_input_tokens,ttft:n.ttft,tokensPerSecond:n.tokens_per_second,durationMs:n.duration_ms,status:Za(n.status),errorMessage:n.error_message??void 0,responseBody:n.response_body??void 0})}function Gp(){return new Date(Date.now()-Dp*24*60*60*1e3).toISOString()}function ec(n,e=!1){let t=Date.now();!e&&t-Qa<Fp||(n.prepare("DELETE FROM usage_records WHERE timestamp < ?").run(Gp()),Qa=t)}function tc(n){let e=[],t=[];return n.startTime&&(e.push("timestamp >= ?"),t.push(n.startTime)),n.endTime&&(e.push("timestamp <= ?"),t.push(n.endTime)),n.model&&(e.push("model = ?"),t.push(n.model)),n.provider&&(e.push("provider = ?"),t.push(n.provider)),n.scenario&&(e.push("scenario_type = ?"),t.push(n.scenario)),n.clientType&&(n.clientType==="unknown"?(e.push("(client_type IS NULL OR client_type = '' OR client_type = ?)"),t.push(n.clientType)):(e.push("client_type = ?"),t.push(n.clientType))),n.sessionId&&(e.push("session_id = ?"),t.push(n.sessionId)),n.status&&(e.push("status = ?"),t.push(n.status)),{sql:e.length>0?`WHERE ${e.join(" AND ")}`:"",params:t}}function
|
|
391
|
+
`)}function Wp(n,e,t){if(n<=0||e==null||!Number.isFinite(e))return null;let o=t!=null&&Number.isFinite(t)?t:0,r=Math.max((e-o)/1e3,$p);return Math.round(n/r)}function io(n){let e=Number(n.outputTokens)||0,t=Number(n.durationMs),o=Number.isFinite(t)?t:null,r=n.stream?Mt(n.ttft):null;return{...n,ttft:r,tokensPerSecond:Wp(e,o,r)}}function be(n){return typeof n=="string"?n:n==null?"":String(n)}function oo(n){if(n==null)return;let e=String(n);return e.length>0?e:void 0}function It(n){let e=Number(n);return Number.isFinite(e)?e:0}function Za(n){return n==="success"?"success":"error"}function qa(n){let e=io(n);return{id:be(e.id),timestamp:be(e.timestamp),session_id:be(e.sessionId),provider:be(e.provider),original_model:be(e.originalModel),model:be(e.model),upstream_model:oo(e.upstreamModel)??null,model_family:be(e.modelFamily),scenario_type:be(e.scenarioType),client_type:oo(e.clientType)??null,stream:e.stream?1:0,input_tokens:Math.trunc(It(e.inputTokens)),output_tokens:Math.trunc(It(e.outputTokens)),cache_read_input_tokens:Math.trunc(It(e.cacheReadInputTokens)),cache_creation_input_tokens:Math.trunc(It(e.cacheCreationInputTokens)),ttft:Mt(e.ttft),tokens_per_second:Mt(e.tokensPerSecond),duration_ms:Math.trunc(It(e.durationMs)),status:Za(e.status),error_message:oo(e.errorMessage)??null,response_body:oo(e.responseBody)??null}}function Kp(n){return io({id:n.id,timestamp:n.timestamp,sessionId:n.session_id,provider:n.provider,originalModel:n.original_model,model:n.model,upstreamModel:n.upstream_model??void 0,modelFamily:n.model_family,scenarioType:n.scenario_type,clientType:n.client_type??void 0,stream:n.stream===1,inputTokens:n.input_tokens,outputTokens:n.output_tokens,cacheReadInputTokens:n.cache_read_input_tokens,cacheCreationInputTokens:n.cache_creation_input_tokens,ttft:n.ttft,tokensPerSecond:n.tokens_per_second,durationMs:n.duration_ms,status:Za(n.status),errorMessage:n.error_message??void 0,responseBody:n.response_body??void 0})}function Gp(){return new Date(Date.now()-Dp*24*60*60*1e3).toISOString()}function ec(n,e=!1){let t=Date.now();!e&&t-Qa<Fp||(n.prepare("DELETE FROM usage_records WHERE timestamp < ?").run(Gp()),Qa=t)}function tc(n){let e=[],t=[];return n.startTime&&(e.push("timestamp >= ?"),t.push(n.startTime)),n.endTime&&(e.push("timestamp <= ?"),t.push(n.endTime)),n.model&&(e.push("model = ?"),t.push(n.model)),n.provider&&(e.push("provider = ?"),t.push(n.provider)),n.scenario&&(e.push("scenario_type = ?"),t.push(n.scenario)),n.clientType&&(n.clientType==="unknown"?(e.push("(client_type IS NULL OR client_type = '' OR client_type = ?)"),t.push(n.clientType)):(e.push("client_type = ?"),t.push(n.clientType))),n.sessionId&&(e.push("session_id = ?"),t.push(n.sessionId)),n.status&&(e.push("status = ?"),t.push(n.status)),{sql:e.length>0?`WHERE ${e.join(" AND ")}`:"",params:t}}function qe(n,e,t,o=""){let r=o?e.sql?`${e.sql} AND ${o}`:`WHERE ${o}`:e.sql,s=n.prepare(`
|
|
392
392
|
SELECT ${t} AS key, ${Vp}
|
|
393
393
|
FROM usage_records ${r}
|
|
394
394
|
GROUP BY key
|
|
@@ -403,14 +403,14 @@ ${this.toMarkdown(s,t+1)}`:`${o}${r}: ${s}`).join(`
|
|
|
403
403
|
AVG(CASE WHEN status = 'success' AND ttft IS NOT NULL THEN ttft END) AS avgTtft,
|
|
404
404
|
AVG(CASE WHEN status = 'success' AND tokens_per_second IS NOT NULL THEN tokens_per_second END) AS avgTokensPerSecond
|
|
405
405
|
FROM usage_records ${t.sql}
|
|
406
|
-
`).get(...t.params);return{totalRequests:o.totalRequests,successCount:o.successCount,errorCount:o.totalRequests-o.successCount,totalInputTokens:o.totalInputTokens,totalOutputTokens:o.totalOutputTokens,totalCacheReadInputTokens:o.totalCacheReadInputTokens,totalCacheCreationInputTokens:o.totalCacheCreationInputTokens,avgTtft:o.avgTtft!=null?Math.round(o.avgTtft):null,avgTokensPerSecond:o.avgTokensPerSecond!=null?Math.round(o.avgTokensPerSecond):null,byModel:
|
|
406
|
+
`).get(...t.params);return{totalRequests:o.totalRequests,successCount:o.successCount,errorCount:o.totalRequests-o.successCount,totalInputTokens:o.totalInputTokens,totalOutputTokens:o.totalOutputTokens,totalCacheReadInputTokens:o.totalCacheReadInputTokens,totalCacheCreationInputTokens:o.totalCacheCreationInputTokens,avgTtft:o.avgTtft!=null?Math.round(o.avgTtft):null,avgTokensPerSecond:o.avgTokensPerSecond!=null?Math.round(o.avgTokensPerSecond):null,byModel:qe(n,t,"model"),byProvider:qe(n,t,"provider"),byScenario:qe(n,t,"scenario_type"),byFamily:qe(n,t,"model_family || '/' || scenario_type","model_family IS NOT NULL AND model_family != ''"),byDay:qe(n,t,"date(timestamp, 'localtime')"),byClient:qe(n,t,"CASE WHEN client_type IS NULL OR client_type = '' THEN 'unknown' ELSE client_type END")}}function Nt(n){let e=Lt(),t=io(n);Zr.run(qa(t)),ec(e)}function qr(n){let e=Lt(),t=tc(n),o=Number.isFinite(n.page)&&n.page>0?Math.floor(n.page):1,r=Number.isFinite(n.pageSize)&&n.pageSize>0?Math.min(Math.floor(n.pageSize),Qp):50,s=(o-1)*r,a=e.prepare(`SELECT COUNT(*) AS count FROM usage_records ${t.sql}`).get(...t.params),i=e.prepare(`SELECT * FROM usage_records ${t.sql} ORDER BY timestamp DESC LIMIT ? OFFSET ?`).all(...t.params,r,s),c=nc(e,n);return{records:i.map(Kp),summary:c,total:a.count,page:o,pageSize:r}}function $t(n,e,t){let o=Lt();return nc(o,{startTime:n,endTime:e,status:t})}function es(n){let e=Lt();if(!n){e.prepare("DELETE FROM usage_records").run();return}e.prepare("DELETE FROM usage_records WHERE timestamp < ?").run(n)}function Yp(){ke&&(ke.pragma("wal_checkpoint(TRUNCATE)"),ke.close(),ke=null,Zr=null)}function Mt(n){if(n==null)return null;if(typeof n=="number")return n;let e=parseFloat(String(n));return isNaN(e)?null:e}function ts(n){let e=so(Ap(),Lp,`session-${Mp(n)}.json`);try{let t=JSON.parse(Xa(e,"utf-8"));return{ttft:Mt(t.timeToFirstToken),tokensPerSecond:Mt(t.tokensPerSecond)}}catch{return{ttft:null,tokensPerSecond:null}}}function Xp(n,e,t){return Lt().prepare("SELECT MIN(timestamp) AS timestamp FROM usage_records WHERE provider = ? AND timestamp >= ? AND timestamp <= ?").get(n,e,t)?.timestamp??void 0}var ro,Np,Xr,$p,Dp,Fp,Va,ke,Zr,Qa,Vp,Qp,Dt=R(()=>{"use strict";ro=so(Ip,"data"),Np=so(ro,"usage.sqlite"),Xr=so(ro,"usage.jsonl"),$p=1,Dp=180,Fp=3600*1e3,Va="legacy_usage_jsonl_migrated_at",ke=null,Zr=null,Qa=0;Vp=`
|
|
407
407
|
COUNT(*) AS count,
|
|
408
408
|
COALESCE(SUM(CASE WHEN status = 'success' THEN input_tokens ELSE 0 END), 0) AS inputTokens,
|
|
409
409
|
COALESCE(SUM(CASE WHEN status = 'success' THEN output_tokens ELSE 0 END), 0) AS outputTokens,
|
|
410
410
|
COALESCE(SUM(CASE WHEN status = 'success' THEN cache_read_input_tokens ELSE 0 END), 0) AS cacheReadInputTokens,
|
|
411
411
|
COALESCE(SUM(CASE WHEN status = 'success' THEN cache_creation_input_tokens ELSE 0 END), 0) AS cacheCreationInputTokens
|
|
412
|
-
`;Qp=200});import{existsSync as Zp}from"fs";import{homedir as qp}from"os";import{join as ef}from"path";import{writeFile as tf}from"fs/promises";async function rc(){let n=qp(),e=ef(n,".claude.json");if(!Zp(e)){let o={numStartups:184,autoUpdaterStatus:"enabled",userID:Array.from({length:64},()=>Math.random().toString(16)[2]).join(""),hasCompletedOnboarding:!0,lastOnboardingVersion:"1.0.17",projects:{}};await tf(e,JSON.stringify(o,null,2))}}var sc=R(()=>{"use strict"});import{existsSync as nf,readdirSync as of,statSync as rf,unlinkSync as sf}from"fs";import{join as ic}from"path";import{HOME_DIR as af}from"@wengine-ai/claude-code-router-shared";function cc(n=ic(af,"logs")){try{if(!nf(n))return;let e=Date.now()-lf;for(let t of of(n)){if(!/^ccr-.*\.log$/.test(t))continue;let o=ic(n,t),r=rf(o);r.isFile()&&r.mtime.getTime()<e&&sf(o)}}catch(e){console.warn("Failed to prune old server log files:",e)}}function lc(){ac||(ac=!0,cc(),setInterval(cc,uf).unref())}var cf,lf,uf,ac,uc=R(()=>{"use strict";cf=7,lf=cf*24*60*60*1e3,uf=1440*60*1e3,ac=!1});async function dc(n,e){let t=e.plugins||e.Plugins||[];for(let o of t){let{name:r,enabled:s=!1,options:a={}}=o;switch(r){case"token-speed":bt.registerPlugin(Yn,{enabled:s,outputHandlers:[{type:"temp-file",enabled:!0,config:Qn()}],...a});break;default:console.warn(`Unknown plugin: ${r}`);break}}await bt.enablePlugins(n)}var pc=R(()=>{"use strict";Br()});function qe(n,e,t){if(n?.configService)try{n.configService.reload(),n.reloadProviders?n.reloadProviders(e):(n.configService.set("providers",e?.Providers??e?.providers??[]),n.providerService?.reload()),Et(e,t),Cr();let o={enabled:n.configService.get("ACTIVE_PROBE_ENABLED")??!0,quotaProbeIntervalMinutes:n.configService.get("QUOTA_PROBE_INTERVAL_MINUTES")??10,probeTimeoutMs:n.configService.get("PROBE_TIMEOUT_MS")??15e3,slowThresholdMs:Number(n.configService.get("PROBE_SLOW_THRESHOLD_MS"))||3e3,initialDelayMs:n.configService.get("PROBE_INITIAL_DELAY_MS")??5e3,excludeProviders:n.configService.get("EXCLUDE_PROBE_PROVIDERS")??[]};n.activeProbeService=_t(()=>n.providerService.getProviders(),o,r=>ue(n.configService,r),t,r=>n.configService.get(r))}catch(o){t.warn(`Config saved but runtime reload failed: ${o?.message||o}`)}}var ao=R(()=>{"use strict";At();Jn();q()});import{constants as ns,lstatSync as et,realpathSync as Ft,openSync as df,closeSync as pf,fstatSync as ff,readFileSync as fc}from"node:fs";import{dirname as $b,join as tt,sep as mf}from"node:path";import{pathToFileURL as gf}from"node:url";function gc(n){try{let e=JSON.parse(fc(tt(hf(n),"plugins.json"),"utf8"));return Array.isArray(e)?e.filter(t=>t&&typeof t.name=="string"):[]}catch{return[]}}function rs(n,e){if(!mc(e))return null;try{let t=Ft(n),o=tt(t,"plugins"),r=tt(o,e);return et(o).isSymbolicLink()||!et(o).isDirectory()||et(r).isSymbolicLink()||!et(r).isDirectory()||Ft(o)!==o||Ft(r)!==r||!r.startsWith(o+mf)?null:r}catch{return null}}function os(n,e,t){if(!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(t))throw new Error("invalid plugin file");let o=rs(n,e);if(!o)throw new Error("unsafe plugin directory");let r=tt(o,t),s=et(r);if(s.isSymbolicLink()||!s.isFile()||Ft(r)!==r)throw new Error("unsafe plugin file");let a=df(r,ns.O_RDONLY|ns.O_NOFOLLOW|ns.O_NONBLOCK);try{let i=ff(a),c=et(r);if(!i.isFile()||c.isSymbolicLink()||i.dev!==s.dev||i.ino!==s.ino||i.dev!==c.dev||i.ino!==c.ino||rs(n,e)!==o||Ft(r)!==r)throw new Error("plugin file changed while opening");return fc(a)}finally{pf(a)}}function yf(n){let e=n?.configService,t=e?vs(e):String(process.env.SUBSCRIPTION_PROXY_URL??"").trim()||void 0;return xs(t)}async function hc(n){let{configDir:e,log:t}=n,o=n.registry??n.getServer()?.pluginRegistry??Ro(),r={configDir:e,readConfig:()=>Y(),readRawConfig:()=>Rt(),writeConfig:i=>le(i),reloadRuntime:async i=>qe(n.getServer(),i??await Y(),t),getDirectDispatcher:ho,getSubscriptionDispatcher:()=>yf(n.getServer())},s={loaded:[],failed:[],skipped:[]},a=new Set;for(let i of gc(e)){let c;try{if(!mc(i.name))throw new Error("invalid plugin install name");if(a.has(i.name))throw new Error(`duplicate plugin install record "${i.name}"`);if(a.add(i.name),i.enabled===!1){s.skipped.push({name:i.name,reason:"disabled"});continue}let l=rs(e,i.name);if(!l){s.skipped.push({name:i.name,reason:"directory missing or unsafe"});continue}let u;try{let f=JSON.parse(os(e,i.name,"plugin.json").toString("utf8"));if(!f||typeof f.name!="string"||typeof f.version!="string")throw new Error;u={name:f.name,version:f.version,coreApi:String(f.coreApi??"1"),description:f.description}}catch{throw new Error("plugin.json missing or malformed")}if(u.name!==i.name)throw new Error("manifest name does not match install directory");if(u.coreApi.split(".")[0]!=="1".split(".")[0])throw new Error(`coreApi ${u.coreApi} incompatible with core ${"1"}`);let p=o.beginActivation(u,{info:f=>t.info(`[plugin:${u.name}] ${f}`),warn:f=>t.warn(`[plugin:${u.name}] ${f}`),error:f=>t.error(`[plugin:${u.name}] ${f}`)},r,l);c=p,os(e,i.name,"plugin.js");let d=await import(gf(tt(l,"plugin.js")).href),m=d?.activate??d?.default?.activate;if(typeof m!="function")throw new Error("entry exports no activate()");await m(p.context);let h=p.cardPath?os(e,i.name,p.cardPath):void 0;await p.commit(h,n.getServer()?.app),s.loaded.push(u.name),t.info(`plugin loaded: ${u.name}@${u.version}`)}catch(l){c?.abort(),s.failed.push({name:i.name,error:l?.message??String(l)}),t.warn(`plugin ${i.name} failed to load: ${l?.message??String(l)}`)}}return s}function yc(n,e=Ro()){let t=new Map(e.listLoadedPlugins().map(o=>[o.name,o]));return gc(n).map(o=>{let r=o.enabled!==!1?t.get(o.name):void 0;return r?{...r,enabled:!0}:{name:o.name,version:null,enabled:o.enabled!==!1,error:"plugin missing or failed to load \u2014 its providers are unavailable until it is reinstalled"}})}var mc,hf,ss=R(()=>{"use strict";So();Gt();ao();wt();q();mc=n=>/^[a-z0-9][a-z0-9-]*$/i.test(n),hf=n=>tt(n,"plugins")});import{existsSync as _c,readFileSync as _f}from"node:fs";import{join as is}from"node:path";import{NPM_SPEC_PATTERN as bf,PLUGIN_NAME_PATTERN as bc,PluginInstallError as kf,installPluginFromNpm as Tf,readPluginRecords as vf}from"@wengine-ai/claude-code-router-shared";async function Sf(n,e,t){let o=`${n}/-/v1/search?text=${encodeURIComponent(`keywords:${e}`)}&size=100`,r=await fetch(o,{signal:AbortSignal.timeout(t),headers:{accept:"application/json"}});if(!r.ok)throw new Error(`registry_status_${r.status}`);let s=await r.json();return Array.isArray(s?.objects)?s.objects:[]}async function Cf(n,e={}){let t=(e.registryBase??xf).replace(/\/$/,""),o=e.timeoutMs??3e4,r=await Promise.allSettled(kc.map(f=>Sf(t,f,o))),s=new Map,a=!1;for(let f of r)if(f.status==="fulfilled"){a=!0;for(let g of f.value){let _=g?.package,b=typeof _?.name=="string"?_.name:"";if(!b||!bf.test(b)||!(Array.isArray(_?.keywords)?_.keywords.filter(T=>typeof T=="string"):[]).some(T=>kc.includes(T)))continue;let k=typeof _?.version=="string"?_.version:"";s.has(b)||s.set(b,{name:b,version:k,description:typeof _?.description=="string"?_.description:""})}}if(!a)return{ok:!0,plugins:[],warning:"registry_unavailable"};let i=vf(n),c=new Map(i.map(f=>[f.name,f])),l=new Map(i.filter(f=>typeof f.source=="string"&&f.source!=="").map(f=>[f.source,f])),u=f=>{if(!bc.test(f))return null;try{let g=JSON.parse(_f(is(n,"plugins",f,"plugin.json"),"utf8"));return typeof g?.version=="string"?g.version:null}catch{return null}},p=[...s.values()].sort((f,g)=>f.name.localeCompare(g.name)).map(f=>{let g=c.get(f.name)??l.get(f.name),_=g!==void 0||_c(is(n,"plugins",f.name)),b=_?u(g?g.name:f.name):null;return{...f,installed:_,installedVersion:b,..._&&b!==null&&b!==f.version?{updateAvailable:!0}:{}}}),d=new Set(p.map(f=>f.name)),m=new Set,h=new Map;for(let[f,g]of l)m.add(g.name),!d.has(f)&&h.set(f,g.name);for(let f of i)d.has(f.name)||m.has(f.name)||h.set(f.name,f.name);for(let[f,g]of h){if(!bc.test(g)||!_c(is(n,"plugins",g)))continue;let _=u(g);_!==null&&p.push({name:f,description:"",version:_,installed:!0,installedVersion:_,localOnly:!0})}return p.sort((f,g)=>f.name.localeCompare(g.name)),{ok:!0,plugins:p}}function Rf(n){switch(n){case"invalid_spec":return 400;case"already_installed":case"plugins_json_corrupted":return 409;case"npm_pack_failed":case"npm_pack_timeout":return 502;case"archive_too_large":case"archive_too_many_files":case"unsafe_archive_member":case"extract_failed":case"invalid_manifest":return 422;default:return 500}}function Tc(n,e,t){let o=n.ip||n.connection?.remoteAddress||"";if(!(o==="127.0.0.1"||o==="::1"||o==="::ffff:127.0.0.1"))return!1;let s=e.server?.address?.(),a=typeof s?.port=="number"&&s.port>0?s.port:t,i=new Set([`127.0.0.1:${a}`,`localhost:${a}`,`[::1]:${a}`]),c=n.headers?.host;if(typeof c=="string"&&!i.has(c))return!1;let l=n.headers?.origin;if(l!==void 0&&l!==""){if(typeof l!="string")return!1;let u="";try{let p=new URL(l);if(!["http:","https:"].includes(p.protocol))return!1;u=p.host}catch{return!1}if(!i.has(u))return!1}return!0}function vc(n,e){let t=e.configuredPort??3456,o=(r,s,a)=>r.status(s).send({ok:!1,error:a});n.get("/api/plugins/catalog",async(r,s)=>{if(!Tc(r,n,t))return o(s,403,"local_only");try{return await Cf(e.configDir,{registryBase:e.catalogRegistryBase??e.registry,timeoutMs:e.catalogTimeoutMs})}catch(a){return n.log?.warn?.(`plugin catalog failed: ${a?.code??a?.name??"error"}`),{ok:!0,plugins:[],warning:"registry_unavailable"}}}),n.post("/api/plugins/install",async(r,s)=>{if(!Tc(r,n,t))return o(s,403,"local_only");let a=r.body??{},i=a.name??a.spec,c=a.force===!0;try{let l=await Tf({spec:i,configDir:e.configDir,force:c,registry:e.registry,timeoutMs:e.npmTimeoutMs});return n.log?.info?.(`provider plugin installed via API: ${l.manifest.name}@${l.manifest.version} (restart to activate)`),{ok:!0,name:l.manifest.name,version:l.manifest.version,restartRequired:!0}}catch(l){if(l instanceof kf){let u=Rf(l.code);return u===502?n.log?.warn?.(`plugin install failed: ${l.code}`):n.log?.warn?.(`plugin install rejected: ${l.code}: ${l.message}`),o(s,u,l.code)}return n.log?.error?.(`plugin install crashed: ${l?.message??l}`),o(s,500,"install_failed")}})}var kc,xf,xc=R(()=>{"use strict";kc=["ccr-provider-plugin","claude-code-router-plugin"],xf="https://registry.npmjs.org"});import{ensureCcrSelfProvider as wf}from"@wengine-ai/claude-code-router-shared";import{join as ae,isAbsolute as Pf,normalize as Ef,dirname as Af}from"path";import{fileURLToPath as Of}from"url";import If from"@fastify/static";import{readdirSync as Sc,statSync as Mf,readFileSync as Cc,writeFileSync as Lf,existsSync as pe,unlinkSync as Rc,rmSync as Nf}from"fs";import{homedir as as}from"os";import{getPresetDir as co,readManifestFromDir as cs,manifestToPresetFile as wc,saveManifest as Pc,isPresetInstalled as Ec,extractPreset as $f,HOME_DIR as ls,loadConfigFromManifest as Df,downloadPresetToTemp as Ff,findMarketPresetByName as Uf,getMarketPresets as jf,applyClientSelection as Hf,disableClient as zf,enableClient as Bf,isClientId as Jf,listClientStatuses as Ac,restoreClient as Wf,listProjectConfigs as Kf,readProjectConfigById as us,readProjectConfig as Gf,writeProjectConfig as Oc,deleteProjectConfig as Vf,getClaudeProjectId as Qf,getProjectConfigPath as Yf,refreshCcrProjectTakeover as Xf,refreshPiProjectTakeover as Zf,refreshProjectTakeovers as qf,syncGlobalProjectTakeovers as ds,getProjectTakeoverClients as ps,setProjectTakeover as fs,isProjectTakeoverClient as em}from"@wengine-ai/claude-code-router-shared";import tm from"@fastify/multipart";import nm from"adm-zip";function Ic(n){let e=j();return Vr(n,(t,o)=>e.isAvailable(t,o))}function Mc(n,e,t){return e.failed.length===0?!0:(n.log?.warn?.({source:t,projectTakeoverSync:e},"Client configuration changed but some project takeovers failed to sync"),!1)}function om(n){let e=new Date().toISOString(),t=new Date(Date.now()-300*60*1e3).toISOString(),o=new Date(Date.now()-10080*60*1e3).toISOString(),r=$t(t,e),s=$t(o,e),a=[],i=new Set;for(let c of n||[])c&&c.name&&i.add(c.name);for(let c of Object.keys(r.byProvider||{}))i.add(c);for(let c of Object.keys(s.byProvider||{}))i.add(c);for(let c of i){let l=r.byProvider[c]||{inputTokens:0,outputTokens:0},u=s.byProvider[c]||{inputTokens:0,outputTokens:0},p=(l.inputTokens||0)+(l.outputTokens||0),d=(u.inputTokens||0)+(u.outputTokens||0),m,h,f=(n||[]).find(g=>g&&g.name===c);f&&f.quota&&(m=f.quota.limit5h,h=f.quota.limit7d),a.push({provider:c,used5h:p,used7d:d,limit5h:m,limit7d:h})}return a}async function Lc(n,e){let t=n.app;at(),lt(),t.register(tm,{limits:{fileSize:50*1024*1024}}),t.get("/v1/models",async()=>{let i=Ic(e);return{object:"list",data:i,first_id:i[0]?.id||null,last_id:i[i.length-1]?.id||null,has_more:!1}}),t.get("/v1/models/:modelId",async(i,c)=>{let l=decodeURIComponent(i.params.modelId),u=Ic(e).find(p=>p.id===l);return u||(c.status(404),{type:"error",error:{type:"not_found_error",message:`Model not found: ${l}`}})}),t.post("/v1/messages/count_tokens",async(i,c)=>{let{messages:l,tools:u,system:p,model:d}=i.body,m=t._server.tokenizerService;if(d&&d.includes(",")&&m)try{let[f,g]=d.split(",");i.log?.info(`Looking up tokenizer for provider: ${f}, model: ${g}`);let _=m.getTokenizerConfigForModel(f,g);_?i.log?.info(`Using tokenizer config: ${JSON.stringify(_)}`):i.log?.warn(`No tokenizer config found for ${f},${g}, using default tiktoken`);let b=await m.countTokens({messages:l,system:p,tools:u},_,f);return{input_tokens:b.tokenCount,tokenizer:b.tokenizerUsed}}catch(f){i.log?.error(`Error using configured tokenizer: ${f.message}`),i.log?.error(f.stack)}else d?d.includes(",")?m||i.log?.warn("TokenizerService not available, using default tiktoken"):i.log?.info(`Model "${d}" does not contain comma, using default tiktoken`):i.log?.info("No model specified, using default tiktoken");return{input_tokens:sn(l,p,u)}}),t.get("/api/config",async(i,c)=>await Rt()),t.get("/api/transformers",async(i,c)=>{let l=t._server.transformerService.getAllTransformers();return{transformers:Array.from(l.entries()).map(([p,d])=>({name:p,endpoint:d.endPoint||null}))}}),t.post("/api/config",async(i,c)=>{let l=i.body,u=Ts(l||{});if(u.length>0)return c.status(400),{success:!1,error:"Invalid proxy URL",message:u.map(f=>`${f.key}: ${f.error}`).join("; "),proxyErrors:u};let p=await qn();p&&console.log(`Backed up existing configuration file to ${p}`);let d=null;try{d=await Y()}catch{}let m=wf(l,d);n.pluginRegistry.applyConfigProtectors(l,d),await le(l);let h;try{h=await ds(l),h.failed.length>0&&t.log?.warn?.({projectTakeoverSync:h},"Config saved but some global project takeovers failed to sync")}catch(f){t.log?.warn?.(`Config saved but global project takeover sync failed: ${f?.message||f}`)}return qe(n,l,t.log),{success:!0,message:"Config saved successfully",projectTakeoverSync:h}}),t.get("/api/clients",async(i,c)=>{try{let l=await Y();return{clients:Ac(l)}}catch(l){console.error("Failed to get client integrations:",l),c.status(500).send({error:l.message||"Failed to get client integrations"})}}),t.post("/api/clients/apply",async(i,c)=>{try{let l=i.body,u=Array.isArray(l?.enabled)?l.enabled:[],p=await Y(),d=Hf(p,u);await le(d.config);let m=await ds(d.config),h=Mc(t,m,"clients/apply");return{...d,success:d.success&&h,projectTakeoverSync:m}}catch(l){console.error("Failed to apply client integrations:",l),c.status(500).send({error:l.message||"Failed to apply client integrations"})}});async function o(i,c,l){try{let{id:u}=i.params;if(!Jf(u)){c.status(404).send({error:`Unknown client: ${u}`});return}let p=await Y(),d=l==="enable"?Bf(p,u):l==="restore"?Wf(p,u):zf(p,u);await le(p);let m=await ds(p),h=Mc(t,m,`clients/${u}/${l}`);return{success:d.success&&h,result:d,results:[d],clients:Ac(p),config:p,projectTakeoverSync:m}}catch(u){console.error(`Failed to ${l} client integration:`,u),c.status(500).send({error:u.message||`Failed to ${l} client integration`})}}t.post("/api/clients/:id/enable",async(i,c)=>o(i,c,"enable")),t.post("/api/clients/:id/disable",async(i,c)=>o(i,c,"disable")),t.post("/api/clients/:id/restore",async(i,c)=>o(i,c,"restore")),t.get("/api/projects",async(i,c)=>{try{let l=await Kf();return{projects:await Promise.all(l.map(async p=>{let d=await ps(p.path);return{...p,ccrTakeoverClients:d,ccrTakeover:d.length>0}}))}}catch(l){console.error("Failed to list project configs:",l),c.status(500).send({error:l.message||"Failed to list project configs"})}}),t.post("/api/projects",async(i,c)=>{try{let{path:l}=i.body||{};if(!l||typeof l!="string"||!Pf(l)){c.status(400).send({error:"A valid absolute project path is required"});return}let u=Ef(l).replace(/[\\/]+$/,"")||l;if(await Gf(u)){c.status(409).send({error:"Project is already configured"});return}await Oc(u,{Router:{}});try{let m=await Y();await fs(u,["claudeCode"],m)}catch(m){console.error("Failed to auto-enable ccr takeover for new project:",m)}let d=await ps(u);return{id:Qf(u),path:u,configPath:Yf(u),Router:{},ccrTakeoverClients:d,ccrTakeover:d.length>0}}catch(l){console.error("Failed to add project config:",l),c.status(500).send({error:l.message||"Failed to add project config"})}}),t.put("/api/projects/:id",async(i,c)=>{try{let{id:l}=i.params,{Router:u}=i.body||{};if(!u||typeof u!="object"){c.status(400).send({error:"Router must be an object"});return}let p=await us(l);if(!p){c.status(404).send({error:"Project config not found"});return}await Oc(p.path,{Router:u});let d=await Y();Object.keys(u).length===0?await qf(p.path,d):(await Xf(p.path,d,u),await Zf(p.path,d,u));let m=await ps(p.path);return{id:l,path:p.path,configPath:p.configPath,Router:u,ccrTakeoverClients:m,ccrTakeover:m.length>0}}catch(l){console.error("Failed to update project config:",l),c.status(500).send({error:l.message||"Failed to update project config"})}}),t.put("/api/projects/:id/takeover",async(i,c)=>{try{let{id:l}=i.params,u=i.body||{},p;if(Array.isArray(u.clients))p=u.clients.filter(em);else if(typeof u.enabled=="boolean")p=u.enabled?["claudeCode"]:[];else{c.status(400).send({error:"clients (array) or enabled (boolean) is required"});return}let d=await us(l);if(!d){c.status(404).send({error:"Project config not found"});return}let m=await Y(),h=await fs(d.path,p,m);return{id:l,path:d.path,ccrTakeoverClients:h,ccrTakeover:h.length>0}}catch(l){console.error("Failed to update ccr takeover status:",l),c.status(500).send({error:l.message||"Failed to update ccr takeover status"})}}),t.delete("/api/projects/:id",async(i,c)=>{try{let{id:l}=i.params,u=await us(l);if(!u){c.status(404).send({error:"Project config not found"});return}try{let p=await Y();await fs(u.path,[],p)}catch(p){console.error("Failed to remove ccr takeover while deleting project:",p)}return await Vf(u.path),{success:!0}}catch(l){console.error("Failed to delete project config:",l),c.status(500).send({error:l.message||"Failed to delete project config"})}});let r=typeof __dirname=="string"?__dirname:Af(Of(import.meta.url)),s=pe(ae(r,"index.html"))?r:pe(ae(r,"..","index.html"))?ae(r,".."):ae(r,"..","dist");t.register(If,{root:s,prefix:"/ui/",maxAge:"1h"}),t.get("/ui",async(i,c)=>c.redirect("/ui/")),t.get("/api/logs/files",async(i,c)=>{try{let l=ae(as(),".claude-code-router","logs"),u=[];if(pe(l)){let p=Sc(l);for(let d of p)if(d.endsWith(".log")){let m=ae(l,d),h=Mf(m);u.push({name:d,path:m,size:h.size,lastModified:h.mtime.toISOString()})}u.sort((d,m)=>new Date(m.lastModified).getTime()-new Date(d.lastModified).getTime())}return u}catch(l){console.error("Failed to get log files:",l),c.status(500).send({error:"Failed to get log files"})}}),t.get("/api/logs",async(i,c)=>{try{let l=i.query.file,u;return l?u=l:u=ae(as(),".claude-code-router","logs","app.log"),pe(u)?Cc(u,"utf8").split(`
|
|
413
|
-
`).filter(m=>m.trim()):[]}catch(l){console.error("Failed to get logs:",l),c.status(500).send({error:"Failed to get logs"})}}),t.delete("/api/logs",async(i,c)=>{try{let l=i.query.file,u;return l?u=l:u=ae(as(),".claude-code-router","logs","app.log"),pe(u)&&Lf(u,"","utf8"),{success:!0,message:"Logs cleared successfully"}}catch(l){console.error("Failed to clear logs:",l),c.status(500).send({error:"Failed to clear logs"})}}),t.get("/api/debug-log",async()=>({enabled:zt()})),t.put("/api/debug-log",async i=>{let{enabled:c}=i.body;return ko(c),{enabled:zt()}}),t.get("/api/usage",async(i,c)=>{try{let l=i.query;return qr({startTime:l.startDate,endTime:l.endDate,model:l.model,provider:l.provider,scenario:l.scenario,clientType:l.clientType,sessionId:l.sessionId,status:l.status,page:l.page?parseInt(l.page,10):void 0,pageSize:l.pageSize?parseInt(l.pageSize,10):void 0})}catch(l){console.error("Failed to query usage:",l),c.status(500).send({error:"Failed to query usage"})}}),t.get("/api/usage/summary",async(i,c)=>{try{let l=i.query;return $t(l.startDate,l.endDate,l.status)}catch(l){console.error("Failed to query usage summary:",l),c.status(500).send({error:"Failed to query usage summary"})}}),t.delete("/api/usage",async(i,c)=>{try{let l=i.query;return es(l.beforeDate),{success:!0,message:l.beforeDate?"Usage data cleared before "+l.beforeDate:"All usage data cleared"}}catch(l){console.error("Failed to clear usage:",l),c.status(500).send({error:"Failed to clear usage data"})}}),t.get("/api/providers/health",async(i,c)=>{try{let u=j().getAllStates(),d=t._server?.activeProbeService?.getProbeTelemetry?.()||[];return{states:u.map(m=>({provider:m.provider,model:m.model,status:m.status,failureCount:m.failureCount,successCount:m.successCount,lastFailureTime:m.lastFailureTime,lastError:m.lastError,rateLimitUntil:m.rateLimitUntil??null})),probes:d,timestamp:new Date().toISOString()}}catch(l){console.error("Failed to get provider health:",l),c.status(500).send({error:"Failed to get provider health"})}}),t.post("/api/providers/probe",async(i,c)=>{try{let{providerName:l}=i.body;if(!l)return c.status(400),{error:"providerName is required"};let p=t._server?.activeProbeService;if(!p?.probeProviderManually)return c.status(503),{error:"Active probe service is not available"};let d=await p.probeProviderManually(l);return d.success&&to(l,i.log),{provider:l,success:d.success,latencyMs:d.latencyMs,status:d.status,isSlow:d.isSlow,errorKind:d.errorKind??null,error:d.error,timestamp:new Date().toISOString()}}catch(l){console.error("Failed to probe provider:",l),c.status(500).send({error:l.message||"Failed to probe provider"})}}),t.post("/api/providers/probe-all",async(i,c)=>{try{let l=t._server,u=l?.activeProbeService;if(!u?.probeProviderManually)return c.status(503),{error:"Active probe service is not available"};let p=(l?.providerService?.getProviders?.()||[]).filter(m=>m?.name&&m.enabled!==!1),d=await Promise.all(p.map(async m=>{let h=await u.probeProviderManually(m.name);return h.success&&to(m.name,i?.log),{provider:m.name,success:h.success,latencyMs:h.latencyMs,status:h.status,isSlow:h.isSlow,errorKind:h.errorKind??null,error:h.error}}));return{results:d,successCount:d.filter(m=>m.success).length,total:d.length,timestamp:new Date().toISOString()}}catch(l){console.error("Failed to probe all providers:",l),c.status(500).send({error:l.message||"Failed to probe all providers"})}}),t.get("/api/providers/quota",async(i,c)=>{try{let u=(await Y()).Providers||[],p=om(u),d=new Map(p.map(f=>[f.provider,f])),m=$o();for(let f of p){let g=m.find(_=>_.provider===f.provider);g&&g.limit!=null&&(f.limit5h=g.limit,f.used5h=g.limit-(g.remaining??0),g.reset&&(f.reset5h=new Date(g.reset*1e3).toISOString()))}let h=Vo();for(let f of h){let g=d.get(f.provider);g||(g={provider:f.provider,used5h:0,used7d:0},p.push(g),d.set(f.provider,g)),typeof f.totalBalance=="number"?(g.limit7d=f.totalBalance,g.type7d=f.currency?"balance":"rateLimit",f.currency&&(g.currency=f.currency),typeof f.usedBalance=="number"?g.used7d=f.usedBalance:typeof f.remainingBalance=="number"?g.used7d=Math.max(0,f.totalBalance-f.remainingBalance):(g.used7d=0,g.limit7d=f.totalBalance)):typeof f.usedBalance=="number"&&(g.used7d=f.usedBalance),typeof f.usedDailyBalance=="number"&&(g.used5h=f.usedDailyBalance,g.type5h="rateLimit"),typeof f.limitDaily=="number"&&(g.limit5h=f.limitDaily,g.type5h="rateLimit"),typeof f.resetTime=="string"&&(f.limitDaily!==void 0?g.reset5h=f.resetTime:g.reset7d=f.resetTime),typeof f.resetTime7d=="string"&&(g.reset7d=f.resetTime7d)}return{quotas:p,timestamp:new Date().toISOString()}}catch(l){console.error("Failed to compute provider quota:",l),c.status(500).send({error:"Failed to compute provider quota"})}}),t.get("/api/presets",async(i,c)=>{try{let l=ae(ls,"presets");if(!pe(l))return{presets:[]};let p=Sc(l,{withFileTypes:!0}).filter(m=>m.isDirectory()&&!m.name.startsWith(".")).map(m=>m.name),d=[];for(let m of p){let h=ae(l,m);try{let f=ae(h,"manifest.json"),g=Cc(f,"utf-8"),_=JSON.parse(g),{Providers:b,Router:y,PORT:k,HOST:T,API_TIMEOUT_MS:x,PROXY_URL:v,PROXY_GLOBAL_ENABLED:C,LOG:S,LOG_LEVEL:P,StatusLine:I,NON_INTERACTIVE_MODE:O,...E}=_;d.push({id:m,name:E.name||m,version:E.version||"1.0.0",description:E.description,author:E.author,homepage:E.homepage,repository:E.repository,license:E.license,keywords:E.keywords,ccrVersion:E.ccrVersion,source:E.source,sourceType:E.sourceType,checksum:E.checksum,installed:!0})}catch(f){console.error(`Failed to read preset ${m}:`,f)}}return{presets:d}}catch(l){console.error("Failed to get presets:",l),c.status(500).send({error:"Failed to get presets"})}}),t.get("/api/presets/:name",async(i,c)=>{try{let{name:l}=i.params,u=co(l);if(!pe(u)){c.status(404).send({error:"Preset not found"});return}let p=await cs(u);return{...wc(p),config:Df(p,u),userValues:p.userValues||{}}}catch(l){console.error("Failed to get preset:",l),c.status(500).send({error:l.message||"Failed to get preset"})}}),t.post("/api/presets/:name/apply",async(i,c)=>{try{let{name:l}=i.params,{secrets:u}=i.body,p=co(l);if(!pe(p)){c.status(404).send({error:"Preset not found"});return}let m={...await cs(p)};return u&&Object.keys(u).length>0&&(m.userValues={...m.userValues,...u}),await Pc(l,m),{success:!0,message:"Preset applied successfully"}}catch(l){console.error("Failed to apply preset:",l),c.status(500).send({error:l.message||"Failed to apply preset"})}}),t.delete("/api/presets/:name",async(i,c)=>{try{let{name:l}=i.params,u=co(l);if(!pe(u)){c.status(404).send({error:"Preset not found"});return}return Nf(u,{recursive:!0,force:!0}),{success:!0,message:"Preset deleted successfully"}}catch(l){console.error("Failed to delete preset:",l),c.status(500).send({error:l.message||"Failed to delete preset"})}}),t.get("/api/presets/market",async(i,c)=>{try{return{presets:await jf()}}catch(l){console.error("Failed to get market presets:",l),c.status(500).send({error:l.message||"Failed to get market presets"})}}),t.post("/api/presets/install/github",async(i,c)=>{try{let{presetName:l}=i.body;if(!l){c.status(400).send({error:"Preset name is required"});return}let u=await Uf(l);if(!u){c.status(400).send({error:"Preset not found in marketplace",message:`Preset '${l}' is not available in the official marketplace. Please check the available presets.`});return}if(!u.repo){c.status(400).send({error:"Invalid preset data",message:`Preset '${l}' does not have repository information`});return}let p=u.repo.match(/(?:github\.com[:/]|^)([^/]+)\/([^/\s#]+?)(?:\.git)?$/);if(!p){c.status(400).send({error:"Invalid GitHub repository URL"});return}let[,d,m]=p,h=u.name||l;if(await Ec(h)){c.status(409).send({error:"Preset already installed",message:`Preset '${h}' is already installed. To update or reconfigure, please delete it first using the delete button.`,presetName:h});return}let f=`https://github.com/${d}/${m}/archive/refs/heads/main.zip`,g=await Ff(f),_=await a(g);if(await Ec(h)){Rc(g),c.status(409).send({error:"Preset already installed",message:`Preset '${h}' was installed while downloading. Please try again.`,presetName:h});return}let b=co(h);await $f(g,b);let y=await cs(b);return y.repository=u.repo,u.url&&(y.source=u.url),await Pc(h,y),Rc(g),{success:!0,presetName:h,preset:{..._.metadata,installed:!0}}}catch(l){console.error("Failed to install preset from GitHub:",l),c.status(500).send({error:l.message||"Failed to install preset from GitHub"})}});async function a(i){let c=new nm(i),l=c.getEntry("manifest.json");if(l||(l=c.getEntries().find(d=>d.entryName.includes("manifest.json"))||null),!l)throw new Error("Invalid preset file: manifest.json not found");let u=JSON.parse(l.getData().toString("utf-8"));return wc(u)}return t.get("/api/plugins",async()=>({plugins:yc(ls,n.pluginRegistry)})),vc(t,{configDir:ls,configuredPort:Number(e.PORT)||3456,registry:typeof e.CCR_PLUGIN_NPM_REGISTRY=="string"&&/^https?:\/\//.test(e.CCR_PLUGIN_NPM_REGISTRY)?e.CCR_PLUGIN_NPM_REGISTRY:void 0}),t.get("/plugins/:name/:file",async(i,c)=>{let{name:l,file:u}=i.params,p=n.pluginRegistry.getPublicCard(l,u);return p?(c.header("Content-Type","application/javascript; charset=utf-8"),c.header("X-Content-Type-Options","nosniff"),c.header("Cache-Control","no-store"),c.send(p)):c.status(404).send({error:"plugin_not_found"})}),await n.pluginRegistry.registerAllRoutes(n.app??n),n}var Nc=R(()=>{"use strict";Ce();Le();De();q();rt();re();At();ao();ss();xc();wt();Dt();Qr()});function rm(n,e){let t=n?.Router,{family:o}=ft(e||"");if(t?.enableFamilyRouting&&o){let r=t.families?.[o]?.image;if(r)return r}return t?.image}function $c(n){return n?.Router?.image}function sm(n){return n.some(e=>e.role==="user"&&Array.isArray(e.content)&&e.content.some(t=>t.type==="image"||t.type==="image_url"||Array.isArray(t?.content)&&t.content.some(o=>o.type==="image"||o.type==="image_url")))}function im(n){let e=n[n.length-1];if(e?.role!=="user"||!Array.isArray(e.content))return;let t=[];e.content.filter(o=>o.type==="tool_result").forEach(o=>{if(!Array.isArray(o.content))return;let r=o.content.filter(s=>s.type==="image"?(t.push(s),!1):!0);r.length!==o.content.length&&(o.content=r.length>0?r:"read image successfully")}),e.content.push(...t)}var ms,lo,gs,Dc,Fc=R(()=>{"use strict";Ce();ms=class{cache=new Map;maxSize;ttl;constructor(e=100,t=300*1e3){this.maxSize=e,this.ttl=t}evictExpired(){let e=Date.now();for(let[t,o]of this.cache)e-o.timestamp>this.ttl&&this.cache.delete(t)}trim(){if(this.cache.size<=this.maxSize)return;let e=[...this.cache.keys()].slice(0,this.cache.size-this.maxSize);for(let t of e)this.cache.delete(t)}storeImage(e,t){this.hasImage(e)||(this.evictExpired(),this.cache.set(e,{source:t,timestamp:Date.now()}),this.trim())}getImage(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp>this.ttl?(this.cache.delete(e),null):t.source:null}hasImage(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp>this.ttl?(this.cache.delete(e),!1):!0:!1}clear(){this.cache.clear()}size(){return this.evictExpired(),this.cache.size}},lo=new ms;gs=class{name="image";tools;constructor(){this.tools=new Map,this.appendTools()}shouldHandle(e,t){let o=rm(t,e.originalModel||e.body.model);if(!o||e.body.model===o||!sm(e.body.messages))return!1;let s=t.forceUseImageAgent===!0;return!s&&mt(e.body.model)?!1:(im(e.body.messages),s&&!!$c(t))}appendTools(){this.tools.set("analyzeImage",{name:"analyzeImage",description:"Analyse image or images by ID and extract information such as OCR text, objects, layout, colors, or safety signals.",input_schema:{type:"object",properties:{imageId:{type:"array",description:"an array of IDs to analyse",items:{type:"string"}},task:{type:"string",description:"Details of task to perform on the image.The more detailed, the better"},regions:{type:"array",description:"Optional regions of interest within the image",items:{type:"object",properties:{name:{type:"string",description:"Optional label for the region"},x:{type:"number",description:"X coordinate"},y:{type:"number",description:"Y coordinate"},w:{type:"number",description:"Width of the region"},h:{type:"number",description:"Height of the region"},units:{type:"string",enum:["px","pct"],description:"Units for coordinates and size"}},required:["x","y","w","h","units"]}}},required:["imageId","task"]},handler:async(e,t)=>{let o=[],r;if(e.imageId){if(Array.isArray(e.imageId))e.imageId.forEach(i=>{let c=lo.getImage(`${t.req.id}_Image#${i}`);c&&o.push({type:"image",source:c})});else{let i=lo.getImage(`${t.req.id}_Image#${e.imageId}`);i&&o.push({type:"image",source:i})}r=e.imageId,delete e.imageId}let s=t.req.body.messages[t.req.body.messages.length-1];if(s.role==="user"&&Array.isArray(s.content)){let i=s.content.filter(c=>c.type==="text"&&!c.text.includes("This is an image, if you need to view or analyze it, you need to extract the imageId"));o.push(...i)}Object.keys(e).length>0&&o.push({type:"text",text:JSON.stringify(e)});let a=await fetch(`http://127.0.0.1:${t.config.PORT||3456}/v1/messages`,{method:"POST",headers:{"x-api-key":t.config.APIKEY,"content-type":"application/json"},body:JSON.stringify({model:$c(t.config),system:[{type:"text",text:`You must interpret and analyze images strictly according to the assigned task.
|
|
412
|
+
`;Qp=200});import{existsSync as Zp}from"fs";import{homedir as qp}from"os";import{join as ef}from"path";import{writeFile as tf}from"fs/promises";async function rc(){let n=qp(),e=ef(n,".claude.json");if(!Zp(e)){let o={numStartups:184,autoUpdaterStatus:"enabled",userID:Array.from({length:64},()=>Math.random().toString(16)[2]).join(""),hasCompletedOnboarding:!0,lastOnboardingVersion:"1.0.17",projects:{}};await tf(e,JSON.stringify(o,null,2))}}var sc=R(()=>{"use strict"});import{existsSync as nf,readdirSync as of,statSync as rf,unlinkSync as sf}from"fs";import{join as ic}from"path";import{HOME_DIR as af}from"@wengine-ai/claude-code-router-shared";function cc(n=ic(af,"logs")){try{if(!nf(n))return;let e=Date.now()-lf;for(let t of of(n)){if(!/^ccr-.*\.log$/.test(t))continue;let o=ic(n,t),r=rf(o);r.isFile()&&r.mtime.getTime()<e&&sf(o)}}catch(e){console.warn("Failed to prune old server log files:",e)}}function lc(){ac||(ac=!0,cc(),setInterval(cc,uf).unref())}var cf,lf,uf,ac,uc=R(()=>{"use strict";cf=7,lf=cf*24*60*60*1e3,uf=1440*60*1e3,ac=!1});async function dc(n,e){let t=e.plugins||e.Plugins||[];for(let o of t){let{name:r,enabled:s=!1,options:a={}}=o;switch(r){case"token-speed":bt.registerPlugin(Yn,{enabled:s,outputHandlers:[{type:"temp-file",enabled:!0,config:Qn()}],...a});break;default:console.warn(`Unknown plugin: ${r}`);break}}await bt.enablePlugins(n)}var pc=R(()=>{"use strict";Br()});function et(n,e,t){if(n?.configService)try{n.configService.reload(),n.reloadProviders?n.reloadProviders(e):(n.configService.set("providers",e?.Providers??e?.providers??[]),n.providerService?.reload()),Et(e,t),Cr();let o={enabled:n.configService.get("ACTIVE_PROBE_ENABLED")??!0,quotaProbeIntervalMinutes:n.configService.get("QUOTA_PROBE_INTERVAL_MINUTES")??10,probeTimeoutMs:n.configService.get("PROBE_TIMEOUT_MS")??15e3,slowThresholdMs:Number(n.configService.get("PROBE_SLOW_THRESHOLD_MS"))||3e3,initialDelayMs:n.configService.get("PROBE_INITIAL_DELAY_MS")??5e3,excludeProviders:n.configService.get("EXCLUDE_PROBE_PROVIDERS")??[]};n.activeProbeService=_t(()=>n.providerService.getProviders(),o,r=>ue(n.configService,r),t,r=>n.configService.get(r))}catch(o){t.warn(`Config saved but runtime reload failed: ${o?.message||o}`)}}var ao=R(()=>{"use strict";At();Jn();q()});import{constants as ns,lstatSync as tt,realpathSync as Ft,openSync as df,closeSync as pf,fstatSync as ff,readFileSync as fc}from"node:fs";import{dirname as $b,join as nt,sep as mf}from"node:path";import{pathToFileURL as gf}from"node:url";function gc(n){try{let e=JSON.parse(fc(nt(hf(n),"plugins.json"),"utf8"));return Array.isArray(e)?e.filter(t=>t&&typeof t.name=="string"):[]}catch{return[]}}function rs(n,e){if(!mc(e))return null;try{let t=Ft(n),o=nt(t,"plugins"),r=nt(o,e);return tt(o).isSymbolicLink()||!tt(o).isDirectory()||tt(r).isSymbolicLink()||!tt(r).isDirectory()||Ft(o)!==o||Ft(r)!==r||!r.startsWith(o+mf)?null:r}catch{return null}}function os(n,e,t){if(!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(t))throw new Error("invalid plugin file");let o=rs(n,e);if(!o)throw new Error("unsafe plugin directory");let r=nt(o,t),s=tt(r);if(s.isSymbolicLink()||!s.isFile()||Ft(r)!==r)throw new Error("unsafe plugin file");let a=df(r,ns.O_RDONLY|ns.O_NOFOLLOW|ns.O_NONBLOCK);try{let i=ff(a),c=tt(r);if(!i.isFile()||c.isSymbolicLink()||i.dev!==s.dev||i.ino!==s.ino||i.dev!==c.dev||i.ino!==c.ino||rs(n,e)!==o||Ft(r)!==r)throw new Error("plugin file changed while opening");return fc(a)}finally{pf(a)}}function yf(n){let e=n?.configService,t=e?vs(e):String(process.env.SUBSCRIPTION_PROXY_URL??"").trim()||void 0;return xs(t)}async function hc(n){let{configDir:e,log:t}=n,o=n.registry??n.getServer()?.pluginRegistry??Ro(),r={configDir:e,readConfig:()=>Y(),readRawConfig:()=>Rt(),writeConfig:i=>le(i),reloadRuntime:async i=>et(n.getServer(),i??await Y(),t),getDirectDispatcher:ho,getSubscriptionDispatcher:()=>yf(n.getServer())},s={loaded:[],failed:[],skipped:[]},a=new Set;for(let i of gc(e)){let c;try{if(!mc(i.name))throw new Error("invalid plugin install name");if(a.has(i.name))throw new Error(`duplicate plugin install record "${i.name}"`);if(a.add(i.name),i.enabled===!1){s.skipped.push({name:i.name,reason:"disabled"});continue}let l=rs(e,i.name);if(!l){s.skipped.push({name:i.name,reason:"directory missing or unsafe"});continue}let u;try{let g=JSON.parse(os(e,i.name,"plugin.json").toString("utf8"));if(!g||typeof g.name!="string"||typeof g.version!="string")throw new Error;u={name:g.name,version:g.version,coreApi:String(g.coreApi??"1"),description:g.description}}catch{throw new Error("plugin.json missing or malformed")}if(u.name!==i.name)throw new Error("manifest name does not match install directory");if(u.coreApi.split(".")[0]!=="1".split(".")[0])throw new Error(`coreApi ${u.coreApi} incompatible with core ${"1"}`);let p=o.beginActivation(u,{info:g=>t.info(`[plugin:${u.name}] ${g}`),warn:g=>t.warn(`[plugin:${u.name}] ${g}`),error:g=>t.error(`[plugin:${u.name}] ${g}`)},r,l);c=p,os(e,i.name,"plugin.js");let d=await import(gf(nt(l,"plugin.js")).href),f=d?.activate??d?.default?.activate;if(typeof f!="function")throw new Error("entry exports no activate()");await f(p.context);let h=p.cardPath?os(e,i.name,p.cardPath):void 0;await p.commit(h,n.getServer()?.app),s.loaded.push(u.name),t.info(`plugin loaded: ${u.name}@${u.version}`)}catch(l){c?.abort(),s.failed.push({name:i.name,error:l?.message??String(l)}),t.warn(`plugin ${i.name} failed to load: ${l?.message??String(l)}`)}}return s}function yc(n,e=Ro()){let t=new Map(e.listLoadedPlugins().map(o=>[o.name,o]));return gc(n).map(o=>{let r=o.enabled!==!1?t.get(o.name):void 0;return r?{...r,enabled:!0}:{name:o.name,version:null,enabled:o.enabled!==!1,error:"plugin missing or failed to load \u2014 its providers are unavailable until it is reinstalled"}})}var mc,hf,ss=R(()=>{"use strict";So();Gt();ao();wt();q();mc=n=>/^[a-z0-9][a-z0-9-]*$/i.test(n),hf=n=>nt(n,"plugins")});import{existsSync as _c,readFileSync as _f}from"node:fs";import{join as is}from"node:path";import{NPM_SPEC_PATTERN as bf,PLUGIN_NAME_PATTERN as bc,PluginInstallError as kf,installPluginFromNpm as Tf,readPluginRecords as vf}from"@wengine-ai/claude-code-router-shared";async function Sf(n,e,t){let o=`${n}/-/v1/search?text=${encodeURIComponent(`keywords:${e}`)}&size=100`,r=await fetch(o,{signal:AbortSignal.timeout(t),headers:{accept:"application/json"}});if(!r.ok)throw new Error(`registry_status_${r.status}`);let s=await r.json();return Array.isArray(s?.objects)?s.objects:[]}async function Cf(n,e={}){let t=(e.registryBase??xf).replace(/\/$/,""),o=e.timeoutMs??3e4,r=await Promise.allSettled(kc.map(m=>Sf(t,m,o))),s=new Map,a=!1;for(let m of r)if(m.status==="fulfilled"){a=!0;for(let _ of m.value){let b=_?.package,y=typeof b?.name=="string"?b.name:"";if(!y||!bf.test(y)||!(Array.isArray(b?.keywords)?b.keywords.filter(x=>typeof x=="string"):[]).some(x=>kc.includes(x)))continue;let v=typeof b?.version=="string"?b.version:"";s.has(y)||s.set(y,{name:y,version:v,description:typeof b?.description=="string"?b.description:""})}}if(!a)return{ok:!0,plugins:[],warning:"registry_unavailable"};let i=vf(n),c=new Map(i.map(m=>[m.name,m])),l=m=>{let _=m.indexOf("@",m.startsWith("@")?1:0);return _>0?m.slice(0,_):m},u=new Map(i.filter(m=>typeof m.source=="string"&&m.source!=="").map(m=>[l(m.source),m])),p=m=>{if(!bc.test(m))return null;try{let _=JSON.parse(_f(is(n,"plugins",m,"plugin.json"),"utf8"));return typeof _?.version=="string"?_.version:null}catch{return null}},d=[...s.values()].sort((m,_)=>m.name.localeCompare(_.name)).map(m=>{let _=c.get(m.name)??u.get(m.name),b=_!==void 0||_c(is(n,"plugins",m.name)),y=b?p(_?_.name:m.name):null;return{...m,installed:b,installedVersion:y,...b&&y!==null&&y!==m.version?{updateAvailable:!0}:{}}}),f=new Set(d.map(m=>m.name)),h=new Set,g=new Map;for(let[m,_]of u)h.add(_.name),!f.has(m)&&g.set(m,_.name);for(let m of i)f.has(m.name)||h.has(m.name)||g.set(m.name,m.name);for(let[m,_]of g){if(!bc.test(_)||!_c(is(n,"plugins",_)))continue;let b=p(_);b!==null&&d.push({name:m,description:"",version:b,installed:!0,installedVersion:b,localOnly:!0})}return d.sort((m,_)=>m.name.localeCompare(_.name)),{ok:!0,plugins:d}}function Rf(n){switch(n){case"invalid_spec":return 400;case"already_installed":case"plugins_json_corrupted":return 409;case"npm_pack_failed":case"npm_pack_timeout":return 502;case"archive_too_large":case"archive_too_many_files":case"unsafe_archive_member":case"extract_failed":case"invalid_manifest":return 422;default:return 500}}function Tc(n,e,t){let o=n.ip||n.connection?.remoteAddress||"";if(!(o==="127.0.0.1"||o==="::1"||o==="::ffff:127.0.0.1"))return!1;let s=e.server?.address?.(),a=typeof s?.port=="number"&&s.port>0?s.port:t,i=new Set([`127.0.0.1:${a}`,`localhost:${a}`,`[::1]:${a}`]),c=n.headers?.host;if(typeof c=="string"&&!i.has(c))return!1;let l=n.headers?.origin;if(l!==void 0&&l!==""){if(typeof l!="string")return!1;let u="";try{let p=new URL(l);if(!["http:","https:"].includes(p.protocol))return!1;u=p.host}catch{return!1}if(!i.has(u))return!1}return!0}function vc(n,e){let t=e.configuredPort??3456,o=(r,s,a)=>r.status(s).send({ok:!1,error:a});n.get("/api/plugins/catalog",async(r,s)=>{if(!Tc(r,n,t))return o(s,403,"local_only");try{return await Cf(e.configDir,{registryBase:e.catalogRegistryBase??e.registry,timeoutMs:e.catalogTimeoutMs})}catch(a){return n.log?.warn?.(`plugin catalog failed: ${a?.code??a?.name??"error"}`),{ok:!0,plugins:[],warning:"registry_unavailable"}}}),n.post("/api/plugins/install",async(r,s)=>{if(!Tc(r,n,t))return o(s,403,"local_only");let a=r.body??{},i=a.name??a.spec,c=a.force===!0;try{let l=await Tf({spec:i,configDir:e.configDir,force:c,registry:e.registry,timeoutMs:e.npmTimeoutMs});return n.log?.info?.(`provider plugin installed via API: ${l.manifest.name}@${l.manifest.version} (restart to activate)`),{ok:!0,name:l.manifest.name,version:l.manifest.version,restartRequired:!0}}catch(l){if(l instanceof kf){let u=Rf(l.code);return u===502?n.log?.warn?.(`plugin install failed: ${l.code}`):n.log?.warn?.(`plugin install rejected: ${l.code}: ${l.message}`),o(s,u,l.code)}return n.log?.error?.(`plugin install crashed: ${l?.message??l}`),o(s,500,"install_failed")}})}var kc,xf,xc=R(()=>{"use strict";kc=["ccr-provider-plugin","claude-code-router-plugin"],xf="https://registry.npmjs.org"});import{ensureCcrSelfProvider as wf}from"@wengine-ai/claude-code-router-shared";import{join as ae,isAbsolute as Pf,normalize as Ef,dirname as Af}from"path";import{fileURLToPath as Of}from"url";import If from"@fastify/static";import{readdirSync as Sc,statSync as Mf,readFileSync as Cc,writeFileSync as Lf,existsSync as pe,unlinkSync as Rc,rmSync as Nf}from"fs";import{homedir as as}from"os";import{getPresetDir as co,readManifestFromDir as cs,manifestToPresetFile as wc,saveManifest as Pc,isPresetInstalled as Ec,extractPreset as $f,HOME_DIR as ls,loadConfigFromManifest as Df,downloadPresetToTemp as Ff,findMarketPresetByName as Uf,getMarketPresets as jf,applyClientSelection as Hf,disableClient as zf,enableClient as Bf,isClientId as Jf,listClientStatuses as Ac,restoreClient as Wf,listProjectConfigs as Kf,readProjectConfigById as us,readProjectConfig as Gf,writeProjectConfig as Oc,deleteProjectConfig as Vf,getClaudeProjectId as Qf,getProjectConfigPath as Yf,refreshCcrProjectTakeover as Xf,refreshPiProjectTakeover as Zf,refreshProjectTakeovers as qf,syncGlobalProjectTakeovers as ds,getProjectTakeoverClients as ps,setProjectTakeover as fs,isProjectTakeoverClient as em}from"@wengine-ai/claude-code-router-shared";import tm from"@fastify/multipart";import nm from"adm-zip";function Ic(n){let e=j();return Vr(n,(t,o)=>e.isAvailable(t,o))}function Mc(n,e,t){return e.failed.length===0?!0:(n.log?.warn?.({source:t,projectTakeoverSync:e},"Client configuration changed but some project takeovers failed to sync"),!1)}function om(n){let e=new Date().toISOString(),t=new Date(Date.now()-300*60*1e3).toISOString(),o=new Date(Date.now()-10080*60*1e3).toISOString(),r=$t(t,e),s=$t(o,e),a=[],i=new Set;for(let c of n||[])c&&c.name&&i.add(c.name);for(let c of Object.keys(r.byProvider||{}))i.add(c);for(let c of Object.keys(s.byProvider||{}))i.add(c);for(let c of i){let l=r.byProvider[c]||{inputTokens:0,outputTokens:0},u=s.byProvider[c]||{inputTokens:0,outputTokens:0},p=(l.inputTokens||0)+(l.outputTokens||0),d=(u.inputTokens||0)+(u.outputTokens||0),f,h,g=(n||[]).find(m=>m&&m.name===c);g&&g.quota&&(f=g.quota.limit5h,h=g.quota.limit7d),a.push({provider:c,used5h:p,used7d:d,limit5h:f,limit7d:h})}return a}async function Lc(n,e){let t=n.app;at(),lt(),t.register(tm,{limits:{fileSize:50*1024*1024}}),t.get("/v1/models",async()=>{let i=Ic(e);return{object:"list",data:i,first_id:i[0]?.id||null,last_id:i[i.length-1]?.id||null,has_more:!1}}),t.get("/v1/models/:modelId",async(i,c)=>{let l=decodeURIComponent(i.params.modelId),u=Ic(e).find(p=>p.id===l);return u||(c.status(404),{type:"error",error:{type:"not_found_error",message:`Model not found: ${l}`}})}),t.post("/v1/messages/count_tokens",async(i,c)=>{let{messages:l,tools:u,system:p,model:d}=i.body,f=t._server.tokenizerService;if(d&&d.includes(",")&&f)try{let[g,m]=d.split(",");i.log?.info(`Looking up tokenizer for provider: ${g}, model: ${m}`);let _=f.getTokenizerConfigForModel(g,m);_?i.log?.info(`Using tokenizer config: ${JSON.stringify(_)}`):i.log?.warn(`No tokenizer config found for ${g},${m}, using default tiktoken`);let b=await f.countTokens({messages:l,system:p,tools:u},_,g);return{input_tokens:b.tokenCount,tokenizer:b.tokenizerUsed}}catch(g){i.log?.error(`Error using configured tokenizer: ${g.message}`),i.log?.error(g.stack)}else d?d.includes(",")?f||i.log?.warn("TokenizerService not available, using default tiktoken"):i.log?.info(`Model "${d}" does not contain comma, using default tiktoken`):i.log?.info("No model specified, using default tiktoken");return{input_tokens:sn(l,p,u)}}),t.get("/api/config",async(i,c)=>await Rt()),t.get("/api/transformers",async(i,c)=>{let l=t._server.transformerService.getAllTransformers();return{transformers:Array.from(l.entries()).map(([p,d])=>({name:p,endpoint:d.endPoint||null}))}}),t.post("/api/config",async(i,c)=>{let l=i.body,u=Ts(l||{});if(u.length>0)return c.status(400),{success:!1,error:"Invalid proxy URL",message:u.map(g=>`${g.key}: ${g.error}`).join("; "),proxyErrors:u};let p=await qn();p&&console.log(`Backed up existing configuration file to ${p}`);let d=null;try{d=await Y()}catch{}let f=wf(l,d);n.pluginRegistry.applyConfigProtectors(l,d),await le(l);let h;try{h=await ds(l),h.failed.length>0&&t.log?.warn?.({projectTakeoverSync:h},"Config saved but some global project takeovers failed to sync")}catch(g){t.log?.warn?.(`Config saved but global project takeover sync failed: ${g?.message||g}`)}return et(n,l,t.log),{success:!0,message:"Config saved successfully",projectTakeoverSync:h}}),t.get("/api/clients",async(i,c)=>{try{let l=await Y();return{clients:Ac(l)}}catch(l){console.error("Failed to get client integrations:",l),c.status(500).send({error:l.message||"Failed to get client integrations"})}}),t.post("/api/clients/apply",async(i,c)=>{try{let l=i.body,u=Array.isArray(l?.enabled)?l.enabled:[],p=await Y(),d=Hf(p,u);await le(d.config);let f=await ds(d.config),h=Mc(t,f,"clients/apply");return{...d,success:d.success&&h,projectTakeoverSync:f}}catch(l){console.error("Failed to apply client integrations:",l),c.status(500).send({error:l.message||"Failed to apply client integrations"})}});async function o(i,c,l){try{let{id:u}=i.params;if(!Jf(u)){c.status(404).send({error:`Unknown client: ${u}`});return}let p=await Y(),d=l==="enable"?Bf(p,u):l==="restore"?Wf(p,u):zf(p,u);await le(p);let f=await ds(p),h=Mc(t,f,`clients/${u}/${l}`);return{success:d.success&&h,result:d,results:[d],clients:Ac(p),config:p,projectTakeoverSync:f}}catch(u){console.error(`Failed to ${l} client integration:`,u),c.status(500).send({error:u.message||`Failed to ${l} client integration`})}}t.post("/api/clients/:id/enable",async(i,c)=>o(i,c,"enable")),t.post("/api/clients/:id/disable",async(i,c)=>o(i,c,"disable")),t.post("/api/clients/:id/restore",async(i,c)=>o(i,c,"restore")),t.get("/api/projects",async(i,c)=>{try{let l=await Kf();return{projects:await Promise.all(l.map(async p=>{let d=await ps(p.path);return{...p,ccrTakeoverClients:d,ccrTakeover:d.length>0}}))}}catch(l){console.error("Failed to list project configs:",l),c.status(500).send({error:l.message||"Failed to list project configs"})}}),t.post("/api/projects",async(i,c)=>{try{let{path:l}=i.body||{};if(!l||typeof l!="string"||!Pf(l)){c.status(400).send({error:"A valid absolute project path is required"});return}let u=Ef(l).replace(/[\\/]+$/,"")||l;if(await Gf(u)){c.status(409).send({error:"Project is already configured"});return}await Oc(u,{Router:{}});try{let f=await Y();await fs(u,["claudeCode"],f)}catch(f){console.error("Failed to auto-enable ccr takeover for new project:",f)}let d=await ps(u);return{id:Qf(u),path:u,configPath:Yf(u),Router:{},ccrTakeoverClients:d,ccrTakeover:d.length>0}}catch(l){console.error("Failed to add project config:",l),c.status(500).send({error:l.message||"Failed to add project config"})}}),t.put("/api/projects/:id",async(i,c)=>{try{let{id:l}=i.params,{Router:u}=i.body||{};if(!u||typeof u!="object"){c.status(400).send({error:"Router must be an object"});return}let p=await us(l);if(!p){c.status(404).send({error:"Project config not found"});return}await Oc(p.path,{Router:u});let d=await Y();Object.keys(u).length===0?await qf(p.path,d):(await Xf(p.path,d,u),await Zf(p.path,d,u));let f=await ps(p.path);return{id:l,path:p.path,configPath:p.configPath,Router:u,ccrTakeoverClients:f,ccrTakeover:f.length>0}}catch(l){console.error("Failed to update project config:",l),c.status(500).send({error:l.message||"Failed to update project config"})}}),t.put("/api/projects/:id/takeover",async(i,c)=>{try{let{id:l}=i.params,u=i.body||{},p;if(Array.isArray(u.clients))p=u.clients.filter(em);else if(typeof u.enabled=="boolean")p=u.enabled?["claudeCode"]:[];else{c.status(400).send({error:"clients (array) or enabled (boolean) is required"});return}let d=await us(l);if(!d){c.status(404).send({error:"Project config not found"});return}let f=await Y(),h=await fs(d.path,p,f);return{id:l,path:d.path,ccrTakeoverClients:h,ccrTakeover:h.length>0}}catch(l){console.error("Failed to update ccr takeover status:",l),c.status(500).send({error:l.message||"Failed to update ccr takeover status"})}}),t.delete("/api/projects/:id",async(i,c)=>{try{let{id:l}=i.params,u=await us(l);if(!u){c.status(404).send({error:"Project config not found"});return}try{let p=await Y();await fs(u.path,[],p)}catch(p){console.error("Failed to remove ccr takeover while deleting project:",p)}return await Vf(u.path),{success:!0}}catch(l){console.error("Failed to delete project config:",l),c.status(500).send({error:l.message||"Failed to delete project config"})}});let r=typeof __dirname=="string"?__dirname:Af(Of(import.meta.url)),s=pe(ae(r,"index.html"))?r:pe(ae(r,"..","index.html"))?ae(r,".."):ae(r,"..","dist");t.register(If,{root:s,prefix:"/ui/",maxAge:"1h"}),t.get("/ui",async(i,c)=>c.redirect("/ui/")),t.get("/api/logs/files",async(i,c)=>{try{let l=ae(as(),".claude-code-router","logs"),u=[];if(pe(l)){let p=Sc(l);for(let d of p)if(d.endsWith(".log")){let f=ae(l,d),h=Mf(f);u.push({name:d,path:f,size:h.size,lastModified:h.mtime.toISOString()})}u.sort((d,f)=>new Date(f.lastModified).getTime()-new Date(d.lastModified).getTime())}return u}catch(l){console.error("Failed to get log files:",l),c.status(500).send({error:"Failed to get log files"})}}),t.get("/api/logs",async(i,c)=>{try{let l=i.query.file,u;return l?u=l:u=ae(as(),".claude-code-router","logs","app.log"),pe(u)?Cc(u,"utf8").split(`
|
|
413
|
+
`).filter(f=>f.trim()):[]}catch(l){console.error("Failed to get logs:",l),c.status(500).send({error:"Failed to get logs"})}}),t.delete("/api/logs",async(i,c)=>{try{let l=i.query.file,u;return l?u=l:u=ae(as(),".claude-code-router","logs","app.log"),pe(u)&&Lf(u,"","utf8"),{success:!0,message:"Logs cleared successfully"}}catch(l){console.error("Failed to clear logs:",l),c.status(500).send({error:"Failed to clear logs"})}}),t.get("/api/debug-log",async()=>({enabled:zt()})),t.put("/api/debug-log",async i=>{let{enabled:c}=i.body;return ko(c),{enabled:zt()}}),t.get("/api/usage",async(i,c)=>{try{let l=i.query;return qr({startTime:l.startDate,endTime:l.endDate,model:l.model,provider:l.provider,scenario:l.scenario,clientType:l.clientType,sessionId:l.sessionId,status:l.status,page:l.page?parseInt(l.page,10):void 0,pageSize:l.pageSize?parseInt(l.pageSize,10):void 0})}catch(l){console.error("Failed to query usage:",l),c.status(500).send({error:"Failed to query usage"})}}),t.get("/api/usage/summary",async(i,c)=>{try{let l=i.query;return $t(l.startDate,l.endDate,l.status)}catch(l){console.error("Failed to query usage summary:",l),c.status(500).send({error:"Failed to query usage summary"})}}),t.delete("/api/usage",async(i,c)=>{try{let l=i.query;return es(l.beforeDate),{success:!0,message:l.beforeDate?"Usage data cleared before "+l.beforeDate:"All usage data cleared"}}catch(l){console.error("Failed to clear usage:",l),c.status(500).send({error:"Failed to clear usage data"})}}),t.get("/api/providers/health",async(i,c)=>{try{let u=j().getAllStates(),d=t._server?.activeProbeService?.getProbeTelemetry?.()||[];return{states:u.map(f=>({provider:f.provider,model:f.model,status:f.status,failureCount:f.failureCount,successCount:f.successCount,lastFailureTime:f.lastFailureTime,lastError:f.lastError,rateLimitUntil:f.rateLimitUntil??null})),probes:d,timestamp:new Date().toISOString()}}catch(l){console.error("Failed to get provider health:",l),c.status(500).send({error:"Failed to get provider health"})}}),t.post("/api/providers/probe",async(i,c)=>{try{let{providerName:l}=i.body;if(!l)return c.status(400),{error:"providerName is required"};let p=t._server?.activeProbeService;if(!p?.probeProviderManually)return c.status(503),{error:"Active probe service is not available"};let d=await p.probeProviderManually(l);return d.success&&to(l,i.log),{provider:l,success:d.success,latencyMs:d.latencyMs,status:d.status,isSlow:d.isSlow,errorKind:d.errorKind??null,error:d.error,timestamp:new Date().toISOString()}}catch(l){console.error("Failed to probe provider:",l),c.status(500).send({error:l.message||"Failed to probe provider"})}}),t.post("/api/providers/probe-all",async(i,c)=>{try{let l=t._server,u=l?.activeProbeService;if(!u?.probeProviderManually)return c.status(503),{error:"Active probe service is not available"};let p=(l?.providerService?.getProviders?.()||[]).filter(f=>f?.name&&f.enabled!==!1),d=await Promise.all(p.map(async f=>{let h=await u.probeProviderManually(f.name);return h.success&&to(f.name,i?.log),{provider:f.name,success:h.success,latencyMs:h.latencyMs,status:h.status,isSlow:h.isSlow,errorKind:h.errorKind??null,error:h.error}}));return{results:d,successCount:d.filter(f=>f.success).length,total:d.length,timestamp:new Date().toISOString()}}catch(l){console.error("Failed to probe all providers:",l),c.status(500).send({error:l.message||"Failed to probe all providers"})}}),t.get("/api/providers/quota",async(i,c)=>{try{let u=(await Y()).Providers||[],p=om(u),d=new Map(p.map(g=>[g.provider,g])),f=$o();for(let g of p){let m=f.find(_=>_.provider===g.provider);m&&m.limit!=null&&(g.limit5h=m.limit,g.used5h=m.limit-(m.remaining??0),m.reset&&(g.reset5h=new Date(m.reset*1e3).toISOString()))}let h=Vo();for(let g of h){let m=d.get(g.provider);m||(m={provider:g.provider,used5h:0,used7d:0},p.push(m),d.set(g.provider,m)),typeof g.totalBalance=="number"?(m.limit7d=g.totalBalance,m.type7d=g.currency?"balance":"rateLimit",g.currency&&(m.currency=g.currency),typeof g.usedBalance=="number"?m.used7d=g.usedBalance:typeof g.remainingBalance=="number"?m.used7d=Math.max(0,g.totalBalance-g.remainingBalance):(m.used7d=0,m.limit7d=g.totalBalance)):typeof g.usedBalance=="number"&&(m.used7d=g.usedBalance),typeof g.usedDailyBalance=="number"&&(m.used5h=g.usedDailyBalance,m.type5h="rateLimit"),typeof g.limitDaily=="number"&&(m.limit5h=g.limitDaily,m.type5h="rateLimit"),typeof g.resetTime=="string"&&(g.limitDaily!==void 0?m.reset5h=g.resetTime:m.reset7d=g.resetTime),typeof g.resetTime7d=="string"&&(m.reset7d=g.resetTime7d)}return{quotas:p,timestamp:new Date().toISOString()}}catch(l){console.error("Failed to compute provider quota:",l),c.status(500).send({error:"Failed to compute provider quota"})}}),t.get("/api/presets",async(i,c)=>{try{let l=ae(ls,"presets");if(!pe(l))return{presets:[]};let p=Sc(l,{withFileTypes:!0}).filter(f=>f.isDirectory()&&!f.name.startsWith(".")).map(f=>f.name),d=[];for(let f of p){let h=ae(l,f);try{let g=ae(h,"manifest.json"),m=Cc(g,"utf-8"),_=JSON.parse(m),{Providers:b,Router:y,PORT:k,HOST:v,API_TIMEOUT_MS:x,PROXY_URL:T,PROXY_GLOBAL_ENABLED:C,LOG:S,LOG_LEVEL:P,StatusLine:I,NON_INTERACTIVE_MODE:O,...E}=_;d.push({id:f,name:E.name||f,version:E.version||"1.0.0",description:E.description,author:E.author,homepage:E.homepage,repository:E.repository,license:E.license,keywords:E.keywords,ccrVersion:E.ccrVersion,source:E.source,sourceType:E.sourceType,checksum:E.checksum,installed:!0})}catch(g){console.error(`Failed to read preset ${f}:`,g)}}return{presets:d}}catch(l){console.error("Failed to get presets:",l),c.status(500).send({error:"Failed to get presets"})}}),t.get("/api/presets/:name",async(i,c)=>{try{let{name:l}=i.params,u=co(l);if(!pe(u)){c.status(404).send({error:"Preset not found"});return}let p=await cs(u);return{...wc(p),config:Df(p,u),userValues:p.userValues||{}}}catch(l){console.error("Failed to get preset:",l),c.status(500).send({error:l.message||"Failed to get preset"})}}),t.post("/api/presets/:name/apply",async(i,c)=>{try{let{name:l}=i.params,{secrets:u}=i.body,p=co(l);if(!pe(p)){c.status(404).send({error:"Preset not found"});return}let f={...await cs(p)};return u&&Object.keys(u).length>0&&(f.userValues={...f.userValues,...u}),await Pc(l,f),{success:!0,message:"Preset applied successfully"}}catch(l){console.error("Failed to apply preset:",l),c.status(500).send({error:l.message||"Failed to apply preset"})}}),t.delete("/api/presets/:name",async(i,c)=>{try{let{name:l}=i.params,u=co(l);if(!pe(u)){c.status(404).send({error:"Preset not found"});return}return Nf(u,{recursive:!0,force:!0}),{success:!0,message:"Preset deleted successfully"}}catch(l){console.error("Failed to delete preset:",l),c.status(500).send({error:l.message||"Failed to delete preset"})}}),t.get("/api/presets/market",async(i,c)=>{try{return{presets:await jf()}}catch(l){console.error("Failed to get market presets:",l),c.status(500).send({error:l.message||"Failed to get market presets"})}}),t.post("/api/presets/install/github",async(i,c)=>{try{let{presetName:l}=i.body;if(!l){c.status(400).send({error:"Preset name is required"});return}let u=await Uf(l);if(!u){c.status(400).send({error:"Preset not found in marketplace",message:`Preset '${l}' is not available in the official marketplace. Please check the available presets.`});return}if(!u.repo){c.status(400).send({error:"Invalid preset data",message:`Preset '${l}' does not have repository information`});return}let p=u.repo.match(/(?:github\.com[:/]|^)([^/]+)\/([^/\s#]+?)(?:\.git)?$/);if(!p){c.status(400).send({error:"Invalid GitHub repository URL"});return}let[,d,f]=p,h=u.name||l;if(await Ec(h)){c.status(409).send({error:"Preset already installed",message:`Preset '${h}' is already installed. To update or reconfigure, please delete it first using the delete button.`,presetName:h});return}let g=`https://github.com/${d}/${f}/archive/refs/heads/main.zip`,m=await Ff(g),_=await a(m);if(await Ec(h)){Rc(m),c.status(409).send({error:"Preset already installed",message:`Preset '${h}' was installed while downloading. Please try again.`,presetName:h});return}let b=co(h);await $f(m,b);let y=await cs(b);return y.repository=u.repo,u.url&&(y.source=u.url),await Pc(h,y),Rc(m),{success:!0,presetName:h,preset:{..._.metadata,installed:!0}}}catch(l){console.error("Failed to install preset from GitHub:",l),c.status(500).send({error:l.message||"Failed to install preset from GitHub"})}});async function a(i){let c=new nm(i),l=c.getEntry("manifest.json");if(l||(l=c.getEntries().find(d=>d.entryName.includes("manifest.json"))||null),!l)throw new Error("Invalid preset file: manifest.json not found");let u=JSON.parse(l.getData().toString("utf-8"));return wc(u)}return t.get("/api/plugins",async()=>({plugins:yc(ls,n.pluginRegistry)})),vc(t,{configDir:ls,configuredPort:Number(e.PORT)||3456,registry:typeof e.CCR_PLUGIN_NPM_REGISTRY=="string"&&/^https?:\/\//.test(e.CCR_PLUGIN_NPM_REGISTRY)?e.CCR_PLUGIN_NPM_REGISTRY:void 0}),t.get("/plugins/:name/:file",async(i,c)=>{let{name:l,file:u}=i.params,p=n.pluginRegistry.getPublicCard(l,u);return p?(c.header("Content-Type","application/javascript; charset=utf-8"),c.header("X-Content-Type-Options","nosniff"),c.header("Cache-Control","no-store"),c.send(p)):c.status(404).send({error:"plugin_not_found"})}),await n.pluginRegistry.registerAllRoutes(n.app??n),n}var Nc=R(()=>{"use strict";Ce();Ne();Fe();q();rt();re();At();ao();ss();xc();wt();Dt();Qr()});function rm(n,e){let t=n?.Router,{family:o}=ft(e||"");if(t?.enableFamilyRouting&&o){let r=t.families?.[o]?.image;if(r)return r}return t?.image}function $c(n){return n?.Router?.image}function sm(n){return n.some(e=>e.role==="user"&&Array.isArray(e.content)&&e.content.some(t=>t.type==="image"||t.type==="image_url"||Array.isArray(t?.content)&&t.content.some(o=>o.type==="image"||o.type==="image_url")))}function im(n){let e=n[n.length-1];if(e?.role!=="user"||!Array.isArray(e.content))return;let t=[];e.content.filter(o=>o.type==="tool_result").forEach(o=>{if(!Array.isArray(o.content))return;let r=o.content.filter(s=>s.type==="image"?(t.push(s),!1):!0);r.length!==o.content.length&&(o.content=r.length>0?r:"read image successfully")}),e.content.push(...t)}var ms,lo,gs,Dc,Fc=R(()=>{"use strict";Ce();ms=class{cache=new Map;maxSize;ttl;constructor(e=100,t=300*1e3){this.maxSize=e,this.ttl=t}evictExpired(){let e=Date.now();for(let[t,o]of this.cache)e-o.timestamp>this.ttl&&this.cache.delete(t)}trim(){if(this.cache.size<=this.maxSize)return;let e=[...this.cache.keys()].slice(0,this.cache.size-this.maxSize);for(let t of e)this.cache.delete(t)}storeImage(e,t){this.hasImage(e)||(this.evictExpired(),this.cache.set(e,{source:t,timestamp:Date.now()}),this.trim())}getImage(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp>this.ttl?(this.cache.delete(e),null):t.source:null}hasImage(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp>this.ttl?(this.cache.delete(e),!1):!0:!1}clear(){this.cache.clear()}size(){return this.evictExpired(),this.cache.size}},lo=new ms;gs=class{name="image";tools;constructor(){this.tools=new Map,this.appendTools()}shouldHandle(e,t){let o=rm(t,e.originalModel||e.body.model);if(!o||e.body.model===o||!sm(e.body.messages))return!1;let s=t.forceUseImageAgent===!0;return!s&&mt(e.body.model)?!1:(im(e.body.messages),s&&!!$c(t))}appendTools(){this.tools.set("analyzeImage",{name:"analyzeImage",description:"Analyse image or images by ID and extract information such as OCR text, objects, layout, colors, or safety signals.",input_schema:{type:"object",properties:{imageId:{type:"array",description:"an array of IDs to analyse",items:{type:"string"}},task:{type:"string",description:"Details of task to perform on the image.The more detailed, the better"},regions:{type:"array",description:"Optional regions of interest within the image",items:{type:"object",properties:{name:{type:"string",description:"Optional label for the region"},x:{type:"number",description:"X coordinate"},y:{type:"number",description:"Y coordinate"},w:{type:"number",description:"Width of the region"},h:{type:"number",description:"Height of the region"},units:{type:"string",enum:["px","pct"],description:"Units for coordinates and size"}},required:["x","y","w","h","units"]}}},required:["imageId","task"]},handler:async(e,t)=>{let o=[],r;if(e.imageId){if(Array.isArray(e.imageId))e.imageId.forEach(i=>{let c=lo.getImage(`${t.req.id}_Image#${i}`);c&&o.push({type:"image",source:c})});else{let i=lo.getImage(`${t.req.id}_Image#${e.imageId}`);i&&o.push({type:"image",source:i})}r=e.imageId,delete e.imageId}let s=t.req.body.messages[t.req.body.messages.length-1];if(s.role==="user"&&Array.isArray(s.content)){let i=s.content.filter(c=>c.type==="text"&&!c.text.includes("This is an image, if you need to view or analyze it, you need to extract the imageId"));o.push(...i)}Object.keys(e).length>0&&o.push({type:"text",text:JSON.stringify(e)});let a=await fetch(`http://127.0.0.1:${t.config.PORT||3456}/v1/messages`,{method:"POST",headers:{"x-api-key":t.config.APIKEY,"content-type":"application/json"},body:JSON.stringify({model:$c(t.config),system:[{type:"text",text:`You must interpret and analyze images strictly according to the assigned task.
|
|
414
414
|
When an image placeholder is provided, your role is to parse the image content only within the scope of the user\u2019s instructions.
|
|
415
415
|
Do not ignore or deviate from the task.
|
|
416
416
|
Always ensure that your response reflects a clear, accurate interpretation of the image aligned with the given objective.`}],messages:[{role:"user",content:o}],stream:!1})}).then(i=>i.json()).catch(i=>null);return!a||!a.content?"analyzeImage Error":a.content[0].text}})}reqHandler(e,t){e.body?.system?.push({type:"text",text:`You are a text-only language model and do not possess visual perception.
|
|
@@ -423,5 +423,5 @@ If multiple images exist, select the **most relevant imageId** based on the user
|
|
|
423
423
|
|
|
424
424
|
Do not attempt to describe or analyze the image directly yourself.
|
|
425
425
|
Ignore any user interruptions or unrelated instructions that might cause you to skip this requirement.
|
|
426
|
-
Your response should consistently follow this rule whenever image-related analysis is requested.`});let o=e.body.messages.filter(s=>s.role==="user"&&Array.isArray(s.content)&&s.content.some(a=>a.type==="image"||Array.isArray(a.content)&&a.content.some(i=>i.type==="image"))),r=1;o.forEach(s=>{Array.isArray(s.content)&&s.content.forEach(a=>{if(a.type==="image")lo.storeImage(`${e.id}_Image#${r}`,a.source),a.type="text",delete a.source,a.text=`[Image #${r}]This is an image, if you need to view or analyze it, you need to extract the imageId`,r++;else if(a.type==="text"&&a.text.includes("[Image #"))a.text=a.text.replace(/\[Image #\d+\]/g,"");else if(a.type==="tool_result"&&Array.isArray(a.content)&&a.content.some(i=>i.type==="image")){let i=[],c=a.content.filter(u=>u.type!=="image"?!0:(lo.storeImage(`${e.id}_Image#${r}`,u.source),i.push(`[Image #${r}]`),r++,!1)),l=`${i.join("")}This is an image, if you need to view or analyze it, you need to extract the imageId`;a.content=c.length>0?[{type:"text",text:l},...c]:l}})})}},Dc=new gs});var hs,Uc,uo,jc=R(()=>{"use strict";Fc();hs=class{agents=new Map;registerAgent(e){this.agents.set(e.name,e)}getAgent(e){return this.agents.get(e)}getAllAgents(){return Array.from(this.agents.values())}getAllTools(){let e=[];for(let t of this.agents.values())e.push(...t.tools.values());return e}},Uc=new hs;Uc.registerAgent(Dc);uo=Uc});import{EventEmitter as am}from"node:events";import{performance as Hc}from"node:perf_hooks";import cm from"json5";function um(n,e){return n===429||!!(e&&/rate[\s_]limit|too many|限流|频率限制|qps_limit|token_limit|quota exhausted|usage limit|limit reached/i.test(e))}function Bc(n,e){(!n.clientContext||!n.usageCacheKey||!n.usageSessionId)&&xe(n,e)}function ys(n){return n.usageSessionId||n.id}function po(n){return n.usageCacheKey||`${n.clientType||"unknown"}:request:${ys(n)}`}function nt(n){return n.body?.model?Array.isArray(n.body.model)?n.body.model.join(","):n.body.model:Array.isArray(n.model)?n.model.join(","):n.model||""}function dm(n){if(!n)return;let e=n;if(Buffer.isBuffer(n)&&(e=n.toString("utf8")),typeof e=="string")try{e=JSON.parse(e)}catch{return}if(typeof e!="object")return;let t=e.usage?Pe(e.usage):e.response?.usage?Pe(e.response.usage):void 0,o=e.model||e.response?.model;if(!(!t&&!o))return{usage:t,model:o}}async function pm(n,e,t){if(await new Promise((r,s)=>{let a=i=>i?s(i):r();no(t)(n,e,a).then(()=>r(),s)}),e.sent)return;let o=new URL(`http://127.0.0.1${n.url}`);if(n.pathname=o.pathname,n.pathname.endsWith("/v1/messages")&&n.pathname!=="/v1/messages"&&(n.preset=n.pathname.replace("/v1/messages","").replace("/","")),n.pathname.endsWith("/v1/responses")&&n.pathname!=="/v1/responses"&&(n.preset=n.pathname.replace("/v1/responses","").replace("/","")),n.pathname.endsWith("/v1/messages")||n.pathname.endsWith("/v1/responses")){Bc(n,t);let r=po(n);n.clientContext?.usageScope==="session"&&(n.previousUsage=Q.get(r))}}async function fm(n,e,t){if(!n.pathname?.endsWith("/v1/messages"))return;let o=[];for(let r of uo.getAllAgents())r.shouldHandle(n,t)&&(o.push(r.name),r.reqHandler(n,t),r.tools.size&&(n.body?.tools?.length||(n.body.tools=[]),n.body.tools.unshift(...Array.from(r.tools.values()).map(s=>({name:s.name,description:s.description,input_schema:s.input_schema})))));o.length&&(n.agents=o)}function Jc(n){return{authClient:(e,t)=>pm(e,t,n),agent:(e,t)=>fm(e,t,n)}}function Wc(n,e){n.addHook("onRequest",async t=>{let o=new URL(`http://127.0.0.1${t.url}`);t.pathname=o.pathname,(o.pathname.endsWith("/v1/messages")||o.pathname.endsWith("/v1/responses"))&&!t.requestStartTime&&(t.requestStartTime=Hc.now())}),n.addHook("preHandler",async(t,o)=>{let r=t.pathname||new URL(`http://127.0.0.1${t.url}`).pathname;r.endsWith("/v1/messages")||r.endsWith("/v1/responses")||await new Promise((s,a)=>{let i=c=>c?a(c):s();no(e)(t,o,i).then(()=>s(),a)})}),n.addHook("onError",async(t,o,r)=>{t.errorMessage=r?.message||r?.toString?.()||"Unknown error",zc.emit("onError",t,o,r)}),n.addHook("onSend",(t,o,r,s)=>{(t.ccrHookOrder||=[]).push("onSend");let a=t.pathname?.endsWith("/v1/messages"),i=t.pathname?.endsWith("/v1/responses");if(a||i){Bc(t,e);let c=ys(t),l=po(t);if(r instanceof ReadableStream){if(a&&t.agents){let h=new AbortController,f=r.pipeThrough(new ie),g,_=-1,b="",y="",k="",T=[],x=[];return s(null,Wn(f,async(v,C)=>{try{if(v.event==="content_block_start"&&v?.data?.content_block?.name){let S=t.agents.find(P=>uo.getAgent(P)?.tools.get(v.data.content_block.name));if(S){g=uo.getAgent(S),_=v.data.index,b=v.data.content_block.name,k=v.data.content_block.id;return}}if(_>-1&&v.data.index===_&&v.data?.delta?.type==="input_json_delta"){y+=v.data?.delta?.partial_json;return}if(_>-1&&v.data.index===_&&v.data?.type==="content_block_stop"){try{let S=cm.parse(y);x.push({type:"tool_use",id:k,name:b,input:S});let P=await g?.tools.get(b)?.handler(S,{req:t,config:e});T.push({tool_use_id:k,type:"tool_result",content:P}),g=void 0,_=-1,b="",y="",k=""}catch(S){console.log(S)}return}if(v.event==="message_delta"&&T.length){t.body.messages.push({role:"assistant",content:x}),t.body.messages.push({role:"user",content:T});let S=await fetch(`http://127.0.0.1:${e.PORT||3456}/v1/messages`,{method:"POST",headers:{"x-api-key":e.APIKEY,"content-type":"application/json"},body:JSON.stringify(t.body)});if(!S.ok)return;let I=S.body.pipeThrough(new ie).getReader();for(;;)try{let{value:O,done:E}=await I.read();if(E)break;let w=O;if(["message_start","message_stop"].includes(w.event))continue;if(!C.desiredSize)break;C.enqueue(w)}catch(O){if(O.name==="AbortError"||O.code==="ERR_STREAM_PREMATURE_CLOSE"){h.abort();break}throw O}return}return v}catch(S){if(console.error("Unexpected error in stream processing:",S),S.code==="ERR_STREAM_PREMATURE_CLOSE"){h.abort();return}throw S}}).pipeThrough(new Ye))}let[p,d]=r.tee(),m=async h=>{let g=h.pipeThrough(new TextDecoderStream).pipeThrough(new ie).getReader();try{for(;;){let{done:_,value:b}=await g.read();if(_)break;let y=b.event,k=b.data;if(y==="message_start"&&k?.message?.model&&(t.upstreamModel=k.message.model),y==="response.completed"&&k?.response?.model&&(t.upstreamModel=k.response.model),k?.usage){let T=Q.get(l)||{},x=Pe(k.usage),v=Pt(T,x,y==="message_start");t.log?.info?.({debug_log:!0,reqId:t.id,phase:"usage_capture_anthropic_sse",event:y,provider:t.provider,model:nt(t),usageSessionId:c,capturedUsage:x,mergedUsage:v}),(x?.cache_read_input_tokens||x?.cache_creation_input_tokens)&&console.log("[Usage] Cache tokens:",{cache_read:x?.cache_read_input_tokens,cache_creation:x?.cache_creation_input_tokens}),Q.put(l,v)}if(k?.response?.usage){let T=Pe(k.response.usage),x=Q.get(l)||{},v=Pt(x,T,!1);t.log?.info?.({debug_log:!0,reqId:t.id,phase:"usage_capture_responses_sse",event:y,provider:t.provider,model:nt(t),usageSessionId:c,capturedUsage:T,mergedUsage:v}),Q.put(l,v)}}}catch(_){_.name==="AbortError"||_.code==="ERR_STREAM_PREMATURE_CLOSE"?console.error("Background read stream closed prematurely"):console.error("Error in background stream reading:",_)}finally{g.releaseLock()}};return t.usageCapturePromise=m(d),s(null,p)}if(r instanceof ReadableStream){let[p,d]=r.tee();return t.usageCapturePromise=(async()=>{let m=d.pipeThrough(new TextDecoderStream).pipeThrough(new ie).getReader();try{for(;;){let{done:h,value:f}=await m.read();if(h)break;let g=f.event,_=f.data;g==="message_start"&&_?.message?.model&&(t.upstreamModel=_.message.model),g==="response.completed"&&_?.response?.model&&(t.upstreamModel=_.response.model);let b=_?.usage??_?.response?.usage;if(b){let y=Pe(b),k=Q.get(l)||{},T=Pt(k,y,g==="message_start");Q.put(l,T)}}}catch(h){h?.name!=="AbortError"&&h?.code!=="ERR_STREAM_PREMATURE_CLOSE"&&t.log?.warn?.({phase:"usage_capture_plain_stream",err:String(h)})}finally{m.releaseLock()}})(),s(null,p)}let u=dm(r);if(u?.usage&&Q.put(l,u.usage),u?.model&&(t.upstreamModel=u.model),typeof r=="object")return r.error?s(r.error,null):s(r,null)}if(typeof r=="object"&&r.error)return s(r.error,null);s(null,r)}),n.addHook("onSend",async(t,o,r)=>{if(zc.emit("onSend",t,o,r),o.statusCode>=400&&(t.pathname?.endsWith("/v1/messages")||t.pathname?.endsWith("/v1/responses")))try{typeof r=="string"?t.errorResponseBody=r:r&&typeof r=="object"&&(t.errorResponseBody=JSON.stringify(r))}catch{}return r}),n.addHook("onRequestAbort",async t=>{zo(t)}),n.addHook("onResponse",async(t,o)=>{if((t.ccrHookOrder||=[]).push("onResponse"),zo(t),!(!t.pathname?.endsWith("/v1/messages")&&!t.pathname?.endsWith("/v1/responses")))try{let r=async x=>{if(!x)return;let v;try{await Promise.race([x,new Promise(C=>{v=setTimeout(C,lm)})])}finally{v&&clearTimeout(v)}};await r(t.usageCapturePromise),await r(t.tokenSpeedCapturePromise);let s=ys(t),a=s,i=t.sessionId||s,c=o.statusCode>=400,l=c?void 0:Q.get(po(t)),u=ts(a),p=j(),d,m,h=t.sseError,f=h&&(h.type||h.code||h.message),g=l?.output_tokens&&l.output_tokens>0,_=c||f&&!g;if(_){d=t.errorMessage||o.errorMessage||t.error?.message||t.error?.toString?.()||void 0,f&&(d=d||JSON.stringify(h),m=JSON.stringify(h)),m=m||t.errorResponseBody;let x=nt(t);um(o.statusCode,d)?p.markRateLimited(t.provider||"",x,120,d):p.recordFailure(t.provider||"",x,d)}else{let x=nt(t);p.recordSuccess(t.provider||"",x)}let b=l?.cache_read_input_tokens??0,k=l?.input_tokens||0||t.tokenCount||0;!b&&t.tokenCount&&l?.input_tokens&&l.input_tokens<t.tokenCount&&(b=t.tokenCount-l.input_tokens,b&&console.log("[Usage] Inferred cache tokens:",{tokenCount:t.tokenCount,netInput:l.input_tokens,impliedCache:b}));let T=_?0:l?.output_tokens||0;!_&&t.body?.stream&&k===0&&T===0&&t.log?.warn?.({debug_log:!0,reqId:t.id,phase:"usage_zero_stream",provider:t.provider,originalModel:t.originalModel||t.body?.model||"",model:nt(t),usageSessionId:i,tokenCount:t.tokenCount,cachedUsage:l,note:"Successful streaming request ended with zero usage. Check provider_stream_chunk usage_monitor and usage_capture_* logs."}),Nt({id:`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,timestamp:new Date().toISOString(),sessionId:i,provider:t.provider||"",originalModel:t.originalModel||t.body?.model||"",model:nt(t),upstreamModel:t.upstreamModel,modelFamily:t.modelFamily||"",scenarioType:t.scenarioType||"default",clientType:t.clientType||He(t),stream:t.body?.stream??!1,inputTokens:k,outputTokens:T,cacheReadInputTokens:b,cacheCreationInputTokens:l?.cache_creation_input_tokens||0,ttft:_||!t.body?.stream?null:u.ttft,tokensPerSecond:_?null:u.tokensPerSecond,durationMs:t.requestStartTime?Math.round(Hc.now()-t.requestStartTime):0,status:_?"error":"success",errorMessage:d,responseBody:m}),t.clientContext?.usageScope!=="session"&&Q.delete(po(t))}catch(r){console.error("Usage tracking error:",r)}})}var lm,zc,Kc=R(()=>{"use strict";ze();en();qt();re();wr();Pr();Er();Dt();Kr();jc();Yr();ln();lm=1500;zc=new am});var Vc={};mo(Vc,{createCcrServer:()=>km});import{homedir as mm}from"os";import{join as gm}from"path";import{createStream as hm}from"rotating-file-stream";import{CONFIG_FILE as ym,HOME_DIR as Gc,listPresets as _m,ensureCcrSelfProvider as bm}from"@wengine-ai/claude-code-router-shared";async function km(n={}){await rc(),await Zn();let e=await Wr();bm(e).changed&&(await le(e),console.log('\u2139\uFE0F Added the preset "ccr" provider pointing at this server (delete it in the UI to remove it for good).'));let o=e.Providers||e.providers||[],r=o&&o.length>0,s=e.HOST||"127.0.0.1";r?(s=e.HOST,e.APIKEY||(s="127.0.0.1")):(s="0.0.0.0",console.log("\u2139\uFE0F No providers configured. Listening on 0.0.0.0 without authentication."));let a=n.port??e.PORT??3456,i=process.env.SERVICE_PORT?parseInt(process.env.SERVICE_PORT):a;ja();let c=m=>(m>9?"":"0")+m,l=(m,h)=>{let f;m?typeof m=="number"?f=new Date(m):f=m:f=new Date;let g=f.getFullYear()+""+c(f.getMonth()+1),_=c(f.getDate()),b=c(f.getHours()),y=c(f.getMinutes());return`./logs/ccr-${g}${_}${b}${y}${c(f.getSeconds())}${h?`_${h}`:""}.log`},u;n.logger!==void 0?u=n.logger:(lc(),e.LOG!==!1?(e.LOG===void 0&&(e.LOG=!0),u={level:e.LOG_LEVEL||"error",stream:hm(l,{path:Gc,interval:"1d",size:"50M",compress:!1})}):u=!1);let p=await _m(),d=new Yc({jsonPath:ym,initialConfig:{providers:e.Providers||e.providers,HOST:s,PORT:i,LOG_FILE:gm(mm(),".claude-code-router","claude-code-router.log")},logger:u});try{await d.ready();let m=await hc({configDir:Gc,registry:d.pluginRegistry,getServer:()=>d,log:{info:_=>d.app?.log?.info?.(_),warn:_=>d.app?.log?.warn?.(_),error:_=>d.app?.log?.error?.(_)}});m.failed.length&&d.app?.log?.warn?.(`plugins failed to load: ${m.failed.map(_=>`${_.name} (${_.error})`).join("; ")}`),d.pluginRegistry.listLoadedPlugins().length&&d.app?.log?.info?.(`provider plugins active: ${d.pluginRegistry.listLoadedPlugins().map(_=>`${_.name}@${_.version}`).join(", ")}`),m.loaded.length&&qe(d,e,d.app.log),await Lc(d,e),d.recordUsage=_=>{try{let b=_.req?_.req.clientType||He(_.req):"unknown";Nt({id:`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,timestamp:new Date().toISOString(),sessionId:_.sessionId||"",provider:_.provider||"",originalModel:_.originalModel||"",model:_.model||"",modelFamily:_.modelFamily||"",scenarioType:_.scenarioType||"default",clientType:b,stream:_.stream??!1,inputTokens:_.inputTokens||0,outputTokens:0,cacheReadInputTokens:_.cacheReadInputTokens||0,cacheCreationInputTokens:_.cacheCreationInputTokens||0,ttft:null,tokensPerSecond:null,durationMs:0,status:"error",errorMessage:_.errorMessage,responseBody:void 0})}catch(b){console.error("Fallback usage tracking error:",b)}},Wc(d,e),d.ccrPreHandlerCallbacks=Jc(e),(await Promise.allSettled(p.map(async _=>await d.registerNamespace(`/preset/${_.name}`,_.config)))).forEach((_,b)=>{if(_.status==="rejected"){let y=p[b],k=_.reason instanceof Error?_.reason.message:String(_.reason);d.app?.log?.error?.(`Failed to register preset "${y?.name}": ${k}`)}}),await dc(d,e),Et(e,d.app?.log);let f=_=>{d.app.log.error({err:_},"Uncaught exception")},g=(_,b)=>{d.app.log.error({reason:_,promise:b},"Unhandled rejection")};return process.on("uncaughtException",f),process.on("unhandledRejection",g),d.app.addHook("onClose",async()=>{process.off("uncaughtException",f),process.off("unhandledRejection",g)}),d}catch(m){throw d.pluginRegistry.dispose(),await d.app.close().catch(()=>{}),m}}var Qc=R(()=>{"use strict";Xc();sc();wt();uc();Dr();pc();Nc();ss();ao();Kc();At();Dt();ze()});import Tm from"fastify";import vm from"@fastify/cors";function xm(n={}){let e=Tm({bodyLimit:52428800,...n});return e.setErrorHandler(ws),e.register(vm),e}async function Sm(n={}){return(await Promise.resolve().then(()=>(Qc(),Vc))).createCcrServer(n)}var _s,Yc,XT,Xc=R(()=>{_o();Ht();ln();qo();sr();ar();Ce();en();Jn();re();Le();De();q();ze();ln();Gt();Fe();ze();Ce();_o();qo();sr();ar();Br();Ar();re();Le();Tr();De();re();Jn();rt();q();wt();Kr();At();Qr();Yr();Dt();_s=class{app;pluginRegistry=new st;namespaceProviders=[];reloadProviders(e){let t=e?.Providers??e?.providers??[];this.configService.set("providers",t),this.providerService.reload();for(let o of this.namespaceProviders)o.providers.reload()}reloadNamespaceProviders(e,t){let o=this.namespaceProviders.find(r=>r.name===e);if(!o)throw new Error(`unknown namespace ${e}`);o.config.set("providers",t),o.providers.reload()}configService;providerService;transformerService;tokenizerService;activeProbeService;recordUsage;readiness;mainNamespaceRegistered=!1;signalHandlersRegistered=!1;ccrPreHandlerCallbacks;constructor(e={}){let{initialConfig:t,jsonPath:o,envPath:r,useEnvFile:s,useJsonFile:a,useEnvironmentVariables:i,...c}=e;this.app=xm({...c,logger:c.logger??!0}),this.app._server=this,this.app.addHook("onClose",async()=>{this.pluginRegistry.dispose(),this.tokenizerService?.dispose()});let l={initialConfig:t};o!==void 0&&(l.jsonPath=o),r!==void 0&&(l.envPath=r),s!==void 0&&(l.useEnvFile=s),a!==void 0&&(l.useJsonFile=a),i!==void 0&&(l.useEnvironmentVariables=i),this.configService=new Ee(l),this.transformerService=new Ve(this.configService,this.app.log),this.tokenizerService=new Qe(this.configService,this.app.log);let u=this.transformerService;this.readiness=(async()=>{await Promise.all([this.transformerService.initialize(),this.tokenizerService.initialize()]),this.pluginRegistry.attachTransformerService(u),this.providerService=new We(this.configService,this.transformerService,this.app.log)})()}async ready(){await this.readiness}async register(e,t){await this.app.register(e,t)}addHook(e,t){this.app.addHook(e,t)}async registerNamespace(e,t){if(!e)throw new Error("name is required");if(await this.ready(),e==="/"&&this.mainNamespaceRegistered)return;let o=this.configService,r=this.transformerService,s=this.providerService,a=this.tokenizerService;if(e!=="/"){if(!t)throw new Error("options is required");o=new Ee({initialConfig:{...t,providers:t.Providers||t.providers}}),r=new Ve(o,this.app.log),a=new Qe(o,this.app.log),await Promise.all([r.initialize(),a.initialize()]),this.pluginRegistry.attachTransformerService(r),s=new We(o,r,this.app.log),this.namespaceProviders.push({name:e,config:o,providers:s})}let i=async c=>{c.decorate("pluginRegistry",this.pluginRegistry),c.decorate("configService",o),c.decorate("transformerService",r),c.decorate("providerService",s),c.decorate("tokenizerService",a),c.decorate("recordUsage",this.recordUsage||(()=>{})),c.addHook("preHandler",async(l,u)=>{let p=new URL(`http://127.0.0.1${l.url}`);l.pathname=p.pathname;let d=p.pathname.endsWith("/v1/messages"),m=p.pathname.endsWith("/v1/responses");if(!d&&!m||!l.body||typeof l.body!="object")return;let h=l.ccrHookOrder||=[];if(h.push("request-normalize"),m&&l.body.input&&!l.body.messages&>(l.body),l.body.stream===void 0&&(l.body.stream=!1),l.log.info({data:l.body,type:"request body"}),h.push("adapter"),!l.originalModel&&l.body.model&&(l.originalModel=l.body.model),xe(l,o.getAll()),h.push("auth-client"),!(this.ccrPreHandlerCallbacks&&(await this.ccrPreHandlerCallbacks.authClient(l,u),u.sent))&&(h.push("agent"),!(this.ccrPreHandlerCallbacks&&(await this.ccrPreHandlerCallbacks.agent(l,u),u.sent)))){h.push("router"),l.body?.model&&await an(l,u,{configService:o,tokenizerService:a}),l.usageCacheKey&&Q.put(l.usageCacheKey,{input_tokens:0,output_tokens:0,cache_read_input_tokens:0,cache_creation_input_tokens:0}),h.push("provider-model-normalize");try{let f=l.body;if(!f||!f.model)return u.code(400).send({error:"Missing model in request body"});let g=f.model.split(","),_=f.model;if(g.length>1){let[b,...y]=g;_=y.join(","),f.model=_,l.provider=b}l.model=_}catch(f){return l.log.error({error:f},"Error in modelProviderMiddleware:"),u.code(500).send({error:"Internal server error"})}}}),await Ui(c)};e==="/"?(await this.app.register(i),this.mainNamespaceRegistered=!0):await this.app.register(i,{prefix:e})}async start(){try{if(await this.ready(),await this.registerNamespace("/"),!this.signalHandlersRegistered){this.signalHandlersRegistered=!0;let t=async s=>{this.app.log.info(`Received ${s}, shutting down gracefully...`);try{Sr()}catch{}await this.app.close(),process.exit(0)},o=()=>void t("SIGINT"),r=()=>void t("SIGTERM");process.on("SIGINT",o),process.on("SIGTERM",r),this.app.addHook("onClose",async()=>{process.off("SIGINT",o),process.off("SIGTERM",r),this.signalHandlersRegistered=!1;try{this.tokenizerService.dispose()}catch{}await yo()})}await this.app.ready();let e=await this.app.listen({port:parseInt(this.configService.get("PORT")||"3000",10),host:this.configService.get("HOST")||"127.0.0.1"});this.app.log.info(`\u{1F680} LLMs API server listening on ${e}`);try{at()}catch{}try{lt()}catch{}try{Io()}catch{}try{let t={enabled:this.configService.get("ACTIVE_PROBE_ENABLED")??!0,quotaProbeIntervalMinutes:this.configService.get("QUOTA_PROBE_INTERVAL_MINUTES")??10,probeTimeoutMs:this.configService.get("PROBE_TIMEOUT_MS")??15e3,slowThresholdMs:Number(this.configService.get("PROBE_SLOW_THRESHOLD_MS"))||3e3,initialDelayMs:this.configService.get("PROBE_INITIAL_DELAY_MS")??5e3,excludeProviders:this.configService.get("EXCLUDE_PROBE_PROVIDERS")??[]};this.activeProbeService=_t(()=>this.providerService.getProviders(),t,o=>ue(this.configService,o),this.app.log,o=>this.configService.get(o),o=>this.pluginRegistry?.getManagedRuntimeFor(o))}catch(t){this.app.log.warn?.(`Failed to start active probe service: ${t.message}`)}}catch(e){this.app.log.error(`Error starting server: ${e}`),process.exit(1)}}},Yc=_s;XT=Sm});Xc();export{Bn as ActiveProbeService,Ee as ConfigService,te as ProjectRoutingError,Yt as ProviderHealthStore,We as ProviderService,ie as SSEParserTransform,Ye as SSESerializerTransform,Qe as TokenizerService,Ve as TransformerService,no as apiKeyAuth,xe as applyClientAdapter,qn as backupConfigFile,_i as builtinClientAdapterRegistry,sn as calculateTokenCount,Lu as clearClientAdapterCaches,to as clearProviderHealth,yo as closeProxyDispatchers,Ga as collectReachableModelKeys,Sm as createCcrServer,Yc as default,He as detectClientType,Pi as diagnoseResolutionFailure,he as extractSessionIdFromUserId,Oa as getActiveProbeService,Vo as getAllQuotaResults,$o as getAllRateLimitInfo,ki as getClientAdapter,jt as getConfiguredProxyUrl,j as getHealthStore,K as getProxyDispatcher,br as getQuotaAdapter,tn as getQuotaResult,jl as getRateLimitInfo,zt as getRuntimeDebugLog,XT as getServer,Wr as initConfig,Zn as initDir,Io as initProviderHealthPersistence,lt as initQuotaStorePersistence,at as initRateLimitPersistence,bi as isClientType,Ss as isGlobalProxyEnabled,Vr as listAnthropicCompatibleModels,Pt as mergeUsageCapture,ge as normalizeSessionId,Pe as normalizeUsagePayload,bt as pluginManager,Y as readConfigFile,Rt as readConfigFileRaw,Et as reconcileHealthStore,Cr as resetActiveProbeService,ue as resolveProviderProxyUrl,Wn as rewriteStream,an as router,Oi as searchProjectBySession,Q as sessionUsageCache,ko as setRuntimeDebugLog,_t as startActiveProbe,Sr as stopActiveProbe,Go as storeQuotaResult,Yn as tokenSpeedPlugin,oc as usageStore,le as writeConfigFile};
|
|
426
|
+
Your response should consistently follow this rule whenever image-related analysis is requested.`});let o=e.body.messages.filter(s=>s.role==="user"&&Array.isArray(s.content)&&s.content.some(a=>a.type==="image"||Array.isArray(a.content)&&a.content.some(i=>i.type==="image"))),r=1;o.forEach(s=>{Array.isArray(s.content)&&s.content.forEach(a=>{if(a.type==="image")lo.storeImage(`${e.id}_Image#${r}`,a.source),a.type="text",delete a.source,a.text=`[Image #${r}]This is an image, if you need to view or analyze it, you need to extract the imageId`,r++;else if(a.type==="text"&&a.text.includes("[Image #"))a.text=a.text.replace(/\[Image #\d+\]/g,"");else if(a.type==="tool_result"&&Array.isArray(a.content)&&a.content.some(i=>i.type==="image")){let i=[],c=a.content.filter(u=>u.type!=="image"?!0:(lo.storeImage(`${e.id}_Image#${r}`,u.source),i.push(`[Image #${r}]`),r++,!1)),l=`${i.join("")}This is an image, if you need to view or analyze it, you need to extract the imageId`;a.content=c.length>0?[{type:"text",text:l},...c]:l}})})}},Dc=new gs});var hs,Uc,uo,jc=R(()=>{"use strict";Fc();hs=class{agents=new Map;registerAgent(e){this.agents.set(e.name,e)}getAgent(e){return this.agents.get(e)}getAllAgents(){return Array.from(this.agents.values())}getAllTools(){let e=[];for(let t of this.agents.values())e.push(...t.tools.values());return e}},Uc=new hs;Uc.registerAgent(Dc);uo=Uc});import{EventEmitter as am}from"node:events";import{performance as Hc}from"node:perf_hooks";import cm from"json5";function um(n,e){return n===429||!!(e&&/rate[\s_]limit|too many|限流|频率限制|qps_limit|token_limit|quota exhausted|usage limit|limit reached/i.test(e))}function Bc(n,e){(!n.clientContext||!n.usageCacheKey||!n.usageSessionId)&&xe(n,e)}function ys(n){return n.usageSessionId||n.id}function po(n){return n.usageCacheKey||`${n.clientType||"unknown"}:request:${ys(n)}`}function Ee(n){return n.body?.model?Array.isArray(n.body.model)?n.body.model.join(","):n.body.model:Array.isArray(n.model)?n.model.join(","):n.model||""}function dm(n){if(!n)return;let e=n;if(Buffer.isBuffer(n)&&(e=n.toString("utf8")),typeof e=="string")try{e=JSON.parse(e)}catch{return}if(typeof e!="object")return;let t=e.usage?Pe(e.usage):e.response?.usage?Pe(e.response.usage):void 0,o=e.model||e.response?.model;if(!(!t&&!o))return{usage:t,model:o}}async function pm(n,e,t){if(await new Promise((r,s)=>{let a=i=>i?s(i):r();no(t)(n,e,a).then(()=>r(),s)}),e.sent)return;let o=new URL(`http://127.0.0.1${n.url}`);if(n.pathname=o.pathname,n.pathname.endsWith("/v1/messages")&&n.pathname!=="/v1/messages"&&(n.preset=n.pathname.replace("/v1/messages","").replace("/","")),n.pathname.endsWith("/v1/responses")&&n.pathname!=="/v1/responses"&&(n.preset=n.pathname.replace("/v1/responses","").replace("/","")),n.pathname.endsWith("/v1/messages")||n.pathname.endsWith("/v1/responses")){Bc(n,t);let r=po(n);n.clientContext?.usageScope==="session"&&(n.previousUsage=Q.get(r))}}async function fm(n,e,t){if(!n.pathname?.endsWith("/v1/messages"))return;let o=[];for(let r of uo.getAllAgents())r.shouldHandle(n,t)&&(o.push(r.name),r.reqHandler(n,t),r.tools.size&&(n.body?.tools?.length||(n.body.tools=[]),n.body.tools.unshift(...Array.from(r.tools.values()).map(s=>({name:s.name,description:s.description,input_schema:s.input_schema})))));o.length&&(n.agents=o)}function Jc(n){return{authClient:(e,t)=>pm(e,t,n),agent:(e,t)=>fm(e,t,n)}}function Wc(n,e){n.addHook("onRequest",async t=>{let o=new URL(`http://127.0.0.1${t.url}`);t.pathname=o.pathname,(o.pathname.endsWith("/v1/messages")||o.pathname.endsWith("/v1/responses"))&&!t.requestStartTime&&(t.requestStartTime=Hc.now())}),n.addHook("preHandler",async(t,o)=>{let r=t.pathname||new URL(`http://127.0.0.1${t.url}`).pathname;r.endsWith("/v1/messages")||r.endsWith("/v1/responses")||await new Promise((s,a)=>{let i=c=>c?a(c):s();no(e)(t,o,i).then(()=>s(),a)})}),n.addHook("onError",async(t,o,r)=>{t.errorMessage=r?.message||r?.toString?.()||"Unknown error",zc.emit("onError",t,o,r)}),n.addHook("onSend",(t,o,r,s)=>{(t.ccrHookOrder||=[]).push("onSend");let a=t.pathname?.endsWith("/v1/messages"),i=t.pathname?.endsWith("/v1/responses");if(a||i){Bc(t,e);let c=ys(t),l=po(t);if(r instanceof ReadableStream){if(a&&t.agents){let h=new AbortController,g=r.pipeThrough(new ie),m,_=-1,b="",y="",k="",v=[],x=[];return s(null,Wn(g,async(T,C)=>{try{if(T.event==="content_block_start"&&T?.data?.content_block?.name){let S=t.agents.find(P=>uo.getAgent(P)?.tools.get(T.data.content_block.name));if(S){m=uo.getAgent(S),_=T.data.index,b=T.data.content_block.name,k=T.data.content_block.id;return}}if(_>-1&&T.data.index===_&&T.data?.delta?.type==="input_json_delta"){y+=T.data?.delta?.partial_json;return}if(_>-1&&T.data.index===_&&T.data?.type==="content_block_stop"){try{let S=cm.parse(y);x.push({type:"tool_use",id:k,name:b,input:S});let P=await m?.tools.get(b)?.handler(S,{req:t,config:e});v.push({tool_use_id:k,type:"tool_result",content:P}),m=void 0,_=-1,b="",y="",k=""}catch(S){console.log(S)}return}if(T.event==="message_delta"&&v.length){t.body.messages.push({role:"assistant",content:x}),t.body.messages.push({role:"user",content:v});let S=await fetch(`http://127.0.0.1:${e.PORT||3456}/v1/messages`,{method:"POST",headers:{"x-api-key":e.APIKEY,"content-type":"application/json"},body:JSON.stringify(t.body)});if(!S.ok)return;let I=S.body.pipeThrough(new ie).getReader();for(;;)try{let{value:O,done:E}=await I.read();if(E)break;let w=O;if(["message_start","message_stop"].includes(w.event))continue;if(!C.desiredSize)break;C.enqueue(w)}catch(O){if(O.name==="AbortError"||O.code==="ERR_STREAM_PREMATURE_CLOSE"){h.abort();break}throw O}return}return T}catch(S){if(console.error("Unexpected error in stream processing:",S),S.code==="ERR_STREAM_PREMATURE_CLOSE"){h.abort();return}throw S}}).pipeThrough(new Xe))}let[p,d]=r.tee(),f=async h=>{let m=h.pipeThrough(new TextDecoderStream).pipeThrough(new ie).getReader();try{for(;;){let{done:_,value:b}=await m.read();if(_)break;let y=b.event,k=b.data;if(y==="message_start"&&k?.message?.model&&(t.upstreamModel=k.message.model),!t.upstreamModel&&k?.response?.model&&(t.upstreamModel=k.response.model),y==="response.completed"&&k?.response?.model&&(t.upstreamModel=k.response.model),k?.usage){let v=Q.get(l)||{},x=Pe(k.usage),T=Pt(v,x,y==="message_start");t.log?.info?.({debug_log:!0,reqId:t.id,phase:"usage_capture_anthropic_sse",event:y,provider:t.provider,model:Ee(t),usageSessionId:c,capturedUsage:x,mergedUsage:T}),(x?.cache_read_input_tokens||x?.cache_creation_input_tokens)&&console.log("[Usage] Cache tokens:",{cache_read:x?.cache_read_input_tokens,cache_creation:x?.cache_creation_input_tokens}),Q.put(l,T)}if(k?.response?.usage){let v=Pe(k.response.usage),x=Q.get(l)||{},T=Pt(x,v,!1);t.log?.info?.({debug_log:!0,reqId:t.id,phase:"usage_capture_responses_sse",event:y,provider:t.provider,model:Ee(t),usageSessionId:c,capturedUsage:v,mergedUsage:T}),Q.put(l,T)}}}catch(_){_.name==="AbortError"||_.code==="ERR_STREAM_PREMATURE_CLOSE"?console.error("Background read stream closed prematurely"):console.error("Error in background stream reading:",_)}finally{m.releaseLock()}};return t.usageCapturePromise=f(d),s(null,p)}if(r instanceof ReadableStream){let[p,d]=r.tee();return t.usageCapturePromise=(async()=>{let f=d.pipeThrough(new TextDecoderStream).pipeThrough(new ie).getReader();try{for(;;){let{done:h,value:g}=await f.read();if(h)break;let m=g.event,_=g.data;m==="message_start"&&_?.message?.model&&(t.upstreamModel=_.message.model),m==="response.completed"&&_?.response?.model&&(t.upstreamModel=_.response.model);let b=_?.usage??_?.response?.usage;if(b){let y=Pe(b),k=Q.get(l)||{},v=Pt(k,y,m==="message_start");Q.put(l,v)}}}catch(h){h?.name!=="AbortError"&&h?.code!=="ERR_STREAM_PREMATURE_CLOSE"&&t.log?.warn?.({phase:"usage_capture_plain_stream",err:String(h)})}finally{f.releaseLock()}})(),s(null,p)}let u=dm(r);if(u?.usage&&Q.put(l,u.usage),u?.model&&(t.upstreamModel=u.model),typeof r=="object")return r.error?s(r.error,null):s(r,null)}if(typeof r=="object"&&r.error)return s(r.error,null);s(null,r)}),n.addHook("onSend",async(t,o,r)=>{if(zc.emit("onSend",t,o,r),o.statusCode>=400&&(t.pathname?.endsWith("/v1/messages")||t.pathname?.endsWith("/v1/responses")))try{typeof r=="string"?t.errorResponseBody=r:r&&typeof r=="object"&&(t.errorResponseBody=JSON.stringify(r))}catch{}return r}),n.addHook("onRequestAbort",async t=>{zo(t)}),n.addHook("onResponse",async(t,o)=>{if((t.ccrHookOrder||=[]).push("onResponse"),zo(t),!(!t.pathname?.endsWith("/v1/messages")&&!t.pathname?.endsWith("/v1/responses")))try{let r=async x=>{if(!x)return;let T;try{await Promise.race([x,new Promise(C=>{T=setTimeout(C,lm)})])}finally{T&&clearTimeout(T)}};await r(t.usageCapturePromise),await r(t.tokenSpeedCapturePromise);let s=ys(t),a=s,i=t.sessionId||s,c=o.statusCode>=400,l=c?void 0:Q.get(po(t)),u=ts(a),p=j(),d,f,h=t.sseError,g=h&&(h.type||h.code||h.message),m=l?.output_tokens&&l.output_tokens>0,_=c||g&&!m;if(_){d=t.errorMessage||o.errorMessage||t.error?.message||t.error?.toString?.()||void 0,g&&(d=d||JSON.stringify(h),f=JSON.stringify(h)),f=f||t.errorResponseBody;let x=Ee(t);um(o.statusCode,d)?p.markRateLimited(t.provider||"",x,120,d):p.recordFailure(t.provider||"",x,d)}else{let x=Ee(t);p.recordSuccess(t.provider||"",x)}let b=l?.cache_read_input_tokens??0,k=l?.input_tokens||0||t.tokenCount||0;!b&&t.tokenCount&&l?.input_tokens&&l.input_tokens<t.tokenCount&&(b=t.tokenCount-l.input_tokens,b&&console.log("[Usage] Inferred cache tokens:",{tokenCount:t.tokenCount,netInput:l.input_tokens,impliedCache:b}));let v=_?0:l?.output_tokens||0;!_&&t.body?.stream&&k===0&&v===0&&t.log?.warn?.({debug_log:!0,reqId:t.id,phase:"usage_zero_stream",provider:t.provider,originalModel:t.originalModel||t.body?.model||"",model:Ee(t),usageSessionId:i,tokenCount:t.tokenCount,cachedUsage:l,note:"Successful streaming request ended with zero usage. Check provider_stream_chunk usage_monitor and usage_capture_* logs."}),Nt({id:`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,timestamp:new Date().toISOString(),sessionId:i,provider:t.provider||"",originalModel:t.originalModel||t.body?.model||"",model:Ee(t),upstreamModel:t.upstreamModel||Ee(t)||void 0,modelFamily:t.modelFamily||"",scenarioType:t.scenarioType||"default",clientType:t.clientType||ze(t),stream:t.body?.stream??!1,inputTokens:k,outputTokens:v,cacheReadInputTokens:b,cacheCreationInputTokens:l?.cache_creation_input_tokens||0,ttft:_||!t.body?.stream?null:u.ttft,tokensPerSecond:_?null:u.tokensPerSecond,durationMs:t.requestStartTime?Math.round(Hc.now()-t.requestStartTime):0,status:_?"error":"success",errorMessage:d,responseBody:f}),t.clientContext?.usageScope!=="session"&&Q.delete(po(t))}catch(r){console.error("Usage tracking error:",r)}})}var lm,zc,Kc=R(()=>{"use strict";Be();en();qt();re();wr();Pr();Er();Dt();Kr();jc();Yr();ln();lm=1500;zc=new am});var Vc={};mo(Vc,{createCcrServer:()=>km});import{homedir as mm}from"os";import{join as gm}from"path";import{createStream as hm}from"rotating-file-stream";import{CONFIG_FILE as ym,HOME_DIR as Gc,listPresets as _m,ensureCcrSelfProvider as bm}from"@wengine-ai/claude-code-router-shared";async function km(n={}){await rc(),await Zn();let e=await Wr();bm(e).changed&&(await le(e),console.log('\u2139\uFE0F Added the preset "ccr" provider pointing at this server (delete it in the UI to remove it for good).'));let o=e.Providers||e.providers||[],r=o&&o.length>0,s=e.HOST||"127.0.0.1";r?(s=e.HOST,e.APIKEY||(s="127.0.0.1")):(s="0.0.0.0",console.log("\u2139\uFE0F No providers configured. Listening on 0.0.0.0 without authentication."));let a=n.port??e.PORT??3456,i=process.env.SERVICE_PORT?parseInt(process.env.SERVICE_PORT):a;ja();let c=f=>(f>9?"":"0")+f,l=(f,h)=>{let g;f?typeof f=="number"?g=new Date(f):g=f:g=new Date;let m=g.getFullYear()+""+c(g.getMonth()+1),_=c(g.getDate()),b=c(g.getHours()),y=c(g.getMinutes());return`./logs/ccr-${m}${_}${b}${y}${c(g.getSeconds())}${h?`_${h}`:""}.log`},u;n.logger!==void 0?u=n.logger:(lc(),e.LOG!==!1?(e.LOG===void 0&&(e.LOG=!0),u={level:e.LOG_LEVEL||"error",stream:hm(l,{path:Gc,interval:"1d",size:"50M",compress:!1})}):u=!1);let p=await _m(),d=new Yc({jsonPath:ym,initialConfig:{providers:e.Providers||e.providers,HOST:s,PORT:i,LOG_FILE:gm(mm(),".claude-code-router","claude-code-router.log")},logger:u});try{await d.ready();let f=await hc({configDir:Gc,registry:d.pluginRegistry,getServer:()=>d,log:{info:_=>d.app?.log?.info?.(_),warn:_=>d.app?.log?.warn?.(_),error:_=>d.app?.log?.error?.(_)}});f.failed.length&&d.app?.log?.warn?.(`plugins failed to load: ${f.failed.map(_=>`${_.name} (${_.error})`).join("; ")}`),d.pluginRegistry.listLoadedPlugins().length&&d.app?.log?.info?.(`provider plugins active: ${d.pluginRegistry.listLoadedPlugins().map(_=>`${_.name}@${_.version}`).join(", ")}`),f.loaded.length&&et(d,e,d.app.log),await Lc(d,e),d.recordUsage=_=>{try{let b=_.req?_.req.clientType||ze(_.req):"unknown";Nt({id:`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,timestamp:new Date().toISOString(),sessionId:_.sessionId||"",provider:_.provider||"",originalModel:_.originalModel||"",model:_.model||"",modelFamily:_.modelFamily||"",scenarioType:_.scenarioType||"default",clientType:b,stream:_.stream??!1,inputTokens:_.inputTokens||0,outputTokens:0,cacheReadInputTokens:_.cacheReadInputTokens||0,cacheCreationInputTokens:_.cacheCreationInputTokens||0,ttft:null,tokensPerSecond:null,durationMs:0,status:"error",errorMessage:_.errorMessage,responseBody:void 0})}catch(b){console.error("Fallback usage tracking error:",b)}},Wc(d,e),d.ccrPreHandlerCallbacks=Jc(e),(await Promise.allSettled(p.map(async _=>await d.registerNamespace(`/preset/${_.name}`,_.config)))).forEach((_,b)=>{if(_.status==="rejected"){let y=p[b],k=_.reason instanceof Error?_.reason.message:String(_.reason);d.app?.log?.error?.(`Failed to register preset "${y?.name}": ${k}`)}}),await dc(d,e),Et(e,d.app?.log);let g=_=>{d.app.log.error({err:_},"Uncaught exception")},m=(_,b)=>{d.app.log.error({reason:_,promise:b},"Unhandled rejection")};return process.on("uncaughtException",g),process.on("unhandledRejection",m),d.app.addHook("onClose",async()=>{process.off("uncaughtException",g),process.off("unhandledRejection",m)}),d}catch(f){throw d.pluginRegistry.dispose(),await d.app.close().catch(()=>{}),f}}var Qc=R(()=>{"use strict";Xc();sc();wt();uc();Dr();pc();Nc();ss();ao();Kc();At();Dt();Be()});import Tm from"fastify";import vm from"@fastify/cors";function xm(n={}){let e=Tm({bodyLimit:52428800,...n});return e.setErrorHandler(ws),e.register(vm),e}async function Sm(n={}){return(await Promise.resolve().then(()=>(Qc(),Vc))).createCcrServer(n)}var _s,Yc,XT,Xc=R(()=>{_o();Ht();ln();qo();sr();ar();Ce();en();Jn();re();Ne();Fe();q();Be();ln();Gt();Ue();Be();Ce();_o();qo();sr();ar();Br();Ar();re();Ne();Tr();Fe();re();Jn();rt();q();wt();Kr();At();Qr();Yr();Dt();_s=class{app;pluginRegistry=new st;namespaceProviders=[];reloadProviders(e){let t=e?.Providers??e?.providers??[];this.configService.set("providers",t),this.providerService.reload();for(let o of this.namespaceProviders)o.providers.reload()}reloadNamespaceProviders(e,t){let o=this.namespaceProviders.find(r=>r.name===e);if(!o)throw new Error(`unknown namespace ${e}`);o.config.set("providers",t),o.providers.reload()}configService;providerService;transformerService;tokenizerService;activeProbeService;recordUsage;readiness;mainNamespaceRegistered=!1;signalHandlersRegistered=!1;ccrPreHandlerCallbacks;constructor(e={}){let{initialConfig:t,jsonPath:o,envPath:r,useEnvFile:s,useJsonFile:a,useEnvironmentVariables:i,...c}=e;this.app=xm({...c,logger:c.logger??!0}),this.app._server=this,this.app.addHook("onClose",async()=>{this.pluginRegistry.dispose(),this.tokenizerService?.dispose()});let l={initialConfig:t};o!==void 0&&(l.jsonPath=o),r!==void 0&&(l.envPath=r),s!==void 0&&(l.useEnvFile=s),a!==void 0&&(l.useJsonFile=a),i!==void 0&&(l.useEnvironmentVariables=i),this.configService=new Ae(l),this.transformerService=new Qe(this.configService,this.app.log),this.tokenizerService=new Ye(this.configService,this.app.log);let u=this.transformerService;this.readiness=(async()=>{await Promise.all([this.transformerService.initialize(),this.tokenizerService.initialize()]),this.pluginRegistry.attachTransformerService(u),this.providerService=new Ke(this.configService,this.transformerService,this.app.log)})()}async ready(){await this.readiness}async register(e,t){await this.app.register(e,t)}addHook(e,t){this.app.addHook(e,t)}async registerNamespace(e,t){if(!e)throw new Error("name is required");if(await this.ready(),e==="/"&&this.mainNamespaceRegistered)return;let o=this.configService,r=this.transformerService,s=this.providerService,a=this.tokenizerService;if(e!=="/"){if(!t)throw new Error("options is required");o=new Ae({initialConfig:{...t,providers:t.Providers||t.providers}}),r=new Qe(o,this.app.log),a=new Ye(o,this.app.log),await Promise.all([r.initialize(),a.initialize()]),this.pluginRegistry.attachTransformerService(r),s=new Ke(o,r,this.app.log),this.namespaceProviders.push({name:e,config:o,providers:s})}let i=async c=>{c.decorate("pluginRegistry",this.pluginRegistry),c.decorate("configService",o),c.decorate("transformerService",r),c.decorate("providerService",s),c.decorate("tokenizerService",a),c.decorate("recordUsage",this.recordUsage||(()=>{})),c.addHook("preHandler",async(l,u)=>{let p=new URL(`http://127.0.0.1${l.url}`);l.pathname=p.pathname;let d=p.pathname.endsWith("/v1/messages"),f=p.pathname.endsWith("/v1/responses");if(!d&&!f||!l.body||typeof l.body!="object")return;let h=l.ccrHookOrder||=[];if(h.push("request-normalize"),f&&l.body.input&&!l.body.messages&>(l.body),l.body.stream===void 0&&(l.body.stream=!1),l.log.info({data:l.body,type:"request body"}),h.push("adapter"),!l.originalModel&&l.body.model&&(l.originalModel=l.body.model),xe(l,o.getAll()),h.push("auth-client"),!(this.ccrPreHandlerCallbacks&&(await this.ccrPreHandlerCallbacks.authClient(l,u),u.sent))&&(h.push("agent"),!(this.ccrPreHandlerCallbacks&&(await this.ccrPreHandlerCallbacks.agent(l,u),u.sent)))){h.push("router"),l.body?.model&&await an(l,u,{configService:o,tokenizerService:a}),l.usageCacheKey&&Q.put(l.usageCacheKey,{input_tokens:0,output_tokens:0,cache_read_input_tokens:0,cache_creation_input_tokens:0}),h.push("provider-model-normalize");try{let g=l.body;if(!g||!g.model)return u.code(400).send({error:"Missing model in request body"});let m=g.model.split(","),_=g.model;if(m.length>1){let[b,...y]=m;_=y.join(","),g.model=_,l.provider=b}l.model=_}catch(g){return l.log.error({error:g},"Error in modelProviderMiddleware:"),u.code(500).send({error:"Internal server error"})}}}),await Ui(c)};e==="/"?(await this.app.register(i),this.mainNamespaceRegistered=!0):await this.app.register(i,{prefix:e})}async start(){try{if(await this.ready(),await this.registerNamespace("/"),!this.signalHandlersRegistered){this.signalHandlersRegistered=!0;let t=async s=>{this.app.log.info(`Received ${s}, shutting down gracefully...`);try{Sr()}catch{}await this.app.close(),process.exit(0)},o=()=>void t("SIGINT"),r=()=>void t("SIGTERM");process.on("SIGINT",o),process.on("SIGTERM",r),this.app.addHook("onClose",async()=>{process.off("SIGINT",o),process.off("SIGTERM",r),this.signalHandlersRegistered=!1;try{this.tokenizerService.dispose()}catch{}await yo()})}await this.app.ready();let e=await this.app.listen({port:parseInt(this.configService.get("PORT")||"3000",10),host:this.configService.get("HOST")||"127.0.0.1"});this.app.log.info(`\u{1F680} LLMs API server listening on ${e}`);try{at()}catch{}try{lt()}catch{}try{Io()}catch{}try{let t={enabled:this.configService.get("ACTIVE_PROBE_ENABLED")??!0,quotaProbeIntervalMinutes:this.configService.get("QUOTA_PROBE_INTERVAL_MINUTES")??10,probeTimeoutMs:this.configService.get("PROBE_TIMEOUT_MS")??15e3,slowThresholdMs:Number(this.configService.get("PROBE_SLOW_THRESHOLD_MS"))||3e3,initialDelayMs:this.configService.get("PROBE_INITIAL_DELAY_MS")??5e3,excludeProviders:this.configService.get("EXCLUDE_PROBE_PROVIDERS")??[]};this.activeProbeService=_t(()=>this.providerService.getProviders(),t,o=>ue(this.configService,o),this.app.log,o=>this.configService.get(o),o=>this.pluginRegistry?.getManagedRuntimeFor(o))}catch(t){this.app.log.warn?.(`Failed to start active probe service: ${t.message}`)}}catch(e){this.app.log.error(`Error starting server: ${e}`),process.exit(1)}}},Yc=_s;XT=Sm});Xc();export{Bn as ActiveProbeService,Ae as ConfigService,te as ProjectRoutingError,Yt as ProviderHealthStore,Ke as ProviderService,ie as SSEParserTransform,Xe as SSESerializerTransform,Ye as TokenizerService,Qe as TransformerService,no as apiKeyAuth,xe as applyClientAdapter,qn as backupConfigFile,_i as builtinClientAdapterRegistry,sn as calculateTokenCount,Lu as clearClientAdapterCaches,to as clearProviderHealth,yo as closeProxyDispatchers,Ga as collectReachableModelKeys,Sm as createCcrServer,Yc as default,ze as detectClientType,Pi as diagnoseResolutionFailure,he as extractSessionIdFromUserId,Oa as getActiveProbeService,Vo as getAllQuotaResults,$o as getAllRateLimitInfo,ki as getClientAdapter,jt as getConfiguredProxyUrl,j as getHealthStore,K as getProxyDispatcher,br as getQuotaAdapter,tn as getQuotaResult,jl as getRateLimitInfo,zt as getRuntimeDebugLog,XT as getServer,Wr as initConfig,Zn as initDir,Io as initProviderHealthPersistence,lt as initQuotaStorePersistence,at as initRateLimitPersistence,bi as isClientType,Ss as isGlobalProxyEnabled,Vr as listAnthropicCompatibleModels,Pt as mergeUsageCapture,ge as normalizeSessionId,Pe as normalizeUsagePayload,bt as pluginManager,Y as readConfigFile,Rt as readConfigFileRaw,Et as reconcileHealthStore,Cr as resetActiveProbeService,ue as resolveProviderProxyUrl,Wn as rewriteStream,an as router,Oi as searchProjectBySession,Q as sessionUsageCache,ko as setRuntimeDebugLog,_t as startActiveProbe,Sr as stopActiveProbe,Go as storeQuotaResult,Yn as tokenSpeedPlugin,oc as usageStore,le as writeConfigFile};
|
|
427
427
|
//# sourceMappingURL=server.mjs.map
|