@wengine-ai/llms 2.2.0 → 2.2.1

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.
@@ -71,7 +71,7 @@ ${this.toMarkdown(o,n+1)}`:`${r}- ${o}`).join(`
71
71
  ${this.toMarkdown(s,n+1)}`:`${r}${o}: ${s}`).join(`
72
72
  `):`${r}${e}`}async output(e,n={}){try{let r=this.formatData(e,n);switch(this.config.level||"log"){case"info":console.info(r);break;case"warn":console.warn(r);break;case"error":console.error(r);break;case"debug":console.debug(r);break;case"log":default:console.log(r);break}return!0}catch(r){return console.error("[ConsoleOutputHandler] Output failed:",r),!1}}}});var gs,cf=Le(()=>{"use strict";gs=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 n=Buffer.from(`${this.config.auth.username}:${this.config.auth.password}`).toString("base64");e.Authorization=`Basic ${n}`}break;case"custom":this.config.auth.custom&&(e[this.config.auth.custom.header]=this.config.auth.custom.value);break}return e}buildBody(e,n){let{format:r="json",timestamp:o=!0,prefix:s,metadata:a}=n||{},c={data:e};return o&&(c.timestamp=new Date().toISOString()),s&&(c.prefix=s),a&&Object.keys(a).length>0&&(c.metadata=a),c}async sendRequest(e,n,r,o,s){let a=new AbortController,c=setTimeout(()=>a.abort(),s);try{let l=await fetch(e,{method:n,headers:r,body:JSON.stringify(o),signal:a.signal});if(clearTimeout(c),!l.ok)throw new Error(`HTTP ${l.status}: ${l.statusText}`);return l}catch(l){throw clearTimeout(c),l}}delay(e){return new Promise(n=>setTimeout(n,e))}async sendWithRetry(e,n,r,o,s,a){let c=null;for(let l=1;l<=a.maxAttempts;l++)try{return await this.sendRequest(e,n,r,o,s)}catch(d){if(c=d,l===a.maxAttempts)break;let f=a.backoffMs*Math.pow(2,l-1);console.warn(`[WebhookOutputHandler] Request failed (attempt ${l}/${a.maxAttempts}), retrying in ${f}ms...`,d.message),await this.delay(f)}throw c}async output(e,n={}){let r=n.timeout||this.defaultTimeout;try{let o=this.buildHeaders(),s=this.buildBody(e,n),a=await this.sendWithRetry(this.config.url,this.config.method,o,s,r,this.config.retry);return!0}catch(o){let s=o instanceof Error?o.message:String(o);if(this.config.silent)return console.error(`[WebhookOutputHandler] Failed to send data: ${s}`),!1;throw new Error(`Webhook output failed: ${s}`)}}}});import{writeFileSync as vR,existsSync as TR,mkdirSync as DR}from"fs";import{join as o_}from"path";import{tmpdir as RR}from"os";var ys,lf=Le(()=>{"use strict";ys=class{type="temp-file";config;baseDir;constructor(e={}){this.config={subdirectory:"claude-code-router",extension:"json",includeTimestamp:!1,prefix:"session",...e};let n=RR();this.baseDir=o_(n,this.config.subdirectory),this.ensureDir()}ensureDir(){try{TR(this.baseDir)||DR(this.baseDir,{recursive:!0})}catch{}}extractSessionId(e){try{let n=e.match(/_session_([a-f0-9-]+)/i);return n?n[1]:null}catch{return null}}getFilePath(e){let n=this.config.prefix||"session",r=this.config.extension?`.${this.config.extension}`:"",o;if(this.config.includeTimestamp){let s=Date.now();o=`${n}-${e}-${s}${r}`}else o=`${n}-${e}${r}`;return o_(this.baseDir,o)}async output(e,n={}){try{let r=n.metadata?.sessionId;if(!r)return!1;let o={...e,timestamp:Date.now(),sessionId:r},s=this.getFilePath(r);return vR(s,JSON.stringify(o,null,2),"utf-8"),!0}catch{return!1}}getBaseDir(){return this.baseDir}}});var df,Co,s_=Le(()=>{"use strict";uf();cf();lf();df=class{handlers=new Map;defaultOptions={};registerHandler(e,n){this.handlers.set(e,n)}registerHandlers(e){for(let n of e)if(n.enabled!==!1)try{let r=this.createHandler(n),o=n.type+"_"+Date.now();this.registerHandler(o,r)}catch(r){console.error(`[OutputManager] Failed to register ${n.type} handler:`,r)}}createHandler(e){switch(e.type){case"console":return new ms(e.config);case"webhook":return new gs(e.config);case"temp-file":return new ys(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,n){let r={...this.defaultOptions,...n},o={success:[],failed:[]},s=Array.from(this.handlers.entries()).map(async([a,c])=>{try{await c.output(e,r)?o.success.push(a):o.failed.push(a)}catch(l){console.error(`[OutputManager] Handler ${a} failed:`,l),o.failed.push(a)}});return await Promise.all(s),o}async outputTo(e,n,r){let o={...this.defaultOptions,...r},s={success:[],failed:[]},a=e.map(async c=>{let l=this.handlers.get(c);if(!l){console.warn(`[OutputManager] Handler ${c} not found`),s.failed.push(c);return}try{await l.output(n,o)?s.success.push(c):s.failed.push(c)}catch(d){console.error(`[OutputManager] Handler ${c} failed:`,d),s.failed.push(c)}});return await Promise.all(a),s}async outputToType(e,n,r){let o=Array.from(this.handlers.entries()).filter(([s,a])=>a.type===e).map(([s])=>s);return this.outputTo(o,n,r)}},Co=new df});import OR from"fastify";import PR from"@fastify/cors";var Rh=jn($u(),1);import{readFileSync as sC,existsSync as Th}from"fs";import{join as Dh}from"path";import{config as iC}from"dotenv";var Ir=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:Dh(process.cwd(),this.options.jsonPath);if(Th(e))try{let n=sC(e,"utf-8"),r=Rh.default.parse(n);this.config={...this.config,...r},console.log(`Loaded JSON config from: ${e}`)}catch(n){console.warn(`Failed to load JSON config from ${e}:`,n)}else console.warn(`JSON config file not found: ${e}`)}loadEnvConfig(){let e=this.isAbsolutePath(this.options.envPath)?this.options.envPath:Dh(process.cwd(),this.options.envPath);if(Th(e))try{let n=iC({path:e});n.parsed&&(this.config={...this.config,...this.parseEnvConfig(n.parsed)})}catch(n){console.warn(`Failed to load .env config from ${e}:`,n)}}loadEnvironmentVariables(){let e=this.parseEnvConfig(process.env);this.config={...this.config,...e}}parseEnvConfig(e){let n={};return Object.assign(n,e),n}isAbsolutePath(e){return e.startsWith("/")||e.includes(":")}get(e,n){let r=this.config[e];return r!==void 0?r:n}getAll(){return{...this.config}}getHttpsProxy(){return this.get("HTTPS_PROXY")||this.get("https_proxy")||this.get("httpsProxy")||this.get("PROXY_URL")}has(e){return this.config[e]!==void 0}set(e,n){this.config[e]=n}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 ze(t,e=500,n="internal_error",r="api_error"){let o=new Error(t);return o.statusCode=e,o.code=n,o.type=r,o}async function xh(t,e,n){e.log.error(t);let r=t.statusCode||500;if(t.rawBody)try{let s=JSON.parse(t.rawBody);return n.code(r).send(s)}catch{return n.code(r).send(t.rawBody)}let o={error:{message:t.message+(t.stack||"Internal Server Error"),type:t.type||"api_error",code:t.code||"internal_error"}};return n.code(r).send(o)}import{ProxyAgent as aC}from"undici";function Oh(t,e,n,r,o){let s=new Headers({"Content-Type":"application/json"});n.headers&&Object.entries(n.headers).forEach(([d,f])=>{f&&s.set(d,f)});let a,c=AbortSignal.timeout(n.TIMEOUT??60*1e3*60);if(n.signal){let d=new AbortController,f=()=>d.abort();n.signal.addEventListener("abort",f),c.addEventListener("abort",f),a=d.signal}else a=c;let l={method:"POST",headers:s,body:JSON.stringify(e),signal:a};return n.httpsProxy&&(l.dispatcher=new aC(new URL(n.httpsProxy).toString())),o?.debug({reqId:r.req.id,request:l,headers:Object.fromEntries(s.entries()),requestUrl:typeof t=="string"?t:t.toString(),useProxy:n.httpsProxy},"final request"),fetch(typeof t=="string"?t:t.toString(),l)}var uC=new Set(["authorization","x-api-key","x-goog-api-key","cookie","set-cookie"]),Nr={maxBodyLength:4096,maxStreamChunks:100},qu=!1;function cC(t){qu=t}function lC(){return qu}function Xs(t){return qu||t.get("DEBUG_LOG")===!0}function Ih(t){let e=t.get("DEBUG_LOG_OPTIONS");return!e||typeof e!="object"?Nr:{maxBodyLength:e.maxBodyLength??Nr.maxBodyLength,maxStreamChunks:e.maxStreamChunks??Nr.maxStreamChunks}}function Nh(t){let e={};for(let[n,r]of Object.entries(t))uC.has(n.toLowerCase())?e[n]="***MASKED***":e[n]=r;return e}function Zs(t,e){return t.length<=e?t:t.slice(0,e)+`...[truncated, total ${t.length} bytes]`}function Bh(t,e,n){let r=typeof n.body=="string"?n.body:JSON.stringify(n.body);t.info({debug_log:!0,reqId:e,phase:"provider_request",url:n.url,headers:Nh(n.headers),body:Zs(r,Nr.maxBodyLength)})}function Mh(t,e,n){t.info({debug_log:!0,reqId:e,phase:"provider_response",status:n.status,headers:Nh(n.headers),...n.body!==void 0?{body:Zs(n.body,Nr.maxBodyLength)}:{}})}function Ph(t,e,n,r){let o=dC(r);t.info({debug_log:!0,reqId:e,phase:"provider_stream_chunk",chunkIndex:n,...o?{usage_monitor:o}:{},data:Zs(r,Nr.maxBodyLength)})}function dC(t){let e=[];for(let n of t.split(/\r?\n/)){if(!n.startsWith("data:"))continue;let r=n.slice(5).trim();if(!(!r||r==="[DONE]"))try{let o=JSON.parse(r),s=o?.usage||o?.response?.usage;s&&e.push({path:o?.usage?"usage":"response.usage",usage:s,choicesLength:Array.isArray(o?.choices)?o.choices.length:void 0,finishReason:o?.choices?.[0]?.finish_reason})}catch{e.push({parseError:!0,data:Zs(r,512)})}}if(e.length)return e.length===1?e[0]:e}function Fh(t,e,n){t.info({debug_log:!0,reqId:e,phase:"provider_stream_end",totalChunks:n})}function Lh(t,e,n,r){(async()=>{let o=t.pipeThrough(new TextDecoderStream).getReader(),s=0;try{let a="";for(;;){let{done:c,value:l}=await o.read();if(c)break;a+=l;let d=a.split(`
73
73
 
