@openadapter/koda-ai 1.0.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1385 -0
- package/dist/api-registry.d.ts +19 -0
- package/dist/api-registry.js +1 -0
- package/dist/bedrock-provider.d.ts +4 -0
- package/dist/bedrock-provider.js +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +24 -0
- package/dist/env-api-keys.d.ts +17 -0
- package/dist/env-api-keys.js +1 -0
- package/dist/image-models.d.ts +9 -0
- package/dist/image-models.generated.d.ts +454 -0
- package/dist/image-models.generated.js +1 -0
- package/dist/image-models.js +1 -0
- package/dist/images-api-registry.d.ts +13 -0
- package/dist/images-api-registry.js +1 -0
- package/dist/images.d.ts +3 -0
- package/dist/images.js +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.js +1 -0
- package/dist/models.d.ts +17 -0
- package/dist/models.generated.d.ts +18136 -0
- package/dist/models.generated.js +1 -0
- package/dist/models.js +1 -0
- package/dist/oauth.d.ts +1 -0
- package/dist/oauth.js +1 -0
- package/dist/providers/amazon-bedrock.d.ts +37 -0
- package/dist/providers/amazon-bedrock.js +1 -0
- package/dist/providers/anthropic.d.ts +70 -0
- package/dist/providers/anthropic.js +5 -0
- package/dist/providers/azure-openai-responses.d.ts +14 -0
- package/dist/providers/azure-openai-responses.js +1 -0
- package/dist/providers/cloudflare.d.ts +12 -0
- package/dist/providers/cloudflare.js +1 -0
- package/dist/providers/faux.d.ts +55 -0
- package/dist/providers/faux.js +6 -0
- package/dist/providers/github-copilot-headers.d.ts +7 -0
- package/dist/providers/github-copilot-headers.js +1 -0
- package/dist/providers/google-shared.d.ts +69 -0
- package/dist/providers/google-shared.js +2 -0
- package/dist/providers/google-vertex.d.ts +14 -0
- package/dist/providers/google-vertex.js +1 -0
- package/dist/providers/google.d.ts +12 -0
- package/dist/providers/google.js +1 -0
- package/dist/providers/images/openrouter.d.ts +2 -0
- package/dist/providers/images/openrouter.js +1 -0
- package/dist/providers/images/register-builtins.d.ts +3 -0
- package/dist/providers/images/register-builtins.js +1 -0
- package/dist/providers/mistral.d.ts +24 -0
- package/dist/providers/mistral.js +3 -0
- package/dist/providers/openai-codex-responses.d.ts +29 -0
- package/dist/providers/openai-codex-responses.js +7 -0
- package/dist/providers/openai-completions.d.ts +18 -0
- package/dist/providers/openai-completions.js +6 -0
- package/dist/providers/openai-prompt-cache.d.ts +2 -0
- package/dist/providers/openai-prompt-cache.js +1 -0
- package/dist/providers/openai-responses-shared.d.ts +17 -0
- package/dist/providers/openai-responses-shared.js +12 -0
- package/dist/providers/openai-responses.d.ts +12 -0
- package/dist/providers/openai-responses.js +1 -0
- package/dist/providers/register-builtins.d.ts +34 -0
- package/dist/providers/register-builtins.js +1 -0
- package/dist/providers/simple-options.d.ts +7 -0
- package/dist/providers/simple-options.js +1 -0
- package/dist/providers/transform-messages.d.ts +7 -0
- package/dist/providers/transform-messages.js +1 -0
- package/dist/session-resources.d.ts +3 -0
- package/dist/session-resources.js +1 -0
- package/dist/stream.d.ts +7 -0
- package/dist/stream.js +1 -0
- package/dist/types.d.ts +513 -0
- package/dist/types.js +0 -0
- package/dist/utils/abort-signals.d.ts +5 -0
- package/dist/utils/abort-signals.js +1 -0
- package/dist/utils/diagnostics.d.ts +18 -0
- package/dist/utils/diagnostics.js +1 -0
- package/dist/utils/event-stream.d.ts +20 -0
- package/dist/utils/event-stream.js +1 -0
- package/dist/utils/hash.d.ts +2 -0
- package/dist/utils/hash.js +1 -0
- package/dist/utils/headers.d.ts +1 -0
- package/dist/utils/headers.js +1 -0
- package/dist/utils/json-parse.d.ts +15 -0
- package/dist/utils/json-parse.js +2 -0
- package/dist/utils/node-http-proxy.d.ts +9 -0
- package/dist/utils/node-http-proxy.js +1 -0
- package/dist/utils/oauth/anthropic.d.ts +24 -0
- package/dist/utils/oauth/anthropic.js +1 -0
- package/dist/utils/oauth/device-code.d.ts +20 -0
- package/dist/utils/oauth/device-code.js +1 -0
- package/dist/utils/oauth/github-copilot.d.ts +29 -0
- package/dist/utils/oauth/github-copilot.js +1 -0
- package/dist/utils/oauth/index.d.ts +57 -0
- package/dist/utils/oauth/index.js +1 -0
- package/dist/utils/oauth/oauth-page.d.ts +2 -0
- package/dist/utils/oauth/oauth-page.js +74 -0
- package/dist/utils/oauth/openai-codex.d.ts +42 -0
- package/dist/utils/oauth/openai-codex.js +1 -0
- package/dist/utils/oauth/pkce.d.ts +12 -0
- package/dist/utils/oauth/pkce.js +1 -0
- package/dist/utils/oauth/types.d.ts +63 -0
- package/dist/utils/oauth/types.js +0 -0
- package/dist/utils/overflow.d.ts +56 -0
- package/dist/utils/overflow.js +1 -0
- package/dist/utils/sanitize-unicode.d.ts +21 -0
- package/dist/utils/sanitize-unicode.js +1 -0
- package/dist/utils/typebox-helpers.d.ts +16 -0
- package/dist/utils/typebox-helpers.js +1 -0
- package/dist/utils/validation.d.ts +17 -0
- package/dist/utils/validation.js +6 -0
- package/package.json +114 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ResponseCreateParamsStreaming } from "openai/resources/responses/responses.js";
|
|
2
|
+
import type { SimpleStreamOptions, StreamFunction, StreamOptions } from "../types.ts";
|
|
3
|
+
export interface OpenAICodexResponsesOptions extends StreamOptions {
|
|
4
|
+
reasoningEffort?: "none" | "minimal" | "low" | "medium" | "high" | "xhigh";
|
|
5
|
+
reasoningSummary?: "auto" | "concise" | "detailed" | "off" | "on" | null;
|
|
6
|
+
serviceTier?: ResponseCreateParamsStreaming["service_tier"];
|
|
7
|
+
textVerbosity?: "low" | "medium" | "high";
|
|
8
|
+
}
|
|
9
|
+
export declare const streamOpenAICodexResponses: StreamFunction<"openai-codex-responses", OpenAICodexResponsesOptions>;
|
|
10
|
+
export declare const streamSimpleOpenAICodexResponses: StreamFunction<"openai-codex-responses", SimpleStreamOptions>;
|
|
11
|
+
export interface OpenAICodexWebSocketDebugStats {
|
|
12
|
+
requests: number;
|
|
13
|
+
connectionsCreated: number;
|
|
14
|
+
connectionsReused: number;
|
|
15
|
+
cachedContextRequests: number;
|
|
16
|
+
storeTrueRequests: number;
|
|
17
|
+
fullContextRequests: number;
|
|
18
|
+
deltaRequests: number;
|
|
19
|
+
lastInputItems: number;
|
|
20
|
+
lastDeltaInputItems?: number;
|
|
21
|
+
lastPreviousResponseId?: string;
|
|
22
|
+
websocketFailures: number;
|
|
23
|
+
sseFallbacks: number;
|
|
24
|
+
websocketFallbackActive?: boolean;
|
|
25
|
+
lastWebSocketError?: string;
|
|
26
|
+
}
|
|
27
|
+
export declare function getOpenAICodexWebSocketDebugStats(sessionId: string): OpenAICodexWebSocketDebugStats | undefined;
|
|
28
|
+
export declare function resetOpenAICodexWebSocketDebugStats(sessionId?: string): void;
|
|
29
|
+
export declare function closeOpenAICodexWebSocketSessions(sessionId?: string): void;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
var ie=Object.defineProperty;var a=(e,r)=>ie(e,"name",{value:r,configurable:!0});var ce=function(e,r){return typeof e=="string"&&/^\.\.?\//.test(e)?e.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(t,n,o,s,i){return n?r?".jsx":".js":o&&(!s||!i)?t:o+s+"."+i.toLowerCase()+"js"}):e};let v=null;const $=a(e=>import(ce(e)),"dynamicImport"),ue="node:os";typeof process<"u"&&(process.versions?.node||process.versions?.bun)&&$(ue).then(e=>{v=e});import{clampThinkingLevel as de}from"../models.js";import{registerSessionResourceCleanup as le}from"../session-resources.js";import{combineAbortSignals as fe}from"../utils/abort-signals.js";import{appendAssistantMessageDiagnostic as pe,createAssistantMessageDiagnostic as me,formatThrownValue as L}from"../utils/diagnostics.js";import{AssistantMessageEventStream as ye}from"../utils/event-stream.js";import{headersToRecord as F}from"../utils/headers.js";import{clampOpenAIPromptCacheKey as be}from"./openai-prompt-cache.js";import{convertResponsesMessages as U,convertResponsesTools as we,processResponsesStream as J}from"./openai-responses-shared.js";import{buildBaseOptions as he}from"./simple-options.js";const Ee="https://chatgpt.com/backend-api",ge="https://api.openai.com/auth",Se=0,H=1e3,_e=6e4,j=1e4,ke=15e3,K=new Set(["openai","openai-codex","opencode"]),xe=1009,Te=new Set(["completed","incomplete","failed","cancelled","queued","in_progress"]);function Re(e){return/GoUsageLimitError|FreeUsageLimitError|Monthly usage limit reached|available balance|insufficient_quota|out of budget|quota exceeded|billing/i.test(e)}a(Re,"isTerminalRateLimitError");function ve(e,r){return e===429&&Re(r)?!1:e===429||e===500||e===502||e===503||e===504?!0:/rate.?limit|overloaded|service.?unavailable|upstream.?connect|connection.?refused/i.test(r)}a(ve,"isRetryableError");function Ce(e){const r=e.get("retry-after-ms");if(r!==null){const s=Number(r);if(Number.isFinite(s))return Math.max(0,s)}const t=e.get("retry-after");if(!t)return;const n=Number(t);if(Number.isFinite(n))return Math.max(0,n*1e3);const o=Date.parse(t);if(!Number.isNaN(o))return Math.max(0,o-Date.now())}a(Ce,"getRetryAfterDelayMs");function Ae(e,r){const t=r?.maxRetryDelayMs??_e;return t>0?Math.min(e,t):e}a(Ae,"capRetryDelayMs");function X(e,r){return new Promise((t,n)=>{if(r?.aborted){n(new Error("Request was aborted"));return}const o=setTimeout(t,e);r?.addEventListener("abort",()=>{clearTimeout(o),n(new Error("Request was aborted"))})})}a(X,"sleep");function Y(e){if(e!==void 0){if(!Number.isFinite(e)||e<0)throw new Error(`Invalid timeoutMs: ${String(e)}`);return Math.floor(e)}}a(Y,"normalizeTimeoutMs");function Oe(){const e=new AbortController;let r;const t=setTimeout(()=>{r=new Error(`Codex SSE response headers timed out after ${j}ms`),e.abort(r)},j);return{signal:e.signal,clear:a(()=>clearTimeout(t),"clear"),error:a(()=>r,"error")}}a(Oe,"createSSEHeaderTimeout");const We=a((e,r,t)=>{const n=new ye;return(async()=>{const o={role:"assistant",content:[],api:"openai-codex-responses",provider:e.provider,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:Date.now()};try{const s=t?.apiKey;if(!s)throw new Error(`No API key for provider: ${e.provider}`);const i=rt(s);let d=Ie(e,r,t);const c=await t?.onPayload?.(d,e);c!==void 0&&(d=c);const l=t?.sessionId||nt(),y=st(e.headers,t?.headers,i,s,t?.sessionId),f=ot(e.headers,t?.headers,i,s,l),g=JSON.stringify(d),p=Y(t?.timeoutMs),S=Y(t?.websocketConnectTimeoutMs),b=t?.transport||"auto",w=b!=="sse"&&Z(t?.sessionId);if(w&&ee(t?.sessionId),b!=="sse"&&!w){let h=!1;try{if(await et(De(e.baseUrl),d,f,o,n,e,()=>{h=!0},p,S,t),t?.signal?.aborted)throw new Error("Request was aborted");n.push({type:"done",reason:o.stopReason,message:o}),n.end();return}catch(E){if(t?.signal?.aborted||qe(E)||(pe(o,me("provider_transport_failure",E,{configuredTransport:b,fallbackTransport:h?void 0:"sse",eventsEmitted:h,phase:h?"after_message_stream_start":"before_message_stream_start",requestBytes:new TextEncoder().encode(g).byteLength})),Ue(t?.sessionId,E),h))throw E;ee(t?.sessionId)}}let u,m;const k=t?.maxRetries??Se;for(let h=0;h<=k;h++){if(t?.signal?.aborted)throw new Error("Request was aborted");try{const E=Oe(),T=fe([t?.signal,E.signal]);try{u=await fetch(V(e.baseUrl),{method:"POST",headers:y,body:g,signal:T.signal})}catch(R){const A=E.error();throw A&&!t?.signal?.aborted?A:R}finally{T.cleanup(),E.clear()}if(await t?.onResponse?.({status:u.status,headers:F(u.headers)},e),u.ok)break;const B=await u.text();if(h<k&&ve(u.status,B)){const R=Ce(u.headers),A=R===void 0?H*2**h:u.status===429?Ae(R,t):R;await X(A,t?.signal);continue}const ae=new Response(B,{status:u.status,statusText:u.statusText}),P=await tt(ae);throw new Error(P.friendlyMessage||P.message)}catch(E){if(E instanceof Error&&(E.name==="AbortError"||E.message==="Request was aborted"))throw new Error("Request was aborted");if(m=E instanceof Error?E:new Error(String(E)),h<k&&!m.message.includes("usage limit")){const T=H*2**h;await X(T,t?.signal);continue}throw m}}if(!u?.ok)throw m??new Error("Failed after retries");if(!u.body)throw new Error("No response body");if(n.push({type:"start",partial:o}),await Me(u,o,n,e,t),t?.signal?.aborted)throw new Error("Request was aborted");n.push({type:"done",reason:o.stopReason,message:o}),n.end()}catch(s){for(const i of o.content)delete i.partialJson;o.stopReason=t?.signal?.aborted?"aborted":"error",o.errorMessage=s instanceof Error?s.message:String(s),n.push({type:"error",reason:o.stopReason,error:o}),n.end()}})(),n},"streamOpenAICodexResponses"),bt=a((e,r,t)=>{const n=t?.apiKey;if(!n)throw new Error(`No API key for provider: ${e.provider}`);const o=he(e,t,n),s=t?.reasoning?de(e,t.reasoning):void 0;return We(e,r,{...o,reasoningEffort:s==="off"?void 0:s})},"streamSimpleOpenAICodexResponses");function Ie(e,r,t){const n=U(e,r,K,{includeSystemPrompt:!1}),o={model:e.id,store:!1,stream:!0,instructions:r.systemPrompt||"You are a helpful assistant.",input:n,text:{verbosity:t?.textVerbosity||"low"},include:["reasoning.encrypted_content"],prompt_cache_key:be(t?.sessionId),tool_choice:"auto",parallel_tool_calls:!0};if(t?.temperature!==void 0&&(o.temperature=t.temperature),t?.serviceTier!==void 0&&(o.service_tier=t.serviceTier),r.tools&&r.tools.length>0&&(o.tools=we(r.tools,{strict:null})),t?.reasoningEffort!==void 0){const s=t.reasoningEffort==="none"?e.thinkingLevelMap?.off??"none":e.thinkingLevelMap?.[t.reasoningEffort]??t.reasoningEffort;s!==null&&(o.reasoning={effort:s,summary:t.reasoningSummary??"auto"})}return o}a(Ie,"buildRequestBody");function Le(e,r){switch(r){case"flex":return .5;case"priority":return e.id==="gpt-5.5"?2.5:2;default:return 1}}a(Le,"getServiceTierCostMultiplier");function z(e,r,t){const n=Le(t,r);n!==1&&(e.cost.input*=n,e.cost.output*=n,e.cost.cacheRead*=n,e.cost.cacheWrite*=n,e.cost.total=e.cost.input+e.cost.output+e.cost.cacheRead+e.cost.cacheWrite)}a(z,"applyServiceTierPricing");function G(e,r){return e==="default"&&(r==="flex"||r==="priority")?r:e??r}a(G,"resolveCodexServiceTier");function V(e){const t=(e&&e.trim().length>0?e:Ee).replace(/\/+$/,"");return t.endsWith("/codex/responses")?t:t.endsWith("/codex")?`${t}/responses`:`${t}/codex/responses`}a(V,"resolveCodexUrl");function De(e){const r=new URL(V(e));return r.protocol==="https:"&&(r.protocol="wss:"),r.protocol==="http:"&&(r.protocol="ws:"),r.toString()}a(De,"resolveCodexWebSocketUrl");async function Me(e,r,t,n,o){await J(Q(Be(e,o?.signal)),r,t,n,{serviceTier:o?.serviceTier,resolveServiceTier:G,applyServiceTierPricing:a((s,i)=>z(s,i,n),"applyServiceTierPricing")})}a(Me,"processStream");class D extends Error{static{a(this,"CodexApiError")}code;payload;constructor(r,t){super(r),this.name="CodexApiError",this.code=t?.code,this.payload=t?.payload,this.cause=t?.cause}}class M extends Error{static{a(this,"CodexProtocolError")}payload;constructor(r,t){super(r),this.name="CodexProtocolError",this.payload=t?.payload,this.cause=t?.cause}}function qe(e){return e instanceof D||e instanceof M}a(qe,"isCodexNonTransportError");async function*Q(e){for await(const r of e){const t=typeof r.type=="string"?r.type:void 0;if(t){if(t==="error"){const n=r.code||"",o=r.message||"";throw new D(`Codex error: ${o||n||JSON.stringify(r)}`,{code:n||void 0,payload:r})}if(t==="response.failed"){const n=r.response,o=n?.error?.code,s=n?.error?.message;throw new D(s||"Codex response failed",{code:o,payload:r})}if(t==="response.done"||t==="response.completed"||t==="response.incomplete"){const n=r.response,o=n&&{...n,status:Ne(n.status)};yield{...r,type:"response.completed",response:o};return}yield r}}}a(Q,"mapCodexEvents");function Ne(e){if(typeof e=="string")return Te.has(e)?e:void 0}a(Ne,"normalizeCodexStatus");async function*Be(e,r){if(!e.body)return;const t=e.body.getReader(),n=new TextDecoder;let o="";const s=a(()=>{t.cancel().catch(()=>{})},"onAbort");r?.addEventListener("abort",s,{once:!0});try{for(;;){if(r?.aborted)throw new Error("Request was aborted");const{done:i,value:d}=await t.read();if(r?.aborted)throw new Error("Request was aborted");if(i)break;o+=n.decode(d,{stream:!0});let c=o.indexOf(`
|
|
2
|
+
|
|
3
|
+
`);for(;c!==-1;){const l=o.slice(0,c);o=o.slice(c+2);const y=l.split(`
|
|
4
|
+
`).filter(f=>f.startsWith("data:")).map(f=>f.slice(5).trim());if(y.length>0){const f=y.join(`
|
|
5
|
+
`).trim();if(f&&f!=="[DONE]")try{yield JSON.parse(f)}catch(g){throw new M(`Invalid Codex SSE JSON: ${L(g)}`,{cause:g,payload:f})}}c=o.indexOf(`
|
|
6
|
+
|
|
7
|
+
`)}}}finally{r?.removeEventListener("abort",s);try{await t.cancel()}catch{}try{t.releaseLock()}catch{}}}a(Be,"parseSSE");const Pe="responses_websockets=2026-02-06",$e=300*1e3,_=new Map,C=new Map,O=new Set;function q(e){let r=C.get(e);return r||(r={requests:0,connectionsCreated:0,connectionsReused:0,cachedContextRequests:0,storeTrueRequests:0,fullContextRequests:0,deltaRequests:0,lastInputItems:0,websocketFailures:0,sseFallbacks:0},C.set(e,r)),r}a(q,"getOrCreateWebSocketDebugStats");function wt(e){const r=C.get(e);return r?{...r}:void 0}a(wt,"getOpenAICodexWebSocketDebugStats");function ht(e){if(e){C.delete(e),O.delete(e);return}C.clear(),O.clear()}a(ht,"resetOpenAICodexWebSocketDebugStats");function Fe(e){const r=a(t=>{t.idleTimer&&clearTimeout(t.idleTimer),x(t.socket,1e3,"debug_close")},"closeEntry");if(e){const t=_.get(e);t&&r(t),_.delete(e);return}for(const t of _.values())r(t);_.clear()}a(Fe,"closeOpenAICodexWebSocketSessions"),le(Fe);function Z(e){return e?O.has(e):!1}a(Z,"isWebSocketSseFallbackActive");function ee(e){if(!e)return;const r=q(e);r.sseFallbacks++,r.websocketFallbackActive=Z(e)}a(ee,"recordWebSocketSseFallback");function Ue(e,r){if(!e)return;O.add(e);const t=q(e);t.websocketFailures++,t.lastWebSocketError=L(r),t.websocketFallbackActive=!0}a(Ue,"recordWebSocketFailure");let W=null;async function Je(){if(W)return W;if(process?.versions?.bun&&(process.env.HTTP_PROXY||process.env.HTTPS_PROXY||process.env.http_proxy||process.env.https_proxy)){const t=(await $("proxy-from-env")).getProxyForUrl;return W=class extends WebSocket{static{a(this,"_cachedWebsocket")}constructor(n,o){let s={};Array.isArray(o)||typeof o=="string"?s={protocols:o}:s={...o};const i=t(n.toString().replace(/^wss:/,"https:").replace(/^ws:/,"http:"));super(n,{...s,...i?{proxy:i}:{}})}},W}const e=globalThis.WebSocket;return typeof e!="function"?null:e}a(Je,"getWebSocketConstructor");class He extends Error{static{a(this,"WebSocketCloseError")}code;reason;wasClean;constructor(r,t){super(r),this.name="WebSocketCloseError",this.code=t?.code,this.reason=t?.reason,this.wasClean=t?.wasClean}}function je(e){const r=e.readyState;return typeof r=="number"?r:void 0}a(je,"getWebSocketReadyState");function I(e){const r=je(e);return r===void 0||r===1}a(I,"isWebSocketReusable");function x(e,r=1e3,t="done"){try{e.close(r,t)}catch{}}a(x,"closeWebSocketSilently");function te(e,r){r.idleTimer&&clearTimeout(r.idleTimer),r.idleTimer=setTimeout(()=>{r.busy||(x(r.socket,1e3,"idle_timeout"),_.delete(e))},$e)}a(te,"scheduleSessionWebSocketExpiry");async function N(e,r,t,n=ke){const o=await Je();if(!o)throw new Error("WebSocket transport is not available in this runtime");const s=F(r);return delete s["OpenAI-Beta"],new Promise((i,d)=>{let c=!1,l,y;try{y=new o(e,{headers:s})}catch(u){d(u instanceof Error?u:new Error(String(u)));return}const f=a(()=>{l&&(clearTimeout(l),l=void 0),y.removeEventListener("open",p),y.removeEventListener("error",S),y.removeEventListener("close",b),t?.removeEventListener("abort",w)},"cleanup"),g=a((u,m)=>{c||(c=!0,f(),m&&x(y,1e3,m),d(u))},"fail"),p=a(()=>{c||(c=!0,f(),i(y))},"onOpen"),S=a(u=>{g(re(u))},"onError"),b=a(u=>{g(ne(u))},"onClose"),w=a(()=>{g(new Error("Request was aborted"),"aborted")},"onAbort");y.addEventListener("open",p),y.addEventListener("error",S),y.addEventListener("close",b),t?.addEventListener("abort",w),n>0&&(l=setTimeout(()=>{g(new Error(`WebSocket connect timeout after ${n}ms`),"connect_timeout")},n)),t?.aborted&&w()})}a(N,"connectWebSocket");async function Ke(e,r,t,n,o){if(!t){const c=await N(e,r,n,o);return{socket:c,reused:!1,release:a(()=>x(c),"release")}}const s=_.get(t);if(s){if(s.idleTimer&&(clearTimeout(s.idleTimer),s.idleTimer=void 0),!s.busy&&I(s.socket))return s.busy=!0,{socket:s.socket,entry:s,reused:!0,release:a(({keep:c}={})=>{if(!c||!I(s.socket)){x(s.socket),_.delete(t);return}s.busy=!1,te(t,s)},"release")};if(s.busy){const c=await N(e,r,n,o);return{socket:c,reused:!1,release:a(()=>{x(c)},"release")}}I(s.socket)||(x(s.socket),_.delete(t))}const i=await N(e,r,n,o),d={socket:i,busy:!0};return _.set(t,d),{socket:i,entry:d,reused:!1,release:a(({keep:c}={})=>{if(!c||!I(d.socket)){x(d.socket),d.idleTimer&&clearTimeout(d.idleTimer),_.get(t)===d&&_.delete(t);return}d.busy=!1,te(t,d)},"release")}}a(Ke,"acquireWebSocket");function re(e){if(e&&typeof e=="object"){const r="message"in e?e.message:void 0;if(typeof r=="string"&&r.length>0)return new Error(r);const t="error"in e?e.error:void 0;if(t instanceof Error&&t.message.length>0)return t;if(t&&typeof t=="object"&&"message"in t){const n=t.message;if(typeof n=="string"&&n.length>0)return new Error(n)}}return new Error("WebSocket error")}a(re,"extractWebSocketError");function ne(e){if(e&&typeof e=="object"){const r="code"in e?e.code:void 0,t="reason"in e?e.reason:void 0,n="wasClean"in e?e.wasClean:void 0,o=typeof r=="number"?` ${r}`:"";let s=typeof t=="string"&&t.length>0?` ${t}`:"";return!s&&r===xe&&(s=" message too big"),new He(`WebSocket closed${o}${s}`.trim(),{code:typeof r=="number"?r:void 0,reason:typeof t=="string"&&t.length>0?t:void 0,wasClean:typeof n=="boolean"?n:void 0})}return new Error("WebSocket closed")}a(ne,"extractWebSocketCloseError");async function Xe(e){if(typeof e=="string")return e;if(e instanceof ArrayBuffer)return new TextDecoder().decode(new Uint8Array(e));if(ArrayBuffer.isView(e)){const r=e;return new TextDecoder().decode(new Uint8Array(r.buffer,r.byteOffset,r.byteLength))}if(e&&typeof e=="object"&&"arrayBuffer"in e){const t=await e.arrayBuffer();return new TextDecoder().decode(new Uint8Array(t))}return null}a(Xe,"decodeWebSocketData");async function*Ye(e,r,t){const n=[];let o=null,s=!1,i=null,d=!1;const c=a(()=>{if(!o)return;const p=o;o=null,p()},"wake"),l=a(p=>{(async()=>{let S=null;try{if(!p||typeof p!="object"||!("data"in p)||(S=await Xe(p.data),!S))return;const b=JSON.parse(S),w=typeof b.type=="string"?b.type:"";(w==="response.completed"||w==="response.done"||w==="response.incomplete")&&(d=!0,s=!0),n.push(b),c()}catch(b){i=new M(`Invalid Codex WebSocket JSON: ${L(b)}`,{cause:b,payload:S}),s=!0,c()}})()},"onMessage"),y=a(p=>{i=re(p),s=!0,c()},"onError"),f=a(p=>{if(d){s=!0,c();return}i||(i=ne(p)),s=!0,c()},"onClose"),g=a(()=>{i=new Error("Request was aborted"),s=!0,c()},"onAbort");e.addEventListener("message",l),e.addEventListener("error",y),e.addEventListener("close",f),r?.addEventListener("abort",g);try{for(;;){if(r?.aborted)throw new Error("Request was aborted");if(n.length>0){yield n.shift();continue}if(s)break;let p;await new Promise((S,b)=>{o=S,t!==void 0&&t>0&&(p=setTimeout(()=>{const w=new Error(`WebSocket idle timeout after ${t}ms`);i=w,s=!0,o=null,x(e,1e3,"idle_timeout"),b(w)},t))}).finally(()=>{p&&clearTimeout(p)})}if(i)throw i;if(!d)throw new Error("WebSocket stream closed before response.completed")}finally{e.removeEventListener("message",l),e.removeEventListener("error",y),e.removeEventListener("close",f),r?.removeEventListener("abort",g)}}a(Ye,"parseWebSocket");function se(e){const{input:r,previous_response_id:t,...n}=e;return n}a(se,"requestBodyWithoutInput");function ze(e,r){return JSON.stringify(e??[])===JSON.stringify(r??[])}a(ze,"responseInputsEqual");function Ge(e,r){return JSON.stringify(se(e))===JSON.stringify(se(r))}a(Ge,"requestBodiesMatchExceptInput");function Ve(e,r){if(!Ge(e,r.lastRequestBody))return;const t=e.input??[],n=[...r.lastRequestBody.input??[],...r.lastResponseItems];if(t.length<n.length)return;const o=t.slice(0,n.length);if(ze(o,n))return t.slice(n.length)}a(Ve,"getCachedWebSocketInputDelta");function Qe(e,r){const t=e.continuation;if(!t)return r;const n=Ve(r,t);return!n||!t.lastResponseId?(e.continuation=void 0,r):{...r,previous_response_id:t.lastResponseId,input:n}}a(Qe,"buildCachedWebSocketRequestBody");async function*Ze(e,r,t,n){let o=!1;for await(const s of e)o||(o=!0,n(),t.push({type:"start",partial:r})),yield s}a(Ze,"startWebSocketOutputOnFirstEvent");async function et(e,r,t,n,o,s,i,d,c,l){const{socket:y,entry:f,reused:g,release:p}=await Ke(e,t,l?.sessionId,l?.signal,c);let S=!0;const b=l?.transport==="websocket-cached"||l?.transport==="auto",w=r,u=b&&f?Qe(f,w):w,m=l?.sessionId?q(l.sessionId):void 0;m&&(m.requests++,g?m.connectionsReused++:m.connectionsCreated++,b&&m.cachedContextRequests++,u.store===!0&&m.storeTrueRequests++,m.lastInputItems=u.input?.length??0,u.previous_response_id?(m.deltaRequests++,m.lastDeltaInputItems=u.input?.length??0,m.lastPreviousResponseId=u.previous_response_id):(m.fullContextRequests++,m.lastDeltaInputItems=void 0,m.lastPreviousResponseId=void 0));try{if(y.send(JSON.stringify({type:"response.create",...u})),await J(Ze(Q(Ye(y,l?.signal,d)),n,o,i),n,o,s,{serviceTier:l?.serviceTier,resolveServiceTier:G,applyServiceTierPricing:a((k,h)=>z(k,h,s),"applyServiceTierPricing")}),l?.signal?.aborted)S=!1;else if(b&&f&&n.responseId){const k=U(s,{messages:[n]},K,{includeSystemPrompt:!1}).filter(h=>h.type!=="function_call_output");f.continuation={lastRequestBody:w,lastResponseId:n.responseId,lastResponseItems:k}}}catch(k){throw f&&(f.continuation=void 0),S=!1,k}finally{p({keep:S})}}a(et,"processWebSocketStream");async function tt(e){const r=await e.text();let t=r||e.statusText||"Request failed",n;try{const s=JSON.parse(r)?.error;if(s){const i=s.code||s.type||"";if(/usage_limit_reached|usage_not_included|rate_limit_exceeded/i.test(i)||e.status===429){const d=s.plan_type?` (${s.plan_type.toLowerCase()} plan)`:"",c=s.resets_at?Math.max(0,Math.round((s.resets_at*1e3-Date.now())/6e4)):void 0,l=c!==void 0?` Try again in ~${c} min.`:"";n=`You have hit your ChatGPT usage limit${d}.${l}`.trim()}t=s.message||n||t}}catch{}return{message:t,friendlyMessage:n}}a(tt,"parseErrorResponse");function rt(e){try{const r=e.split(".");if(r.length!==3)throw new Error("Invalid token");const n=JSON.parse(atob(r[1]))?.[ge]?.chatgpt_account_id;if(!n)throw new Error("No account ID in token");return n}catch{throw new Error("Failed to extract accountId from token")}}a(rt,"extractAccountId");function nt(){return typeof globalThis.crypto?.randomUUID=="function"?globalThis.crypto.randomUUID():`codex_${Date.now()}_${Math.random().toString(36).slice(2,10)}`}a(nt,"createCodexRequestId");function oe(e,r,t,n){const o=new Headers(e);for(const[i,d]of Object.entries(r||{}))o.set(i,d);o.set("Authorization",`Bearer ${n}`),o.set("chatgpt-account-id",t),o.set("originator","pi");const s=v?`pi (${v.platform()} ${v.release()}; ${v.arch()})`:"pi (browser)";return o.set("User-Agent",s),o}a(oe,"buildBaseCodexHeaders");function st(e,r,t,n,o){const s=oe(e,r,t,n);return s.set("OpenAI-Beta","responses=experimental"),s.set("accept","text/event-stream"),s.set("content-type","application/json"),o&&(s.set("session-id",o),s.set("x-client-request-id",o)),s}a(st,"buildSSEHeaders");function ot(e,r,t,n,o){const s=oe(e,r,t,n);return s.delete("accept"),s.delete("content-type"),s.delete("OpenAI-Beta"),s.delete("openai-beta"),s.set("OpenAI-Beta",Pe),s.set("x-client-request-id",o),s.set("session-id",o),s}a(ot,"buildWebSocketHeaders");export{Fe as closeOpenAICodexWebSocketSessions,wt as getOpenAICodexWebSocketDebugStats,ht as resetOpenAICodexWebSocketDebugStats,We as streamOpenAICodexResponses,bt as streamSimpleOpenAICodexResponses};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ChatCompletionMessageParam } from "openai/resources/chat/completions.js";
|
|
2
|
+
import type { Context, Model, OpenAICompletionsCompat, SimpleStreamOptions, StreamFunction, StreamOptions } from "../types.ts";
|
|
3
|
+
export interface OpenAICompletionsOptions extends StreamOptions {
|
|
4
|
+
toolChoice?: "auto" | "none" | "required" | {
|
|
5
|
+
type: "function";
|
|
6
|
+
function: {
|
|
7
|
+
name: string;
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
reasoningEffort?: "minimal" | "low" | "medium" | "high" | "xhigh";
|
|
11
|
+
}
|
|
12
|
+
type ResolvedOpenAICompletionsCompat = Omit<Required<OpenAICompletionsCompat>, "cacheControlFormat"> & {
|
|
13
|
+
cacheControlFormat?: OpenAICompletionsCompat["cacheControlFormat"];
|
|
14
|
+
};
|
|
15
|
+
export declare const streamOpenAICompletions: StreamFunction<"openai-completions", OpenAICompletionsOptions>;
|
|
16
|
+
export declare const streamSimpleOpenAICompletions: StreamFunction<"openai-completions", SimpleStreamOptions>;
|
|
17
|
+
export declare function convertMessages(model: Model<"openai-completions">, context: Context, compat: ResolvedOpenAICompletionsCompat): ChatCompletionMessageParam[];
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
var W=Object.defineProperty;var p=(e,n)=>W(e,"name",{value:n,configurable:!0});import $ from"openai";import{calculateCost as j,clampThinkingLevel as G}from"../models.js";import{AssistantMessageEventStream as J}from"../utils/event-stream.js";import{headersToRecord as K}from"../utils/headers.js";import{parseStreamingJson as O}from"../utils/json-parse.js";import{sanitizeSurrogates as M}from"../utils/sanitize-unicode.js";import{isCloudflareProvider as V,resolveCloudflareBaseUrl as Z}from"./cloudflare.js";import{buildCopilotDynamicHeaders as Q,hasCopilotVisionInput as X}from"./github-copilot-headers.js";import{clampOpenAIPromptCacheKey as Y}from"./openai-prompt-cache.js";import{buildBaseOptions as ee}from"./simple-options.js";import{transformMessages as te}from"./transform-messages.js";function ne(e){for(const n of e)if(n.role==="toolResult"||n.role==="assistant"&&n.content.some(t=>t.type==="toolCall"))return!0;return!1}p(ne,"hasToolHistory");function B(e){return e.type==="text"}p(B,"isTextContentBlock");function se(e){return e.type==="thinking"}p(se,"isThinkingContentBlock");function oe(e){return e.type==="toolCall"}p(oe,"isToolCallBlock");function re(e){return e.type==="image"}p(re,"isImageContentBlock");function L(e){return e||(typeof process<"u"&&process.env.KODA_CACHE_RETENTION==="long"?"long":"short")}p(L,"resolveCacheRetention");const ie=p((e,n,t)=>{const s=new J;return(async()=>{const o={role:"assistant",content:[],api:e.api,provider:e.provider,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:Date.now()};try{const u=t?.apiKey;if(!u)throw new Error(`No API key for provider: ${e.provider}`);const f=q(e),r=L(t?.cacheRetention),i=r==="none"?void 0:t?.sessionId,l=ae(e,n,u,t?.headers,i,f);let d=le(e,n,t,f,r);const y=await t?.onPayload?.(d,e);y!==void 0&&(d=y);const x={...t?.signal?{signal:t.signal}:{},...t?.timeoutMs!==void 0?{timeout:t.timeoutMs}:{},maxRetries:t?.maxRetries??0},{data:C,response:_}=await l.chat.completions.create(d,x).withResponse();await t?.onResponse?.({status:_.status,headers:K(_.headers)},e),s.push({type:"start",partial:o});let T=null,c=null,R=!1;const I=new Map,E=new Map,w=o.content,A=p(a=>w.indexOf(a),"getContentIndex"),z=p(a=>{const g=A(a);g!==-1&&(a.type==="text"?s.push({type:"text_end",contentIndex:g,content:a.text,partial:o}):a.type==="thinking"?s.push({type:"thinking_end",contentIndex:g,content:a.thinking,partial:o}):a.type==="toolCall"&&(a.arguments=O(a.partialArgs),delete a.partialArgs,delete a.streamIndex,s.push({type:"toolcall_end",contentIndex:g,toolCall:a,partial:o})))},"finishBlock"),D=p(()=>(T||(T={type:"text",text:""},w.push(T),s.push({type:"text_start",contentIndex:A(T),partial:o})),T),"ensureTextBlock"),U=p(a=>(c||(c={type:"thinking",thinking:"",thinkingSignature:a},w.push(c),s.push({type:"thinking_start",contentIndex:A(c),partial:o})),c),"ensureThinkingBlock"),H=p(a=>{const g=typeof a.index=="number"?a.index:void 0;let m=g!==void 0?I.get(g):void 0;return!m&&a.id&&(m=E.get(a.id)),m||(m={type:"toolCall",id:a.id||"",name:a.function?.name||"",arguments:{},partialArgs:"",streamIndex:g},g!==void 0&&I.set(g,m),a.id&&E.set(a.id,m),w.push(m),s.push({type:"toolcall_start",contentIndex:A(m),partial:o})),g!==void 0&&m.streamIndex===void 0&&(m.streamIndex=g,I.set(g,m)),a.id&&E.set(a.id,m),m},"ensureToolCallBlock");for await(const a of C){if(!a||typeof a!="object")continue;o.responseId||=a.id,typeof a.model=="string"&&a.model.length>0&&a.model!==e.id&&(o.responseModel||=a.model),a.usage&&(o.usage=N(a.usage,e));const g=Array.isArray(a.choices)?a.choices[0]:void 0;if(g){if(!a.usage&&g.usage&&(o.usage=N(g.usage,e)),g.finish_reason){const m=ye(g.finish_reason);o.stopReason=m.stopReason,m.errorMessage&&(o.errorMessage=m.errorMessage),R=!0}if(g.delta){if(g.delta.content!==null&&g.delta.content!==void 0&&g.delta.content.length>0){const h=D();h.text+=g.delta.content,s.push({type:"text_delta",contentIndex:A(h),delta:g.delta.content,partial:o})}const m=["reasoning_content","reasoning","reasoning_text"],F=g.delta;let S=null;for(const h of m){const k=F[h];if(typeof k=="string"&&k.length>0){S=h;break}}if(S){const h=F[S];if(typeof h=="string"&&h.length>0){const k=e.provider==="opencode-go"&&S==="reasoning"?"reasoning_content":S,v=U(k);v.thinking+=h,s.push({type:"thinking_delta",contentIndex:A(v),delta:h,partial:o})}}if(g?.delta?.tool_calls)for(const h of g.delta.tool_calls){const k=H(h);!k.id&&h.id&&(k.id=h.id,E.set(h.id,k)),!k.name&&h.function?.name&&(k.name=h.function.name);let v="";h.function?.arguments&&(v=h.function.arguments,k.partialArgs=(k.partialArgs??"")+h.function.arguments,k.arguments=O(k.partialArgs)),s.push({type:"toolcall_delta",contentIndex:A(k),delta:v,partial:o})}const b=g.delta.reasoning_details;if(b&&Array.isArray(b)){for(const h of b)if(h.type==="reasoning.encrypted"&&h.id&&h.data){const k=o.content.find(v=>v.type==="toolCall"&&v.id===h.id);k&&(k.thoughtSignature=JSON.stringify(h))}}}}}for(const a of w)z(a);if(t?.signal?.aborted)throw new Error("Request was aborted");if(o.stopReason==="aborted")throw new Error("Request was aborted");if(o.stopReason==="error")throw new Error(o.errorMessage||"Provider returned an error stop reason");if(!R)throw new Error("Stream ended without finish_reason");s.push({type:"done",reason:o.stopReason,message:o}),s.end()}catch(u){for(const r of o.content)delete r.index,delete r.partialArgs,delete r.streamIndex;o.stopReason=t?.signal?.aborted?"aborted":"error",o.errorMessage=u instanceof Error?u.message:JSON.stringify(u);const f=u?.error?.metadata?.raw;f&&(o.errorMessage+=`
|
|
2
|
+
${f}`),s.push({type:"error",reason:o.stopReason,error:o}),s.end()}})(),s},"streamOpenAICompletions"),qe=p((e,n,t)=>{const s=t?.apiKey;if(!s)throw new Error(`No API key for provider: ${e.provider}`);const o=ee(e,t,s),u=t?.reasoning?G(e,t.reasoning):void 0,f=u==="off"?void 0:u,r=t?.toolChoice;return ie(e,n,{...o,reasoningEffort:f,toolChoice:r})},"streamSimpleOpenAICompletions");function ae(e,n,t,s,o,u=q(e)){const f={...e.headers};if(e.provider==="github-copilot"){const i=X(n.messages),l=Q({messages:n.messages,hasImages:i});Object.assign(f,l)}o&&u.sendSessionAffinityHeaders&&(f.session_id=o,f["x-client-request-id"]=o,f["x-session-affinity"]=o),s&&Object.assign(f,s);const r=e.provider==="cloudflare-ai-gateway"?{...f,Authorization:f.Authorization??null,"cf-aig-authorization":`Bearer ${t}`}:f;return new $({apiKey:t,baseURL:V(e.provider)?Z(e):e.baseUrl,dangerouslyAllowBrowser:!0,defaultHeaders:r})}p(ae,"createClient");function le(e,n,t,s=q(e),o=L(t?.cacheRetention)){const u=me(e,n,s),f=ce(s,o),r={model:e.id,messages:u,stream:!0,prompt_cache_key:e.baseUrl.includes("api.openai.com")&&o!=="none"||o==="long"&&s.supportsLongCacheRetention?Y(t?.sessionId):void 0,prompt_cache_retention:o==="long"&&s.supportsLongCacheRetention?"24h":void 0};if(s.supportsUsageInStreaming!==!1&&(r.stream_options={include_usage:!0}),s.supportsStore&&(r.store=!1),t?.maxTokens&&(s.maxTokensField==="max_tokens"?r.max_tokens=t.maxTokens:r.max_completion_tokens=t.maxTokens),t?.temperature!==void 0&&(r.temperature=t.temperature),n.tools&&n.tools.length>0?(r.tools=ke(n.tools,s),s.zaiToolStream&&(r.tool_stream=!0)):ne(n.messages)&&(r.tools=[]),f&&ue(u,r.tools,f),t?.toolChoice&&(r.tool_choice=t.toolChoice),s.thinkingFormat==="zai"&&e.reasoning)r.enable_thinking=!!t?.reasoningEffort;else if(s.thinkingFormat==="qwen"&&e.reasoning)r.enable_thinking=!!t?.reasoningEffort;else if(s.thinkingFormat==="qwen-chat-template"&&e.reasoning)r.chat_template_kwargs={enable_thinking:!!t?.reasoningEffort,preserve_thinking:!0};else if(s.thinkingFormat==="deepseek"&&e.reasoning)r.thinking={type:t?.reasoningEffort?"enabled":"disabled"},t?.reasoningEffort&&s.supportsReasoningEffort&&(r.reasoning_effort=e.thinkingLevelMap?.[t.reasoningEffort]??t.reasoningEffort);else if(s.thinkingFormat==="openrouter"&&e.reasoning){const i=r;t?.reasoningEffort?i.reasoning={effort:e.thinkingLevelMap?.[t.reasoningEffort]??t.reasoningEffort}:e.thinkingLevelMap?.off!==null&&(i.reasoning={effort:e.thinkingLevelMap?.off??"none"})}else if(s.thinkingFormat==="together"&&e.reasoning){const i=r;i.reasoning={enabled:!!t?.reasoningEffort},t?.reasoningEffort&&s.supportsReasoningEffort&&(i.reasoning_effort=e.thinkingLevelMap?.[t.reasoningEffort]??t.reasoningEffort)}else if(s.thinkingFormat==="string-thinking"&&e.reasoning){const i=r;t?.reasoningEffort?i.thinking=e.thinkingLevelMap?.[t.reasoningEffort]??t.reasoningEffort:e.thinkingLevelMap?.off!==null&&(i.thinking=e.thinkingLevelMap?.off??"none")}else if(t?.reasoningEffort&&e.reasoning&&s.supportsReasoningEffort)r.reasoning_effort=e.thinkingLevelMap?.[t.reasoningEffort]??t.reasoningEffort;else if(!t?.reasoningEffort&&e.reasoning&&s.supportsReasoningEffort){const i=e.thinkingLevelMap?.off;typeof i=="string"&&(r.reasoning_effort=i)}if(e.baseUrl.includes("openrouter.ai")&&e.compat?.openRouterRouting&&(r.provider=e.compat.openRouterRouting),e.baseUrl.includes("ai-gateway.vercel.sh")&&e.compat?.vercelGatewayRouting){const i=e.compat.vercelGatewayRouting;if(i.only||i.order){const l={};i.only&&(l.only=i.only),i.order&&(l.order=i.order),r.providerOptions={gateway:l}}}return r}p(le,"buildParams");function ce(e,n){if(e.cacheControlFormat!=="anthropic"||n==="none")return;const t=n==="long"&&e.supportsLongCacheRetention?"1h":void 0;return{type:"ephemeral",...t?{ttl:t}:{}}}p(ce,"getCompatCacheControl");function ue(e,n,t){fe(e,t),ge(n,t),pe(e,t)}p(ue,"applyAnthropicCacheControl");function fe(e,n){for(const t of e)if(t.role==="system"||t.role==="developer"){he(t,n);return}}p(fe,"addCacheControlToSystemPrompt");function pe(e,n){for(let t=e.length-1;t>=0;t--){const s=e[t];if((s.role==="user"||s.role==="assistant")&&de(s,n))return}}p(pe,"addCacheControlToLastConversationMessage");function ge(e,n){if(!e||e.length===0)return;const t=e[e.length-1];t.cache_control=n}p(ge,"addCacheControlToLastTool");function he(e,n){return P(e,n)}p(he,"addCacheControlToInstructionMessage");function de(e,n){return e.role==="user"||e.role==="assistant"?P(e,n):!1}p(de,"addCacheControlToMessage");function P(e,n){const t=e.content;if(typeof t=="string")return t.length===0?!1:(e.content=[{type:"text",text:t,cache_control:n}],!0);if(!Array.isArray(t))return!1;for(let s=t.length-1;s>=0;s--){const o=t[s];if(o?.type==="text"){const u=o;return u.cache_control=n,!0}}return!1}p(P,"addCacheControlToTextContent");function me(e,n,t){const s=[],o=p(r=>{if(r.includes("|")){const[i]=r.split("|");return i.replace(/[^a-zA-Z0-9_-]/g,"_").slice(0,40)}return e.provider==="openai"&&r.length>40?r.slice(0,40):r},"normalizeToolCallId"),u=te(n.messages,e,r=>o(r));if(n.systemPrompt){const i=e.reasoning&&t.supportsDeveloperRole?"developer":"system";s.push({role:i,content:M(n.systemPrompt)})}let f=null;for(let r=0;r<u.length;r++){const i=u[r];if(t.requiresAssistantAfterToolResult&&f==="toolResult"&&i.role==="user"&&s.push({role:"assistant",content:"I have processed the tool results."}),i.role==="user")if(typeof i.content=="string")s.push({role:"user",content:M(i.content)});else{const l=i.content.map(d=>d.type==="text"?{type:"text",text:M(d.text)}:{type:"image_url",image_url:{url:`data:${d.mimeType};base64,${d.data}`}});if(l.length===0)continue;s.push({role:"user",content:l})}else if(i.role==="assistant"){const l={role:"assistant",content:t.requiresAssistantAfterToolResult?"":null},d=i.content.filter(B).filter(c=>c.text.trim().length>0).map(c=>({type:"text",text:M(c.text)})),y=d.map(c=>c.text).join(""),x=i.content.filter(se).filter(c=>c.thinking.trim().length>0);if(x.length>0)if(t.requiresThinkingAsText){const c=x.map(R=>M(R.thinking)).join(`
|
|
3
|
+
|
|
4
|
+
`);l.content=[{type:"text",text:c},...d]}else{y.length>0&&(l.content=y);let c=x[0].thinkingSignature;e.provider==="opencode-go"&&c==="reasoning"&&(c="reasoning_content"),c&&c.length>0&&(l[c]=x.map(R=>R.thinking).join(`
|
|
5
|
+
`))}else y.length>0&&(l.content=y);const C=i.content.filter(oe);if(C.length>0){l.tool_calls=C.map(R=>({id:R.id,type:"function",function:{name:R.name,arguments:JSON.stringify(R.arguments)}}));const c=C.filter(R=>R.thoughtSignature).map(R=>{try{return JSON.parse(R.thoughtSignature)}catch{return null}}).filter(Boolean);c.length>0&&(l.reasoning_details=c)}t.requiresReasoningContentOnAssistantMessages&&e.reasoning&&l.reasoning_content===void 0&&(l.reasoning_content="");const _=l.content;if(!(_!=null&&_.length>0)&&!l.tool_calls)continue;s.push(l)}else if(i.role==="toolResult"){const l=[];let d=r;for(;d<u.length&&u[d].role==="toolResult";d++){const y=u[d],x=y.content.filter(B).map(c=>c.text).join(`
|
|
6
|
+
`),C=y.content.some(c=>c.type==="image"),_=x.length>0,T={role:"tool",content:M(_?x:"(see attached image)"),tool_call_id:y.toolCallId};if(t.requiresToolResultName&&y.toolName&&(T.name=y.toolName),s.push(T),C&&e.input.includes("image"))for(const c of y.content)re(c)&&l.push({type:"image_url",image_url:{url:`data:${c.mimeType};base64,${c.data}`}})}r=d-1,l.length>0?(t.requiresAssistantAfterToolResult&&s.push({role:"assistant",content:"I have processed the tool results."}),s.push({role:"user",content:[{type:"text",text:"Attached image(s) from tool result:"},...l]}),f="user"):f="toolResult";continue}f=i.role}return s}p(me,"convertMessages");function ke(e,n){return e.map(t=>({type:"function",function:{name:t.name,description:t.description,parameters:t.parameters,...n.supportsStrictMode!==!1&&{strict:!1}}}))}p(ke,"convertTools");function N(e,n){const t=e.prompt_tokens||0,s=e.prompt_tokens_details?.cached_tokens??e.prompt_cache_hit_tokens??0,o=e.prompt_tokens_details?.cache_write_tokens||0,u=Math.max(0,t-s-o),f=e.completion_tokens||0,r={input:u,output:f,cacheRead:s,cacheWrite:o,totalTokens:u+f+s+o,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}};return j(n,r),r}p(N,"parseChunkUsage");function ye(e){if(e===null)return{stopReason:"stop"};switch(e){case"stop":case"end":return{stopReason:"stop"};case"length":return{stopReason:"length"};case"function_call":case"tool_calls":return{stopReason:"toolUse"};case"content_filter":return{stopReason:"error",errorMessage:"Provider finish_reason: content_filter"};case"network_error":return{stopReason:"error",errorMessage:"Provider finish_reason: network_error"};default:return{stopReason:"error",errorMessage:`Provider finish_reason: ${e}`}}}p(ye,"mapStopReason");function Re(e){const n=e.provider,t=e.baseUrl,s=n==="zai"||t.includes("api.z.ai"),o=n==="together"||t.includes("api.together.ai")||t.includes("api.together.xyz"),u=n==="moonshotai"||n==="moonshotai-cn"||t.includes("api.moonshot."),f=n==="openrouter"||t.includes("openrouter.ai"),r=n==="cloudflare-workers-ai"||t.includes("api.cloudflare.com"),i=n==="cloudflare-ai-gateway"||t.includes("gateway.ai.cloudflare.com"),l=n==="nvidia"||t.includes("integrate.api.nvidia.com"),d=l||n==="cerebras"||t.includes("cerebras.ai")||n==="xai"||t.includes("api.x.ai")||o||t.includes("chutes.ai")||t.includes("deepseek.com")||s||u||n==="opencode"||t.includes("opencode.ai")||r||i,y=t.includes("chutes.ai")||u||i||o||l,x=n==="xai"||t.includes("api.x.ai"),C=n==="deepseek"||t.includes("deepseek.com"),_=f&&(e.id.startsWith("anthropic/")||e.id.startsWith("openai/")),T=n==="openrouter"&&e.id.startsWith("anthropic/")?"anthropic":void 0;return{supportsStore:!d,supportsDeveloperRole:_||!d&&!f,supportsReasoningEffort:!x&&!s&&!u&&!o&&!i&&!l,supportsUsageInStreaming:!0,maxTokensField:y?"max_tokens":"max_completion_tokens",requiresToolResultName:!1,requiresAssistantAfterToolResult:!1,requiresThinkingAsText:!1,requiresReasoningContentOnAssistantMessages:C,thinkingFormat:C?"deepseek":s?"zai":o?"together":f?"openrouter":"openai",openRouterRouting:{},vercelGatewayRouting:{},zaiToolStream:!1,supportsStrictMode:!u&&!o&&!i&&!l,cacheControlFormat:T,sendSessionAffinityHeaders:!1,supportsLongCacheRetention:!(o||r||i||l)}}p(Re,"detectCompat");function q(e){const n=Re(e);return e.compat?{supportsStore:e.compat.supportsStore??n.supportsStore,supportsDeveloperRole:e.compat.supportsDeveloperRole??n.supportsDeveloperRole,supportsReasoningEffort:e.compat.supportsReasoningEffort??n.supportsReasoningEffort,supportsUsageInStreaming:e.compat.supportsUsageInStreaming??n.supportsUsageInStreaming,maxTokensField:e.compat.maxTokensField??n.maxTokensField,requiresToolResultName:e.compat.requiresToolResultName??n.requiresToolResultName,requiresAssistantAfterToolResult:e.compat.requiresAssistantAfterToolResult??n.requiresAssistantAfterToolResult,requiresThinkingAsText:e.compat.requiresThinkingAsText??n.requiresThinkingAsText,requiresReasoningContentOnAssistantMessages:e.compat.requiresReasoningContentOnAssistantMessages??n.requiresReasoningContentOnAssistantMessages,thinkingFormat:e.compat.thinkingFormat??n.thinkingFormat,openRouterRouting:e.compat.openRouterRouting??{},vercelGatewayRouting:e.compat.vercelGatewayRouting??n.vercelGatewayRouting,zaiToolStream:e.compat.zaiToolStream??n.zaiToolStream,supportsStrictMode:e.compat.supportsStrictMode??n.supportsStrictMode,cacheControlFormat:e.compat.cacheControlFormat??n.cacheControlFormat,sendSessionAffinityHeaders:e.compat.sendSessionAffinityHeaders??n.sendSessionAffinityHeaders,supportsLongCacheRetention:e.compat.supportsLongCacheRetention??n.supportsLongCacheRetention}:n}p(q,"getCompat");export{me as convertMessages,ie as streamOpenAICompletions,qe as streamSimpleOpenAICompletions};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e=Object.defineProperty;var r=(_,n)=>e(_,"name",{value:n,configurable:!0});const A=64;function t(_){if(_===void 0)return;const n=Array.from(_);return n.length<=64?_:n.slice(0,64).join("")}r(t,"clampOpenAIPromptCacheKey");export{A as OPENAI_PROMPT_CACHE_KEY_MAX_LENGTH,t as clampOpenAIPromptCacheKey};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Tool as OpenAITool, ResponseCreateParamsStreaming, ResponseInput, ResponseStreamEvent } from "openai/resources/responses/responses.js";
|
|
2
|
+
import type { Api, AssistantMessage, Context, Model, Tool, Usage } from "../types.ts";
|
|
3
|
+
import type { AssistantMessageEventStream } from "../utils/event-stream.ts";
|
|
4
|
+
export interface OpenAIResponsesStreamOptions {
|
|
5
|
+
serviceTier?: ResponseCreateParamsStreaming["service_tier"];
|
|
6
|
+
resolveServiceTier?: (responseServiceTier: ResponseCreateParamsStreaming["service_tier"] | undefined, requestServiceTier: ResponseCreateParamsStreaming["service_tier"] | undefined) => ResponseCreateParamsStreaming["service_tier"] | undefined;
|
|
7
|
+
applyServiceTierPricing?: (usage: Usage, serviceTier: ResponseCreateParamsStreaming["service_tier"] | undefined) => void;
|
|
8
|
+
}
|
|
9
|
+
export interface ConvertResponsesMessagesOptions {
|
|
10
|
+
includeSystemPrompt?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface ConvertResponsesToolsOptions {
|
|
13
|
+
strict?: boolean | null;
|
|
14
|
+
}
|
|
15
|
+
export declare function convertResponsesMessages<TApi extends Api>(model: Model<TApi>, context: Context, allowedToolCallProviders: ReadonlySet<string>, options?: ConvertResponsesMessagesOptions): ResponseInput;
|
|
16
|
+
export declare function convertResponsesTools(tools: Tool[], options?: ConvertResponsesToolsOptions): OpenAITool[];
|
|
17
|
+
export declare function processResponsesStream<TApi extends Api>(openaiStream: AsyncIterable<ResponseStreamEvent>, output: AssistantMessage, stream: AssistantMessageEventStream, model: Model<TApi>, options?: OpenAIResponsesStreamOptions): Promise<void>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
var T=Object.defineProperty;var g=(r,t)=>T(r,"name",{value:t,configurable:!0});import{calculateCost as C}from"../models.js";import{shortHash as $}from"../utils/hash.js";import{parseStreamingJson as I}from"../utils/json-parse.js";import{sanitizeSurrogates as k}from"../utils/sanitize-unicode.js";import{transformMessages as J}from"./transform-messages.js";function P(r,t){const l={v:1,id:r};return t&&(l.phase=t),JSON.stringify(l)}g(P,"encodeTextSignatureV1");function w(r){if(r){if(r.startsWith("{"))try{const t=JSON.parse(r);if(t.v===1&&typeof t.id=="string")return t.phase==="commentary"||t.phase==="final_answer"?{id:t.id,phase:t.phase}:{id:t.id}}catch{}return{id:r}}}g(w,"parseTextSignature");function j(r,t,l,_){const u=[],i=g(s=>{const o=s.replace(/[^a-zA-Z0-9_-]/g,"_");return(o.length>64?o.slice(0,64):o).replace(/_+$/,"")},"normalizeIdPart"),n=g(s=>{const o=`fc_${$(s)}`;return o.length>64?o.slice(0,64):o},"buildForeignResponsesItemId"),v=g((s,o,c)=>{if(!l.has(r.provider)||!s.includes("|"))return i(s);const[x,h]=s.split("|"),f=i(x);let m=c.provider!==r.provider||c.api!==r.api?n(h):i(h);return m.startsWith("fc_")||(m=i(`fc_${m}`)),`${f}|${m}`},"normalizeToolCallId"),d=J(t.messages,r,v);if((_?.includeSystemPrompt??!0)&&t.systemPrompt){const s=r.reasoning?"developer":"system";u.push({role:s,content:k(t.systemPrompt)})}let e=0;for(const s of d){if(s.role==="user")if(typeof s.content=="string")u.push({role:"user",content:[{type:"input_text",text:k(s.content)}]});else{const o=s.content.map(c=>c.type==="text"?{type:"input_text",text:k(c.text)}:{type:"input_image",detail:"auto",image_url:`data:${c.mimeType};base64,${c.data}`});if(o.length===0)continue;u.push({role:"user",content:o})}else if(s.role==="assistant"){const o=[],c=s,x=c.model!==r.id&&c.provider===r.provider&&c.api===r.api;let h=0;for(const f of s.content)if(f.type==="thinking"){if(f.thinkingSignature){const p=JSON.parse(f.thinkingSignature);o.push(p)}}else if(f.type==="text"){const p=f,m=w(p.textSignature),S=h===0?`msg_pi_${e}`:`msg_pi_${e}_${h}`;h++;let y=m?.id;y?y.length>64&&(y=`msg_${$(y)}`):y=S,o.push({type:"message",role:"assistant",content:[{type:"output_text",text:k(p.text),annotations:[]}],status:"completed",id:y,phase:m?.phase})}else if(f.type==="toolCall"){const p=f,[m,S]=p.id.split("|");let y=S;x&&y?.startsWith("fc_")&&(y=void 0),o.push({type:"function_call",id:y,call_id:m,name:p.name,arguments:JSON.stringify(p.arguments)})}if(o.length===0)continue;u.push(...o)}else if(s.role==="toolResult"){const o=s.content.filter(p=>p.type==="text").map(p=>p.text).join(`
|
|
2
|
+
`),c=s.content.some(p=>p.type==="image"),x=o.length>0,[h]=s.toolCallId.split("|");let f;if(c&&r.input.includes("image")){const p=[];x&&p.push({type:"input_text",text:k(o)});for(const m of s.content)m.type==="image"&&p.push({type:"input_image",detail:"auto",image_url:`data:${m.mimeType};base64,${m.data}`});f=p}else f=k(x?o:"(see attached image)");u.push({type:"function_call_output",call_id:h,output:f})}e++}return u}g(j,"convertResponsesMessages");function E(r,t){const l=t?.strict===void 0?!1:t.strict;return r.map(_=>({type:"function",name:_.name,description:_.description,parameters:_.parameters,strict:l}))}g(E,"convertResponsesTools");async function U(r,t,l,_,u){let i=null,n=null;const v=t.content,d=g(()=>v.length-1,"blockIndex");for await(const a of r)if(a.type==="response.created")t.responseId=a.response.id;else if(a.type==="response.output_item.added"){const e=a.item;e.type==="reasoning"?(i=e,n={type:"thinking",thinking:""},t.content.push(n),l.push({type:"thinking_start",contentIndex:d(),partial:t})):e.type==="message"?(i=e,n={type:"text",text:""},t.content.push(n),l.push({type:"text_start",contentIndex:d(),partial:t})):e.type==="function_call"&&(i=e,n={type:"toolCall",id:`${e.call_id}|${e.id}`,name:e.name,arguments:{},partialJson:e.arguments||""},t.content.push(n),l.push({type:"toolcall_start",contentIndex:d(),partial:t}))}else if(a.type==="response.reasoning_summary_part.added")i&&i.type==="reasoning"&&(i.summary=i.summary||[],i.summary.push(a.part));else if(a.type==="response.reasoning_summary_text.delta"){if(i?.type==="reasoning"&&n?.type==="thinking"){i.summary=i.summary||[];const e=i.summary[i.summary.length-1];e&&(n.thinking+=a.delta,e.text+=a.delta,l.push({type:"thinking_delta",contentIndex:d(),delta:a.delta,partial:t}))}}else if(a.type==="response.reasoning_summary_part.done"){if(i?.type==="reasoning"&&n?.type==="thinking"){i.summary=i.summary||[];const e=i.summary[i.summary.length-1];e&&(n.thinking+=`
|
|
3
|
+
|
|
4
|
+
`,e.text+=`
|
|
5
|
+
|
|
6
|
+
`,l.push({type:"thinking_delta",contentIndex:d(),delta:`
|
|
7
|
+
|
|
8
|
+
`,partial:t}))}}else if(a.type==="response.reasoning_text.delta")i?.type==="reasoning"&&n?.type==="thinking"&&(n.thinking+=a.delta,l.push({type:"thinking_delta",contentIndex:d(),delta:a.delta,partial:t}));else if(a.type==="response.content_part.added")i?.type==="message"&&(i.content=i.content||[],(a.part.type==="output_text"||a.part.type==="refusal")&&i.content.push(a.part));else if(a.type==="response.output_text.delta"){if(i?.type==="message"&&n?.type==="text"){if(!i.content||i.content.length===0)continue;const e=i.content[i.content.length-1];e?.type==="output_text"&&(n.text+=a.delta,e.text+=a.delta,l.push({type:"text_delta",contentIndex:d(),delta:a.delta,partial:t}))}}else if(a.type==="response.refusal.delta"){if(i?.type==="message"&&n?.type==="text"){if(!i.content||i.content.length===0)continue;const e=i.content[i.content.length-1];e?.type==="refusal"&&(n.text+=a.delta,e.refusal+=a.delta,l.push({type:"text_delta",contentIndex:d(),delta:a.delta,partial:t}))}}else if(a.type==="response.function_call_arguments.delta")i?.type==="function_call"&&n?.type==="toolCall"&&(n.partialJson+=a.delta,n.arguments=I(n.partialJson),l.push({type:"toolcall_delta",contentIndex:d(),delta:a.delta,partial:t}));else if(a.type==="response.function_call_arguments.done"){if(i?.type==="function_call"&&n?.type==="toolCall"){const e=n.partialJson;if(n.partialJson=a.arguments,n.arguments=I(n.partialJson),a.arguments.startsWith(e)){const s=a.arguments.slice(e.length);s.length>0&&l.push({type:"toolcall_delta",contentIndex:d(),delta:s,partial:t})}}}else if(a.type==="response.output_item.done"){const e=a.item;if(e.type==="reasoning"&&n?.type==="thinking"){const s=e.summary?.map(c=>c.text).join(`
|
|
9
|
+
|
|
10
|
+
`)||"",o=e.content?.map(c=>c.text).join(`
|
|
11
|
+
|
|
12
|
+
`)||"";n.thinking=s||o||n.thinking,n.thinkingSignature=JSON.stringify(e),l.push({type:"thinking_end",contentIndex:d(),content:n.thinking,partial:t}),n=null}else if(e.type==="message"&&n?.type==="text")n.text=e.content.map(s=>s.type==="output_text"?s.text:s.refusal).join(""),n.textSignature=P(e.id,e.phase??void 0),l.push({type:"text_end",contentIndex:d(),content:n.text,partial:t}),n=null;else if(e.type==="function_call"){const s=n?.type==="toolCall"&&n.partialJson?I(n.partialJson):I(e.arguments||"{}");let o;n?.type==="toolCall"?(n.arguments=s,delete n.partialJson,o=n):o={type:"toolCall",id:`${e.call_id}|${e.id}`,name:e.name,arguments:s},n=null,l.push({type:"toolcall_end",contentIndex:d(),toolCall:o,partial:t})}}else if(a.type==="response.completed"){const e=a.response;if(e?.id&&(t.responseId=e.id),e?.usage){const s=e.usage.input_tokens_details?.cached_tokens||0;t.usage={input:(e.usage.input_tokens||0)-s,output:e.usage.output_tokens||0,cacheRead:s,cacheWrite:0,totalTokens:e.usage.total_tokens||0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}}}if(C(_,t.usage),u?.applyServiceTierPricing){const s=u.resolveServiceTier?u.resolveServiceTier(e?.service_tier,u.serviceTier):e?.service_tier??u.serviceTier;u.applyServiceTierPricing(t.usage,s)}t.stopReason=R(e?.status),t.content.some(s=>s.type==="toolCall")&&t.stopReason==="stop"&&(t.stopReason="toolUse")}else{if(a.type==="error")throw new Error(`Error Code ${a.code}: ${a.message}`||"Unknown error");if(a.type==="response.failed"){const e=a.response?.error,s=a.response?.incomplete_details,o=e?`${e.code||"unknown"}: ${e.message||"no message"}`:s?.reason?`incomplete: ${s.reason}`:"Unknown error (no error details in response)";throw new Error(o)}}}g(U,"processResponsesStream");function R(r){if(!r)return"stop";switch(r){case"completed":return"stop";case"incomplete":return"length";case"failed":case"cancelled":return"error";case"in_progress":case"queued":return"stop";default:{const t=r;throw new Error(`Unhandled stop reason: ${t}`)}}}g(R,"mapStopReason");export{j as convertResponsesMessages,E as convertResponsesTools,U as processResponsesStream};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ResponseCreateParamsStreaming } from "openai/resources/responses/responses.js";
|
|
2
|
+
import type { SimpleStreamOptions, StreamFunction, StreamOptions } from "../types.ts";
|
|
3
|
+
export interface OpenAIResponsesOptions extends StreamOptions {
|
|
4
|
+
reasoningEffort?: "minimal" | "low" | "medium" | "high" | "xhigh";
|
|
5
|
+
reasoningSummary?: "auto" | "detailed" | "concise" | null;
|
|
6
|
+
serviceTier?: ResponseCreateParamsStreaming["service_tier"];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Generate function for OpenAI Responses API
|
|
10
|
+
*/
|
|
11
|
+
export declare const streamOpenAIResponses: StreamFunction<"openai-responses", OpenAIResponsesOptions>;
|
|
12
|
+
export declare const streamSimpleOpenAIResponses: StreamFunction<"openai-responses", SimpleStreamOptions>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var y=Object.defineProperty;var a=(e,t)=>y(e,"name",{value:t,configurable:!0});import w from"openai";import{clampThinkingLevel as A}from"../models.js";import{AssistantMessageEventStream as E}from"../utils/event-stream.js";import{headersToRecord as I}from"../utils/headers.js";import{isCloudflareProvider as b,resolveCloudflareBaseUrl as C}from"./cloudflare.js";import{buildCopilotDynamicHeaders as O,hasCopilotVisionInput as S}from"./github-copilot-headers.js";import{clampOpenAIPromptCacheKey as T}from"./openai-prompt-cache.js";import{convertResponsesMessages as _,convertResponsesTools as k,processResponsesStream as P}from"./openai-responses-shared.js";import{buildBaseOptions as L}from"./simple-options.js";const M=new Set(["openai","openai-codex","opencode"]);function h(e){return e||(typeof process<"u"&&process.env.KODA_CACHE_RETENTION==="long"?"long":"short")}a(h,"resolveCacheRetention");function m(e){return{sendSessionIdHeader:e.compat?.sendSessionIdHeader??!0,supportsLongCacheRetention:e.compat?.supportsLongCacheRetention??!0}}a(m,"getCompat");function x(e,t){return t==="long"&&e.supportsLongCacheRetention?"24h":void 0}a(x,"getPromptCacheRetention");function H(e){if(e instanceof Error){const t=e.status,r=typeof t=="number"?t:void 0;return r!==void 0?`OpenAI API error (${r}): ${e.message}`:e.message}try{return JSON.stringify(e)}catch{return String(e)}}a(H,"formatOpenAIResponsesError");const N=a((e,t,r)=>{const n=new E;return(async()=>{const o={role:"assistant",content:[],api:e.api,provider:e.provider,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:Date.now()};try{const i=r?.apiKey;if(!i)throw new Error(`No API key for provider: ${e.provider}`);const c=h(r?.cacheRetention)==="none"?void 0:r?.sessionId,p=K(e,t,i,r?.headers,c);let u=$(e,t,r);const f=await r?.onPayload?.(u,e);f!==void 0&&(u=f);const g={...r?.signal?{signal:r.signal}:{},...r?.timeoutMs!==void 0?{timeout:r.timeoutMs}:{},maxRetries:r?.maxRetries??0},{data:l,response:d}=await p.responses.create(u,g).withResponse();if(await r?.onResponse?.({status:d.status,headers:I(d.headers)},e),n.push({type:"start",partial:o}),await P(l,o,n,e,{serviceTier:r?.serviceTier,applyServiceTierPricing:a((R,v)=>D(R,v,e),"applyServiceTierPricing")}),r?.signal?.aborted)throw new Error("Request was aborted");if(o.stopReason==="aborted"||o.stopReason==="error")throw new Error("An unknown error occurred");n.push({type:"done",reason:o.stopReason,message:o}),n.end()}catch(i){for(const s of o.content)delete s.index,delete s.partialJson;o.stopReason=r?.signal?.aborted?"aborted":"error",o.errorMessage=H(i),n.push({type:"error",reason:o.stopReason,error:o}),n.end()}})(),n},"streamOpenAIResponses"),X=a((e,t,r)=>{const n=r?.apiKey;if(!n)throw new Error(`No API key for provider: ${e.provider}`);const o=L(e,r,n),i=r?.reasoning?A(e,r.reasoning):void 0;return N(e,t,{...o,reasoningEffort:i==="off"?void 0:i})},"streamSimpleOpenAIResponses");function K(e,t,r,n,o){const i=m(e),s={...e.headers};if(e.provider==="github-copilot"){const p=S(t.messages),u=O({messages:t.messages,hasImages:p});Object.assign(s,u)}o&&(i.sendSessionIdHeader&&(s.session_id=o),s["x-client-request-id"]=o),n&&Object.assign(s,n);const c=e.provider==="cloudflare-ai-gateway"?{...s,Authorization:s.Authorization??null,"cf-aig-authorization":`Bearer ${r}`}:s;return new w({apiKey:r,baseURL:b(e.provider)?C(e):e.baseUrl,dangerouslyAllowBrowser:!0,defaultHeaders:c})}a(K,"createClient");function $(e,t,r){const n=_(e,t,M),o=h(r?.cacheRetention),i=m(e),s={model:e.id,input:n,stream:!0,prompt_cache_key:o==="none"?void 0:T(r?.sessionId),prompt_cache_retention:x(i,o),store:!1};if(r?.maxTokens&&(s.max_output_tokens=r?.maxTokens),r?.temperature!==void 0&&(s.temperature=r?.temperature),r?.serviceTier!==void 0&&(s.service_tier=r.serviceTier),t.tools&&t.tools.length>0&&(s.tools=k(t.tools)),e.reasoning)if(r?.reasoningEffort||r?.reasoningSummary){const c=r?.reasoningEffort?e.thinkingLevelMap?.[r.reasoningEffort]??r.reasoningEffort:"medium";s.reasoning={effort:c,summary:r?.reasoningSummary||"auto"},s.include=["reasoning.encrypted_content"]}else e.provider!=="github-copilot"&&e.thinkingLevelMap?.off!==null&&(s.reasoning={effort:e.thinkingLevelMap?.off??"none"});return s}a($,"buildParams");function B(e,t){switch(t){case"flex":return .5;case"priority":return e.id==="gpt-5.5"?2.5:2;default:return 1}}a(B,"getServiceTierCostMultiplier");function D(e,t,r){const n=B(r,t);n!==1&&(e.cost.input*=n,e.cost.output*=n,e.cost.cacheRead*=n,e.cost.cacheWrite*=n,e.cost.total=e.cost.input+e.cost.output+e.cost.cacheRead+e.cost.cacheWrite)}a(D,"applyServiceTierPricing");export{N as streamOpenAIResponses,X as streamSimpleOpenAIResponses};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { AssistantMessageEvent, Context, Model, SimpleStreamOptions, StreamFunction } from "../types.ts";
|
|
2
|
+
import type { BedrockOptions } from "./amazon-bedrock.ts";
|
|
3
|
+
import type { AnthropicOptions } from "./anthropic.ts";
|
|
4
|
+
import type { AzureOpenAIResponsesOptions } from "./azure-openai-responses.ts";
|
|
5
|
+
import type { GoogleOptions } from "./google.ts";
|
|
6
|
+
import type { GoogleVertexOptions } from "./google-vertex.ts";
|
|
7
|
+
import type { MistralOptions } from "./mistral.ts";
|
|
8
|
+
import type { OpenAICodexResponsesOptions } from "./openai-codex-responses.ts";
|
|
9
|
+
import type { OpenAICompletionsOptions } from "./openai-completions.ts";
|
|
10
|
+
import type { OpenAIResponsesOptions } from "./openai-responses.ts";
|
|
11
|
+
interface BedrockProviderModule {
|
|
12
|
+
streamBedrock: (model: Model<"bedrock-converse-stream">, context: Context, options?: BedrockOptions) => AsyncIterable<AssistantMessageEvent>;
|
|
13
|
+
streamSimpleBedrock: (model: Model<"bedrock-converse-stream">, context: Context, options?: SimpleStreamOptions) => AsyncIterable<AssistantMessageEvent>;
|
|
14
|
+
}
|
|
15
|
+
export declare function setBedrockProviderModule(module: BedrockProviderModule): void;
|
|
16
|
+
export declare const streamAnthropic: StreamFunction<"anthropic-messages", AnthropicOptions>;
|
|
17
|
+
export declare const streamSimpleAnthropic: StreamFunction<"anthropic-messages", SimpleStreamOptions>;
|
|
18
|
+
export declare const streamAzureOpenAIResponses: StreamFunction<"azure-openai-responses", AzureOpenAIResponsesOptions>;
|
|
19
|
+
export declare const streamSimpleAzureOpenAIResponses: StreamFunction<"azure-openai-responses", SimpleStreamOptions>;
|
|
20
|
+
export declare const streamGoogle: StreamFunction<"google-generative-ai", GoogleOptions>;
|
|
21
|
+
export declare const streamSimpleGoogle: StreamFunction<"google-generative-ai", SimpleStreamOptions>;
|
|
22
|
+
export declare const streamGoogleVertex: StreamFunction<"google-vertex", GoogleVertexOptions>;
|
|
23
|
+
export declare const streamSimpleGoogleVertex: StreamFunction<"google-vertex", SimpleStreamOptions>;
|
|
24
|
+
export declare const streamMistral: StreamFunction<"mistral-conversations", MistralOptions>;
|
|
25
|
+
export declare const streamSimpleMistral: StreamFunction<"mistral-conversations", SimpleStreamOptions>;
|
|
26
|
+
export declare const streamOpenAICodexResponses: StreamFunction<"openai-codex-responses", OpenAICodexResponsesOptions>;
|
|
27
|
+
export declare const streamSimpleOpenAICodexResponses: StreamFunction<"openai-codex-responses", SimpleStreamOptions>;
|
|
28
|
+
export declare const streamOpenAICompletions: StreamFunction<"openai-completions", OpenAICompletionsOptions>;
|
|
29
|
+
export declare const streamSimpleOpenAICompletions: StreamFunction<"openai-completions", SimpleStreamOptions>;
|
|
30
|
+
export declare const streamOpenAIResponses: StreamFunction<"openai-responses", OpenAIResponsesOptions>;
|
|
31
|
+
export declare const streamSimpleOpenAIResponses: StreamFunction<"openai-responses", SimpleStreamOptions>;
|
|
32
|
+
export declare function registerBuiltInApiProviders(): void;
|
|
33
|
+
export declare function resetApiProviders(): void;
|
|
34
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var V=Object.defineProperty;var t=(r,e)=>V(r,"name",{value:e,configurable:!0});var j=function(r,e){return typeof r=="string"&&/^\.\.?\//.test(r)?r.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(m,l,o,n,s){return l?e?".jsx":".js":o&&(!n||!s)?m:o+n+"."+s.toLowerCase()+"js"}):r};import{clearApiProviders as E,registerApiProvider as i}from"../api-registry.js";import{AssistantMessageEventStream as d}from"../utils/event-stream.js";const b=t(r=>{const e=import.meta.url.endsWith(".js")?r.replace(/\.ts$/,".js"):r;return import(j(e))},"importNodeOnlyProvider");let u,v,S,A,x,P,g,M,c,f;function ne(r){c={stream:r.streamBedrock,streamSimple:r.streamSimpleBedrock}}t(ne,"setBedrockProviderModule");function h(r,e){(async()=>{for await(const m of e)r.push(m);r.end()})()}t(h,"forwardStream");function I(r,e){return{role:"assistant",content:[],api:r.api,provider:r.provider,model:r.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"error",errorMessage:e instanceof Error?e.message:String(e),timestamp:Date.now()}}t(I,"createLazyLoadErrorMessage");function p(r){return(e,m,l)=>{const o=new d;return r().then(n=>{const s=n.stream(e,m,l);h(o,s)}).catch(n=>{const s=I(e,n);o.push({type:"error",reason:"error",error:s}),o.end(s)}),o}}t(p,"createLazyStream");function a(r){return(e,m,l)=>{const o=new d;return r().then(n=>{const s=n.streamSimple(e,m,l);h(o,s)}).catch(n=>{const s=I(e,n);o.push({type:"error",reason:"error",error:s}),o.end(s)}),o}}t(a,"createLazySimpleStream");function O(){return u||=import("./anthropic.js").then(r=>{const e=r;return{stream:e.streamAnthropic,streamSimple:e.streamSimpleAnthropic}}),u}t(O,"loadAnthropicProviderModule");function R(){return v||=import("./azure-openai-responses.js").then(r=>{const e=r;return{stream:e.streamAzureOpenAIResponses,streamSimple:e.streamSimpleAzureOpenAIResponses}}),v}t(R,"loadAzureOpenAIResponsesProviderModule");function k(){return S||=import("./google.js").then(r=>{const e=r;return{stream:e.streamGoogle,streamSimple:e.streamSimpleGoogle}}),S}t(k,"loadGoogleProviderModule");function z(){return A||=import("./google-vertex.js").then(r=>{const e=r;return{stream:e.streamGoogleVertex,streamSimple:e.streamSimpleGoogleVertex}}),A}t(z,"loadGoogleVertexProviderModule");function C(){return x||=import("./mistral.js").then(r=>{const e=r;return{stream:e.streamMistral,streamSimple:e.streamSimpleMistral}}),x}t(C,"loadMistralProviderModule");function y(){return P||=import("./openai-codex-responses.js").then(r=>{const e=r;return{stream:e.streamOpenAICodexResponses,streamSimple:e.streamSimpleOpenAICodexResponses}}),P}t(y,"loadOpenAICodexResponsesProviderModule");function G(){return g||=import("./openai-completions.js").then(r=>{const e=r;return{stream:e.streamOpenAICompletions,streamSimple:e.streamSimpleOpenAICompletions}}),g}t(G,"loadOpenAICompletionsProviderModule");function B(){return M||=import("./openai-responses.js").then(r=>{const e=r;return{stream:e.streamOpenAIResponses,streamSimple:e.streamSimpleOpenAIResponses}}),M}t(B,"loadOpenAIResponsesProviderModule");function w(){return c?Promise.resolve(c):(f||=b("./amazon-bedrock.ts").then(r=>{const e=r;return{stream:e.streamBedrock,streamSimple:e.streamSimpleBedrock}}),f)}t(w,"loadBedrockProviderModule");const _=p(O),W=a(O),$=p(R),D=a(R),N=p(k),T=a(k),q=p(z),F=a(z),H=p(C),J=a(C),K=p(y),Q=a(y),U=p(G),X=a(G),Y=p(B),Z=a(B),ee=p(w),re=a(w);function L(){i({api:"anthropic-messages",stream:_,streamSimple:W}),i({api:"openai-completions",stream:U,streamSimple:X}),i({api:"mistral-conversations",stream:H,streamSimple:J}),i({api:"openai-responses",stream:Y,streamSimple:Z}),i({api:"azure-openai-responses",stream:$,streamSimple:D}),i({api:"openai-codex-responses",stream:K,streamSimple:Q}),i({api:"google-generative-ai",stream:N,streamSimple:T}),i({api:"google-vertex",stream:q,streamSimple:F}),i({api:"bedrock-converse-stream",stream:ee,streamSimple:re})}t(L,"registerBuiltInApiProviders");function ie(){E(),L()}t(ie,"resetApiProviders"),L();export{L as registerBuiltInApiProviders,ie as resetApiProviders,ne as setBedrockProviderModule,_ as streamAnthropic,$ as streamAzureOpenAIResponses,N as streamGoogle,q as streamGoogleVertex,H as streamMistral,K as streamOpenAICodexResponses,U as streamOpenAICompletions,Y as streamOpenAIResponses,W as streamSimpleAnthropic,D as streamSimpleAzureOpenAIResponses,T as streamSimpleGoogle,F as streamSimpleGoogleVertex,J as streamSimpleMistral,Q as streamSimpleOpenAICodexResponses,X as streamSimpleOpenAICompletions,Z as streamSimpleOpenAIResponses};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Api, Model, SimpleStreamOptions, StreamOptions, ThinkingBudgets, ThinkingLevel } from "../types.ts";
|
|
2
|
+
export declare function buildBaseOptions(_model: Model<Api>, options?: SimpleStreamOptions, apiKey?: string): StreamOptions;
|
|
3
|
+
export declare function clampReasoning(effort: ThinkingLevel | undefined): Exclude<ThinkingLevel, "xhigh"> | undefined;
|
|
4
|
+
export declare function adjustMaxTokensForThinking(baseMaxTokens: number | undefined, modelMaxTokens: number, reasoningLevel: ThinkingLevel, customBudgets?: ThinkingBudgets): {
|
|
5
|
+
maxTokens: number;
|
|
6
|
+
thinkingBudget: number;
|
|
7
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var c=Object.defineProperty;var n=(t,e)=>c(t,"name",{value:e,configurable:!0});function x(t,e,s){return{temperature:e?.temperature,maxTokens:e?.maxTokens??t.maxTokens,signal:e?.signal,apiKey:s||e?.apiKey,transport:e?.transport,cacheRetention:e?.cacheRetention,sessionId:e?.sessionId,headers:e?.headers,onPayload:e?.onPayload,onResponse:e?.onResponse,timeoutMs:e?.timeoutMs,websocketConnectTimeoutMs:e?.websocketConnectTimeoutMs,maxRetries:e?.maxRetries,maxRetryDelayMs:e?.maxRetryDelayMs,metadata:e?.metadata}}n(x,"buildBaseOptions");function h(t){return t==="xhigh"?"high":t}n(h,"clampReasoning");function o(t,e,s,m){const r={...{minimal:1024,low:2048,medium:8192,high:16384},...m},i=1024,d=h(s);let a=r[d];const u=t===void 0?e:Math.min(t+a,e);return u<=a&&(a=Math.max(0,u-i)),{maxTokens:u,thinkingBudget:a}}n(o,"adjustMaxTokensForThinking");export{o as adjustMaxTokensForThinking,x as buildBaseOptions,h as clampReasoning};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Api, AssistantMessage, Message, Model } from "../types.ts";
|
|
2
|
+
/**
|
|
3
|
+
* Normalize tool call ID for cross-provider compatibility.
|
|
4
|
+
* OpenAI Responses API generates IDs that are 450+ chars with special characters like `|`.
|
|
5
|
+
* Anthropic APIs require IDs matching ^[a-zA-Z0-9_-]+$ (max 64 chars).
|
|
6
|
+
*/
|
|
7
|
+
export declare function transformMessages<TApi extends Api>(messages: Message[], model: Model<TApi>, normalizeToolCallId?: (id: string, model: Model<TApi>, source: AssistantMessage) => string): Message[];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var M=Object.defineProperty;var d=(s,r)=>M(s,"name",{value:r,configurable:!0});const R="(image omitted: model does not support images)",S="(tool image omitted: model does not support images)";function y(s,r){const o=[];let a=!1;for(const p of s){if(p.type==="image"){a||o.push({type:"text",text:r}),a=!0;continue}o.push(p),a=p.text===r}return o}d(y,"replaceImagesWithPlaceholder");function m(s,r){return r.input.includes("image")?s:s.map(o=>o.role==="user"&&Array.isArray(o.content)?{...o,content:y(o.content,R)}:o.role==="toolResult"?{...o,content:y(o.content,S)}:o)}d(m,"downgradeUnsupportedImages");function A(s,r,o){const a=new Map,x=m(s,r).map(e=>{if(e.role==="user")return e;if(e.role==="toolResult"){const t=a.get(e.toolCallId);return t&&t!==e.toolCallId?{...e,toolCallId:t}:e}if(e.role==="assistant"){const t=e,i=t.provider===r.provider&&t.api===r.api&&t.model===r.id,g=t.content.flatMap(n=>{if(n.type==="thinking")return n.redacted?i?n:[]:i&&n.thinkingSignature?n:!n.thinking||n.thinking.trim()===""?[]:i?n:{type:"text",text:n.thinking};if(n.type==="text")return i?n:{type:"text",text:n.text};if(n.type==="toolCall"){const u=n;let f=u;if(!i&&u.thoughtSignature&&(f={...u},delete f.thoughtSignature),!i&&o){const C=o(u.id,r,t);C!==u.id&&(a.set(u.id,C),f={...f,id:C})}return f}return n});return{...t,content:g}}return e}),l=[];let c=[],h=new Set;const I=d(()=>{if(c.length>0){for(const e of c)h.has(e.id)||l.push({role:"toolResult",toolCallId:e.id,toolName:e.name,content:[{type:"text",text:"No result provided"}],isError:!0,timestamp:Date.now()});c=[],h=new Set}},"insertSyntheticToolResults");for(let e=0;e<x.length;e++){const t=x[e];if(t.role==="assistant"){I();const i=t;if(i.stopReason==="error"||i.stopReason==="aborted")continue;const g=i.content.filter(n=>n.type==="toolCall");g.length>0&&(c=g,h=new Set),l.push(t)}else t.role==="toolResult"?(h.add(t.toolCallId),l.push(t)):(t.role==="user"&&I(),l.push(t))}return I(),l}d(A,"transformMessages");export{A as transformMessages};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var c=Object.defineProperty;var s=(e,r)=>c(e,"name",{value:r,configurable:!0});const o=new Set;function i(e){return o.add(e),()=>{o.delete(e)}}s(i,"registerSessionResourceCleanup");function a(e){const r=[];for(const n of o)try{n(e)}catch(t){r.push(t)}if(r.length>0)throw new AggregateError(r,"Failed to cleanup session resources")}s(a,"cleanupSessionResources");export{a as cleanupSessionResources,i as registerSessionResourceCleanup};
|
package/dist/stream.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import "./providers/register-builtins.ts";
|
|
2
|
+
import type { Api, AssistantMessage, AssistantMessageEventStream, Context, Model, ProviderStreamOptions, SimpleStreamOptions } from "./types.ts";
|
|
3
|
+
export { getEnvApiKey } from "./env-api-keys.ts";
|
|
4
|
+
export declare function stream<TApi extends Api>(model: Model<TApi>, context: Context, options?: ProviderStreamOptions): AssistantMessageEventStream;
|
|
5
|
+
export declare function complete<TApi extends Api>(model: Model<TApi>, context: Context, options?: ProviderStreamOptions): Promise<AssistantMessage>;
|
|
6
|
+
export declare function streamSimple<TApi extends Api>(model: Model<TApi>, context: Context, options?: SimpleStreamOptions): AssistantMessageEventStream;
|
|
7
|
+
export declare function completeSimple<TApi extends Api>(model: Model<TApi>, context: Context, options?: SimpleStreamOptions): Promise<AssistantMessage>;
|
package/dist/stream.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var s=Object.defineProperty;var i=(r,e)=>s(r,"name",{value:e,configurable:!0});import"./providers/register-builtins.js";import{getApiProvider as c}from"./api-registry.js";import{getEnvApiKey as u}from"./env-api-keys.js";import{getEnvApiKey as K}from"./env-api-keys.js";function f(r){return typeof r=="string"&&r.trim().length>0}i(f,"hasExplicitApiKey");function o(r,e){if(f(e?.apiKey))return e;const t=u(r.provider);return t?{...e,apiKey:t}:e}i(o,"withEnvApiKey");function p(r){const e=c(r);if(!e)throw new Error(`No API provider registered for api: ${r}`);return e}i(p,"resolveApiProvider");function v(r,e,t){return p(r.api).stream(r,e,o(r,t))}i(v,"stream");async function g(r,e,t){return v(r,e,t).result()}i(g,"complete");function m(r,e,t){return p(r.api).streamSimple(r,e,o(r,t))}i(m,"streamSimple");async function l(r,e,t){return m(r,e,t).result()}i(l,"completeSimple");export{g as complete,l as completeSimple,K as getEnvApiKey,v as stream,m as streamSimple};
|