@code-yeongyu/senpi 2026.11.2-3 → 2026.11.3-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/bundle/chunks/{anthropic-messages-WUPLDYD6.js → anthropic-messages-AFWQB3KN.js} +1 -1
  3. package/dist/bundle/chunks/{args-AOI4NEA6.js → args-O3WS4WCO.js} +1 -1
  4. package/dist/bundle/chunks/{chunk-O4GRBX4R.js → chunk-3WJ2DE2G.js} +1 -1
  5. package/dist/bundle/chunks/{chunk-LMIETUPG.js → chunk-4BF4FLT6.js} +1 -1
  6. package/dist/bundle/chunks/{chunk-T5ZJ2Q4O.js → chunk-4SENPCEA.js} +1 -1
  7. package/dist/bundle/chunks/chunk-5DZD623T.js +448 -0
  8. package/dist/bundle/chunks/{chunk-TXOR5BQL.js → chunk-6BSMXZKQ.js} +1 -1
  9. package/dist/bundle/chunks/{chunk-VRWJJMHO.js → chunk-7565XQAU.js} +1 -1
  10. package/dist/bundle/chunks/{chunk-IWM5QRAE.js → chunk-7KLEFHSU.js} +1 -1
  11. package/dist/bundle/chunks/{chunk-FO56LSUK.js → chunk-BNIZP4OS.js} +1 -1
  12. package/dist/bundle/chunks/{chunk-L3V65XW7.js → chunk-CJWSQ6CK.js} +1 -1
  13. package/dist/bundle/chunks/{chunk-QLTQ3UUI.js → chunk-DAPBNRN5.js} +1 -1
  14. package/dist/bundle/chunks/{chunk-GIY7PGOH.js → chunk-DPBPO5OU.js} +1 -1
  15. package/dist/bundle/chunks/chunk-ESQBKTNG.js +2 -0
  16. package/dist/bundle/chunks/{chunk-N4TSAHRL.js → chunk-EVTTLPIY.js} +1 -1
  17. package/dist/bundle/chunks/{chunk-NYXXKS6D.js → chunk-F4OHTL2K.js} +3 -2
  18. package/dist/bundle/chunks/{chunk-TVMW2SUP.js → chunk-FJ2UCBOA.js} +2 -2
  19. package/dist/bundle/chunks/{chunk-KVPRQ5KN.js → chunk-FLM6GZPT.js} +1 -1
  20. package/dist/bundle/chunks/{chunk-P4AT7SBE.js → chunk-HBCNDC53.js} +1 -1
  21. package/dist/bundle/chunks/chunk-MOH5HOHX.js +2 -0
  22. package/dist/bundle/chunks/{chunk-7FUO655J.js → chunk-MOOFLKLI.js} +1 -1
  23. package/dist/bundle/chunks/{chunk-IHOQR7TU.js → chunk-PX7FF5LE.js} +1 -1
  24. package/dist/bundle/chunks/{chunk-QAM6AXA2.js → chunk-QTQ3ES2S.js} +12 -9
  25. package/dist/bundle/chunks/{chunk-FJSJUVQQ.js → chunk-TOOB6OLG.js} +3 -3
  26. package/dist/bundle/chunks/{chunk-662SCMTH.js → chunk-VPDQ6MOL.js} +1 -1
  27. package/dist/bundle/chunks/{chunk-BW4YXS7X.js → chunk-WCRNJYHO.js} +1 -1
  28. package/dist/bundle/chunks/{chunk-ZSVWKOAJ.js → chunk-ZNLCKKF6.js} +170 -226
  29. package/dist/bundle/chunks/{cli-main-534A3WSC.js → cli-main-XM5FWY3Z.js} +1 -1
  30. package/dist/bundle/chunks/{credential-accounts-OAK2E5O2.js → credential-accounts-YZYSKA7X.js} +1 -1
  31. package/dist/bundle/chunks/{health-write-EB4CPHXN.js → health-write-45CX64T2.js} +1 -1
  32. package/dist/bundle/chunks/{help-fast-path-U2PSNNWO.js → help-fast-path-3EDGRKQM.js} +1 -1
  33. package/dist/bundle/chunks/{host-command-WJIMRBGN.js → host-command-PZ4VYQIW.js} +1 -1
  34. package/dist/bundle/chunks/{host-session-command-PWVPQ2OV.js → host-session-command-OJFARE5Q.js} +1 -1
  35. package/dist/bundle/chunks/{interactive-mode-NPHFDPGH.js → interactive-mode-7JSJVVIS.js} +1 -1
  36. package/dist/bundle/chunks/{login-health-7G2DZVOV.js → login-health-YOPTYRTU.js} +1 -1
  37. package/dist/bundle/chunks/{main-I6FJAFUP.js → main-3YGJ2O4I.js} +1 -1
  38. package/dist/bundle/chunks/{multi-session-host-7E26R5JF.js → multi-session-host-N2RQ7JSZ.js} +4 -4
  39. package/dist/bundle/chunks/openai-chatgpt.js +1 -1
  40. package/dist/bundle/chunks/{openai-codex-responses-VNBMMIL3.js → openai-codex-responses-YTWLG4OL.js} +1 -1
  41. package/dist/bundle/chunks/{openai-completions-JLR32APM.js → openai-completions-TIFDYHZL.js} +1 -1
  42. package/dist/bundle/chunks/{openai-images-LEBNERSM.js → openai-images-OAEMY4RG.js} +1 -1
  43. package/dist/bundle/chunks/{openai-responses-JCDUNMHA.js → openai-responses-L35NIG5Y.js} +1 -1
  44. package/dist/bundle/chunks/{package-manager-cli-CBSDV36M.js → package-manager-cli-JPNA27E5.js} +1 -1
  45. package/dist/bundle/chunks/{role-LP6LVNCY.js → role-45Y7PQFC.js} +1 -1
  46. package/dist/bundle/chunks/{rotation-stream-ZDCNHIBE.js → rotation-stream-WXWJKJZN.js} +1 -1
  47. package/dist/bundle/chunks/{rpc-mode-GBBTN2WP.js → rpc-mode-Z7MN2ZWA.js} +1 -1
  48. package/dist/bundle/chunks/{run-attached-tui-PVLUHHJX.js → run-attached-tui-TI6MELEI.js} +1 -1
  49. package/dist/bundle/chunks/{schedule-command-W45NYTTK.js → schedule-command-OZ5ESMIT.js} +1 -1
  50. package/dist/bundle/chunks/{session-control-endpoint-LFLUNALC.js → session-control-endpoint-5YKBYJOO.js} +1 -1
  51. package/dist/bundle/chunks/{session-picker-OZUINLD7.js → session-picker-CMRV72VA.js} +1 -1
  52. package/dist/bundle/chunks/session-worker.js +324 -376
  53. package/dist/bundle/chunks/{state-store-SZARKD36.js → state-store-Q47AYMRI.js} +1 -1
  54. package/dist/bundle/cli.js +2 -2
  55. package/dist/bundle/index.js +1 -1
  56. package/dist/bundle/rpc-entry.js +1 -1
  57. package/dist/bundle/runtime-manifest.json +1 -1
  58. package/dist/core/agent-session.d.ts +8 -0
  59. package/dist/core/agent-session.js +68 -60
  60. package/dist/core/credential-pool/classify.d.ts +3 -2
  61. package/dist/core/credential-pool/classify.js +10 -3
  62. package/dist/core/dynamic-prompt/build.d.ts +2 -1
  63. package/dist/core/dynamic-prompt/build.js +1 -2
  64. package/dist/core/dynamic-prompt/handoff.d.ts +1 -1
  65. package/dist/core/dynamic-prompt/handoff.js +9 -9
  66. package/dist/core/dynamic-prompt/identity.js +1 -1
  67. package/dist/core/dynamic-prompt/intent-gate.d.ts +1 -1
  68. package/dist/core/dynamic-prompt/intent-gate.js +8 -8
  69. package/dist/core/dynamic-prompt/policies.d.ts +1 -1
  70. package/dist/core/dynamic-prompt/policies.js +5 -7
  71. package/dist/core/dynamic-prompt/style.js +5 -5
  72. package/dist/core/dynamic-prompt/tool-section.d.ts +5 -0
  73. package/dist/core/dynamic-prompt/tool-section.js +8 -6
  74. package/dist/core/dynamic-prompt/verification.d.ts +6 -6
  75. package/dist/core/dynamic-prompt/verification.js +12 -12
  76. package/dist/core/dynamic-prompt/working-task.d.ts +1 -1
  77. package/dist/core/dynamic-prompt/working-task.js +3 -3
  78. package/dist/core/dynamic-prompt/workstation.js +1 -1
  79. package/dist/core/extensions/builtin/anthropic-subscription/session-registry-pump.d.ts +13 -0
  80. package/dist/core/extensions/builtin/anthropic-subscription/session-registry-pump.js +64 -2
  81. package/dist/core/extensions/builtin/anthropic-subscription/session-stream.js +5 -1
  82. package/dist/core/extensions/builtin/anthropic-subscription/session-turn-attempt.d.ts +7 -0
  83. package/dist/core/extensions/builtin/anthropic-subscription/session-turn-attempt.js +28 -1
  84. package/dist/core/extensions/builtin/anthropic-subscription/session-turn-types.d.ts +2 -0
  85. package/dist/core/extensions/builtin/bash-timeout/index.d.ts +1 -1
  86. package/dist/core/extensions/builtin/bash-timeout/index.js +3 -28
  87. package/dist/core/extensions/builtin/bash-timeout/timeout.d.ts +0 -11
  88. package/dist/core/extensions/builtin/bash-timeout/timeout.js +0 -11
  89. package/dist/core/extensions/builtin/imagegen/index.d.ts +0 -1
  90. package/dist/core/extensions/builtin/imagegen/index.js +0 -11
  91. package/dist/core/extensions/builtin/prompt-preset/execution-tooling.d.ts +5 -5
  92. package/dist/core/extensions/builtin/prompt-preset/execution-tooling.js +5 -5
  93. package/dist/core/extensions/builtin/prompt-preset/glm-5.d.ts +1 -1
  94. package/dist/core/extensions/builtin/prompt-preset/glm-5.js +1 -1
  95. package/dist/core/extensions/builtin/terminal/extension.js +8 -1
  96. package/dist/core/extensions/builtin/terminal/notify.js +9 -3
  97. package/dist/core/extensions/builtin/terminal/prompt.d.ts +7 -1
  98. package/dist/core/extensions/builtin/terminal/prompt.js +27 -60
  99. package/dist/core/extensions/builtin/terminal/tools/bash.js +10 -2
  100. package/dist/core/extensions/builtin/todotools/normalize.d.ts +20 -3
  101. package/dist/core/extensions/builtin/todotools/normalize.js +251 -5
  102. package/dist/core/extensions/builtin/todotools/prompt.d.ts +2 -2
  103. package/dist/core/extensions/builtin/todotools/prompt.js +5 -5
  104. package/dist/core/extensions/builtin/todotools/tools/todo.js +9 -8
  105. package/dist/core/extensions/builtin/webfetch/webfetch/tool.js +0 -5
  106. package/dist/core/extensions/builtin/websearch/index.js +9 -4
  107. package/dist/core/extensions/builtin/websearch/websearch/tool.d.ts +2 -0
  108. package/dist/core/extensions/builtin/websearch/websearch/tool.js +3 -1
  109. package/dist/core/model-runtime.js +1 -1
  110. package/dist/core/provider-failure.d.ts +6 -0
  111. package/dist/core/provider-failure.js +6 -2
  112. package/dist/core/retry-fallback/exhaustion.d.ts +18 -0
  113. package/dist/core/retry-fallback/exhaustion.js +20 -0
  114. package/dist/core/system-prompt.js +1 -1
  115. package/dist/core/tools/bash.d.ts +3 -1
  116. package/dist/core/tools/bash.js +14 -4
  117. package/dist/core/tools/edit.d.ts +1 -1
  118. package/dist/core/tools/edit.js +1 -6
  119. package/dist/core/tools/grep/index.js +2 -3
  120. package/dist/core/tools/powershell.d.ts +1 -1
  121. package/dist/core/tools/powershell.js +1 -1
  122. package/dist/core/tools/read.d.ts +1 -1
  123. package/dist/core/tools/read.js +1 -1
  124. package/dist/core/tools/write.d.ts +1 -1
  125. package/dist/core/tools/write.js +1 -1
  126. package/dist/engine-trust/shell-trust.d.ts +36 -0
  127. package/dist/engine-trust/shell-trust.js +44 -0
  128. package/dist/engine-trust/transport-failure.d.ts +12 -0
  129. package/dist/engine-trust/transport-failure.js +48 -0
  130. package/dist/modes/interactive/interactive-mode.js +9 -3
  131. package/dist/modes/print-mode.js +2 -1
  132. package/dist/modes/rpc/compact-catalog-families.d.ts +5 -2
  133. package/dist/modes/rpc/compact-catalog-families.js +5 -2
  134. package/dist/modes/rpc/compact-catalog-registry.d.ts +9 -1
  135. package/dist/modes/rpc/compact-catalog-registry.js +9 -2
  136. package/dist/modes/rpc/compact-recovery-manifest-kinds.d.ts +17 -0
  137. package/dist/modes/rpc/compact-recovery-manifest-kinds.js +21 -0
  138. package/dist/modes/rpc/compact-recovery-manifest-shape.d.ts +7 -0
  139. package/dist/modes/rpc/compact-recovery-manifest.js +11 -3
  140. package/dist/modes/rpc/compact-socket-commands.js +6 -0
  141. package/dist/modes/rpc/connection-handler.js +21 -5
  142. package/dist/modes/rpc/connection-question-bridge.d.ts +3 -1
  143. package/dist/modes/rpc/connection-question-bridge.js +4 -1
  144. package/dist/modes/rpc/connection-roles.d.ts +8 -0
  145. package/dist/modes/rpc/connection-roles.js +18 -0
  146. package/dist/modes/rpc/method-classes-schema-session.d.ts +4 -0
  147. package/dist/modes/rpc/method-classes-schema-session.js +1 -0
  148. package/dist/modes/rpc/method-classes-schema.d.ts +4 -0
  149. package/dist/modes/rpc/protocol-identity.js +2 -0
  150. package/dist/modes/rpc/remote-origin.d.ts +31 -0
  151. package/dist/modes/rpc/remote-origin.js +58 -0
  152. package/dist/modes/rpc/rpc-protocol-info-types.d.ts +8 -0
  153. package/dist/modes/rpc/rpc-question-types.d.ts +7 -0
  154. package/dist/modes/rpc/rpc-question-types.js +0 -3
  155. package/dist/modes/rpc/rpc-session-command-types.d.ts +3 -0
  156. package/dist/modes/rpc/session-registry.js +12 -3
  157. package/dist/modes/rpc/session-worker-client.js +2 -0
  158. package/dist/modes/rpc/session-worker-protocol.d.ts +3 -0
  159. package/dist/modes/rpc/session-worker.js +2 -0
  160. package/docs/engine-socket/fixtures/admission-routes/c-baseline.json +3 -3
  161. package/docs/engine-socket/fixtures/admission-routes/h-legacy.json +1 -1
  162. package/docs/engine-socket/fixtures/admission-routes/i-reset-stream.json +3 -3
  163. package/docs/engine-socket/fixtures/recovery-manifest/index.json +32 -0
  164. package/docs/engine-socket/fixtures/recovery-manifest/one-partial-family.json +118 -0
  165. package/docs/rpc.md +93 -3
  166. package/package.json +6 -6
  167. package/dist/bundle/chunks/chunk-7UC4W2T2.js +0 -2
  168. package/dist/bundle/chunks/chunk-R23WXN4L.js +0 -448
  169. package/dist/bundle/chunks/chunk-W5NLCRB3.js +0 -2
