xling 0.9.4 → 0.9.6

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.
@@ -1,4 +1,4 @@
1
- import{c as e,u as t}from"../../validators-C8tI-QBw.js";import"../../errors-Bjek6jHm.js";import"../../editor-BfE8c36f.js";import"../../config-FuKh2Fd0.js";import"../../fsStore-DVJLVT4G.js";import"../../base-CEyMUsWC.js";import"../../template-DD8Cc4Zo.js";import"../../xling-BReZTlb3.js";import"../../loadBalancer-DUCjd5HG.js";import"../../errorClassifier-CXL0O9lB.js";import"../../transformer-CKTY0r0_.js";import{n,t as r}from"../../server-BlnCdJPS.js";import{Command as i,Flags as a}from"@oclif/core";var o=class o extends i{static summary=`Start an OpenAI-compatible proxy server with load balancing and key rotation`;static description=`Boot a local proxy server that forwards requests to configured upstream AI providers.
1
+ import{c as e,u as t}from"../../validators-C8tI-QBw.js";import"../../errors-Bjek6jHm.js";import"../../editor-BfE8c36f.js";import"../../config-FuKh2Fd0.js";import"../../fsStore-DVJLVT4G.js";import"../../base-CEyMUsWC.js";import"../../template-DD8Cc4Zo.js";import"../../xling-BReZTlb3.js";import"../../loadBalancer-DUCjd5HG.js";import"../../errorClassifier-CXL0O9lB.js";import"../../transformer-CzbwQ7xm.js";import{a as n,t as r}from"../../server-DtVPi9M6.js";import{Command as i,Flags as a}from"@oclif/core";var o=class o extends i{static summary=`Start an OpenAI-compatible proxy server with load balancing and key rotation`;static description=`Boot a local proxy server that forwards requests to configured upstream AI providers.
2
2
 
3
3
  Features:
4
4
  - OpenAI-compatible API endpoints (/v1/chat/completions, /v1/messages, etc.)
@@ -1 +1 @@
1
- import{Command as e}from"@oclif/core";var t=`0.9.4`,n=class extends e{static summary=`Show the current xling version`;static description=`Displays the version from package.json.`;static examples=[{description:`Print the installed CLI version`,command:`<%= config.bin %> <%= command.id %>`},{description:`Shortcut using the built-in flag`,command:`<%= config.bin %> --version`}];async run(){this.log(t??`unknown`)}};export{n as default};
1
+ import{Command as e}from"@oclif/core";var t=`0.9.6`,n=class extends e{static summary=`Show the current xling version`;static description=`Displays the version from package.json.`;static examples=[{description:`Print the installed CLI version`,command:`<%= config.bin %> <%= command.id %>`},{description:`Shortcut using the built-in flag`,command:`<%= config.bin %> --version`}];async run(){this.log(t??`unknown`)}};export{n as default};
@@ -0,0 +1,27 @@
1
+ import { m as ProviderConfig } from "./config-CZ03ghwF.js";
2
+ import { c as ProxyServerContext, l as ProxyServerOptions } from "./types-BUZTxIIw.js";
3
+ import { t as ProxyLoadBalancer } from "./loadBalancer-CvpnwHns.js";
4
+
5
+ //#region src/services/proxy/server.d.ts
6
+ declare const DEFAULT_PROXY_PORT = 4320;
7
+ /**
8
+ * Start the proxy server
9
+ */
10
+ declare function startProxyServer(options?: ProxyServerOptions): Promise<ProxyServerContext>;
11
+ /**
12
+ * Check whether a provider model is compatible with the requested model.
13
+ * Supports both directions so versioned aliases still match (e.g. foo-2025
14
+ * matches foo and foo matches foo-2025).
15
+ */
16
+ declare function providerSupportsModel(provider: ProviderConfig, model: string): boolean;
17
+ /**
18
+ * Map model name using modelMapping config
19
+ * Supports exact match, prefix match (claude-* -> gpt-4o), and wildcard (*)
20
+ */
21
+ declare function mapModel(model: string | undefined, mapping?: Record<string, string>, defaultModel?: string, providers?: ProviderConfig[]): string | undefined;
22
+ /**
23
+ * Select provider for the requested model
24
+ */
25
+ declare function selectProviderForModel(providers: ProviderConfig[], loadBalancer: ProxyLoadBalancer, model?: string): ProviderConfig | null;
26
+ //#endregion
27
+ export { startProxyServer as a, selectProviderForModel as i, mapModel as n, providerSupportsModel as r, DEFAULT_PROXY_PORT as t };
@@ -0,0 +1 @@
1
+ import{p as e}from"./config-FuKh2Fd0.js";import{m as t}from"./fsStore-DVJLVT4G.js";import{t as n}from"./xling-BReZTlb3.js";import{t as r}from"./loadBalancer-DUCjd5HG.js";import{t as i}from"./errorClassifier-CXL0O9lB.js";import{c as a,i as o,l as s,n as c,o as l,r as u,s as d,t as f}from"./transformer-CzbwQ7xm.js";import{watch as p}from"node:fs";const m=4320;function h(){return`req_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`}function g(e){if(typeof e==`string`)return e;if(typeof e==`number`||typeof e==`boolean`)return String(e);if(e==null)return``;if(typeof e==`object`)try{return JSON.stringify(e)}catch{return`[object Object]`}return typeof e==`symbol`?e.toString():typeof e==`function`?e.name||`[function]`:``}async function _(e={}){let i=new n,a=i.resolvePath(`user`),o=i.readConfig(a);if(!o.providers?.length)throw Error(`No providers configured in ~/.claude/xling.json. Add a 'providers' array.`);let s=()=>o,c=o.proxy??{},l=e.host??c.host??`127.0.0.1`,u=e.port??c.port??m,d=e.accessKey??c.accessKey,f=new r(c.loadBalance??`failover`,c.keyRotation?.cooldownMs??6e4),h=Bun.serve({hostname:l,port:u,async fetch(t){let n=new URL(t.url).pathname;if(t.method===`OPTIONS`)return new Response(null,{status:204,headers:E()});if(n===`/health`||n===`/`){let e=s();return Response.json({status:`ok`,providers:e.providers.map(e=>e.name),loadBalance:e.proxy?.loadBalance??`failover`},{headers:E()})}if(n===`/stats`)return Response.json({stats:f.getStats()},{headers:E()});if(n===`/v1/models`||n===`/models`){let e=O(s().providers);return Response.json(e,{headers:E()})}if(d){let r=t.headers.get(`authorization`)?.replace(/^Bearer\s+/i,``);if(r!==d)return e.logger&&(console.log(`[auth] Access key validation failed for path: ${n}`),console.log(`[auth] Expected: ${d.slice(0,4)}...`),console.log(`[auth] Received: ${r?r.slice(0,4)+`...`:`(none)`}`)),Response.json({error:{message:`Invalid access key`,type:`auth_error`}},{status:401,headers:E()})}return n.startsWith(`/v1/`)||n.startsWith(`/claude/`)||n.startsWith(`/openai/`)||n===`/responses`||n===`/messages`||n===`/chat/completions`?(e.logger&&console.log(`[proxy] Handling request: ${t.method} ${n}`),v(t,n,()=>{let e=s();return{providers:e.providers,modelMapping:e.proxy?.modelMapping,defaultModel:e.defaultModel,passthroughResponsesAPI:e.proxy?.passthroughResponsesAPI,keyRotation:e.proxy?.keyRotation}},f,e.logger??!0)):(e.logger&&console.log(`[proxy] 404 Not Found: ${t.method} ${n}`),Response.json({error:{message:`Not found`,type:`not_found`}},{status:404,headers:E()}))}}),g=t(a),_=null;try{_=p(g,t=>{if(t===`change`)try{let t=i.readConfig(a);t.providers?.length&&(o=t,e.logger&&console.log(`[proxy] Config reloaded`))}catch(t){e.logger&&console.error(`[proxy] Failed to reload config:`,t)}})}catch(t){e.logger&&console.warn(`[proxy] Failed to watch config file:`,t)}return{baseUrl:`http://${l}:${u}`,providers:o.providers.map(e=>e.name),models:o.providers.flatMap(e=>e.models.map(t=>`${e.name},${t}`)),server:h,shutdown:async()=>{_?.close(),await h.stop()}}}async function v(t,n,r,a,c){let u={requestId:h(),startTime:Date.now(),retryCount:0},d=n;n.startsWith(`/claude/`)?d=n.replace(`/claude`,``):n.startsWith(`/openai/`)&&(d=n.replace(`/openai`,``)),d.startsWith(`/v1/v1/`)&&(d=d.replace(`/v1/v1/`,`/v1/`));let p;if(t.headers.get(`content-type`)?.includes(`application/json`))try{p=await t.json()}catch{return Response.json({error:{message:`Invalid JSON body`,type:`invalid_request`}},{status:400,headers:E()})}let m=r(),_=o(p),v=l(p),x=p,O=!1,k=`openai`,A=b(p),j=S(A,m.modelMapping,m.defaultModel,m.providers);if(_&&p&&typeof p==`object`){let e=p;e.model=j||A,O=e.stream===!0,k=`anthropic`,x=f(e),(d===`/v1/messages`||d===`/messages`)&&(d=`/v1/chat/completions`),c&&console.log(`[${u.requestId}] Converting Anthropic -> OpenAI format (path: ${d})`)}else if(v&&p&&typeof p==`object`){let e=p;if(e.model=j||A,O=e.stream===!0,(m.passthroughResponsesAPI??[]).some(t=>t.endsWith(`*`)?String(e.model).startsWith(t.slice(0,-1)):e.model===t))k=`openai`,x=e,c&&console.log(`[${u.requestId}] Responses API passthrough (native support): model=${g(e.model)}`);else{if(k=`responses`,c){let t=g(e.model);if(console.log(`[${u.requestId}] Responses API request: stream=${O}, model=${t}`),e.tools){let t=e.tools;console.log(`[${u.requestId}] Tools count: ${t.length}`),t.slice(0,5).forEach((e,t)=>{let n=e,r=g(n.type),i=g(n.function?.name??n.name??`N/A`);console.log(`[${u.requestId}] Tool[${t}]: type=${r}, name=${i}, keys=${Object.keys(n).join(`,`)}`)})}else console.log(`[${u.requestId}] No tools in request`)}if(x=s(e),(d===`/v1/responses`||d===`/responses`)&&(d=`/v1/chat/completions`),c){console.log(`[${u.requestId}] Converting Responses API -> OpenAI format (path: ${d})`);let e=x?.tools;e?console.log(`[${u.requestId}] Converted tools count: ${e.length}`):console.log(`[${u.requestId}] No tools after conversion`)}}}else p&&typeof p==`object`&&j&&j!==A&&(p.model=j,x=p,O=p.stream===!0);let M=j,N=m.keyRotation?.enabled===!1?1:m.providers.length*2,P=null;for(;u.retryCount<N;){if(u.retryCount>0){let e=r(),t=S(A,e.modelMapping,e.defaultModel,e.providers);t!==j&&(j=t,M=t,x&&typeof x==`object`&&(x.model=t)),m=e}let n=T(m.providers,a,M);if(!n)return Response.json({error:{message:`No available providers`,type:`service_unavailable`}},{status:503,headers:E()});u.provider=n.name;let o=e(n),s=a.getProviderState(n.name),l=s?a.selectKey({...n,apiKeys:o},s):o[0];if(!l){u.retryCount++;continue}let f=o.indexOf(l);u.keyIndex=f,c&&(j&&j!==A&&console.log(`[${u.requestId}] Model mapped: ${A??`unknown`} -> ${j} (provider: ${n.name})`),console.log(`[${u.requestId}] -> ${n.name} (key ${f+1}/${o.length})`));try{let e=await y(t,n,l,d,x);if(e.ok){if(a.reportSuccess(n.name,f),c){let t=Date.now()-u.startTime;console.log(`[${u.requestId}] <- ${e.status} (${t}ms)`)}return k===`anthropic`?await C(e,A||`unknown`,O,c,u.requestId):k===`responses`?await w(e,A||`unknown`,O,c,u.requestId):D(e)}let r=await e.clone().json().catch(()=>null),o=i(e.status,r);if(a.reportError(n.name,f,o),c&&console.log(`[${u.requestId}] Error: ${o.type} - ${o.message}`),o.retryable&&m.keyRotation?.onError!==!1){u.retryCount++,P=e;continue}return D(e)}catch(e){let t=i(0,void 0,e);if(a.reportError(n.name,f,t),c&&console.log(`[${u.requestId}] Network error: ${t.message}`),t.retryable){u.retryCount++;continue}return Response.json({error:{message:t.message,type:t.type}},{status:502,headers:E()})}}return P?D(P):Response.json({error:{message:`All providers failed after retries`,type:`service_unavailable`}},{status:503,headers:E()})}async function y(e,t,n,r,i){let a=t.baseUrl.replace(/\/+$/,``),o=r;a.endsWith(`/v1`)&&r.startsWith(`/v1/`)&&(o=r.slice(3));let s=`${a}${o}`,c={"Content-Type":`application/json`,Authorization:`Bearer ${n}`};t.headers&&Object.assign(c,t.headers);for(let t of[`accept`,`accept-encoding`,`x-request-id`]){let n=e.headers.get(t);n&&(c[t]=n)}let l={method:e.method,headers:c};if(i&&e.method!==`GET`&&e.method!==`HEAD`&&(l.body=JSON.stringify(i)),t.timeout){let e=new AbortController,n=setTimeout(()=>e.abort(),t.timeout);l.signal=e.signal;try{let e=await fetch(s,l);return clearTimeout(n),e}catch(e){throw clearTimeout(n),e}}return fetch(s,l)}function b(e){if(!e||typeof e!=`object`)return;let t=e;if(typeof t.model==`string`)return t.model}function x(e,t){return e.models.some(e=>e===t||t.startsWith(e)||e.startsWith(t))}function S(e,t,n,r){if(!e)return n;if(!t||Object.keys(t).length===0)return e;if(t[e])return t[e];for(let[n,r]of Object.entries(t))if(n!==`*`&&n.endsWith(`*`)){let t=n.slice(0,-1);if(e.startsWith(t))return r}return r?.some(t=>x(t,e))?e:t[`*`]?t[`*`]:n??e}async function C(e,t,n,r,i){if(n){r&&console.log(`[${i}] Converting streaming response OpenAI -> Anthropic`);let n=u(t),a=e.body?.pipeThrough(n);return new Response(a,{status:200,headers:{...E(),"Content-Type":`text/event-stream`,"Cache-Control":`no-cache, no-transform`,Connection:`keep-alive`,"X-Accel-Buffering":`no`}})}try{let n=await e.text(),a;try{a=JSON.parse(n)}catch{r&&console.log(`[${i}] Response is not JSON, wrapping as text`),a={content:n}}r&&console.log(`[${i}] Response type: ${typeof a}, keys: ${Object.keys(a).join(`, `)}`);let o=d(a,t);return r&&console.log(`[${i}] Converted response OpenAI -> Anthropic`),Response.json(o,{status:200,headers:E()})}catch(e){return console.error(`[${i}] Response conversion failed:`,e),Response.json({type:`error`,error:{type:`api_error`,message:`Response conversion failed: ${e.message}`}},{status:500,headers:E()})}}async function w(e,t,n,r,i){if(n){r&&console.log(`[${i}] Converting streaming response OpenAI -> Responses API`);let n=c(t),a=e.body?.pipeThrough(n);return new Response(a,{status:200,headers:{...E(),"Content-Type":`text/event-stream`,"Cache-Control":`no-cache, no-transform`,Connection:`keep-alive`,"X-Accel-Buffering":`no`}})}try{let n=await e.text(),o;try{o=JSON.parse(n)}catch{r&&console.log(`[${i}] Response is not JSON, wrapping as text`),o={content:n}}r&&console.log(`[${i}] Response type: ${typeof o}, keys: ${Object.keys(o).join(`, `)}`);let s=a(o,t);return r&&console.log(`[${i}] Converted response OpenAI -> Responses API`),Response.json(s,{status:200,headers:E()})}catch(e){return console.error(`[${i}] Response conversion failed:`,e),Response.json({id:`resp_${Date.now()}`,object:`response`,created_at:Math.floor(Date.now()/1e3),model:t,output:[],status:`failed`,error:{code:`api_error`,message:`Response conversion failed: ${e.message}`}},{status:500,headers:E()})}}function T(t,n,r){let i=t.map(t=>({...t,apiKeys:e(t)}));if(r?.includes(`,`)){let[e]=r.split(`,`),t=i.find(t=>t.name===e);if(t)return t}if(r){let e=i.filter(e=>x(e,r));if(e.length>0)return n.selectProvider(e)}return n.selectProvider(i)}function E(){return{"Access-Control-Allow-Origin":`*`,"Access-Control-Allow-Methods":`GET, POST, PUT, DELETE, OPTIONS`,"Access-Control-Allow-Headers":`Content-Type, Authorization, X-Request-ID`,"Access-Control-Max-Age":`86400`}}function D(e){let t=new Headers(e.headers);for(let[e,n]of Object.entries(E()))t.set(e,n);return new Response(e.body,{status:e.status,statusText:e.statusText,headers:t})}function O(e){let t=Math.floor(Date.now()/1e3),n=[],r=new Set;for(let i of e)for(let e of i.models){let a=`${i.name},${e}`;r.has(a)||(r.add(a),n.push({id:a,object:`model`,created:t,owned_by:i.name})),r.has(e)||(r.add(e),n.push({id:e,object:`model`,created:t,owned_by:i.name}))}return{object:`list`,data:n}}export{_ as a,T as i,S as n,x as r,m as t};
@@ -2,5 +2,5 @@ import "../../config-CZ03ghwF.js";
2
2
  import { a as ProxyErrorType, c as ProxyServerContext, d as UpstreamResponse, i as ProxyError, l as ProxyServerOptions, n as LoadBalancer, r as ProviderState, s as ProxyRequestContext, t as KeyState, u as UpstreamRequestOptions } from "../../types-BUZTxIIw.js";
3
3
  import { i as shouldRotateKey, r as isRetryable, t as classifyError } from "../../errorClassifier-BGYR4YzP.js";
4
4
  import { t as ProxyLoadBalancer } from "../../loadBalancer-CvpnwHns.js";
5
- import { n as startProxyServer, t as DEFAULT_PROXY_PORT } from "../../server-Big8iXBi.js";
5
+ import { a as startProxyServer, t as DEFAULT_PROXY_PORT } from "../../server-CWmflSUF.js";
6
6
  export { DEFAULT_PROXY_PORT, type KeyState, type LoadBalancer, type ProviderState, type ProxyError, type ProxyErrorType, ProxyLoadBalancer, type ProxyRequestContext, type ProxyServerContext, type ProxyServerOptions, type UpstreamRequestOptions, type UpstreamResponse, classifyError, isRetryable, shouldRotateKey, startProxyServer };
@@ -1 +1 @@
1
- import"../../errors-Bjek6jHm.js";import"../../editor-BfE8c36f.js";import"../../config-FuKh2Fd0.js";import"../../fsStore-DVJLVT4G.js";import"../../base-CEyMUsWC.js";import"../../template-DD8Cc4Zo.js";import"../../xling-BReZTlb3.js";import{t as e}from"../../loadBalancer-DUCjd5HG.js";import{i as t,r as n,t as r}from"../../errorClassifier-CXL0O9lB.js";import"../../transformer-CKTY0r0_.js";import{n as i,t as a}from"../../server-BlnCdJPS.js";export{a as DEFAULT_PROXY_PORT,e as ProxyLoadBalancer,r as classifyError,n as isRetryable,t as shouldRotateKey,i as startProxyServer};
1
+ import"../../errors-Bjek6jHm.js";import"../../editor-BfE8c36f.js";import"../../config-FuKh2Fd0.js";import"../../fsStore-DVJLVT4G.js";import"../../base-CEyMUsWC.js";import"../../template-DD8Cc4Zo.js";import"../../xling-BReZTlb3.js";import{t as e}from"../../loadBalancer-DUCjd5HG.js";import{i as t,r as n,t as r}from"../../errorClassifier-CXL0O9lB.js";import"../../transformer-CzbwQ7xm.js";import{a as i,t as a}from"../../server-DtVPi9M6.js";export{a as DEFAULT_PROXY_PORT,e as ProxyLoadBalancer,r as classifyError,n as isRetryable,t as shouldRotateKey,i as startProxyServer};
@@ -1,4 +1,5 @@
1
1
  import "../../config-CZ03ghwF.js";
2
2
  import "../../types-BUZTxIIw.js";
3
- import { n as startProxyServer, t as DEFAULT_PROXY_PORT } from "../../server-Big8iXBi.js";
4
- export { DEFAULT_PROXY_PORT, startProxyServer };
3
+ import "../../loadBalancer-CvpnwHns.js";
4
+ import { a as startProxyServer, i as selectProviderForModel, n as mapModel, r as providerSupportsModel, t as DEFAULT_PROXY_PORT } from "../../server-CWmflSUF.js";
5
+ export { DEFAULT_PROXY_PORT, mapModel, providerSupportsModel, selectProviderForModel, startProxyServer };
@@ -1 +1 @@
1
- import"../../errors-Bjek6jHm.js";import"../../editor-BfE8c36f.js";import"../../config-FuKh2Fd0.js";import"../../fsStore-DVJLVT4G.js";import"../../base-CEyMUsWC.js";import"../../template-DD8Cc4Zo.js";import"../../xling-BReZTlb3.js";import"../../loadBalancer-DUCjd5HG.js";import"../../errorClassifier-CXL0O9lB.js";import"../../transformer-CKTY0r0_.js";import{n as e,t}from"../../server-BlnCdJPS.js";export{t as DEFAULT_PROXY_PORT,e as startProxyServer};
1
+ import"../../errors-Bjek6jHm.js";import"../../editor-BfE8c36f.js";import"../../config-FuKh2Fd0.js";import"../../fsStore-DVJLVT4G.js";import"../../base-CEyMUsWC.js";import"../../template-DD8Cc4Zo.js";import"../../xling-BReZTlb3.js";import"../../loadBalancer-DUCjd5HG.js";import"../../errorClassifier-CXL0O9lB.js";import"../../transformer-CzbwQ7xm.js";import{a as e,i as t,n,r,t as i}from"../../server-DtVPi9M6.js";export{i as DEFAULT_PROXY_PORT,n as mapModel,r as providerSupportsModel,t as selectProviderForModel,e as startProxyServer};
@@ -190,7 +190,9 @@ interface ResponsesAPIResponse {
190
190
  };
191
191
  }
