@caeliq/llms 1.0.54 → 1.0.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/server.cjs +1 -1
- package/dist/cjs/server.cjs.map +1 -1
- package/dist/esm/server.mjs +1 -1
- package/dist/esm/server.mjs.map +1 -1
- package/package.json +5 -4
package/dist/esm/server.mjs
CHANGED
|
@@ -70,7 +70,7 @@ ${this.toMarkdown(o,r+1)}`:`${n}- ${o}`).join(`
|
|
|
70
70
|
`):typeof e=="object"&&e!==null?Object.entries(e).map(([o,s])=>typeof s=="object"&&s!==null?`${n}${o}:
|
|
71
71
|
${this.toMarkdown(s,r+1)}`:`${n}${o}: ${s}`).join(`
|
|
72
72
|
`):`${n}${e}`}async output(e,r={}){try{let n=this.formatData(e,r);switch(this.config.level||"log"){case"info":console.info(n);break;case"warn":console.warn(n);break;case"error":console.error(n);break;case"debug":console.debug(n);break;case"log":default:console.log(n);break}return!0}catch(n){return console.error("[ConsoleOutputHandler] Output failed:",n),!1}}}});var ks,vd=Ue(()=>{"use strict";ks=class{type="webhook";config;defaultTimeout=3e4;logger=null;setLogger(e){this.logger=e,this.logger&&(typeof this.logger.info=="function"&&(this.logger.info=this.logger.info.bind(this.logger)),typeof this.logger.warn=="function"&&(this.logger.warn=this.logger.warn.bind(this.logger)),typeof this.logger.error=="function"&&(this.logger.error=this.logger.error.bind(this.logger)))}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 r=Buffer.from(`${this.config.auth.username}:${this.config.auth.password}`).toString("base64");e.Authorization=`Basic ${r}`}break;case"custom":this.config.auth.custom&&(e[this.config.auth.custom.header]=this.config.auth.custom.value);break}return e}buildBody(e,r){let{format:n="json",timestamp:o=!0,prefix:s,metadata:a}=r||{},u={data:e};return o&&(u.timestamp=new Date().toISOString()),s&&(u.prefix=s),a&&Object.keys(a).length>0&&(u.metadata=a),u}async sendRequest(e,r,n,o,s){let a=new AbortController,u=setTimeout(()=>a.abort(),s);try{let l=await fetch(e,{method:r,headers:n,body:JSON.stringify(o),signal:a.signal});if(clearTimeout(u),!l.ok)throw new Error(`HTTP ${l.status}: ${l.statusText}`);return l}catch(l){throw clearTimeout(u),l}}delay(e){return new Promise(r=>setTimeout(r,e))}async sendWithRetry(e,r,n,o,s,a){let u=null;for(let l=1;l<=a.maxAttempts;l++)try{return await this.sendRequest(e,r,n,o,s)}catch(f){if(u=f,l===a.maxAttempts)break;let d=a.backoffMs*Math.pow(2,l-1);(this.logger?.warn??console.warn)(`[WebhookOutputHandler] Request failed (attempt ${l}/${a.maxAttempts}), retrying in ${d}ms...`,f.message),await this.delay(d)}throw u}async output(e,r={}){let n=r.timeout||this.defaultTimeout;try{let o=this.buildHeaders(),s=this.buildBody(e,r),a=await this.sendWithRetry(this.config.url,this.config.method,o,s,n,this.config.retry);return!0}catch(o){let s=o instanceof Error?o.message:String(o);if(this.config.silent)return(this.logger?.error??console.error)(`[WebhookOutputHandler] Failed to send data: ${s}`),!1;throw new Error(`Webhook output failed: ${s}`)}}}});import{writeFileSync as d1,existsSync as h1,mkdirSync as p1}from"fs";import{join as ob}from"path";import{tmpdir as g1}from"os";var Ss,Rd=Ue(()=>{"use strict";Ss=class{type="temp-file";config;baseDir;constructor(e={}){this.config={subdirectory:"claude-code-router",extension:"json",includeTimestamp:!1,prefix:"session",...e};let r=g1();this.baseDir=ob(r,this.config.subdirectory),this.ensureDir()}ensureDir(){try{h1(this.baseDir)||p1(this.baseDir,{recursive:!0})}catch{}}extractSessionId(e){try{let r=e.match(/_session_([a-f0-9-]+)/i);return r?r[1]:null}catch{return null}}getFilePath(e){let r=this.config.prefix||"session",n=this.config.extension?`.${this.config.extension}`:"",o;if(this.config.includeTimestamp){let s=Date.now();o=`${r}-${e}-${s}${n}`}else o=`${r}-${e}${n}`;return ob(this.baseDir,o)}async output(e,r={}){try{let n=r.metadata?.sessionId;if(!n)return!1;let o={...e,timestamp:Date.now(),sessionId:n},s=this.getFilePath(n);return d1(s,JSON.stringify(o,null,2),"utf-8"),!0}catch{return!1}}getBaseDir(){return this.baseDir}}});var xd,ko,sb=Ue(()=>{"use strict";Dd();vd();Rd();xd=class{handlers=new Map;defaultOptions={};logger=null;setLogger(e){this.logger=e,this.logger&&(typeof this.logger.info=="function"&&(this.logger.info=this.logger.info.bind(this.logger)),typeof this.logger.warn=="function"&&(this.logger.warn=this.logger.warn.bind(this.logger)),typeof this.logger.error=="function"&&(this.logger.error=this.logger.error.bind(this.logger)))}registerHandler(e,r){this.handlers.set(e,r)}registerHandlers(e){for(let r of e)if(r.enabled!==!1)try{let n=this.createHandler(r),o=r.type+"_"+Date.now();this.registerHandler(o,n)}catch(n){(this.logger?.error??console.error)(`[OutputManager] Failed to register ${r.type} handler:`,n)}}createHandler(e){let r;switch(e.type){case"console":r=new ws(e.config);break;case"webhook":r=new ks(e.config);break;case"temp-file":r=new Ss(e.config);break;default:throw new Error(`Unknown output handler type: ${e.type}`)}return this.logger&&typeof r.setLogger=="function"&&r.setLogger(this.logger),r}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,r){let n={...this.defaultOptions,...r},o={success:[],failed:[]},s=Array.from(this.handlers.entries()).map(async([a,u])=>{try{await u.output(e,n)?o.success.push(a):o.failed.push(a)}catch(l){(this.logger?.error??console.error)(`[OutputManager] Handler ${a} failed:`,l),o.failed.push(a)}});return await Promise.all(s),o}async outputTo(e,r,n){let o={...this.defaultOptions,...n},s={success:[],failed:[]},a=e.map(async u=>{let l=this.handlers.get(u);if(!l){(this.logger?.warn??console.warn)(`[OutputManager] Handler ${u} not found`),s.failed.push(u);return}try{await l.output(r,o)?s.success.push(u):s.failed.push(u)}catch(f){(this.logger?.error??console.error)(`[OutputManager] Handler ${u} failed:`,f),s.failed.push(u)}});return await Promise.all(a),s}async outputToType(e,r,n){let o=Array.from(this.handlers.entries()).filter(([s,a])=>a.type===e).map(([s])=>s);return this.outputTo(o,r,n)}},ko=new xd});import m1 from"fastify";import y1 from"@fastify/cors";var Vh=Kt(_c(),1);import{readFileSync as ow,existsSync as Gh}from"fs";import{join as Jh}from"path";import{config as sw}from"dotenv";var Nn=class{config={};options;logger;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.logger=e.logger,this.logger&&(typeof this.logger.info=="function"&&(this.logger.info=this.logger.info.bind(this.logger)),typeof this.logger.warn=="function"&&(this.logger.warn=this.logger.warn.bind(this.logger)),typeof this.logger.error=="function"&&(this.logger.error=this.logger.error.bind(this.logger))),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:Jh(process.cwd(),this.options.jsonPath);if(Gh(e))try{let r=ow(e,"utf-8"),n=Vh.default.parse(r);this.config={...this.config,...n},(this.logger?.info??console.log)(`Loaded JSON config from: ${e}`)}catch(r){(this.logger?.warn??console.warn)(`Failed to load JSON config from ${e}:`,r)}else(this.logger?.warn??console.warn)(`JSON config file not found: ${e}`)}loadEnvConfig(){let e=this.isAbsolutePath(this.options.envPath)?this.options.envPath:Jh(process.cwd(),this.options.envPath);if(Gh(e))try{let r=sw({path:e});r.parsed&&(this.config={...this.config,...this.parseEnvConfig(r.parsed)})}catch(r){(this.logger?.warn??console.warn)(`Failed to load .env config from ${e}:`,r)}}loadEnvironmentVariables(){let e=this.parseEnvConfig(process.env);this.config={...this.config,...e}}parseEnvConfig(e){let r={};return Object.assign(r,e),r}isAbsolutePath(e){return e.startsWith("/")||e.includes(":")}get(e,r){let n=this.config[e];return n!==void 0?n:r}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,r){this.config[e]=r}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 it(t,e=500,r="internal_error",n="api_error",o){let s=new Error(t);return s.statusCode=e,s.code=r,s.type=n,o&&(s.headers=o),s}async function Kh(t,e,r){e.log.error(t);let n=t.statusCode||500,o={error:{message:t.message+(t.stack?`
|
|
73
|
-
`+t.stack:""),type:t.type||"api_error",code:t.code||"internal_error"}};return t.headers&&r.headers(t.headers),r.header("Content-Type","application/json"),r.code(n).send(o)}import{Readable as uw}from"stream";import{ProxyAgent as iw}from"undici";function Yh(t,e,r,n,o){let s=new Headers({"Content-Type":"application/json"});r.headers&&Object.entries(r.headers).forEach(([f,d])=>{d&&s.set(f,d)});let a,u=AbortSignal.timeout(r.TIMEOUT??60*1e3*60);if(r.signal){let f=new AbortController,d=()=>f.abort();r.signal.addEventListener("abort",d),u.addEventListener("abort",d),a=f.signal}else a=u;let l={method:"POST",headers:s,body:JSON.stringify(e),signal:a};return r.httpsProxy&&(l.dispatcher=new iw(new URL(r.httpsProxy).toString())),o?.debug({reqId:n.req.id,request:l,headers:Object.fromEntries(s.entries()),requestUrl:typeof t=="string"?t:t.toString(),useProxy:r.httpsProxy},"final request"),fetch(typeof t=="string"?t:t.toString(),l)}var Xh="1.0.54";async function cw(t,e,r,n){let o=t.body,s=t.provider,a=r.providerService.getProvider(s);if(!a)throw it(`Provider '${s}' not found`,404,"provider_not_found");try{let{requestBody:u,config:l,bypass:f}=await Qh(o,a,n,t.headers,{req:t,provider:a}),d=await Zh(u,l,a,r,f,n,{req:t}),p=await ep(u,d,a,n,f,{req:t});return await tp(p,e,o)}catch(u){if(u.code==="provider_response_error"){let l=await lw(t,e,r,n,u);if(l)return l}throw u}}async function lw(t,e,r,n,o){let s=t.scenarioType||"default",a=r.configService.get("fallback");if(!a||!a[s])return null;let u=a[s];if(!Array.isArray(u)||u.length===0)return null;t.log.warn(`Request failed for ${t.scenarioType}, trying ${u.length} fallback models`);for(let l of u)try{t.log.info(`Trying fallback model: ${l}`);let f={...t.body},[d,...p]=l.split(",");f.model=p.join(",");let y={...t,provider:d,body:f},A=r.providerService.getProvider(d);if(!A){t.log.warn(`Fallback provider '${d}' not found, skipping`);continue}let{requestBody:g,config:C,bypass:b}=await Qh(f,A,n,t.headers,{req:y,provider:A}),m=await Zh(g,C,A,r,b,n,{req:y}),v=await ep(g,m,A,n,b,{req:y});return t.log.info(`Fallback model ${l} succeeded`),await tp(v,e,f)}catch(f){t.log.warn(`Fallback model ${l} failed: ${f.message}`);continue}return t.log.error(`All fallback models failed for yichu ${s}`),null}async function Qh(t,e,r,n,o){let s=t,a={},u=!1;u=fw(e,r,t);let l=u||e.transformer?.passthrough;if(u&&(n instanceof Headers?n.delete("content-length"):delete n["content-length"],a.headers=n),!l&&typeof r.transformRequestOut=="function"){let f=await r.transformRequestOut(s,o);f.body?(s=f.body,a=f.config||{}):s=f}if(!u&&e.transformer?.use?.length)for(let f of e.transformer.use){if(!f||typeof f.transformRequestIn!="function")continue;let d=await f.transformRequestIn(s,e,o);d.body?(s=d.body,a={...a,...d.config}):s=d}if(!u&&e.transformer?.[t.model]?.use?.length)for(let f of e.transformer[t.model].use){if(!f||typeof f.transformRequestIn!="function")continue;let d=await f.transformRequestIn(s,e,o);d.body?(s=d.body,a={...a,...d.config}):s=d}return{requestBody:s,config:a,bypass:u}}function fw(t,e,r){return t.transformer?.use?.length===1&&t.transformer.use[0].name===e.name&&(!t.transformer?.[r.model]?.use.length||t.transformer?.[r.model]?.use.length===1&&t.transformer?.[r.model]?.use[0].name===e.name)}async function Zh(t,e,r,n,o,s,a){if(e?.__providerResponse)return e.__providerResponse;let u=e.url||new URL(r.baseUrl);if((o||r.transformer?.passthrough)&&typeof s.auth=="function"){let d=await s.auth(t,r);if(d.body){t=d.body;let p=e.headers||{};d.config?.headers&&(p={...p,...d.config.headers},delete p.host,delete d.config.headers),e={...e,...d.config,headers:p}}else t=d}let l={Authorization:`Bearer ${r.apiKey}`,...e?.headers||{}};l["x-api-key"]&&delete l.Authorization;for(let d in l)(l[d]==="undefined"||["authorization","Authorization"].includes(d)&&l[d]?.includes("undefined"))&&delete l[d];let f=await Yh(u,t,{httpsProxy:n.configService.getHttpsProxy(),...e,headers:JSON.parse(JSON.stringify(l))},a,n.log);if(!f.ok){let d=await f.text(),p,y=f.headers.get("retry-after");if(y)p={"Retry-After":y};else if(f.status===429)try{let A=JSON.parse(d),g=A?.error?.details||A?.details;if(Array.isArray(g)){let C=g.find(b=>b["@type"]==="type.googleapis.com/google.rpc.RetryInfo");if(C?.retryDelay){let b=parseInt(C.retryDelay,10);isNaN(b)||(p={"Retry-After":b.toString()})}}}catch{}try{let A=JSON.parse(d);n.log.error({error:A,status:f.status,provider:r.name,model:t.model},`[provider_response_error] ${r.name},${t.model}: ${A?.error?.message||d}`)}catch{n.log.error({errorText:d,status:f.status,provider:r.name,model:t.model},`[provider_response_error] ${r.name},${t.model}: ${d}`)}throw it(`Error from provider(${r.name},${t.model}: ${f.status}): ${d}`,f.status,"provider_response_error","api_error",p)}return f}async function ep(t,e,r,n,o,s){let a=e,u=o||r.transformer?.passthrough;if(!o&&r.transformer?.use?.length)for(let l of Array.from(r.transformer.use).reverse())!l||typeof l.transformResponseOut!="function"||(a=await l.transformResponseOut(a,s));if(!o&&r.transformer?.[t.model]?.use?.length)for(let l of Array.from(r.transformer[t.model].use).reverse())!l||typeof l.transformResponseOut!="function"||(a=await l.transformResponseOut(a,s));return!u&&n.transformResponseIn&&(a=await n.transformResponseIn(a,s)),a}async function tp(t,e,r){if(t.ok||e.code(t.status),r.stream===!0&&t.ok)return e.header("Content-Type","text/event-stream"),e.header("Cache-Control","no-cache"),e.header("Connection","keep-alive"),t.body&&typeof t.body.getReader=="function"?e.send(uw.fromWeb(t.body)):e.send(t.body);{let o=await t.json();return e.send(o)}}var bc=async t=>{t.get("/",async()=>({message:"LLMs API",version:Xh})),t.get("/health",async()=>({status:"ok",timestamp:new Date().toISOString()}));let e=t.transformerService.getTransformersWithEndpoint();for(let{transformer:r}of e)r.endPoint&&t.post(r.endPoint,async(n,o)=>cw(n,o,t,r));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(r,n)=>{let{name:o,baseUrl:s,apiKey:a,models:u}=r.body;if(!o?.trim())throw it("Provider name is required",400,"invalid_request");if(!s||!dw(s))throw it("Valid base URL is required",400,"invalid_request");if(!a?.trim())throw it("API key is required",400,"invalid_request");if(!u||!Array.isArray(u)||u.length===0)throw it("At least one model is required",400,"invalid_request");if(t.providerService.getProvider(r.body.name))throw it(`Provider with name '${r.body.name}' already exists`,400,"provider_exists");return t.providerService.registerProvider(r.body)}),t.get("/providers",async()=>t.providerService.getProviders()),t.get("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async r=>{let n=t.providerService.getProvider(r.params.id);if(!n)throw it("Provider not found",404,"provider_not_found");return n}),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(r,n)=>{let o=t.providerService.updateProvider(r.params.id,r.body);if(!o)throw it("Provider not found",404,"provider_not_found");return o}),t.delete("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async r=>{if(!t.providerService.deleteProvider(r.params.id))throw it("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(r,n)=>{if(!t.providerService.toggleProvider(r.params.id,r.body.enabled))throw it("Provider not found",404,"provider_not_found");return{message:`Provider ${r.body.enabled?"enabled":"disabled"} successfully`}})};function dw(t){try{return new URL(t),!0}catch{return!1}}var Bn=class{constructor(e,r,n){this.configService=e;this.transformerService=r;this.logger=n;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(r=>{try{if(!r.name||!r.api_base_url||!r.api_key)return;let n={};r.transformer&&Object.keys(r.transformer).forEach(o=>{o==="use"?Array.isArray(r.transformer.use)&&(n.use=r.transformer.use.map(s=>{if(Array.isArray(s)&&typeof s[0]=="string"){let a=this.transformerService.getTransformer(s[0]);if(a)return this.attachTransformerLogger(new a(s[1]))}if(typeof s=="string"){let a=this.transformerService.getTransformer(s);return typeof a=="function"?this.attachTransformerLogger(new a):this.attachTransformerLogger(a)}}).filter(s=>typeof s<"u")):o==="passthrough"?n.passthrough=r.transformer.passthrough:Array.isArray(r.transformer[o]?.use)&&(n[o]={use:r.transformer[o].use.map(s=>{if(Array.isArray(s)&&typeof s[0]=="string"){let a=this.transformerService.getTransformer(s[0]);if(a)return this.attachTransformerLogger(new a(s[1]))}if(typeof s=="string"){let a=this.transformerService.getTransformer(s);return typeof a=="function"?this.attachTransformerLogger(new a):this.attachTransformerLogger(a)}}).filter(s=>typeof s<"u")})}),this.registerProvider({name:r.name,baseUrl:r.api_base_url,apiKey:r.api_key,models:r.models||[],transformer:r.transformer?n:void 0}),this.logger.info(`${r.name} provider registered`)}catch(n){this.logger.error(`${r.name} provider registered error: ${n}`)}})}attachTransformerLogger(e){return e&&typeof e=="object"&&(e.logger=this.logger),e}registerProvider(e){let r={...e};return this.providers.set(r.name,r),e.models.forEach(n=>{let o=`${r.name},${n}`,s={provider:r.name,model:n,fullModel:o};this.modelRoutes.set(o,s),this.modelRoutes.has(n)||this.modelRoutes.set(n,s)}),r}getProviders(){return Array.from(this.providers.values())}getProvider(e){return this.providers.get(e)}updateProvider(e,r){let n=this.providers.get(e);if(!n)return null;let o={...n,...r,updatedAt:new Date};return this.providers.set(e,o),r.models&&(n.models.forEach(s=>{let a=`${n.name},${s}`;this.modelRoutes.delete(a),this.modelRoutes.delete(s)}),r.models.forEach(s=>{let a=`${n.name},${s}`,u={provider:n.name,model:s,fullModel:a};this.modelRoutes.set(a,u),this.modelRoutes.has(s)||this.modelRoutes.set(s,u)})),o}deleteProvider(e){let r=this.providers.get(e);return r?(r.models.forEach(n=>{let o=`${r.name},${n}`;this.modelRoutes.delete(o),this.modelRoutes.delete(n)}),this.providers.delete(e),!0):!1}toggleProvider(e,r){return!!this.providers.get(e)}resolveModelRoute(e){let r=this.modelRoutes.get(e);if(!r)return null;let n=this.providers.get(r.provider);return n?{provider:n,originalModel:e,targetModel:r.model}:null}getAvailableModelNames(){let e=[];return this.providers.forEach(r=>{r.models.forEach(n=>{e.push(n),e.push(`${r.name},${n}`)})}),e}getModelRoutes(){return Array.from(this.modelRoutes.values())}parseTransformerConfig(e){return e?Array.isArray(e)?e.reduce((r,n)=>{if(Array.isArray(n)){let[o,s={}]=n;r[o]=s}else r[n]={};return r},{}):e:{}}async getAvailableModels(){let e=[];return this.providers.forEach(r=>{r.models.forEach(n=>{e.push({id:n,object:"model",owned_by:r.name,provider:r.name}),e.push({id:`${r.name},${n}`,object:"model",owned_by:r.name,provider:r.name})})}),{object:"list",data:e}}};var Ke=[];for(let t=0;t<256;++t)Ke.push((t+256).toString(16).slice(1));function rp(t,e=0){return(Ke[t[e+0]]+Ke[t[e+1]]+Ke[t[e+2]]+Ke[t[e+3]]+"-"+Ke[t[e+4]]+Ke[t[e+5]]+"-"+Ke[t[e+6]]+Ke[t[e+7]]+"-"+Ke[t[e+8]]+Ke[t[e+9]]+"-"+Ke[t[e+10]]+Ke[t[e+11]]+Ke[t[e+12]]+Ke[t[e+13]]+Ke[t[e+14]]+Ke[t[e+15]]).toLowerCase()}import{randomFillSync as hw}from"crypto";var oi=new Uint8Array(256),ni=oi.length;function Cc(){return ni>oi.length-16&&(hw(oi),ni=0),oi.slice(ni,ni+=16)}import{randomUUID as pw}from"crypto";var wc={randomUUID:pw};function gw(t,e,r){if(wc.randomUUID&&!e&&!t)return wc.randomUUID();t=t||{};let n=t.random??t.rng?.()??Cc();if(n.length<16)throw new Error("Random bytes length must be >= 16");if(n[6]=n[6]&15|64,n[8]=n[8]&63|128,e){if(r=r||0,r<0||r+16>e.length)throw new RangeError(`UUID byte range ${r}:${r+15} is out of buffer bounds`);for(let o=0;o<16;++o)e[r+o]=n[o];return e}return rp(n)}var Yt=gw;var np=(t,e)=>(t.includes("base64")&&(t=t.split("base64").pop(),t.startsWith(",")&&(t=t.slice(1))),`data:${e};base64,${t}`);var jn=class{constructor(e){this.options=e;this.useBearer=this.options?.UseBearer??!1}name="Anthropic";endPoint="/v1/messages";useBearer;logger;async auth(e,r){let n={};return this.useBearer?(n.authorization=`Bearer ${r.apiKey}`,n["x-api-key"]=void 0):(n["x-api-key"]=r.apiKey,n.authorization=void 0),{body:e,config:{headers:n}}}async transformRequestOut(e,r){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 u=e.system.filter(l=>l.type==="text"&&l.text).map(l=>({type:"text",text:l.text,cache_control:l.cache_control}));n.push({role:"system",content:u})}}JSON.parse(JSON.stringify(e.messages||[]))?.forEach(u=>{if(u.role==="user"||u.role==="assistant"){if(typeof u.content=="string"){n.push({role:u.role,content:u.content});return}if(Array.isArray(u.content)){if(u.role==="user"){let l=u.content.filter(d=>d.type==="tool_result"&&d.tool_use_id);l.length&&l.forEach(d=>{let p={role:"tool",content:typeof d.content=="string"?d.content:Array.isArray(d.content)&&d.content.filter(y=>y.type==="text"&&y.text).map(y=>y.text).join(`
|
|
73
|
+
`+t.stack:""),type:t.type||"api_error",code:t.code||"internal_error"}};return t.headers&&r.headers(t.headers),r.header("Content-Type","application/json"),r.code(n).send(o)}import{Readable as uw}from"stream";import{ProxyAgent as iw}from"undici";function Yh(t,e,r,n,o){let s=new Headers({"Content-Type":"application/json"});r.headers&&Object.entries(r.headers).forEach(([f,d])=>{d&&s.set(f,d)});let a,u=AbortSignal.timeout(r.TIMEOUT??60*1e3*60);if(r.signal){let f=new AbortController,d=()=>f.abort();r.signal.addEventListener("abort",d),u.addEventListener("abort",d),a=f.signal}else a=u;let l={method:"POST",headers:s,body:JSON.stringify(e),signal:a};return r.httpsProxy&&(l.dispatcher=new iw(new URL(r.httpsProxy).toString())),o?.debug({reqId:n.req.id,request:l,headers:Object.fromEntries(s.entries()),requestUrl:typeof t=="string"?t:t.toString(),useProxy:r.httpsProxy},"final request"),fetch(typeof t=="string"?t:t.toString(),l)}var Xh="1.0.55";async function cw(t,e,r,n){let o=t.body,s=t.provider,a=r.providerService.getProvider(s);if(!a)throw it(`Provider '${s}' not found`,404,"provider_not_found");try{let{requestBody:u,config:l,bypass:f}=await Qh(o,a,n,t.headers,{req:t,provider:a}),d=await Zh(u,l,a,r,f,n,{req:t}),p=await ep(u,d,a,n,f,{req:t});return await tp(p,e,o)}catch(u){if(u.code==="provider_response_error"){let l=await lw(t,e,r,n,u);if(l)return l}throw u}}async function lw(t,e,r,n,o){let s=t.scenarioType||"default",a=r.configService.get("fallback");if(!a||!a[s])return null;let u=a[s];if(!Array.isArray(u)||u.length===0)return null;t.log.warn(`Request failed for ${t.scenarioType}, trying ${u.length} fallback models`);for(let l of u)try{t.log.info(`Trying fallback model: ${l}`);let f={...t.body},[d,...p]=l.split(",");f.model=p.join(",");let y={...t,provider:d,body:f},A=r.providerService.getProvider(d);if(!A){t.log.warn(`Fallback provider '${d}' not found, skipping`);continue}let{requestBody:g,config:C,bypass:b}=await Qh(f,A,n,t.headers,{req:y,provider:A}),m=await Zh(g,C,A,r,b,n,{req:y}),v=await ep(g,m,A,n,b,{req:y});return t.log.info(`Fallback model ${l} succeeded`),await tp(v,e,f)}catch(f){t.log.warn(`Fallback model ${l} failed: ${f.message}`);continue}return t.log.error(`All fallback models failed for yichu ${s}`),null}async function Qh(t,e,r,n,o){let s=t,a={},u=!1;u=fw(e,r,t);let l=u||e.transformer?.passthrough;if(u&&(n instanceof Headers?n.delete("content-length"):delete n["content-length"],a.headers=n),!l&&typeof r.transformRequestOut=="function"){let f=await r.transformRequestOut(s,o);f.body?(s=f.body,a=f.config||{}):s=f}if(!u&&e.transformer?.use?.length)for(let f of e.transformer.use){if(!f||typeof f.transformRequestIn!="function")continue;let d=await f.transformRequestIn(s,e,o);d.body?(s=d.body,a={...a,...d.config}):s=d}if(!u&&e.transformer?.[t.model]?.use?.length)for(let f of e.transformer[t.model].use){if(!f||typeof f.transformRequestIn!="function")continue;let d=await f.transformRequestIn(s,e,o);d.body?(s=d.body,a={...a,...d.config}):s=d}return{requestBody:s,config:a,bypass:u}}function fw(t,e,r){return t.transformer?.use?.length===1&&t.transformer.use[0].name===e.name&&(!t.transformer?.[r.model]?.use.length||t.transformer?.[r.model]?.use.length===1&&t.transformer?.[r.model]?.use[0].name===e.name)}async function Zh(t,e,r,n,o,s,a){if(e?.__providerResponse)return e.__providerResponse;let u=e.url||new URL(r.baseUrl);if((o||r.transformer?.passthrough)&&typeof s.auth=="function"){let d=await s.auth(t,r);if(d.body){t=d.body;let p=e.headers||{};d.config?.headers&&(p={...p,...d.config.headers},delete p.host,delete d.config.headers),e={...e,...d.config,headers:p}}else t=d}let l={Authorization:`Bearer ${r.apiKey}`,...e?.headers||{}};l["x-api-key"]&&delete l.Authorization;for(let d in l)(l[d]==="undefined"||["authorization","Authorization"].includes(d)&&l[d]?.includes("undefined"))&&delete l[d];let f=await Yh(u,t,{httpsProxy:n.configService.getHttpsProxy(),...e,headers:JSON.parse(JSON.stringify(l))},a,n.log);if(!f.ok){let d=await f.text(),p,y=f.headers.get("retry-after");if(y)p={"Retry-After":y};else if(f.status===429)try{let A=JSON.parse(d),g=A?.error?.details||A?.details;if(Array.isArray(g)){let C=g.find(b=>b["@type"]==="type.googleapis.com/google.rpc.RetryInfo");if(C?.retryDelay){let b=parseInt(C.retryDelay,10);isNaN(b)||(p={"Retry-After":b.toString()})}}}catch{}try{let A=JSON.parse(d);n.log.error({error:A,status:f.status,provider:r.name,model:t.model},`[provider_response_error] ${r.name},${t.model}: ${A?.error?.message||d}`)}catch{n.log.error({errorText:d,status:f.status,provider:r.name,model:t.model},`[provider_response_error] ${r.name},${t.model}: ${d}`)}throw it(`Error from provider(${r.name},${t.model}: ${f.status}): ${d}`,f.status,"provider_response_error","api_error",p)}return f}async function ep(t,e,r,n,o,s){let a=e,u=o||r.transformer?.passthrough;if(!o&&r.transformer?.use?.length)for(let l of Array.from(r.transformer.use).reverse())!l||typeof l.transformResponseOut!="function"||(a=await l.transformResponseOut(a,s));if(!o&&r.transformer?.[t.model]?.use?.length)for(let l of Array.from(r.transformer[t.model].use).reverse())!l||typeof l.transformResponseOut!="function"||(a=await l.transformResponseOut(a,s));return!u&&n.transformResponseIn&&(a=await n.transformResponseIn(a,s)),a}async function tp(t,e,r){if(t.ok||e.code(t.status),r.stream===!0&&t.ok)return e.header("Content-Type","text/event-stream"),e.header("Cache-Control","no-cache"),e.header("Connection","keep-alive"),t.body&&typeof t.body.getReader=="function"?e.send(uw.fromWeb(t.body)):e.send(t.body);{let o=await t.json();return e.send(o)}}var bc=async t=>{t.get("/",async()=>({message:"LLMs API",version:Xh})),t.get("/health",async()=>({status:"ok",timestamp:new Date().toISOString()}));let e=t.transformerService.getTransformersWithEndpoint();for(let{transformer:r}of e)r.endPoint&&t.post(r.endPoint,async(n,o)=>cw(n,o,t,r));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(r,n)=>{let{name:o,baseUrl:s,apiKey:a,models:u}=r.body;if(!o?.trim())throw it("Provider name is required",400,"invalid_request");if(!s||!dw(s))throw it("Valid base URL is required",400,"invalid_request");if(!a?.trim())throw it("API key is required",400,"invalid_request");if(!u||!Array.isArray(u)||u.length===0)throw it("At least one model is required",400,"invalid_request");if(t.providerService.getProvider(r.body.name))throw it(`Provider with name '${r.body.name}' already exists`,400,"provider_exists");return t.providerService.registerProvider(r.body)}),t.get("/providers",async()=>t.providerService.getProviders()),t.get("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async r=>{let n=t.providerService.getProvider(r.params.id);if(!n)throw it("Provider not found",404,"provider_not_found");return n}),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(r,n)=>{let o=t.providerService.updateProvider(r.params.id,r.body);if(!o)throw it("Provider not found",404,"provider_not_found");return o}),t.delete("/providers/:id",{schema:{params:{type:"object",properties:{id:{type:"string"}},required:["id"]}}},async r=>{if(!t.providerService.deleteProvider(r.params.id))throw it("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(r,n)=>{if(!t.providerService.toggleProvider(r.params.id,r.body.enabled))throw it("Provider not found",404,"provider_not_found");return{message:`Provider ${r.body.enabled?"enabled":"disabled"} successfully`}})};function dw(t){try{return new URL(t),!0}catch{return!1}}var Bn=class{constructor(e,r,n){this.configService=e;this.transformerService=r;this.logger=n;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(r=>{try{if(!r.name||!r.api_base_url||!r.api_key)return;let n={};r.transformer&&Object.keys(r.transformer).forEach(o=>{o==="use"?Array.isArray(r.transformer.use)&&(n.use=r.transformer.use.map(s=>{if(Array.isArray(s)&&typeof s[0]=="string"){let a=this.transformerService.getTransformer(s[0]);if(a)return this.attachTransformerLogger(new a(s[1]))}if(typeof s=="string"){let a=this.transformerService.getTransformer(s);return typeof a=="function"?this.attachTransformerLogger(new a):this.attachTransformerLogger(a)}}).filter(s=>typeof s<"u")):o==="passthrough"?n.passthrough=r.transformer.passthrough:Array.isArray(r.transformer[o]?.use)&&(n[o]={use:r.transformer[o].use.map(s=>{if(Array.isArray(s)&&typeof s[0]=="string"){let a=this.transformerService.getTransformer(s[0]);if(a)return this.attachTransformerLogger(new a(s[1]))}if(typeof s=="string"){let a=this.transformerService.getTransformer(s);return typeof a=="function"?this.attachTransformerLogger(new a):this.attachTransformerLogger(a)}}).filter(s=>typeof s<"u")})}),this.registerProvider({name:r.name,baseUrl:r.api_base_url,apiKey:r.api_key,models:r.models||[],transformer:r.transformer?n:void 0}),this.logger.info(`${r.name} provider registered`)}catch(n){this.logger.error(`${r.name} provider registered error: ${n}`)}})}attachTransformerLogger(e){return e&&typeof e=="object"&&(e.logger=this.logger),e}registerProvider(e){let r={...e};return this.providers.set(r.name,r),e.models.forEach(n=>{let o=`${r.name},${n}`,s={provider:r.name,model:n,fullModel:o};this.modelRoutes.set(o,s),this.modelRoutes.has(n)||this.modelRoutes.set(n,s)}),r}getProviders(){return Array.from(this.providers.values())}getProvider(e){return this.providers.get(e)}updateProvider(e,r){let n=this.providers.get(e);if(!n)return null;let o={...n,...r,updatedAt:new Date};return this.providers.set(e,o),r.models&&(n.models.forEach(s=>{let a=`${n.name},${s}`;this.modelRoutes.delete(a),this.modelRoutes.delete(s)}),r.models.forEach(s=>{let a=`${n.name},${s}`,u={provider:n.name,model:s,fullModel:a};this.modelRoutes.set(a,u),this.modelRoutes.has(s)||this.modelRoutes.set(s,u)})),o}deleteProvider(e){let r=this.providers.get(e);return r?(r.models.forEach(n=>{let o=`${r.name},${n}`;this.modelRoutes.delete(o),this.modelRoutes.delete(n)}),this.providers.delete(e),!0):!1}toggleProvider(e,r){return!!this.providers.get(e)}resolveModelRoute(e){let r=this.modelRoutes.get(e);if(!r)return null;let n=this.providers.get(r.provider);return n?{provider:n,originalModel:e,targetModel:r.model}:null}getAvailableModelNames(){let e=[];return this.providers.forEach(r=>{r.models.forEach(n=>{e.push(n),e.push(`${r.name},${n}`)})}),e}getModelRoutes(){return Array.from(this.modelRoutes.values())}parseTransformerConfig(e){return e?Array.isArray(e)?e.reduce((r,n)=>{if(Array.isArray(n)){let[o,s={}]=n;r[o]=s}else r[n]={};return r},{}):e:{}}async getAvailableModels(){let e=[];return this.providers.forEach(r=>{r.models.forEach(n=>{e.push({id:n,object:"model",owned_by:r.name,provider:r.name}),e.push({id:`${r.name},${n}`,object:"model",owned_by:r.name,provider:r.name})})}),{object:"list",data:e}}};var Ke=[];for(let t=0;t<256;++t)Ke.push((t+256).toString(16).slice(1));function rp(t,e=0){return(Ke[t[e+0]]+Ke[t[e+1]]+Ke[t[e+2]]+Ke[t[e+3]]+"-"+Ke[t[e+4]]+Ke[t[e+5]]+"-"+Ke[t[e+6]]+Ke[t[e+7]]+"-"+Ke[t[e+8]]+Ke[t[e+9]]+"-"+Ke[t[e+10]]+Ke[t[e+11]]+Ke[t[e+12]]+Ke[t[e+13]]+Ke[t[e+14]]+Ke[t[e+15]]).toLowerCase()}import{randomFillSync as hw}from"crypto";var oi=new Uint8Array(256),ni=oi.length;function Cc(){return ni>oi.length-16&&(hw(oi),ni=0),oi.slice(ni,ni+=16)}import{randomUUID as pw}from"crypto";var wc={randomUUID:pw};function gw(t,e,r){if(wc.randomUUID&&!e&&!t)return wc.randomUUID();t=t||{};let n=t.random??t.rng?.()??Cc();if(n.length<16)throw new Error("Random bytes length must be >= 16");if(n[6]=n[6]&15|64,n[8]=n[8]&63|128,e){if(r=r||0,r<0||r+16>e.length)throw new RangeError(`UUID byte range ${r}:${r+15} is out of buffer bounds`);for(let o=0;o<16;++o)e[r+o]=n[o];return e}return rp(n)}var Yt=gw;var np=(t,e)=>(t.includes("base64")&&(t=t.split("base64").pop(),t.startsWith(",")&&(t=t.slice(1))),`data:${e};base64,${t}`);var jn=class{constructor(e){this.options=e;this.useBearer=this.options?.UseBearer??!1}name="Anthropic";endPoint="/v1/messages";useBearer;logger;async auth(e,r){let n={};return this.useBearer?(n.authorization=`Bearer ${r.apiKey}`,n["x-api-key"]=void 0):(n["x-api-key"]=r.apiKey,n.authorization=void 0),{body:e,config:{headers:n}}}async transformRequestOut(e,r){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 u=e.system.filter(l=>l.type==="text"&&l.text).map(l=>({type:"text",text:l.text,cache_control:l.cache_control}));n.push({role:"system",content:u})}}JSON.parse(JSON.stringify(e.messages||[]))?.forEach(u=>{if(u.role==="user"||u.role==="assistant"){if(typeof u.content=="string"){n.push({role:u.role,content:u.content});return}if(Array.isArray(u.content)){if(u.role==="user"){let l=u.content.filter(d=>d.type==="tool_result"&&d.tool_use_id);l.length&&l.forEach(d=>{let p={role:"tool",content:typeof d.content=="string"?d.content:Array.isArray(d.content)&&d.content.filter(y=>y.type==="text"&&y.text).map(y=>y.text).join(`
|
|
74
74
|
`)||JSON.stringify(d.content),tool_call_id:d.tool_use_id,cache_control:d.cache_control};n.push(p)});let f=u.content.filter(d=>d.type==="text"&&d.text||d.type==="image"&&d.source);f.length&&n.push({role:"user",content:f.map(d=>d?.type==="image"?{type:"image_url",image_url:{url:d.source?.type==="base64"?np(d.source.data,d.source.media_type):d.source.url},media_type:d.source.media_type}:d)})}else if(u.role==="assistant"){let l={role:"assistant",content:""},f=u.content.filter(y=>y.type==="text"&&y.text);f.length&&(l.content=f.map(y=>y.text).join(`
|
|
75
75
|
`));let d=u.content.filter(y=>y.type==="tool_use"&&y.id);d.length&&(l.tool_calls=d.map(y=>({id:y.id,type:"function",function:{name:y.name,arguments:JSON.stringify(y.input||{})}})));let p=u.content.find(y=>y.type==="thinking"&&y.signature);p&&(l.thinking={content:p.thinking,signature:p.signature}),n.push(l)}return}}});let s={messages:n,model:e.model,max_tokens:e.max_tokens,temperature:e.temperature,stream:e.stream,tools:e.tools?.length?this.convertAnthropicToolsToUnified(e.tools):void 0,tool_choice:e.tool_choice};return e.thinking&&(s.reasoning={effort:e.output_config?.effort||e.effort,enabled:e.thinking.type==="enabled"||e.thinking.type==="adaptive"}),Array.isArray(r?.provider?.transformer?.use)&&r.provider.transformer.use.some(u=>u?.name==="claude-auth")&&(e.thinking&&(s.anthropic_thinking=e.thinking),e.output_config&&(s.anthropic_output_config=e.output_config),e.metadata&&(s.anthropic_metadata=e.metadata),e.stop_sequences&&(s.anthropic_stop_sequences=e.stop_sequences)),e.tool_choice&&(e.tool_choice.type==="tool"?s.tool_choice={type:"function",function:{name:e.tool_choice.name}}:s.tool_choice=e.tool_choice.type),s}async transformResponseIn(e,r){if(e.headers.get("Content-Type")?.includes("text/event-stream")){if(!e.body)throw new Error("Stream response body is null");let o=await this.convertOpenAIStreamToAnthropic(e.body,r);return new Response(o,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}else{let o=await e.json(),s=this.convertOpenAIResponseToAnthropic(o,r);return new Response(JSON.stringify(s),{headers:{"Content-Type":"application/json"}})}}static buildAnthropicBody(e,r){let n;e.system&&(typeof e.system=="string"?n=e.system:Array.isArray(e.system)&&e.system.length&&(n=e.system.map(l=>({type:"text",text:l.text,...l.cache_control?{cache_control:l.cache_control}:{}}))));let o=[];for(let l of e.messages){if(l.role==="system"){if(!n){if(typeof l.content=="string")n=l.content;else if(Array.isArray(l.content)){let f=l.content.filter(d=>d.type==="text"&&d.text);f.length===1&&!f[0].cache_control?n=f[0].text:f.length>0&&(n=f.map(d=>({type:"text",text:d.text,...d.cache_control?{cache_control:d.cache_control}:{}})))}}continue}if(l.role==="tool"){let f={type:"tool_result",tool_use_id:l.tool_call_id,content:typeof l.content=="string"?l.content:JSON.stringify(l.content)},d=o[o.length-1];d?.role==="user"&&Array.isArray(d.content)?d.content.push(f):o.push({role:"user",content:[f]});continue}if(l.role==="assistant"){let f=[];if(l.thinking&&f.push({type:"thinking",thinking:l.thinking.content,signature:l.thinking.signature}),typeof l.content=="string"&&l.content&&f.push({type:"text",text:l.content}),l.tool_calls?.length)for(let d of l.tool_calls){let p={};try{p=JSON.parse(d.function.arguments||"{}")}catch(y){(r?.error??console.error)("Failed to parse tool_call arguments for tool '%s': %s",d.function.name,y)}f.push({type:"tool_use",id:d.id,name:d.function.name,input:p})}f.length>0&&o.push({role:"assistant",content:f});continue}if(l.role==="user"){let f=[];if(typeof l.content=="string")f.push({type:"text",text:l.content});else if(Array.isArray(l.content)){for(let d of l.content)if(d.type==="text"&&d.text)f.push({type:"text",text:d.text,...d.cache_control?{cache_control:d.cache_control}:{}});else if(d.type==="image_url"&&d.image_url?.url){let p=d.image_url.url;if(p.startsWith("data:")){let[y,A]=p.split(","),g=y.split(":")[1]?.split(";")[0]??"image/jpeg";f.push({type:"image",source:{type:"base64",media_type:g,data:A}})}else f.push({type:"image",source:{type:"url",url:p}})}}f.length>0&&o.push({role:"user",content:f});continue}}let s;e.tools?.length&&(s=e.tools.map(l=>({name:l.function.name,description:l.function.description||"",input_schema:l.function.parameters})));let a;if(e.tool_choice){let l=e.tool_choice;l==="auto"?a={type:"auto"}:l==="required"?a={type:"any"}:typeof l=="string"?a={type:"tool",name:l}:l.type==="function"&&(a={type:"tool",name:l.function?.name})}let u={model:e.model,max_tokens:e.max_tokens??8192,messages:o,stream:e.stream??!0};return n!==void 0&&(u.system=n),e.temperature!==void 0&&(u.temperature=e.temperature),e.tool_choice!=="none"&&s?.length&&(u.tools=s),e.tool_choice!=="none"&&a&&(u.tool_choice=a),e.anthropic_thinking&&(u.thinking=e.anthropic_thinking),e.anthropic_output_config&&(u.output_config=e.anthropic_output_config),e.anthropic_metadata&&(u.metadata=e.anthropic_metadata),e.anthropic_stop_sequences&&(u.stop_sequences=e.anthropic_stop_sequences),u}convertAnthropicToolsToUnified(e){return e.map(r=>({type:"function",function:{name:r.name,description:r.description||"",parameters:r.input_schema}}))}async convertOpenAIStreamToAnthropic(e,r){return new ReadableStream({start:async o=>{let s=new TextEncoder,a=`msg_${Date.now()}`,u=null,l="unknown",f=!1,d=!1,p=!1,y=new Map,A=new Map,g=0,C=0,b=0,m=!1,v=!1,k=0,S=-1,T=0,O=()=>{let Y=k;return k++,Y},N=Y=>{if(!m)try{o.enqueue(Y);let X=new TextDecoder().decode(Y);this.logger.debug({reqId:r.req.id,data:X,type:"send data"})}catch(X){if(X instanceof TypeError&&X.message.includes("Controller is already closed"))m=!0;else throw this.logger.debug({reqId:r.req.id,error:X instanceof Error?X.message:String(X),type:"send data error"}),X}},q=()=>{if(!m)try{if(S>=0){let X={type:"content_block_stop",index:S};N(s.encode(`event: content_block_stop
|
|
76
76
|
data: ${JSON.stringify(X)}
|