74
- `);a=d.pop()||"";for(let f of d)f.trim()&&(s<r.maxStreamChunks?Ph(e,n,s,f):s===r.maxStreamChunks&&e.info({debug_log:!0,reqId:n,phase:"provider_stream_chunk_omitted",message:`[chunks after #${s} omitted, maxStreamChunks=${r.maxStreamChunks}]`}),s++)}a.trim()&&(s<r.maxStreamChunks&&Ph(e,n,s,a.trim()),s++),Fh(e,n,s)}catch(a){console.error(`[debug_log] Error reading debug stream for reqId=${n}:`,a),Fh(e,n,s)}finally{o.releaseLock()}})()}var jh="2.2.0";$n();import{existsSync as Vh,mkdirSync as kC,readFileSync as AC,writeFileSync as SC}from"fs";import{join as Kh}from"path";import{HOME_DIR as vC}from"@wengine-ai/claude-code-router-shared";var Ku=Kh(vC,"runtime"),Yu=Kh(Ku,"rate-limit.json"),Br=new Map,Wh=!1,TC=null,DC=["x-ratelimit-remaining-tokens","x-ratelimit-remaining-requests","x-ratelimit-remaining"],RC=["x-ratelimit-limit-tokens","x-ratelimit-limit-requests","x-ratelimit-limit"],xC=["x-ratelimit-reset-tokens","x-ratelimit-reset-requests","x-ratelimit-reset"];function Po(t,e,n){let r=c=>{if(n instanceof Headers)return n.get(c);let l=Object.keys(n).find(d=>d.toLowerCase()===c);return l?n[l]:null},o=Vu(r,DC),s=Vu(r,RC),a=Vu(r,xC);(o||s||a)&&Br.set(t,{provider:t,remaining:Gh(o),limit:Gh(s),reset:FC(a),capturedAt:Date.now()})}function OC(t){return Br.get(t)}function PC(){return Array.from(Br.values())}function Vu(t,e){for(let n of e){let r=t(n);if(r)return r}return null}function Gh(t){if(!t)return null;let e=Number(t.trim().replace(/,/g,""));return Number.isFinite(e)?e:null}function FC(t){if(!t)return null;let e=t.trim();if(!e)return null;let n=Number(e);if(Number.isFinite(n))return n>1e12?Math.floor(n/1e3):n>1e9?Math.floor(n):Math.floor(Date.now()/1e3+n);let r=Date.parse(e);if(Number.isFinite(r))return Math.floor(r/1e3);let o=IC(e);return o===null?null:Math.floor((Date.now()+o)/1e3)}function IC(t){let e=/(\d+(?:\.\d+)?)(ms|s|m|h|d)/gi,n=0,r=!1;for(let o of t.matchAll(e)){r=!0;let s=Number(o[1]),a=o[2].toLowerCase();if(Number.isFinite(s))switch(a){case"ms":n+=s;break;case"s":n+=s*1e3;break;case"m":n+=s*60*1e3;break;case"h":n+=s*60*60*1e3;break;case"d":n+=s*24*60*60*1e3;break}}return r?n:null}function NC(){try{if(!Vh(Yu))return;let t=JSON.parse(AC(Yu,"utf-8"));if(!Array.isArray(t))return;let e=Date.now();for(let n of t)if(n&&n.provider){if(n.capturedAt&&e-n.capturedAt>3600*1e3)continue;Br.set(n.provider,n)}}catch{}}function Jh(){try{if(Br.size===0)return;Vh(Ku)||kC(Ku,{recursive:!0}),SC(Yu,JSON.stringify(Array.from(Br.values()),null,2),"utf-8")}catch{}}function Qu(){Wh||(Wh=!0,NC(),TC=setInterval(Jh,6e4),process.on("exit",Jh))}ei();var Mr=class{name="openai-responses";endPoint="/v1/responses";async transformRequestIn(e){delete e.temperature,delete e.max_tokens,e.reasoning&&(e.reasoning={effort:e.reasoning.effort,summary:"detailed"});let n=[],r=e.messages.filter(o=>o.role==="system");if(r.length>0){let o=r[0];Array.isArray(o.content)?o.content.forEach(s=>{let a="";typeof s=="string"?a=s:s&&typeof s=="object"&&"text"in s&&(a=s.text),n.push({role:"system",content:a})}):e.instructions=o.content}if(e.messages.forEach(o=>{if(o.role!=="system"){if(Array.isArray(o.content)){let s=o.content.map(a=>this.normalizeRequestContent(a,o.role)).filter(a=>a!==null);s.length>0?o.content=s:delete o.content}if(o.role==="tool"){let s={...o};s.type="function_call_output",s.call_id=o.tool_call_id,s.output=o.content,delete s.cache_control,delete s.role,delete s.tool_call_id,delete s.content,n.push(s);return}if(o.role==="assistant"&&Array.isArray(o.tool_calls)){o.tool_calls.forEach(s=>{n.push({type:"function_call",arguments:s.function.arguments,name:s.function.name,call_id:s.id})});return}n.push(o)}}),e.input=n,delete e.messages,Array.isArray(e.tools)){let o=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})),o&&e.tools.push({type:"web_search"})}return e.parallel_tool_calls=!1,e}async transformResponseOut(e){let n=e.headers.get("Content-Type")||"";if(n.includes("application/json")){let r=await e.json();if(r.object==="response"&&r.output){let o=this.convertResponseToChat(r);return new Response(JSON.stringify(o),{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(n.includes("text/event-stream")){if(!e.body)return e;let[r,o]=e.body.tee(),s=r.getReader(),a="";try{let{value:g,done:_}=await s.read();!_&&g&&(a=new TextDecoder().decode(g))}finally{s.releaseLock()}if(r.cancel().catch(()=>{}),a.includes("message_start")||a.includes("content_block_start")){let g=this.prependToStream(a,o);return new Response(g,{status:e.status,statusText:e.statusText,headers:e.headers})}if(a.includes("response.created")||a.includes("response.output_text.delta")||a.includes("response.in_progress")||a.includes("response.output_item.added")){let g=this.prependToStream(a,o);return new Response(g,{status:e.status,statusText:e.statusText,headers:e.headers})}let d=this.prependToStream(a,o),f=new TextDecoder,p=new TextEncoder,m="",b=!1,C=this,y=new ReadableStream({async start(g){let _=d.getReader(),k=-1,w="",S=T=>(T!==w&&(k++,w=T),k);try{for(;;){let{done:T,value:x}=await _.read();if(T){b||g.enqueue(p.encode(`data: [DONE]
74
+ `);a=d.pop()||"";for(let f of d)f.trim()&&(s<r.maxStreamChunks?Ph(e,n,s,f):s===r.maxStreamChunks&&e.info({debug_log:!0,reqId:n,phase:"provider_stream_chunk_omitted",message:`[chunks after #${s} omitted, maxStreamChunks=${r.maxStreamChunks}]`}),s++)}a.trim()&&(s<r.maxStreamChunks&&Ph(e,n,s,a.trim()),s++),Fh(e,n,s)}catch(a){console.error(`[debug_log] Error reading debug stream for reqId=${n}:`,a),Fh(e,n,s)}finally{o.releaseLock()}})()}var jh="2.2.1";$n();import{existsSync as Vh,mkdirSync as kC,readFileSync as AC,writeFileSync as SC}from"fs";import{join as Kh}from"path";import{HOME_DIR as vC}from"@wengine-ai/claude-code-router-shared";var Ku=Kh(vC,"runtime"),Yu=Kh(Ku,"rate-limit.json"),Br=new Map,Wh=!1,TC=null,DC=["x-ratelimit-remaining-tokens","x-ratelimit-remaining-requests","x-ratelimit-remaining"],RC=["x-ratelimit-limit-tokens","x-ratelimit-limit-requests","x-ratelimit-limit"],xC=["x-ratelimit-reset-tokens","x-ratelimit-reset-requests","x-ratelimit-reset"];function Po(t,e,n){let r=c=>{if(n instanceof Headers)return n.get(c);let l=Object.keys(n).find(d=>d.toLowerCase()===c);return l?n[l]:null},o=Vu(r,DC),s=Vu(r,RC),a=Vu(r,xC);(o||s||a)&&Br.set(t,{provider:t,remaining:Gh(o),limit:Gh(s),reset:FC(a),capturedAt:Date.now()})}function OC(t){return Br.get(t)}function PC(){return Array.from(Br.values())}function Vu(t,e){for(let n of e){let r=t(n);if(r)return r}return null}function Gh(t){if(!t)return null;let e=Number(t.trim().replace(/,/g,""));return Number.isFinite(e)?e:null}function FC(t){if(!t)return null;let e=t.trim();if(!e)return null;let n=Number(e);if(Number.isFinite(n))return n>1e12?Math.floor(n/1e3):n>1e9?Math.floor(n):Math.floor(Date.now()/1e3+n);let r=Date.parse(e);if(Number.isFinite(r))return Math.floor(r/1e3);let o=IC(e);return o===null?null:Math.floor((Date.now()+o)/1e3)}function IC(t){let e=/(\d+(?:\.\d+)?)(ms|s|m|h|d)/gi,n=0,r=!1;for(let o of t.matchAll(e)){r=!0;let s=Number(o[1]),a=o[2].toLowerCase();if(Number.isFinite(s))switch(a){case"ms":n+=s;break;case"s":n+=s*1e3;break;case"m":n+=s*60*1e3;break;case"h":n+=s*60*60*1e3;break;case"d":n+=s*24*60*60*1e3;break}}return r?n:null}function NC(){try{if(!Vh(Yu))return;let t=JSON.parse(AC(Yu,"utf-8"));if(!Array.isArray(t))return;let e=Date.now();for(let n of t)if(n&&n.provider){if(n.capturedAt&&e-n.capturedAt>3600*1e3)continue;Br.set(n.provider,n)}}catch{}}function Jh(){try{if(Br.size===0)return;Vh(Ku)||kC(Ku,{recursive:!0}),SC(Yu,JSON.stringify(Array.from(Br.values()),null,2),"utf-8")}catch{}}function Qu(){Wh||(Wh=!0,NC(),TC=setInterval(Jh,6e4),process.on("exit",Jh))}ei();var Mr=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 n=e?.input_tokens??e?.prompt_tokens??0,r=e?.output_tokens??e?.completion_tokens??0,o=this.getCacheReadInputTokens(e),s=this.getCacheCreationInputTokens(e);return{input_tokens:n,output_tokens:r,total_tokens:e?.total_tokens??n+r,input_tokens_details:{cached_tokens:o,cache_creation_tokens:s},output_tokens_details:{reasoning_tokens:e?.output_tokens_details?.reasoning_tokens??0},cache_read_input_tokens:o,cache_creation_input_tokens:s}}async transformRequestIn(e){delete e.temperature,delete e.max_tokens,e.reasoning&&(e.reasoning={effort:e.reasoning.effort,summary:"detailed"});let n=[],r=e.messages.filter(o=>o.role==="system");if(r.length>0){let o=r[0];Array.isArray(o.content)?o.content.forEach(s=>{let a="";typeof s=="string"?a=s:s&&typeof s=="object"&&"text"in s&&(a=s.text),n.push({role:"system",content:a})}):e.instructions=o.content}if(e.messages.forEach(o=>{if(o.role!=="system"){if(Array.isArray(o.content)){let s=o.content.map(a=>this.normalizeRequestContent(a,o.role)).filter(a=>a!==null);s.length>0?o.content=s:delete o.content}if(o.role==="tool"){let s={...o};s.type="function_call_output",s.call_id=o.tool_call_id,s.output=o.content,delete s.cache_control,delete s.role,delete s.tool_call_id,delete s.content,n.push(s);return}if(o.role==="assistant"&&Array.isArray(o.tool_calls)){o.tool_calls.forEach(s=>{n.push({type:"function_call",arguments:s.function.arguments,name:s.function.name,call_id:s.id})});return}n.push(o)}}),e.input=n,delete e.messages,Array.isArray(e.tools)){let o=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})),o&&e.tools.push({type:"web_search"})}return e.parallel_tool_calls=!1,e}async transformResponseOut(e){let n=e.headers.get("Content-Type")||"";if(n.includes("application/json")){let r=await e.json();if(r.object==="response"&&r.output){let o=this.convertResponseToChat(r);return new Response(JSON.stringify(o),{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(n.includes("text/event-stream")){if(!e.body)return e;let[r,o]=e.body.tee(),s=r.getReader(),a="";try{let{value:g,done:_}=await s.read();!_&&g&&(a=new TextDecoder().decode(g))}finally{s.releaseLock()}if(r.cancel().catch(()=>{}),a.includes("message_start")||a.includes("content_block_start")){let g=this.prependToStream(a,o);return new Response(g,{status:e.status,statusText:e.statusText,headers:e.headers})}if(a.includes("response.created")||a.includes("response.output_text.delta")||a.includes("response.in_progress")||a.includes("response.output_item.added")){let g=this.prependToStream(a,o);return new Response(g,{status:e.status,statusText:e.statusText,headers:e.headers})}let d=this.prependToStream(a,o),f=new TextDecoder,p=new TextEncoder,m="",b=!1,C=this,y=new ReadableStream({async start(g){let _=d.getReader(),k=-1,w="",S=T=>(T!==w&&(k++,w=T),k);try{for(;;){let{done:T,value:x}=await _.read();if(T){b||g.enqueue(p.encode(`data: [DONE]
75
75
 
76
76
  `));break}let $=f.decode(x,{stream:!0});m+=$;let G=m.split(/\r?\n/);m=G.pop()||"";for(let F of G)if(F.trim())try{if(F.startsWith("event: "))continue;if(F.startsWith("data: ")){let X=F.slice(5).trim();if(X==="[DONE]"){b=!0,g.enqueue(p.encode(`data: [DONE]
77
77
 
@@ -100,16 +100,16 @@ ${this.toMarkdown(s,n+1)}`:`${r}${o}: ${s}`).join(`
100
100
  `))}catch(T){console.error("Stream error:",T),g.error(T)}finally{try{_.releaseLock()}catch(T){console.error("Error releasing reader lock:",T)}g.close()}}});return new Response(y,{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,n){let r={...e};if(delete r.cache_control,e.type==="text")return{type:n==="assistant"?"output_text":"input_text",text:e.text};if(e.type==="image_url"){console.log(e);let o={type:n==="assistant"?"output_image":"input_image"};return typeof e.image_url?.url=="string"&&(o.image_url=e.image_url.url),o}return null}async transformResponseIn(e,n){if(e.headers.get("Content-Type")?.includes("text/event-stream")&&e.body){let[o,s]=e.body.tee(),a=o.getReader(),c="";try{let{value:m,done:b}=await a.read();!b&&m&&(c=new TextDecoder().decode(m))}finally{a.releaseLock()}o.cancel().catch(()=>{});let l=c.includes("message_start")||c.includes("content_block_start"),d=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(d&&!l){let m=this.convertOpenAIChatStreamToResponsesAPI(s,n);return new Response(m,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}let p=this.convertAnthropicStreamToResponsesAPI(s,n);return new Response(p,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}try{let o=await e.json();return new Response(JSON.stringify(this.wrapChatInResponses(o)),{headers:{"Content-Type":"application/json"}})}catch{return e}}prependToStream(e,n){let o=new TextEncoder().encode(e),s=n.getReader(),a=!1;return new ReadableStream({async pull(c){a||(a=!0,c.enqueue(o));try{let{done:l,value:d}=await s.read();l?c.close():c.enqueue(d)}catch(l){c.error(l)}},cancel(){s.cancel().catch(()=>{})}})}convertOpenAIChatStreamToResponsesAPI(e,n){let r=new TextDecoder,o=new TextEncoder,s=n?.provider?.models?.[0]||"gpt-5.4",a=`resp_${Date.now()}`,c=0,l=!1,d=!1,f="",p=-1,m=[],b=(y,g)=>o.encode(`event: ${y}
101
101
  data: ${JSON.stringify(g)}
102
102
 
103
- `),C=(y,g=[])=>({id:a,object:"response",created_at:Math.floor(Date.now()/1e3),status:y,model:s,output:g,usage:{input_tokens:0,output_tokens:0,total_tokens:0,output_tokens_details:{reasoning_tokens:0}}});return new ReadableStream({async start(y){try{let g=e.getReader(),_="",k=!1,w=S=>{if(!k){k=!0;for(let T of m)if(T.type==="function_call"){let x=m.indexOf(T);y.enqueue(b("response.function_call_arguments.done",{type:"response.function_call_arguments.done",item_id:T.call_id||T.id,output_index:x,arguments:T.arguments||""})),T.status="completed",y.enqueue(b("response.output_item.done",{type:"response.output_item.done",output_index:x,item:T}))}for(let T of m)if(T.type==="message"){let x=m.indexOf(T);T.status="completed",y.enqueue(b("response.output_item.done",{type:"response.output_item.done",output_index:x,item:T}))}y.enqueue(b("response.completed",{type:"response.completed",response:{id:a,object:"response",created_at:Math.floor(Date.now()/1e3),status:"completed",model:S?.model||s,output:m.slice(),usage:S?.usage?{input_tokens:S.usage.prompt_tokens||0,output_tokens:S.usage.completion_tokens||0,total_tokens:S.usage.total_tokens||0}:{input_tokens:0,output_tokens:0,total_tokens:0}}}))}};for(;;){let{done:S,value:T}=await g.read();if(S)break;_+=r.decode(T,{stream:!0});let x=_.split(`
103
+ `),C=(y,g=[])=>({id:a,object:"response",created_at:Math.floor(Date.now()/1e3),status:y,model:s,output:g,usage:this.buildResponsesUsage()});return new ReadableStream({async start(y){try{let g=e.getReader(),_="",k=!1,w=S=>{if(!k){k=!0;for(let T of m)if(T.type==="function_call"){let x=m.indexOf(T);y.enqueue(b("response.function_call_arguments.done",{type:"response.function_call_arguments.done",item_id:T.call_id||T.id,output_index:x,arguments:T.arguments||""})),T.status="completed",y.enqueue(b("response.output_item.done",{type:"response.output_item.done",output_index:x,item:T}))}for(let T of m)if(T.type==="message"){let x=m.indexOf(T);T.status="completed",y.enqueue(b("response.output_item.done",{type:"response.output_item.done",output_index:x,item:T}))}y.enqueue(b("response.completed",{type:"response.completed",response:{id:a,object:"response",created_at:Math.floor(Date.now()/1e3),status:"completed",model:S?.model||s,output:m.slice(),usage:S?.usage?{...this.buildResponsesUsage(S.usage)}:this.buildResponsesUsage()}}))}};for(;;){let{done:S,value:T}=await g.read();if(S)break;_+=r.decode(T,{stream:!0});let x=_.split(`
104
104
  `);_=x.pop()||"";for(let $ of x){let G=$.trim();if(!G||G.startsWith("event:")||!G.startsWith("data:"))continue;let F=G.slice(5).trim();if(F==="[DONE]"){w({}),y.enqueue(o.encode(`data: [DONE]
105
105
 
106
106
  `));continue}let X;try{X=JSON.parse(F)}catch{continue}l||(l=!0,y.enqueue(b("response.created",{type:"response.created",response:C("in_progress")})),y.enqueue(b("response.in_progress",{type:"response.in_progress",response:C("in_progress")})));let H=X.choices?.[0];if(!H)continue;let K=H.delta;if(K?.content){if(!d){d=!0;let Y=c++,te={id:`${a}_msg`,type:"message",status:"in_progress",role:"assistant",content:[]};m.push(te),y.enqueue(b("response.output_item.added",{type:"response.output_item.added",output_index:Y,item:te}))}y.enqueue(b("response.output_text.delta",{type:"response.output_text.delta",item_id:`${a}_msg`,output_index:c-1,content_index:0,delta:K.content}))}if(Array.isArray(K?.tool_calls))for(let Y of K.tool_calls){if(Y.id){f=Y.id,p=c++;let te={id:Y.id,type:"function_call",status:"in_progress",call_id:Y.id,name:Y.function?.name||"",arguments:""};m.push(te),y.enqueue(b("response.output_item.added",{type:"response.output_item.added",output_index:p,item:te}))}if(Y.function?.arguments){y.enqueue(b("response.function_call_arguments.delta",{type:"response.function_call_arguments.delta",item_id:f,output_index:p,delta:Y.function.arguments}));let te=m.find(de=>de.call_id===f);te&&(te.arguments+=Y.function.arguments)}}H.finish_reason&&w(X)}}k||w({}),y.close()}catch(g){y.error(g)}}})}convertAnthropicStreamToResponsesAPI(e,n){let r=new TextDecoder,o=new TextEncoder,s=n?.provider?.models?.[0]||"gpt-5.4",a=`resp_${Date.now()}`,c="",l="",d=-1,f="",p="",m="",b=-1,C="",y="",g=-1,_=0,k=!1,w=!1,S=!1,T=!1,x=null,$=[],G=(te,de)=>o.encode(`event: ${te}
107
107
  data: ${JSON.stringify(de)}
108
108
 
109
- `),F=(te,de=[])=>({id:a,object:"response",created_at:Math.floor(Date.now()/1e3),status:te,model:s,output:de,usage:{input_tokens:0,output_tokens:0,total_tokens:0,output_tokens_details:{reasoning_tokens:0}}}),X=()=>{k||(k=!0,Y.enqueue(G("response.created",{type:"response.created",response:F("in_progress")})),Y.enqueue(G("response.in_progress",{type:"response.in_progress",response:F("in_progress")})))},H=(te,de)=>{Y.enqueue(G("response.output_item.done",{type:"response.output_item.done",output_index:te,item:{...de,status:"completed"}}))},K=te=>{if(!T){if(T=!0,w){let de=$.find(ae=>ae.type==="message");de&&(de.content=[{type:"output_text",text:c}],de.status="completed")}for(let de of $)de.type==="function_call"&&(de.status="completed");return G("response.completed",{type:"response.completed",response:{id:a,object:"response",created_at:Math.floor(Date.now()/1e3),status:"completed",model:s,output:$,usage:te?{input_tokens:te.input_tokens||0,output_tokens:te.output_tokens||0,total_tokens:(te.input_tokens||0)+(te.output_tokens||0)}:{input_tokens:0,output_tokens:0,total_tokens:0}}})}},Y;return new ReadableStream({async start(te){Y=te;try{let de=e.getReader(),ae="";for(;;){let{done:J,value:Z}=await de.read();if(J)break;ae+=r.decode(Z,{stream:!0});let se=ae.split(`
109
+ `),F=(te,de=[])=>({id:a,object:"response",created_at:Math.floor(Date.now()/1e3),status:te,model:s,output:de,usage:this.buildResponsesUsage()}),X=()=>{k||(k=!0,Y.enqueue(G("response.created",{type:"response.created",response:F("in_progress")})),Y.enqueue(G("response.in_progress",{type:"response.in_progress",response:F("in_progress")})))},H=(te,de)=>{Y.enqueue(G("response.output_item.done",{type:"response.output_item.done",output_index:te,item:{...de,status:"completed"}}))},K=te=>{if(!T){if(T=!0,w){let de=$.find(ae=>ae.type==="message");de&&(de.content=[{type:"output_text",text:c}],de.status="completed")}for(let de of $)de.type==="function_call"&&(de.status="completed");return G("response.completed",{type:"response.completed",response:{id:a,object:"response",created_at:Math.floor(Date.now()/1e3),status:"completed",model:s,output:$,usage:te?{...this.buildResponsesUsage(te)}:this.buildResponsesUsage()}})}},Y;return new ReadableStream({async start(te){Y=te;try{let de=e.getReader(),ae="";for(;;){let{done:J,value:Z}=await de.read();if(J)break;ae+=r.decode(Z,{stream:!0});let se=ae.split(`
110
110
  `);ae=se.pop()||"";for(let Ue of se){let Ae=Ue.trim();if(!Ae||Ae.startsWith("event:")||!Ae.startsWith("data:"))continue;let V=Ae.slice(5).trim();if(V==="[DONE]")continue;let ue;try{ue=JSON.parse(V)}catch{continue}if(ue.type==="message_start"&&(a=ue.message?.id||a,X()),ue.type==="content_block_start"){let ee=ue.content_block;if(x=ee?.type||null,ee?.type==="tool_use"){f=ee.id||"",p=ee.name||"",m="",b=_++;let Te={id:f,type:"function_call",status:"in_progress",call_id:f,name:p,arguments:""};$.push(Te),Y.enqueue(G("response.output_item.added",{type:"response.output_item.added",output_index:b,item:Te}))}if(ee?.type==="thinking"&&(C=ee.thinking||"",!S)){S=!0,g=_++,y=`rs_${a}`;let Te={id:y,type:"reasoning",status:"in_progress",summary:[]};$.push(Te),Y.enqueue(G("response.output_item.added",{type:"response.output_item.added",output_index:g,item:Te}))}if(ee?.type==="text"&&(c=ee?.text||"",!w)){w=!0,d=_++,l=`${a}_msg`;let Te={id:l,type:"message",status:"in_progress",role:"assistant",content:[]};$.push(Te),Y.enqueue(G("response.output_item.added",{type:"response.output_item.added",output_index:d,item:Te}))}}if(ue.type==="content_block_delta"){let ee=ue.delta;if(ee?.type==="text_delta"){if(!w){w=!0,d=_++,l=`${a}_msg`;let Te={id:l,type:"message",status:"in_progress",role:"assistant",content:[]};$.push(Te),Y.enqueue(G("response.output_item.added",{type:"response.output_item.added",output_index:d,item:Te}))}c+=ee.text||"",Y.enqueue(G("response.output_text.delta",{type:"response.output_text.delta",item_id:l,output_index:d,content_index:0,delta:ee.text||""}))}ee?.type==="thinking_delta"&&(C+=ee.thinking||"",Y.enqueue(G("response.reasoning_summary_text.delta",{type:"response.reasoning_summary_text.delta",item_id:y||`rs_${a}`,output_index:g>=0?g:0,summary_index:0,delta:ee.thinking||""}))),ee?.type==="input_json_delta"&&(m+=ee.partial_json||"",Y.enqueue(G("response.function_call_arguments.delta",{type:"response.function_call_arguments.delta",item_id:f||"call_0",output_index:b>=0?b:0,delta:ee.partial_json||""})))}if(ue.type==="content_block_stop"){if(x==="tool_use"&&f){Y.enqueue(G("response.function_call_arguments.done",{type:"response.function_call_arguments.done",item_id:f,output_index:b,arguments:m}));let ee=$.find(Te=>Te.call_id===f);ee&&(ee.arguments=m,ee.status="completed"),ee&&H(b,ee)}if(x==="text"&&w){Y.enqueue(G("response.output_text.done",{type:"response.output_text.done",item_id:l,output_index:d,content_index:0,text:c}));let ee=$.find(Te=>Te.type==="message");ee&&(ee.content=[{type:"output_text",text:c}],H(d,ee))}if(x==="thinking"&&S){let ee=$.find(Te=>Te.type==="reasoning");ee&&(ee.summary=[{type:"summary_text",text:C}],H(g,ee))}x=null}if(ue.type==="message_delta"){let ee=K(ue.usage);ee&&Y.enqueue(ee)}if(ue.type==="message_stop"){let ee=K();ee&&Y.enqueue(ee),Y.enqueue(o.encode(`data: [DONE]
111
111
 
112
- `))}}}X();let me=K();me&&Y.enqueue(me),ae="",Y.close()}catch(de){Y.error(de)}}})}wrapChatInResponses(e){let n=e?.choices?.[0],r=[],o=[];if(n?.message?.content&&o.push({type:"output_text",text:n.message.content}),r.push({type:"message",role:"assistant",content:o}),Array.isArray(n?.message?.tool_calls))for(let s of n.message.tool_calls)r.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:r,usage:e.usage?{input_tokens:e.usage.prompt_tokens||0,output_tokens:e.usage.completion_tokens||0,total_tokens:e.usage.total_tokens||0}:void 0}}convertResponseToChat(e){let n=e.output?.find(d=>d.type==="message"),r=e.output?.find(d=>d.type==="function_call"),o;n?.content?.length&&n?.content[0].annotations&&(o=n.content[0].annotations.map(d=>({type:"url_citation",url_citation:{url:d.url||"",title:d.title||"",content:"",start_index:d.start_index||0,end_index:d.end_index||0}}))),this.logger.debug({data:o,type:"url_citation"});let s=null,a=null,c=null;if(n&&n.reasoning&&(c={content:n.reasoning}),n&&n.content){let d=[],f=[];if(n.content.forEach(p=>{if(p.type==="output_text")d.push(p.text||"");else if(p.type==="output_image"){let m=this.buildImageContent({url:p.image_url,mime_type:p.mime_type});m&&f.push(m)}else if(p.type==="output_image_base64"){let m=this.buildImageContent({b64_json:p.image_base64,mime_type:p.mime_type});m&&f.push(m)}}),f.length>0){let p=[];d.length>0&&p.push({type:"text",text:d.join("")}),p.push(...f),s=p}else s=d.join("")}return r&&(a=[{id:r.call_id||r.id,function:{name:r.name,arguments:r.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:c,annotations:o},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}: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}};import{get_encoding as HC}from"tiktoken";var Xu=class{capacity;cache;constructor(e){this.capacity=e,this.cache=new Map}get(e){if(!this.cache.has(e))return;let n=this.cache.get(e);return this.cache.delete(e),this.cache.set(e,n),n}put(e,n){if(this.cache.has(e))this.cache.delete(e);else if(this.cache.size>=this.capacity){let r=this.cache.keys().next().value;r!==void 0&&this.cache.delete(r)}this.cache.set(e,n)}values(){return Array.from(this.cache.values())}},Zu=new Xu(100);$n();import{readFile as ic}from"fs/promises";import{opendir as zC,stat as WC}from"fs/promises";import{join as ac}from"path";import{CLAUDE_PROJECTS_DIR as ep,HOME_DIR as tp}from"@wengine-ai/claude-code-router-shared";import{existsSync as Xh,mkdirSync as BC,readFileSync as MC,writeFileSync as LC}from"fs";import{join as Zh}from"path";import{HOME_DIR as jC}from"@wengine-ai/claude-code-router-shared";var ec=Zh(jC,"runtime"),tc=Zh(ec,"quota-store.json"),Lr=new Map,Yh=!1,UC=null;function nc(t,e){t&&Lr.set(t,{...e,provider:t,capturedAt:Date.now()})}function rc(t){let e=Lr.get(t);return e?{...e}:void 0}function $C(){return Array.from(Lr.values()).map(t=>({...t}))}function qC(){try{if(!Xh(tc))return;let t=JSON.parse(MC(tc,"utf-8"));if(!Array.isArray(t))return;let e=Date.now();for(let n of t)if(n&&n.provider){if(n.capturedAt&&e-n.capturedAt>1440*60*1e3)continue;Lr.set(n.provider,n)}}catch{}}function Qh(){try{if(Lr.size===0)return;Xh(ec)||BC(ec,{recursive:!0}),LC(tc,JSON.stringify(Array.from(Lr.values()),null,2),"utf-8")}catch{}}function oc(){Yh||(Yh=!0,qC(),UC=setInterval(Qh,6e4),process.on("exit",Qh))}ei();var wn=HC("cl100k_base"),op=(t,e,n)=>{let r=0;return Array.isArray(t)&&t.forEach(o=>{typeof o.content=="string"?r+=wn.encode(o.content).length:Array.isArray(o.content)&&o.content.forEach(s=>{s.type==="text"?r+=wn.encode(s.text).length:s.type==="tool_use"?r+=wn.encode(JSON.stringify(s.input)).length:s.type==="tool_result"&&(r+=wn.encode(typeof s.content=="string"?s.content:JSON.stringify(s.content)).length)})}),typeof e=="string"?r+=wn.encode(e).length:Array.isArray(e)&&e.forEach(o=>{o.type==="text"&&(typeof o.text=="string"?r+=wn.encode(o.text).length:Array.isArray(o.text)&&o.text.forEach(s=>{r+=wn.encode(s||"").length}))}),n&&n.forEach(o=>{o.description&&(r+=wn.encode(o.name+o.description).length),o.input_schema&&(r+=wn.encode(JSON.stringify(o.input_schema)).length)}),r},sp=async(t,e)=>{if(t.sessionId){let n=await up(t.sessionId);if(n){let r=ac(tp,n,"config.json"),o=ac(tp,n,`${t.sessionId}.json`);try{let s=JSON.parse(await ic(o,"utf8"));if(s&&s.Router)return s.Router}catch{}try{let s=JSON.parse(await ic(r,"utf8"));if(s&&s.Router)return s.Router}catch{}}}};function ni(t){let e=t||"";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 ip(t){let e=ni(t),n=e.includes("[1m]")||e.endsWith("[1m"),r=e.replace(/\[1m\]|\[1m$/g,""),o=r.match(/^ccr-(opus|sonnet|haiku)$/i);if(o)return{family:o[1].toLowerCase(),extended:n};let s=r.match(/claude-(?:\d+-\d+-|\d+-)?(sonnet|opus|haiku)(?:-|$)/i)||r.match(/claude-(sonnet|opus|haiku)(?:-|$)/i);return s?{family:s[1].toLowerCase(),extended:n}:{family:null,extended:n}}function GC(t,e){if(!e||!t)return null;let n=ni(t);if(e[t])return e[t];if(e[n])return e[n];let{family:r}=ip(t);if(r&&e[r])return e[r];for(let[o,s]of Object.entries(e)){let a=ni(o);if(a&&n.includes(a))return s}return null}function ap(t){return t?(t.input_tokens||0)+(t.cache_read_input_tokens||0)+(t.cache_creation_input_tokens||0):0}function np(t){if(!t?.includes(","))return null;let[e,...n]=t.split(","),r=e.trim(),o=n.join(",").trim();return!r||!o?null:{providerName:r,routeModel:o}}function ot(t,e,n,r,o){let s=np(t);if(!s)return t;let{providerName:a,routeModel:c}=s,l=e.find(p=>p.name.toLowerCase()===a.toLowerCase());if(l&&l.enabled===!1)return null;if(o===!0&&r&&!n){let p=Oo(),m=p.getPromotion(a,c,r,e);if(m){let b=np(m);if(b){let C=e.find(g=>g.name.toLowerCase()===b.providerName.toLowerCase()),y=C?.models?.find(g=>String(g).toLowerCase()===b.routeModel.toLowerCase());if(C&&y)return`${C.name},${y}`}p.clear(a,c,r)}}if(!n&&!Ye().isAvailable(a,c))return null;let d=rc(a);if(d){let p=d.limitDaily!==void 0&&d.usedDailyBalance!==void 0&&d.usedDailyBalance>=d.limitDaily,m=d.totalBalance!==void 0&&d.usedBalance!==void 0&&d.usedBalance>=d.totalBalance;if(p||m)return null}let f=l?.models?.find(p=>String(p).toLowerCase()===c.toLowerCase());return l&&f?`${l.name},${f}`:t}function jt(t,e,n,r,o){let s=Ye(),a=[n?.[t],r?.[t]];for(let c of a)if(!(!Array.isArray(c)||c.length===0))for(let l of c){let d=ot(l,e);if(d)return d}return null}function JC(t){return t.body.messages?.some(e=>e.role==="user"&&Array.isArray(e.content)&&e.content.some(n=>n.type==="image"||n.type==="image_url"||Array.isArray(n?.content)&&n.content.some(r=>r.type==="image"||r.type==="image_url")))}function VC(t){let e=ni(t);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(r=>r.test(e))}function KC(t,e,n,r,o,s,a,c){let l=n.longContextThreshold||6e4,d=Math.max(e,ap(o)),f=t.modelFamily;if((s||d>2e5)&&n.extendedContext){let C=ot(n.extendedContext,r,!1,"extendedContext",c);if(C)return t.log.info(`Family: using extended context model (1M+), tokens: ${d}, estimated: ${e}, explicit: ${s}`),{model:C,scenarioType:"extendedContext",isFallback:!1};let y=c?jt("extendedContext",r,n.fallback,a,f):null;if(y)return t.log.info(`Family: using extended context fallback model (1M+), tokens: ${d}, estimated: ${e}, explicit: ${s}`),{model:y,scenarioType:"extendedContext",isFallback:!0};t.log.warn("Family: extendedContext model unavailable (fail pool), skipping")}if(d>l&&(n.longContext||n.fallback?.longContext?.length||a?.longContext?.length)){let C=n.longContext?ot(n.longContext,r,!1,"longContext",c):null;if(C)return t.log.info(`Family: using long context model, tokens: ${d}, estimated: ${e}`),{model:C,scenarioType:"longContext",isFallback:!1};let y=c?jt("longContext",r,n.fallback,a,f):null;if(y)return t.log.info(`Family: using long context fallback model, tokens: ${d}, estimated: ${e}`),{model:y,scenarioType:"longContext",isFallback:!0};t.log.warn("Family: no healthy longContext model available, falling through to other scenarios")}if(Array.isArray(t.body.tools)&&t.body.tools.some(C=>C.type?.startsWith("web_search"))&&n.webSearch){let C=ot(n.webSearch,r,!1,"webSearch",c);if(C)return{model:C,scenarioType:"webSearch",isFallback:!1};let y=c?jt("webSearch",r,n.fallback,a,f):null;if(y)return t.log.info("Family: using webSearch fallback model"),{model:y,scenarioType:"webSearch",isFallback:!0};t.log.warn("Family: webSearch model unavailable (fail pool), skipping")}if(t.body.thinking&&n.think){let C=ot(n.think,r,!1,"think",c);if(C)return{model:C,scenarioType:"think",isFallback:!1};let y=c?jt("think",r,n.fallback,a,f):null;if(y)return t.log.info("Family: using think fallback model"),{model:y,scenarioType:"think",isFallback:!0};t.log.warn("Family: think model unavailable (fail pool), skipping")}if(n.default){let C=ot(n.default,r,!1,"default",c);if(C)return{model:C,scenarioType:"default",isFallback:!1};let y=c?jt("default",r,n.fallback,a,f):null;if(y)return t.log.info("Family: using default fallback model"),{model:y,scenarioType:"default",isFallback:!0};t.log.warn("Family: default model unavailable (fail pool), skipping")}return null}var YC=async(t,e,n,r)=>{let o=await sp(t,n),s=n.get("providers")||[],a=o||n.get("Router"),c=a?.enableFallback===!0,l=c?n.get("fallback"):void 0;if(t.body.model.includes(",")){let k=ot(t.body.model,s,!1,"default",c);if(k)return{model:k,scenarioType:"default"};t.log.warn(`Explicit model ${t.body.model} unavailable (fail pool), trying fallback`);let w=c?jt("default",s,void 0,l):null;if(w)return t.log.info(`Using fallback for explicit model: ${w}`),{model:w,scenarioType:"default"};t.log.warn(`No fallback available for explicit model ${t.body.model}, continuing through routing logic`)}let{family:d,extended:f}=ip(t.body.model),p=a?.families?.[d||""];if(p&&a?.enableFamilyRouting){t.log.info(`Using model family routing for: ${d}${f?" (1M)":""}`),t.modelFamily=d,t.familyFallback=p.fallback;let k=KC(t,e,p,s,r,f,l,c);if(k)return{model:k.model,scenarioType:k.scenarioType}}let m=GC(t.body.model,a?.models);if(m){let k=ot(m,s,!1,"modelMapping",c);if(k)return t.log.info(`Using mapped model for ${t.body.model}: ${m}`),{model:k,scenarioType:"modelMapping"};t.log.warn(`Mapped model ${m} unavailable (fail pool), skipping`)}let b=Math.max(e,ap(r)),C=a?.extendedContextThreshold||2e5;if(b>C&&a?.extendedContext){t.log.info(`Using extended context (1M) model due to token count: ${b}, estimated: ${e}, threshold: ${C}`);let k=ot(a.extendedContext,s,!1,"extendedContext",c);if(k)return{model:k,scenarioType:"extendedContext"};t.log.warn(`Extended context model ${a.extendedContext} unavailable (fail pool), trying fallback`);let w=c?jt("extendedContext",s,void 0,l):null;if(w)return{model:w,scenarioType:"extendedContext"}}let y=a?.longContextThreshold||6e4;if(b>y&&a?.longContext){t.log.info(`Using long context model due to token count: ${b}, estimated: ${e}, threshold: ${y}`);let k=ot(a.longContext,s,!1,"longContext",c);if(k)return{model:k,scenarioType:"longContext"};t.log.warn(`Long context model ${a.longContext} unavailable (fail pool), trying fallback`);let w=c?jt("longContext",s,void 0,l):null;if(w)return{model:w,scenarioType:"longContext"}}if(t.body?.system?.length>1&&t.body?.system[1]?.text?.startsWith("<CCR-SUBAGENT-MODEL>")){let k=t.body?.system[1].text.match(/<CCR-SUBAGENT-MODEL>(.*?)<\/CCR-SUBAGENT-MODEL>/s);if(k)return t.body.system[1].text=t.body.system[1].text.replace(`<CCR-SUBAGENT-MODEL>${k[1]}</CCR-SUBAGENT-MODEL>`,""),{model:k[1],scenarioType:"default"}}let _=n.get("Router");if(t.body.model?.includes("claude")&&t.body.model?.includes("haiku")&&_?.background){t.log.info(`Using background model for ${t.body.model}`);let k=ot(_.background,s,!1,"background",c);if(k)return{model:k,scenarioType:"background"};t.log.warn(`Background model ${_.background} unavailable (fail pool), falling through`)}if(Array.isArray(t.body.tools)&&t.body.tools.some(k=>k.type?.startsWith("web_search"))&&a?.webSearch){let k=ot(a.webSearch,s,!1,"webSearch",c);if(k)return{model:k,scenarioType:"webSearch"};t.log.warn(`WebSearch model ${a.webSearch} unavailable (fail pool), trying fallback`);let w=c?jt("webSearch",s,void 0,l):null;if(w)return{model:w,scenarioType:"webSearch"}}if(t.body.thinking&&a?.think){t.log.info(`Using think model for ${t.body.thinking}`);let k=ot(a.think,s,!1,"think",c);if(k)return{model:k,scenarioType:"think"};t.log.warn(`Think model ${a.think} unavailable (fail pool), trying fallback`);let w=c?jt("think",s,void 0,l):null;if(w)return{model:w,scenarioType:"think"}}if(a?.default){let k=ot(a.default,s,!1,"default",c);if(k)return{model:k,scenarioType:"default"};t.log.warn(`Default model ${a.default} unavailable (fail pool), trying fallback`);let w=c?jt("default",s,void 0,l):null;if(w)return{model:w,scenarioType:"default"}}return{model:void 0,scenarioType:"default"}},Fo=async(t,e,n)=>{let{configService:r,event:o}=n;if(t.originalModel=t.body.model,t.body.metadata?.user_id){let C=t.body.metadata.user_id.split("_session_");C.length>1&&(t.sessionId=C[1])}let a=await sp(t,r)||r.get("Router"),c=a?.enableFallback===!0,l=r.get("providers")||[],d=Zu.get(t.sessionId),{messages:f,system:p=[],tools:m}=t.body,b=r.get("REWRITE_SYSTEM_PROMPT");if(b&&p.length>1&&p[1]?.text?.includes("<env>")){let C=await ic(b,"utf-8");p[1].text=`${C}<env>${p[1].text.split("<env>").pop()}`}try{let[C,y]=t.body.model.split(","),g=n.tokenizerService?.getTokenizerConfigForModel(C,y),_;n.tokenizerService?_=(await n.tokenizerService.countTokens({messages:f,system:p,tools:m},g)).tokenCount:_=op(f,p,m),t.tokenCount=_;let k,w=r.get("CUSTOM_ROUTER_PATH");if(w)try{k=await re(w)(t,r.getAll(),{event:o})}catch(S){t.log.error(`failed to load custom router: ${S.message}`)}if(k)t.scenarioType="default";else{let S=await YC(t,_,r,d);k=S.model,t.scenarioType=S.scenarioType}if(a?.image&&k!==a.image&&JC(t)&&!VC(k)){let S=ot(a.image,l,!1,"image",c);S?(t.log.info(`Using image model fallback for ${k}`),k=S,t.scenarioType="image"):(t.log.warn(`Image model ${a.image} unavailable (fail pool), keeping ${k}`),t.scenarioType="image")}t.body.model=k}catch(C){t.log.error(`Error in router middleware: ${C.message}`),t.body.model=a?.default,t.scenarioType="default"}},En=new Map,rp=1e3;function sc(){if(En.size<=rp)return;let t=[...En.keys()].slice(0,En.size-rp);for(let e of t)En.delete(e)}var up=async t=>{if(En.has(t)){let e=En.get(t);return!e||e===""?null:e}try{let e=await zC(ep),n=[];for await(let s of e)s.isDirectory()&&n.push(s.name);let r=n.map(async s=>{let a=ac(ep,s,`${t}.jsonl`);try{return(await WC(a)).isFile()?s:null}catch{return null}}),o=await Promise.all(r);for(let s of o)if(s)return En.set(t,s),sc(),s;return En.set(t,""),sc(),null}catch(e){return console.error("Error searching for project by session:",e),En.set(t,""),sc(),null}};var QC=/^ccr-(opus|sonnet|haiku)(\[1m\])?$/i;function cp(t){let e=[],n=Array.isArray(t.input)?t.input:[t.input];for(let r of n)if(r.type==="function_call")e.push({role:"assistant",tool_calls:[{id:r.call_id,type:"function",function:{name:r.name,arguments:r.arguments||"{}"}}]});else if(r.type==="function_call_output")e.push({role:"tool",tool_call_id:r.call_id,content:typeof r.output=="string"?r.output:JSON.stringify(r.output)});else if(r.role){let o=r.content;Array.isArray(o)&&(o=o.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:r.role,content:o})}t.messages=e,delete t.input,t.instructions&&typeof t.instructions=="string"&&(t.system=t.instructions,delete t.instructions),Array.isArray(t.tools)&&(t.tools=t.tools.filter(r=>r&&typeof r=="object").map(r=>r.type==="function"&&r.name&&!r.function?{type:"function",function:{name:r.name,description:r.description||"",parameters:r.parameters||{type:"object",properties:{}}}}:r.function?.name?r:r.type==="web_search"?{type:"function",function:{name:"web_search",description:"Search the web",parameters:{type:"object",properties:{query:{type:"string"}}}}}:null).filter(Boolean)),t.reasoning&&typeof t.reasoning=="object"&&(t.reasoning={enabled:!0,effort:t.reasoning.effort})}async function XC(t,e,n,r){let o=t.body;r.endPoint==="/v1/responses"&&o?.input&&!o?.messages&&cp(o),r.endPoint==="/v1/responses"&&!t.provider&&typeof o?.model=="string"&&QC.test(o.model)&&await Fo(t,e,{configService:n.configService,tokenizerService:n.tokenizerService});let s=t.provider;if(!s&&o?.model){let d=o.model.split(",");d.length>1&&(s=d[0],o.model=d.slice(1).join(","))}let a=s?n.providerService.getProvider(s):void 0;if(!a&&o?.model){let d=n.providerService.resolveModelRoute(o.model);d&&(a=d.provider,o.model=d.targetModel)}if(!a&&o?.model){let f=n.configService.get("Router")?.default;if(f&&f.includes(",")){let[p,...m]=f.split(","),b=n.providerService.getProvider(p);b&&(a=b,o.model=m.join(","))}}if(t.originalModel||(t.originalModel=o?.model),!a)throw ze(`Provider '${s}' not found`,404,"provider_not_found");t.provider=a.name||s;let c=tw(t),l=r.endPoint==="/v1/messages"&&c;c&&e.header("X-Codex-Detected","true"),l&&e.header("X-Codex-On-Messages","true"),t.isCodexOnMessagesEndpoint=l,t.codexDetected=c;try{r.endPoint==="/v1/responses"&&o.input&&!o.messages&&cp(o);let{requestBody:d,config:f,bypass:p}=await lp(o,a,r,t.headers,{req:t});if(d?.messages&&!p&&!t.isTargetAnthropic){let y=d.messages,g=new Set,_=[],k=[];for(let w of y){if(w?.role!=="system"){k.push(w);continue}let S=JSON.stringify(w.content??"");g.has(S)||(g.add(S),_.push(w))}_.length>0&&k.length>0&&(d.messages=[...k,..._])}let m=await dp(d,f,a,n,p,r,{req:t});try{a?.baseUrl&&m?.headers&&Po(s,a.baseUrl,m.headers)}catch{}let b=await fp(d,m,a,r,p,{req:t,isCodexOnMessagesEndpoint:l});if(o.stream&&b?.body){let y=b.body.getReader(),g=await y.read();if(g.done)throw y.releaseLock(),ze(`Provider returned empty streaming response from ${s}`,400,"provider_response_error");let _=new TextDecoder().decode(g.value);if(_.includes("event: error")){y.releaseLock();let S=_.length<500?_:_.slice(0,500);throw ze(`Provider ${s} returned error in SSE stream: ${S}`,400,"provider_response_error")}if(_.split(`
112
+ `))}}}X();let me=K();me&&Y.enqueue(me),ae="",Y.close()}catch(de){Y.error(de)}}})}wrapChatInResponses(e){let n=e?.choices?.[0],r=[],o=[];if(n?.message?.content&&o.push({type:"output_text",text:n.message.content}),r.push({type:"message",role:"assistant",content:o}),Array.isArray(n?.message?.tool_calls))for(let s of n.message.tool_calls)r.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:r,usage:e.usage?{...this.buildResponsesUsage(e.usage)}:void 0}}convertResponseToChat(e){let n=e.output?.find(d=>d.type==="message"),r=e.output?.find(d=>d.type==="function_call"),o;n?.content?.length&&n?.content[0].annotations&&(o=n.content[0].annotations.map(d=>({type:"url_citation",url_citation:{url:d.url||"",title:d.title||"",content:"",start_index:d.start_index||0,end_index:d.end_index||0}}))),this.logger.debug({data:o,type:"url_citation"});let s=null,a=null,c=null;if(n&&n.reasoning&&(c={content:n.reasoning}),n&&n.content){let d=[],f=[];if(n.content.forEach(p=>{if(p.type==="output_text")d.push(p.text||"");else if(p.type==="output_image"){let m=this.buildImageContent({url:p.image_url,mime_type:p.mime_type});m&&f.push(m)}else if(p.type==="output_image_base64"){let m=this.buildImageContent({b64_json:p.image_base64,mime_type:p.mime_type});m&&f.push(m)}}),f.length>0){let p=[];d.length>0&&p.push({type:"text",text:d.join("")}),p.push(...f),s=p}else s=d.join("")}return r&&(a=[{id:r.call_id||r.id,function:{name:r.name,arguments:r.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:c,annotations:o},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}};import{get_encoding as HC}from"tiktoken";var Xu=class{capacity;cache;constructor(e){this.capacity=e,this.cache=new Map}get(e){if(!this.cache.has(e))return;let n=this.cache.get(e);return this.cache.delete(e),this.cache.set(e,n),n}put(e,n){if(this.cache.has(e))this.cache.delete(e);else if(this.cache.size>=this.capacity){let r=this.cache.keys().next().value;r!==void 0&&this.cache.delete(r)}this.cache.set(e,n)}values(){return Array.from(this.cache.values())}},Zu=new Xu(100);$n();import{readFile as ic}from"fs/promises";import{opendir as zC,stat as WC}from"fs/promises";import{join as ac}from"path";import{CLAUDE_PROJECTS_DIR as ep,HOME_DIR as tp}from"@wengine-ai/claude-code-router-shared";import{existsSync as Xh,mkdirSync as BC,readFileSync as MC,writeFileSync as LC}from"fs";import{join as Zh}from"path";import{HOME_DIR as jC}from"@wengine-ai/claude-code-router-shared";var ec=Zh(jC,"runtime"),tc=Zh(ec,"quota-store.json"),Lr=new Map,Yh=!1,UC=null;function nc(t,e){t&&Lr.set(t,{...e,provider:t,capturedAt:Date.now()})}function rc(t){let e=Lr.get(t);return e?{...e}:void 0}function $C(){return Array.from(Lr.values()).map(t=>({...t}))}function qC(){try{if(!Xh(tc))return;let t=JSON.parse(MC(tc,"utf-8"));if(!Array.isArray(t))return;let e=Date.now();for(let n of t)if(n&&n.provider){if(n.capturedAt&&e-n.capturedAt>1440*60*1e3)continue;Lr.set(n.provider,n)}}catch{}}function Qh(){try{if(Lr.size===0)return;Xh(ec)||BC(ec,{recursive:!0}),LC(tc,JSON.stringify(Array.from(Lr.values()),null,2),"utf-8")}catch{}}function oc(){Yh||(Yh=!0,qC(),UC=setInterval(Qh,6e4),process.on("exit",Qh))}ei();var wn=HC("cl100k_base"),op=(t,e,n)=>{let r=0;return Array.isArray(t)&&t.forEach(o=>{typeof o.content=="string"?r+=wn.encode(o.content).length:Array.isArray(o.content)&&o.content.forEach(s=>{s.type==="text"?r+=wn.encode(s.text).length:s.type==="tool_use"?r+=wn.encode(JSON.stringify(s.input)).length:s.type==="tool_result"&&(r+=wn.encode(typeof s.content=="string"?s.content:JSON.stringify(s.content)).length)})}),typeof e=="string"?r+=wn.encode(e).length:Array.isArray(e)&&e.forEach(o=>{o.type==="text"&&(typeof o.text=="string"?r+=wn.encode(o.text).length:Array.isArray(o.text)&&o.text.forEach(s=>{r+=wn.encode(s||"").length}))}),n&&n.forEach(o=>{o.description&&(r+=wn.encode(o.name+o.description).length),o.input_schema&&(r+=wn.encode(JSON.stringify(o.input_schema)).length)}),r},sp=async(t,e)=>{if(t.sessionId){let n=await up(t.sessionId);if(n){let r=ac(tp,n,"config.json"),o=ac(tp,n,`${t.sessionId}.json`);try{let s=JSON.parse(await ic(o,"utf8"));if(s&&s.Router)return s.Router}catch{}try{let s=JSON.parse(await ic(r,"utf8"));if(s&&s.Router)return s.Router}catch{}}}};function ni(t){let e=t||"";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 ip(t){let e=ni(t),n=e.includes("[1m]")||e.endsWith("[1m"),r=e.replace(/\[1m\]|\[1m$/g,""),o=r.match(/^ccr-(opus|sonnet|haiku)$/i);if(o)return{family:o[1].toLowerCase(),extended:n};let s=r.match(/claude-(?:\d+-\d+-|\d+-)?(sonnet|opus|haiku)(?:-|$)/i)||r.match(/claude-(sonnet|opus|haiku)(?:-|$)/i);return s?{family:s[1].toLowerCase(),extended:n}:{family:null,extended:n}}function GC(t,e){if(!e||!t)return null;let n=ni(t);if(e[t])return e[t];if(e[n])return e[n];let{family:r}=ip(t);if(r&&e[r])return e[r];for(let[o,s]of Object.entries(e)){let a=ni(o);if(a&&n.includes(a))return s}return null}function ap(t){return t?(t.input_tokens||0)+(t.cache_read_input_tokens||0)+(t.cache_creation_input_tokens||0):0}function np(t){if(!t?.includes(","))return null;let[e,...n]=t.split(","),r=e.trim(),o=n.join(",").trim();return!r||!o?null:{providerName:r,routeModel:o}}function ot(t,e,n,r,o){let s=np(t);if(!s)return t;let{providerName:a,routeModel:c}=s,l=e.find(p=>p.name.toLowerCase()===a.toLowerCase());if(l&&l.enabled===!1)return null;if(o===!0&&r&&!n){let p=Oo(),m=p.getPromotion(a,c,r,e);if(m){let b=np(m);if(b){let C=e.find(g=>g.name.toLowerCase()===b.providerName.toLowerCase()),y=C?.models?.find(g=>String(g).toLowerCase()===b.routeModel.toLowerCase());if(C&&y)return`${C.name},${y}`}p.clear(a,c,r)}}if(!n&&!Ye().isAvailable(a,c))return null;let d=rc(a);if(d){let p=d.limitDaily!==void 0&&d.usedDailyBalance!==void 0&&d.usedDailyBalance>=d.limitDaily,m=d.totalBalance!==void 0&&d.usedBalance!==void 0&&d.usedBalance>=d.totalBalance;if(p||m)return null}let f=l?.models?.find(p=>String(p).toLowerCase()===c.toLowerCase());return l&&f?`${l.name},${f}`:t}function jt(t,e,n,r,o){let s=Ye(),a=[n?.[t],r?.[t]];for(let c of a)if(!(!Array.isArray(c)||c.length===0))for(let l of c){let d=ot(l,e);if(d)return d}return null}function JC(t){return t.body.messages?.some(e=>e.role==="user"&&Array.isArray(e.content)&&e.content.some(n=>n.type==="image"||n.type==="image_url"||Array.isArray(n?.content)&&n.content.some(r=>r.type==="image"||r.type==="image_url")))}function VC(t){let e=ni(t);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(r=>r.test(e))}function KC(t,e,n,r,o,s,a,c){let l=n.longContextThreshold||6e4,d=Math.max(e,ap(o)),f=t.modelFamily;if((s||d>2e5)&&n.extendedContext){let C=ot(n.extendedContext,r,!1,"extendedContext",c);if(C)return t.log.info(`Family: using extended context model (1M+), tokens: ${d}, estimated: ${e}, explicit: ${s}`),{model:C,scenarioType:"extendedContext",isFallback:!1};let y=c?jt("extendedContext",r,n.fallback,a,f):null;if(y)return t.log.info(`Family: using extended context fallback model (1M+), tokens: ${d}, estimated: ${e}, explicit: ${s}`),{model:y,scenarioType:"extendedContext",isFallback:!0};t.log.warn("Family: extendedContext model unavailable (fail pool), skipping")}if(d>l&&(n.longContext||n.fallback?.longContext?.length||a?.longContext?.length)){let C=n.longContext?ot(n.longContext,r,!1,"longContext",c):null;if(C)return t.log.info(`Family: using long context model, tokens: ${d}, estimated: ${e}`),{model:C,scenarioType:"longContext",isFallback:!1};let y=c?jt("longContext",r,n.fallback,a,f):null;if(y)return t.log.info(`Family: using long context fallback model, tokens: ${d}, estimated: ${e}`),{model:y,scenarioType:"longContext",isFallback:!0};t.log.warn("Family: no healthy longContext model available, falling through to other scenarios")}if(Array.isArray(t.body.tools)&&t.body.tools.some(C=>C.type?.startsWith("web_search"))&&n.webSearch){let C=ot(n.webSearch,r,!1,"webSearch",c);if(C)return{model:C,scenarioType:"webSearch",isFallback:!1};let y=c?jt("webSearch",r,n.fallback,a,f):null;if(y)return t.log.info("Family: using webSearch fallback model"),{model:y,scenarioType:"webSearch",isFallback:!0};t.log.warn("Family: webSearch model unavailable (fail pool), skipping")}if(t.body.thinking&&n.think){let C=ot(n.think,r,!1,"think",c);if(C)return{model:C,scenarioType:"think",isFallback:!1};let y=c?jt("think",r,n.fallback,a,f):null;if(y)return t.log.info("Family: using think fallback model"),{model:y,scenarioType:"think",isFallback:!0};t.log.warn("Family: think model unavailable (fail pool), skipping")}if(n.default){let C=ot(n.default,r,!1,"default",c);if(C)return{model:C,scenarioType:"default",isFallback:!1};let y=c?jt("default",r,n.fallback,a,f):null;if(y)return t.log.info("Family: using default fallback model"),{model:y,scenarioType:"default",isFallback:!0};t.log.warn("Family: default model unavailable (fail pool), skipping")}return null}var YC=async(t,e,n,r)=>{let o=await sp(t,n),s=n.get("providers")||[],a=o||n.get("Router"),c=a?.enableFallback===!0,l=c?n.get("fallback"):void 0;if(t.body.model.includes(",")){let k=ot(t.body.model,s,!1,"default",c);if(k)return{model:k,scenarioType:"default"};t.log.warn(`Explicit model ${t.body.model} unavailable (fail pool), trying fallback`);let w=c?jt("default",s,void 0,l):null;if(w)return t.log.info(`Using fallback for explicit model: ${w}`),{model:w,scenarioType:"default"};t.log.warn(`No fallback available for explicit model ${t.body.model}, continuing through routing logic`)}let{family:d,extended:f}=ip(t.body.model),p=a?.families?.[d||""];if(p&&a?.enableFamilyRouting){t.log.info(`Using model family routing for: ${d}${f?" (1M)":""}`),t.modelFamily=d,t.familyFallback=p.fallback;let k=KC(t,e,p,s,r,f,l,c);if(k)return{model:k.model,scenarioType:k.scenarioType}}let m=GC(t.body.model,a?.models);if(m){let k=ot(m,s,!1,"modelMapping",c);if(k)return t.log.info(`Using mapped model for ${t.body.model}: ${m}`),{model:k,scenarioType:"modelMapping"};t.log.warn(`Mapped model ${m} unavailable (fail pool), skipping`)}let b=Math.max(e,ap(r)),C=a?.extendedContextThreshold||2e5;if(b>C&&a?.extendedContext){t.log.info(`Using extended context (1M) model due to token count: ${b}, estimated: ${e}, threshold: ${C}`);let k=ot(a.extendedContext,s,!1,"extendedContext",c);if(k)return{model:k,scenarioType:"extendedContext"};t.log.warn(`Extended context model ${a.extendedContext} unavailable (fail pool), trying fallback`);let w=c?jt("extendedContext",s,void 0,l):null;if(w)return{model:w,scenarioType:"extendedContext"}}let y=a?.longContextThreshold||6e4;if(b>y&&a?.longContext){t.log.info(`Using long context model due to token count: ${b}, estimated: ${e}, threshold: ${y}`);let k=ot(a.longContext,s,!1,"longContext",c);if(k)return{model:k,scenarioType:"longContext"};t.log.warn(`Long context model ${a.longContext} unavailable (fail pool), trying fallback`);let w=c?jt("longContext",s,void 0,l):null;if(w)return{model:w,scenarioType:"longContext"}}if(t.body?.system?.length>1&&t.body?.system[1]?.text?.startsWith("<CCR-SUBAGENT-MODEL>")){let k=t.body?.system[1].text.match(/<CCR-SUBAGENT-MODEL>(.*?)<\/CCR-SUBAGENT-MODEL>/s);if(k)return t.body.system[1].text=t.body.system[1].text.replace(`<CCR-SUBAGENT-MODEL>${k[1]}</CCR-SUBAGENT-MODEL>`,""),{model:k[1],scenarioType:"default"}}let _=n.get("Router");if(t.body.model?.includes("claude")&&t.body.model?.includes("haiku")&&_?.background){t.log.info(`Using background model for ${t.body.model}`);let k=ot(_.background,s,!1,"background",c);if(k)return{model:k,scenarioType:"background"};t.log.warn(`Background model ${_.background} unavailable (fail pool), falling through`)}if(Array.isArray(t.body.tools)&&t.body.tools.some(k=>k.type?.startsWith("web_search"))&&a?.webSearch){let k=ot(a.webSearch,s,!1,"webSearch",c);if(k)return{model:k,scenarioType:"webSearch"};t.log.warn(`WebSearch model ${a.webSearch} unavailable (fail pool), trying fallback`);let w=c?jt("webSearch",s,void 0,l):null;if(w)return{model:w,scenarioType:"webSearch"}}if(t.body.thinking&&a?.think){t.log.info(`Using think model for ${t.body.thinking}`);let k=ot(a.think,s,!1,"think",c);if(k)return{model:k,scenarioType:"think"};t.log.warn(`Think model ${a.think} unavailable (fail pool), trying fallback`);let w=c?jt("think",s,void 0,l):null;if(w)return{model:w,scenarioType:"think"}}if(a?.default){let k=ot(a.default,s,!1,"default",c);if(k)return{model:k,scenarioType:"default"};t.log.warn(`Default model ${a.default} unavailable (fail pool), trying fallback`);let w=c?jt("default",s,void 0,l):null;if(w)return{model:w,scenarioType:"default"}}return{model:void 0,scenarioType:"default"}},Fo=async(t,e,n)=>{let{configService:r,event:o}=n;if(t.originalModel=t.body.model,t.body.metadata?.user_id){let C=t.body.metadata.user_id.split("_session_");C.length>1&&(t.sessionId=C[1])}let a=await sp(t,r)||r.get("Router"),c=a?.enableFallback===!0,l=r.get("providers")||[],d=Zu.get(t.sessionId),{messages:f,system:p=[],tools:m}=t.body,b=r.get("REWRITE_SYSTEM_PROMPT");if(b&&p.length>1&&p[1]?.text?.includes("<env>")){let C=await ic(b,"utf-8");p[1].text=`${C}<env>${p[1].text.split("<env>").pop()}`}try{let[C,y]=t.body.model.split(","),g=n.tokenizerService?.getTokenizerConfigForModel(C,y),_;n.tokenizerService?_=(await n.tokenizerService.countTokens({messages:f,system:p,tools:m},g)).tokenCount:_=op(f,p,m),t.tokenCount=_;let k,w=r.get("CUSTOM_ROUTER_PATH");if(w)try{k=await re(w)(t,r.getAll(),{event:o})}catch(S){t.log.error(`failed to load custom router: ${S.message}`)}if(k)t.scenarioType="default";else{let S=await YC(t,_,r,d);k=S.model,t.scenarioType=S.scenarioType}if(a?.image&&k!==a.image&&JC(t)&&!VC(k)){let S=ot(a.image,l,!1,"image",c);S?(t.log.info(`Using image model fallback for ${k}`),k=S,t.scenarioType="image"):(t.log.warn(`Image model ${a.image} unavailable (fail pool), keeping ${k}`),t.scenarioType="image")}t.body.model=k}catch(C){t.log.error(`Error in router middleware: ${C.message}`),t.body.model=a?.default,t.scenarioType="default"}},En=new Map,rp=1e3;function sc(){if(En.size<=rp)return;let t=[...En.keys()].slice(0,En.size-rp);for(let e of t)En.delete(e)}var up=async t=>{if(En.has(t)){let e=En.get(t);return!e||e===""?null:e}try{let e=await zC(ep),n=[];for await(let s of e)s.isDirectory()&&n.push(s.name);let r=n.map(async s=>{let a=ac(ep,s,`${t}.jsonl`);try{return(await WC(a)).isFile()?s:null}catch{return null}}),o=await Promise.all(r);for(let s of o)if(s)return En.set(t,s),sc(),s;return En.set(t,""),sc(),null}catch(e){return console.error("Error searching for project by session:",e),En.set(t,""),sc(),null}};var QC=/^ccr-(opus|sonnet|haiku)(\[1m\])?$/i;function cp(t){let e=[],n=Array.isArray(t.input)?t.input:[t.input];for(let r of n)if(r.type==="function_call")e.push({role:"assistant",tool_calls:[{id:r.call_id,type:"function",function:{name:r.name,arguments:r.arguments||"{}"}}]});else if(r.type==="function_call_output")e.push({role:"tool",tool_call_id:r.call_id,content:typeof r.output=="string"?r.output:JSON.stringify(r.output)});else if(r.role){let o=r.content;Array.isArray(o)&&(o=o.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:r.role,content:o})}t.messages=e,delete t.input,t.instructions&&typeof t.instructions=="string"&&(t.system=t.instructions,delete t.instructions),Array.isArray(t.tools)&&(t.tools=t.tools.filter(r=>r&&typeof r=="object").map(r=>r.type==="function"&&r.name&&!r.function?{type:"function",function:{name:r.name,description:r.description||"",parameters:r.parameters||{type:"object",properties:{}}}}:r.function?.name?r:r.type==="web_search"?{type:"function",function:{name:"web_search",description:"Search the web",parameters:{type:"object",properties:{query:{type:"string"}}}}}:null).filter(Boolean)),t.reasoning&&typeof t.reasoning=="object"&&(t.reasoning={enabled:!0,effort:t.reasoning.effort})}async function XC(t,e,n,r){let o=t.body;r.endPoint==="/v1/responses"&&o?.input&&!o?.messages&&cp(o),r.endPoint==="/v1/responses"&&!t.provider&&typeof o?.model=="string"&&QC.test(o.model)&&await Fo(t,e,{configService:n.configService,tokenizerService:n.tokenizerService});let s=t.provider;if(!s&&o?.model){let d=o.model.split(",");d.length>1&&(s=d[0],o.model=d.slice(1).join(","))}let a=s?n.providerService.getProvider(s):void 0;if(!a&&o?.model){let d=n.providerService.resolveModelRoute(o.model);d&&(a=d.provider,o.model=d.targetModel)}if(!a&&o?.model){let f=n.configService.get("Router")?.default;if(f&&f.includes(",")){let[p,...m]=f.split(","),b=n.providerService.getProvider(p);b&&(a=b,o.model=m.join(","))}}if(t.originalModel||(t.originalModel=o?.model),!a)throw ze(`Provider '${s}' not found`,404,"provider_not_found");t.provider=a.name||s;let c=tw(t),l=r.endPoint==="/v1/messages"&&c;c&&e.header("X-Codex-Detected","true"),l&&e.header("X-Codex-On-Messages","true"),t.isCodexOnMessagesEndpoint=l,t.codexDetected=c;try{r.endPoint==="/v1/responses"&&o.input&&!o.messages&&cp(o);let{requestBody:d,config:f,bypass:p}=await lp(o,a,r,t.headers,{req:t});if(d?.messages&&!p&&!t.isTargetAnthropic){let y=d.messages,g=new Set,_=[],k=[];for(let w of y){if(w?.role!=="system"){k.push(w);continue}let S=JSON.stringify(w.content??"");g.has(S)||(g.add(S),_.push(w))}_.length>0&&k.length>0&&(d.messages=[...k,..._])}let m=await dp(d,f,a,n,p,r,{req:t});try{a?.baseUrl&&m?.headers&&Po(s,a.baseUrl,m.headers)}catch{}let b=await fp(d,m,a,r,p,{req:t,isCodexOnMessagesEndpoint:l});if(o.stream&&b?.body){let y=b.body.getReader(),g=await y.read();if(g.done)throw y.releaseLock(),ze(`Provider returned empty streaming response from ${s}`,400,"provider_response_error");let _=new TextDecoder().decode(g.value);if(_.includes("event: error")){y.releaseLock();let S=_.length<500?_:_.slice(0,500);throw ze(`Provider ${s} returned error in SSE stream: ${S}`,400,"provider_response_error")}if(_.split(`
113
113
  `).filter(S=>S.startsWith("data:")&&S.trim().length>5).length===0){y.releaseLock();let S=_.length<500?_:_.slice(0,500);throw ze(`Provider ${s} returned streaming response with no SSE data lines: ${S}`,400,"provider_response_error")}let w=new ReadableStream({start:S=>{S.enqueue(g.value);let T=()=>{y.read().then(({done:x,value:$})=>{x?S.close():(S.enqueue($),T())}).catch(x=>S.error(x))};T()},cancel:()=>{y.cancel()}});b=new Response(w,{headers:b.headers,status:b.status,statusText:b.statusText})}let C=hp(b,e,o,n);try{let y=o.model||t.originalModel;s&&y&&Ye().recordSuccess(s,y)}catch{}return C}catch(d){let f=await ZC(t,e,n,r,d);if(f)return f;throw d}}async function ZC(t,e,n,r,o){let s=t.scenarioType||"default",a=t.familyFallback,c=t.modelFamily,l=n.configService.get("fallback"),d=Ye(),f=t.provider||"",p=t.body.model||"",m=new Set,b=o?.statusCode===429||o?.isRateLimit===!0||o?.rawBody&&ri(o.rawBody)||o?.message&&ri(o.message);if(f&&p&&(b?(d.markRateLimited(f,p,120,o?.message),t.log.warn(`Primary model ${f},${p} rate-limited, will try fallbacks`)):d.recordFailure(f,p,o?.message),m.add(`${f},${p}`),n.recordUsage?.({provider:f,model:p,originalModel:t.originalModel||p,scenarioType:s,modelFamily:t.modelFamily,errorMessage:o?.message||String(o),sessionId:t.usageSessionId||t.id,stream:t.body.stream,inputTokens:t.tokenCount||0,req:t})),!n.configService.get("Router")?.enableFallback)return t.log.info("Fallback disabled by configuration, skipping fallback attempts"),null;let y=k=>{let[w,...S]=k.split(","),T=w?.trim(),x=S.join(",").trim();return!T||!x?null:{provider:T,model:x,key:`${T},${x}`}},g=[];if(c){let k=a?.[s];Array.isArray(k)&&k.length>0?g.push({name:`${c}/${s}`,models:k}):t.log.warn(`No ${c} fallback configured for ${s}; will try global ${s} fallback`)}if(Array.isArray(l?.[s])&&l[s].length>0&&g.push({name:`global/${s}`,models:l[s]}),g.length===0&&s!=="image"&&t.body?.messages?.some(S=>S.role==="user"&&Array.isArray(S.content)&&S.content.some(T=>T.type==="image"||T.type==="image_url"||Array.isArray(T?.content)&&T.content.some(x=>x.type==="image"||x.type==="image_url")))&&Array.isArray(l?.image)&&l.image.length>0&&(t.log.info(`No fallback for scenario '${s}', but request has images \u2014 trying fallback.image`),g.push({name:"global/image (auto-detected)",models:l.image})),g.length===0)return null;let _=g.reduce((k,w)=>k+w.models.length,0);t.log.warn(`Request failed for ${s}, trying ${_} fallback models across ${g.length} fallback stage(s)`);for(let k of g){t.log.info(`Trying ${k.name} fallback stage with ${k.models.length} models`);for(let w of k.models){let S=y(w);if(!S){t.log.warn(`Fallback model '${w}' is invalid, skipping`);continue}if(m.has(S.key))continue;m.add(S.key);let T=S.provider,x=S.model;try{if(!d.isAvailable(T,x)){t.log.warn(`Fallback model ${w} unavailable (fail pool), skipping`);continue}t.log.info(`Trying fallback model: ${w}`);let $={...t.body};$.model=x;let G={...t,provider:T,body:$},F=n.providerService.getProvider(T);if(!F){t.log.warn(`Fallback provider '${T}' not found, skipping`);continue}if(F.enabled===!1){t.log.warn(`Fallback provider '${T}' is disabled, skipping`);continue}let{requestBody:X,config:H,bypass:K}=await lp($,F,r,t.headers,{req:G}),Y=await dp(X,H,F,n,K,r,{req:G});try{F?.baseUrl&&Y?.headers&&Po(T,F.baseUrl,Y.headers)}catch{}let te=await fp(X,Y,F,r,K,{req:G,isCodexOnMessagesEndpoint:t.isCodexOnMessagesEndpoint||!1});return t.log.info(`Fallback model ${w} succeeded`),d.recordSuccess(T,x),f&&p&&(Oo().promote(f,p,s,T,x),t.log.info(`Promoted fallback model ${T},${x} for ${f},${p}:${s}`),b?t.log.info(`Rate-limited original model ${f},${p} already marked unavailable with cooldown`):(d.forceOpen(f,p,o?.message),t.log.info(`Marked original model ${f},${p} as unavailable`))),t.provider=T,t.body=$,hp(te,e,$,n)}catch($){d.recordFailure(T,x,$.message),t.log.warn(`Fallback model ${S.key} failed: ${$.message}`),n.recordUsage?.({provider:T,model:x,originalModel:t.body.model,scenarioType:s,modelFamily:t.modelFamily,errorMessage:$.message,sessionId:t.usageSessionId||t.id,stream:t.body.stream,req:t});continue}}}return t.log.error(`All fallback models failed for ${s}`),null}async function lp(t,e,n,r,o){let s=JSON.parse(JSON.stringify(t)),a=s?.system;if(typeof a=="string"&&a.includes("cch="))s.system=a.replace(/cch=[^;]+;?/g,"cch=ccr-stable;");else if(Array.isArray(a))for(let d=0;d<a.length;d++){let f=a[d],p=typeof f=="string"?f:f?.text??"";if(p.includes("cch=")){let m=p.replace(/cch=[^;]+;?/g,"cch=ccr-stable;");typeof f=="string"?a[d]=m:typeof f?.text=="string"&&(f.text=m)}}let c={},l=!1;if(l=ew(e,n,t),l&&(r instanceof Headers?r.delete("content-length"):delete r["content-length"],c.headers=r),!l&&typeof n.transformRequestOut=="function"){let d=await n.transformRequestOut(s);d.body?(s=d.body,c=d.config||{}):s=d}if(!l&&e.transformer?.use?.length)for(let d of e.transformer.use){if(!d||typeof d.transformRequestIn!="function")continue;let f=await d.transformRequestIn(s,e,o);f.body?(s=f.body,c={...c,...f.config}):s=f}if(!l&&e.transformer?.[t.model]?.use?.length)for(let d of e.transformer[t.model].use)!d||typeof d.transformRequestIn!="function"||(s=await d.transformRequestIn(s,e,o));return{requestBody:s,config:c,bypass:l}}function ew(t,e,n){return e.endPoint==="/v1/chat/completions"&&Array.isArray(n?.system)?!1:t.transformer?.use?.length===1&&t.transformer.use[0].name===e.name&&(!t.transformer?.[n.model]?.use.length||t.transformer?.[n.model]?.use.length===1&&t.transformer?.[n.model]?.use[0].name===e.name)}function tw(t){let e=t.headers||{},n=e["x-anthropic-billing-header"]||"";if(typeof n=="string"&&n.includes("cc_version="))return!1;let r=e["user-agent"]||"";if(typeof r=="string"&&/codex/i.test(r))return!0;let o=t.pathname||t.url||"";if(typeof o=="string"&&o.split("?",1)[0].endsWith("/v1/responses"))return!0;let s=t.originalModel||"";return typeof s=="string"&&s.toLowerCase()==="ccr-codex"}async function dp(t,e,n,r,o,s,a){let c=e.url||new URL(n.baseUrl);if(!e.TIMEOUT){let f=r.configService.get("API_TIMEOUT_MS");f&&(e.TIMEOUT=typeof f=="string"?parseInt(f,10):f)}if(o&&typeof s.auth=="function"){let f=await s.auth(t,n);if(f.body){t=f.body;let p=e.headers||{};f.config?.headers&&(p={...p,...f.config.headers},delete p.host,delete f.config.headers),e={...e,...f.config,headers:p}}else t=f}let l={Authorization:`Bearer ${n.apiKey}`,...e?.headers||{}};for(let f in l)(l[f]==="undefined"||["authorization","Authorization"].includes(f)&&l[f]?.includes("undefined"))&&delete l[f];Xs(r.configService)&&Bh(r.log,a.req.id,{url:String(c),headers:l,body:t});let d=await Oh(c,t,{httpsProxy:r.configService.getHttpsProxy(),...e,headers:JSON.parse(JSON.stringify(l))},a,r.log);if(!d.ok){let f=await d.text();r.log.error(`[provider_response_error] Error from provider(${n.name},${t.model}: ${d.status}): ${f}`);let p=ze(`Error from provider(${n.name},${t.model}: ${d.status}): ${f}`,d.status,"provider_response_error");throw p.isRateLimit=d.status===429||ri(f),p.rawBody=f,p}if(d.ok){let f=d.headers.get("content-type")||"",p=t.stream===!0;if(r.log.info(`[hidden-error-check] provider=${n.name} model=${t.model} stream=${t.stream} isStreamRequest=${p} contentType=${f} ok=${d.ok} status=${d.status} hasBody=${!!d.body}`),!p||f.includes("application/json")){let m=d.clone(),b="";try{if(b=await m.text(),!b||b.trim()==="")throw new SyntaxError("Empty JSON body");let C=JSON.parse(b);if(C&&typeof C=="object"&&C.error&&(typeof C.error=="string"||typeof C.error=="object"&&Object.keys(C.error).length>0)){r.log.error(`[provider_response_error] Hidden error from provider(${n.name},${t.model}: ${d.status}): ${b}`);let g=ri(b),_=ze(`Error from provider(${n.name},${t.model}: ${d.status}): ${b}`,400,"provider_response_error");throw _.isRateLimit=g,_.rawBody=b,_}}catch(C){if(C instanceof SyntaxError){r.log.warn(`[provider_response_error] Empty or malformed JSON response from provider(${n.name},${t.model}: 200): "${b}"`);let y=ze(`API returned an empty or malformed response (HTTP 200) from ${n.name} \u2014 check for a proxy or gateway intercepting the request`,400,"provider_response_error");throw y.rawBody=b,y}throw C}}}if(!t.stream&&Xs(r.configService)){let p=await d.clone().text();Mh(r.log,a.req.id,{status:d.status,headers:Object.fromEntries(d.headers.entries()),body:p})}return d}async function fp(t,e,n,r,o,s){let a=e;if(!o&&n.transformer?.use?.length)for(let c of Array.from(n.transformer.use).reverse())!c||typeof c.transformResponseOut!="function"||(a=await c.transformResponseOut(a,s));if(!o&&n.transformer?.[t.model]?.use?.length)for(let c of Array.from(n.transformer[t.model].use).reverse())!c||typeof c.transformResponseOut!="function"||(a=await c.transformResponseOut(a,s));if(!o&&r.transformResponseIn&&(s.provider||(s.provider=n),a=await r.transformResponseIn(a,s)),s?.isCodexOnMessagesEndpoint)try{a=await new Mr().transformResponseIn(a,{...s,provider:n})}catch(c){console.error("Failed to apply Responses API conversion for codex client:",c)}return a}function hp(t,e,n,r){if(t.ok||e.code(t.status),n.stream===!0){if(e.header("Content-Type","text/event-stream"),e.header("Cache-Control","no-cache"),e.header("Connection","keep-alive"),r&&Xs(r.configService)){let[s,a]=t.body.tee(),c=Ih(r.configService);return Lh(s,r.log,e.request.id,c),e.send(a)}return e.send(t.body)}else return t.json()}var uc=async t=>{t.get("/",async()=>({message:"LLMs API",version:jh})),t.get("/health",async()=>({status:"ok",timestamp:new Date().toISOString()})),t.get("/providers/health",async()=>({states:Ye().getAllStates().map(o=>({provider:o.provider,model:o.model,status:o.status,failureCount:o.failureCount,successCount:o.successCount,lastFailureTime:o.lastFailureTime,lastError:o.lastError,rateLimitUntil:o.rateLimitUntil??null})),timestamp:new Date().toISOString()}));let e=t.transformerService.getTransformersWithEndpoint();for(let{transformer:n}of e)n.endPoint&&t.post(n.endPoint,async(r,o)=>XC(r,o,t,n));t.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"}}},required:["id","name","type","baseUrl","apiKey","models"]}}},async(n,r)=>{let{name:o,baseUrl:s,apiKey:a,models:c}=n.body;if(!o?.trim())throw ze("Provider name is required",400,"invalid_request");if(!s||!nw(s))throw ze("Valid base URL is required",400,"invalid_request");if(!a?.trim())throw ze("API key is required",400,"invalid_request");if(!c||!Array.isArray(c)||c.length===0)throw ze("At least one model is required",400,"invalid_request");if(t.providerService.getProvider(n.body.name))throw ze(`Provider with name '${n.body.name}' already exists`,400,"provider_exists");return t.providerService.registerProvider(n.body)}),t.get("/providers",async()=>t.providerService.getProviders()),t.get("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async n=>{let r=t.providerService.getProvider(n.params.id);if(!r)throw ze("Provider not found",404,"provider_not_found");return r}),t.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"}},enabled:{type:"boolean"}}}}},async(n,r)=>{let o=t.providerService.updateProvider(n.params.id,n.body);if(!o)throw ze("Provider not found",404,"provider_not_found");return o}),t.delete("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async n=>{if(!t.providerService.deleteProvider(n.params.id))throw ze("Provider not found",404,"provider_not_found");return{message:"Provider deleted successfully"}}),t.patch("/providers/:id/toggle",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]},body:{type:"object",properties:{enabled:{type:"boolean"}},required:["enabled"]}}},async(n,r)=>{if(!t.providerService.toggleProvider(n.params.id,n.body.enabled))throw ze("Provider not found",404,"provider_not_found");return{message:`Provider ${n.body.enabled?"enabled":"disabled"} successfully`}})};function ri(t){let e=t.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 nw(t){try{return new URL(t),!0}catch{return!1}}var jr=class{constructor(e,n,r){this.configService=e;this.transformerService=n;this.logger=r;this.initializeCustomProviders()}providers=new Map;modelRoutes=new Map;initializeCustomProviders(){let e=this.configService.get("providers");if(e&&Array.isArray(e)){this.initializeFromProvidersArray(e);return}}initializeFromProvidersArray(e){e.forEach(n=>{try{if(!n.name||!n.api_base_url||!n.api_key)return;let r={};n.transformer&&Object.keys(n.transformer).forEach(o=>{o==="use"?Array.isArray(n.transformer.use)&&(r.use=n.transformer.use.map(s=>{if(Array.isArray(s)&&typeof s[0]=="string"){let a=this.transformerService.getTransformer(s[0]);if(a)return new a(s[1])}if(typeof s=="string"){let a=this.transformerService.getTransformer(s);return typeof a=="function"?new a:a}}).filter(s=>typeof s<"u")):Array.isArray(n.transformer[o]?.use)&&(r[o]={use:n.transformer[o].use.map(s=>{if(Array.isArray(s)&&typeof s[0]=="string"){let a=this.transformerService.getTransformer(s[0]);if(a)return new a(s[1])}if(typeof s=="string"){let a=this.transformerService.getTransformer(s);return typeof a=="function"?new a:a}}).filter(s=>typeof s<"u")})}),this.registerProvider({name:n.name,baseUrl:n.api_base_url,apiKey:n.api_key,models:n.models||[],quotaToken:n.quota_token,transformer:n.transformer?r:void 0,cacheMode:n.cache_mode||"exclusive",enabled:n.enabled!==!1,wakeupEnabled:n.wakeup_enabled===!0,wakeupTime:n.wakeup_time||"06:00",wakeupModel:n.wakeup_model||""}),this.logger.info(`${n.name} provider registered`)}catch(r){this.logger.error(`${n.name} provider registered error: ${r}`)}})}registerProvider(e){let n={...e,enabled:e.enabled!==!1,wakeupEnabled:e.wakeupEnabled===!0,wakeupTime:e.wakeupTime||"06:00",wakeupModel:e.wakeupModel||""};return this.providers.set(n.name,n),e.models.forEach(r=>{let o=`${n.name},${r}`,s={provider:n.name,model:r,fullModel:o};this.modelRoutes.set(o,s),this.modelRoutes.has(r)||this.modelRoutes.set(r,s)}),n}getProviders(){return Array.from(this.providers.values())}getProvider(e){return this.providers.get(e)}updateProvider(e,n){let r=this.providers.get(e);if(!r)return null;let o={...r,...n,updatedAt:new Date};return this.providers.set(e,o),n.models&&(r.models.forEach(s=>{let a=`${r.name},${s}`;this.modelRoutes.delete(a),this.modelRoutes.delete(s)}),n.models.forEach(s=>{let a=`${r.name},${s}`,c={provider:r.name,model:s,fullModel:a};this.modelRoutes.set(a,c),this.modelRoutes.has(s)||this.modelRoutes.set(s,c)})),o}deleteProvider(e){let n=this.providers.get(e);return n?(n.models.forEach(r=>{let o=`${n.name},${r}`;this.modelRoutes.delete(o),this.modelRoutes.delete(r)}),this.providers.delete(e),!0):!1}toggleProvider(e,n){let r=this.providers.get(e);if(!r)return!1;r.enabled=n;let o=this.configService.get("providers");if(o&&Array.isArray(o)){let s=o.find(a=>a.name===e);s&&(s.enabled=n)}return!0}resolveModelRoute(e){let n=this.modelRoutes.get(e);if(!n)return null;let r=this.providers.get(n.provider);return r?{provider:r,originalModel:e,targetModel:n.model}:null}getAvailableModelNames(){let e=[];return this.providers.forEach(n=>{n.enabled!==!1&&n.models.forEach(r=>{e.push(r),e.push(`${n.name},${r}`)})}),e}getModelRoutes(){return Array.from(this.modelRoutes.values())}parseTransformerConfig(e){return e?Array.isArray(e)?e.reduce((n,r)=>{if(Array.isArray(r)){let[o,s={}]=r;n[o]=s}else n[r]={};return n},{}):e:{}}async getAvailableModels(){let e=[];return this.providers.forEach(n=>{n.enabled!==!1&&n.models.forEach(r=>{e.push({id:r,object:"model",owned_by:n.name,provider:n.name}),e.push({id:`${n.name},${r}`,object:"model",owned_by:n.name,provider:n.name})})}),{object:"list",data:e}}};var Qe=[];for(let t=0;t<256;++t)Qe.push((t+256).toString(16).slice(1));function pp(t,e=0){return(Qe[t[e+0]]+Qe[t[e+1]]+Qe[t[e+2]]+Qe[t[e+3]]+"-"+Qe[t[e+4]]+Qe[t[e+5]]+"-"+Qe[t[e+6]]+Qe[t[e+7]]+"-"+Qe[t[e+8]]+Qe[t[e+9]]+"-"+Qe[t[e+10]]+Qe[t[e+11]]+Qe[t[e+12]]+Qe[t[e+13]]+Qe[t[e+14]]+Qe[t[e+15]]).toLowerCase()}import{randomFillSync as rw}from"crypto";var si=new Uint8Array(256),oi=si.length;function cc(){return oi>si.length-16&&(rw(si),oi=0),si.slice(oi,oi+=16)}import{randomUUID as ow}from"crypto";var lc={randomUUID:ow};function sw(t,e,n){if(lc.randomUUID&&!e&&!t)return lc.randomUUID();t=t||{};let r=t.random??t.rng?.()??cc();if(r.length<16)throw new Error("Random bytes length must be >= 16");if(r[6]=r[6]&15|64,r[8]=r[8]&63|128,e){if(n=n||0,n<0||n+16>e.length)throw new RangeError(`UUID byte range ${n}:${n+15} is out of buffer bounds`);for(let o=0;o<16;++o)e[n+o]=r[o];return e}return pp(r)}var Ut=sw;var mp=t=>t<=0?"none":t<=1024?"low":t<=8192?"medium":"high";var gp=(t,e)=>(t.includes("base64")&&(t=t.split("base64").pop(),t.startsWith(",")&&(t=t.slice(1))),`data:${e};base64,${t}`);function iw(t){return t.filter(e=>!!e?.function?.name).map(e=>({name:e.function.name,description:e.function.description,input_schema:e.function.parameters}))}function yp(t){let e=[],n=[],r=m=>{if(typeof m=="string"){n.push({type:"text",text:m});return}Array.isArray(m)&&m.forEach(b=>{if(typeof b=="string"){n.push({type:"text",text:b});return}b&&typeof b=="object"&&b.type==="text"&&b.text&&n.push({...b})})},o=()=>{let m=new Map;for(let b=0;b<n.length;b++){let C=n[b],y=C?.text??JSON.stringify(C),g=m.get(y);if(g===void 0){m.set(y,b);continue}!n[g]?.cache_control&&C?.cache_control&&(n[g]=C),n.splice(b,1),b--}};t.messages.forEach(m=>{m.role==="system"?r(m.content):e.push(m)}),o();let s=[];for(let m=0;m<e.length;m++){let b=e[m];if(b.role==="tool"){let C=b.content;try{typeof b.content=="string"&&(C=JSON.parse(b.content))}catch{}C!=null&&typeof C!="object"&&typeof C!="string"&&(C=String(C));let y={type:"tool_result",tool_use_id:b.tool_call_id,content:C};b.cache_control&&(y.cache_control=b.cache_control);let g=s[s.length-1];g&&g.role==="user"&&Array.isArray(g.content)?g.content.push(y):s.push({role:"user",content:[y]})}else if(b.role==="user"){let C=[];typeof b.content=="string"?C.push({type:"text",text:b.content}):Array.isArray(b.content)&&b.content.forEach(g=>{g&&typeof g=="object"&&g.type==="image_url"&&g.image_url?.url?C.push({type:"image",source:{type:"base64",media_type:g.media_type||"image/jpeg",data:g.image_url.url.split(",")[1]||g.image_url.url}}):C.push(g)});let y=s[s.length-1];y&&y.role==="user"&&Array.isArray(y.content)?y.content.push(...C):s.push({role:"user",content:C.length>0?C:[{type:"text",text:" "}]})}else if(b.role==="assistant"){let C=[];b.content&&(typeof b.content=="string"?C.push({type:"text",text:b.content}):Array.isArray(b.content)&&C.push(...b.content)),b.tool_calls&&b.tool_calls.length>0&&b.tool_calls.forEach(g=>{let _={};try{_=JSON.parse(g.function.arguments)}catch{_=g.function.arguments}C.push({type:"tool_use",id:g.id,name:g.function.name,input:_})}),b.thinking&&C.unshift({type:"thinking",thinking:b.thinking.content,signature:b.thinking.signature});let y=s[s.length-1];y&&y.role==="assistant"&&Array.isArray(y.content)?y.content.push(...C):s.push({role:"assistant",content:C.length>0?C:[{type:"text",text:" "}]})}}let a=()=>{let m=n.filter(b=>b?.cache_control).length;for(let b of s)Array.isArray(b.content)&&(m+=b.content.filter(C=>C?.cache_control).length);return m},c=m=>m&&typeof m=="object"?{...m}:{type:"ephemeral"},l=()=>{for(let m=s.length-1;m>=0;m--){let b=s[m]?.content;if(!Array.isArray(b))continue;let C=b.find(y=>y?.cache_control);if(C?.cache_control)return C.cache_control}for(let m=n.length-1;m>=0;m--)if(n[m]?.cache_control)return n[m].cache_control;return{type:"ephemeral"}},d=(m,b)=>{if(!Array.isArray(m?.content)||m.content.some(y=>y?.cache_control))return!1;let C=m.content.find(y=>y&&typeof y=="object"&&!y.cache_control);return C?(C.cache_control=c(b),!0):!1};(()=>{let m=4-a();if(m<=0||s.length===0)return;let b=s,C=l(),y=[];for(let g=b.length-1;g>=0;g--)b[g]?.role!=="user"||!Array.isArray(b[g].content)||y.push(g);for(let g of y){if(m<=0)break;d(b[g],C)&&m--}})();let p={messages:s,model:t.model,max_tokens:t.max_tokens||4096,temperature:t.temperature,stream:t.stream};if(n.length>0){let m=n.some(b=>b?.cache_control);p.system=m?n:n.map(b=>b.text||"").join(`
114
114
 
115
115
  `)}return t.tools&&t.tools.length>0&&(p.tools=iw(t.tools),t.tool_choice&&(t.tool_choice==="auto"?p.tool_choice={type:"auto"}:t.tool_choice==="any"||t.tool_choice==="required"?p.tool_choice={type:"any"}:typeof t.tool_choice=="string"?p.tool_choice={type:"tool",name:t.tool_choice}:typeof t.tool_choice=="object"&&t.tool_choice.type==="function"&&(p.tool_choice={type:"tool",name:t.tool_choice.function.name}))),p}var ii=class{constructor(e){this.options=e;this.useBearer=this.options?.UseBearer??!1}name="Anthropic";endPoint="/v1/messages";useBearer;logger;async auth(e,n){let r={};return this.useBearer?(r.authorization=`Bearer ${n.apiKey}`,r["x-api-key"]=void 0):(r["x-api-key"]=n.apiKey,r.authorization=void 0),{body:e,config:{headers:r}}}async transformRequestOut(e){let n=[];if(e.system){if(typeof e.system=="string")n.push({role:"system",content:e.system});else if(Array.isArray(e.system)&&e.system.length){let s=e.system.filter(a=>a.type==="text"&&a.text).map(a=>({type:"text",text:a.text,cache_control:a.cache_control}));n.push({role:"system",content:s})}}JSON.parse(JSON.stringify(e.messages||[]))?.forEach(s=>{if(s.role==="system"){n.push({role:"system",content:s.content});return}if(s.role==="user"||s.role==="assistant"){if(typeof s.content=="string"){n.push({role:s.role,content:s.content});return}if(Array.isArray(s.content)){if(s.role==="user"){let a=s.content.filter(l=>l.type==="tool_result"&&l.tool_use_id);a.length&&a.forEach(l=>{let d={role:"tool",content:typeof l.content=="string"?l.content:JSON.stringify(l.content),tool_call_id:l.tool_use_id,cache_control:l.cache_control};n.push(d)});let c=s.content.filter(l=>l.type==="text"&&l.text||l.type==="image"&&l.source);c.length&&n.push({role:"user",content:c.map(l=>l?.type==="image"?{type:"image_url",image_url:{url:l.source?.type==="base64"?gp(l.source.data,l.source.media_type):l.source.url},media_type:l.source.media_type}:l)})}else if(s.role==="assistant"){let a={role:"assistant",content:""},c=s.content.filter(f=>f.type==="text"&&f.text);c.length&&(a.content=c.map(f=>f.text).join(`