192
192
  interface ResponsesAPIOutputItem {
193
+ id?: string;
193
194
  type: "message";
195
+ status?: "completed" | "in_progress";
194
196
  role: "assistant";
195
197
  content: ResponsesAPIOutputContent[];
196
198
  }
@@ -1 +1 @@
1
- import{a as e,c as t,i as n,l as r,n as i,o as a,r as o,s,t as c}from"../../transformer-CKTY0r0_.js";export{c as anthropicToOpenAIRequest,i as createResponsesAPIStreamTransformer,o as createStreamTransformer,n as isAnthropicRequest,e as isOpenAIResponse,a as isResponsesAPIRequest,s as openAIToAnthropicResponse,t as openAIToResponsesAPIResponse,r as responsesAPIToOpenAIRequest};
1
+ import{a as e,c as t,i as n,l as r,n as i,o as a,r as o,s,t as c}from"../../transformer-CzbwQ7xm.js";export{c as anthropicToOpenAIRequest,i as createResponsesAPIStreamTransformer,o as createStreamTransformer,n as isAnthropicRequest,e as isOpenAIResponse,a as isResponsesAPIRequest,s as openAIToAnthropicResponse,t as openAIToResponsesAPIResponse,r as responsesAPIToOpenAIRequest};
@@ -0,0 +1,6 @@
1
+ const e=e=>{if(typeof e==`string`)return e;if(typeof e==`number`||typeof e==`boolean`)return String(e);if(e==null)return``;if(typeof e==`object`)try{return JSON.stringify(e)}catch{return`[object Object]`}return typeof e==`symbol`?e.toString():typeof e==`function`?e.name||`[function]`:``};function t(e){let t=[];e.system&&t.push({role:`system`,content:e.system});for(let n of e.messages){let e=a(n);Array.isArray(e)?t.push(...e):e&&t.push(e)}let r={model:e.model,messages:t,stream:e.stream};return e.max_tokens&&(r.max_tokens=e.max_tokens),e.temperature!==void 0&&(r.temperature=e.temperature),e.top_p!==void 0&&(r.top_p=e.top_p),e.stop_sequences&&(r.stop=e.stop_sequences),e.tools&&e.tools.length>0&&(r.tools=n(e.tools)),e.tool_choice&&(r.tool_choice=i(e.tool_choice)),r}function n(e){return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:r(e.input_schema)}}))}function r(e){let t={...e};if(delete t.$schema,delete t.title,delete t.examples,t.properties&&typeof t.properties==`object`){let e=t.properties;for(let t of Object.keys(e))e[t]&&typeof e[t]==`object`&&(e[t]=r(e[t]),e[t].type===`string`&&delete e[t].format)}return t}function i(e){return typeof e==`string`?e===`auto`?`auto`:e===`none`?`none`:e===`any`||e===`required`?`required`:`auto`:e.type===`auto`?`auto`:e.type===`none`?`none`:e.type===`any`?`required`:e.type===`tool`&&e.name?{type:`function`,function:{name:e.name}}:`auto`}function a(e){if(typeof e.content==`string`)return{role:e.role,content:e.content};let t=[],n=[],r=[],i=[];for(let a of e.content)a.type===`text`&&a.text?t.push(a.text):a.type===`image`&&a.source?n.push({type:`image_url`,image_url:{url:`data:${a.source.media_type};base64,${a.source.data}`}}):a.type===`tool_use`?r.push(a):a.type===`tool_result`&&i.push(a);if(i.length>0)return i.map(e=>({role:`tool`,tool_call_id:e.tool_use_id||``,content:typeof e.content==`string`?e.content:JSON.stringify(e.content)}));if(e.role===`assistant`&&r.length>0){let e=r.map(e=>({id:e.id||`call_${Date.now()}`,type:`function`,function:{name:e.name||``,arguments:JSON.stringify(e.input||{})}}));return{role:`assistant`,content:t.length>0?t.join(`
2
+ `):null,tool_calls:e}}if(n.length===0)return{role:e.role,content:t.join(`
3
+ `)};let a=[];return t.length>0&&a.push({type:`text`,text:t.join(`
4
+ `)}),a.push(...n),{role:e.role,content:a}}function o(t,n){let r=t;if(r.type===`message`&&r.content)return r;let i=r.choices?.[0],a=[];if(i?.message?.content)a.push({type:`text`,text:i.message.content});else if(typeof r.content==`string`)a.push({type:`text`,text:r.content});else if(r.text)a.push({type:`text`,text:e(r.text)});else if(r.message){let t=r.message;t.content&&a.push({type:`text`,text:e(t.content)})}if(i?.message?.tool_calls&&i.message.tool_calls.length>0)for(let e of i.message.tool_calls){let t={};try{t=JSON.parse(e.function.arguments)}catch{t={raw:e.function.arguments}}a.push({type:`tool_use`,id:e.id,name:e.function.name,input:t})}a.length===0&&a.push({type:`text`,text:``});let o=`end_turn`;if(i?.finish_reason)switch(i.finish_reason){case`stop`:o=`end_turn`;break;case`length`:o=`max_tokens`;break;case`tool_calls`:o=`tool_use`;break;default:o=`end_turn`}let s=r.usage;return{id:r.id||`msg_${Date.now()}`,type:`message`,role:`assistant`,content:a,model:n,stop_reason:o,stop_sequence:null,usage:{input_tokens:s?.prompt_tokens??0,output_tokens:s?.completion_tokens??0}}}function s(e){let t=new TextDecoder,n=new TextEncoder,r=``,i=`msg_${Date.now()}`,a=0,o=!1,s=!1,l=0,u=new Map,d=!1,f=!1,p=!1,m=!1;return new TransformStream({transform(h,g){r+=t.decode(h,{stream:!0});let _=r.split(`
5
+ `);r=_.pop()||``;for(let t of _){if(!t.startsWith(`data: `))continue;let r=t.slice(6).trim();if(r===`[DONE]`){if(m||=(c(g,n,u,l),!0),!f){let e={type:`message_delta`,delta:{stop_reason:`end_turn`,stop_sequence:null},usage:{output_tokens:a}};g.enqueue(n.encode(`event: message_delta\ndata: ${JSON.stringify(e)}\n\n`)),f=!0}p||=(g.enqueue(n.encode(`event: message_stop\ndata: ${JSON.stringify({type:`message_stop`})}\n\n`)),!0);continue}try{let t=JSON.parse(r);if(!o){o=!0;let t={type:`message_start`,message:{id:i,type:`message`,role:`assistant`,content:[],model:e,stop_reason:null,stop_sequence:null,usage:{input_tokens:0,output_tokens:a}}};g.enqueue(n.encode(`event: message_start\ndata: ${JSON.stringify(t)}\n\n`))}let h=t.choices[0]?.delta;if(h?.content){if(d=!0,!s){s=!0;let e={type:`content_block_start`,index:l,content_block:{type:`text`,text:``}};g.enqueue(n.encode(`event: content_block_start\ndata: ${JSON.stringify(e)}\n\n`))}a+=Math.ceil(h.content.length/4);let e={type:`content_block_delta`,index:l,delta:{type:`text_delta`,text:h.content}};g.enqueue(n.encode(`event: content_block_delta\ndata: ${JSON.stringify(e)}\n\n`))}if(h?.tool_calls){if(s&&d){let e={type:`content_block_stop`,index:l};g.enqueue(n.encode(`event: content_block_stop\ndata: ${JSON.stringify(e)}\n\n`)),l++,s=!1}for(let e of h.tool_calls){let t=e.index??0;u.has(t)||u.set(t,{id:``,name:``,arguments:``,emitted:!1});let n=u.get(t);e.id&&(n.id=e.id),e.function?.name&&(n.name=e.function.name),e.function?.arguments&&(n.arguments+=e.function.arguments)}}if(t.choices[0]?.finish_reason){let e=t.choices[0].finish_reason;if(s){let e={type:`content_block_stop`,index:l};g.enqueue(n.encode(`event: content_block_stop\ndata: ${JSON.stringify(e)}\n\n`)),l++,s=!1}if(m||=((e===`tool_calls`||u.size>0)&&c(g,n,u,l),!0),!f){let t=`end_turn`;e===`length`?t=`max_tokens`:e===`tool_calls`&&(t=`tool_use`);let r={type:`message_delta`,delta:{stop_reason:t,stop_sequence:null},usage:{output_tokens:a}};g.enqueue(n.encode(`event: message_delta\ndata: ${JSON.stringify(r)}\n\n`)),f=!0}p||=(g.enqueue(n.encode(`event: message_stop\ndata: ${JSON.stringify({type:`message_stop`})}\n\n`)),!0)}}catch{}}},flush(){}})}function c(e,t,n,r){let i=r;for(let[,r]of n){if(r.emitted||!r.id||!r.name)continue;let n={};try{n=JSON.parse(r.arguments||`{}`)}catch{n={raw:r.arguments}}let a={type:`content_block_start`,index:i,content_block:{type:`tool_use`,id:r.id,name:r.name,input:{}}};e.enqueue(t.encode(`event: content_block_start\ndata: ${JSON.stringify(a)}\n\n`));let o={type:`content_block_delta`,index:i,delta:{type:`input_json_delta`,partial_json:JSON.stringify(n)}};e.enqueue(t.encode(`event: content_block_delta\ndata: ${JSON.stringify(o)}\n\n`));let s={type:`content_block_stop`,index:i};e.enqueue(t.encode(`event: content_block_stop\ndata: ${JSON.stringify(s)}\n\n`)),r.emitted=!0,i++}}function l(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.system!==void 0||t.stop_sequences!==void 0||t.top_k!==void 0}function u(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.object===`chat.completion`||t.object===`chat.completion.chunk`}function d(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.input!==void 0||t.instructions!==void 0||t.previous_response_id!==void 0}function f(e){let t=[];if(e.instructions&&t.push({role:`system`,content:e.instructions}),typeof e.input==`string`)t.push({role:`user`,content:e.input});else if(Array.isArray(e.input)){let n=[];for(let r of e.input){if(r.type===`item_reference`)continue;if(r.type===`function_call`){n.push({id:r.call_id||`call_${Date.now()}`,type:`function`,function:{name:r.name||``,arguments:r.arguments||`{}`}});continue}if(r.type===`function_call_output`){n.length>0&&(t.push({role:`assistant`,content:null,tool_calls:n}),n=[]),t.push({role:`tool`,tool_call_id:r.call_id||``,content:r.output||``});continue}n.length>0&&r.type===`message`&&(t.push({role:`assistant`,content:null,tool_calls:n}),n=[]);let e=r.role===`developer`?`system`:r.role||`user`;if(typeof r.content==`string`)t.push({role:e,content:r.content});else if(Array.isArray(r.content)){let n=[];for(let e of r.content)e.type===`input_text`&&e.text?n.push({type:`text`,text:e.text}):e.type===`input_image`&&e.image_url&&n.push({type:`image_url`,image_url:{url:e.image_url}});n.length>0&&t.push({role:e,content:n})}}n.length>0&&t.push({role:`assistant`,content:null,tool_calls:n})}let n={model:e.model,messages:t,stream:e.stream};if(e.temperature!==void 0&&(n.temperature=e.temperature),e.max_output_tokens!==void 0&&(n.max_tokens=e.max_output_tokens),e.tools&&e.tools.length>0){let t=[];for(let n of e.tools)n.type===`function`&&(n.function?t.push({type:`function`,function:{name:n.function.name,description:n.function.description,parameters:n.function.parameters||{}}}):n.name&&t.push({type:`function`,function:{name:n.name,description:n.description,parameters:n.parameters||{}}}));t.length>0&&(n.tools=t)}return n}function p(e,t){let n=e,r=n.choices?.[0],i=[];if(r?.message?.tool_calls&&r.message.tool_calls.length>0)for(let e of r.message.tool_calls)i.push({id:`fc_${e.id}`,type:`function_call`,status:`completed`,call_id:e.id,name:e.function.name,arguments:e.function.arguments||`{}`});if(r?.message?.content){let e=[{type:`output_text`,text:r.message.content}];i.push({id:`msg_${n.id||`resp_${Date.now()}`}_0`,type:`message`,status:`completed`,role:`assistant`,content:e})}i.length===0&&i.push({type:`message`,role:`assistant`,content:[]});let a=n.usage;return{id:n.id||`resp_${Date.now()}`,object:`response`,created_at:Math.floor(Date.now()/1e3),model:t,output:i,usage:a?{input_tokens:a.prompt_tokens??0,output_tokens:a.completion_tokens??0,total_tokens:a.total_tokens??0}:void 0,status:`completed`}}function m(e){for(let[t,n]of[[/^(search|find|grep|glob)[-_]?(files?|code|content)?$/i,`Searching`],[/^(read|get|fetch|load)[-_]?(file|content|data)?$/i,`Reading`],[/^(write|save|create|update)[-_]?(file|content|data)?$/i,`Writing`],[/^(execute|run|exec|shell)[-_]?(command|cmd|bash)?$/i,`Executing command`],[/^(list|ls)[-_]?(files?|dir|directory)?$/i,`Listing`],[/^(edit|modify|patch)[-_]?(file)?$/i,`Editing`],[/^(delete|remove|rm)[-_]?(file)?$/i,`Deleting`],[/^(move|mv|rename)[-_]?(file)?$/i,`Moving`],[/^(copy|cp)[-_]?(file)?$/i,`Copying`],[/^(mkdir|create[-_]?dir)$/i,`Creating directory`],[/^(git)[-_]?(.+)?$/i,`Running git`],[/^(npm|yarn|pnpm|bun)[-_]?(.+)?$/i,`Running package manager`],[/^(test|check|verify|validate)[-_]?(.+)?$/i,`Testing`],[/^(build|compile)[-_]?(.+)?$/i,`Building`],[/^(install|setup)[-_]?(.+)?$/i,`Installing`],[/^(analyze|inspect)[-_]?(.+)?$/i,`Analyzing`]])if(t.test(e))return n;let t=e.replace(/[-_]/g,` `).replace(/([a-z])([A-Z])/g,`$1 $2`).toLowerCase().split(` `);if(t.length>0){let e=t[0],n=h(e);return t[0]=n.charAt(0).toUpperCase()+n.slice(1),t.join(` `)}return`Calling ${e}`}function h(e){return e.endsWith(`e`)&&!e.endsWith(`ee`)?e.slice(0,-1)+`ing`:e.endsWith(`ie`)?e.slice(0,-2)+`ying`:/^[a-z]+[aeiou][bcdfghjklmnpqrstvwxyz]$/i.test(e)&&e.length<=4?e+e.slice(-1)+`ing`:e+`ing`}function g(e){let t=new TextDecoder,n=new TextEncoder,r=``,i=`resp_${Date.now()}`,a=!1,o=!1,s=``,c=0,l=new Map,u=0,d=!1;return new TransformStream({transform(f,p){r+=t.decode(f,{stream:!0});let h=r.split(`
6
+ `);r=h.pop()||``;for(let t of h){if(!t.startsWith(`data: `))continue;let r=t.slice(6).trim();if(r===`[DONE]`){if(d)continue;for(let[,e]of l)if(e.sentAdded&&e.outputIndex>=0&&!e.sentDone){e.sentDone=!0;let t={type:`response.function_call_arguments.done`,output_index:e.outputIndex,item_id:`fc_${e.id}`,arguments:e.arguments||`{}`};p.enqueue(n.encode(`event: response.function_call_arguments.done\ndata: ${JSON.stringify(t)}\n\n`));let r={type:`response.output_item.done`,output_index:e.outputIndex,item:{id:`fc_${e.id}`,type:`function_call`,status:`completed`,call_id:e.id,name:e.name,arguments:e.arguments||`{}`}};p.enqueue(n.encode(`event: response.output_item.done\ndata: ${JSON.stringify(r)}\n\n`))}let t=[];for(let[,e]of l)e.sentAdded&&e.id&&e.name&&t.push({id:`fc_${e.id}`,type:`function_call`,status:`completed`,call_id:e.id,name:e.name,arguments:e.arguments||`{}`});s&&t.push({type:`message`,role:`assistant`,content:[{type:`output_text`,text:s}]}),d=!0;let r={type:`response.completed`,response:{id:i,object:`response`,created_at:Math.floor(Date.now()/1e3),model:e,output:t,usage:{input_tokens:0,output_tokens:c,total_tokens:0+c},status:`completed`}};p.enqueue(n.encode(`event: response.completed\ndata: ${JSON.stringify(r)}\n\n`));continue}try{let t=JSON.parse(r);if(!a){a=!0;let t=Math.floor(Date.now()/1e3),r={type:`response.created`,response:{id:i,object:`response`,created_at:t,model:e,output:[],status:`in_progress`}};p.enqueue(n.encode(`event: response.created\ndata: ${JSON.stringify(r)}\n\n`));let o={type:`response.in_progress`,response:{id:i,object:`response`,created_at:t,status:`in_progress`}};p.enqueue(n.encode(`event: response.in_progress\ndata: ${JSON.stringify(o)}\n\n`))}let f=t.choices[0]?.delta,h=f?.reasoning_content||f?.thinking?.content;if(h){let e={type:`response.reasoning_summary_text.delta`,delta:h,summary_index:0};p.enqueue(n.encode(`event: response.reasoning_summary_text.delta\ndata: ${JSON.stringify(e)}\n\n`))}if(f?.tool_calls)for(let e of f.tool_calls){let t=e.index??0;l.has(t)||l.set(t,{id:e.id||``,name:e.function?.name||``,arguments:``,outputIndex:-1,sentAdded:!1,sentDone:!1});let r=l.get(t);if(e.id&&(r.id=e.id),e.function?.name&&(r.name=e.function.name),e.function?.arguments&&(r.arguments+=e.function.arguments),!r.sentAdded&&r.name){r.sentAdded=!0,r.outputIndex=u;let e={type:`response.reasoning_summary_text.delta`,delta:`**${m(r.name)}**\n`,summary_index:0};p.enqueue(n.encode(`event: response.reasoning_summary_text.delta\ndata: ${JSON.stringify(e)}\n\n`));let t={type:`response.output_item.added`,output_index:u,item:{type:`function_call`,call_id:r.id,name:r.name,arguments:``}};p.enqueue(n.encode(`event: response.output_item.added\ndata: ${JSON.stringify(t)}\n\n`)),u++}if(e.function?.arguments&&r.outputIndex>=0){let t={type:`response.function_call_arguments.delta`,output_index:r.outputIndex,delta:e.function.arguments};p.enqueue(n.encode(`event: response.function_call_arguments.delta\ndata: ${JSON.stringify(t)}\n\n`))}}if(f?.content){if(!o){o=!0;let e={type:`response.output_item.added`,output_index:u,item:{type:`message`,role:`assistant`,content:[]}};p.enqueue(n.encode(`event: response.output_item.added\ndata: ${JSON.stringify(e)}\n\n`));let t={type:`response.content_part.added`,output_index:u,content_index:0,part:{type:`output_text`,text:``}};p.enqueue(n.encode(`event: response.content_part.added\ndata: ${JSON.stringify(t)}\n\n`))}s+=f.content,c+=Math.ceil(f.content.length/4);let e={type:`response.output_text.delta`,output_index:u,content_index:0,delta:f.content};p.enqueue(n.encode(`event: response.output_text.delta\ndata: ${JSON.stringify(e)}\n\n`))}if(t.choices[0]?.finish_reason){for(let[,e]of l)if(e.sentAdded&&e.outputIndex>=0&&!e.sentDone){e.sentDone=!0;let t={type:`response.function_call_arguments.done`,output_index:e.outputIndex,item_id:`fc_${e.id}`,arguments:e.arguments||`{}`};p.enqueue(n.encode(`event: response.function_call_arguments.done\ndata: ${JSON.stringify(t)}\n\n`));let r={type:`response.output_item.done`,output_index:e.outputIndex,item:{id:`fc_${e.id}`,type:`function_call`,status:`completed`,call_id:e.id,name:e.name,arguments:e.arguments||`{}`}};p.enqueue(n.encode(`event: response.output_item.done\ndata: ${JSON.stringify(r)}\n\n`))}if(s&&o){let e={type:`response.output_text.done`,output_index:u,content_index:0,text:s};p.enqueue(n.encode(`event: response.output_text.done\ndata: ${JSON.stringify(e)}\n\n`));let t={type:`response.content_part.done`,output_index:u,content_index:0,part:{type:`output_text`,text:s}};p.enqueue(n.encode(`event: response.content_part.done\ndata: ${JSON.stringify(t)}\n\n`));let r={type:`response.output_item.done`,output_index:u,item:{id:`msg_${i}_0`,type:`message`,status:`completed`,role:`assistant`,content:[{type:`output_text`,text:s}]}};p.enqueue(n.encode(`event: response.output_item.done\ndata: ${JSON.stringify(r)}\n\n`))}d=!0;let t=[];for(let[,e]of l)e.sentAdded&&e.id&&e.name&&t.push({id:`fc_${e.id}`,type:`function_call`,status:`completed`,call_id:e.id,name:e.name,arguments:e.arguments||`{}`});s&&t.push({id:`msg_${i}_0`,type:`message`,status:`completed`,role:`assistant`,content:[{type:`output_text`,text:s}]});let r={type:`response.completed`,response:{id:i,object:`response`,created_at:Math.floor(Date.now()/1e3),model:e,output:t,usage:{input_tokens:0,output_tokens:c,total_tokens:0+c},status:`completed`}};p.enqueue(n.encode(`event: response.completed\ndata: ${JSON.stringify(r)}\n\n`))}}catch{}}},flush(){}})}export{u as a,p as c,l as i,f as l,g as n,d as o,s as r,o as s,t};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xling",
3
- "version": "0.9.4",
3
+ "version": "0.9.6",
4
4
  "description": "Unified CLI for managing AI tool settings",