@@ -72,4 +72,4 @@ var __require=(x=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(x,{get:(
72
72
  ${details?`<div class="details">${details}</div>`:""}
73
73
  </main>
74
74
  </body>
75
- </html>`}function oauthSuccessHtml(message){return renderPage({title:"Authentication successful",heading:"Authentication successful",message})}function oauthErrorHtml(message,details){return renderPage({title:"Authentication failed",heading:"Authentication failed",message,details})}function formatThrownValue(value){return value instanceof Error?value.message||value.name:typeof value=="string"?value:String(value)}var ModelsError=class extends Error{constructor(code,message,options){super(withCauseDetail(message,options?.cause),options),this.name="ModelsError",this.code=code}};function withCauseDetail(message,cause){if(cause==null)return message;let detail=formatThrownValue(cause).trim();return!detail||message.includes(detail)?message:`${message}: ${detail}`}var _a,OAuthTokenEndpointError=class extends Error{constructor(message,status,facts={}){super(message),this.status=status,this.oauthError=facts.oauthError,this.credentialRefused=facts.credentialRefused??!1}};var UNAVAILABLE=Symbol.for("senpi.oauthRefreshUnavailable"),OAuthRefreshUnavailableError=class extends ModelsError{static{_a=UNAVAILABLE}constructor(provider,cause){super("oauth",`OAuth refresh failed for ${provider}`,{cause}),this[_a]=!0,this.name="OAuthRefreshUnavailableError"}};var procEnvCache=null;function getBunSandboxEnvValue(name){if(!(typeof process>"u"||!process.versions?.bun||Object.keys(process.env).length>0)){if(procEnvCache===null){procEnvCache=new Map;try{let{readFileSync}=__require("node:fs"),data=readFileSync("/proc/self/environ","utf-8");for(let entry of data.split("\0")){let idx=entry.indexOf("=");idx>0&&procEnvCache.set(entry.slice(0,idx),entry.slice(idx+1))}}catch{}}return procEnvCache.get(name)}}function getProviderEnvValue(name,env){return env?.[name]||(typeof process<"u"?process.env[name]:void 0)||getBunSandboxEnvValue(name)||void 0}function base64urlEncode(bytes){let binary="";for(let byte of bytes)binary+=String.fromCharCode(byte);return btoa(binary).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}async function generatePKCE(){let verifierBytes=new Uint8Array(32);crypto.getRandomValues(verifierBytes);let verifier=base64urlEncode(verifierBytes),data=new TextEncoder().encode(verifier),hashBuffer=await crypto.subtle.digest("SHA-256",data),challenge=base64urlEncode(new Uint8Array(hashBuffer));return{verifier,challenge}}var DYNAMIC_CLIENT_ID="dynamic_agent_client",AGENT_NAME_HINT="Pi",UUID_PATTERN=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,AUTHORIZE_URL="https://auth.openai.com/api/accounts/authorize",TOKEN_URL="https://auth.openai.com/api/accounts/oauth/token",DISCOVERY_URL="https://auth.openai.com/.well-known/openid-configuration",RESOURCE="https://api.openai.com/v1",CALLBACK_HOST=getProviderEnvValue("PI_OAUTH_CALLBACK_HOST")||"127.0.0.1",CALLBACK_PORT=1455,CALLBACK_PATH="/auth/callback",REDIRECT_URI=`http://127.0.0.1:${CALLBACK_PORT}${CALLBACK_PATH}`,DIRECT_TOKEN_SCOPE="chatgpt.tokens.use.direct",SCOPE=`openid profile email offline_access resource.invoke ${DIRECT_TOKEN_SCOPE}`,EXPIRY_MARGIN_MS=180*1e3;function randomValue(){return randomBytes(32).toString("base64url")}function authorizationResultFromCallback(url,expectedState){let code=url.searchParams.get("code");if(!code)throw new Error("Missing authorization code");let state=url.searchParams.get("state");if(!state)throw new Error("Missing OAuth state");if(state!==expectedState)throw new Error("OAuth state mismatch");let clientId=url.searchParams.get("client_id")?.trim();if(!clientId)throw new Error("OpenAI OAuth registration callback did not contain an issued client ID");return{code,clientId}}function authorizationResultFromManualInput(input,expectedState){let url;try{url=new URL(input.trim())}catch{throw new Error("Paste the full callback URL from the browser")}let expected=new URL(REDIRECT_URI);if(url.origin!==expected.origin||url.pathname!==expected.pathname)throw new Error(`The pasted callback URL must start with ${REDIRECT_URI}`);let error=url.searchParams.get("error");if(error)throw new Error(`ChatGPT authorization failed: ${error}`);return authorizationResultFromCallback(url,expectedState)}function sendHtml(response,status,body){response.writeHead(status,{"Content-Type":"text/html; charset=utf-8"}),response.end(body)}function startCallbackServer(expectedState){return new Promise((resolve,reject)=>{let resolveResult,rejectResult,result=new Promise((resolveAuthorization,rejectAuthorization)=>{resolveResult=resolveAuthorization,rejectResult=rejectAuthorization}),server=createServer((request,response)=>{try{let url=new URL(request.url||"",REDIRECT_URI);if(url.pathname!==CALLBACK_PATH){sendHtml(response,404,oauthErrorHtml("Callback route not found."));return}let error=url.searchParams.get("error");if(error){sendHtml(response,400,oauthErrorHtml("ChatGPT was not connected.",`Error: ${error}`)),rejectResult(new Error(`ChatGPT authorization failed: ${error}`));return}let authorizationResult;try{authorizationResult=authorizationResultFromCallback(url,expectedState)}catch(error2){let message=error2 instanceof Error?error2.message:"Invalid callback";sendHtml(response,400,oauthErrorHtml(message));return}sendHtml(response,200,oauthSuccessHtml("ChatGPT authentication completed. You can close this window.")),resolveResult(authorizationResult)}catch{sendHtml(response,500,oauthErrorHtml("Internal error while processing the callback."))}});server.once("error",reject),server.listen(CALLBACK_PORT,CALLBACK_HOST,()=>{server.removeListener("error",reject),server.on("error",rejectResult),resolve({server,result})})})}async function requestToken(body,signal){let response=await fetch(TOKEN_URL,{method:"POST",headers:{accept:"application/json","content-type":"application/x-www-form-urlencoded"},body,signal});if(!response.ok){let responseBody=await response.text().catch(()=>"");throw new OAuthTokenEndpointError(`OpenAI OAuth token request failed (${response.status}): ${responseBody||response.statusText}`,response.status)}let data=await response.json();if(typeof data!="object"||data===null||Array.isArray(data))throw new Error("OpenAI OAuth token response must be an object");return data}function requireTokenString(value,field){if(typeof value!="string"||value.trim().length===0)throw new Error(`OpenAI OAuth token response has invalid ${field}`);return value}function credentialFromTokenResponse(token,clientId){let access=requireTokenString(token.access_token,"access_token"),refresh=requireTokenString(token.refresh_token,"refresh_token"),scope=requireTokenString(token.scope,"scope");if(typeof token.expires_in!="number"||!Number.isFinite(token.expires_in)||token.expires_in<=0)throw new Error("OpenAI OAuth token response has invalid expires_in");let scopes=scope.trim().split(/\s+/).filter(Boolean);if(!scopes.includes(DIRECT_TOKEN_SCOPE))throw new Error(`OpenAI OAuth grant did not include ${DIRECT_TOKEN_SCOPE}`);return{type:"oauth",access,refresh,expires:Date.now()+token.expires_in*1e3-EXPIRY_MARGIN_MS,clientId,scopes}}async function exchangeAuthorizationCode(code,verifier,clientId,signal){let token=await requestToken(new URLSearchParams({grant_type:"authorization_code",client_id:clientId,code,code_verifier:verifier,redirect_uri:REDIRECT_URI,resource:RESOURCE}),signal);if(typeof token.id_token!="string"||token.id_token.trim().length===0)throw new Error("OpenAI OAuth token response did not contain an ID token");return credentialFromTokenResponse(token,clientId)}async function refreshAccessToken(credential,signal){let clientId=credential.clientId;if(typeof clientId!="string"||clientId.trim().length===0)throw new Error("Stored OpenAI OAuth credential does not contain an issued client ID; reconnect ChatGPT");let token=await requestToken(new URLSearchParams({grant_type:"refresh_token",client_id:clientId,refresh_token:credential.refresh,resource:RESOURCE}),signal);return credentialFromTokenResponse(token,clientId)}async function revokeSession(credential,options){let unconfirmed={status:"remote_revocation_unconfirmed"};if(!credential.refresh||typeof credential.clientId!="string"||!credential.clientId.trim())return unconfirmed;let signal=AbortSignal.any([...options?.signal?[options.signal]:[],AbortSignal.timeout(15e3)]),sleep=options?.sleep??(milliseconds=>new Promise((resolve,reject)=>{signal.throwIfAborted();let onAbort=()=>{clearTimeout(timer),reject(signal.reason)},timer=setTimeout(()=>{signal.removeEventListener("abort",onAbort),resolve()},milliseconds);signal.addEventListener("abort",onAbort,{once:!0})})),endpoint,delays=[250,1e3];for(let attempt=0;attempt<=delays.length;attempt++)try{if(signal.throwIfAborted(),attempt>0&&await sleep(delays[attempt-1]),!endpoint){let discovery=await fetch(DISCOVERY_URL,{signal,redirect:"error"});if(!discovery.ok){if(discovery.status>=500)continue;return unconfirmed}let metadata=await discovery.json();if(typeof metadata!="object"||metadata===null||!("revocation_endpoint"in metadata)||typeof metadata.revocation_endpoint!="string")return unconfirmed;let url=new URL(metadata.revocation_endpoint);if(url.protocol!=="https:"||url.username||url.password)return unconfirmed;endpoint=url.href}let response=await fetch(endpoint,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({token:credential.refresh,token_type_hint:"refresh_token",client_id:credential.clientId}),signal,redirect:"error"});if(response.status===200)return{status:"revoked"};if(response.status<500)return unconfirmed}catch{if(signal.aborted)return unconfirmed}return unconfirmed}function agentHostId(deviceId){if(!deviceId||!UUID_PATTERN.test(deviceId))throw new Error("Sign in with ChatGPT requires a device ID (UUID) for this installation");return`urn:uuid:${deviceId.toLowerCase()}`}async function loginOpenAIChatGPT(interaction,options){let hostId=agentHostId(options?.getDeviceId?.()),{verifier,challenge}=await generatePKCE(),state=randomValue(),nonce=randomValue(),callback;try{callback=await startCallbackServer(state)}catch(error){interaction.notify({type:"info",message:`Could not listen on ${REDIRECT_URI}; paste the final redirect URL to continue. ${error instanceof Error?error.message:String(error)}`})}let authorizationUrl=new URL(AUTHORIZE_URL);authorizationUrl.search=new URLSearchParams({client_id:DYNAMIC_CLIENT_ID,agent_name_hint:AGENT_NAME_HINT,ext_agent_host_id:hostId,response_type:"code",redirect_uri:REDIRECT_URI,resource:RESOURCE,scope:SCOPE,state,code_challenge:challenge,code_challenge_method:"S256",nonce}).toString(),interaction.notify({type:"auth_url",url:authorizationUrl.toString(),instructions:"Complete sign-in in your browser. If the callback does not complete, paste the final redirect URL here."});let manualAbort=new AbortController,manualCode=interaction.prompt({type:"manual_code",message:"Complete login in your browser, or paste the final redirect URL here:",placeholder:REDIRECT_URI,signal:AbortSignal.any([manualAbort.signal,interaction.signal])}).then(input=>authorizationResultFromManualInput(input,state));try{let result=await(callback?Promise.race([callback.result,manualCode]):manualCode);return interaction.notify({type:"progress",message:"Exchanging authorization code for tokens..."}),await exchangeAuthorizationCode(result.code,verifier,result.clientId,interaction.signal)}catch(error){throw interaction.signal.aborted?new Error("Login cancelled"):error}finally{manualAbort.abort(),callback?.server.close(),callback?.server.closeAllConnections()}}var openaiChatGPTOAuth={name:"OpenAI (ChatGPT subscription)",isSubscription:!0,loginLabel:"Sign in with ChatGPT",login:loginOpenAIChatGPT,refresh:refreshAccessToken,revoke:revokeSession,async check({credential}){if(!(!credential?.access||!credential.refresh||credential.signedOut===!0))return{type:"oauth",source:"OAuth"}},async toAuth(credential){return{apiKey:credential.access}}};export{openaiChatGPTOAuth};
75
+ </html>`}function oauthSuccessHtml(message){return renderPage({title:"Authentication successful",heading:"Authentication successful",message})}function oauthErrorHtml(message,details){return renderPage({title:"Authentication failed",heading:"Authentication failed",message,details})}function formatThrownValue(value){return value instanceof Error?value.message||value.name:typeof value=="string"?value:String(value)}var ModelsError=class extends Error{constructor(code,message,options){super(withCauseDetail(message,options?.cause),options),this.name="ModelsError",this.code=code}};function withCauseDetail(message,cause){if(cause==null)return message;let detail=formatThrownValue(cause).trim();return!detail||message.includes(detail)?message:`${message}: ${detail}`}var _a,OAuthTokenEndpointError=class extends Error{constructor(message,status,facts={}){super(message),this.status=status,this.oauthError=facts.oauthError,this.credentialRefused=facts.credentialRefused??!1}};var UNAVAILABLE=Symbol.for("senpi.oauthRefreshUnavailable"),OAuthRefreshUnavailableError=class extends ModelsError{static{_a=UNAVAILABLE}constructor(provider,cause){super("oauth",`OAuth refresh failed for ${provider}`,{cause}),this[_a]=!0,this.name="OAuthRefreshUnavailableError"}};var procEnvCache=null;function getBunSandboxEnvValue(name){if(!(typeof process>"u"||!process.versions?.bun||Object.keys(process.env).length>0)){if(procEnvCache===null){procEnvCache=new Map;try{let{readFileSync}=__require("node:fs"),data=readFileSync("/proc/self/environ","utf-8");for(let entry of data.split("\0")){let idx=entry.indexOf("=");idx>0&&procEnvCache.set(entry.slice(0,idx),entry.slice(idx+1))}}catch{}}return procEnvCache.get(name)}}function getProviderEnvValue(name,env){return env?.[name]||(typeof process<"u"?process.env[name]:void 0)||getBunSandboxEnvValue(name)||void 0}var DEFAULT_WIRE_IDENTITY="senpi",wireIdentity=DEFAULT_WIRE_IDENTITY;function getWireIdentity(){return wireIdentity}function base64urlEncode(bytes){let binary="";for(let byte of bytes)binary+=String.fromCharCode(byte);return btoa(binary).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}async function generatePKCE(){let verifierBytes=new Uint8Array(32);crypto.getRandomValues(verifierBytes);let verifier=base64urlEncode(verifierBytes),data=new TextEncoder().encode(verifier),hashBuffer=await crypto.subtle.digest("SHA-256",data),challenge=base64urlEncode(new Uint8Array(hashBuffer));return{verifier,challenge}}var DYNAMIC_CLIENT_ID="dynamic_agent_client",UUID_PATTERN=/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,AUTHORIZE_URL="https://auth.openai.com/api/accounts/authorize",TOKEN_URL="https://auth.openai.com/api/accounts/oauth/token",DISCOVERY_URL="https://auth.openai.com/.well-known/openid-configuration",RESOURCE="https://api.openai.com/v1",CALLBACK_HOST=getProviderEnvValue("PI_OAUTH_CALLBACK_HOST")||"127.0.0.1",CALLBACK_PORT=1455,CALLBACK_PATH="/auth/callback",REDIRECT_URI=`http://127.0.0.1:${CALLBACK_PORT}${CALLBACK_PATH}`,DIRECT_TOKEN_SCOPE="chatgpt.tokens.use.direct",SCOPE=`openid profile email offline_access resource.invoke ${DIRECT_TOKEN_SCOPE}`,EXPIRY_MARGIN_MS=180*1e3;function randomValue(){return randomBytes(32).toString("base64url")}function authorizationResultFromCallback(url,expectedState){let code=url.searchParams.get("code");if(!code)throw new Error("Missing authorization code");let state=url.searchParams.get("state");if(!state)throw new Error("Missing OAuth state");if(state!==expectedState)throw new Error("OAuth state mismatch");let clientId=url.searchParams.get("client_id")?.trim();if(!clientId)throw new Error("OpenAI OAuth registration callback did not contain an issued client ID");return{code,clientId}}function authorizationResultFromManualInput(input,expectedState){let url;try{url=new URL(input.trim())}catch{throw new Error("Paste the full callback URL from the browser")}let expected=new URL(REDIRECT_URI);if(url.origin!==expected.origin||url.pathname!==expected.pathname)throw new Error(`The pasted callback URL must start with ${REDIRECT_URI}`);let error=url.searchParams.get("error");if(error)throw new Error(`ChatGPT authorization failed: ${error}`);return authorizationResultFromCallback(url,expectedState)}function sendHtml(response,status,body){response.writeHead(status,{"Content-Type":"text/html; charset=utf-8"}),response.end(body)}function startCallbackServer(expectedState){return new Promise((resolve,reject)=>{let resolveResult,rejectResult,result=new Promise((resolveAuthorization,rejectAuthorization)=>{resolveResult=resolveAuthorization,rejectResult=rejectAuthorization}),server=createServer((request,response)=>{try{let url=new URL(request.url||"",REDIRECT_URI);if(url.pathname!==CALLBACK_PATH){sendHtml(response,404,oauthErrorHtml("Callback route not found."));return}let error=url.searchParams.get("error");if(error){sendHtml(response,400,oauthErrorHtml("ChatGPT was not connected.",`Error: ${error}`)),rejectResult(new Error(`ChatGPT authorization failed: ${error}`));return}let authorizationResult;try{authorizationResult=authorizationResultFromCallback(url,expectedState)}catch(error2){let message=error2 instanceof Error?error2.message:"Invalid callback";sendHtml(response,400,oauthErrorHtml(message));return}sendHtml(response,200,oauthSuccessHtml("ChatGPT authentication completed. You can close this window.")),resolveResult(authorizationResult)}catch{sendHtml(response,500,oauthErrorHtml("Internal error while processing the callback."))}});server.once("error",reject),server.listen(CALLBACK_PORT,CALLBACK_HOST,()=>{server.removeListener("error",reject),server.on("error",rejectResult),resolve({server,result})})})}async function requestToken(body,signal){let response=await fetch(TOKEN_URL,{method:"POST",headers:{accept:"application/json","content-type":"application/x-www-form-urlencoded"},body,signal});if(!response.ok){let responseBody=await response.text().catch(()=>"");throw new OAuthTokenEndpointError(`OpenAI OAuth token request failed (${response.status}): ${responseBody||response.statusText}`,response.status)}let data=await response.json();if(typeof data!="object"||data===null||Array.isArray(data))throw new Error("OpenAI OAuth token response must be an object");return data}function requireTokenString(value,field){if(typeof value!="string"||value.trim().length===0)throw new Error(`OpenAI OAuth token response has invalid ${field}`);return value}function credentialFromTokenResponse(token,clientId){let access=requireTokenString(token.access_token,"access_token"),refresh=requireTokenString(token.refresh_token,"refresh_token"),scope=requireTokenString(token.scope,"scope");if(typeof token.expires_in!="number"||!Number.isFinite(token.expires_in)||token.expires_in<=0)throw new Error("OpenAI OAuth token response has invalid expires_in");let scopes=scope.trim().split(/\s+/).filter(Boolean);if(!scopes.includes(DIRECT_TOKEN_SCOPE))throw new Error(`OpenAI OAuth grant did not include ${DIRECT_TOKEN_SCOPE}`);return{type:"oauth",access,refresh,expires:Date.now()+token.expires_in*1e3-EXPIRY_MARGIN_MS,clientId,scopes}}async function exchangeAuthorizationCode(code,verifier,clientId,signal){let token=await requestToken(new URLSearchParams({grant_type:"authorization_code",client_id:clientId,code,code_verifier:verifier,redirect_uri:REDIRECT_URI,resource:RESOURCE}),signal);if(typeof token.id_token!="string"||token.id_token.trim().length===0)throw new Error("OpenAI OAuth token response did not contain an ID token");return credentialFromTokenResponse(token,clientId)}async function refreshAccessToken(credential,signal){let clientId=credential.clientId;if(typeof clientId!="string"||clientId.trim().length===0)throw new Error("Stored OpenAI OAuth credential does not contain an issued client ID; reconnect ChatGPT");let token=await requestToken(new URLSearchParams({grant_type:"refresh_token",client_id:clientId,refresh_token:credential.refresh,resource:RESOURCE}),signal);return credentialFromTokenResponse(token,clientId)}async function revokeSession(credential,options){let unconfirmed={status:"remote_revocation_unconfirmed"};if(!credential.refresh||typeof credential.clientId!="string"||!credential.clientId.trim())return unconfirmed;let signal=AbortSignal.any([...options?.signal?[options.signal]:[],AbortSignal.timeout(15e3)]),sleep=options?.sleep??(milliseconds=>new Promise((resolve,reject)=>{signal.throwIfAborted();let onAbort=()=>{clearTimeout(timer),reject(signal.reason)},timer=setTimeout(()=>{signal.removeEventListener("abort",onAbort),resolve()},milliseconds);signal.addEventListener("abort",onAbort,{once:!0})})),endpoint,delays=[250,1e3];for(let attempt=0;attempt<=delays.length;attempt++)try{if(signal.throwIfAborted(),attempt>0&&await sleep(delays[attempt-1]),!endpoint){let discovery=await fetch(DISCOVERY_URL,{signal,redirect:"error"});if(!discovery.ok){if(discovery.status>=500)continue;return unconfirmed}let metadata=await discovery.json();if(typeof metadata!="object"||metadata===null||!("revocation_endpoint"in metadata)||typeof metadata.revocation_endpoint!="string")return unconfirmed;let url=new URL(metadata.revocation_endpoint);if(url.protocol!=="https:"||url.username||url.password)return unconfirmed;endpoint=url.href}let response=await fetch(endpoint,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({token:credential.refresh,token_type_hint:"refresh_token",client_id:credential.clientId}),signal,redirect:"error"});if(response.status===200)return{status:"revoked"};if(response.status<500)return unconfirmed}catch{if(signal.aborted)return unconfirmed}return unconfirmed}function agentHostId(deviceId){if(!deviceId||!UUID_PATTERN.test(deviceId))throw new Error("Sign in with ChatGPT requires a device ID (UUID) for this installation");return`urn:uuid:${deviceId.toLowerCase()}`}async function loginOpenAIChatGPT(interaction,options){let hostId=agentHostId(options?.getDeviceId?.()),{verifier,challenge}=await generatePKCE(),state=randomValue(),nonce=randomValue(),callback;try{callback=await startCallbackServer(state)}catch(error){interaction.notify({type:"info",message:`Could not listen on ${REDIRECT_URI}; paste the final redirect URL to continue. ${error instanceof Error?error.message:String(error)}`})}let authorizationUrl=new URL(AUTHORIZE_URL);authorizationUrl.search=new URLSearchParams({client_id:DYNAMIC_CLIENT_ID,agent_name_hint:options?.appName??getWireIdentity(),ext_agent_host_id:hostId,response_type:"code",redirect_uri:REDIRECT_URI,resource:RESOURCE,scope:SCOPE,state,code_challenge:challenge,code_challenge_method:"S256",nonce}).toString(),interaction.notify({type:"auth_url",url:authorizationUrl.toString(),instructions:"Complete sign-in in your browser. If the callback does not complete, paste the final redirect URL here."});let manualAbort=new AbortController,manualCode=interaction.prompt({type:"manual_code",message:"Complete login in your browser, or paste the final redirect URL here:",placeholder:REDIRECT_URI,signal:AbortSignal.any([manualAbort.signal,interaction.signal])}).then(input=>authorizationResultFromManualInput(input,state));try{let result=await(callback?Promise.race([callback.result,manualCode]):manualCode);return interaction.notify({type:"progress",message:"Exchanging authorization code for tokens..."}),await exchangeAuthorizationCode(result.code,verifier,result.clientId,interaction.signal)}catch(error){throw interaction.signal.aborted?new Error("Login cancelled"):error}finally{manualAbort.abort(),callback?.server.close(),callback?.server.closeAllConnections()}}var openaiChatGPTOAuth={name:"OpenAI (ChatGPT subscription)",isSubscription:!0,loginLabel:"Sign in with ChatGPT",login:loginOpenAIChatGPT,refresh:refreshAccessToken,revoke:revokeSession,async check({credential}){if(!(!credential?.access||!credential.refresh||credential.signedOut===!0))return{type:"oauth",source:"OAuth"}},async toAuth(credential){return{apiKey:credential.access}}};export{openaiChatGPTOAuth};
@@ -1,5 +1,5 @@
1
1
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
2
- import{createWebSocketTransportFailure,startWebSocketLiveness}from"./chunk-YT2ZSZOY.js";import{combineAbortSignals}from"./chunk-SJ5DSOBX.js";import{transportProviderDiagnosticFromError}from"./chunk-VRWJJMHO.js";import{OPENAI_RESPONSES_RESERVED_BODY_KEYS,applyExtraBody,buildBaseOptions,clampMaxForOpenAI}from"./chunk-2XBKE2BZ.js";import{applyChatGptSubscriptionCacheAffinityHeaders,clampOpenAIPromptCacheKey,deriveOpenAIPromptCacheKey}from"./chunk-LPHUMR6R.js";import{formatProviderError,normalizeProviderError}from"./chunk-AC72EWI5.js";import{appendRetryAfterMsMarker,extract429RetryAfterMs}from"./chunk-RQFD6LG2.js";import{extractChatGptSubscriptionAccountId,getWireIdentity,uuidv7}from"./chunk-Y7QPP7BG.js";import{convertResponsesMessages,convertResponsesTools,processResponsesStream,resolveResponsesDeferredToolsMode,resolveResponsesToolPlacement}from"./chunk-V36CXIIB.js";import"./chunk-GVSBCJFI.js";import{registerSessionResourceCleanup}from"./chunk-WHPDEDCC.js";import{buildProviderDiagnostic,categoryForProviderCode,classifyProviderFailure,isOpaqueProviderCode,isProviderDiagnosticResetsAt,isProviderDiagnosticStatus,readProviderDiagnostic}from"./chunk-7UC4W2T2.js";import"./chunk-HK46JMSC.js";import{createGrammarToolInputProperties}from"./chunk-ED7VJGL4.js";import"./chunk-WDTJ6JKE.js";import{getProviderEnvValue}from"./chunk-5ROMKDLK.js";import"./chunk-3W47LTXQ.js";import{ACCOUNT_LIMIT_NEXT_STEP_LEAD,clampThinkingLevel,getDeclaredTools,getInitialSystemMessage,getSystemMessageText,normalizeContext,resolveTranscript,supportsMax,supportsXhigh}from"./chunk-TBARMJ75.js";import{attachProviderDiagnostic}from"./chunk-3SASTB6Y.js";import{AssistantMessageEventStream,appendAssistantMessageDiagnostic,createAssistantMessageDiagnostic,formatThrownValue}from"./chunk-5CSZPC55.js";import{headersToRecord}from"./chunk-PJ34QVL5.js";import"./chunk-IKOFCODM.js";var DEFAULT_PROXY_PORTS={ftp:21,gopher:70,http:80,https:443,ws:80,wss:443};function getProxyEnv(key,env){let lowercaseKey=key.toLowerCase(),uppercaseKey=key.toUpperCase();return env?.[lowercaseKey]||env?.[uppercaseKey]||getProviderEnvValue(lowercaseKey)||getProviderEnvValue(uppercaseKey)||""}function parseProxyTargetUrl(targetUrl){if(targetUrl instanceof URL)return targetUrl;try{return new URL(targetUrl)}catch{return}}function stripBrackets(host){return host.startsWith("[")&&host.endsWith("]")?host.slice(1,-1):host}function parseNoProxyEntry(entry){let trimmed=entry.trim().toLowerCase();if(!trimmed)return;if(trimmed.startsWith("[")){let closingBracket=trimmed.indexOf("]");if(closingBracket!==-1){let host=trimmed.slice(1,closingBracket),rest=trimmed.slice(closingBracket+1);if(rest.startsWith(":")){let port=Number.parseInt(rest.slice(1),10);return{host,port:Number.isNaN(port)?0:port}}return{host,port:0}}}if(trimmed.includes(":")&&trimmed.split(":").length>2)return{host:trimmed,port:0};let colonIndex=trimmed.lastIndexOf(":");if(colonIndex!==-1&&colonIndex===trimmed.indexOf(":")){let host=trimmed.slice(0,colonIndex),port=Number.parseInt(trimmed.slice(colonIndex+1),10);if(!Number.isNaN(port))return{host,port}}return{host:trimmed,port:0}}function shouldProxyHostname(hostname,port,env){let noProxy=getProxyEnv("no_proxy",env).toLowerCase();if(!noProxy)return!0;if(noProxy==="*")return!1;let normalizedTargetHost=stripBrackets(hostname.toLowerCase());return noProxy.split(/[,\s]/).every(entry=>{let parsed=parseNoProxyEntry(entry);if(!parsed||parsed.port&&parsed.port!==port)return!0;let domain=stripBrackets(parsed.host);return domain.startsWith("*.")?domain=domain.slice(2):(domain.startsWith(".")||domain.startsWith("*"))&&(domain=domain.slice(1)),domain?!(normalizedTargetHost===domain||normalizedTargetHost.endsWith(`.${domain}`)):!0})}function getProxyForUrl(targetUrl,env){let parsedUrl=parseProxyTargetUrl(targetUrl);if(!parsedUrl?.protocol||!parsedUrl.host)return"";let protocol=parsedUrl.protocol.split(":",1)[0],hostname=stripBrackets(parsedUrl.hostname||parsedUrl.host.replace(/:\d*$/,"")),port=Number.parseInt(parsedUrl.port,10)||DEFAULT_PROXY_PORTS[protocol]||0;if(!shouldProxyHostname(hostname,port,env))return"";let proxy=getProxyEnv(`${protocol}_proxy`,env)||getProxyEnv("all_proxy",env);return proxy&&!proxy.includes("://")&&(proxy=`${protocol}://${proxy}`),proxy}var UNSUPPORTED_PROXY_PROTOCOL_MESSAGE="Unsupported proxy protocol. SOCKS and PAC proxy URLs are not supported; use an HTTP or HTTPS proxy URL.";function resolveHttpProxyUrlForTarget(targetUrl,env){let proxy=getProxyForUrl(targetUrl,env);if(!proxy)return;let proxyUrl;try{proxyUrl=new URL(proxy)}catch(error){throw new Error(`Invalid proxy URL ${JSON.stringify(proxy)}: ${error instanceof Error?error.message:String(error)}`)}if(proxyUrl.protocol!=="http:"&&proxyUrl.protocol!=="https:")throw new Error(`${UNSUPPORTED_PROXY_PROTOCOL_MESSAGE} Got ${proxyUrl.protocol}`);return proxyUrl}var CHATGPT_USAGE_LIMIT_PREFIX="You have hit your ChatGPT usage limit",OTHER_ROUTES=`${ACCOUNT_LIMIT_NEXT_STEP_LEAD}add an OpenAI API key, sign in with another ChatGPT account, or switch providers.`,USAGE_PAGE="https://chatgpt.com/settings/usage",REACHED_TYPE_ADVICE={workspace_owner_credits_depleted:`Your workspace is out of credits: add credits at ${USAGE_PAGE}.`,workspace_member_credits_depleted:"Your workspace is out of credits: ask your workspace owner to add more.",workspace_owner_usage_limit_reached:"You hit the spend cap set for your workspace: raise it to continue.",workspace_member_usage_limit_reached:"You hit the spend cap your workspace owner set: ask an owner to raise it to continue."},PLAN_ADVICE={plus:`Upgrade to Pro, or buy credits at ${USAGE_PAGE}.`,pro:`Buy credits at ${USAGE_PAGE}.`,prolite:`Buy credits at ${USAGE_PAGE}.`,promax:`Buy credits at ${USAGE_PAGE}.`,free:"Upgrade to ChatGPT Plus to continue.",go:"Upgrade to ChatGPT Plus to continue.",team:"Ask your workspace admin for more access.",business:"Ask your workspace admin for more access.",self_serve_business_usage_based:"Ask your workspace admin for more access.",enterprise_cbp_usage_based:"Ask your workspace admin for more access."};function headerBool(value){let raw=value?.trim().toLowerCase();if(raw==="true"||raw==="1")return!0;if(raw==="false"||raw==="0")return!1}function limitAdvice(input,plan){let reachedType=input.header("x-codex-rate-limit-reached-type")?.trim().toLowerCase(),reached=reachedType?REACHED_TYPE_ADVICE[reachedType]:void 0;return reached||(headerBool(input.header("x-codex-credits-has-credits"))===!0?"This account has ChatGPT credits, but ChatGPT did not apply them to this request.":plan?PLAN_ADVICE[plan]:void 0)}var USAGE_LIMIT_CODE=/usage_limit_reached|usage_not_included/i,HTTP_LIMIT_CODE=/usage_limit_reached|usage_not_included|rate_limit_exceeded/i;function asUsageLimitError(value){return value!==null&&typeof value=="object"?value:void 0}function fromError(error,header){return describeChatGptUsageLimit({...typeof error.plan_type=="string"?{planType:error.plan_type}:{},...typeof error.resets_at=="number"?{resetsAt:error.resets_at}:{},header})}function hasCode(error,pattern){let code=typeof error.code=="string"&&error.code?error.code:error.type;return typeof code=="string"&&pattern.test(code)}function describeChatGptUsageLimitResponse(status,body,headers){let container=asUsageLimitError(body),error=container?asUsageLimitError(Reflect.get(container,"error")):void 0;if(!(!error||!(hasCode(error,HTTP_LIMIT_CODE)||status===429)))return fromError(error,name=>headers.get(name)??void 0)}function describeChatGptUsageLimitEvent(event){let error=asUsageLimitError(event.error);if(!error||!hasCode(error,USAGE_LIMIT_CODE))return;let headers=asUsageLimitError(event.headers);return fromError(error,name=>{if(!headers)return;let entry=Object.entries(headers).find(([key])=>key.toLowerCase()===name);return typeof entry?.[1]=="string"?entry[1]:void 0})}function describeChatGptUsageLimit(input){let plan=input.planType?.trim().toLowerCase()||void 0,sentences=[`${CHATGPT_USAGE_LIMIT_PREFIX}${plan?` (${plan} plan)`:""}.`],advice=limitAdvice(input,plan);if(advice&&sentences.push(advice),sentences.push(OTHER_ROUTES),input.resetsAt!==void 0&&Number.isFinite(input.resetsAt)){let mins=Math.max(0,Math.round((input.resetsAt*1e3-(input.nowMs??Date.now()))/6e4));sentences.push(`Try again in ~${mins} min.`)}return sentences.join(" ")}var CODEX_WEBSOCKET_FALLBACK_COOLDOWN_MS=6e4,CODEX_WEBSOCKET_MID_STREAM_FAILURES_BEFORE_FALLBACK=2,websocketDebugStats=new Map,websocketSseFallbackUntil=new Map,consecutiveMidStreamFailures=new Map;function getOrCreateWebSocketDebugStats(sessionId){let stats=websocketDebugStats.get(sessionId);return stats||(stats={requests:0,connectionsCreated:0,connectionsReused:0,cachedContextRequests:0,storeTrueRequests:0,fullContextRequests:0,deltaRequests:0,lastInputItems:0,websocketFailures:0,sseFallbacks:0},websocketDebugStats.set(sessionId,stats)),stats}function getWebSocketDebugStats(sessionId){let stats=websocketDebugStats.get(sessionId);return stats?{...stats}:void 0}function clearWebSocketFallbackState(sessionId){if(sessionId){websocketDebugStats.delete(sessionId),websocketSseFallbackUntil.delete(sessionId),consecutiveMidStreamFailures.delete(sessionId);return}websocketDebugStats.clear(),websocketSseFallbackUntil.clear(),consecutiveMidStreamFailures.clear()}function isWebSocketSseFallbackActive(sessionId){if(!sessionId)return!1;let fallbackUntil=websocketSseFallbackUntil.get(sessionId);if(fallbackUntil===void 0)return!1;let stats=websocketDebugStats.get(sessionId);return fallbackUntil>Date.now()?(stats&&(stats.websocketFallbackActive=!0),!0):(websocketSseFallbackUntil.delete(sessionId),stats&&(stats.websocketFallbackActive=!1),!1)}function recordWebSocketSseFallback(sessionId){if(!sessionId)return;let stats=getOrCreateWebSocketDebugStats(sessionId);stats.sseFallbacks++,stats.websocketFallbackActive=!0}function recordWebSocketFailure(sessionId,error,phase){if(!sessionId)return;let stats=getOrCreateWebSocketDebugStats(sessionId);if(stats.websocketFailures++,stats.lastWebSocketError=formatThrownValue(error),phase==="after_message_stream_start"){let failures=(consecutiveMidStreamFailures.get(sessionId)??0)+1;if(failures<CODEX_WEBSOCKET_MID_STREAM_FAILURES_BEFORE_FALLBACK){consecutiveMidStreamFailures.set(sessionId,failures);return}}consecutiveMidStreamFailures.delete(sessionId),websocketSseFallbackUntil.set(sessionId,Date.now()+CODEX_WEBSOCKET_FALLBACK_COOLDOWN_MS),stats.websocketFallbackActive=!0}function recordWebSocketSuccess(sessionId){sessionId&&consecutiveMidStreamFailures.delete(sessionId)}function asRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)?value:void 0}function nonEmptyString(value){return typeof value=="string"&&value.length>0?value:void 0}function errorCode(error){return nonEmptyString(error?.code)??nonEmptyString(error?.type)}function resetsAtMs(error,nowMs){let absolute=error?.resets_at;if(typeof absolute=="number"&&Number.isFinite(absolute)&&absolute>0){let ms=Math.round(absolute<1e12?absolute*1e3:absolute);return isProviderDiagnosticResetsAt(ms)?ms:void 0}let relative=error?.resets_in_seconds;if(typeof relative=="number"&&Number.isFinite(relative)&&relative>=0){let ms=Math.round(nowMs+relative*1e3);return isProviderDiagnosticResetsAt(ms)?ms:void 0}}function classifyCodexFailure(facts){let status=isProviderDiagnosticStatus(facts.status)?facts.status:void 0,reset=facts.resetsAt===void 0?{}:{resetsAt:facts.resetsAt};if(facts.code!==void 0&&categoryForProviderCode(facts.code)!==void 0){let classified=classifyProviderFailure({status,code:facts.code})??classifyProviderFailure({status:void 0,code:facts.code});return classified===void 0?void 0:buildProviderDiagnostic({...classified,...reset})}let byStatus=status===void 0?void 0:classifyProviderFailure({status,code:void 0});if(byStatus!==void 0&&byStatus.category!=="unknown")return byStatus;let opaque=[facts.code,facts.fallbackCode].find(code=>code!==void 0&&isOpaqueProviderCode(code));return opaque!==void 0?buildProviderDiagnostic({category:"unknown",code:opaque,evidence:"structured_code"}):byStatus}function codexHttpProviderDiagnostic(status,bodyText,nowMs=Date.now()){let error;try{error=asRecord(asRecord(JSON.parse(bodyText))?.error)}catch{error=void 0}return classifyCodexFailure({status,code:errorCode(error),resetsAt:resetsAtMs(error,nowMs)})}function codexEventProviderDiagnostic(event,nowMs=Date.now()){let response=asRecord(event.response),error=asRecord(event.error)??asRecord(response?.error),status=typeof event.status=="number"?event.status:void 0,eventType=nonEmptyString(event.type);return classifyCodexFailure({status,code:errorCode(error)??nonEmptyString(event.code),...eventType===void 0?{}:{fallbackCode:eventType},resetsAt:resetsAtMs(error,nowMs)})}function normalizeCodexReasoningSummary(reasoningSummary){switch(reasoningSummary){case null:case"off":return;case void 0:case"on":return"auto";default:return reasoningSummary}}function buildCodexReasoning(reasoningEffort,reasoningSummary,modelSupportsReasoning,thinkingOff){let effort;if(reasoningEffort!=null)effort=reasoningEffort;else if(reasoningEffort===void 0&&modelSupportsReasoning&&thinkingOff!==null)effort=thinkingOff??"none";else return;let summary=normalizeCodexReasoningSummary(reasoningSummary);return{effort,...summary===void 0?{}:{summary}}}function loadNodeOs(){return typeof process>"u"||!(process.versions?.node||process.versions?.bun)?null:process.getBuiltinModule?.("node:os")??null}var _os=loadNodeOs(),DEFAULT_CODEX_BASE_URL="https://chatgpt.com/backend-api",DEFAULT_MAX_RETRIES=0,BASE_DELAY_MS=1e3,DEFAULT_MAX_RETRY_DELAY_MS=6e4,DEFAULT_WEBSOCKET_CONNECT_TIMEOUT_MS=15e3,REQUEST_COMPRESSION_ZSTD_LEVEL=3,CODEX_TOOL_CALL_PROVIDERS=new Set(["openai","chatgpt-subscription","opencode"]),CODEX_PREVIOUS_RESPONSE_STALE_CODES=new Set(["codex_previous_response_stale"]),WEBSOCKET_CONNECTION_LIMIT_REACHED_CODE="websocket_connection_limit_reached",PREVIOUS_RESPONSE_NOT_FOUND_CODE="previous_response_not_found",CODEX_RESPONSE_STATUSES=new Set(["completed","incomplete","failed","cancelled","queued","in_progress"]);function assertSuccessfulOutput(output){if(output.stopReason==="pending")throw new Error("Codex stream ended without a stop reason");if(output.stopReason==="error"||output.stopReason==="aborted")throw new Error(output.errorMessage||"An unknown error occurred")}function isTerminalRateLimitError(errorText){return/GoUsageLimitError|FreeUsageLimitError|Monthly usage limit reached|available balance|insufficient_quota|out of budget|quota exceeded|billing/i.test(errorText)}function isRetryableError(status,errorText){return status===429&&isTerminalRateLimitError(errorText)?!1:status===429||status===500||status===502||status===503||status===504?!0:/rate.?limit|overloaded|service.?unavailable|upstream.?connect|connection.?refused/i.test(errorText)}var RetryDelayExceededError=class extends Error{};function validateRetryDelayMs(delayMs,options){let maxRetryDelayMs=options?.maxRetryDelayMs??DEFAULT_MAX_RETRY_DELAY_MS;if(maxRetryDelayMs>0&&delayMs>maxRetryDelayMs)throw new RetryDelayExceededError(`Server requested ${Math.ceil(delayMs/1e3)}s retry delay (max: ${Math.ceil(maxRetryDelayMs/1e3)}s)`);return delayMs}function sleep(ms,signal){return new Promise((resolve,reject)=>{if(signal?.aborted){reject(new Error("Request was aborted"));return}let timeout=setTimeout(resolve,ms);signal?.addEventListener("abort",()=>{clearTimeout(timeout),reject(new Error("Request was aborted"))})})}function normalizeTimeoutMs(value){if(value!==void 0){if(!Number.isFinite(value)||value<0)throw new Error(`Invalid timeoutMs: ${String(value)}`);return Math.floor(value)}}function loadNodeZlib(){return typeof process>"u"||!(process.versions?.node||process.versions?.bun)?null:process.getBuiltinModule?.("node:zlib")??null}function compressRequestBodyZstd(bodyJson){let zlib=loadNodeZlib();if(!zlib||typeof zlib.zstdCompressSync!="function")return null;try{let compressed=zlib.zstdCompressSync(bodyJson,{params:{[zlib.constants.ZSTD_c_compressionLevel]:REQUEST_COMPRESSION_ZSTD_LEVEL}});return new Uint8Array(compressed.buffer,compressed.byteOffset,compressed.byteLength)}catch{return null}}function copyBytesToArrayBuffer(bytes){let copy=new Uint8Array(bytes.byteLength);return copy.set(bytes),copy.buffer}var stream=(model,context,options)=>{let stream2=new AssistantMessageEventStream({captureBlocks:!0}),normalizedContext=resolveTranscript(context,model.compat?.supportsMidConvoSystemMessages);return(async()=>{let output={role:"assistant",content:[],api:"openai-codex-responses",provider:model.provider,model:model.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"pending",timestamp:Date.now()};try{let apiKey=options?.apiKey;if(!apiKey)throw new Error(`No API key for provider: ${model.provider}`);let accountId=extractAccountId(apiKey),grammarToolInputProperties=createGrammarToolInputProperties(getDeclaredTools(normalizedContext.messages),model.compat?.supportsOpenAIGrammarTools??!1),cacheSessionId=options?.cacheRetention==="none"?void 0:options?.sessionId,codexSessionId=clampOpenAIPromptCacheKey(cacheSessionId),body=buildRequestBody(model,normalizedContext,options,grammarToolInputProperties),nextBody=await options?.onPayload?.(body,model);nextBody!==void 0&&(body=nextBody);let websocketRequestId=codexSessionId||uuidv7(),routingHint=buildCodexRoutingHint(body.model,body.service_tier),sseHeaders=buildSSEHeaders(model.headers,options?.headers,accountId,apiKey,routingHint,codexSessionId),websocketHeaders=buildWebSocketHeaders(model.headers,options?.headers,accountId,apiKey,routingHint,websocketRequestId),bodyJson=JSON.stringify(body),httpTimeoutMs=normalizeTimeoutMs(options?.timeoutMs),websocketConnectTimeoutMs=normalizeTimeoutMs(options?.websocketConnectTimeoutMs),transport=options?.transport||"auto",startEmitted=!1,websocketDisabledForSession=transport!=="sse"&&isWebSocketSseFallbackActive(cacheSessionId);if(websocketDisabledForSession&&recordWebSocketSseFallback(cacheSessionId),transport!=="sse"&&!websocketDisabledForSession){let websocketStarted=!1,retriedWebSocketConnectionLimit=!1,retriedMissingWebSocketContinuation=!1;for(;;){websocketStarted=!1;try{if(await processWebSocketStream(resolveCodexWebSocketUrl(model.baseUrl),body,websocketHeaders,output,stream2,model,()=>{websocketStarted=!0,startEmitted||(startEmitted=!0,stream2.push({type:"start",partial:output}))},httpTimeoutMs,websocketConnectTimeoutMs,cacheSessionId,accountId??apiKey,grammarToolInputProperties,options),options?.signal?.aborted)throw new Error("Request was aborted");assertSuccessfulOutput(output),recordWebSocketSuccess(cacheSessionId),stream2.push({type:"done",reason:output.stopReason,message:output}),stream2.end();return}catch(error){let aborted=options?.signal?.aborted,connectionLimitBeforeStart=!websocketStarted&&isWebSocketConnectionLimitReachedError(error),previousResponseNotFound=isPreviousResponseNotFoundError(error);if(!aborted&&previousResponseNotFound&&!retriedMissingWebSocketContinuation){retriedMissingWebSocketContinuation=!0;continue}if(!aborted&&connectionLimitBeforeStart&&!retriedWebSocketConnectionLimit){retriedWebSocketConnectionLimit=!0;continue}if(aborted||isCodexNonTransportError(error)&&!connectionLimitBeforeStart)throw error;let phase=websocketStarted?"after_message_stream_start":"before_message_stream_start";if(appendAssistantMessageDiagnostic(output,createAssistantMessageDiagnostic("provider_transport_failure",error,{configuredTransport:transport,...websocketStarted?{}:{fallbackTransport:"sse"},eventsEmitted:websocketStarted,phase,requestBytes:new TextEncoder().encode(bodyJson).byteLength})),recordWebSocketFailure(cacheSessionId,error,phase),websocketStarted)throw error;recordWebSocketSseFallback(cacheSessionId);break}}}let compressedBody=compressRequestBodyZstd(bodyJson);compressedBody&&sseHeaders.set("content-encoding","zstd");let sseBody=compressedBody?copyBytesToArrayBuffer(compressedBody):bodyJson,response,lastError,maxRetries=options?.maxRetries??DEFAULT_MAX_RETRIES;for(let attempt=0;attempt<=maxRetries;attempt++){if(options?.signal?.aborted)throw new Error("Request was aborted");try{let headerTimeoutSignal=httpTimeoutMs!==void 0&&httpTimeoutMs>0?AbortSignal.timeout(httpTimeoutMs):void 0,combinedSignal=combineAbortSignals([options?.signal,headerTimeoutSignal]);try{response=await(options?.fetch??globalThis.fetch)(resolveCodexUrl(model.baseUrl),{method:"POST",headers:sseHeaders,body:sseBody,signal:combinedSignal.signal})}catch(error){throw headerTimeoutSignal?.aborted&&!options?.signal?.aborted?new Error(`Codex SSE response headers timed out after ${httpTimeoutMs}ms`):error}finally{combinedSignal.cleanup()}if(await options?.onResponse?.({status:response.status,headers:headersToRecord(response.headers)},model),response.ok)break;let errorText=await response.text();if(attempt<maxRetries&&isRetryableError(response.status,errorText)){let retryAfterDelayMs=extract429RetryAfterMs({status:429,headers:response.headers,bodyText:""}),delayMs=retryAfterDelayMs===void 0?BASE_DELAY_MS*2**attempt:validateRetryDelayMs(retryAfterDelayMs,options);await sleep(delayMs,options?.signal);continue}let fakeResponse=new Response(errorText,{status:response.status,statusText:response.statusText}),info=await parseErrorResponse(fakeResponse,response.headers),errorMessage=info.friendlyMessage||info.message;if(response.status===429){let hintMs=extract429RetryAfterMs({status:response.status,headers:response.headers,bodyText:errorText});hintMs!==void 0&&(errorMessage=appendRetryAfterMsMarker(errorMessage,hintMs))}throw attachProviderDiagnostic(new Error(errorMessage),codexHttpProviderDiagnostic(response.status,errorText))}catch(error){if(error instanceof Error&&(error.name==="AbortError"||error.message==="Request was aborted"))throw new Error("Request was aborted");if(lastError=error instanceof Error?error:new Error(String(error)),attempt<maxRetries&&!(lastError instanceof RetryDelayExceededError)&&!lastError.message.includes("usage limit")){let delayMs=BASE_DELAY_MS*2**attempt;await sleep(delayMs,options?.signal);continue}throw lastError}}if(!response?.ok)throw lastError??new Error("Failed after retries");if(!response.body)throw new Error("No response body");if(startEmitted||(startEmitted=!0,stream2.push({type:"start",partial:output})),await processStream(response,output,stream2,model,grammarToolInputProperties,options),options?.signal?.aborted)throw new Error("Request was aborted");assertSuccessfulOutput(output),stream2.push({type:"done",reason:output.stopReason,message:output}),stream2.end()}catch(error){for(let block of output.content)delete block.partialJson,delete block.customInput;output.stopReason=options?.signal?.aborted?"aborted":"error",output.errorMessage=formatProviderError(normalizeProviderError(error));let providerDiagnostic=output.stopReason==="error"?readProviderDiagnostic(error)??transportProviderDiagnosticFromError(error):void 0;providerDiagnostic!==void 0&&(output.providerDiagnostic=providerDiagnostic),stream2.push({type:"error",reason:output.stopReason,error:output}),stream2.end()}})(),stream2},streamSimple=(model,context,options)=>{let apiKey=options?.apiKey;if(!apiKey)throw new Error(`No API key for provider: ${model.provider}`);let base={...buildBaseOptions(model,context,options,apiKey),toolChoice:options?.toolChoice,serviceTier:options?.serviceTier},clampedReasoning=options?.reasoning?clampThinkingLevel(model,options.reasoning):void 0,reasoningEffort=clampedReasoning==="off"?void 0:clampedReasoning==="max"&&supportsMax(model)?"max":clampMaxForOpenAI(clampedReasoning,supportsXhigh(model));return stream(model,context,{...base,reasoningEffort})};function buildRequestBody(model,context,options,grammarToolInputProperties=createGrammarToolInputProperties(getDeclaredTools(context.messages),model.compat?.supportsOpenAIGrammarTools??!1)){let requestedReasoningEffort=options?.reasoningEffort,mappedReasoningEffort=requestedReasoningEffort===void 0?void 0:requestedReasoningEffort==="none"?model.thinkingLevelMap?.off:model.thinkingLevelMap?.[requestedReasoningEffort],reasoningEffort=mappedReasoningEffort===void 0?requestedReasoningEffort:mappedReasoningEffort,reasoningRequested=requestedReasoningEffort!==void 0&&requestedReasoningEffort!=="none"&&reasoningEffort!==null,supportsStrictMode=model.compat?.supportsStrictMode??!0,supportsOpenAIGrammarTools=model.compat?.supportsOpenAIGrammarTools??!1,supportsAdditionalTools=model.compat?.supportsAdditionalTools??!1,supportsToolSearch=model.compat?.supportsToolSearch??!1,toolPlacement=resolveResponsesToolPlacement(context.messages,resolveResponsesDeferredToolsMode(model.compat)!==void 0),messages=convertResponsesMessages(model,context,CODEX_TOOL_CALL_PROVIDERS,{includeSystemPrompt:!1,preserveThinking:reasoningRequested,preserveTextSignatures:!0,grammarToolInputProperties,supportsMidConvoSystemMessages:model.compat?.supportsMidConvoSystemMessages??!1,supportsAdditionalTools,supportsToolSearch,toolOptions:{strict:null,supportsStrictMode,supportsOpenAIGrammarTools}}),initialSystemMessage=getInitialSystemMessage(context.messages),instructions=initialSystemMessage?getSystemMessageText(initialSystemMessage):"",body={model:model.id,store:!1,stream:!0,instructions:instructions||"You are a helpful assistant.",input:messages,text:{verbosity:options?.textVerbosity||"low"},include:["reasoning.encrypted_content"],prompt_cache_key:options?.cacheRetention==="none"?void 0:deriveOpenAIPromptCacheKey(model.id,context),tool_choice:options?.toolChoice??"auto",parallel_tool_calls:!0};options?.temperature!==void 0&&(body.temperature=options.temperature),options?.serviceTier!==void 0&&(body.service_tier=options.serviceTier),toolPlacement.requestTools.length>0&&(body.tools=convertResponsesTools(toolPlacement.requestTools,{strict:null,supportsStrictMode,supportsOpenAIGrammarTools}));let reasoning=buildCodexReasoning(reasoningEffort,options?.reasoningSummary,model.reasoning,model.thinkingLevelMap?.off);return reasoning&&(body.reasoning=reasoning),applyExtraBody(body,options?.extraBody,OPENAI_RESPONSES_RESERVED_BODY_KEYS),body}function getServiceTierCostMultiplier(model,serviceTier){switch(serviceTier){case"ultrafast":return["gpt-6-astra","gpt-6.1-sol"].includes(model.upstreamModelId??model.id)?8:1;case"flex":return .5;case"priority":case"fast":return 2.5;default:return 1}}function applyServiceTierPricing(usage,serviceTier,model){let multiplier=getServiceTierCostMultiplier(model,serviceTier);multiplier!==1&&(usage.cost.input*=multiplier,usage.cost.output*=multiplier,usage.cost.cacheRead*=multiplier,usage.cost.cacheWrite*=multiplier,usage.cost.total=usage.cost.input+usage.cost.output+usage.cost.cacheRead+usage.cost.cacheWrite)}function resolveCodexServiceTier(responseServiceTier,requestServiceTier){return responseServiceTier==="default"&&(requestServiceTier==="flex"||requestServiceTier==="priority"||requestServiceTier==="fast"||requestServiceTier==="ultrafast")?requestServiceTier:responseServiceTier??requestServiceTier}function resolveCodexUrl(baseUrl){let normalized=(baseUrl&&baseUrl.trim().length>0?baseUrl:DEFAULT_CODEX_BASE_URL).replace(/\/+$/,"");return normalized.endsWith("/codex/responses")?normalized:normalized.endsWith("/codex")?`${normalized}/responses`:`${normalized}/codex/responses`}function resolveCodexWebSocketUrl(baseUrl){let url=new URL(resolveCodexUrl(baseUrl));return url.protocol==="https:"&&(url.protocol="wss:"),url.protocol==="http:"&&(url.protocol="ws:"),url.toString()}async function processStream(response,output,stream2,model,grammarToolInputProperties,options){await processResponsesStream(mapCodexEvents(parseSSE(response,options?.signal),output,model,options?.onProviderStreamEvent),output,stream2,model,{serviceTier:options?.serviceTier,grammarToolInputProperties,resolveServiceTier:resolveCodexServiceTier,applyServiceTierPricing:(usage,serviceTier)=>applyServiceTierPricing(usage,serviceTier,model)})}var CodexApiError=class extends Error{constructor(message,options){super(message),this.name="CodexApiError",this.code=options?.code,this.payload=options?.payload,this.cause=options?.cause}},CodexProtocolError=class extends Error{constructor(message,options){super(message),this.name="CodexProtocolError",this.payload=options?.payload,this.cause=options?.cause}},ProviderStreamEventCallbackError=class extends Error{constructor(cause){super(formatThrownValue(cause)),this.name="ProviderStreamEventCallbackError",this.cause=cause}};function isCodexNonTransportError(error){return error instanceof CodexApiError||error instanceof CodexProtocolError||error instanceof ProviderStreamEventCallbackError}function asRecord2(value){return value&&typeof value=="object"?value:null}function getString(value){return typeof value=="string"?value:void 0}function getCodexEventError(event){let response=asRecord2(event.response);return asRecord2(event.error)??(response?asRecord2(response.error):null)}function getCodexEventErrorCode(event){let error=getCodexEventError(event);return getString(error?.code)??getString(error?.type)??getString(event.code)??""}function getCodexEventErrorMessage(event){let response=asRecord2(event.response),error=getCodexEventError(event);return getString(error?.message)??getString(event.message)??getString(response?.message)??""}function isCodexPreviousResponseStale(error){return error instanceof CodexApiError&&typeof error.code=="string"&&CODEX_PREVIOUS_RESPONSE_STALE_CODES.has(error.code)}function isPreviousResponseNotFoundError(error){return error instanceof CodexApiError&&error.code===PREVIOUS_RESPONSE_NOT_FOUND_CODE}function isWebSocketConnectionLimitReachedError(error){return error instanceof CodexApiError&&error.code===WEBSOCKET_CONNECTION_LIMIT_REACHED_CODE}async function*mapCodexEvents(events,output,model,onProviderStreamEvent){for await(let event of events){try{await onProviderStreamEvent?.(event,model)}catch(error){throw new ProviderStreamEventCallbackError(error)}let type=typeof event.type=="string"?event.type:void 0;if(!type)continue;if(type==="error"){let code=getCodexEventErrorCode(event),message=getCodexEventErrorMessage(event),errorText=describeChatGptUsageLimitEvent(event)??`Codex error: ${message||code||JSON.stringify(event)}`,hintMs=extract429RetryAfterMs({bodyText:JSON.stringify(event)});throw hintMs!==void 0&&(errorText=appendRetryAfterMsMarker(errorText,hintMs)),attachProviderDiagnostic(new CodexApiError(errorText,{code:code||void 0,payload:event}),codexEventProviderDiagnostic(event))}if(type==="response.failed"){let code=getCodexEventErrorCode(event),message=getCodexEventErrorMessage(event),errorText=describeChatGptUsageLimitEvent({...event,error:getCodexEventError(event)})??(message||"Codex response failed"),hintMs=extract429RetryAfterMs({bodyText:JSON.stringify(event)});throw hintMs!==void 0&&(errorText=appendRetryAfterMsMarker(errorText,hintMs)),attachProviderDiagnostic(new CodexApiError(errorText,{code,payload:event}),codexEventProviderDiagnostic(event))}if(type==="response.done"||type==="response.completed"||type==="response.incomplete"){let response=event.response;typeof response?.end_turn=="boolean"&&(output.endTurn=response.end_turn);let normalizedResponse=response&&{...response,status:normalizeCodexStatus(response.status)};yield{...event,type:"response.completed",response:normalizedResponse};return}yield JSON.parse(JSON.stringify(event))}}function normalizeCodexStatus(status){if(typeof status=="string")return CODEX_RESPONSE_STATUSES.has(status)?status:void 0}async function*parseSSE(response,signal){if(!response.body)return;let reader=response.body.getReader(),decoder=new TextDecoder,buffer="",onAbort=()=>{reader.cancel().catch(()=>{})};signal?.addEventListener("abort",onAbort,{once:!0});try{for(;;){if(signal?.aborted)throw new Error("Request was aborted");let{done,value}=await reader.read();if(signal?.aborted)throw new Error("Request was aborted");buffer+=done?decoder.decode():decoder.decode(value,{stream:!0}),done&&buffer.trim()&&(buffer+=`
2
+ import{createWebSocketTransportFailure,startWebSocketLiveness}from"./chunk-YT2ZSZOY.js";import{combineAbortSignals}from"./chunk-SJ5DSOBX.js";import{transportProviderDiagnosticFromError}from"./chunk-7565XQAU.js";import{OPENAI_RESPONSES_RESERVED_BODY_KEYS,applyExtraBody,buildBaseOptions,clampMaxForOpenAI}from"./chunk-2XBKE2BZ.js";import{applyChatGptSubscriptionCacheAffinityHeaders,clampOpenAIPromptCacheKey,deriveOpenAIPromptCacheKey}from"./chunk-LPHUMR6R.js";import{formatProviderError,normalizeProviderError}from"./chunk-AC72EWI5.js";import{appendRetryAfterMsMarker,extract429RetryAfterMs}from"./chunk-RQFD6LG2.js";import{extractChatGptSubscriptionAccountId,getWireIdentity,uuidv7}from"./chunk-Y7QPP7BG.js";import{convertResponsesMessages,convertResponsesTools,processResponsesStream,resolveResponsesDeferredToolsMode,resolveResponsesToolPlacement}from"./chunk-V36CXIIB.js";import"./chunk-GVSBCJFI.js";import{registerSessionResourceCleanup}from"./chunk-WHPDEDCC.js";import{buildProviderDiagnostic,categoryForProviderCode,classifyProviderFailure,isOpaqueProviderCode,isProviderDiagnosticResetsAt,isProviderDiagnosticStatus,readProviderDiagnostic}from"./chunk-MOH5HOHX.js";import"./chunk-HK46JMSC.js";import{createGrammarToolInputProperties}from"./chunk-ED7VJGL4.js";import"./chunk-WDTJ6JKE.js";import{getProviderEnvValue}from"./chunk-5ROMKDLK.js";import"./chunk-3W47LTXQ.js";import{ACCOUNT_LIMIT_NEXT_STEP_LEAD,clampThinkingLevel,getDeclaredTools,getInitialSystemMessage,getSystemMessageText,normalizeContext,resolveTranscript,supportsMax,supportsXhigh}from"./chunk-TBARMJ75.js";import{attachProviderDiagnostic}from"./chunk-3SASTB6Y.js";import{AssistantMessageEventStream,appendAssistantMessageDiagnostic,createAssistantMessageDiagnostic,formatThrownValue}from"./chunk-5CSZPC55.js";import{headersToRecord}from"./chunk-PJ34QVL5.js";import"./chunk-IKOFCODM.js";var DEFAULT_PROXY_PORTS={ftp:21,gopher:70,http:80,https:443,ws:80,wss:443};function getProxyEnv(key,env){let lowercaseKey=key.toLowerCase(),uppercaseKey=key.toUpperCase();return env?.[lowercaseKey]||env?.[uppercaseKey]||getProviderEnvValue(lowercaseKey)||getProviderEnvValue(uppercaseKey)||""}function parseProxyTargetUrl(targetUrl){if(targetUrl instanceof URL)return targetUrl;try{return new URL(targetUrl)}catch{return}}function stripBrackets(host){return host.startsWith("[")&&host.endsWith("]")?host.slice(1,-1):host}function parseNoProxyEntry(entry){let trimmed=entry.trim().toLowerCase();if(!trimmed)return;if(trimmed.startsWith("[")){let closingBracket=trimmed.indexOf("]");if(closingBracket!==-1){let host=trimmed.slice(1,closingBracket),rest=trimmed.slice(closingBracket+1);if(rest.startsWith(":")){let port=Number.parseInt(rest.slice(1),10);return{host,port:Number.isNaN(port)?0:port}}return{host,port:0}}}if(trimmed.includes(":")&&trimmed.split(":").length>2)return{host:trimmed,port:0};let colonIndex=trimmed.lastIndexOf(":");if(colonIndex!==-1&&colonIndex===trimmed.indexOf(":")){let host=trimmed.slice(0,colonIndex),port=Number.parseInt(trimmed.slice(colonIndex+1),10);if(!Number.isNaN(port))return{host,port}}return{host:trimmed,port:0}}function shouldProxyHostname(hostname,port,env){let noProxy=getProxyEnv("no_proxy",env).toLowerCase();if(!noProxy)return!0;if(noProxy==="*")return!1;let normalizedTargetHost=stripBrackets(hostname.toLowerCase());return noProxy.split(/[,\s]/).every(entry=>{let parsed=parseNoProxyEntry(entry);if(!parsed||parsed.port&&parsed.port!==port)return!0;let domain=stripBrackets(parsed.host);return domain.startsWith("*.")?domain=domain.slice(2):(domain.startsWith(".")||domain.startsWith("*"))&&(domain=domain.slice(1)),domain?!(normalizedTargetHost===domain||normalizedTargetHost.endsWith(`.${domain}`)):!0})}function getProxyForUrl(targetUrl,env){let parsedUrl=parseProxyTargetUrl(targetUrl);if(!parsedUrl?.protocol||!parsedUrl.host)return"";let protocol=parsedUrl.protocol.split(":",1)[0],hostname=stripBrackets(parsedUrl.hostname||parsedUrl.host.replace(/:\d*$/,"")),port=Number.parseInt(parsedUrl.port,10)||DEFAULT_PROXY_PORTS[protocol]||0;if(!shouldProxyHostname(hostname,port,env))return"";let proxy=getProxyEnv(`${protocol}_proxy`,env)||getProxyEnv("all_proxy",env);return proxy&&!proxy.includes("://")&&(proxy=`${protocol}://${proxy}`),proxy}var UNSUPPORTED_PROXY_PROTOCOL_MESSAGE="Unsupported proxy protocol. SOCKS and PAC proxy URLs are not supported; use an HTTP or HTTPS proxy URL.";function resolveHttpProxyUrlForTarget(targetUrl,env){let proxy=getProxyForUrl(targetUrl,env);if(!proxy)return;let proxyUrl;try{proxyUrl=new URL(proxy)}catch(error){throw new Error(`Invalid proxy URL ${JSON.stringify(proxy)}: ${error instanceof Error?error.message:String(error)}`)}if(proxyUrl.protocol!=="http:"&&proxyUrl.protocol!=="https:")throw new Error(`${UNSUPPORTED_PROXY_PROTOCOL_MESSAGE} Got ${proxyUrl.protocol}`);return proxyUrl}var CHATGPT_USAGE_LIMIT_PREFIX="You have hit your ChatGPT usage limit",OTHER_ROUTES=`${ACCOUNT_LIMIT_NEXT_STEP_LEAD}add an OpenAI API key, sign in with another ChatGPT account, or switch providers.`,USAGE_PAGE="https://chatgpt.com/settings/usage",REACHED_TYPE_ADVICE={workspace_owner_credits_depleted:`Your workspace is out of credits: add credits at ${USAGE_PAGE}.`,workspace_member_credits_depleted:"Your workspace is out of credits: ask your workspace owner to add more.",workspace_owner_usage_limit_reached:"You hit the spend cap set for your workspace: raise it to continue.",workspace_member_usage_limit_reached:"You hit the spend cap your workspace owner set: ask an owner to raise it to continue."},PLAN_ADVICE={plus:`Upgrade to Pro, or buy credits at ${USAGE_PAGE}.`,pro:`Buy credits at ${USAGE_PAGE}.`,prolite:`Buy credits at ${USAGE_PAGE}.`,promax:`Buy credits at ${USAGE_PAGE}.`,free:"Upgrade to ChatGPT Plus to continue.",go:"Upgrade to ChatGPT Plus to continue.",team:"Ask your workspace admin for more access.",business:"Ask your workspace admin for more access.",self_serve_business_usage_based:"Ask your workspace admin for more access.",enterprise_cbp_usage_based:"Ask your workspace admin for more access."};function headerBool(value){let raw=value?.trim().toLowerCase();if(raw==="true"||raw==="1")return!0;if(raw==="false"||raw==="0")return!1}function limitAdvice(input,plan){let reachedType=input.header("x-codex-rate-limit-reached-type")?.trim().toLowerCase(),reached=reachedType?REACHED_TYPE_ADVICE[reachedType]:void 0;return reached||(headerBool(input.header("x-codex-credits-has-credits"))===!0?"This account has ChatGPT credits, but ChatGPT did not apply them to this request.":plan?PLAN_ADVICE[plan]:void 0)}var USAGE_LIMIT_CODE=/usage_limit_reached|usage_not_included/i,HTTP_LIMIT_CODE=/usage_limit_reached|usage_not_included|rate_limit_exceeded/i;function asUsageLimitError(value){return value!==null&&typeof value=="object"?value:void 0}function fromError(error,header){return describeChatGptUsageLimit({...typeof error.plan_type=="string"?{planType:error.plan_type}:{},...typeof error.resets_at=="number"?{resetsAt:error.resets_at}:{},header})}function hasCode(error,pattern){let code=typeof error.code=="string"&&error.code?error.code:error.type;return typeof code=="string"&&pattern.test(code)}function describeChatGptUsageLimitResponse(status,body,headers){let container=asUsageLimitError(body),error=container?asUsageLimitError(Reflect.get(container,"error")):void 0;if(!(!error||!(hasCode(error,HTTP_LIMIT_CODE)||status===429)))return fromError(error,name=>headers.get(name)??void 0)}function describeChatGptUsageLimitEvent(event){let error=asUsageLimitError(event.error);if(!error||!hasCode(error,USAGE_LIMIT_CODE))return;let headers=asUsageLimitError(event.headers);return fromError(error,name=>{if(!headers)return;let entry=Object.entries(headers).find(([key])=>key.toLowerCase()===name);return typeof entry?.[1]=="string"?entry[1]:void 0})}function describeChatGptUsageLimit(input){let plan=input.planType?.trim().toLowerCase()||void 0,sentences=[`${CHATGPT_USAGE_LIMIT_PREFIX}${plan?` (${plan} plan)`:""}.`],advice=limitAdvice(input,plan);if(advice&&sentences.push(advice),sentences.push(OTHER_ROUTES),input.resetsAt!==void 0&&Number.isFinite(input.resetsAt)){let mins=Math.max(0,Math.round((input.resetsAt*1e3-(input.nowMs??Date.now()))/6e4));sentences.push(`Try again in ~${mins} min.`)}return sentences.join(" ")}var CODEX_WEBSOCKET_FALLBACK_COOLDOWN_MS=6e4,CODEX_WEBSOCKET_MID_STREAM_FAILURES_BEFORE_FALLBACK=2,websocketDebugStats=new Map,websocketSseFallbackUntil=new Map,consecutiveMidStreamFailures=new Map;function getOrCreateWebSocketDebugStats(sessionId){let stats=websocketDebugStats.get(sessionId);return stats||(stats={requests:0,connectionsCreated:0,connectionsReused:0,cachedContextRequests:0,storeTrueRequests:0,fullContextRequests:0,deltaRequests:0,lastInputItems:0,websocketFailures:0,sseFallbacks:0},websocketDebugStats.set(sessionId,stats)),stats}function getWebSocketDebugStats(sessionId){let stats=websocketDebugStats.get(sessionId);return stats?{...stats}:void 0}function clearWebSocketFallbackState(sessionId){if(sessionId){websocketDebugStats.delete(sessionId),websocketSseFallbackUntil.delete(sessionId),consecutiveMidStreamFailures.delete(sessionId);return}websocketDebugStats.clear(),websocketSseFallbackUntil.clear(),consecutiveMidStreamFailures.clear()}function isWebSocketSseFallbackActive(sessionId){if(!sessionId)return!1;let fallbackUntil=websocketSseFallbackUntil.get(sessionId);if(fallbackUntil===void 0)return!1;let stats=websocketDebugStats.get(sessionId);return fallbackUntil>Date.now()?(stats&&(stats.websocketFallbackActive=!0),!0):(websocketSseFallbackUntil.delete(sessionId),stats&&(stats.websocketFallbackActive=!1),!1)}function recordWebSocketSseFallback(sessionId){if(!sessionId)return;let stats=getOrCreateWebSocketDebugStats(sessionId);stats.sseFallbacks++,stats.websocketFallbackActive=!0}function recordWebSocketFailure(sessionId,error,phase){if(!sessionId)return;let stats=getOrCreateWebSocketDebugStats(sessionId);if(stats.websocketFailures++,stats.lastWebSocketError=formatThrownValue(error),phase==="after_message_stream_start"){let failures=(consecutiveMidStreamFailures.get(sessionId)??0)+1;if(failures<CODEX_WEBSOCKET_MID_STREAM_FAILURES_BEFORE_FALLBACK){consecutiveMidStreamFailures.set(sessionId,failures);return}}consecutiveMidStreamFailures.delete(sessionId),websocketSseFallbackUntil.set(sessionId,Date.now()+CODEX_WEBSOCKET_FALLBACK_COOLDOWN_MS),stats.websocketFallbackActive=!0}function recordWebSocketSuccess(sessionId){sessionId&&consecutiveMidStreamFailures.delete(sessionId)}function asRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)?value:void 0}function nonEmptyString(value){return typeof value=="string"&&value.length>0?value:void 0}function errorCode(error){return nonEmptyString(error?.code)??nonEmptyString(error?.type)}function resetsAtMs(error,nowMs){let absolute=error?.resets_at;if(typeof absolute=="number"&&Number.isFinite(absolute)&&absolute>0){let ms=Math.round(absolute<1e12?absolute*1e3:absolute);return isProviderDiagnosticResetsAt(ms)?ms:void 0}let relative=error?.resets_in_seconds;if(typeof relative=="number"&&Number.isFinite(relative)&&relative>=0){let ms=Math.round(nowMs+relative*1e3);return isProviderDiagnosticResetsAt(ms)?ms:void 0}}function classifyCodexFailure(facts){let status=isProviderDiagnosticStatus(facts.status)?facts.status:void 0,reset=facts.resetsAt===void 0?{}:{resetsAt:facts.resetsAt};if(facts.code!==void 0&&categoryForProviderCode(facts.code)!==void 0){let classified=classifyProviderFailure({status,code:facts.code})??classifyProviderFailure({status:void 0,code:facts.code});return classified===void 0?void 0:buildProviderDiagnostic({...classified,...reset})}let byStatus=status===void 0?void 0:classifyProviderFailure({status,code:void 0});if(byStatus!==void 0&&byStatus.category!=="unknown")return byStatus;let opaque=[facts.code,facts.fallbackCode].find(code=>code!==void 0&&isOpaqueProviderCode(code));return opaque!==void 0?buildProviderDiagnostic({category:"unknown",code:opaque,evidence:"structured_code"}):byStatus}function codexHttpProviderDiagnostic(status,bodyText,nowMs=Date.now()){let error;try{error=asRecord(asRecord(JSON.parse(bodyText))?.error)}catch{error=void 0}return classifyCodexFailure({status,code:errorCode(error),resetsAt:resetsAtMs(error,nowMs)})}function codexEventProviderDiagnostic(event,nowMs=Date.now()){let response=asRecord(event.response),error=asRecord(event.error)??asRecord(response?.error),status=typeof event.status=="number"?event.status:void 0,eventType=nonEmptyString(event.type);return classifyCodexFailure({status,code:errorCode(error)??nonEmptyString(event.code),...eventType===void 0?{}:{fallbackCode:eventType},resetsAt:resetsAtMs(error,nowMs)})}function normalizeCodexReasoningSummary(reasoningSummary){switch(reasoningSummary){case null:case"off":return;case void 0:case"on":return"auto";default:return reasoningSummary}}function buildCodexReasoning(reasoningEffort,reasoningSummary,modelSupportsReasoning,thinkingOff){let effort;if(reasoningEffort!=null)effort=reasoningEffort;else if(reasoningEffort===void 0&&modelSupportsReasoning&&thinkingOff!==null)effort=thinkingOff??"none";else return;let summary=normalizeCodexReasoningSummary(reasoningSummary);return{effort,...summary===void 0?{}:{summary}}}function loadNodeOs(){return typeof process>"u"||!(process.versions?.node||process.versions?.bun)?null:process.getBuiltinModule?.("node:os")??null}var _os=loadNodeOs(),DEFAULT_CODEX_BASE_URL="https://chatgpt.com/backend-api",DEFAULT_MAX_RETRIES=0,BASE_DELAY_MS=1e3,DEFAULT_MAX_RETRY_DELAY_MS=6e4,DEFAULT_WEBSOCKET_CONNECT_TIMEOUT_MS=15e3,REQUEST_COMPRESSION_ZSTD_LEVEL=3,CODEX_TOOL_CALL_PROVIDERS=new Set(["openai","chatgpt-subscription","opencode"]),CODEX_PREVIOUS_RESPONSE_STALE_CODES=new Set(["codex_previous_response_stale"]),WEBSOCKET_CONNECTION_LIMIT_REACHED_CODE="websocket_connection_limit_reached",PREVIOUS_RESPONSE_NOT_FOUND_CODE="previous_response_not_found",CODEX_RESPONSE_STATUSES=new Set(["completed","incomplete","failed","cancelled","queued","in_progress"]);function assertSuccessfulOutput(output){if(output.stopReason==="pending")throw new Error("Codex stream ended without a stop reason");if(output.stopReason==="error"||output.stopReason==="aborted")throw new Error(output.errorMessage||"An unknown error occurred")}function isTerminalRateLimitError(errorText){return/GoUsageLimitError|FreeUsageLimitError|Monthly usage limit reached|available balance|insufficient_quota|out of budget|quota exceeded|billing/i.test(errorText)}function isRetryableError(status,errorText){return status===429&&isTerminalRateLimitError(errorText)?!1:status===429||status===500||status===502||status===503||status===504?!0:/rate.?limit|overloaded|service.?unavailable|upstream.?connect|connection.?refused/i.test(errorText)}var RetryDelayExceededError=class extends Error{};function validateRetryDelayMs(delayMs,options){let maxRetryDelayMs=options?.maxRetryDelayMs??DEFAULT_MAX_RETRY_DELAY_MS;if(maxRetryDelayMs>0&&delayMs>maxRetryDelayMs)throw new RetryDelayExceededError(`Server requested ${Math.ceil(delayMs/1e3)}s retry delay (max: ${Math.ceil(maxRetryDelayMs/1e3)}s)`);return delayMs}function sleep(ms,signal){return new Promise((resolve,reject)=>{if(signal?.aborted){reject(new Error("Request was aborted"));return}let timeout=setTimeout(resolve,ms);signal?.addEventListener("abort",()=>{clearTimeout(timeout),reject(new Error("Request was aborted"))})})}function normalizeTimeoutMs(value){if(value!==void 0){if(!Number.isFinite(value)||value<0)throw new Error(`Invalid timeoutMs: ${String(value)}`);return Math.floor(value)}}function loadNodeZlib(){return typeof process>"u"||!(process.versions?.node||process.versions?.bun)?null:process.getBuiltinModule?.("node:zlib")??null}function compressRequestBodyZstd(bodyJson){let zlib=loadNodeZlib();if(!zlib||typeof zlib.zstdCompressSync!="function")return null;try{let compressed=zlib.zstdCompressSync(bodyJson,{params:{[zlib.constants.ZSTD_c_compressionLevel]:REQUEST_COMPRESSION_ZSTD_LEVEL}});return new Uint8Array(compressed.buffer,compressed.byteOffset,compressed.byteLength)}catch{return null}}function copyBytesToArrayBuffer(bytes){let copy=new Uint8Array(bytes.byteLength);return copy.set(bytes),copy.buffer}var stream=(model,context,options)=>{let stream2=new AssistantMessageEventStream({captureBlocks:!0}),normalizedContext=resolveTranscript(context,model.compat?.supportsMidConvoSystemMessages);return(async()=>{let output={role:"assistant",content:[],api:"openai-codex-responses",provider:model.provider,model:model.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"pending",timestamp:Date.now()};try{let apiKey=options?.apiKey;if(!apiKey)throw new Error(`No API key for provider: ${model.provider}`);let accountId=extractAccountId(apiKey),grammarToolInputProperties=createGrammarToolInputProperties(getDeclaredTools(normalizedContext.messages),model.compat?.supportsOpenAIGrammarTools??!1),cacheSessionId=options?.cacheRetention==="none"?void 0:options?.sessionId,codexSessionId=clampOpenAIPromptCacheKey(cacheSessionId),body=buildRequestBody(model,normalizedContext,options,grammarToolInputProperties),nextBody=await options?.onPayload?.(body,model);nextBody!==void 0&&(body=nextBody);let websocketRequestId=codexSessionId||uuidv7(),routingHint=buildCodexRoutingHint(body.model,body.service_tier),sseHeaders=buildSSEHeaders(model.headers,options?.headers,accountId,apiKey,routingHint,codexSessionId),websocketHeaders=buildWebSocketHeaders(model.headers,options?.headers,accountId,apiKey,routingHint,websocketRequestId),bodyJson=JSON.stringify(body),httpTimeoutMs=normalizeTimeoutMs(options?.timeoutMs),websocketConnectTimeoutMs=normalizeTimeoutMs(options?.websocketConnectTimeoutMs),transport=options?.transport||"auto",startEmitted=!1,websocketDisabledForSession=transport!=="sse"&&isWebSocketSseFallbackActive(cacheSessionId);if(websocketDisabledForSession&&recordWebSocketSseFallback(cacheSessionId),transport!=="sse"&&!websocketDisabledForSession){let websocketStarted=!1,retriedWebSocketConnectionLimit=!1,retriedMissingWebSocketContinuation=!1;for(;;){websocketStarted=!1;try{if(await processWebSocketStream(resolveCodexWebSocketUrl(model.baseUrl),body,websocketHeaders,output,stream2,model,()=>{websocketStarted=!0,startEmitted||(startEmitted=!0,stream2.push({type:"start",partial:output}))},httpTimeoutMs,websocketConnectTimeoutMs,cacheSessionId,accountId??apiKey,grammarToolInputProperties,options),options?.signal?.aborted)throw new Error("Request was aborted");assertSuccessfulOutput(output),recordWebSocketSuccess(cacheSessionId),stream2.push({type:"done",reason:output.stopReason,message:output}),stream2.end();return}catch(error){let aborted=options?.signal?.aborted,connectionLimitBeforeStart=!websocketStarted&&isWebSocketConnectionLimitReachedError(error),previousResponseNotFound=isPreviousResponseNotFoundError(error);if(!aborted&&previousResponseNotFound&&!retriedMissingWebSocketContinuation){retriedMissingWebSocketContinuation=!0;continue}if(!aborted&&connectionLimitBeforeStart&&!retriedWebSocketConnectionLimit){retriedWebSocketConnectionLimit=!0;continue}if(aborted||isCodexNonTransportError(error)&&!connectionLimitBeforeStart)throw error;let phase=websocketStarted?"after_message_stream_start":"before_message_stream_start";if(appendAssistantMessageDiagnostic(output,createAssistantMessageDiagnostic("provider_transport_failure",error,{configuredTransport:transport,...websocketStarted?{}:{fallbackTransport:"sse"},eventsEmitted:websocketStarted,phase,requestBytes:new TextEncoder().encode(bodyJson).byteLength})),recordWebSocketFailure(cacheSessionId,error,phase),websocketStarted)throw error;recordWebSocketSseFallback(cacheSessionId);break}}}let compressedBody=compressRequestBodyZstd(bodyJson);compressedBody&&sseHeaders.set("content-encoding","zstd");let sseBody=compressedBody?copyBytesToArrayBuffer(compressedBody):bodyJson,response,lastError,maxRetries=options?.maxRetries??DEFAULT_MAX_RETRIES;for(let attempt=0;attempt<=maxRetries;attempt++){if(options?.signal?.aborted)throw new Error("Request was aborted");try{let headerTimeoutSignal=httpTimeoutMs!==void 0&&httpTimeoutMs>0?AbortSignal.timeout(httpTimeoutMs):void 0,combinedSignal=combineAbortSignals([options?.signal,headerTimeoutSignal]);try{response=await(options?.fetch??globalThis.fetch)(resolveCodexUrl(model.baseUrl),{method:"POST",headers:sseHeaders,body:sseBody,signal:combinedSignal.signal})}catch(error){throw headerTimeoutSignal?.aborted&&!options?.signal?.aborted?new Error(`Codex SSE response headers timed out after ${httpTimeoutMs}ms`):error}finally{combinedSignal.cleanup()}if(await options?.onResponse?.({status:response.status,headers:headersToRecord(response.headers)},model),response.ok)break;let errorText=await response.text();if(attempt<maxRetries&&isRetryableError(response.status,errorText)){let retryAfterDelayMs=extract429RetryAfterMs({status:429,headers:response.headers,bodyText:""}),delayMs=retryAfterDelayMs===void 0?BASE_DELAY_MS*2**attempt:validateRetryDelayMs(retryAfterDelayMs,options);await sleep(delayMs,options?.signal);continue}let fakeResponse=new Response(errorText,{status:response.status,statusText:response.statusText}),info=await parseErrorResponse(fakeResponse,response.headers),errorMessage=info.friendlyMessage||info.message;if(response.status===429){let hintMs=extract429RetryAfterMs({status:response.status,headers:response.headers,bodyText:errorText});hintMs!==void 0&&(errorMessage=appendRetryAfterMsMarker(errorMessage,hintMs))}throw attachProviderDiagnostic(new Error(errorMessage),codexHttpProviderDiagnostic(response.status,errorText))}catch(error){if(error instanceof Error&&(error.name==="AbortError"||error.message==="Request was aborted"))throw new Error("Request was aborted");if(lastError=error instanceof Error?error:new Error(String(error)),attempt<maxRetries&&!(lastError instanceof RetryDelayExceededError)&&!lastError.message.includes("usage limit")){let delayMs=BASE_DELAY_MS*2**attempt;await sleep(delayMs,options?.signal);continue}throw lastError}}if(!response?.ok)throw lastError??new Error("Failed after retries");if(!response.body)throw new Error("No response body");if(startEmitted||(startEmitted=!0,stream2.push({type:"start",partial:output})),await processStream(response,output,stream2,model,grammarToolInputProperties,options),options?.signal?.aborted)throw new Error("Request was aborted");assertSuccessfulOutput(output),stream2.push({type:"done",reason:output.stopReason,message:output}),stream2.end()}catch(error){for(let block of output.content)delete block.partialJson,delete block.customInput;output.stopReason=options?.signal?.aborted?"aborted":"error",output.errorMessage=formatProviderError(normalizeProviderError(error));let providerDiagnostic=output.stopReason==="error"?readProviderDiagnostic(error)??transportProviderDiagnosticFromError(error):void 0;providerDiagnostic!==void 0&&(output.providerDiagnostic=providerDiagnostic),stream2.push({type:"error",reason:output.stopReason,error:output}),stream2.end()}})(),stream2},streamSimple=(model,context,options)=>{let apiKey=options?.apiKey;if(!apiKey)throw new Error(`No API key for provider: ${model.provider}`);let base={...buildBaseOptions(model,context,options,apiKey),toolChoice:options?.toolChoice,serviceTier:options?.serviceTier},clampedReasoning=options?.reasoning?clampThinkingLevel(model,options.reasoning):void 0,reasoningEffort=clampedReasoning==="off"?void 0:clampedReasoning==="max"&&supportsMax(model)?"max":clampMaxForOpenAI(clampedReasoning,supportsXhigh(model));return stream(model,context,{...base,reasoningEffort})};function buildRequestBody(model,context,options,grammarToolInputProperties=createGrammarToolInputProperties(getDeclaredTools(context.messages),model.compat?.supportsOpenAIGrammarTools??!1)){let requestedReasoningEffort=options?.reasoningEffort,mappedReasoningEffort=requestedReasoningEffort===void 0?void 0:requestedReasoningEffort==="none"?model.thinkingLevelMap?.off:model.thinkingLevelMap?.[requestedReasoningEffort],reasoningEffort=mappedReasoningEffort===void 0?requestedReasoningEffort:mappedReasoningEffort,reasoningRequested=requestedReasoningEffort!==void 0&&requestedReasoningEffort!=="none"&&reasoningEffort!==null,supportsStrictMode=model.compat?.supportsStrictMode??!0,supportsOpenAIGrammarTools=model.compat?.supportsOpenAIGrammarTools??!1,supportsAdditionalTools=model.compat?.supportsAdditionalTools??!1,supportsToolSearch=model.compat?.supportsToolSearch??!1,toolPlacement=resolveResponsesToolPlacement(context.messages,resolveResponsesDeferredToolsMode(model.compat)!==void 0),messages=convertResponsesMessages(model,context,CODEX_TOOL_CALL_PROVIDERS,{includeSystemPrompt:!1,preserveThinking:reasoningRequested,preserveTextSignatures:!0,grammarToolInputProperties,supportsMidConvoSystemMessages:model.compat?.supportsMidConvoSystemMessages??!1,supportsAdditionalTools,supportsToolSearch,toolOptions:{strict:null,supportsStrictMode,supportsOpenAIGrammarTools}}),initialSystemMessage=getInitialSystemMessage(context.messages),instructions=initialSystemMessage?getSystemMessageText(initialSystemMessage):"",body={model:model.id,store:!1,stream:!0,instructions:instructions||"You are a helpful assistant.",input:messages,text:{verbosity:options?.textVerbosity||"low"},include:["reasoning.encrypted_content"],prompt_cache_key:options?.cacheRetention==="none"?void 0:deriveOpenAIPromptCacheKey(model.id,context),tool_choice:options?.toolChoice??"auto",parallel_tool_calls:!0};options?.temperature!==void 0&&(body.temperature=options.temperature),options?.serviceTier!==void 0&&(body.service_tier=options.serviceTier),toolPlacement.requestTools.length>0&&(body.tools=convertResponsesTools(toolPlacement.requestTools,{strict:null,supportsStrictMode,supportsOpenAIGrammarTools}));let reasoning=buildCodexReasoning(reasoningEffort,options?.reasoningSummary,model.reasoning,model.thinkingLevelMap?.off);return reasoning&&(body.reasoning=reasoning),applyExtraBody(body,options?.extraBody,OPENAI_RESPONSES_RESERVED_BODY_KEYS),body}function getServiceTierCostMultiplier(model,serviceTier){switch(serviceTier){case"ultrafast":return["gpt-6-astra","gpt-6.1-sol"].includes(model.upstreamModelId??model.id)?8:1;case"flex":return .5;case"priority":case"fast":return 2.5;default:return 1}}function applyServiceTierPricing(usage,serviceTier,model){let multiplier=getServiceTierCostMultiplier(model,serviceTier);multiplier!==1&&(usage.cost.input*=multiplier,usage.cost.output*=multiplier,usage.cost.cacheRead*=multiplier,usage.cost.cacheWrite*=multiplier,usage.cost.total=usage.cost.input+usage.cost.output+usage.cost.cacheRead+usage.cost.cacheWrite)}function resolveCodexServiceTier(responseServiceTier,requestServiceTier){return responseServiceTier==="default"&&(requestServiceTier==="flex"||requestServiceTier==="priority"||requestServiceTier==="fast"||requestServiceTier==="ultrafast")?requestServiceTier:responseServiceTier??requestServiceTier}function resolveCodexUrl(baseUrl){let normalized=(baseUrl&&baseUrl.trim().length>0?baseUrl:DEFAULT_CODEX_BASE_URL).replace(/\/+$/,"");return normalized.endsWith("/codex/responses")?normalized:normalized.endsWith("/codex")?`${normalized}/responses`:`${normalized}/codex/responses`}function resolveCodexWebSocketUrl(baseUrl){let url=new URL(resolveCodexUrl(baseUrl));return url.protocol==="https:"&&(url.protocol="wss:"),url.protocol==="http:"&&(url.protocol="ws:"),url.toString()}async function processStream(response,output,stream2,model,grammarToolInputProperties,options){await processResponsesStream(mapCodexEvents(parseSSE(response,options?.signal),output,model,options?.onProviderStreamEvent),output,stream2,model,{serviceTier:options?.serviceTier,grammarToolInputProperties,resolveServiceTier:resolveCodexServiceTier,applyServiceTierPricing:(usage,serviceTier)=>applyServiceTierPricing(usage,serviceTier,model)})}var CodexApiError=class extends Error{constructor(message,options){super(message),this.name="CodexApiError",this.code=options?.code,this.payload=options?.payload,this.cause=options?.cause}},CodexProtocolError=class extends Error{constructor(message,options){super(message),this.name="CodexProtocolError",this.payload=options?.payload,this.cause=options?.cause}},ProviderStreamEventCallbackError=class extends Error{constructor(cause){super(formatThrownValue(cause)),this.name="ProviderStreamEventCallbackError",this.cause=cause}};function isCodexNonTransportError(error){return error instanceof CodexApiError||error instanceof CodexProtocolError||error instanceof ProviderStreamEventCallbackError}function asRecord2(value){return value&&typeof value=="object"?value:null}function getString(value){return typeof value=="string"?value:void 0}function getCodexEventError(event){let response=asRecord2(event.response);return asRecord2(event.error)??(response?asRecord2(response.error):null)}function getCodexEventErrorCode(event){let error=getCodexEventError(event);return getString(error?.code)??getString(error?.type)??getString(event.code)??""}function getCodexEventErrorMessage(event){let response=asRecord2(event.response),error=getCodexEventError(event);return getString(error?.message)??getString(event.message)??getString(response?.message)??""}function isCodexPreviousResponseStale(error){return error instanceof CodexApiError&&typeof error.code=="string"&&CODEX_PREVIOUS_RESPONSE_STALE_CODES.has(error.code)}function isPreviousResponseNotFoundError(error){return error instanceof CodexApiError&&error.code===PREVIOUS_RESPONSE_NOT_FOUND_CODE}function isWebSocketConnectionLimitReachedError(error){return error instanceof CodexApiError&&error.code===WEBSOCKET_CONNECTION_LIMIT_REACHED_CODE}async function*mapCodexEvents(events,output,model,onProviderStreamEvent){for await(let event of events){try{await onProviderStreamEvent?.(event,model)}catch(error){throw new ProviderStreamEventCallbackError(error)}let type=typeof event.type=="string"?event.type:void 0;if(!type)continue;if(type==="error"){let code=getCodexEventErrorCode(event),message=getCodexEventErrorMessage(event),errorText=describeChatGptUsageLimitEvent(event)??`Codex error: ${message||code||JSON.stringify(event)}`,hintMs=extract429RetryAfterMs({bodyText:JSON.stringify(event)});throw hintMs!==void 0&&(errorText=appendRetryAfterMsMarker(errorText,hintMs)),attachProviderDiagnostic(new CodexApiError(errorText,{code:code||void 0,payload:event}),codexEventProviderDiagnostic(event))}if(type==="response.failed"){let code=getCodexEventErrorCode(event),message=getCodexEventErrorMessage(event),errorText=describeChatGptUsageLimitEvent({...event,error:getCodexEventError(event)})??(message||"Codex response failed"),hintMs=extract429RetryAfterMs({bodyText:JSON.stringify(event)});throw hintMs!==void 0&&(errorText=appendRetryAfterMsMarker(errorText,hintMs)),attachProviderDiagnostic(new CodexApiError(errorText,{code,payload:event}),codexEventProviderDiagnostic(event))}if(type==="response.done"||type==="response.completed"||type==="response.incomplete"){let response=event.response;typeof response?.end_turn=="boolean"&&(output.endTurn=response.end_turn);let normalizedResponse=response&&{...response,status:normalizeCodexStatus(response.status)};yield{...event,type:"response.completed",response:normalizedResponse};return}yield JSON.parse(JSON.stringify(event))}}function normalizeCodexStatus(status){if(typeof status=="string")return CODEX_RESPONSE_STATUSES.has(status)?status:void 0}async function*parseSSE(response,signal){if(!response.body)return;let reader=response.body.getReader(),decoder=new TextDecoder,buffer="",onAbort=()=>{reader.cancel().catch(()=>{})};signal?.addEventListener("abort",onAbort,{once:!0});try{for(;;){if(signal?.aborted)throw new Error("Request was aborted");let{done,value}=await reader.read();if(signal?.aborted)throw new Error("Request was aborted");buffer+=done?decoder.decode():decoder.decode(value,{stream:!0}),done&&buffer.trim()&&(buffer+=`
3
3
 
4
4
  `);let idx=buffer.indexOf(`
5
5
 
@@ -1,5 +1,5 @@
1
1
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
2
- import{resolveOpenAIClientAuth}from"./chunk-GFCKDAH5.js";import{OpenAI}from"./chunk-CD2HJK4C.js";import{formatGitHubCopilotToolLimitError,limitGitHubCopilotTools,recordGitHubCopilotToolLimit,withGitHubCopilotFailureNote}from"./chunk-FQZZGSYH.js";import{getPiUserAgent}from"./chunk-QTG7MY2X.js";import{awaitProviderTransport,iterateProviderTransport,openAICompatibleProviderDiagnosticFromError}from"./chunk-VRWJJMHO.js";import{OPENAI_COMPLETIONS_RESERVED_BODY_KEYS,applyExtraBody,buildBaseOptions,clampMaxForOpenAI,clampThinkingBudgetToAnswerRoom,thinkingBudgetForLevel}from"./chunk-2XBKE2BZ.js";import{retryProviderStreamRequest}from"./chunk-GIT63LXN.js";import{clampOpenAIPromptCacheKey}from"./chunk-LPHUMR6R.js";import{normalizeToolParametersForMoonshot,normalizeToolParametersForOpenAICompat}from"./chunk-IYL5E4QQ.js";import{primeStreamUntilContent,sendWithForcedToolChoiceFallback}from"./chunk-OEFCY46F.js";import{buildCopilotDynamicHeaders,hasCopilotVisionInput}from"./chunk-KRNXUTZJ.js";import{formatProviderError,normalizeProviderError}from"./chunk-AC72EWI5.js";import"./chunk-RQFD6LG2.js";import"./chunk-RFB5CBW7.js";import{reportedCount}from"./chunk-GVSBCJFI.js";import{getOpenAICompletionsCompat}from"./chunk-32R442XT.js";import{readProviderDiagnostic}from"./chunk-7UC4W2T2.js";import{appendGrammarToolInputJsonDelta,createGrammarToolInputProperties,getGrammarToolInput,getJsonSchemaToolParameters,resolveGrammarConstrainedSampling,resolveJsonSchemaStrictSampling,shortHash,transformMessages}from"./chunk-ED7VJGL4.js";import{sanitizeSurrogates}from"./chunk-WDTJ6JKE.js";import{getProviderEnvValue}from"./chunk-5ROMKDLK.js";import{parseStreamingJson}from"./chunk-3W47LTXQ.js";import{calculateCost,clampThinkingLevel,getCurrentTools,getDeclaredTools,getSystemMessageText,inferOpenAIThinkingLevelMap,renderSystemMessageUpdate,resolveTranscript,resolveTranscriptTools,supportsMax,supportsXhigh}from"./chunk-TBARMJ75.js";import"./chunk-3SASTB6Y.js";import{AssistantMessageEventStream}from"./chunk-5CSZPC55.js";import{headersToRecord}from"./chunk-PJ34QVL5.js";import"./chunk-IKOFCODM.js";var KIMI_K3_THINKING_LEVEL_MAP={off:null,minimal:null,low:"low",medium:null,high:"high",xhigh:null,max:"max"},DEEPSEEK_THINKING_LEVEL_MAP={minimal:"high",low:"high",medium:"high",high:"high",xhigh:"max",max:"max"},OPENROUTER_DEEPSEEK_THINKING_LEVEL_MAP={minimal:"high",low:"high",medium:"high",high:"high",xhigh:"high",max:"high"},MIMO_THINKING_LEVEL_MAP={minimal:"low",low:"low",medium:"medium",high:"high",xhigh:"high",max:null},OLLAMA_THINKING_LEVEL_MAP={off:"none",minimal:null,low:"low",medium:"medium",high:"high",xhigh:null,max:"high"};function getThinkingLevelMap(model,compat){let inferred=inferOpenAIThinkingLevelMap(model);if(inferred!==void 0)return inferred;let id=model.id.toLowerCase(),isKimiK3=id==="k3"||id.startsWith("k3-")||/(?:^|[/:-])kimi-k3(?:$|[/.:_-])/.test(id),isDeepSeek=id.includes("deepseek"),isMiMo=/\bmimo\b/.test(id),isGlm5x=/(?:^|[/:-])glm-5\.[23](?:$|[/.:_-])/.test(id);if(model.provider==="ollama")return OLLAMA_THINKING_LEVEL_MAP;if(isKimiK3)return KIMI_K3_THINKING_LEVEL_MAP;if(compat.thinkingFormat==="openrouter"&&isDeepSeek)return OPENROUTER_DEEPSEEK_THINKING_LEVEL_MAP;if((compat.thinkingFormat==="openai"||compat.thinkingFormat==="openrouter")&&isMiMo)return MIMO_THINKING_LEVEL_MAP;if(isDeepSeek)return DEEPSEEK_THINKING_LEVEL_MAP;if(isGlm5x)return compat.thinkingFormat==="zai"?DEEPSEEK_THINKING_LEVEL_MAP:compat.thinkingFormat==="openrouter"?{xhigh:"xhigh"}:{max:"max"}}function resolveReasoningEffort(thinkingLevelMap,effort){let mapped=thinkingLevelMap?.[effort];return mapped===void 0?effort:typeof mapped=="string"?mapped:void 0}function hasToolHistory(messages){for(let msg of messages)if(msg.role==="toolResult"||msg.role==="assistant"&&msg.content.some(block=>block.type==="toolCall"))return!0;return!1}function resolveKimiDeferredTools(messages,compat){let deferred=new Map;if(compat.deferredToolsMode!=="kimi")return deferred;let names=new Set;for(let message of messages)if(message.role==="toolResult")for(let name of message.addedToolNames??[])names.add(name);for(let tool of getCurrentTools(messages))names.has(tool.name)&&deferred.set(tool.name,tool);return deferred}function isTextContentBlock(block){return block.type==="text"}function isThinkingContentBlock(block){return block.type==="thinking"}function isToolCallBlock(block){return block.type==="toolCall"}function isImageContentBlock(block){return block.type==="image"}function isRecord(value){return typeof value=="object"&&value!==null}function getOpenRouterRawMetadata(error){if(!isRecord(error)||!isRecord(error.error)||!isRecord(error.error.metadata))return;let rawMetadata=error.error.metadata.raw;return typeof rawMetadata=="string"?rawMetadata:void 0}function isForcedOpenAICompletionsToolChoice(toolChoice){return toolChoice!==void 0&&toolChoice!=="auto"&&toolChoice!=="none"}function chatChunkHasContent(chunk){return!isRecord(chunk)||!Array.isArray(chunk.choices)?!1:chunk.choices.some(choice=>{if(!isRecord(choice))return!1;if(typeof choice.finish_reason=="string"&&choice.finish_reason.length>0)return!0;let delta=choice.delta;return isRecord(delta)?Array.isArray(delta.tool_calls)&&delta.tool_calls.length>0?!0:["content","reasoning_content","reasoning","reasoning_text"].some(field=>typeof delta[field]=="string"&&delta[field].length>0):!1})}function isReasoningDetailObject(detail){return typeof detail=="object"&&detail!==null&&!Array.isArray(detail)}function hasValidCommonReasoningDetailFields(candidate){return(candidate.id===void 0||candidate.id===null||typeof candidate.id=="string")&&(candidate.format===void 0||typeof candidate.format=="string")&&(candidate.index===void 0||typeof candidate.index=="number")}function isOpenAIReasoningDetail(detail){if(!isReasoningDetailObject(detail)||!hasValidCommonReasoningDetailFields(detail))return!1;switch(detail.type){case"reasoning.summary":return typeof detail.summary=="string";case"reasoning.encrypted":return typeof detail.data=="string";case"reasoning.text":return typeof detail.text=="string"&&(detail.signature===void 0||detail.signature===null||typeof detail.signature=="string");default:return!1}}function parseOpenAIReasoningDetails(signature){if(signature)try{let parsed=JSON.parse(signature);return Array.isArray(parsed)&&parsed.length>0&&parsed.every(isOpenAIReasoningDetail)?parsed:void 0}catch{return}}function parseLegacyEncryptedReasoningDetail(signature){if(signature)try{let parsed=JSON.parse(signature);return isOpenAIReasoningDetail(parsed)&&parsed.type==="reasoning.encrypted"&&typeof parsed.id=="string"&&parsed.id.length>0&&parsed.data.length>0?parsed:void 0}catch{return}}function fillMissingCommonReasoningDetailFields(target,source){target.id??=source.id,target.format||=source.format,target.index??=source.index}function appendOpenAIReasoningDetail(details,detail){let lastDetail=details[details.length-1];if(detail.type==="reasoning.text"&&lastDetail?.type==="reasoning.text"){lastDetail.text+=detail.text,lastDetail.signature||=detail.signature,fillMissingCommonReasoningDetailFields(lastDetail,detail);return}if(detail.type==="reasoning.summary"&&lastDetail?.type==="reasoning.summary"){lastDetail.summary+=detail.summary,fillMissingCommonReasoningDetailFields(lastDetail,detail);return}details.push({...detail})}function toReplayableReasoningDetail(detail){let common={};switch(detail.id!==void 0&&(common.id=detail.id),detail.format!==void 0&&(common.format=detail.format),detail.type){case"reasoning.text":{let replayable={...common,type:"reasoning.text",text:detail.text};return detail.signature!==void 0&&(replayable.signature=detail.signature),replayable}case"reasoning.summary":return{...common,type:"reasoning.summary",summary:detail.summary};case"reasoning.encrypted":return{...common,type:"reasoning.encrypted",data:detail.data}}}function toReplayableReasoningDetails(details){return details.map(toReplayableReasoningDetail)}var OPENAI_COMPLETIONS_REASONING_FIELDS=["reasoning","reasoning_content","reasoning_text"];function isOpenAICompletionsReasoningField(value){return OPENAI_COMPLETIONS_REASONING_FIELDS.some(field=>field===value)}function resolveCacheRetention(cacheRetention,env){return cacheRetention||(getProviderEnvValue("PI_CACHE_RETENTION",env)==="long"?"long":"short")}var stream=(model,context,options)=>{let stream2=new AssistantMessageEventStream({captureBlocks:!0}),normalizedContext=resolveTranscript(context,getOpenAICompletionsCompat(model).supportsMidConvoSystemMessages);return(async()=>{let output={role:"assistant",content:[],api:model.api,provider:model.provider,model:model.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"pending",timestamp:Date.now()},streamedReasoningDetails,applyStreamedReasoningDetails=block=>{streamedReasoningDetails!==void 0&&(block.thinkingSignature=JSON.stringify(streamedReasoningDetails))};try{let clientAuth=resolveOpenAIClientAuth(model.provider,options?.apiKey,options?.headers),compat=getOpenAICompletionsCompat(model),grammarToolInputProperties=createGrammarToolInputProperties(getDeclaredTools(normalizedContext.messages),compat.supportsOpenAIGrammarTools),cacheRetention=resolveCacheRetention(options?.cacheRetention??model.cacheRetention,options?.env),cacheSessionId=cacheRetention==="none"?void 0:options?.sessionId,client=createClient(model,normalizedContext,clientAuth.apiKey,clientAuth.headers,options?.fetch,cacheSessionId,compat),params=buildParams(model,normalizedContext,options,compat,cacheRetention,grammarToolInputProperties),nextParams=await options?.onPayload?.(params,model);nextParams!==void 0&&(params=nextParams),params=normalizeRequestToolSchemas(params,compat);let limitedTools=limitGitHubCopilotTools(model.provider,params.tools,params.tool_choice);limitedTools.omittedCount>0&&(params={...params,tools:limitedTools.tools},recordGitHubCopilotToolLimit(output,limitedTools.omittedCount));let requestOptions={...options?.signal?{signal:options.signal}:{},...options?.timeoutMs!==void 0?{timeout:options.timeoutMs}:{},maxRetries:0},createChatCompletion=client.chat.completions.create.bind(client.chat.completions),createStream=async body=>{let{data,response}=await awaitProviderTransport(()=>createChatCompletion(body,requestOptions).withResponse(),openAICompatibleProviderDiagnosticFromError);return{data:iterateProviderTransport(data,openAICompatibleProviderDiagnosticFromError),response}},createRequest=async()=>{let sent=await sendWithForcedToolChoiceFallback({target:model,params,acceptsForcedToolChoice:compat.supportsForcedToolChoice!==!1,isForced:isForcedOpenAICompletionsToolChoice,send:async sentParams=>{let created=await createStream(sentParams);return isForcedOpenAICompletionsToolChoice(sentParams.tool_choice)?{...created,data:await primeStreamUntilContent(created.data,chatChunkHasContent)}:created}});return params=sent.params,sent.result},{stream:openaiStream}=await retryProviderStreamRequest(async()=>{let{data,response}=await createRequest();return await options?.onResponse?.({status:response.status,headers:headersToRecord(response.headers)},model),{stream:data,metadata:response}},{maxRetries:options?.maxRetries,maxRetryDelayMs:options?.maxRetryDelayMs,signal:options?.signal});stream2.push({type:"start",partial:output});let textBlock=null,thinkingBlock=null,activeBlock=null,deferMixedEvents=!1,hasFinishReason=!1,deferredTextDeltas=[],deferredThinkingDeltas=[],deferredToolCallDeltas=new Map,toolCallBlocksByIndex=new Map,toolCallBlocksById=new Map,blocks=output.content,getContentIndex=block=>blocks.indexOf(block),getCustomToolCallInput=block=>{let property=block.customInput?.property;if(property===void 0)return"";let value=block.arguments[property];return typeof value=="string"?value:""},appendCustomToolCallInput=(block,nextInput,close)=>{let customInput=block.customInput;if(!customInput)return;let delta=appendGrammarToolInputJsonDelta(customInput.jsonBuffer,customInput.property,nextInput,close);return block.arguments={[customInput.property]:nextInput},delta},finishBlock=block=>{let contentIndex=getContentIndex(block);if(contentIndex!==-1){if(block.type==="text")stream2.push({type:"text_end",contentIndex,content:block.text,partial:output});else if(block.type==="thinking")applyStreamedReasoningDetails(block),stream2.push({type:"thinking_end",contentIndex,content:block.thinking,partial:output});else if(block.type==="toolCall"){if(block.customInput){let delta=appendCustomToolCallInput(block,getCustomToolCallInput(block),!0);delta!==void 0&&stream2.push({type:"toolcall_delta",contentIndex,delta,partial:output})}else block.arguments=parseStreamingJson(block.partialArgs);delete block.partialArgs,delete block.customInput,delete block.streamIndex,stream2.push({type:"toolcall_end",contentIndex,toolCall:block,partial:output})}}},finishActiveBlock=()=>{activeBlock&&(finishBlock(activeBlock),activeBlock=null)},ensureTextBlock=()=>(textBlock||(deferMixedEvents||(finishActiveBlock(),thinkingBlock=null),textBlock={type:"text",text:""},blocks.push(textBlock),deferMixedEvents||(activeBlock=textBlock,stream2.push({type:"text_start",contentIndex:getContentIndex(textBlock),partial:output}))),textBlock),ensureThinkingBlock=thinkingSignature=>(thinkingBlock||(deferMixedEvents||(finishActiveBlock(),textBlock=null),thinkingBlock={type:"thinking",thinking:"",thinkingSignature},blocks.push(thinkingBlock),deferMixedEvents||(activeBlock=thinkingBlock,stream2.push({type:"thinking_start",contentIndex:getContentIndex(thinkingBlock),partial:output}))),thinkingBlock),ensureToolCallBlock=toolCall=>{let streamIndex=typeof toolCall.index=="number"?toolCall.index:void 0,name=toolCall.function?.name??toolCall.custom?.name??"",block=streamIndex!==void 0?toolCallBlocksByIndex.get(streamIndex):void 0;if(!block&&toolCall.id&&(block=toolCallBlocksById.get(toolCall.id)),!block){deferMixedEvents||(finishActiveBlock(),textBlock=null,thinkingBlock=null);let customInputProperty=toolCall.custom&&!toolCall.function?grammarToolInputProperties.get(name)??"input":void 0,hasCustomInput=customInputProperty!==void 0;block={type:"toolCall",id:toolCall.id||"",name,arguments:hasCustomInput?{[customInputProperty]:""}:{},partialArgs:hasCustomInput?void 0:"",customInput:hasCustomInput?{property:customInputProperty,jsonBuffer:{input:"",started:!1,closed:!1}}:void 0,streamIndex},streamIndex!==void 0&&toolCallBlocksByIndex.set(streamIndex,block),toolCall.id&&toolCallBlocksById.set(toolCall.id,block),blocks.push(block),deferMixedEvents||(activeBlock=block,stream2.push({type:"toolcall_start",contentIndex:getContentIndex(block),partial:output}))}if(streamIndex!==void 0&&block.streamIndex===void 0&&(block.streamIndex=streamIndex,toolCallBlocksByIndex.set(streamIndex,block)),toolCall.id&&toolCallBlocksById.set(toolCall.id,block),!block.name&&name&&(block.name=name),toolCall.custom&&!toolCall.function&&!block.customInput){let customInputProperty=grammarToolInputProperties.get(block.name)??"input";block.arguments={[customInputProperty]:""},block.customInput={property:customInputProperty,jsonBuffer:{input:"",started:!1,closed:!1}},delete block.partialArgs}return block},flushDeferredBlocks=()=>{for(let block of blocks){let contentIndex=getContentIndex(block);if(block.type==="text"){stream2.push({type:"text_start",contentIndex,partial:output},{offset:0});for(let delta of deferredTextDeltas)stream2.push({type:"text_delta",contentIndex,delta,partial:output})}else if(block.type==="thinking"){stream2.push({type:"thinking_start",contentIndex,partial:output},{offset:0});for(let delta of deferredThinkingDeltas)stream2.push({type:"thinking_delta",contentIndex,delta,partial:output})}else{let rawArgumentPrefix=(deferredToolCallDeltas.get(block)??[]).join("");stream2.push({type:"toolcall_start",contentIndex,partial:output},{rawArgumentPrefix,parsedThrough:rawArgumentPrefix.length,offset:0});for(let delta of deferredToolCallDeltas.get(block)??[])stream2.push({type:"toolcall_delta",contentIndex,delta,partial:output})}finishBlock(block)}};for await(let chunk of openaiStream){if(await options?.onProviderStreamEvent?.(chunk,model),!chunk||typeof chunk!="object")continue;output.responseId||=chunk.id,typeof chunk.model=="string"&&chunk.model.length>0&&chunk.model!==model.id&&(output.responseModel||=chunk.model),chunk.usage&&(output.usage=parseChunkUsage(chunk.usage,model));let choice=Array.isArray(chunk.choices)?chunk.choices[0]:void 0;if(!choice)continue;let choiceUsage=choice.usage;if(!chunk.usage&&choiceUsage&&(output.usage=parseChunkUsage(choiceUsage,model)),choice.finish_reason){output.rawStopReason=choice.finish_reason;let finishReasonResult=mapStopReason(choice.finish_reason);output.stopReason=finishReasonResult.stopReason,finishReasonResult.errorMessage&&(output.errorMessage=finishReasonResult.errorMessage),hasFinishReason=!0}if(choice.delta){let contentDelta=typeof choice.delta.content=="string"&&choice.delta.content.length>0?choice.delta.content:null,reasoningFields=["reasoning_content","reasoning","reasoning_text"],deltaFields=choice.delta,foundReasoningField=null;for(let field of reasoningFields){let value=deltaFields[field];if(typeof value=="string"&&value.length>0){foundReasoningField=field;break}}if(blocks.length===0&&contentDelta&&foundReasoningField&&(deferMixedEvents=!0),contentDelta){let block=ensureTextBlock();block.text+=contentDelta,deferMixedEvents?deferredTextDeltas.push(contentDelta):stream2.push({type:"text_delta",contentIndex:getContentIndex(block),delta:contentDelta,partial:output})}if(foundReasoningField){let delta=deltaFields[foundReasoningField];if(typeof delta=="string"&&delta.length>0){let thinkingSignature=model.provider==="opencode-go"&&foundReasoningField==="reasoning"?"reasoning_content":foundReasoningField,block=ensureThinkingBlock(thinkingSignature);block.thinking+=delta,deferMixedEvents?deferredThinkingDeltas.push(delta):stream2.push({type:"thinking_delta",contentIndex:getContentIndex(block),delta,partial:output})}}if(choice?.delta?.tool_calls)for(let toolCall of choice.delta.tool_calls){let block=ensureToolCallBlock(toolCall);!block.id&&toolCall.id&&(block.id=toolCall.id,toolCallBlocksById.set(toolCall.id,block));let name=toolCall.function?.name??toolCall.custom?.name;!block.name&&name&&(block.name=name);let delta="";if(toolCall.function?.arguments)delta=toolCall.function.arguments,block.partialArgs=(block.partialArgs??"")+toolCall.function.arguments,block.arguments=parseStreamingJson(block.partialArgs);else if(toolCall.custom?.input){let nextInput=getCustomToolCallInput(block)+toolCall.custom.input;delta=appendCustomToolCallInput(block,nextInput,!1)??""}if(deferMixedEvents){let deltas=deferredToolCallDeltas.get(block)??[];deltas.push(delta),deferredToolCallDeltas.set(block,deltas)}else stream2.push({type:"toolcall_delta",contentIndex:getContentIndex(block),delta,partial:output})}let reasoningDetails=choice.delta.reasoning_details;if(Array.isArray(reasoningDetails))for(let detail of reasoningDetails){if(!isOpenAIReasoningDetail(detail))continue;let block=ensureThinkingBlock(""),preservedDetails=parseOpenAIReasoningDetails(block.thinkingSignature)??[];appendOpenAIReasoningDetail(preservedDetails,detail),block.thinkingSignature=JSON.stringify(preservedDetails)}}}if(deferMixedEvents?flushDeferredBlocks():finishActiveBlock(),options?.signal?.aborted)throw new Error("Request was aborted");if(output.stopReason==="aborted")throw new Error("Request was aborted");if(!hasFinishReason&&!compat.supportsFinishReason&&(output.stopReason=output.content.some(block=>block.type==="toolCall")?"toolUse":"stop"),output.stopReason==="error")throw new Error(output.errorMessage||"Provider returned an error stop reason");if(compat.supportsFinishReason&&!hasFinishReason||output.stopReason==="pending")throw new Error("Stream ended without finish_reason");stream2.push({type:"done",reason:output.stopReason,message:output}),stream2.end()}catch(error){for(let block of output.content)block.type==="thinking"&&applyStreamedReasoningDetails(block),delete block.index,delete block.partialArgs,delete block.customInput,delete block.streamIndex;output.stopReason=options?.signal?.aborted?"aborted":"error";let providerDiagnostic=output.stopReason==="error"?readProviderDiagnostic(error):void 0;providerDiagnostic!==void 0&&(output.providerDiagnostic=providerDiagnostic),output.errorMessage=withGitHubCopilotFailureNote(formatGitHubCopilotToolLimitError(output,formatProviderError(normalizeProviderError(error))),model.provider,error);let rawMetadata=getOpenRouterRawMetadata(error);rawMetadata&&!output.errorMessage.includes(String(rawMetadata))&&(output.errorMessage+=`
2
+ import{resolveOpenAIClientAuth}from"./chunk-GFCKDAH5.js";import{OpenAI}from"./chunk-CD2HJK4C.js";import{formatGitHubCopilotToolLimitError,limitGitHubCopilotTools,recordGitHubCopilotToolLimit,withGitHubCopilotFailureNote}from"./chunk-FQZZGSYH.js";import{getPiUserAgent}from"./chunk-QTG7MY2X.js";import{awaitProviderTransport,iterateProviderTransport,openAICompatibleProviderDiagnosticFromError}from"./chunk-7565XQAU.js";import{OPENAI_COMPLETIONS_RESERVED_BODY_KEYS,applyExtraBody,buildBaseOptions,clampMaxForOpenAI,clampThinkingBudgetToAnswerRoom,thinkingBudgetForLevel}from"./chunk-2XBKE2BZ.js";import{retryProviderStreamRequest}from"./chunk-GIT63LXN.js";import{clampOpenAIPromptCacheKey}from"./chunk-LPHUMR6R.js";import{normalizeToolParametersForMoonshot,normalizeToolParametersForOpenAICompat}from"./chunk-IYL5E4QQ.js";import{primeStreamUntilContent,sendWithForcedToolChoiceFallback}from"./chunk-OEFCY46F.js";import{buildCopilotDynamicHeaders,hasCopilotVisionInput}from"./chunk-KRNXUTZJ.js";import{formatProviderError,normalizeProviderError}from"./chunk-AC72EWI5.js";import"./chunk-RQFD6LG2.js";import"./chunk-RFB5CBW7.js";import{reportedCount}from"./chunk-GVSBCJFI.js";import{getOpenAICompletionsCompat}from"./chunk-32R442XT.js";import{readProviderDiagnostic}from"./chunk-MOH5HOHX.js";import{appendGrammarToolInputJsonDelta,createGrammarToolInputProperties,getGrammarToolInput,getJsonSchemaToolParameters,resolveGrammarConstrainedSampling,resolveJsonSchemaStrictSampling,shortHash,transformMessages}from"./chunk-ED7VJGL4.js";import{sanitizeSurrogates}from"./chunk-WDTJ6JKE.js";import{getProviderEnvValue}from"./chunk-5ROMKDLK.js";import{parseStreamingJson}from"./chunk-3W47LTXQ.js";import{calculateCost,clampThinkingLevel,getCurrentTools,getDeclaredTools,getSystemMessageText,inferOpenAIThinkingLevelMap,renderSystemMessageUpdate,resolveTranscript,resolveTranscriptTools,supportsMax,supportsXhigh}from"./chunk-TBARMJ75.js";import"./chunk-3SASTB6Y.js";import{AssistantMessageEventStream}from"./chunk-5CSZPC55.js";import{headersToRecord}from"./chunk-PJ34QVL5.js";import"./chunk-IKOFCODM.js";var KIMI_K3_THINKING_LEVEL_MAP={off:null,minimal:null,low:"low",medium:null,high:"high",xhigh:null,max:"max"},DEEPSEEK_THINKING_LEVEL_MAP={minimal:"high",low:"high",medium:"high",high:"high",xhigh:"max",max:"max"},OPENROUTER_DEEPSEEK_THINKING_LEVEL_MAP={minimal:"high",low:"high",medium:"high",high:"high",xhigh:"high",max:"high"},MIMO_THINKING_LEVEL_MAP={minimal:"low",low:"low",medium:"medium",high:"high",xhigh:"high",max:null},OLLAMA_THINKING_LEVEL_MAP={off:"none",minimal:null,low:"low",medium:"medium",high:"high",xhigh:null,max:"high"};function getThinkingLevelMap(model,compat){let inferred=inferOpenAIThinkingLevelMap(model);if(inferred!==void 0)return inferred;let id=model.id.toLowerCase(),isKimiK3=id==="k3"||id.startsWith("k3-")||/(?:^|[/:-])kimi-k3(?:$|[/.:_-])/.test(id),isDeepSeek=id.includes("deepseek"),isMiMo=/\bmimo\b/.test(id),isGlm5x=/(?:^|[/:-])glm-5\.[23](?:$|[/.:_-])/.test(id);if(model.provider==="ollama")return OLLAMA_THINKING_LEVEL_MAP;if(isKimiK3)return KIMI_K3_THINKING_LEVEL_MAP;if(compat.thinkingFormat==="openrouter"&&isDeepSeek)return OPENROUTER_DEEPSEEK_THINKING_LEVEL_MAP;if((compat.thinkingFormat==="openai"||compat.thinkingFormat==="openrouter")&&isMiMo)return MIMO_THINKING_LEVEL_MAP;if(isDeepSeek)return DEEPSEEK_THINKING_LEVEL_MAP;if(isGlm5x)return compat.thinkingFormat==="zai"?DEEPSEEK_THINKING_LEVEL_MAP:compat.thinkingFormat==="openrouter"?{xhigh:"xhigh"}:{max:"max"}}function resolveReasoningEffort(thinkingLevelMap,effort){let mapped=thinkingLevelMap?.[effort];return mapped===void 0?effort:typeof mapped=="string"?mapped:void 0}function hasToolHistory(messages){for(let msg of messages)if(msg.role==="toolResult"||msg.role==="assistant"&&msg.content.some(block=>block.type==="toolCall"))return!0;return!1}function resolveKimiDeferredTools(messages,compat){let deferred=new Map;if(compat.deferredToolsMode!=="kimi")return deferred;let names=new Set;for(let message of messages)if(message.role==="toolResult")for(let name of message.addedToolNames??[])names.add(name);for(let tool of getCurrentTools(messages))names.has(tool.name)&&deferred.set(tool.name,tool);return deferred}function isTextContentBlock(block){return block.type==="text"}function isThinkingContentBlock(block){return block.type==="thinking"}function isToolCallBlock(block){return block.type==="toolCall"}function isImageContentBlock(block){return block.type==="image"}function isRecord(value){return typeof value=="object"&&value!==null}function getOpenRouterRawMetadata(error){if(!isRecord(error)||!isRecord(error.error)||!isRecord(error.error.metadata))return;let rawMetadata=error.error.metadata.raw;return typeof rawMetadata=="string"?rawMetadata:void 0}function isForcedOpenAICompletionsToolChoice(toolChoice){return toolChoice!==void 0&&toolChoice!=="auto"&&toolChoice!=="none"}function chatChunkHasContent(chunk){return!isRecord(chunk)||!Array.isArray(chunk.choices)?!1:chunk.choices.some(choice=>{if(!isRecord(choice))return!1;if(typeof choice.finish_reason=="string"&&choice.finish_reason.length>0)return!0;let delta=choice.delta;return isRecord(delta)?Array.isArray(delta.tool_calls)&&delta.tool_calls.length>0?!0:["content","reasoning_content","reasoning","reasoning_text"].some(field=>typeof delta[field]=="string"&&delta[field].length>0):!1})}function isReasoningDetailObject(detail){return typeof detail=="object"&&detail!==null&&!Array.isArray(detail)}function hasValidCommonReasoningDetailFields(candidate){return(candidate.id===void 0||candidate.id===null||typeof candidate.id=="string")&&(candidate.format===void 0||typeof candidate.format=="string")&&(candidate.index===void 0||typeof candidate.index=="number")}function isOpenAIReasoningDetail(detail){if(!isReasoningDetailObject(detail)||!hasValidCommonReasoningDetailFields(detail))return!1;switch(detail.type){case"reasoning.summary":return typeof detail.summary=="string";case"reasoning.encrypted":return typeof detail.data=="string";case"reasoning.text":return typeof detail.text=="string"&&(detail.signature===void 0||detail.signature===null||typeof detail.signature=="string");default:return!1}}function parseOpenAIReasoningDetails(signature){if(signature)try{let parsed=JSON.parse(signature);return Array.isArray(parsed)&&parsed.length>0&&parsed.every(isOpenAIReasoningDetail)?parsed:void 0}catch{return}}function parseLegacyEncryptedReasoningDetail(signature){if(signature)try{let parsed=JSON.parse(signature);return isOpenAIReasoningDetail(parsed)&&parsed.type==="reasoning.encrypted"&&typeof parsed.id=="string"&&parsed.id.length>0&&parsed.data.length>0?parsed:void 0}catch{return}}function fillMissingCommonReasoningDetailFields(target,source){target.id??=source.id,target.format||=source.format,target.index??=source.index}function appendOpenAIReasoningDetail(details,detail){let lastDetail=details[details.length-1];if(detail.type==="reasoning.text"&&lastDetail?.type==="reasoning.text"){lastDetail.text+=detail.text,lastDetail.signature||=detail.signature,fillMissingCommonReasoningDetailFields(lastDetail,detail);return}if(detail.type==="reasoning.summary"&&lastDetail?.type==="reasoning.summary"){lastDetail.summary+=detail.summary,fillMissingCommonReasoningDetailFields(lastDetail,detail);return}details.push({...detail})}function toReplayableReasoningDetail(detail){let common={};switch(detail.id!==void 0&&(common.id=detail.id),detail.format!==void 0&&(common.format=detail.format),detail.type){case"reasoning.text":{let replayable={...common,type:"reasoning.text",text:detail.text};return detail.signature!==void 0&&(replayable.signature=detail.signature),replayable}case"reasoning.summary":return{...common,type:"reasoning.summary",summary:detail.summary};case"reasoning.encrypted":return{...common,type:"reasoning.encrypted",data:detail.data}}}function toReplayableReasoningDetails(details){return details.map(toReplayableReasoningDetail)}var OPENAI_COMPLETIONS_REASONING_FIELDS=["reasoning","reasoning_content","reasoning_text"];function isOpenAICompletionsReasoningField(value){return OPENAI_COMPLETIONS_REASONING_FIELDS.some(field=>field===value)}function resolveCacheRetention(cacheRetention,env){return cacheRetention||(getProviderEnvValue("PI_CACHE_RETENTION",env)==="long"?"long":"short")}var stream=(model,context,options)=>{let stream2=new AssistantMessageEventStream({captureBlocks:!0}),normalizedContext=resolveTranscript(context,getOpenAICompletionsCompat(model).supportsMidConvoSystemMessages);return(async()=>{let output={role:"assistant",content:[],api:model.api,provider:model.provider,model:model.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"pending",timestamp:Date.now()},streamedReasoningDetails,applyStreamedReasoningDetails=block=>{streamedReasoningDetails!==void 0&&(block.thinkingSignature=JSON.stringify(streamedReasoningDetails))};try{let clientAuth=resolveOpenAIClientAuth(model.provider,options?.apiKey,options?.headers),compat=getOpenAICompletionsCompat(model),grammarToolInputProperties=createGrammarToolInputProperties(getDeclaredTools(normalizedContext.messages),compat.supportsOpenAIGrammarTools),cacheRetention=resolveCacheRetention(options?.cacheRetention??model.cacheRetention,options?.env),cacheSessionId=cacheRetention==="none"?void 0:options?.sessionId,client=createClient(model,normalizedContext,clientAuth.apiKey,clientAuth.headers,options?.fetch,cacheSessionId,compat),params=buildParams(model,normalizedContext,options,compat,cacheRetention,grammarToolInputProperties),nextParams=await options?.onPayload?.(params,model);nextParams!==void 0&&(params=nextParams),params=normalizeRequestToolSchemas(params,compat);let limitedTools=limitGitHubCopilotTools(model.provider,params.tools,params.tool_choice);limitedTools.omittedCount>0&&(params={...params,tools:limitedTools.tools},recordGitHubCopilotToolLimit(output,limitedTools.omittedCount));let requestOptions={...options?.signal?{signal:options.signal}:{},...options?.timeoutMs!==void 0?{timeout:options.timeoutMs}:{},maxRetries:0},createChatCompletion=client.chat.completions.create.bind(client.chat.completions),createStream=async body=>{let{data,response}=await awaitProviderTransport(()=>createChatCompletion(body,requestOptions).withResponse(),openAICompatibleProviderDiagnosticFromError);return{data:iterateProviderTransport(data,openAICompatibleProviderDiagnosticFromError),response}},createRequest=async()=>{let sent=await sendWithForcedToolChoiceFallback({target:model,params,acceptsForcedToolChoice:compat.supportsForcedToolChoice!==!1,isForced:isForcedOpenAICompletionsToolChoice,send:async sentParams=>{let created=await createStream(sentParams);return isForcedOpenAICompletionsToolChoice(sentParams.tool_choice)?{...created,data:await primeStreamUntilContent(created.data,chatChunkHasContent)}:created}});return params=sent.params,sent.result},{stream:openaiStream}=await retryProviderStreamRequest(async()=>{let{data,response}=await createRequest();return await options?.onResponse?.({status:response.status,headers:headersToRecord(response.headers)},model),{stream:data,metadata:response}},{maxRetries:options?.maxRetries,maxRetryDelayMs:options?.maxRetryDelayMs,signal:options?.signal});stream2.push({type:"start",partial:output});let textBlock=null,thinkingBlock=null,activeBlock=null,deferMixedEvents=!1,hasFinishReason=!1,deferredTextDeltas=[],deferredThinkingDeltas=[],deferredToolCallDeltas=new Map,toolCallBlocksByIndex=new Map,toolCallBlocksById=new Map,blocks=output.content,getContentIndex=block=>blocks.indexOf(block),getCustomToolCallInput=block=>{let property=block.customInput?.property;if(property===void 0)return"";let value=block.arguments[property];return typeof value=="string"?value:""},appendCustomToolCallInput=(block,nextInput,close)=>{let customInput=block.customInput;if(!customInput)return;let delta=appendGrammarToolInputJsonDelta(customInput.jsonBuffer,customInput.property,nextInput,close);return block.arguments={[customInput.property]:nextInput},delta},finishBlock=block=>{let contentIndex=getContentIndex(block);if(contentIndex!==-1){if(block.type==="text")stream2.push({type:"text_end",contentIndex,content:block.text,partial:output});else if(block.type==="thinking")applyStreamedReasoningDetails(block),stream2.push({type:"thinking_end",contentIndex,content:block.thinking,partial:output});else if(block.type==="toolCall"){if(block.customInput){let delta=appendCustomToolCallInput(block,getCustomToolCallInput(block),!0);delta!==void 0&&stream2.push({type:"toolcall_delta",contentIndex,delta,partial:output})}else block.arguments=parseStreamingJson(block.partialArgs);delete block.partialArgs,delete block.customInput,delete block.streamIndex,stream2.push({type:"toolcall_end",contentIndex,toolCall:block,partial:output})}}},finishActiveBlock=()=>{activeBlock&&(finishBlock(activeBlock),activeBlock=null)},ensureTextBlock=()=>(textBlock||(deferMixedEvents||(finishActiveBlock(),thinkingBlock=null),textBlock={type:"text",text:""},blocks.push(textBlock),deferMixedEvents||(activeBlock=textBlock,stream2.push({type:"text_start",contentIndex:getContentIndex(textBlock),partial:output}))),textBlock),ensureThinkingBlock=thinkingSignature=>(thinkingBlock||(deferMixedEvents||(finishActiveBlock(),textBlock=null),thinkingBlock={type:"thinking",thinking:"",thinkingSignature},blocks.push(thinkingBlock),deferMixedEvents||(activeBlock=thinkingBlock,stream2.push({type:"thinking_start",contentIndex:getContentIndex(thinkingBlock),partial:output}))),thinkingBlock),ensureToolCallBlock=toolCall=>{let streamIndex=typeof toolCall.index=="number"?toolCall.index:void 0,name=toolCall.function?.name??toolCall.custom?.name??"",block=streamIndex!==void 0?toolCallBlocksByIndex.get(streamIndex):void 0;if(!block&&toolCall.id&&(block=toolCallBlocksById.get(toolCall.id)),!block){deferMixedEvents||(finishActiveBlock(),textBlock=null,thinkingBlock=null);let customInputProperty=toolCall.custom&&!toolCall.function?grammarToolInputProperties.get(name)??"input":void 0,hasCustomInput=customInputProperty!==void 0;block={type:"toolCall",id:toolCall.id||"",name,arguments:hasCustomInput?{[customInputProperty]:""}:{},partialArgs:hasCustomInput?void 0:"",customInput:hasCustomInput?{property:customInputProperty,jsonBuffer:{input:"",started:!1,closed:!1}}:void 0,streamIndex},streamIndex!==void 0&&toolCallBlocksByIndex.set(streamIndex,block),toolCall.id&&toolCallBlocksById.set(toolCall.id,block),blocks.push(block),deferMixedEvents||(activeBlock=block,stream2.push({type:"toolcall_start",contentIndex:getContentIndex(block),partial:output}))}if(streamIndex!==void 0&&block.streamIndex===void 0&&(block.streamIndex=streamIndex,toolCallBlocksByIndex.set(streamIndex,block)),toolCall.id&&toolCallBlocksById.set(toolCall.id,block),!block.name&&name&&(block.name=name),toolCall.custom&&!toolCall.function&&!block.customInput){let customInputProperty=grammarToolInputProperties.get(block.name)??"input";block.arguments={[customInputProperty]:""},block.customInput={property:customInputProperty,jsonBuffer:{input:"",started:!1,closed:!1}},delete block.partialArgs}return block},flushDeferredBlocks=()=>{for(let block of blocks){let contentIndex=getContentIndex(block);if(block.type==="text"){stream2.push({type:"text_start",contentIndex,partial:output},{offset:0});for(let delta of deferredTextDeltas)stream2.push({type:"text_delta",contentIndex,delta,partial:output})}else if(block.type==="thinking"){stream2.push({type:"thinking_start",contentIndex,partial:output},{offset:0});for(let delta of deferredThinkingDeltas)stream2.push({type:"thinking_delta",contentIndex,delta,partial:output})}else{let rawArgumentPrefix=(deferredToolCallDeltas.get(block)??[]).join("");stream2.push({type:"toolcall_start",contentIndex,partial:output},{rawArgumentPrefix,parsedThrough:rawArgumentPrefix.length,offset:0});for(let delta of deferredToolCallDeltas.get(block)??[])stream2.push({type:"toolcall_delta",contentIndex,delta,partial:output})}finishBlock(block)}};for await(let chunk of openaiStream){if(await options?.onProviderStreamEvent?.(chunk,model),!chunk||typeof chunk!="object")continue;output.responseId||=chunk.id,typeof chunk.model=="string"&&chunk.model.length>0&&chunk.model!==model.id&&(output.responseModel||=chunk.model),chunk.usage&&(output.usage=parseChunkUsage(chunk.usage,model));let choice=Array.isArray(chunk.choices)?chunk.choices[0]:void 0;if(!choice)continue;let choiceUsage=choice.usage;if(!chunk.usage&&choiceUsage&&(output.usage=parseChunkUsage(choiceUsage,model)),choice.finish_reason){output.rawStopReason=choice.finish_reason;let finishReasonResult=mapStopReason(choice.finish_reason);output.stopReason=finishReasonResult.stopReason,finishReasonResult.errorMessage&&(output.errorMessage=finishReasonResult.errorMessage),hasFinishReason=!0}if(choice.delta){let contentDelta=typeof choice.delta.content=="string"&&choice.delta.content.length>0?choice.delta.content:null,reasoningFields=["reasoning_content","reasoning","reasoning_text"],deltaFields=choice.delta,foundReasoningField=null;for(let field of reasoningFields){let value=deltaFields[field];if(typeof value=="string"&&value.length>0){foundReasoningField=field;break}}if(blocks.length===0&&contentDelta&&foundReasoningField&&(deferMixedEvents=!0),contentDelta){let block=ensureTextBlock();block.text+=contentDelta,deferMixedEvents?deferredTextDeltas.push(contentDelta):stream2.push({type:"text_delta",contentIndex:getContentIndex(block),delta:contentDelta,partial:output})}if(foundReasoningField){let delta=deltaFields[foundReasoningField];if(typeof delta=="string"&&delta.length>0){let thinkingSignature=model.provider==="opencode-go"&&foundReasoningField==="reasoning"?"reasoning_content":foundReasoningField,block=ensureThinkingBlock(thinkingSignature);block.thinking+=delta,deferMixedEvents?deferredThinkingDeltas.push(delta):stream2.push({type:"thinking_delta",contentIndex:getContentIndex(block),delta,partial:output})}}if(choice?.delta?.tool_calls)for(let toolCall of choice.delta.tool_calls){let block=ensureToolCallBlock(toolCall);!block.id&&toolCall.id&&(block.id=toolCall.id,toolCallBlocksById.set(toolCall.id,block));let name=toolCall.function?.name??toolCall.custom?.name;!block.name&&name&&(block.name=name);let delta="";if(toolCall.function?.arguments)delta=toolCall.function.arguments,block.partialArgs=(block.partialArgs??"")+toolCall.function.arguments,block.arguments=parseStreamingJson(block.partialArgs);else if(toolCall.custom?.input){let nextInput=getCustomToolCallInput(block)+toolCall.custom.input;delta=appendCustomToolCallInput(block,nextInput,!1)??""}if(deferMixedEvents){let deltas=deferredToolCallDeltas.get(block)??[];deltas.push(delta),deferredToolCallDeltas.set(block,deltas)}else stream2.push({type:"toolcall_delta",contentIndex:getContentIndex(block),delta,partial:output})}let reasoningDetails=choice.delta.reasoning_details;if(Array.isArray(reasoningDetails))for(let detail of reasoningDetails){if(!isOpenAIReasoningDetail(detail))continue;let block=ensureThinkingBlock(""),preservedDetails=parseOpenAIReasoningDetails(block.thinkingSignature)??[];appendOpenAIReasoningDetail(preservedDetails,detail),block.thinkingSignature=JSON.stringify(preservedDetails)}}}if(deferMixedEvents?flushDeferredBlocks():finishActiveBlock(),options?.signal?.aborted)throw new Error("Request was aborted");if(output.stopReason==="aborted")throw new Error("Request was aborted");if(!hasFinishReason&&!compat.supportsFinishReason&&(output.stopReason=output.content.some(block=>block.type==="toolCall")?"toolUse":"stop"),output.stopReason==="error")throw new Error(output.errorMessage||"Provider returned an error stop reason");if(compat.supportsFinishReason&&!hasFinishReason||output.stopReason==="pending")throw new Error("Stream ended without finish_reason");stream2.push({type:"done",reason:output.stopReason,message:output}),stream2.end()}catch(error){for(let block of output.content)block.type==="thinking"&&applyStreamedReasoningDetails(block),delete block.index,delete block.partialArgs,delete block.customInput,delete block.streamIndex;output.stopReason=options?.signal?.aborted?"aborted":"error";let providerDiagnostic=output.stopReason==="error"?readProviderDiagnostic(error):void 0;providerDiagnostic!==void 0&&(output.providerDiagnostic=providerDiagnostic),output.errorMessage=withGitHubCopilotFailureNote(formatGitHubCopilotToolLimitError(output,formatProviderError(normalizeProviderError(error))),model.provider,error);let rawMetadata=getOpenRouterRawMetadata(error);rawMetadata&&!output.errorMessage.includes(String(rawMetadata))&&(output.errorMessage+=`
3
3
  ${rawMetadata}`),stream2.push({type:"error",reason:output.stopReason,error:output}),stream2.end()}})(),stream2},streamSimple=(model,context,options)=>{resolveOpenAIClientAuth(model.provider,options?.apiKey,options?.headers);let base={...buildBaseOptions(model,context,options,options?.apiKey),toolChoice:options?.toolChoice??options?.toolChoice},compat=getOpenAICompletionsCompat(model),thinkingLevelMap=getThinkingLevelMap(model,compat),thinkingModel=thinkingLevelMap===model.thinkingLevelMap?model:{...model,thinkingLevelMap},clampedReasoning=options?.reasoning?clampThinkingLevel(thinkingModel,options.reasoning):model.id.includes("gpt-6-astra")?"off":void 0,hasMappedOff=typeof thinkingLevelMap?.off=="string",normalizedReasoning=clampedReasoning==="off"&&model.id.includes("gpt-6-astra")&&!hasMappedOff?"low":clampedReasoning,reasoningEffort=normalizedReasoning==="off"?void 0:normalizedReasoning==="max"&&supportsMax(thinkingModel)?"max":clampMaxForOpenAI(normalizedReasoning,supportsXhigh(thinkingModel));return stream(model,context,{...base,reasoningEffort,thinkingBudgets:options?.thinkingBudgets})};function createClient(model,context,apiKey,optionsHeaders,fetch,sessionId,compat=getOpenAICompletionsCompat(model)){let headers={"User-Agent":getPiUserAgent(),...model.headers};if(model.provider==="github-copilot"){let hasImages=hasCopilotVisionInput(context.messages),copilotHeaders=buildCopilotDynamicHeaders({messages:context.messages,hasImages});Object.assign(headers,copilotHeaders)}return sessionId&&compat.sendSessionAffinityHeaders&&(compat.sessionAffinityFormat==="openrouter"?headers["x-session-id"]=sessionId:(compat.sessionAffinityFormat==="openai"&&(headers.session_id=sessionId),headers["x-client-request-id"]=sessionId,headers["x-session-affinity"]=sessionId)),optionsHeaders&&Object.assign(headers,optionsHeaders),new OpenAI({apiKey,baseURL:model.baseUrl,dangerouslyAllowBrowser:!0,fetch,defaultHeaders:headers})}function buildParams(model,context,options,compat=getOpenAICompletionsCompat(model),cacheRetention=resolveCacheRetention(options?.cacheRetention??model.cacheRetention,options?.env),grammarToolInputProperties=createGrammarToolInputProperties(getDeclaredTools(context.messages),compat.supportsOpenAIGrammarTools)){let transcriptTools=resolveTranscriptTools(context.messages,compat.supportsMidConvoSystemMessages===!0&&compat.supportsMidConvoToolAdditions===!0),kimiDeferredTools=resolveKimiDeferredTools(context.messages,compat),requestTools=transcriptTools.requestTools.filter(tool=>!kimiDeferredTools.has(tool.name)),messages=convertMessages(model,context,compat,{preserveThinking:options?.reasoningEffort!==void 0,grammarToolInputProperties}),cacheControl=getCompatCacheControl(compat,cacheRetention),thinkingLevelMap=getThinkingLevelMap(model,compat),params={model:model.id,messages,stream:!0,prompt_cache_key:cacheRetention!=="none"&&!(model.baseUrl.includes("api.openai.com")&&model.cost.cacheWrite>0)&&(model.baseUrl.includes("api.openai.com")||cacheRetention==="long"&&compat.supportsLongCacheRetention||compat.supportsPromptCacheKey)?clampOpenAIPromptCacheKey(options?.sessionId):void 0,prompt_cache_retention:cacheRetention==="long"&&compat.supportsLongCacheRetention?"24h":void 0,session_id:compat.sendSessionAffinityHeaders&&compat.sessionAffinityFormat==="openrouter"&&cacheRetention!=="none"?options?.sessionId:void 0};compat.supportsUsageInStreaming!==!1&&(params.stream_options={include_usage:!0}),compat.supportsStore&&(params.store=!1),options?.maxTokens&&(compat.maxTokensField==="max_tokens"?params.max_tokens=options.maxTokens:params.max_completion_tokens=options.maxTokens),options?.temperature!==void 0&&(params.temperature=options.temperature),requestTools.length>0?(params.tools=convertTools(requestTools,compat),compat.zaiToolStream&&(params.tool_stream=!0)):hasToolHistory(context.messages)&&(params.tools=[]),cacheControl&&applyAnthropicCacheControl(messages,params.tools,cacheControl),options?.toolChoice&&(params.tool_choice=options.toolChoice),compat.vllmPriority!==void 0&&(params.priority=compat.vllmPriority);let thinkingTokenBudgetField=resolveThinkingTokenBudgetField(compat),thinkingBudget=resolveClampedThinkingBudget(model,options,params);if(compat.thinkingFormat==="zai"&&model.reasoning){let isGlm53=/(?:^|[/:-])glm-5\.3(?:-(?:flash|highspeed))?(?:$|[/.:_])/.test(model.id.toLowerCase()),zaiParams=params;if(zaiParams.thinking=options?.reasoningEffort||isGlm53?{type:"enabled",clear_thinking:!1}:{type:"disabled"},options?.reasoningEffort&&compat.supportsReasoningEffort){let effort=resolveReasoningEffort(thinkingLevelMap,options.reasoningEffort);effort!==void 0&&(zaiParams.reasoning_effort=effort)}}else if(compat.thinkingFormat==="qwen"&&model.reasoning){if(params.enable_thinking=!!options?.reasoningEffort,options?.reasoningEffort&&compat.supportsReasoningEffort){let effort=resolveReasoningEffort(thinkingLevelMap,options.reasoningEffort);effort!==void 0&&(params.reasoning_effort=effort)}}else if(compat.thinkingFormat==="qwen-chat-template"&&model.reasoning)params.chat_template_kwargs={enable_thinking:!!options?.reasoningEffort,preserve_thinking:!0};else if(compat.thinkingFormat==="chat-template"&&model.reasoning){let chatTemplateKwargs=buildChatTemplateValues(model,options,compat,compat.chatTemplateKwargs,thinkingBudget);chatTemplateKwargs&&(params.chat_template_kwargs=chatTemplateKwargs)}else if(compat.thinkingFormat==="baseten"&&model.reasoning){let basetenParams=params,chatTemplateArgs=buildChatTemplateValues(model,options,compat,compat.chatTemplateArgs??{},thinkingBudget);if(chatTemplateArgs&&(basetenParams.chat_template_args=chatTemplateArgs),compat.supportsReasoningEffort){let requestedEffort=options?.reasoningEffort,mappedEffort=requestedEffort?thinkingLevelMap?.[requestedEffort]:thinkingLevelMap?.off,effort=mappedEffort===void 0?requestedEffort:mappedEffort;typeof effort=="string"&&(basetenParams.reasoning_effort=effort)}}else if(compat.thinkingFormat==="deepseek"&&model.reasoning)if(options?.reasoningEffort){if(params.thinking={type:"enabled"},compat.supportsReasoningEffort){let effort=resolveReasoningEffort(thinkingLevelMap,options.reasoningEffort);effort!==void 0&&(params.reasoning_effort=effort)}}else compat.supportsDisabledThinking!==!1&&thinkingLevelMap?.off!==null&&(params.thinking={type:"disabled"});else if(compat.thinkingFormat==="openrouter"&&model.reasoning){let openRouterParams=params;if(options?.reasoningEffort){let effort=resolveReasoningEffort(thinkingLevelMap,options.reasoningEffort);effort!==void 0&&(openRouterParams.reasoning={effort})}else thinkingLevelMap?.off!==null&&(openRouterParams.reasoning={effort:thinkingLevelMap?.off??"none"})}else if(compat.thinkingFormat==="ant-ling"&&model.reasoning&&options?.reasoningEffort){let effort=thinkingLevelMap?.[options.reasoningEffort];typeof effort=="string"&&(params.reasoning={effort})}else if(compat.thinkingFormat==="together"&&model.reasoning){let togetherParams=params;if(togetherParams.reasoning={enabled:!!options?.reasoningEffort},options?.reasoningEffort&&compat.supportsReasoningEffort){let effort=resolveReasoningEffort(thinkingLevelMap,options.reasoningEffort);effort!==void 0&&(togetherParams.reasoning_effort=effort)}}else if(compat.thinkingFormat==="string-thinking"&&model.reasoning)if(options?.reasoningEffort){let effort=resolveReasoningEffort(thinkingLevelMap,options.reasoningEffort);effort!==void 0&&(params.thinking=effort)}else thinkingLevelMap?.off!==null&&(params.thinking=thinkingLevelMap?.off??"none");else if(options?.reasoningEffort&&model.reasoning&&compat.supportsReasoningEffort){let effort=resolveReasoningEffort(thinkingLevelMap,options.reasoningEffort);effort!==void 0&&(params.reasoning_effort=effort)}else if(!options?.reasoningEffort&&model.reasoning&&compat.supportsReasoningEffort){let offValue=thinkingLevelMap?.off;typeof offValue=="string"&&(params.reasoning_effort=offValue)}if(thinkingTokenBudgetField&&thinkingBudget!==void 0&&Object.assign(params,{[thinkingTokenBudgetField]:thinkingBudget}),model.compat?.openRouterRouting&&(params.provider=model.compat.openRouterRouting),model.compat?.veniceParameters&&(params.venice_parameters=model.compat.veniceParameters),model.compat?.vercelGatewayRouting){let routing=model.compat.vercelGatewayRouting;if(routing.only||routing.order){let gatewayOptions={};routing.only&&(gatewayOptions.only=routing.only),routing.order&&(gatewayOptions.order=routing.order),params.providerOptions={gateway:gatewayOptions}}}return applyExtraBody(params,options?.extraBody,OPENAI_COMPLETIONS_RESERVED_BODY_KEYS),Object.assign(params,model.samplingParams,options?.samplingParams),params}function resolveThinkingTokenBudgetField(compat){if(compat.thinkingTokenBudgetField)return compat.thinkingTokenBudgetField;if(compat.supportsThinkingTokenBudget)return"thinking_token_budget"}function resolveClampedThinkingBudget(model,options,params){if(!options?.reasoningEffort||!model.reasoning)return;let ceiling=params.max_tokens??params.max_completion_tokens??model.maxTokens,budget=clampThinkingBudgetToAnswerRoom(thinkingBudgetForLevel(options.reasoningEffort,options.thinkingBudgets),ceiling);return budget>0?budget:void 0}function buildChatTemplateValues(model,options,compat,values,thinkingBudget){let resolvedValues={};for(let[key,value]of Object.entries(values)){let resolved=resolveChatTemplateKwargValue(model,options,compat,value,thinkingBudget);resolved!==void 0&&(resolvedValues[key]=resolved)}return Object.keys(resolvedValues).length>0?resolvedValues:void 0}function resolveChatTemplateKwargValue(model,options,compat,value,thinkingBudget){if(typeof value!="object"||value===null)return value;let reasoningEffort=options?.reasoningEffort;if(!reasoningEffort&&value.omitWhenOff)return;if(value.$var==="thinking.enabled")return!!reasoningEffort;if(value.$var==="thinking.budget")return thinkingBudget;let thinkingLevelMap=getThinkingLevelMap(model,compat),mappedValue=reasoningEffort?thinkingLevelMap?.[reasoningEffort]:thinkingLevelMap?.off;return mappedValue===void 0?reasoningEffort:typeof mappedValue=="string"?mappedValue:void 0}function getCompatCacheControl(compat,cacheRetention){if(compat.cacheControlFormat!=="anthropic"||cacheRetention==="none")return;let ttl=cacheRetention==="long"&&compat.supportsLongCacheRetention?"1h":void 0;return{type:"ephemeral",...ttl?{ttl}:{}}}function applyAnthropicCacheControl(messages,tools,cacheControl){addCacheControlToSystemPrompt(messages,cacheControl),addCacheControlToLastTool(tools,cacheControl),addCacheControlToLastConversationMessage(messages,cacheControl)}function addCacheControlToSystemPrompt(messages,cacheControl){for(let message of messages)if(message.role==="system"||message.role==="developer"){addCacheControlToInstructionMessage(message,cacheControl);return}}function addCacheControlToLastConversationMessage(messages,cacheControl){for(let i=messages.length-1;i>=0;i--){let message=messages[i];if((message.role==="user"||message.role==="assistant"||message.role==="tool")&&addCacheControlToMessage(message,cacheControl))return}}function addCacheControlToLastTool(tools,cacheControl){if(!tools||tools.length===0)return;let lastTool=tools[tools.length-1];lastTool.cache_control=cacheControl}function addCacheControlToInstructionMessage(message,cacheControl){return addCacheControlToTextContent(message,cacheControl)}function addCacheControlToMessage(message,cacheControl){return message.role==="user"||message.role==="assistant"||message.role==="tool"?addCacheControlToTextContent(message,cacheControl):!1}function addCacheControlToTextContent(message,cacheControl){let content=message.content;if(typeof content=="string")return content.length===0?!1:(message.content=[{type:"text",text:content,cache_control:cacheControl}],!0);if(!Array.isArray(content))return!1;for(let i=content.length-1;i>=0;i--){let part=content[i];if(part?.type==="text"){let textPart=part;return textPart.cache_control=cacheControl,!0}}return!1}function appendUserMessage(params,content,mergeAdjacentUserMessages){let previous=params[params.length-1];if(!mergeAdjacentUserMessages||previous?.role!=="user"){params.push({role:"user",content});return}let previousContent=typeof previous.content=="string"?[{type:"text",text:previous.content}]:previous.content,currentContent=typeof content=="string"?[{type:"text",text:content}]:content;previous.content=[...previousContent,...currentContent]}function convertMessages(model,context,compat,options={}){let normalizedContext=resolveTranscript(context,compat.supportsMidConvoSystemMessages),params=[],normalizeToolCallId=id=>{if(id.includes("|")){let separatorIndex=id.indexOf("|"),callId=id.slice(0,separatorIndex).replace(/[^a-zA-Z0-9_-]/g,"_"),itemId=id.slice(separatorIndex+1).replace(/[^a-zA-Z0-9_-]/g,"_"),combinedId=itemId.length>0?`${callId}_${itemId}`:callId;if(combinedId.length<=40)return combinedId;let hash2=shortHash(id).slice(0,8);return`${callId.slice(0,Math.max(1,40-hash2.length-1))}_${hash2}`}let sanitizedId=id.replace(/[^a-zA-Z0-9_-]/g,"_")||"tool_call";if(sanitizedId===id&&sanitizedId.length<=40)return id;let hash=shortHash(id).slice(0,8);return`${sanitizedId.slice(0,Math.max(1,40-hash.length-1))}_${hash}`},transformedMessages=transformMessages(normalizedContext.messages,model,id=>normalizeToolCallId(id),{preserveThinking:options.preserveThinking,normalizeSameModelToolCallIds:!0}),mergeAdjacentUserMessages=!model.baseUrl.includes("api.openai.com"),transcriptTools=resolveTranscriptTools(normalizedContext.messages,compat.supportsMidConvoSystemMessages===!0&&compat.supportsMidConvoToolAdditions===!0),kimiDeferredTools=resolveKimiDeferredTools(normalizedContext.messages,compat),loadedToolNames=new Set,instructionRole=model.reasoning&&compat.supportsDeveloperRole?"developer":"system",lastRole=null;for(let i=0;i<transformedMessages.length;i++){let msg=transformedMessages[i];if(compat.requiresAssistantAfterToolResult&&lastRole==="toolResult"&&msg.role==="user"&&params.push({role:"assistant",content:"I have processed the tool results."}),msg.role==="system"){let addedTools=i>0&&transcriptTools.anchorsAdditions?(msg.toolsAdded??[]).filter(tool=>!loadedToolNames.has(tool.name)):[];for(let tool of addedTools)loadedToolNames.add(tool.name);if(addedTools.length>0){let kimiToolMessage={role:"system",tools:convertTools(addedTools,compat)};params.push(kimiToolMessage)}let text=i===0?getSystemMessageText(msg):renderSystemMessageUpdate(msg);text.length>0&&params.push({role:instructionRole,content:sanitizeSurrogates(text)})}else if(msg.role==="user")if(typeof msg.content=="string")appendUserMessage(params,sanitizeSurrogates(msg.content),mergeAdjacentUserMessages);else{let content=msg.content.filter(item=>item.type!=="text"||item.text.length>0).map(item=>item.type==="text"?{type:"text",text:sanitizeSurrogates(item.text)}:{type:"image_url",image_url:{url:`data:${item.mimeType};base64,${item.data}`}});if(content.length===0)continue;appendUserMessage(params,content,mergeAdjacentUserMessages)}else if(msg.role==="assistant"){let assistantMsg={role:"assistant",content:compat.requiresAssistantAfterToolResult?"":null},assistantTextParts=msg.content.filter(isTextContentBlock).filter(block=>block.text.trim().length>0).map(block=>({type:"text",text:sanitizeSurrogates(block.text)})),assistantText=assistantTextParts.map(part=>part.text).join(""),thinkingBlocks=msg.content.filter(isThinkingContentBlock),toolCalls=msg.content.filter(isToolCallBlock),signedReasoningDetails=thinkingBlocks.map(block=>parseOpenAIReasoningDetails(block.thinkingSignature)).find(details=>details!==void 0),legacyReasoningDetails=toolCalls.map(toolCall=>parseLegacyEncryptedReasoningDetail(toolCall.thoughtSignature)).filter(detail=>detail!==void 0),preservedReasoningDetails=signedReasoningDetails??(legacyReasoningDetails.length>0?legacyReasoningDetails:void 0),nonEmptyThinkingBlocks=thinkingBlocks.filter(block=>block.thinking.trim().length>0);if(nonEmptyThinkingBlocks.length>0)if(compat.requiresThinkingAsText){let thinkingText=nonEmptyThinkingBlocks.map(block=>sanitizeSurrogates(block.thinking)).join(`
4
4
 
5
5
  `);assistantMsg.content=[{type:"text",text:thinkingText},...assistantTextParts]}else{assistantText.length>0&&(assistantMsg.content=assistantText);let signature=nonEmptyThinkingBlocks[0].thinkingSignature;model.provider==="opencode-go"&&signature==="reasoning"&&(signature="reasoning_content"),signature!==void 0&&isOpenAICompletionsReasoningField(signature)&&Object.assign(assistantMsg,{[signature]:nonEmptyThinkingBlocks.map(block=>block.thinking).join(`
@@ -1,2 +1,2 @@
1
1
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
2
- import{resolveOpenAIClientAuth}from"./chunk-GFCKDAH5.js";import{OpenAI,toFile}from"./chunk-CD2HJK4C.js";import{awaitProviderTransport,openAICompatibleProviderDiagnosticFromError}from"./chunk-VRWJJMHO.js";import{retryProviderRequest}from"./chunk-GIT63LXN.js";import{buildParams,isImageParams,parseOpenAIImageOutputOptions,parseOpenAIImageSize}from"./chunk-HB35RBP4.js";import{formatProviderError,normalizeProviderError}from"./chunk-AC72EWI5.js";import"./chunk-RQFD6LG2.js";import"./chunk-RFB5CBW7.js";import{readProviderDiagnostic}from"./chunk-7UC4W2T2.js";import"./chunk-WDTJ6JKE.js";import"./chunk-3SASTB6Y.js";import{headersToRecord}from"./chunk-PJ34QVL5.js";import"./chunk-IKOFCODM.js";function upload(image,name){return toFile(Buffer.from(image.data,"base64"),`${name}.${image.mimeType.split("/")[1]}`,{type:image.mimeType})}async function buildEditParams(params,images,mask){if(images.length>16)throw new Error("OpenAI image edits accept at most 16 reference images");let image=await Promise.all(images.map((reference,i)=>upload(reference,`reference-${i}`)));return mask===void 0?{...params,image}:{...params,image,mask:await upload(mask,"mask")}}var PNG_MAGIC=[137,80,78,71],JPEG_MAGIC=[255,216,255],WEBP_MAGIC=[82,73,70,70,87,69,66,80];function requestedOutputFormat(value){return value==="jpeg"||value==="webp"?value:"png"}async function resolveImage(datum,outputFormat,options){let b64=datum.b64_json?.trim();if(b64)return{type:"image",mimeType:detectMime(Buffer.from(b64.slice(0,24),"base64"))??`image/${outputFormat}`,data:b64};let url=datum.url?.trim();if(!url)throw new Error("OpenAI images response datum contained no image data");return url.startsWith("data:")?parseDataUrl(url):hydrateImageUrl(url,options)}function parseDataUrl(url){let match=/^data:([^;,]+);base64,(.+)$/i.exec(url);if(!match?.[1]||!match[2])throw new Error("OpenAI images response contained an invalid data URL");let mimeType=supportedMime(match[1]);if(!mimeType)throw new Error(`OpenAI images response used unsupported MIME type: ${match[1]}`);return{type:"image",mimeType,data:match[2]}}async function hydrateImageUrl(url,options){let parsed;try{parsed=new URL(url)}catch{throw new Error("OpenAI images response URL must be absolute")}if(parsed.protocol!=="http:"&&parsed.protocol!=="https:")throw new Error("OpenAI images response URL must use HTTP or HTTPS");let response=await(options?.fetch??globalThis.fetch)(url,options?.signal?{signal:options.signal}:{});if(!response.ok)throw new Error(`OpenAI image hydration failed with HTTP ${response.status}`);let declaredLength=response.headers.get("content-length");if(declaredLength&&Number(declaredLength)>25165824)throw oversizedImageError();let bytes=new Uint8Array(await response.arrayBuffer());if(bytes.byteLength===0)throw new Error("OpenAI image hydration returned an empty body");if(bytes.byteLength>25165824)throw oversizedImageError();let declaredMime=supportedMime(response.headers.get("content-type")?.split(";",1)[0]),detectedMime=detectMime(bytes);if(declaredMime&&detectedMime&&declaredMime!==detectedMime)throw new Error(`OpenAI image MIME mismatch: declared ${declaredMime}, detected ${detectedMime}`);let mimeType=detectedMime??declaredMime;if(!mimeType)throw new Error("OpenAI image hydration returned unsupported image content");return{type:"image",mimeType,data:bytesToBase64(bytes)}}function supportedMime(value){let normalized=value?.trim().toLowerCase();if(normalized==="image/png"||normalized==="image/jpeg"||normalized==="image/webp")return normalized}function detectMime(bytes){if(hasMagic(bytes,PNG_MAGIC))return"image/png";if(hasMagic(bytes,JPEG_MAGIC))return"image/jpeg";if(hasMagic(bytes,WEBP_MAGIC.slice(0,4))&&hasMagic(bytes,WEBP_MAGIC.slice(4),8))return"image/webp"}function hasMagic(bytes,magic,offset=0){return magic.every((value,index)=>bytes[offset+index]===value)}function bytesToBase64(bytes){let binary="";for(let offset=0;offset<bytes.length;offset+=32768)binary+=String.fromCharCode(...bytes.subarray(offset,offset+32768));return btoa(binary)}function oversizedImageError(){return new Error("OpenAI image hydration exceeded the 24 MiB limit")}var ENDPOINT_SUFFIXES=["/chat/completions","/responses","/models"],generateImages=async(model,context,options)=>{let output={api:model.api,provider:model.provider,model:model.id,output:[],stopReason:"stop",timestamp:Date.now()};try{let params=buildParams(model,context,options),images=context.input.filter(item=>item.type==="image"),method=images.length>0?"edit":"generate";method==="edit"&&(params=await buildEditParams(params,images,options?.mask));let nextParams=await options?.onPayload?.(params,model);if(nextParams!==void 0){if(!isImageParams(nextParams))throw new Error("onPayload returned an invalid image generation payload");params=nextParams}let headers={...model.headers,...options?.headers},auth=resolveOpenAIClientAuth(model.provider,options?.apiKey,headers),client=new OpenAI({apiKey:auth.apiKey,baseURL:normalizeBaseUrl(model.baseUrl),dangerouslyAllowBrowser:!0,fetch:options?.fetch,defaultHeaders:auth.headers}),requestOptions={...options?.signal?{signal:options.signal}:{},...options?.timeoutMs!==void 0?{timeout:options.timeoutMs}:{},maxRetries:0},{data:response,response:rawResponse}=await retryProviderRequest(()=>{let sdkParams=params;return awaitProviderTransport(()=>(method==="edit"?client.images.edit(sdkParams,requestOptions):client.images.generate(sdkParams,requestOptions)).withResponse(),openAICompatibleProviderDiagnosticFromError)},{maxRetries:options?.maxRetries,maxRetryDelayMs:options?.maxRetryDelayMs,signal:options?.signal});if(await options?.onResponse?.({status:rawResponse.status,headers:headersToRecord(rawResponse.headers)},model),response.usage&&(output.usage=parseUsage(response.usage,model)),(response.background==="transparent"||response.background==="opaque")&&(output.background=response.background),!response.data||response.data.length===0)throw new Error("OpenAI images response contained no image data");let outputFormat=requestedOutputFormat(params.output_format);for(let datum of response.data){let image=await resolveImage(datum,outputFormat,options);datum.revised_prompt?.trim()&&output.output.push({type:"text",text:datum.revised_prompt}),output.output.push(image)}return output}catch(error){output.stopReason=options?.signal?.aborted?"aborted":"error",output.errorMessage=formatProviderError(normalizeProviderError(error));let providerDiagnostic=output.stopReason==="error"?readProviderDiagnostic(error):void 0;return providerDiagnostic!==void 0&&(output.providerDiagnostic=providerDiagnostic),output}};function normalizeBaseUrl(baseUrl){let url;try{url=new URL(baseUrl)}catch{throw new Error(`Invalid OpenAI images base URL: ${baseUrl}`)}if(url.protocol!=="http:"&&url.protocol!=="https:")throw new Error("OpenAI images base URL must use HTTP or HTTPS");if(url.search||url.hash)throw new Error("OpenAI images base URL must not include a query or fragment");let pathname=url.pathname.replace(/\/+$/,""),normalizedPathname=pathname.toLowerCase();if(normalizedPathname.includes("/images"))throw new Error("OpenAI images base URL must not include an images endpoint");if(ENDPOINT_SUFFIXES.some(suffix=>normalizedPathname.endsWith(suffix)))throw new Error("OpenAI images base URL must not include a known API endpoint");return url.pathname=pathname.endsWith("/v1")?pathname:`${pathname}/v1`,url.toString()}function parseUsage(rawUsage,model){let input=rawUsage.input_tokens??0,output=rawUsage.output_tokens??0,imageTokens=rawUsage.input_tokens_details?.image_tokens??0,textTokens=rawUsage.input_tokens_details?.text_tokens??Math.max(0,input-imageTokens),imageRate=model.cost.imageInput??model.cost.input,usage={input,output,cacheRead:0,cacheWrite:0,totalTokens:rawUsage.total_tokens??input+output,cost:{input:(model.cost.input*textTokens+imageRate*imageTokens)/1e6,output:model.cost.output/1e6*output,cacheRead:0,cacheWrite:0,total:0}};return usage.cost.total=usage.cost.input+usage.cost.output,usage}export{generateImages,parseOpenAIImageOutputOptions,parseOpenAIImageSize};
2
+ import{resolveOpenAIClientAuth}from"./chunk-GFCKDAH5.js";import{OpenAI,toFile}from"./chunk-CD2HJK4C.js";import{awaitProviderTransport,openAICompatibleProviderDiagnosticFromError}from"./chunk-7565XQAU.js";import{retryProviderRequest}from"./chunk-GIT63LXN.js";import{buildParams,isImageParams,parseOpenAIImageOutputOptions,parseOpenAIImageSize}from"./chunk-HB35RBP4.js";import{formatProviderError,normalizeProviderError}from"./chunk-AC72EWI5.js";import"./chunk-RQFD6LG2.js";import"./chunk-RFB5CBW7.js";import{readProviderDiagnostic}from"./chunk-MOH5HOHX.js";import"./chunk-WDTJ6JKE.js";import"./chunk-3SASTB6Y.js";import{headersToRecord}from"./chunk-PJ34QVL5.js";import"./chunk-IKOFCODM.js";function upload(image,name){return toFile(Buffer.from(image.data,"base64"),`${name}.${image.mimeType.split("/")[1]}`,{type:image.mimeType})}async function buildEditParams(params,images,mask){if(images.length>16)throw new Error("OpenAI image edits accept at most 16 reference images");let image=await Promise.all(images.map((reference,i)=>upload(reference,`reference-${i}`)));return mask===void 0?{...params,image}:{...params,image,mask:await upload(mask,"mask")}}var PNG_MAGIC=[137,80,78,71],JPEG_MAGIC=[255,216,255],WEBP_MAGIC=[82,73,70,70,87,69,66,80];function requestedOutputFormat(value){return value==="jpeg"||value==="webp"?value:"png"}async function resolveImage(datum,outputFormat,options){let b64=datum.b64_json?.trim();if(b64)return{type:"image",mimeType:detectMime(Buffer.from(b64.slice(0,24),"base64"))??`image/${outputFormat}`,data:b64};let url=datum.url?.trim();if(!url)throw new Error("OpenAI images response datum contained no image data");return url.startsWith("data:")?parseDataUrl(url):hydrateImageUrl(url,options)}function parseDataUrl(url){let match=/^data:([^;,]+);base64,(.+)$/i.exec(url);if(!match?.[1]||!match[2])throw new Error("OpenAI images response contained an invalid data URL");let mimeType=supportedMime(match[1]);if(!mimeType)throw new Error(`OpenAI images response used unsupported MIME type: ${match[1]}`);return{type:"image",mimeType,data:match[2]}}async function hydrateImageUrl(url,options){let parsed;try{parsed=new URL(url)}catch{throw new Error("OpenAI images response URL must be absolute")}if(parsed.protocol!=="http:"&&parsed.protocol!=="https:")throw new Error("OpenAI images response URL must use HTTP or HTTPS");let response=await(options?.fetch??globalThis.fetch)(url,options?.signal?{signal:options.signal}:{});if(!response.ok)throw new Error(`OpenAI image hydration failed with HTTP ${response.status}`);let declaredLength=response.headers.get("content-length");if(declaredLength&&Number(declaredLength)>25165824)throw oversizedImageError();let bytes=new Uint8Array(await response.arrayBuffer());if(bytes.byteLength===0)throw new Error("OpenAI image hydration returned an empty body");if(bytes.byteLength>25165824)throw oversizedImageError();let declaredMime=supportedMime(response.headers.get("content-type")?.split(";",1)[0]),detectedMime=detectMime(bytes);if(declaredMime&&detectedMime&&declaredMime!==detectedMime)throw new Error(`OpenAI image MIME mismatch: declared ${declaredMime}, detected ${detectedMime}`);let mimeType=detectedMime??declaredMime;if(!mimeType)throw new Error("OpenAI image hydration returned unsupported image content");return{type:"image",mimeType,data:bytesToBase64(bytes)}}function supportedMime(value){let normalized=value?.trim().toLowerCase();if(normalized==="image/png"||normalized==="image/jpeg"||normalized==="image/webp")return normalized}function detectMime(bytes){if(hasMagic(bytes,PNG_MAGIC))return"image/png";if(hasMagic(bytes,JPEG_MAGIC))return"image/jpeg";if(hasMagic(bytes,WEBP_MAGIC.slice(0,4))&&hasMagic(bytes,WEBP_MAGIC.slice(4),8))return"image/webp"}function hasMagic(bytes,magic,offset=0){return magic.every((value,index)=>bytes[offset+index]===value)}function bytesToBase64(bytes){let binary="";for(let offset=0;offset<bytes.length;offset+=32768)binary+=String.fromCharCode(...bytes.subarray(offset,offset+32768));return btoa(binary)}function oversizedImageError(){return new Error("OpenAI image hydration exceeded the 24 MiB limit")}var ENDPOINT_SUFFIXES=["/chat/completions","/responses","/models"],generateImages=async(model,context,options)=>{let output={api:model.api,provider:model.provider,model:model.id,output:[],stopReason:"stop",timestamp:Date.now()};try{let params=buildParams(model,context,options),images=context.input.filter(item=>item.type==="image"),method=images.length>0?"edit":"generate";method==="edit"&&(params=await buildEditParams(params,images,options?.mask));let nextParams=await options?.onPayload?.(params,model);if(nextParams!==void 0){if(!isImageParams(nextParams))throw new Error("onPayload returned an invalid image generation payload");params=nextParams}let headers={...model.headers,...options?.headers},auth=resolveOpenAIClientAuth(model.provider,options?.apiKey,headers),client=new OpenAI({apiKey:auth.apiKey,baseURL:normalizeBaseUrl(model.baseUrl),dangerouslyAllowBrowser:!0,fetch:options?.fetch,defaultHeaders:auth.headers}),requestOptions={...options?.signal?{signal:options.signal}:{},...options?.timeoutMs!==void 0?{timeout:options.timeoutMs}:{},maxRetries:0},{data:response,response:rawResponse}=await retryProviderRequest(()=>{let sdkParams=params;return awaitProviderTransport(()=>(method==="edit"?client.images.edit(sdkParams,requestOptions):client.images.generate(sdkParams,requestOptions)).withResponse(),openAICompatibleProviderDiagnosticFromError)},{maxRetries:options?.maxRetries,maxRetryDelayMs:options?.maxRetryDelayMs,signal:options?.signal});if(await options?.onResponse?.({status:rawResponse.status,headers:headersToRecord(rawResponse.headers)},model),response.usage&&(output.usage=parseUsage(response.usage,model)),(response.background==="transparent"||response.background==="opaque")&&(output.background=response.background),!response.data||response.data.length===0)throw new Error("OpenAI images response contained no image data");let outputFormat=requestedOutputFormat(params.output_format);for(let datum of response.data){let image=await resolveImage(datum,outputFormat,options);datum.revised_prompt?.trim()&&output.output.push({type:"text",text:datum.revised_prompt}),output.output.push(image)}return output}catch(error){output.stopReason=options?.signal?.aborted?"aborted":"error",output.errorMessage=formatProviderError(normalizeProviderError(error));let providerDiagnostic=output.stopReason==="error"?readProviderDiagnostic(error):void 0;return providerDiagnostic!==void 0&&(output.providerDiagnostic=providerDiagnostic),output}};function normalizeBaseUrl(baseUrl){let url;try{url=new URL(baseUrl)}catch{throw new Error(`Invalid OpenAI images base URL: ${baseUrl}`)}if(url.protocol!=="http:"&&url.protocol!=="https:")throw new Error("OpenAI images base URL must use HTTP or HTTPS");if(url.search||url.hash)throw new Error("OpenAI images base URL must not include a query or fragment");let pathname=url.pathname.replace(/\/+$/,""),normalizedPathname=pathname.toLowerCase();if(normalizedPathname.includes("/images"))throw new Error("OpenAI images base URL must not include an images endpoint");if(ENDPOINT_SUFFIXES.some(suffix=>normalizedPathname.endsWith(suffix)))throw new Error("OpenAI images base URL must not include a known API endpoint");return url.pathname=pathname.endsWith("/v1")?pathname:`${pathname}/v1`,url.toString()}function parseUsage(rawUsage,model){let input=rawUsage.input_tokens??0,output=rawUsage.output_tokens??0,imageTokens=rawUsage.input_tokens_details?.image_tokens??0,textTokens=rawUsage.input_tokens_details?.text_tokens??Math.max(0,input-imageTokens),imageRate=model.cost.imageInput??model.cost.input,usage={input,output,cacheRead:0,cacheWrite:0,totalTokens:rawUsage.total_tokens??input+output,cost:{input:(model.cost.input*textTokens+imageRate*imageTokens)/1e6,output:model.cost.output/1e6*output,cacheRead:0,cacheWrite:0,total:0}};return usage.cost.total=usage.cost.input+usage.cost.output,usage}export{generateImages,parseOpenAIImageOutputOptions,parseOpenAIImageSize};
@@ -1,4 +1,4 @@
1
1
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
2
- import{resolveOpenAIClientAuth}from"./chunk-GFCKDAH5.js";import{OpenAI}from"./chunk-CD2HJK4C.js";import{createWebSocketTransportFailure,startWebSocketLiveness}from"./chunk-YT2ZSZOY.js";import{isCloudflareProvider,resolveCloudflareBaseUrl}from"./chunk-OZNCR6E6.js";import{formatGitHubCopilotToolLimitError,limitGitHubCopilotTools,recordGitHubCopilotToolLimit,withGitHubCopilotFailureNote}from"./chunk-FQZZGSYH.js";import{getPiUserAgent}from"./chunk-QTG7MY2X.js";import{awaitProviderTransport,openAICompatibleProviderDiagnosticFromError,siwcProviderDiagnosticFromError}from"./chunk-VRWJJMHO.js";import{OPENAI_RESPONSES_RESERVED_BODY_KEYS,buildBaseOptions,clampMaxForOpenAI}from"./chunk-2XBKE2BZ.js";import{retryProviderRequest}from"./chunk-GIT63LXN.js";import{deriveOpenAIPromptCacheKey}from"./chunk-LPHUMR6R.js";import{isRequestRefusal,sendWithForcedToolChoiceFallback}from"./chunk-OEFCY46F.js";import{buildCopilotDynamicHeaders,hasCopilotVisionInput}from"./chunk-KRNXUTZJ.js";import{formatProviderError,normalizeProviderError}from"./chunk-AC72EWI5.js";import"./chunk-RQFD6LG2.js";import{supportsAllowedToolChoice}from"./chunk-COH5F7QV.js";import"./chunk-RFB5CBW7.js";import{convertResponsesMessages,convertResponsesTools,findPromptCacheComparisonResponseId,processResponsesStream,resolveResponsesDeferredToolsMode,resolveResponsesToolPlacement,withPromptCacheComparison}from"./chunk-V36CXIIB.js";import"./chunk-GVSBCJFI.js";import{readProviderDiagnostic}from"./chunk-7UC4W2T2.js";import"./chunk-HK46JMSC.js";import{createGrammarToolInputProperties}from"./chunk-ED7VJGL4.js";import"./chunk-WDTJ6JKE.js";import{getProviderEnvValue}from"./chunk-5ROMKDLK.js";import"./chunk-3W47LTXQ.js";import{calculateCost,clampThinkingLevel,getCurrentTools,getDeclaredTools,inferOpenAIThinkingLevelMap,normalizeContext,resolveTranscript,supportsMax,supportsXhigh}from"./chunk-TBARMJ75.js";import"./chunk-3SASTB6Y.js";import{AssistantMessageEventStream}from"./chunk-5CSZPC55.js";import{headersToRecord}from"./chunk-PJ34QVL5.js";import"./chunk-IKOFCODM.js";var allowedToolsRefusals=new Set;function refusalKey(target){return JSON.stringify([target.api,target.provider,target.baseUrl,target.id])}function hasRefusedAllowedToolsChoice(target){return allowedToolsRefusals.has(refusalKey(target))}function rememberAllowedToolsChoiceRefusal(target){allowedToolsRefusals.add(refusalKey(target))}function allowedReference(tool){return tool.type==="function"||tool.type==="custom"?{type:tool.type,name:tool.name}:tool.type==="mcp"?{type:"mcp",server_label:tool.server_label}:{type:tool.type}}function allowedToolsChoice(params){let choice=params.tool_choice;if(typeof choice!="object"||choice===null)return;let{type,tools}=choice;return type==="allowed_tools"&&Array.isArray(tools)?tools:void 0}function errorMessage(error){return error instanceof Error?error.message:String(error)}function isAllowedToolsChoiceRefusal(error,params,options={}){if(allowedToolsChoice(params)===void 0||!options.beforeContent&&!isRequestRefusal(error))return!1;let message=errorMessage(error);return/\ballowed_tools\b/.test(message)&&/invalid|unsupported|not\s+supported/i.test(message)}function restrictToAllowedTools(params){let allowed=allowedToolsChoice(params);if(allowed===void 0)return params;let allowedNames=new Set(allowed.map(tool=>tool.name).filter(name=>typeof name=="string")),tools=(params.tools??[]).filter(tool=>tool.type!=="function"&&tool.type!=="custom"||allowedNames.has(tool.name)),restricted={...params,tools};return delete restricted.tool_choice,restricted}function applyAllowedToolsChoice(params,context,activeToolNames,compat){if(!compat.supportsAllowedTools||activeToolNames===void 0||params.tool_choice!==void 0)return params;let active=new Set(activeToolNames),declaredTools=getCurrentTools(context.messages);if(declaredTools.every(tool=>active.has(tool.name)))return params;let allowed=[],namedInTools=new Set;for(let tool of params.tools??[])(tool.type==="function"||tool.type==="custom")&&(namedInTools.add(tool.name),!active.has(tool.name))||allowed.push(allowedReference(tool));let requestToolNames=new Set(resolveResponsesToolPlacement(context.messages,resolveResponsesDeferredToolsMode(compat)!==void 0).requestTools.map(tool=>tool.name));for(let tool of declaredTools){if(namedInTools.has(tool.name)||!active.has(tool.name)||requestToolNames.has(tool.name))continue;let[converted]=convertResponsesTools([tool],{supportsStrictMode:compat.supportsStrictMode,supportsOpenAIGrammarTools:compat.supportsOpenAIGrammarTools});converted&&allowed.push(allowedReference(converted))}let toolChoice=allowed.length>0?{type:"allowed_tools",mode:"auto",tools:allowed}:"none";return{...params,tool_choice:toolChoice}}var OPENAI_TOOL_CALL_PROVIDERS=new Set(["openai","chatgpt-subscription","opencode"]),OPENAI_BETA_RESPONSES_WEBSOCKETS="responses_websockets=2026-02-06",OPENAI_WEB_SEARCH_SOURCES_INCLUDE="web_search_call.action.sources",SESSION_WEBSOCKET_CACHE_TTL_MS=300*1e3,OPENAI_RESPONSES_MIN_OUTPUT_TOKENS=16,PROMPT_CACHE_PREWARM_TIMEOUT_MS=3e4,CHATGPT_USAGE_URL="https://chatgpt.com/settings/usage",websocketSessionCache=new Map;function isForcedOpenAIResponsesToolChoice(toolChoice){return toolChoice!==void 0&&toolChoice!=="auto"&&toolChoice!=="none"}function detectSessionAffinityFormat(model){return model.provider==="openrouter"||model.baseUrl.includes("openrouter.ai")?"openrouter":"openai"}function resolveCacheRetention(cacheRetention,env){return cacheRetention||(getProviderEnvValue("PI_CACHE_RETENTION",env)==="long"?"long":"short")}function getCompat(model,env){let isNativeEndpoint=isOpenAIResponsesNativeEndpoint(model,env);return{siwc:model.compat?.siwc??!1,supportsDeveloperRole:model.compat?.supportsDeveloperRole??!0,supportsMidConvoSystemMessages:model.compat?.supportsMidConvoSystemMessages??!1,sessionAffinityFormat:model.compat?.sessionAffinityFormat??detectSessionAffinityFormat(model),supportsLongCacheRetention:model.compat?.supportsLongCacheRetention??!0,supportsWebSocket:model.compat?.supportsWebSocket??isNativeEndpoint,supportsRemoteCompactionV2:model.compat?.supportsRemoteCompactionV2??isNativeEndpoint,supportsWebSearchPreview:model.compat?.supportsWebSearchPreview??isNativeEndpoint,webSearchToolType:model.compat?.webSearchToolType??"web_search_preview",supportsImageGeneration:model.compat?.supportsImageGeneration??isNativeEndpoint,supportsStrictMode:model.compat?.supportsStrictMode??!1,supportsOpenAIGrammarTools:model.compat?.supportsOpenAIGrammarTools??!1,supportsAdditionalTools:model.compat?.supportsAdditionalTools??!1,supportsToolSearch:model.compat?.supportsToolSearch??!1,supportsExplicitPromptCacheMode:model.compat?.supportsExplicitPromptCacheMode??!1,supportsConfigurationUpdate:model.compat?.supportsConfigurationUpdate??!1,supportsMaxOutputTokens:model.compat?.supportsMaxOutputTokens??!0,supportsForcedToolChoice:model.compat?.supportsForcedToolChoice??!0,supportsAllowedTools:supportsAllowedToolChoice(model)}}function isOpenAIResponsesNativeEndpoint(model,env){let baseUrl=isCloudflareProvider(model.provider)?resolveCloudflareBaseUrl(model,env):model.baseUrl;try{return new URL(baseUrl||"https://api.openai.com/v1").hostname==="api.openai.com"}catch{return!1}}function getPromptCacheRetention(compat,cacheRetention){return cacheRetention==="long"&&compat.supportsLongCacheRetention&&!compat.supportsExplicitPromptCacheMode?"24h":void 0}function getPromptCacheOptions(compat,cacheRetention){if(compat.supportsExplicitPromptCacheMode){if(cacheRetention==="none")return{mode:"explicit"};if(cacheRetention==="long"&&compat.supportsLongCacheRetention)return{ttl:"30m"}}}function isRecord(value){return typeof value=="object"&&value!==null}function isOpenAiWebSearchPreviewTool(value){return isRecord(value)&&(value.type==="web_search"||value.type==="web_search_preview"||value.type==="web_search_preview_2025_03_11")}function sanitizeUnsupportedNativeTools(params,compat){if(compat.supportsWebSearchPreview)return params;let payload=params,sanitized,nextPayload=()=>(sanitized??={...payload},sanitized);if(Array.isArray(payload.tools)){let tools=payload.tools.filter(tool=>!isOpenAiWebSearchPreviewTool(tool));if(tools.length!==payload.tools.length){let next=nextPayload();tools.length>0?next.tools=tools:delete next.tools}}if(Array.isArray(payload.include)){let include=payload.include.filter(value=>value!==OPENAI_WEB_SEARCH_SOURCES_INCLUDE);if(include.length!==payload.include.length){let next=nextPayload();include.length>0?next.include=include:delete next.include}}return isOpenAiWebSearchPreviewTool(payload.tool_choice)&&delete nextPayload().tool_choice,sanitized||params}function formatOpenAIResponsesError(error,provider,siwc=!1){let errorMessage2=formatProviderError(normalizeProviderError(error),`${provider==="openai"?"OpenAI":provider} API error`);if(siwc&&error instanceof Error&&Reflect.get(error,"code")==="subscription_sharing_unsupported_capability"){let param=Reflect.get(error,"param");typeof param=="string"&&(errorMessage2+=`
2
+ import{resolveOpenAIClientAuth}from"./chunk-GFCKDAH5.js";import{OpenAI}from"./chunk-CD2HJK4C.js";import{createWebSocketTransportFailure,startWebSocketLiveness}from"./chunk-YT2ZSZOY.js";import{isCloudflareProvider,resolveCloudflareBaseUrl}from"./chunk-OZNCR6E6.js";import{formatGitHubCopilotToolLimitError,limitGitHubCopilotTools,recordGitHubCopilotToolLimit,withGitHubCopilotFailureNote}from"./chunk-FQZZGSYH.js";import{getPiUserAgent}from"./chunk-QTG7MY2X.js";import{awaitProviderTransport,openAICompatibleProviderDiagnosticFromError,siwcProviderDiagnosticFromError}from"./chunk-7565XQAU.js";import{OPENAI_RESPONSES_RESERVED_BODY_KEYS,buildBaseOptions,clampMaxForOpenAI}from"./chunk-2XBKE2BZ.js";import{retryProviderRequest}from"./chunk-GIT63LXN.js";import{deriveOpenAIPromptCacheKey}from"./chunk-LPHUMR6R.js";import{isRequestRefusal,sendWithForcedToolChoiceFallback}from"./chunk-OEFCY46F.js";import{buildCopilotDynamicHeaders,hasCopilotVisionInput}from"./chunk-KRNXUTZJ.js";import{formatProviderError,normalizeProviderError}from"./chunk-AC72EWI5.js";import"./chunk-RQFD6LG2.js";import{supportsAllowedToolChoice}from"./chunk-COH5F7QV.js";import"./chunk-RFB5CBW7.js";import{convertResponsesMessages,convertResponsesTools,findPromptCacheComparisonResponseId,processResponsesStream,resolveResponsesDeferredToolsMode,resolveResponsesToolPlacement,withPromptCacheComparison}from"./chunk-V36CXIIB.js";import"./chunk-GVSBCJFI.js";import{readProviderDiagnostic}from"./chunk-MOH5HOHX.js";import"./chunk-HK46JMSC.js";import{createGrammarToolInputProperties}from"./chunk-ED7VJGL4.js";import"./chunk-WDTJ6JKE.js";import{getProviderEnvValue}from"./chunk-5ROMKDLK.js";import"./chunk-3W47LTXQ.js";import{calculateCost,clampThinkingLevel,getCurrentTools,getDeclaredTools,inferOpenAIThinkingLevelMap,normalizeContext,resolveTranscript,supportsMax,supportsXhigh}from"./chunk-TBARMJ75.js";import"./chunk-3SASTB6Y.js";import{AssistantMessageEventStream}from"./chunk-5CSZPC55.js";import{headersToRecord}from"./chunk-PJ34QVL5.js";import"./chunk-IKOFCODM.js";var allowedToolsRefusals=new Set;function refusalKey(target){return JSON.stringify([target.api,target.provider,target.baseUrl,target.id])}function hasRefusedAllowedToolsChoice(target){return allowedToolsRefusals.has(refusalKey(target))}function rememberAllowedToolsChoiceRefusal(target){allowedToolsRefusals.add(refusalKey(target))}function allowedReference(tool){return tool.type==="function"||tool.type==="custom"?{type:tool.type,name:tool.name}:tool.type==="mcp"?{type:"mcp",server_label:tool.server_label}:{type:tool.type}}function allowedToolsChoice(params){let choice=params.tool_choice;if(typeof choice!="object"||choice===null)return;let{type,tools}=choice;return type==="allowed_tools"&&Array.isArray(tools)?tools:void 0}function errorMessage(error){return error instanceof Error?error.message:String(error)}function isAllowedToolsChoiceRefusal(error,params,options={}){if(allowedToolsChoice(params)===void 0||!options.beforeContent&&!isRequestRefusal(error))return!1;let message=errorMessage(error);return/\ballowed_tools\b/.test(message)&&/invalid|unsupported|not\s+supported/i.test(message)}function restrictToAllowedTools(params){let allowed=allowedToolsChoice(params);if(allowed===void 0)return params;let allowedNames=new Set(allowed.map(tool=>tool.name).filter(name=>typeof name=="string")),tools=(params.tools??[]).filter(tool=>tool.type!=="function"&&tool.type!=="custom"||allowedNames.has(tool.name)),restricted={...params,tools};return delete restricted.tool_choice,restricted}function applyAllowedToolsChoice(params,context,activeToolNames,compat){if(!compat.supportsAllowedTools||activeToolNames===void 0||params.tool_choice!==void 0)return params;let active=new Set(activeToolNames),declaredTools=getCurrentTools(context.messages);if(declaredTools.every(tool=>active.has(tool.name)))return params;let allowed=[],namedInTools=new Set;for(let tool of params.tools??[])(tool.type==="function"||tool.type==="custom")&&(namedInTools.add(tool.name),!active.has(tool.name))||allowed.push(allowedReference(tool));let requestToolNames=new Set(resolveResponsesToolPlacement(context.messages,resolveResponsesDeferredToolsMode(compat)!==void 0).requestTools.map(tool=>tool.name));for(let tool of declaredTools){if(namedInTools.has(tool.name)||!active.has(tool.name)||requestToolNames.has(tool.name))continue;let[converted]=convertResponsesTools([tool],{supportsStrictMode:compat.supportsStrictMode,supportsOpenAIGrammarTools:compat.supportsOpenAIGrammarTools});converted&&allowed.push(allowedReference(converted))}let toolChoice=allowed.length>0?{type:"allowed_tools",mode:"auto",tools:allowed}:"none";return{...params,tool_choice:toolChoice}}var OPENAI_TOOL_CALL_PROVIDERS=new Set(["openai","chatgpt-subscription","opencode"]),OPENAI_BETA_RESPONSES_WEBSOCKETS="responses_websockets=2026-02-06",OPENAI_WEB_SEARCH_SOURCES_INCLUDE="web_search_call.action.sources",SESSION_WEBSOCKET_CACHE_TTL_MS=300*1e3,OPENAI_RESPONSES_MIN_OUTPUT_TOKENS=16,PROMPT_CACHE_PREWARM_TIMEOUT_MS=3e4,CHATGPT_USAGE_URL="https://chatgpt.com/settings/usage",websocketSessionCache=new Map;function isForcedOpenAIResponsesToolChoice(toolChoice){return toolChoice!==void 0&&toolChoice!=="auto"&&toolChoice!=="none"}function detectSessionAffinityFormat(model){return model.provider==="openrouter"||model.baseUrl.includes("openrouter.ai")?"openrouter":"openai"}function resolveCacheRetention(cacheRetention,env){return cacheRetention||(getProviderEnvValue("PI_CACHE_RETENTION",env)==="long"?"long":"short")}function getCompat(model,env){let isNativeEndpoint=isOpenAIResponsesNativeEndpoint(model,env);return{siwc:model.compat?.siwc??!1,supportsDeveloperRole:model.compat?.supportsDeveloperRole??!0,supportsMidConvoSystemMessages:model.compat?.supportsMidConvoSystemMessages??!1,sessionAffinityFormat:model.compat?.sessionAffinityFormat??detectSessionAffinityFormat(model),supportsLongCacheRetention:model.compat?.supportsLongCacheRetention??!0,supportsWebSocket:model.compat?.supportsWebSocket??isNativeEndpoint,supportsRemoteCompactionV2:model.compat?.supportsRemoteCompactionV2??isNativeEndpoint,supportsWebSearchPreview:model.compat?.supportsWebSearchPreview??isNativeEndpoint,webSearchToolType:model.compat?.webSearchToolType??"web_search_preview",supportsImageGeneration:model.compat?.supportsImageGeneration??isNativeEndpoint,supportsStrictMode:model.compat?.supportsStrictMode??!1,supportsOpenAIGrammarTools:model.compat?.supportsOpenAIGrammarTools??!1,supportsAdditionalTools:model.compat?.supportsAdditionalTools??!1,supportsToolSearch:model.compat?.supportsToolSearch??!1,supportsExplicitPromptCacheMode:model.compat?.supportsExplicitPromptCacheMode??!1,supportsConfigurationUpdate:model.compat?.supportsConfigurationUpdate??!1,supportsMaxOutputTokens:model.compat?.supportsMaxOutputTokens??!0,supportsForcedToolChoice:model.compat?.supportsForcedToolChoice??!0,supportsAllowedTools:supportsAllowedToolChoice(model)}}function isOpenAIResponsesNativeEndpoint(model,env){let baseUrl=isCloudflareProvider(model.provider)?resolveCloudflareBaseUrl(model,env):model.baseUrl;try{return new URL(baseUrl||"https://api.openai.com/v1").hostname==="api.openai.com"}catch{return!1}}function getPromptCacheRetention(compat,cacheRetention){return cacheRetention==="long"&&compat.supportsLongCacheRetention&&!compat.supportsExplicitPromptCacheMode?"24h":void 0}function getPromptCacheOptions(compat,cacheRetention){if(compat.supportsExplicitPromptCacheMode){if(cacheRetention==="none")return{mode:"explicit"};if(cacheRetention==="long"&&compat.supportsLongCacheRetention)return{ttl:"30m"}}}function isRecord(value){return typeof value=="object"&&value!==null}function isOpenAiWebSearchPreviewTool(value){return isRecord(value)&&(value.type==="web_search"||value.type==="web_search_preview"||value.type==="web_search_preview_2025_03_11")}function sanitizeUnsupportedNativeTools(params,compat){if(compat.supportsWebSearchPreview)return params;let payload=params,sanitized,nextPayload=()=>(sanitized??={...payload},sanitized);if(Array.isArray(payload.tools)){let tools=payload.tools.filter(tool=>!isOpenAiWebSearchPreviewTool(tool));if(tools.length!==payload.tools.length){let next=nextPayload();tools.length>0?next.tools=tools:delete next.tools}}if(Array.isArray(payload.include)){let include=payload.include.filter(value=>value!==OPENAI_WEB_SEARCH_SOURCES_INCLUDE);if(include.length!==payload.include.length){let next=nextPayload();include.length>0?next.include=include:delete next.include}}return isOpenAiWebSearchPreviewTool(payload.tool_choice)&&delete nextPayload().tool_choice,sanitized||params}function formatOpenAIResponsesError(error,provider,siwc=!1){let errorMessage2=formatProviderError(normalizeProviderError(error),`${provider==="openai"?"OpenAI":provider} API error`);if(siwc&&error instanceof Error&&Reflect.get(error,"code")==="subscription_sharing_unsupported_capability"){let param=Reflect.get(error,"param");typeof param=="string"&&(errorMessage2+=`
3
3
  Unsupported parameter: ${param}`)}return errorMessage2.includes("subscription_sharing_usage_limit_exceeded")?`${errorMessage2}
4
4
  Check your ChatGPT usage: ${CHATGPT_USAGE_URL}`:errorMessage2}var stream=(model,context,options)=>{let stream2=new AssistantMessageEventStream({captureBlocks:!0}),normalizedContext=resolveTranscript(context,getCompat(model).supportsMidConvoSystemMessages);return(async()=>{let output={role:"assistant",content:[],api:model.api,provider:model.provider,model:model.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"pending",timestamp:Date.now()};try{let clientAuth=resolveOpenAIClientAuth(model.provider,options?.apiKey,options?.headers),cacheSessionId=resolveCacheRetention(options?.cacheRetention,options?.env)==="none"?void 0:options?.sessionId,compat=getCompat(model,options?.env),grammarToolInputProperties=createGrammarToolInputProperties(getDeclaredTools(normalizedContext.messages),compat.supportsOpenAIGrammarTools),client=createClient(model,normalizedContext,clientAuth.apiKey,clientAuth.headers,options?.fetch,cacheSessionId,options?.env),params=buildParams(model,normalizedContext,options,compat,grammarToolInputProperties),nextParams=await options?.onPayload?.(params,model);nextParams!==void 0&&(params=nextParams),params=sanitizeUnsupportedNativeTools(params,compat),params=applyAllowedToolsChoice(params,normalizedContext,context.activeToolNames,compat),hasRefusedAllowedToolsChoice(model)&&(params=restrictToAllowedTools(params));let limitedTools=limitGitHubCopilotTools(model.provider,params.tools,params.tool_choice,getDeclaredTools(normalizedContext.messages).map(tool=>tool.name));limitedTools.omittedCount>0&&(params={...params,tools:limitedTools.tools},recordGitHubCopilotToolLimit(output,limitedTools.omittedCount));let transport=options?.transport??"sse",refusedAllowedToolsOverWebSocket=!1;if(transport!=="sse"&&compat.supportsWebSocket){let websocketStarted=!1;try{if(await processWebSocketStream(resolveOpenAIResponsesWebSocketUrl(model,options?.env),params,buildWebSocketHeaders(model,normalizedContext,clientAuth.apiKey,clientAuth.headers,cacheSessionId,options?.env),output,stream2,model,()=>{websocketStarted=!0},cacheSessionId,grammarToolInputProperties,options),options?.signal?.aborted)throw new Error("Request was aborted");stream2.push({type:"done",reason:getDoneReason(output.stopReason),message:output}),stream2.end();return}catch(error){let refusedAllowedTools=output.content.length===0&&isAllowedToolsChoiceRefusal(error,params,{beforeContent:!0});if(!refusedAllowedTools&&(transport==="websocket"||websocketStarted))throw error;refusedAllowedTools&&(params=restrictToAllowedTools(params),refusedAllowedToolsOverWebSocket=!0,output.stopReason="pending",delete output.errorMessage)}}let requestOptions={...options?.signal?{signal:options.signal}:{},...options?.timeoutMs!==void 0?{timeout:options.timeoutMs}:{},maxRetries:0},sendOnce=async body=>{let sent=await sendWithForcedToolChoiceFallback({target:model,params:body,acceptsForcedToolChoice:compat.supportsForcedToolChoice,isForced:isForcedOpenAIResponsesToolChoice,send:request=>model.provider==="github-copilot"||compat.siwc?awaitProviderTransport(()=>client.responses.create(request,requestOptions).withResponse(),compat.siwc?siwcProviderDiagnosticFromError:openAICompatibleProviderDiagnosticFromError):client.responses.create(request,requestOptions).withResponse()});return params=sent.params,sent.result},createRequest=async()=>{try{let result=await sendOnce(params);return refusedAllowedToolsOverWebSocket&&rememberAllowedToolsChoiceRefusal(model),result}catch(error){if(!isAllowedToolsChoiceRefusal(error,params))throw error;params=restrictToAllowedTools(params);let result=await sendOnce(params);return rememberAllowedToolsChoiceRefusal(model),result}},{data:openaiStream,response}=await retryProviderRequest(()=>createRequest(),{maxRetries:options?.maxRetries,maxRetryDelayMs:options?.maxRetryDelayMs,signal:options?.signal});if(await options?.onResponse?.({status:response.status,headers:headersToRecord(response.headers)},model),refusedAllowedToolsOverWebSocket||stream2.push({type:"start",partial:output}),await processResponsesStream(openaiStream,output,stream2,model,{siwc:compat.siwc,onProviderStreamEvent:options?.onProviderStreamEvent,serviceTier:options?.serviceTier,grammarToolInputProperties,applyServiceTierPricing:(usage,serviceTier)=>applyServiceTierPricing(usage,serviceTier,model)}),options?.signal?.aborted)throw new Error("Request was aborted");if(output.stopReason==="pending")throw new Error("OpenAI Responses stream ended without a stop reason");if(output.stopReason==="aborted"||output.stopReason==="error")throw new Error(output.errorMessage||"An unknown error occurred");stream2.push({type:"done",reason:output.stopReason,message:output}),stream2.end()}catch(error){for(let block of output.content)delete block.index,delete block.partialJson,delete block.customInput;output.stopReason=options?.signal?.aborted?"aborted":"error";let providerDiagnostic=(model.provider==="github-copilot"||model.compat?.siwc)&&output.stopReason==="error"?readProviderDiagnostic(error)??(model.compat?.siwc?siwcProviderDiagnosticFromError(error):openAICompatibleProviderDiagnosticFromError(error)):void 0;providerDiagnostic!==void 0&&(output.providerDiagnostic=providerDiagnostic),output.errorMessage=withGitHubCopilotFailureNote(formatGitHubCopilotToolLimitError(output,formatOpenAIResponsesError(error,model.provider,model.compat?.siwc)),model.provider,error),stream2.push({type:"error",reason:output.stopReason,error:output}),stream2.end()}})(),stream2},streamSimple=(model,context,options)=>(resolveOpenAIClientAuth(model.provider,options?.apiKey,options?.headers),stream(model,context,resolveSimpleOptions(model,context,options)));function resolveSimpleOptions(model,context,options){let base={...buildBaseOptions(model,context,options,options?.apiKey),toolChoice:options?.toolChoice,serviceTier:options?.serviceTier},clampedReasoning=options?.reasoning?clampThinkingLevel(model,options.reasoning):void 0,reasoningEffort=clampedReasoning==="off"?void 0:clampedReasoning==="max"&&supportsMax(model)?"max":clampMaxForOpenAI(clampedReasoning,supportsXhigh(model));return{...base,reasoningEffort}}async function warmOpenAIResponsesPromptCache(model,context,options){let prefix=normalizeContext({...context,messages:[]}),resolved=resolveSimpleOptions(model,prefix,options),clientAuth=resolveOpenAIClientAuth(model.provider,resolved.apiKey,resolved.headers),cacheRetention=resolveCacheRetention(resolved.cacheRetention,resolved.env),compat=getCompat(model,resolved.env),grammarToolInputProperties=createGrammarToolInputProperties(getDeclaredTools(prefix.messages),compat.supportsOpenAIGrammarTools),client=createClient(model,prefix,clientAuth.apiKey,clientAuth.headers,resolved.fetch,cacheRetention==="none"?void 0:resolved.sessionId,resolved.env),params=buildParams(model,prefix,resolved,compat,grammarToolInputProperties),nextParams=await resolved.onPayload?.(params,model);nextParams!==void 0&&(params=nextParams),params=sanitizeUnsupportedNativeTools(params,compat);let limitedTools=limitGitHubCopilotTools(model.provider,params.tools,params.tool_choice,getDeclaredTools(prefix.messages).map(tool=>tool.name));limitedTools.omittedCount>0&&(params={...params,tools:limitedTools.tools});let body={...params,stream:!1,prompt_cache_options:{...params.prompt_cache_options,prewarm:!0}},response=await client.responses.create(body,{maxRetries:0,timeout:resolved.timeoutMs??PROMPT_CACHE_PREWARM_TIMEOUT_MS,...resolved.signal?{signal:resolved.signal}:{}}),usageRaw=response.usage,inputDetails=usageRaw?.input_tokens_details,cacheRead=inputDetails?.cached_tokens||0,cacheWrite=inputDetails?.cache_write_tokens??inputDetails?.cache_creation_tokens??0,usage={input:Math.max(0,(usageRaw?.input_tokens||0)-cacheRead-cacheWrite),output:usageRaw?.output_tokens||0,cacheRead,cacheWrite,totalTokens:usageRaw?.total_tokens||0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}};return calculateCost(model,usage),applyServiceTierPricing(usage,response.service_tier??resolved.serviceTier,model),{usage,usageRaw}}var SiwcOpenAI=class extends OpenAI{makeStatusError(status,body,message,headers){return isRecord(body)&&Object.hasOwn(body,"detail")&&!Object.hasOwn(body,"error")?new OpenAI.APIError(status,body,message,headers):super.makeStatusError(status,body,message,headers)}};function createClient(model,context,apiKey,optionsHeaders,fetch,sessionId,env){let compat=getCompat(model,env),headers={"User-Agent":getPiUserAgent(),...model.headers};if(model.provider==="github-copilot"){let hasImages=hasCopilotVisionInput(context.messages),copilotHeaders=buildCopilotDynamicHeaders({messages:context.messages,hasImages});Object.assign(headers,copilotHeaders)}sessionId&&(compat.sessionAffinityFormat==="openrouter"?headers["x-session-id"]=sessionId:(compat.sessionAffinityFormat==="openai"&&(headers.session_id=sessionId),headers["x-client-request-id"]=sessionId)),optionsHeaders&&Object.assign(headers,optionsHeaders);let Client=compat.siwc?SiwcOpenAI:OpenAI;return new Client({apiKey,baseURL:isCloudflareProvider(model.provider)?resolveCloudflareBaseUrl(model,env):model.baseUrl,dangerouslyAllowBrowser:!0,fetch,defaultHeaders:headers})}function buildParams(model,context,options,compat=getCompat(model,options?.env),grammarToolInputProperties=createGrammarToolInputProperties(getDeclaredTools(context.messages),compat.supportsOpenAIGrammarTools)){let toolPlacement=resolveResponsesToolPlacement(context.messages,resolveResponsesDeferredToolsMode(compat)!==void 0),requestedReasoningEffort=options?.reasoningEffort??(options?.reasoningSummary?"medium":void 0),thinkingLevelMap=inferOpenAIThinkingLevelMap(model),mappedReasoningEffort=requestedReasoningEffort===void 0?void 0:thinkingLevelMap?.[requestedReasoningEffort],reasoningEffort=mappedReasoningEffort===void 0?requestedReasoningEffort:mappedReasoningEffort,reasoningRequested=reasoningEffort!=null,reasoningUnavailable=reasoningEffort===null,cacheRetention=resolveCacheRetention(options?.cacheRetention??model.cacheRetention,options?.env),messages=convertResponsesMessages(model,context,OPENAI_TOOL_CALL_PROVIDERS,{preserveThinking:reasoningRequested,systemPromptCacheBreakpoint:compat.supportsExplicitPromptCacheMode&&cacheRetention!=="none",grammarToolInputProperties,supportsMidConvoSystemMessages:compat.supportsMidConvoSystemMessages,supportsAdditionalTools:compat.supportsAdditionalTools,supportsToolSearch:compat.supportsToolSearch,toolOptions:{supportsStrictMode:compat.supportsStrictMode,supportsOpenAIGrammarTools:compat.supportsOpenAIGrammarTools}}),isNativeEndpoint=isOpenAIResponsesNativeEndpoint(model,options?.env),comparisonResponseId=cacheRetention!=="none"&&compat.supportsExplicitPromptCacheMode&&isNativeEndpoint?findPromptCacheComparisonResponseId(model,context.messages):void 0,params={model:model.id,input:messages,stream:!0,prompt_cache_key:cacheRetention==="none"?void 0:deriveOpenAIPromptCacheKey(model.id,context),prompt_cache_retention:getPromptCacheRetention(compat,cacheRetention),prompt_cache_options:withPromptCacheComparison(getPromptCacheOptions(compat,cacheRetention),comparisonResponseId),store:!1};return options?.maxTokens&&compat.supportsMaxOutputTokens&&(params.max_output_tokens=Math.max(options.maxTokens,OPENAI_RESPONSES_MIN_OUTPUT_TOKENS)),options?.temperature!==void 0&&(params.temperature=options?.temperature),options?.serviceTier!==void 0&&(params.service_tier=options.serviceTier),toolPlacement.requestTools.length>0&&(params.tools=convertResponsesTools(toolPlacement.requestTools,{supportsStrictMode:compat.supportsStrictMode,supportsOpenAIGrammarTools:compat.supportsOpenAIGrammarTools})),options?.toolChoice!==void 0&&(params.tool_choice=options.toolChoice),model.reasoning&&(reasoningRequested?(params.reasoning={effort:reasoningEffort,...options?.reasoningSummary===null?{}:{summary:options?.reasoningSummary||"auto"}},params.include=["reasoning.encrypted_content"]):!reasoningUnavailable&&model.provider!=="github-copilot"&&thinkingLevelMap?.off!==null&&(params.reasoning={effort:thinkingLevelMap?.off??"none"}),model.provider==="xai"&&(params.include=["reasoning.encrypted_content"])),applyExtraBodyToResponsesParams(params,options?.extraBody),Object.assign(params,model.samplingParams,options?.samplingParams),params}function applyExtraBodyToResponsesParams(params,extraBody){if(extraBody)for(let[key,value]of Object.entries(extraBody))OPENAI_RESPONSES_RESERVED_BODY_KEYS.has(key)||Object.defineProperty(params,key,{value,writable:!0,enumerable:!0,configurable:!0})}function getDoneReason(stopReason){return stopReason==="length"||stopReason==="toolUse"?stopReason:"stop"}function getWebSocketConstructor(){let wsConstructor=globalThis.WebSocket;return typeof wsConstructor=="function"?wsConstructor:null}function getWebSocketReadyState(socket){let readyState=socket.readyState;return typeof readyState=="number"?readyState:void 0}function isWebSocketReusable(socket){let readyState=getWebSocketReadyState(socket);return readyState===void 0||readyState===1}function closeWebSocketSilently(socket,code=1e3,reason="done"){try{socket.close(code,reason)}catch{}}function scheduleSessionWebSocketExpiry(sessionId,entry){entry.idleTimer&&clearTimeout(entry.idleTimer),entry.idleTimer=setTimeout(()=>{if(entry.busy){if(!isWebSocketReusable(entry.socket)){closeWebSocketSilently(entry.socket,1e3,"idle_timeout_dead"),websocketSessionCache.delete(sessionId);return}scheduleSessionWebSocketExpiry(sessionId,entry);return}closeWebSocketSilently(entry.socket,1e3,"idle_timeout"),websocketSessionCache.delete(sessionId)},SESSION_WEBSOCKET_CACHE_TTL_MS);let unref=entry.idleTimer.unref;unref&&unref.call(entry.idleTimer)}function getOpenAIResponsesWebSocketCacheSize(){return websocketSessionCache.size}async function connectWebSocket(url,headers,signal){let WebSocketConstructorValue=getWebSocketConstructor();if(!WebSocketConstructorValue)throw new Error("WebSocket transport is not available in this runtime");let websocketHeaders=headersToRecord(headers);return new Promise((resolve,reject)=>{let settled=!1,socket,cleanup=()=>{transportFailure.dispose(),socket.removeEventListener("open",onOpen),socket.removeEventListener("error",onError),socket.removeEventListener("close",onClose),signal?.removeEventListener("abort",onAbort)},transportFailure=createWebSocketTransportFailure(error=>{settled||(settled=!0,cleanup(),reject(error))}),onOpen=()=>{settled||(settled=!0,cleanup(),resolve(socket))},onError=event=>{transportFailure.onError(event)},onClose=event=>{transportFailure.onClose(event)},onAbort=()=>{settled||(settled=!0,cleanup(),closeWebSocketSilently(socket,1e3,"aborted"),reject(new Error("Request was aborted")))};try{socket=new WebSocketConstructorValue(url,{headers:websocketHeaders})}catch(error){reject(error instanceof Error?error:new Error(String(error)));return}socket.addEventListener("open",onOpen),socket.addEventListener("error",onError),socket.addEventListener("close",onClose),signal?.addEventListener("abort",onAbort)})}async function acquireWebSocket(url,headers,sessionId,signal){if(!sessionId){let socket2=await connectWebSocket(url,headers,signal);return{socket:socket2,release:()=>closeWebSocketSilently(socket2)}}let cached=websocketSessionCache.get(sessionId);if(cached){if(cached.idleTimer&&(clearTimeout(cached.idleTimer),cached.idleTimer=void 0),!cached.busy&&isWebSocketReusable(cached.socket))return cached.busy=!0,{socket:cached.socket,release:({keep}={})=>{if(!keep||!isWebSocketReusable(cached.socket)){closeWebSocketSilently(cached.socket),websocketSessionCache.delete(sessionId);return}cached.busy=!1,scheduleSessionWebSocketExpiry(sessionId,cached)}};cached.busy||(closeWebSocketSilently(cached.socket),websocketSessionCache.delete(sessionId))}let socket=await connectWebSocket(url,headers,signal),entry={socket,busy:!0};return websocketSessionCache.set(sessionId,entry),{socket,release:({keep}={})=>{if(!keep||!isWebSocketReusable(entry.socket)){closeWebSocketSilently(entry.socket),entry.idleTimer&&clearTimeout(entry.idleTimer),websocketSessionCache.get(sessionId)===entry&&websocketSessionCache.delete(sessionId);return}entry.busy=!1,scheduleSessionWebSocketExpiry(sessionId,entry)}}}async function decodeWebSocketData(data){if(typeof data=="string")return data;if(data instanceof ArrayBuffer)return new TextDecoder().decode(new Uint8Array(data));if(ArrayBuffer.isView(data))return new TextDecoder().decode(new Uint8Array(data.buffer,data.byteOffset,data.byteLength));if(data&&typeof data=="object"&&"arrayBuffer"in data){let arrayBuffer=await data.arrayBuffer();return new TextDecoder().decode(new Uint8Array(arrayBuffer))}return null}async function*parseWebSocket(socket,signal){let queue=[],pending=null,done=!1,failed=null,sawCompletion=!1,wake=()=>{if(!pending)return;let resolve=pending;pending=null,resolve()},liveness=startWebSocketLiveness(socket,error=>{failed=error,done=!0,closeWebSocketSilently(socket,1e3,"liveness_timeout"),wake()}),onMessage=event=>{liveness.noteActivity(),(async()=>{if(!event||typeof event!="object"||!("data"in event))return;let text=await decodeWebSocketData(event.data);if(text)try{let parsed=JSON.parse(text);(parsed.type==="response.completed"||parsed.type==="response.incomplete")&&(sawCompletion=!0,done=!0),queue.push(parsed),wake()}catch{}})()},transportFailure=createWebSocketTransportFailure(error=>{failed||(failed=error),done=!0,wake()}),onError=event=>{transportFailure.onError(event)},onClose=event=>{if(sawCompletion){transportFailure.dispose(),done=!0,wake();return}transportFailure.onClose(event)},onAbort=()=>{failed=new Error("Request was aborted"),done=!0,wake()};socket.addEventListener("message",onMessage),socket.addEventListener("error",onError),socket.addEventListener("close",onClose),signal?.addEventListener("abort",onAbort);try{for(;;){if(signal?.aborted)throw new Error("Request was aborted");if(queue.length>0){let event=queue.shift();event&&(yield event);continue}if(done)break;await new Promise(resolve=>{pending=resolve})}if(failed)throw failed;if(!sawCompletion)throw new Error("WebSocket stream closed before response.completed")}finally{liveness.stop(),transportFailure.dispose(),socket.removeEventListener("message",onMessage),socket.removeEventListener("error",onError),socket.removeEventListener("close",onClose),signal?.removeEventListener("abort",onAbort)}}async function processWebSocketStream(url,params,headers,output,stream2,model,onStart,cacheSessionId,grammarToolInputProperties,options){let{socket,release}=await acquireWebSocket(url,headers,cacheSessionId,options?.signal);try{socket.send(JSON.stringify({type:"response.create",...params})),onStart(),await options?.onResponse?.({status:101,headers:{}},model),stream2.push({type:"start",partial:output}),await processResponsesStream(parseWebSocket(socket,options?.signal),output,stream2,model,{siwc:model.compat?.siwc,serviceTier:options?.serviceTier,grammarToolInputProperties,applyServiceTierPricing:(usage,serviceTier)=>applyServiceTierPricing(usage,serviceTier,model)})}finally{release({keep:!1})}}function resolveOpenAIResponsesWebSocketUrl(model,env){let baseUrl=isCloudflareProvider(model.provider)?resolveCloudflareBaseUrl(model,env):model.baseUrl||"https://api.openai.com/v1",url=new URL(baseUrl);return url.pathname.endsWith("/responses")||(url.pathname=`${url.pathname.replace(/\/$/,"")}/responses`),url.protocol==="https:"?url.protocol="wss:":url.protocol==="http:"&&(url.protocol="ws:"),url.toString()}function buildWebSocketHeaders(model,context,apiKey,optionsHeaders,sessionId,env){let headers=new Headers(model.headers),suppressDefaultAuthorization=!1;if(model.provider==="github-copilot"){let hasImages=hasCopilotVisionInput(context.messages),copilotHeaders=buildCopilotDynamicHeaders({messages:context.messages,hasImages});for(let[key,value]of Object.entries(copilotHeaders))headers.set(key,value)}for(let[key,value]of Object.entries(optionsHeaders||{}))value===null?(key.toLowerCase()==="authorization"&&(suppressDefaultAuthorization=!0),headers.delete(key)):headers.set(key,value);if(!suppressDefaultAuthorization&&!headers.has("Authorization")&&headers.set("Authorization",`Bearer ${apiKey}`),sessionId){let compat=getCompat(model,env);compat.sessionAffinityFormat==="openai"&&headers.set("session_id",sessionId),compat.sessionAffinityFormat==="openai"||compat.sessionAffinityFormat==="openai-nosession"?headers.set("x-client-request-id",sessionId):compat.sessionAffinityFormat==="openrouter"&&headers.set("x-session-id",sessionId)}return headers.delete("accept"),headers.delete("content-type"),headers.delete("OpenAI-Beta"),headers.delete("openai-beta"),headers.set("OpenAI-Beta",OPENAI_BETA_RESPONSES_WEBSOCKETS),headers}function getServiceTierCostMultiplier(model,serviceTier){switch(serviceTier){case"ultrafast":return["gpt-6-astra","gpt-6.1-sol"].includes(model.upstreamModelId??model.id)?6:1;case"flex":return .5;case"priority":case"fast":return model.id==="gpt-5.5"?2.5:2;default:return 1}}function applyServiceTierPricing(usage,serviceTier,model){let multiplier=getServiceTierCostMultiplier(model,serviceTier);multiplier!==1&&(usage.cost.input*=multiplier,usage.cost.output*=multiplier,usage.cost.cacheRead*=multiplier,usage.cost.cacheWrite*=multiplier,usage.cost.total=usage.cost.input+usage.cost.output+usage.cost.cacheRead+usage.cost.cacheWrite)}export{getOpenAIResponsesWebSocketCacheSize,scheduleSessionWebSocketExpiry,stream,streamSimple,warmOpenAIResponsesPromptCache};