5
5
  "homepage": "https://github.com/kingsword09/xling/tree/main#readme",
6
6
  "bugs": {
@@ -1,10 +0,0 @@
1
- import { c as ProxyServerContext, l as ProxyServerOptions } from "./types-BUZTxIIw.js";
2
-
3
- //#region src/services/proxy/server.d.ts
4
- declare const DEFAULT_PROXY_PORT = 4320;
5
- /**
6
- * Start the proxy server
7
- */
8
- declare function startProxyServer(options?: ProxyServerOptions): Promise<ProxyServerContext>;
9
- //#endregion
10
- export { startProxyServer as n, DEFAULT_PROXY_PORT as t };
@@ -1 +0,0 @@
1
- import{p as e}from"./config-FuKh2Fd0.js";import{m as t}from"./fsStore-DVJLVT4G.js";import{t as n}from"./xling-BReZTlb3.js";import{t as r}from"./loadBalancer-DUCjd5HG.js";import{t as i}from"./errorClassifier-CXL0O9lB.js";import{c as a,i as o,l as s,n as c,o as l,r as u,s as d,t as f}from"./transformer-CKTY0r0_.js";import{watch as p}from"node:fs";const m=4320;function h(){return`req_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`}function g(e){if(typeof e==`string`)return e;if(typeof e==`number`||typeof e==`boolean`)return String(e);if(e==null)return``;if(typeof e==`object`)try{return JSON.stringify(e)}catch{return`[object Object]`}return typeof e==`symbol`?e.toString():typeof e==`function`?e.name||`[function]`:``}async function _(e={}){let i=new n,a=i.resolvePath(`user`),o=i.readConfig(a);if(!o.providers?.length)throw Error(`No providers configured in ~/.claude/xling.json. Add a 'providers' array.`);let s=()=>o,c=o.proxy??{},l=e.host??c.host??`127.0.0.1`,u=e.port??c.port??m,d=e.accessKey??c.accessKey,f=new r(c.loadBalance??`failover`,c.keyRotation?.cooldownMs??6e4),h=Bun.serve({hostname:l,port:u,async fetch(t){let n=new URL(t.url).pathname;if(t.method===`OPTIONS`)return new Response(null,{status:204,headers:T()});if(n===`/health`||n===`/`){let e=s();return Response.json({status:`ok`,providers:e.providers.map(e=>e.name),loadBalance:e.proxy?.loadBalance??`failover`},{headers:T()})}if(n===`/stats`)return Response.json({stats:f.getStats()},{headers:T()});if(n===`/v1/models`||n===`/models`){let e=D(s().providers);return Response.json(e,{headers:T()})}if(d){let r=t.headers.get(`authorization`)?.replace(/^Bearer\s+/i,``);if(r!==d)return e.logger&&(console.log(`[auth] Access key validation failed for path: ${n}`),console.log(`[auth] Expected: ${d.slice(0,4)}...`),console.log(`[auth] Received: ${r?r.slice(0,4)+`...`:`(none)`}`)),Response.json({error:{message:`Invalid access key`,type:`auth_error`}},{status:401,headers:T()})}if(n.startsWith(`/v1/`)||n.startsWith(`/claude/`)||n.startsWith(`/openai/`)||n===`/responses`||n===`/messages`||n===`/chat/completions`){e.logger&&console.log(`[proxy] Handling request: ${t.method} ${n}`);let r=s();return v(t,n,{providers:r.providers,modelMapping:r.proxy?.modelMapping,defaultModel:r.defaultModel,passthroughResponsesAPI:r.proxy?.passthroughResponsesAPI,keyRotation:r.proxy?.keyRotation},f,e.logger??!0)}return e.logger&&console.log(`[proxy] 404 Not Found: ${t.method} ${n}`),Response.json({error:{message:`Not found`,type:`not_found`}},{status:404,headers:T()})}}),g=t(a),_=null;try{_=p(g,t=>{if(t===`change`)try{let t=i.readConfig(a);t.providers?.length&&(o=t,e.logger&&console.log(`[proxy] Config reloaded`))}catch(t){e.logger&&console.error(`[proxy] Failed to reload config:`,t)}})}catch(t){e.logger&&console.warn(`[proxy] Failed to watch config file:`,t)}return{baseUrl:`http://${l}:${u}`,providers:o.providers.map(e=>e.name),models:o.providers.flatMap(e=>e.models.map(t=>`${e.name},${t}`)),server:h,shutdown:async()=>{_?.close(),await h.stop()}}}async function v(t,n,r,a,c){let u={requestId:h(),startTime:Date.now(),retryCount:0},d=n;n.startsWith(`/claude/`)?d=n.replace(`/claude`,``):n.startsWith(`/openai/`)&&(d=n.replace(`/openai`,``)),d.startsWith(`/v1/v1/`)&&(d=d.replace(`/v1/v1/`,`/v1/`));let p;if(t.headers.get(`content-type`)?.includes(`application/json`))try{p=await t.json()}catch{return Response.json({error:{message:`Invalid JSON body`,type:`invalid_request`}},{status:400,headers:T()})}let m=o(p),_=l(p),v=p,D=!1,O=`openai`,k=b(p),A=x(k,r.modelMapping,r.defaultModel,r.providers);if(m&&p&&typeof p==`object`){let e=p;e.model=A||k,D=e.stream===!0,O=`anthropic`,v=f(e),(d===`/v1/messages`||d===`/messages`)&&(d=`/v1/chat/completions`),c&&console.log(`[${u.requestId}] Converting Anthropic -> OpenAI format (path: ${d})`)}else if(_&&p&&typeof p==`object`){let e=p;if(e.model=A||k,D=e.stream===!0,(r.passthroughResponsesAPI??[]).some(t=>t.endsWith(`*`)?String(e.model).startsWith(t.slice(0,-1)):e.model===t))O=`openai`,v=e,c&&console.log(`[${u.requestId}] Responses API passthrough (native support): model=${g(e.model)}`);else{if(O=`responses`,c){let t=g(e.model);if(console.log(`[${u.requestId}] Responses API request: stream=${D}, model=${t}`),e.tools){let t=e.tools;console.log(`[${u.requestId}] Tools count: ${t.length}`),t.slice(0,5).forEach((e,t)=>{let n=e,r=g(n.type),i=g(n.function?.name??n.name??`N/A`);console.log(`[${u.requestId}] Tool[${t}]: type=${r}, name=${i}, keys=${Object.keys(n).join(`,`)}`)})}else console.log(`[${u.requestId}] No tools in request`)}if(v=s(e),(d===`/v1/responses`||d===`/responses`)&&(d=`/v1/chat/completions`),c){console.log(`[${u.requestId}] Converting Responses API -> OpenAI format (path: ${d})`);let e=v?.tools;e?console.log(`[${u.requestId}] Converted tools count: ${e.length}`):console.log(`[${u.requestId}] No tools after conversion`)}}}else p&&typeof p==`object`&&A&&A!==k&&(p.model=A,v=p,D=p.stream===!0);let j=A,M=r.keyRotation?.enabled===!1?1:r.providers.length*2,N=null;for(;u.retryCount<M;){let n=w(r.providers,a,j);if(!n)return Response.json({error:{message:`No available providers`,type:`service_unavailable`}},{status:503,headers:T()});u.provider=n.name;let o=e(n),s=a.getProviderState(n.name),l=s?a.selectKey({...n,apiKeys:o},s):o[0];if(!l){u.retryCount++;continue}let f=o.indexOf(l);u.keyIndex=f,c&&(A&&A!==k&&console.log(`[${u.requestId}] Model mapped: ${k??`unknown`} -> ${A} (provider: ${n.name})`),console.log(`[${u.requestId}] -> ${n.name} (key ${f+1}/${o.length})`));try{let e=await y(t,n,l,d,v);if(e.ok){if(a.reportSuccess(n.name,f),c){let t=Date.now()-u.startTime;console.log(`[${u.requestId}] <- ${e.status} (${t}ms)`)}return O===`anthropic`?await S(e,k||`unknown`,D,c,u.requestId):O===`responses`?await C(e,k||`unknown`,D,c,u.requestId):E(e)}let o=await e.clone().json().catch(()=>null),s=i(e.status,o);if(a.reportError(n.name,f,s),c&&console.log(`[${u.requestId}] Error: ${s.type} - ${s.message}`),s.retryable&&r.keyRotation?.onError!==!1){u.retryCount++,N=e;continue}return E(e)}catch(e){let t=i(0,void 0,e);if(a.reportError(n.name,f,t),c&&console.log(`[${u.requestId}] Network error: ${t.message}`),t.retryable){u.retryCount++;continue}return Response.json({error:{message:t.message,type:t.type}},{status:502,headers:T()})}}return N?E(N):Response.json({error:{message:`All providers failed after retries`,type:`service_unavailable`}},{status:503,headers:T()})}async function y(e,t,n,r,i){let a=t.baseUrl.replace(/\/+$/,``),o=r;a.endsWith(`/v1`)&&r.startsWith(`/v1/`)&&(o=r.slice(3));let s=`${a}${o}`,c={"Content-Type":`application/json`,Authorization:`Bearer ${n}`};t.headers&&Object.assign(c,t.headers);for(let t of[`accept`,`accept-encoding`,`x-request-id`]){let n=e.headers.get(t);n&&(c[t]=n)}let l={method:e.method,headers:c};if(i&&e.method!==`GET`&&e.method!==`HEAD`&&(l.body=JSON.stringify(i)),t.timeout){let e=new AbortController,n=setTimeout(()=>e.abort(),t.timeout);l.signal=e.signal;try{let e=await fetch(s,l);return clearTimeout(n),e}catch(e){throw clearTimeout(n),e}}return fetch(s,l)}function b(e){if(!e||typeof e!=`object`)return;let t=e;if(typeof t.model==`string`)return t.model}function x(e,t,n,r){if(!e)return n;if(!t||Object.keys(t).length===0)return e;if(t[e])return t[e];if(r?.some(t=>t.models.some(t=>t===e||e.startsWith(t))))return e;for(let[n,r]of Object.entries(t))if(n.endsWith(`*`)){let t=n.slice(0,-1);if(e.startsWith(t))return r}return t[`*`]?t[`*`]:n??e}async function S(e,t,n,r,i){if(n){r&&console.log(`[${i}] Converting streaming response OpenAI -> Anthropic`);let n=u(t),a=e.body?.pipeThrough(n);return new Response(a,{status:200,headers:{...T(),"Content-Type":`text/event-stream`,"Cache-Control":`no-cache, no-transform`,Connection:`keep-alive`,"X-Accel-Buffering":`no`}})}try{let n=await e.text(),a;try{a=JSON.parse(n)}catch{r&&console.log(`[${i}] Response is not JSON, wrapping as text`),a={content:n}}r&&console.log(`[${i}] Response type: ${typeof a}, keys: ${Object.keys(a).join(`, `)}`);let o=d(a,t);return r&&console.log(`[${i}] Converted response OpenAI -> Anthropic`),Response.json(o,{status:200,headers:T()})}catch(e){return console.error(`[${i}] Response conversion failed:`,e),Response.json({type:`error`,error:{type:`api_error`,message:`Response conversion failed: ${e.message}`}},{status:500,headers:T()})}}async function C(e,t,n,r,i){if(n){r&&console.log(`[${i}] Converting streaming response OpenAI -> Responses API`);let n=c(t),a=e.body?.pipeThrough(n);return new Response(a,{status:200,headers:{...T(),"Content-Type":`text/event-stream`,"Cache-Control":`no-cache, no-transform`,Connection:`keep-alive`,"X-Accel-Buffering":`no`}})}try{let n=await e.text(),o;try{o=JSON.parse(n)}catch{r&&console.log(`[${i}] Response is not JSON, wrapping as text`),o={content:n}}r&&console.log(`[${i}] Response type: ${typeof o}, keys: ${Object.keys(o).join(`, `)}`);let s=a(o,t);return r&&console.log(`[${i}] Converted response OpenAI -> Responses API`),Response.json(s,{status:200,headers:T()})}catch(e){return console.error(`[${i}] Response conversion failed:`,e),Response.json({id:`resp_${Date.now()}`,object:`response`,created_at:Math.floor(Date.now()/1e3),model:t,output:[],status:`failed`,error:{code:`api_error`,message:`Response conversion failed: ${e.message}`}},{status:500,headers:T()})}}function w(t,n,r){let i=t.map(t=>({...t,apiKeys:e(t)}));if(r?.includes(`,`)){let[e]=r.split(`,`),t=i.find(t=>t.name===e);if(t)return t}if(r){let e=i.filter(e=>e.models.some(e=>e===r||r.startsWith(e)));if(e.length>0)return n.selectProvider(e)}return n.selectProvider(i)}function T(){return{"Access-Control-Allow-Origin":`*`,"Access-Control-Allow-Methods":`GET, POST, PUT, DELETE, OPTIONS`,"Access-Control-Allow-Headers":`Content-Type, Authorization, X-Request-ID`,"Access-Control-Max-Age":`86400`}}function E(e){let t=new Headers(e.headers);for(let[e,n]of Object.entries(T()))t.set(e,n);return new Response(e.body,{status:e.status,statusText:e.statusText,headers:t})}function D(e){let t=Math.floor(Date.now()/1e3),n=[],r=new Set;for(let i of e)for(let e of i.models){let a=`${i.name},${e}`;r.has(a)||(r.add(a),n.push({id:a,object:`model`,created:t,owned_by:i.name})),r.has(e)||(r.add(e),n.push({id:e,object:`model`,created:t,owned_by:i.name}))}return{object:`list`,data:n}}export{_ as n,m as t};
@@ -1,6 +0,0 @@
1
- const e=e=>{if(typeof e==`string`)return e;if(typeof e==`number`||typeof e==`boolean`)return String(e);if(e==null)return``;if(typeof e==`object`)try{return JSON.stringify(e)}catch{return`[object Object]`}return typeof e==`symbol`?e.toString():typeof e==`function`?e.name||`[function]`:``};function t(e){let t=[];e.system&&t.push({role:`system`,content:e.system});for(let n of e.messages){let e=a(n);Array.isArray(e)?t.push(...e):e&&t.push(e)}let r={model:e.model,messages:t,stream:e.stream};return e.max_tokens&&(r.max_tokens=e.max_tokens),e.temperature!==void 0&&(r.temperature=e.temperature),e.top_p!==void 0&&(r.top_p=e.top_p),e.stop_sequences&&(r.stop=e.stop_sequences),e.tools&&e.tools.length>0&&(r.tools=n(e.tools)),e.tool_choice&&(r.tool_choice=i(e.tool_choice)),r}function n(e){return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:r(e.input_schema)}}))}function r(e){let t={...e};if(delete t.$schema,delete t.title,delete t.examples,t.properties&&typeof t.properties==`object`){let e=t.properties;for(let t of Object.keys(e))e[t]&&typeof e[t]==`object`&&(e[t]=r(e[t]),e[t].type===`string`&&delete e[t].format)}return t}function i(e){return typeof e==`string`?e===`auto`?`auto`:e===`none`?`none`:e===`any`||e===`required`?`required`:`auto`:e.type===`auto`?`auto`:e.type===`none`?`none`:e.type===`any`?`required`:e.type===`tool`&&e.name?{type:`function`,function:{name:e.name}}:`auto`}function a(e){if(typeof e.content==`string`)return{role:e.role,content:e.content};let t=[],n=[],r=[],i=[];for(let a of e.content)a.type===`text`&&a.text?t.push(a.text):a.type===`image`&&a.source?n.push({type:`image_url`,image_url:{url:`data:${a.source.media_type};base64,${a.source.data}`}}):a.type===`tool_use`?r.push(a):a.type===`tool_result`&&i.push(a);if(i.length>0)return i.map(e=>({role:`tool`,tool_call_id:e.tool_use_id||``,content:typeof e.content==`string`?e.content:JSON.stringify(e.content)}));if(e.role===`assistant`&&r.length>0){let e=r.map(e=>({id:e.id||`call_${Date.now()}`,type:`function`,function:{name:e.name||``,arguments:JSON.stringify(e.input||{})}}));return{role:`assistant`,content:t.length>0?t.join(`
2
- `):null,tool_calls:e}}if(n.length===0)return{role:e.role,content:t.join(`
3
- `)};let a=[];return t.length>0&&a.push({type:`text`,text:t.join(`
4
- `)}),a.push(...n),{role:e.role,content:a}}function o(t,n){let r=t;if(r.type===`message`&&r.content)return r;let i=r.choices?.[0],a=[];if(i?.message?.content)a.push({type:`text`,text:i.message.content});else if(typeof r.content==`string`)a.push({type:`text`,text:r.content});else if(r.text)a.push({type:`text`,text:e(r.text)});else if(r.message){let t=r.message;t.content&&a.push({type:`text`,text:e(t.content)})}if(i?.message?.tool_calls&&i.message.tool_calls.length>0)for(let e of i.message.tool_calls){let t={};try{t=JSON.parse(e.function.arguments)}catch{t={raw:e.function.arguments}}a.push({type:`tool_use`,id:e.id,name:e.function.name,input:t})}a.length===0&&a.push({type:`text`,text:``});let o=`end_turn`;if(i?.finish_reason)switch(i.finish_reason){case`stop`:o=`end_turn`;break;case`length`:o=`max_tokens`;break;case`tool_calls`:o=`tool_use`;break;default:o=`end_turn`}let s=r.usage;return{id:r.id||`msg_${Date.now()}`,type:`message`,role:`assistant`,content:a,model:n,stop_reason:o,stop_sequence:null,usage:{input_tokens:s?.prompt_tokens??0,output_tokens:s?.completion_tokens??0}}}function s(e){let t=new TextDecoder,n=new TextEncoder,r=``,i=`msg_${Date.now()}`,a=0,o=!1,s=!1,l=0,u=new Map,d=!1;return new TransformStream({transform(f,p){r+=t.decode(f,{stream:!0});let m=r.split(`
5
- `);r=m.pop()||``;for(let t of m){if(!t.startsWith(`data: `))continue;let r=t.slice(6).trim();if(r===`[DONE]`){c(p,n,u,l),p.enqueue(n.encode(`event: message_stop\ndata: ${JSON.stringify({type:`message_stop`})}\n\n`));continue}try{let t=JSON.parse(r);if(!o){o=!0;let t={type:`message_start`,message:{id:i,type:`message`,role:`assistant`,content:[],model:e,stop_reason:null,stop_sequence:null,usage:{input_tokens:0,output_tokens:a}}};p.enqueue(n.encode(`event: message_start\ndata: ${JSON.stringify(t)}\n\n`))}let f=t.choices[0]?.delta;if(f?.content){if(d=!0,!s){s=!0;let e={type:`content_block_start`,index:l,content_block:{type:`text`,text:``}};p.enqueue(n.encode(`event: content_block_start\ndata: ${JSON.stringify(e)}\n\n`))}a+=Math.ceil(f.content.length/4);let e={type:`content_block_delta`,index:l,delta:{type:`text_delta`,text:f.content}};p.enqueue(n.encode(`event: content_block_delta\ndata: ${JSON.stringify(e)}\n\n`))}if(f?.tool_calls){if(s&&d){let e={type:`content_block_stop`,index:l};p.enqueue(n.encode(`event: content_block_stop\ndata: ${JSON.stringify(e)}\n\n`)),l++,s=!1}for(let e of f.tool_calls){let t=e.index??0;u.has(t)||u.set(t,{id:``,name:``,arguments:``});let n=u.get(t);e.id&&(n.id=e.id),e.function?.name&&(n.name=e.function.name),e.function?.arguments&&(n.arguments+=e.function.arguments)}}if(t.choices[0]?.finish_reason){let e=t.choices[0].finish_reason;if(s){let e={type:`content_block_stop`,index:l};p.enqueue(n.encode(`event: content_block_stop\ndata: ${JSON.stringify(e)}\n\n`)),l++}(e===`tool_calls`||u.size>0)&&c(p,n,u,l);let r=`end_turn`;e===`length`?r=`max_tokens`:e===`tool_calls`&&(r=`tool_use`);let i={type:`message_delta`,delta:{stop_reason:r,stop_sequence:null},usage:{output_tokens:a}};p.enqueue(n.encode(`event: message_delta\ndata: ${JSON.stringify(i)}\n\n`))}}catch{}}},flush(){}})}function c(e,t,n,r){let i=r;for(let[,r]of n){if(!r.id||!r.name)continue;let n={};try{n=JSON.parse(r.arguments||`{}`)}catch{n={raw:r.arguments}}let a={type:`content_block_start`,index:i,content_block:{type:`tool_use`,id:r.id,name:r.name,input:{}}};e.enqueue(t.encode(`event: content_block_start\ndata: ${JSON.stringify(a)}\n\n`));let o={type:`content_block_delta`,index:i,delta:{type:`input_json_delta`,partial_json:JSON.stringify(n)}};e.enqueue(t.encode(`event: content_block_delta\ndata: ${JSON.stringify(o)}\n\n`));let s={type:`content_block_stop`,index:i};e.enqueue(t.encode(`event: content_block_stop\ndata: ${JSON.stringify(s)}\n\n`)),i++}n.clear()}function l(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.system!==void 0||t.stop_sequences!==void 0||t.top_k!==void 0}function u(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.object===`chat.completion`||t.object===`chat.completion.chunk`}function d(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.input!==void 0||t.instructions!==void 0||t.previous_response_id!==void 0}function f(e){let t=[];if(e.instructions&&t.push({role:`system`,content:e.instructions}),typeof e.input==`string`)t.push({role:`user`,content:e.input});else if(Array.isArray(e.input)){let n=[];for(let r of e.input){if(r.type===`item_reference`)continue;if(r.type===`function_call`){n.push({id:r.call_id||`call_${Date.now()}`,type:`function`,function:{name:r.name||``,arguments:r.arguments||`{}`}});continue}if(r.type===`function_call_output`){n.length>0&&(t.push({role:`assistant`,content:null,tool_calls:n}),n=[]),t.push({role:`tool`,tool_call_id:r.call_id||``,content:r.output||``});continue}n.length>0&&r.type===`message`&&(t.push({role:`assistant`,content:null,tool_calls:n}),n=[]);let e=r.role===`developer`?`system`:r.role||`user`;if(typeof r.content==`string`)t.push({role:e,content:r.content});else if(Array.isArray(r.content)){let n=[];for(let e of r.content)e.type===`input_text`&&e.text?n.push({type:`text`,text:e.text}):e.type===`input_image`&&e.image_url&&n.push({type:`image_url`,image_url:{url:e.image_url}});n.length>0&&t.push({role:e,content:n})}}n.length>0&&t.push({role:`assistant`,content:null,tool_calls:n})}let n={model:e.model,messages:t,stream:e.stream};if(e.temperature!==void 0&&(n.temperature=e.temperature),e.max_output_tokens!==void 0&&(n.max_tokens=e.max_output_tokens),e.tools&&e.tools.length>0){let t=[];for(let n of e.tools)n.type===`function`&&(n.function?t.push({type:`function`,function:{name:n.function.name,description:n.function.description,parameters:n.function.parameters||{}}}):n.name&&t.push({type:`function`,function:{name:n.name,description:n.description,parameters:n.parameters||{}}}));t.length>0&&(n.tools=t)}return n}function p(e,t){let n=e,r=n.choices?.[0],i=[];if(r?.message?.tool_calls&&r.message.tool_calls.length>0)for(let e of r.message.tool_calls)i.push({type:`function_call`,call_id:e.id,name:e.function.name,arguments:e.function.arguments});if(r?.message?.content){let e=[{type:`output_text`,text:r.message.content}];i.push({type:`message`,role:`assistant`,content:e})}i.length===0&&i.push({type:`message`,role:`assistant`,content:[]});let a=n.usage;return{id:n.id||`resp_${Date.now()}`,object:`response`,created_at:Math.floor(Date.now()/1e3),model:t,output:i,usage:a?{input_tokens:a.prompt_tokens??0,output_tokens:a.completion_tokens??0,total_tokens:a.total_tokens??0}:void 0,status:`completed`}}function m(e){for(let[t,n]of[[/^(search|find|grep|glob)[-_]?(files?|code|content)?$/i,`Searching`],[/^(read|get|fetch|load)[-_]?(file|content|data)?$/i,`Reading`],[/^(write|save|create|update)[-_]?(file|content|data)?$/i,`Writing`],[/^(execute|run|exec|shell)[-_]?(command|cmd|bash)?$/i,`Executing command`],[/^(list|ls)[-_]?(files?|dir|directory)?$/i,`Listing`],[/^(edit|modify|patch)[-_]?(file)?$/i,`Editing`],[/^(delete|remove|rm)[-_]?(file)?$/i,`Deleting`],[/^(move|mv|rename)[-_]?(file)?$/i,`Moving`],[/^(copy|cp)[-_]?(file)?$/i,`Copying`],[/^(mkdir|create[-_]?dir)$/i,`Creating directory`],[/^(git)[-_]?(.+)?$/i,`Running git`],[/^(npm|yarn|pnpm|bun)[-_]?(.+)?$/i,`Running package manager`],[/^(test|check|verify|validate)[-_]?(.+)?$/i,`Testing`],[/^(build|compile)[-_]?(.+)?$/i,`Building`],[/^(install|setup)[-_]?(.+)?$/i,`Installing`],[/^(analyze|inspect)[-_]?(.+)?$/i,`Analyzing`]])if(t.test(e))return n;let t=e.replace(/[-_]/g,` `).replace(/([a-z])([A-Z])/g,`$1 $2`).toLowerCase().split(` `);if(t.length>0){let e=t[0],n=h(e);return t[0]=n.charAt(0).toUpperCase()+n.slice(1),t.join(` `)}return`Calling ${e}`}function h(e){return e.endsWith(`e`)&&!e.endsWith(`ee`)?e.slice(0,-1)+`ing`:e.endsWith(`ie`)?e.slice(0,-2)+`ying`:/^[a-z]+[aeiou][bcdfghjklmnpqrstvwxyz]$/i.test(e)&&e.length<=4?e+e.slice(-1)+`ing`:e+`ing`}function g(e){let t=new TextDecoder,n=new TextEncoder,r=``,i=`resp_${Date.now()}`,a=!1,o=!1,s=``,c=0,l=new Map,u=0;return new TransformStream({transform(d,f){r+=t.decode(d,{stream:!0});let p=r.split(`
6
- `);r=p.pop()||``;for(let t of p){if(!t.startsWith(`data: `))continue;let r=t.slice(6).trim();if(r===`[DONE]`){let t=[];for(let[,e]of l)e.sentAdded&&e.id&&e.name&&t.push({type:`function_call`,call_id:e.id,name:e.name,arguments:e.arguments});s&&t.push({type:`message`,role:`assistant`,content:[{type:`output_text`,text:s}]});let r={type:`response.completed`,response:{id:i,object:`response`,created_at:Math.floor(Date.now()/1e3),model:e,output:t,usage:{input_tokens:0,output_tokens:c,total_tokens:0+c},status:`completed`}};f.enqueue(n.encode(`event: response.completed\ndata: ${JSON.stringify(r)}\n\n`));continue}try{let t=JSON.parse(r);if(!a){a=!0;let t={type:`response.created`,response:{id:i,object:`response`,created_at:Math.floor(Date.now()/1e3),model:e,output:[],status:`in_progress`}};f.enqueue(n.encode(`event: response.created\ndata: ${JSON.stringify(t)}\n\n`))}let d=t.choices[0]?.delta,p=d?.reasoning_content||d?.thinking?.content;if(p){let e={type:`response.reasoning_summary_text.delta`,delta:p,summary_index:0};f.enqueue(n.encode(`event: response.reasoning_summary_text.delta\ndata: ${JSON.stringify(e)}\n\n`))}if(d?.tool_calls)for(let e of d.tool_calls){let t=e.index??0;l.has(t)||l.set(t,{id:e.id||``,name:e.function?.name||``,arguments:``,outputIndex:-1,sentAdded:!1});let r=l.get(t);if(e.id&&(r.id=e.id),e.function?.name&&(r.name=e.function.name),e.function?.arguments&&(r.arguments+=e.function.arguments),!r.sentAdded&&r.name){r.sentAdded=!0,r.outputIndex=u;let e={type:`response.reasoning_summary_text.delta`,delta:`**${m(r.name)}**\n`,summary_index:0};f.enqueue(n.encode(`event: response.reasoning_summary_text.delta\ndata: ${JSON.stringify(e)}\n\n`));let t={type:`response.output_item.added`,output_index:u,item:{type:`function_call`,call_id:r.id,name:r.name,arguments:``}};f.enqueue(n.encode(`event: response.output_item.added\ndata: ${JSON.stringify(t)}\n\n`)),u++}if(e.function?.arguments&&r.outputIndex>=0){let t={type:`response.function_call_arguments.delta`,output_index:r.outputIndex,delta:e.function.arguments};f.enqueue(n.encode(`event: response.function_call_arguments.delta\ndata: ${JSON.stringify(t)}\n\n`))}}if(d?.content){if(!o){o=!0;let e={type:`response.output_item.added`,output_index:u,item:{type:`message`,role:`assistant`,content:[]}};f.enqueue(n.encode(`event: response.output_item.added\ndata: ${JSON.stringify(e)}\n\n`));let t={type:`response.content_part.added`,output_index:u,content_index:0,part:{type:`output_text`,text:``}};f.enqueue(n.encode(`event: response.content_part.added\ndata: ${JSON.stringify(t)}\n\n`))}s+=d.content,c+=Math.ceil(d.content.length/4);let e={type:`response.output_text.delta`,output_index:u,content_index:0,delta:d.content};f.enqueue(n.encode(`event: response.output_text.delta\ndata: ${JSON.stringify(e)}\n\n`))}if(t.choices[0]?.finish_reason){for(let[,e]of l)if(e.sentAdded&&e.outputIndex>=0){let t={type:`response.output_item.done`,output_index:e.outputIndex,item:{type:`function_call`,call_id:e.id,name:e.name,arguments:e.arguments}};f.enqueue(n.encode(`event: response.output_item.done\ndata: ${JSON.stringify(t)}\n\n`))}if(s&&o){let e={type:`response.output_text.done`,output_index:u,content_index:0,text:s};f.enqueue(n.encode(`event: response.output_text.done\ndata: ${JSON.stringify(e)}\n\n`));let t={type:`response.content_part.done`,output_index:u,content_index:0,part:{type:`output_text`,text:s}};f.enqueue(n.encode(`event: response.content_part.done\ndata: ${JSON.stringify(t)}\n\n`));let r={type:`response.output_item.done`,output_index:u,item:{type:`message`,role:`assistant`,content:[{type:`output_text`,text:s}]}};f.enqueue(n.encode(`event: response.output_item.done\ndata: ${JSON.stringify(r)}\n\n`))}let t=[];for(let[,e]of l)e.sentAdded&&e.id&&e.name&&t.push({type:`function_call`,call_id:e.id,name:e.name,arguments:e.arguments});s&&t.push({type:`message`,role:`assistant`,content:[{type:`output_text`,text:s}]});let r={type:`response.completed`,response:{id:i,object:`response`,created_at:Math.floor(Date.now()/1e3),model:e,output:t,usage:{input_tokens:0,output_tokens:c,total_tokens:0+c},status:`completed`}};f.enqueue(n.encode(`event: response.completed\ndata: ${JSON.stringify(r)}\n\n`))}}catch{}}},flush(){}})}export{u as a,p as c,l as i,f as l,g as n,d as o,s as r,o as s,t};