@openclaw/ai 2026.10.1 → 2026.10.5-beta.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 (106) hide show
  1. package/README.md +6 -0
  2. package/dist/{anthropic-BDfXKgF1.mjs → anthropic-BAHKgWam.mjs} +30 -59
  3. package/dist/{anthropic-payload-policy-BZUAchqb.d.mts → anthropic-payload-policy-DGblkHL5.d.mts} +19 -16
  4. package/dist/{anthropic-stream-reducer-DHt9uFWX.mjs → anthropic-stream-reducer-g6w1YVii.mjs} +195 -283
  5. package/dist/{api-registry-DcEP_o4h.d.mts → api-registry-BhXXYdRA.d.mts} +2 -2
  6. package/dist/assistant-message-events-CHMJgbhs.mjs +18 -0
  7. package/dist/{assistant-output-mJ9cL4Qg.mjs → assistant-output-CUEeSotf.mjs} +2 -2
  8. package/dist/{assistant-text-phase-DAv1BdTm.mjs → assistant-text-phase-BrV8KdFO.mjs} +7 -6
  9. package/dist/{azure-openai-responses-gn9hMf8x.mjs → azure-openai-responses-C7qBuR23.mjs} +8 -9
  10. package/dist/{credential-redaction-BKv49aiv.d.mts → credential-redaction-BHxruEH6.d.mts} +3 -1
  11. package/dist/{diagnostics-Caj-4RBA.mjs → diagnostics-tQasYct1.mjs} +10 -3
  12. package/dist/diagnostics.d.mts +7 -7
  13. package/dist/diagnostics.mjs +3 -3
  14. package/dist/{env-api-keys-CyX4VKGO.mjs → env-api-keys-CrxwdylR.mjs} +24 -35
  15. package/dist/event-stream-6UNs-AhN.d.mts +1 -0
  16. package/dist/{event-stream-DrRM_90c.d.mts → event-stream-BcqWLo_u.d.mts} +1 -1
  17. package/dist/{event-stream-C5AbCAaZ.mjs → event-stream-X2gmsUWv.mjs} +5 -8
  18. package/dist/event-stream.d.mts +2 -2
  19. package/dist/event-stream.mjs +1 -1
  20. package/dist/google-Boz2QcpK.mjs +20 -0
  21. package/dist/{google-interactions-DXu4IYGb.mjs → google-interactions-tjAb1mc5.mjs} +52 -84
  22. package/dist/{google-messages-Bmheetdg.mjs → google-messages-C-RZzloH.mjs} +25 -35
  23. package/dist/google-provider-stream-CMImyxbX.mjs +58 -0
  24. package/dist/{google-shared-DE_ddfsC.mjs → google-shared-OyAtMTZv.mjs} +6 -15
  25. package/dist/google-vertex-hCxTJea7.mjs +40 -0
  26. package/dist/{host-BjIYEjwT.d.mts → host-CTDz7LXD.d.mts} +6 -3
  27. package/dist/{host-JpNulOOs.mjs → host-JWXZWa-c.mjs} +3 -2
  28. package/dist/{host-policy-CC5H0iRZ.mjs → host-policy-q4Azym9F.mjs} +1 -1
  29. package/dist/{index-DJrNQnKw.d.mts → index-BYDvopUB.d.mts} +8 -5
  30. package/dist/index.d.mts +7 -7
  31. package/dist/index.mjs +7 -6
  32. package/dist/internal/anthropic.d.mts +5 -5
  33. package/dist/internal/anthropic.mjs +4 -4
  34. package/dist/internal/openai-completions-compat.d.mts +1 -1
  35. package/dist/internal/openai-completions-compat.mjs +1 -1
  36. package/dist/internal/openai-responses-payload-policy.d.mts +8 -1
  37. package/dist/internal/openai-responses-payload-policy.mjs +3 -3
  38. package/dist/internal/openai.d.mts +9 -9
  39. package/dist/internal/openai.mjs +9 -11
  40. package/dist/internal/runtime.d.mts +31 -13
  41. package/dist/internal/runtime.mjs +10 -13
  42. package/dist/internal/shared.d.mts +5 -5
  43. package/dist/internal/shared.mjs +6 -7
  44. package/dist/internal/tool-schema.mjs +2 -2
  45. package/dist/{llm-request-activity-D8f_oxHj.mjs → llm-request-activity-CfMuh5cC.mjs} +2 -2
  46. package/dist/{mistral-1Bnbneg1.mjs → mistral-DUveP4hF.mjs} +71 -146
  47. package/dist/{model-transport-url-C5f59L3Y.d.mts → model-transport-url-BrsjjdjR.d.mts} +5 -1
  48. package/dist/{number-coercion-V8-BhME4.mjs → number-coercion-C3hztWoY.mjs} +5 -4
  49. package/dist/{openai-chatgpt-responses-CB1JwNFF.mjs → openai-chatgpt-responses-OCwckGhY.mjs} +164 -234
  50. package/dist/{openai-completions-BPadHHKe.mjs → openai-completions-DOltBUe9.mjs} +7 -6
  51. package/dist/{openai-completions-compat-CJ0ktmGy.d.mts → openai-completions-compat-i-nLZxFy.d.mts} +10 -11
  52. package/dist/{openai-completions-compat-D7hWYB0G.mjs → openai-completions-compat-pg1q4uNG.mjs} +10 -6
  53. package/dist/{openai-completions-transport-DITBEALX.mjs → openai-completions-transport-OMrn7gnZ.mjs} +1429 -294
  54. package/dist/{openai-prompt-cache-Dj8qeOHT.mjs → openai-prompt-cache-Cr2xKVrS.mjs} +1 -1
  55. package/dist/{openai-prompt-cache-C-Q1Ksfs.d.mts → openai-prompt-cache-DIPMrMFy.d.mts} +2 -2
  56. package/dist/{openai-responses-1_TvcWI3.mjs → openai-responses-BSBJUA19.mjs} +9 -10
  57. package/dist/{openai-responses-compaction-replay-BB2SWdsx.d.mts → openai-responses-compaction-replay-B2FE4Nw8.d.mts} +4 -4
  58. package/dist/{openai-responses-contracts-sAvdqNjS.d.mts → openai-responses-contracts-DKqMJ1Ct.d.mts} +9 -4
  59. package/dist/{openai-responses-contracts-BKu8O7l4.mjs → openai-responses-contracts-DlKMMTxK.mjs} +26 -6
  60. package/dist/{openai-responses-compaction-window-m878aVpU.mjs → openai-responses-endpoint-CinGh4VZ.mjs} +14 -4
  61. package/dist/{openai-responses-prompt-observer-internal-CbH84xIS.mjs → openai-responses-request-lifecycle-D2IFiI0-.mjs} +39 -4
  62. package/dist/{openai-responses-shared-TCJRAoMW.mjs → openai-responses-shared-DVGhq5xF.mjs} +1036 -327
  63. package/dist/{openai-responses-terminal-usage-BVvyXZ8u.d.mts → openai-responses-terminal-usage-BygjiAdi.d.mts} +2 -2
  64. package/dist/{openai-tool-schema-DYNePiF8.mjs → openai-tool-schema-DDPXsvJP.mjs} +236 -399
  65. package/dist/{positive-integer-CwLi8LUL.mjs → positive-integer-CqWjqSi9.mjs} +1 -1
  66. package/dist/{provider-error-DQBE1bUQ.mjs → provider-error-CF9GWCs2.mjs} +5 -3
  67. package/dist/{provider-options-Dk4PeQV3.d.mts → provider-options-CVrXZBtA.d.mts} +3 -2
  68. package/dist/{provider-transport-turn-state-8c_Nj2NS.mjs → provider-transport-turn-state-LuCaTsSO.mjs} +2 -2
  69. package/dist/{provider-types-De8PRdR0.d.mts → provider-types-CHtRx0dI.d.mts} +3 -3
  70. package/dist/provider-types.d.mts +6 -6
  71. package/dist/providers.d.mts +2 -2
  72. package/dist/providers.mjs +12 -12
  73. package/dist/{reasoning-tag-text-partitioner-Ju9VpUGl.mjs → reasoning-tag-text-partitioner-0-Rsezog.mjs} +13 -12
  74. package/dist/{required-api-key-D4kn3252.mjs → required-api-key-CFJvcFy_.mjs} +1 -1
  75. package/dist/{simple-options-wW3117Fu.mjs → simple-options-BARFAzk9.mjs} +9 -11
  76. package/dist/{src-DWJq14pn.mjs → src-C_wfIUmV.mjs} +19 -4
  77. package/dist/{stream-CElngO8h.mjs → stream-DwrETW0_.mjs} +12 -21
  78. package/dist/{stream-first-event-timeout-D9ZmL_s9.mjs → stream-first-event-timeout-Dc42hKv6.mjs} +8 -21
  79. package/dist/{streaming-byte-guard-CC-HMn_u.mjs → streaming-byte-guard-DBXr1XYn.mjs} +16 -1
  80. package/dist/{string-normalization-PN10hf6d.mjs → string-normalization-I3ux50s9.mjs} +1 -1
  81. package/dist/{text-signature-rOn31nxc.mjs → text-signature-B_MB6U_9.mjs} +32 -5
  82. package/dist/{tool-schema-json-projection-Ct8SeBeJ.mjs → tool-schema-json-projection-B8sG1I9v.mjs} +29 -23
  83. package/dist/{transport-stream-shared-CAxkgOSj.d.mts → transport-stream-shared-BmpzDtdQ.d.mts} +4 -4
  84. package/dist/{transport-stream-shared-C5TAc3U_.mjs → transport-stream-shared-DH08b7Il.mjs} +8 -16
  85. package/dist/transports.d.mts +33 -22
  86. package/dist/transports.mjs +73 -1234
  87. package/dist/{types-DvzmWW8J.d.mts → types-Bd2T86VJ.d.mts} +5 -23
  88. package/dist/types-Kdfw_04V.d.mts +1 -0
  89. package/dist/types.d.mts +6 -6
  90. package/dist/types.mjs +5 -4
  91. package/dist/{validation-B3lQt_VE.d.mts → validation-DdGB1yy3.d.mts} +1 -1
  92. package/dist/{validation-DbqlIfDn.mjs → validation-opC2pjk9.mjs} +2 -3
  93. package/dist/validation.d.mts +1 -1
  94. package/dist/validation.mjs +1 -1
  95. package/package.json +4 -9
  96. package/dist/env-api-keys-BR0MUYYD.d.mts +0 -17
  97. package/dist/event-stream-DqDQWqiy.d.mts +0 -1
  98. package/dist/google-CyMz2jF_.mjs +0 -54
  99. package/dist/google-vertex-BEW0OQIA.mjs +0 -88
  100. package/dist/internal/env-api-keys.d.mts +0 -2
  101. package/dist/internal/env-api-keys.mjs +0 -2
  102. package/dist/openai-responses-request-lifecycle-Fsag-IGZ.mjs +0 -36
  103. package/dist/openai-transport-params-ildrm49s.mjs +0 -735
  104. package/dist/openai-web-search-tools-Cfu0uLyN.mjs +0 -14
  105. package/dist/provider-replay-context-ywPKKLjL.mjs +0 -25
  106. package/dist/types-Dlz-8qcy.d.mts +0 -1
@@ -1,38 +1,25 @@
1
- import { w as supportsClaudeAdaptiveThinking } from "./src-DWJq14pn.mjs";
1
+ import { w as supportsClaudeAdaptiveThinking } from "./src-C_wfIUmV.mjs";
2
2
  import { o as isRecord } from "./record-coerce-CNDovvft.mjs";
3
3
  import { n as normalizeLowercaseStringOrEmpty } from "./string-coerce-CtgOVOSv.mjs";
4
- import { T as usesClaudeStreamingRefusalContract, _ as buildAnthropicClaudeCodeIdentity, a as resolveAiTransportHeaderSentinels, b as prepareClaudeNoPrefillRequestContext, r as getAiTransportHost } from "./host-JpNulOOs.mjs";
5
- import { A as resolveOpenAIThinkingApi, D as supportsOpenAITemperature, b as isOpenAIGpt6Model, d as OpenAIResponsesWebSocketSafeRetryError, g as responsesServiceTierObserver, i as OPENAI_RESPONSES_APIS, l as OpenAIResponsesWebSocketPostDispatchError, m as parseOpenAIResponsesWebSocketServerError, r as OPENAI_CODEX_RESPONSES_DEFAULT_INSTRUCTIONS, t as AZURE_RESPONSES_FIRST_EVENT_TIMEOUT_MS, u as OpenAIResponsesWebSocketPreDispatchError } from "./openai-responses-contracts-BKu8O7l4.mjs";
6
- import { n as getSessionResourceOwnerId, r as registerSessionResourceCleanup } from "./session-resources-D1wgDQ8C.mjs";
7
- import { a as redactDiagnosticText, o as truncateUtf16Safe, s as stableStringify } from "./provider-error-DQBE1bUQ.mjs";
8
- import { r as resolveOpenAIPromptCacheParams } from "./openai-prompt-cache-Dj8qeOHT.mjs";
9
- import { a as resolveModelSseDebugMode, i as resolveModelPayloadDebugMode, n as formatModelTransportDebugUrl, r as emitModelTransportDebug, t as formatModelTransportDebugBaseUrl, u as hasOnlyResponsesFunctionTools, v as toErrorObject } from "./diagnostics-Caj-4RBA.mjs";
10
- import { a as readResponseTextSnippet, i as isCodeModeModelVisibleToolName, n as MALFORMED_STREAMING_FRAGMENT_ERROR_MESSAGE, s as resolveModelHeaderSentinels } from "./text-signature-rOn31nxc.mjs";
11
- import { a as resolveOpenAIPromptCacheKeySupport, c as resolveOpenAIResponsesTextFormat, i as resolveOpenAICompletionsCompat, n as isNativeOpenAIEndpoint, o as usesNativeOpenAICodexResponsesBackend, r as isOpenAICodexResponsesModel, t as detectOpenAICompletionsCompat } from "./openai-completions-compat-D7hWYB0G.mjs";
12
- import { t as buildGuardedModelFetch } from "./host-policy-CC5H0iRZ.mjs";
13
- import { A as buildAnthropicSystemBlocks, C as isAnthropicReplayRejection, D as applyAnthropicEphemeralCacheControlMarkers, E as applyAnthropicContextManagementToRequest, F as resolveAnthropicEphemeralCacheControl, I as resolveAnthropicPayloadPolicy, J as usesFoundryBearerAuth, K as isAnthropicOAuthApiKey, L as resolveAnthropicRequestBetaHeader, M as isDirectAnthropicModel, N as logAnthropicContextEdits, O as applyAnthropicPayloadPolicyToParams, P as resolveAnthropicCacheOptions, R as resolveAnthropicServerCompactionPlan, T as suppressAnthropicCompaction, d as resolveAnthropicTransportOptions, j as isAnthropicServerToolClearingEnabled, k as applyAnthropicRequestCacheControl, l as buildAnthropicRequest, q as omitFoundryBearerCredentialHeaders, t as consumeAnthropicStream, u as prepareAnthropicRequest, w as resolveNewestAnthropicCompaction, z as supportsAnthropicServerSideFallback } from "./anthropic-stream-reducer-DHt9uFWX.mjs";
14
- import { i as resolveCacheRetention } from "./cloudflare-5qSGvIUH.mjs";
15
- import { C as parseJsonObjectPreservingUnsafeIntegers, M as racePromiseWithAbortSignal, S as withProviderResponseHook, T as quoteUnsafeIntegerLiterals, _ as sanitizeNonEmptyTransportPayloadText, a as createEmptyTransportUsage, b as transportAbortError, c as failTransportStream, d as iterateModelStream, f as mergeTransportHeaders, g as parseTerminalToolCallArguments, h as notifyProviderStreamOpened, i as copyProviderAcceptanceObserver, j as createAbortError$1, l as finalizeTerminalToolCallArguments, m as notifyProviderHttpResponse, n as assignTransportErrorDetails, o as createModelStreamCooperativeScheduler, p as notifyProviderHttpMetadata, r as coerceTransportToolCallArguments, s as createWritableTransportEventStream, t as IncompleteToolCallError, u as finalizeTransportStream, v as sanitizeTransportPayloadText, w as parseJsonPreservingUnsafeIntegers, x as withProviderAcceptanceObserver, y as throwIfModelStreamAborted } from "./transport-stream-shared-C5TAc3U_.mjs";
16
- import { C as stripSystemPromptCacheBoundary, D as sortPromptCacheToolsByName, l as codeModeToolSurfaceObserver, s as prepareModelRequestBody } from "./simple-options-wW3117Fu.mjs";
17
- import { A as redactIdentifier, C as log, D as readOpenAICompletionsReasoningBatch, E as readOpenAICompletionsContentDeltas, O as resolveOpenAIClientBaseUrl, S as isOpenAICompletionsThinkingEnabled, T as parseOpenAICompletionsUsage, _ as resolveOpenAIReasoningEffortMap, a as enforceCodeModeResponsesToolSurface, b as createOpenAIResponseHook, c as readCodeModePayloadToolName, g as resolveOpenAISimpleReasoningEffort, h as resolveOpenAIRequestReasoning, i as buildOpenAISdkRequestOptions, j as sha256Hex, k as resolvePromptCacheKey, l as resolveCodeModeResponsesVisibleToolNames, m as reconcileOpenAIResponsesToolChoice, n as buildOpenAIClientHeaders, o as filterCodeModePayloadTools, r as buildOpenAISdkClientOptions, s as getCompat, t as assertCodeModeResponsesToolSurface, u as resolveOpenAIStrictToolFlagWithDiagnostics, v as GEMINI_THOUGHT_SIGNATURE_VALIDATOR_SKIP, w as measureUtf8AppendBytes, x as createResponseModelTracker, y as createOpenAIProviderAcceptanceHook } from "./openai-transport-params-ildrm49s.mjs";
18
- import { n as getEnvApiKey } from "./env-api-keys-CyX4VKGO.mjs";
4
+ import { T as usesClaudeStreamingRefusalContract, _ as buildAnthropicClaudeCodeIdentity, a as resolveAiTransportHeaderSentinels, b as prepareClaudeNoPrefillRequestContext, r as getAiTransportHost } from "./host-JWXZWa-c.mjs";
5
+ import { i as OPENAI_RESPONSES_APIS } from "./openai-responses-contracts-DlKMMTxK.mjs";
6
+ import { o as redactDiagnosticText, s as truncateUtf16Safe } from "./provider-error-CF9GWCs2.mjs";
7
+ import { a as resolveModelPayloadDebugMode, i as emitModelTransportError, n as formatModelTransportDebugUrl, o as resolveModelSseDebugMode, r as emitModelTransportDebug, t as formatModelTransportDebugBaseUrl, y as toErrorObject } from "./diagnostics-tQasYct1.mjs";
8
+ import { a as MALFORMED_STREAMING_FRAGMENT_ERROR_MESSAGE, c as readResponseTextSnippet, d as streamFragmentError, s as isCodeModeModelVisibleToolName, u as resolveModelHeaderSentinels } from "./text-signature-B_MB6U_9.mjs";
9
+ import { a as resolveOpenAIPromptCacheKeySupport, i as resolveOpenAICompletionsCompat, n as isNativeOpenAIEndpoint, o as usesNativeOpenAICodexResponsesBackend, r as isOpenAICodexResponsesModel, t as detectOpenAICompletionsCompat } from "./openai-completions-compat-pg1q4uNG.mjs";
10
+ import { t as buildGuardedModelFetch } from "./host-policy-q4Azym9F.mjs";
11
+ import { A as applyAnthropicPayloadPolicyToParams, B as resolveAnthropicServerCompactionPlan, D as suppressAnthropicCompaction, E as resolveNewestAnthropicCompaction, F as logAnthropicContextEdits, I as resolveAnthropicCacheOptions, J as isAnthropicOAuthApiKey, L as resolveAnthropicEphemeralCacheControl, M as buildAnthropicSystemBlocks, N as isAnthropicServerToolClearingEnabled, O as applyAnthropicContextManagementToRequest, P as isDirectAnthropicModel, R as resolveAnthropicPayloadPolicy, T as isAnthropicReplayRejection, V as supportsAnthropicServerSideFallback, X as usesFoundryBearerAuth, Y as omitFoundryBearerCredentialHeaders, f as resolveAnthropicTransportOptions, j as applyAnthropicRequestCacheControl, k as applyAnthropicEphemeralCacheControlMarkers, l as buildAnthropicRequest, p as resolveCompletionTokenReservation, t as consumeAnthropicStream, u as prepareAnthropicRequest, z as resolveAnthropicRequestBetaHeader } from "./anthropic-stream-reducer-g6w1YVii.mjs";
12
+ import { C as parseJsonObjectPreservingUnsafeIntegers, S as withProviderResponseHook, T as quoteUnsafeIntegerLiterals, _ as sanitizeNonEmptyTransportPayloadText, a as createEmptyTransportUsage, b as transportAbortError, c as failTransportStream, d as iterateModelStream, f as mergeTransportHeaders, g as parseTerminalToolCallArguments, h as notifyProviderStreamOpened, i as copyProviderAcceptanceObserver, j as createAbortError$1, l as finalizeTerminalToolCallArguments, m as notifyProviderHttpResponse, n as assignTransportErrorDetails, o as createModelStreamCooperativeScheduler, p as notifyProviderHttpMetadata, r as coerceTransportToolCallArguments, s as createWritableTransportEventStream, t as IncompleteToolCallError, u as finalizeTransportStream, v as sanitizeTransportPayloadText, w as parseJsonPreservingUnsafeIntegers, x as withProviderAcceptanceObserver, y as throwIfModelStreamAborted } from "./transport-stream-shared-DH08b7Il.mjs";
13
+ import { D as sortPromptCacheToolsByName } from "./simple-options-BARFAzk9.mjs";
14
+ import { At as measureUtf8AppendBytes, Dt as createResponseModelTracker, Et as createOpenAIResponseHook, Ft as resolvePromptCacheKey, J as OPENAI_RESPONSES_ID_MAX_LENGTH, K as OPENAI_RESPONSES_CALL_ID_RE, L as resolveReplayableResponsesMessageId, M as resolveResponsesContextUsageBoundary, Mt as readOpenAICompletionsContentDeltas, Nt as readOpenAICompletionsReasoningBatch, Ot as isOpenAICompletionsThinkingEnabled, Pt as resolveOpenAIClientBaseUrl, Tt as createOpenAIProviderAcceptanceHook, X as shouldNormalizeOpenAIResponsesToolCallId, Y as normalizeOpenAIResponsesFunctionCallId, Z as splitOpenAIFunctionCallPairing, ct as buildOpenAISdkClientOptions, dt as filterCodeModePayloadTools, ft as getCompat, ht as resolveOpenAIStrictToolFlagWithDiagnostics, it as resolveNewestOpenAIResponsesCompactionReplay, jt as parseOpenAICompletionsUsage, kt as log, lt as buildOpenAISdkRequestOptions, mt as resolveCodeModeResponsesVisibleToolNames, ot as assertCodeModeResponsesToolSurface, pt as readCodeModePayloadToolName, q as OPENAI_RESPONSES_FUNCTION_CALL_ITEM_ID_RE, rt as captureOpenAIResponsesCompaction, st as buildOpenAIClientHeaders, tt as CompactionReplayRefreshRequiredError, ut as enforceCodeModeResponsesToolSurface, vt as resolveOpenAIReasoningEffortMap, wt as GEMINI_THOUGHT_SIGNATURE_VALIDATOR_SKIP } from "./openai-responses-shared-DVGhq5xF.mjs";
15
+ import { n as getEnvApiKey } from "./env-api-keys-CrxwdylR.mjs";
19
16
  import { t as createDeferredEventBuffer } from "./deferred-event-buffer-DAvyP7qA.mjs";
20
- import { n as isProviderReplayContext, r as providerReplayContextMatches, t as buildProviderReplayContext } from "./provider-replay-context-ywPKKLjL.mjs";
21
- import { t as createAssistantOutput } from "./assistant-output-mJ9cL4Qg.mjs";
17
+ import { t as createAssistantOutput } from "./assistant-output-CUEeSotf.mjs";
22
18
  import { n as resolveOpencodeSessionHeaders } from "./session-affinity-DA4WHv1h.mjs";
23
- import { a as flattenCompletionMessagesToStringContent, c as hasOpenAICompatibleConversationTurn, d as createDeepSeekTextFilter, l as canonicalizeMaxTokensParam, o as stripCompletionMessagesToRoleContent, r as buildOpenAICompletionsParams, s as applyCompletionsAnthropicCacheControl, t as createOpenAICompletionsTransportStreamFn, u as resolveMaxTokensParam } from "./openai-completions-transport-DITBEALX.mjs";
24
- import { a as googleFlashSupportsMinimalThinking, i as consumeGoogleGenerateContentStream, n as projectGoogleMessages, r as requiresGoogleToolCallId, t as convertGoogleTools } from "./google-messages-Bmheetdg.mjs";
25
- import { r as resolveProviderTransportTurnState, t as filterProviderTurnHeadersForExplicitOpencodeSession } from "./provider-transport-turn-state-8c_Nj2NS.mjs";
26
- import { i as getFirstStreamEventTimeoutMs, r as getFirstStreamEventTimeoutHandler, t as createFirstStreamEventAbortController } from "./stream-first-event-timeout-D9ZmL_s9.mjs";
27
- import { a as applyOpenAIResponsesPayloadPolicy, c as resolveOpenAIResponsesServerCompactionPlan, i as sanitizeResponsesImagePayload, n as isOpenAIResponsesCompactionOutput, o as resolveOpenAIResponsesCompactEndpointPlan, s as resolveOpenAIResponsesPayloadPolicy, t as createBoundedOpenAIResponsesCompactionFetch } from "./openai-responses-compaction-window-m878aVpU.mjs";
28
- import { $ as OPENAI_RESPONSES_FUNCTION_CALL_ITEM_ID_RE, A as recordResponsesContextUsage, B as recordResponsesContinuationState, C as resolveAzureOpenAIApiVersion, D as safeDebugValue, E as logResponsesFailedNoDetails, F as convertResponsesMessages, G as replayResponsesReasoningUpdates, H as responsesContinuationPrefixFingerprint, I as readResponsesInputReplayState, J as buildOpenAIResponsesReasoningReplayMetadata, K as supportsResponsesReasoningUpdate, L as recordResponsesInputReplay, N as buildResponsesInputMessage, O as summarizeOpenAITransportError, Q as OPENAI_RESPONSES_CALL_ID_RE, R as responsesInputFingerprint, S as isInvalidEncryptedContentError, T as ResponsesStreamFailure, U as responsesContinuationRequestFingerprint, V as resolveResponsesContinuationRequest, W as isConfigurationUpdate, X as resolveNewestOpenAIResponsesCompactionReplay, Y as captureOpenAIResponsesCompaction, Z as suppressOpenAIResponsesCompaction, a as prepareResponsesTools, c as observeResponsesStream, et as OPENAI_RESPONSES_ID_MAX_LENGTH, it as resolveReplayableResponsesMessageId, j as resolveResponsesContextUsageBoundary, k as summarizeResponsesPayload, n as applyResponsesServiceTierPricing, nt as shouldNormalizeOpenAIResponsesToolCallId, q as CompactionReplayRefreshRequiredError, rt as splitOpenAIFunctionCallPairing, s as processResponsesStream, tt as normalizeOpenAIResponsesFunctionCallId, w as resolveNextResponsesEncryptedContentAttempt, x as createResponsesStreamWithEncryptedContentRetry, z as claimOpenAIResponsesHttpContinuation } from "./openai-responses-shared-TCJRAoMW.mjs";
29
- import { i as resolveAzureDeploymentNameFromMap, t as isOpenAICompatibleAzureResponsesBaseUrl } from "./azure-openai-responses-client-compat-D0dvJMbZ.mjs";
30
- import { t as hasResponsesWebSearchTool } from "./openai-web-search-tools-Cfu0uLyN.mjs";
31
- import { t as createResponsesPromptEgressObserver } from "./openai-responses-prompt-observer-internal-CbH84xIS.mjs";
32
- import { n as withResponsesRequestAcceptance, t as responsesRequestLifecycle } from "./openai-responses-request-lifecycle-Fsag-IGZ.mjs";
19
+ import { a as requestPreparedOpenAIResponsesCompaction, d as applyCompletionsAnthropicCacheControl, f as hasOpenAICompatibleConversationTurn, h as createDeepSeekTextFilter, i as createOpenAIResponsesTransportStreamFn, l as flattenCompletionMessagesToStringContent, m as resolveMaxTokensParam, p as canonicalizeMaxTokensParam, r as createAzureOpenAIResponsesTransportStreamFn, s as buildOpenAICompletionsParams, t as createOpenAICompletionsTransportStreamFn, u as stripCompletionMessagesToRoleContent } from "./openai-completions-transport-OMrn7gnZ.mjs";
20
+ import { a as googleFlashSupportsMinimalThinking, i as consumeGoogleGenerateContentStream, n as projectGoogleMessages, r as requiresGoogleToolCallId, t as convertGoogleTools } from "./google-messages-C-RZzloH.mjs";
21
+ import { c as resolveOpenAIResponsesCompactEndpointPlan, l as resolveOpenAIResponsesPayloadPolicy, o as sanitizeResponsesImagePayload, s as applyOpenAIResponsesPayloadPolicy, u as resolveOpenAIResponsesServerCompactionPlan } from "./openai-responses-endpoint-CinGh4VZ.mjs";
33
22
  import { randomUUID } from "node:crypto";
34
- import OpenAI, { AzureOpenAI } from "openai";
35
- import { ResponsesWS } from "openai/resources/responses/ws.js";
36
23
  //#region packages/ai/src/transports/anthropic-transport-stream.ts
37
24
  const ANTHROPIC_MESSAGES_ERROR_BODY_MAX_BYTES = 8192;
38
25
  const ANTHROPIC_MESSAGES_ERROR_BODY_MAX_CHARS = 400;
@@ -99,8 +86,7 @@ function parseAnthropicSseEventData(data) {
99
86
  try {
100
87
  return JSON.parse(data);
101
88
  } catch (error) {
102
- if (error instanceof SyntaxError) throw new Error(MALFORMED_STREAMING_FRAGMENT_ERROR_MESSAGE, { cause: error });
103
- throw error;
89
+ throw streamFragmentError(error);
104
90
  }
105
91
  }
106
92
  function assertAnthropicSsePendingBufferWithinLimit(pendingChars) {
@@ -143,28 +129,6 @@ async function* parseAnthropicSseBody(body, signal) {
143
129
  reader.releaseLock();
144
130
  }
145
131
  }
146
- function createAnthropicMessageRequest(params) {
147
- const url = resolveAnthropicMessagesUrl(params.baseURL);
148
- return async (body, options) => {
149
- const headers = new Headers(mergeTransportHeaders({
150
- "content-type": "application/json",
151
- "anthropic-version": "2023-06-01",
152
- ...params.apiKey ? { "x-api-key": params.apiKey } : {},
153
- ...params.authToken ? { authorization: `Bearer ${params.authToken}` } : {}
154
- }, params.defaultHeaders));
155
- for (const [name, value] of Object.entries(options?.headers ?? {})) headers.set(name, value);
156
- const response = await params.fetch(url, {
157
- method: "POST",
158
- headers,
159
- body: JSON.stringify(body),
160
- signal: options?.signal
161
- });
162
- return {
163
- response,
164
- stream: response.body ? parseAnthropicSseBody(response.body, options?.signal) : []
165
- };
166
- };
167
- }
168
132
  async function readAnthropicMessagesErrorBody(response) {
169
133
  try {
170
134
  const text = await readResponseTextSnippet(response, {
@@ -190,61 +154,62 @@ function createAnthropicTransportClient(params) {
190
154
  const needsInterleavedBeta = (options?.interleavedThinking ?? true) && !supportsClaudeAdaptiveThinking(model);
191
155
  const fetch = isKimiAnthropicProvider(model.provider) && options?.thinkingEnabled === true ? buildGuardedModelFetch(model, void 0, { sanitizeSse: false }) : buildGuardedModelFetch(model);
192
156
  const copilot = model.provider === "github-copilot";
193
- if (copilot || usesFoundryBearerAuth(resolveModelHeaderSentinels(model))) {
194
- const betaFeatures = needsInterleavedBeta ? ["interleaved-thinking-2025-05-14"] : [];
195
- return {
196
- request: createAnthropicMessageRequest({
197
- apiKey: null,
198
- authToken: apiKey,
199
- baseURL: model.baseUrl,
200
- defaultHeaders: mergeTransportHeaders({
201
- accept: "application/json",
202
- "anthropic-dangerous-direct-browser-access": "true",
203
- ...betaFeatures.length > 0 ? { "anthropic-beta": betaFeatures.join(",") } : {}
204
- }, copilot ? model.headers : omitFoundryBearerCredentialHeaders(model.headers), copilot ? getAiTransportHost().buildCopilotDynamicHeaders(context.messages) : void 0, optionHeaders),
205
- fetch
206
- }),
207
- isOAuthToken: false
208
- };
209
- }
210
- const betaFeatures = ["fine-grained-tool-streaming-2025-05-14"];
211
- if (needsInterleavedBeta) betaFeatures.push("interleaved-thinking-2025-05-14");
212
- if (isAnthropicOAuthApiKey(apiKey)) {
213
- const betaHeader = buildAnthropicBetaHeader(model, betaFeatures, { oauth: true });
214
- const identity = buildAnthropicClaudeCodeIdentity(betaHeader, model.headers, optionHeaders);
215
- return {
216
- request: createAnthropicMessageRequest({
217
- apiKey: null,
218
- authToken: apiKey,
219
- baseURL: model.baseUrl,
220
- defaultHeaders: identity.headers,
221
- fetch
222
- }),
223
- isOAuthToken: true,
224
- claudeCodeVersion: identity.version
225
- };
226
- }
227
- const betaHeader = buildAnthropicBetaHeader(model, betaFeatures, { oauth: false });
228
- const defaultHeaders = mergeTransportHeaders({
157
+ const bearerAuth = copilot || usesFoundryBearerAuth(resolveModelHeaderSentinels(model));
158
+ const isOAuthToken = !bearerAuth && isAnthropicOAuthApiKey(apiKey);
159
+ let defaultHeaders;
160
+ let claudeCodeVersion;
161
+ let directApiKeyBetaHeader;
162
+ if (bearerAuth) defaultHeaders = mergeTransportHeaders({
229
163
  accept: "application/json",
230
164
  "anthropic-dangerous-direct-browser-access": "true",
231
- ...betaHeader ? { "anthropic-beta": betaHeader } : {},
232
- ...options?.sessionId && options.cacheRetention !== "none" && model.compat?.sendSessionAffinityHeaders === true ? { "x-session-affinity": options.sessionId } : {}
233
- }, model.headers, optionHeaders, getAiTransportHost().resolveProviderRequestHeaders({
234
- provider: model.provider,
235
- api: model.api,
236
- baseUrl: model.baseUrl,
237
- model
238
- }));
165
+ ...needsInterleavedBeta ? { "anthropic-beta": "interleaved-thinking-2025-05-14" } : {}
166
+ }, copilot ? model.headers : omitFoundryBearerCredentialHeaders(model.headers), copilot ? getAiTransportHost().buildCopilotDynamicHeaders(context.messages) : void 0, optionHeaders);
167
+ else {
168
+ const betaFeatures = ["fine-grained-tool-streaming-2025-05-14"];
169
+ if (needsInterleavedBeta) betaFeatures.push("interleaved-thinking-2025-05-14");
170
+ const betaHeader = buildAnthropicBetaHeader(model, betaFeatures, { oauth: isOAuthToken });
171
+ if (isOAuthToken) {
172
+ const identity = buildAnthropicClaudeCodeIdentity(betaHeader, model.headers, optionHeaders);
173
+ defaultHeaders = identity.headers;
174
+ claudeCodeVersion = identity.version;
175
+ } else {
176
+ defaultHeaders = mergeTransportHeaders({
177
+ accept: "application/json",
178
+ "anthropic-dangerous-direct-browser-access": "true",
179
+ ...betaHeader ? { "anthropic-beta": betaHeader } : {},
180
+ ...options?.sessionId && options.cacheRetention !== "none" && model.compat?.sendSessionAffinityHeaders === true ? { "x-session-affinity": options.sessionId } : {}
181
+ }, model.headers, optionHeaders, getAiTransportHost().resolveProviderRequestHeaders({
182
+ provider: model.provider,
183
+ api: model.api,
184
+ baseUrl: model.baseUrl,
185
+ model
186
+ }));
187
+ directApiKeyBetaHeader = isDirectAnthropicModel(model) ? new Headers(defaultHeaders).get("anthropic-beta") ?? "" : void 0;
188
+ }
189
+ }
190
+ const url = resolveAnthropicMessagesUrl(model.baseUrl);
239
191
  return {
240
- request: createAnthropicMessageRequest({
241
- apiKey,
242
- baseURL: model.baseUrl,
243
- defaultHeaders,
244
- fetch
245
- }),
246
- isOAuthToken: false,
247
- directApiKeyBetaHeader: isDirectAnthropicModel(model) ? new Headers(defaultHeaders).get("anthropic-beta") ?? "" : void 0
192
+ isOAuthToken,
193
+ claudeCodeVersion,
194
+ directApiKeyBetaHeader,
195
+ async request(body, requestOptions) {
196
+ const headers = new Headers(mergeTransportHeaders({
197
+ "content-type": "application/json",
198
+ "anthropic-version": "2023-06-01",
199
+ ...bearerAuth || isOAuthToken ? { authorization: `Bearer ${apiKey}` } : { "x-api-key": apiKey }
200
+ }, defaultHeaders));
201
+ for (const [name, value] of Object.entries(requestOptions?.headers ?? {})) headers.set(name, value);
202
+ const response = await fetch(url, {
203
+ method: "POST",
204
+ headers,
205
+ body: JSON.stringify(body),
206
+ signal: requestOptions?.signal
207
+ });
208
+ return {
209
+ response,
210
+ stream: response.body ? parseAnthropicSseBody(response.body, requestOptions?.signal) : []
211
+ };
212
+ }
248
213
  };
249
214
  }
250
215
  /** Create the stream function used by Anthropic Messages transport models. */
@@ -327,1132 +292,6 @@ function createAnthropicMessagesTransportStreamFn() {
327
292
  };
328
293
  }
329
294
  //#endregion
330
- //#region packages/ai/src/transports/openai-responses-params-internal.ts
331
- const OPENAI_RESPONSES_TOOL_CALL_PROVIDERS = /* @__PURE__ */ new Set([
332
- "openai",
333
- "opencode",
334
- "azure-openai-responses",
335
- "github-copilot"
336
- ]);
337
- function raiseMinimalReasoningForResponsesWebSearch(params) {
338
- if (params.effort !== "minimal" || !hasResponsesWebSearchTool(params.tools)) return params.effort;
339
- for (const effort of [
340
- "low",
341
- "medium",
342
- "high"
343
- ]) {
344
- const resolved = resolveOpenAIRequestReasoning(params.model, effort).effort;
345
- if (resolved && resolved !== "none" && resolved !== "minimal") return resolved;
346
- }
347
- return params.effort;
348
- }
349
- const OPENAI_CODEX_RESPONSES_UNSUPPORTED_PARAMS = [
350
- "max_output_tokens",
351
- "metadata",
352
- "prompt_cache_retention",
353
- "prompt_cache_options",
354
- "service_tier",
355
- "temperature",
356
- "top_p"
357
- ];
358
- function stripOpenAICodexResponsesUnsupportedTextFields(params) {
359
- const text = params.text;
360
- if (!text || typeof text !== "object" || Array.isArray(text)) return;
361
- const sanitizedText = { ...text };
362
- delete sanitizedText.format;
363
- if (Object.keys(sanitizedText).length > 0) params.text = sanitizedText;
364
- else delete params.text;
365
- }
366
- function sanitizeOpenAICodexResponsesParams(model, params) {
367
- if (!usesNativeOpenAICodexResponsesBackend(model)) return params;
368
- for (const key of OPENAI_CODEX_RESPONSES_UNSUPPORTED_PARAMS) delete params[key];
369
- Object.assign(params, { store: false });
370
- stripOpenAICodexResponsesUnsupportedTextFields(params);
371
- return params;
372
- }
373
- function buildOpenAIResponsesInstructionsText(context) {
374
- if (!context.systemPrompt) return;
375
- return sanitizeTransportPayloadText(stripSystemPromptCacheBoundary(context.systemPrompt));
376
- }
377
- function resolveOpenAIResponsesInstructions(model, context, usesInstructionsField) {
378
- if (!usesInstructionsField) return;
379
- const instructions = buildOpenAIResponsesInstructionsText(context);
380
- if (instructions && instructions.trim().length > 0) return instructions;
381
- return usesNativeOpenAICodexResponsesBackend(model) ? OPENAI_CODEX_RESPONSES_DEFAULT_INSTRUCTIONS : void 0;
382
- }
383
- function buildOpenAIResponsesCompactSystemMessage(model, instructions) {
384
- const compat = getCompat(model);
385
- const supportsDeveloperRole = typeof compat.supportsDeveloperRole === "boolean" ? compat.supportsDeveloperRole : void 0;
386
- const role = model.reasoning && supportsDeveloperRole !== false ? "developer" : "system";
387
- return buildResponsesInputMessage(role, [{
388
- type: "input_text",
389
- text: instructions
390
- }]);
391
- }
392
- function ensureOpenAIResponsesNonEmptyInput(messages, context) {
393
- if (messages.length > 0 || !context.systemPrompt) return;
394
- if (!buildOpenAIResponsesInstructionsText(context)) throw new Error("OpenAI Responses requires non-empty input when only systemPrompt is provided.");
395
- messages.push(buildResponsesInputMessage("user", [{
396
- type: "input_text",
397
- text: " "
398
- }]));
399
- }
400
- function buildOpenAIResponsesParams(model, context, options, metadata, replayMode = "checkpoint") {
401
- const payloadPolicy = resolveOpenAIResponsesPayloadPolicy(model, { storeMode: "transport-default" });
402
- const policyAllowsReplayIds = payloadPolicy.explicitStore !== false && !payloadPolicy.shouldStripStore;
403
- const replayResponsesItemIds = !usesNativeOpenAICodexResponsesBackend(model) && (options?.replayResponsesItemIds ?? policyAllowsReplayIds);
404
- const messages = convertResponsesMessages(model, context, OPENAI_RESPONSES_TOOL_CALL_PROVIDERS, {
405
- includeSystemPrompt: !payloadPolicy.usesInstructionsField,
406
- replayReasoningItems: true,
407
- replayResponsesItemIds,
408
- authProfileId: options?.authProfileId,
409
- sessionId: options?.sessionId,
410
- replayMode
411
- });
412
- ensureOpenAIResponsesNonEmptyInput(messages, context);
413
- const cacheRetention = resolveCacheRetention(options?.cacheRetention);
414
- const compat = getCompat(model);
415
- const promptCacheKey = compat.supportsPromptCacheKey ? resolvePromptCacheKey(options, cacheRetention) : void 0;
416
- const instructions = resolveOpenAIResponsesInstructions(model, context, payloadPolicy.usesInstructionsField);
417
- const params = {
418
- model: model.id,
419
- input: messages,
420
- stream: true,
421
- prompt_cache_key: promptCacheKey,
422
- ...resolveOpenAIPromptCacheParams(model, cacheRetention, compat),
423
- ...instructions ? { instructions } : {},
424
- ...metadata ? { metadata } : {}
425
- };
426
- const effectiveMaxTokens = options?.maxTokens || model.maxTokens;
427
- if (effectiveMaxTokens) params.max_output_tokens = Math.max(effectiveMaxTokens, 16);
428
- if (options?.temperature !== void 0 && supportsOpenAITemperature(model)) params.temperature = options.temperature;
429
- if (options?.topP !== void 0 && (!isOpenAIGpt6Model(model) || resolveOpenAIThinkingApi(model.api) === "azure-openai-responses")) params.top_p = options.topP;
430
- if (options?.responseFormat !== void 0) params.text = {
431
- ...params.text,
432
- format: resolveOpenAIResponsesTextFormat(options.responseFormat)
433
- };
434
- if (options?.serviceTier !== void 0 && payloadPolicy.allowsServiceTier) params.service_tier = options.serviceTier;
435
- if (context.tools) {
436
- const tools = context.tools;
437
- const strict = getAiTransportHost().resolveOpenAIStrictToolSetting(model, {
438
- transport: "stream",
439
- supportsStrictMode: compat.supportsStrictMode
440
- });
441
- const { projection, tools: converted } = prepareResponsesTools(tools, strict, model);
442
- if (converted.length > 0 || projection.inputToolCount === 0 && projection.diagnostics.length === 0) params.tools = converted;
443
- if (options?.toolChoice) {
444
- const toolChoice = reconcileOpenAIResponsesToolChoice(options.toolChoice, projection);
445
- if (toolChoice !== void 0) params.tool_choice = toolChoice;
446
- }
447
- }
448
- if (model.reasoning) {
449
- const reasoning = options?.reasoning;
450
- const requestedEffort = options?.reasoningEffort ?? (reasoning === "none" ? "none" : resolveOpenAISimpleReasoningEffort(model, reasoning)) ?? (options?.reasoningSummary ? "high" : payloadPolicy.defaultManagedReasoningEffort);
451
- const resolvedEffort = requestedEffort === void 0 ? void 0 : resolveOpenAIRequestReasoning(model, requestedEffort).effort;
452
- if (resolvedEffort !== void 0) {
453
- const effort = raiseMinimalReasoningForResponsesWebSearch({
454
- model,
455
- effort: resolvedEffort,
456
- tools: params.tools
457
- });
458
- const summary = effort !== "none" && (options?.reasoningEffort || options?.reasoning || options?.reasoningSummary) ? options.reasoningSummary || "auto" : void 0;
459
- params.reasoning = {
460
- effort,
461
- ...summary ? { summary } : {}
462
- };
463
- if (summary) params.include = ["reasoning.encrypted_content"];
464
- }
465
- }
466
- applyOpenAIResponsesPayloadPolicy(params, payloadPolicy);
467
- return sanitizeOpenAICodexResponsesParams(model, params);
468
- }
469
- //#endregion
470
- //#region packages/ai/src/transports/openai-responses-steering.ts
471
- function cloneWireRequest(request) {
472
- const serialized = JSON.stringify(request);
473
- return JSON.parse(serialized);
474
- }
475
- async function projectResponsesSteeringInput(request, project) {
476
- const { input: activeInput, ...activeSettings } = cloneWireRequest(request);
477
- if (!Array.isArray(activeInput)) return [];
478
- const { input, ...settings } = cloneWireRequest(await project());
479
- if (!Array.isArray(input) || stableStringify(settings) !== stableStringify(activeSettings) || stableStringify(input.slice(0, activeInput.length)) !== stableStringify(activeInput)) return [];
480
- const projected = input.slice(activeInput.length);
481
- return projected.every((item) => isRecord(item) && item.role === "user") ? projected : [];
482
- }
483
- /** One response owns admission; accepted input stays on this connection until continuation. */
484
- function createResponsesSteering(params) {
485
- let responseId;
486
- let sealed = false;
487
- let unsubscribe;
488
- const pending = [];
489
- const accepted = /* @__PURE__ */ new Map();
490
- const acknowledged = /* @__PURE__ */ new Set();
491
- const seal = () => {
492
- sealed = true;
493
- const cleanup = unsubscribe;
494
- unsubscribe = void 0;
495
- cleanup?.();
496
- };
497
- return {
498
- get responseId() {
499
- return responseId;
500
- },
501
- get pending() {
502
- return pending.length > 0;
503
- },
504
- get acceptedInput() {
505
- return [...accepted.values()].flat();
506
- },
507
- seal,
508
- close(error) {
509
- seal();
510
- for (const submission of pending.splice(0)) submission.reject(error);
511
- },
512
- handle(event) {
513
- if (!isRecord(event)) return false;
514
- if (event.type === "response.created" && !responseId && !sealed) {
515
- const response = isRecord(event.response) ? event.response : void 0;
516
- if (typeof response?.id !== "string" || !response.id.trim()) throw new Error("Responses steering requires a response identity");
517
- const activeResponseId = response.id;
518
- responseId = activeResponseId;
519
- const cleanup = params.onActiveResponse({
520
- needsContinuation: params.needsContinuation,
521
- steer(messages) {
522
- if (sealed || messages.length === 0) return Promise.resolve(false);
523
- params.assertActive();
524
- const converted = params.toInput(messages);
525
- const submit = (input) => {
526
- if (sealed || input.length === 0) return Promise.resolve(false);
527
- params.assertActive();
528
- return new Promise((resolve, reject) => {
529
- pending.push({
530
- input,
531
- resolve,
532
- reject
533
- });
534
- params.send({
535
- type: "response.steer",
536
- previous_response_id: activeResponseId,
537
- input
538
- });
539
- });
540
- };
541
- return Array.isArray(converted) ? submit(converted) : converted.then(submit);
542
- }
543
- });
544
- if (sealed) cleanup?.();
545
- else unsubscribe = cleanup;
546
- return false;
547
- }
548
- if (event.type !== "response.steer.accepted" && event.type !== "response.steer.failed" && event.type !== "response.steer.pending") return false;
549
- const steer = isRecord(event.steer) ? event.steer : void 0;
550
- if (!responseId || steer?.previous_response_id !== responseId) throw new Error("Responses steering acknowledgement has an unexpected identity");
551
- if (event.type === "response.steer.failed" && steer.id === void 0) {
552
- const index = pending.findIndex((submission) => stableStringify(submission.input) === stableStringify(steer.input));
553
- const submission = pending[index];
554
- if (!submission) throw new Error("Responses steering acknowledgement has no pending submission");
555
- pending.splice(index, 1);
556
- submission.resolve(false);
557
- return true;
558
- }
559
- if (typeof steer.id !== "string" || !steer.id.trim()) throw new Error("Responses steering acknowledgement has an unexpected identity");
560
- if (event.type === "response.steer.pending") {
561
- if (!accepted.has(steer.id)) throw new Error("Responses steering pending event has no accepted submission");
562
- return true;
563
- }
564
- if (event.type === "response.steer.failed" && accepted.has(steer.id)) throw new Error("OpenAI could not apply accepted steering; the queued message remains in the conversation");
565
- if (acknowledged.has(steer.id)) throw new Error("Responses steering acknowledgement was already applied");
566
- const submission = pending.shift();
567
- if (!submission) throw new Error("Responses steering acknowledgement has no pending submission");
568
- acknowledged.add(steer.id);
569
- if (event.type === "response.steer.accepted") {
570
- accepted.set(steer.id, submission.input);
571
- submission.resolve(true);
572
- } else submission.resolve(false);
573
- return true;
574
- }
575
- };
576
- }
577
- /** Accepted steering is prepended by the server, so never repeat it in response.create. */
578
- function omitAcceptedSteering(input, accepted) {
579
- const remaining = [...input];
580
- for (const message of accepted) {
581
- const index = remaining.findIndex((item) => stableStringify(item) === stableStringify(message));
582
- if (index < 0) throw new Error("Responses steering continuation no longer contains the accepted user input");
583
- remaining.splice(index, 1);
584
- }
585
- return remaining;
586
- }
587
- //#endregion
588
- //#region packages/ai/src/transports/openai-responses-websocket.ts
589
- const SESSION_WEBSOCKET_CACHE_TTL_MS = 3e5;
590
- const SESSION_WEBSOCKET_MAX_AGE_MS = 33e5;
591
- const WEBSOCKET_OPEN_STATE = 1;
592
- const websocketSessionCache = /* @__PURE__ */ new Map();
593
- const degradedWebSocketConnections = /* @__PURE__ */ new Map();
594
- function isOfficialOpenAIResponsesBaseUrl(baseUrl) {
595
- if (!baseUrl) return false;
596
- const url = URL.parse(baseUrl);
597
- return url !== null && url.origin === "https://api.openai.com" && url.username === "" && url.password === "" && url.search === "" && url.hash === "" && url.pathname.replace(/\/+$/, "") === "/v1";
598
- }
599
- function supportsNativeOpenAIResponsesEndpoint(params) {
600
- return params.provider.trim().toLowerCase() === "openai" && params.api === "openai-responses" && isOfficialOpenAIResponsesBaseUrl(params.baseUrl);
601
- }
602
- function closeWebSocketSilently(socket, reason = "done") {
603
- try {
604
- socket.close({
605
- code: 1e3,
606
- reason
607
- });
608
- } catch {}
609
- }
610
- function invalidateOwnedWebSocketSession(cacheKey, entry, reason = "done") {
611
- if (entry.idleTimer) {
612
- clearTimeout(entry.idleTimer);
613
- entry.idleTimer = void 0;
614
- }
615
- closeWebSocketSilently(entry.socket, reason);
616
- entry.steeringContinuation?.steering.close(/* @__PURE__ */ new Error("Responses steering connection closed"));
617
- entry.steeringContinuation?.iterator.return?.().catch(() => void 0);
618
- entry.steeringContinuation = void 0;
619
- if (websocketSessionCache.get(cacheKey) === entry) websocketSessionCache.delete(cacheKey);
620
- }
621
- function scheduleSessionWebSocketExpiry(cacheKey, entry) {
622
- if (entry.idleTimer) clearTimeout(entry.idleTimer);
623
- entry.idleTimer = setTimeout(() => {
624
- if (entry.busy) return;
625
- invalidateOwnedWebSocketSession(cacheKey, entry, "idle_timeout");
626
- }, SESSION_WEBSOCKET_CACHE_TTL_MS);
627
- entry.idleTimer.unref?.();
628
- }
629
- function prepareWebSocketConnection(client, headers) {
630
- if (!isOfficialOpenAIResponsesBaseUrl(client.baseURL)) throw new Error("OpenAI Responses WebSocket requires the official API endpoint");
631
- if (typeof client.apiKey !== "string" || client.apiKey.length === 0) throw new Error("OpenAI Responses WebSocket requires an API key");
632
- const owner = getAiTransportHost();
633
- const resolvedApiKey = owner.resolveSecretSentinel(client.apiKey);
634
- const resolvedHeaders = { ...resolveAiTransportHeaderSentinels(headers) };
635
- for (const key of Object.keys(resolvedHeaders)) {
636
- const normalizedKey = key.toLowerCase();
637
- if (normalizedKey === "authorization" || normalizedKey === "traceparent") delete resolvedHeaders[key];
638
- }
639
- if (!resolvedApiKey) throw new Error("OpenAI Responses WebSocket requires a resolved API key");
640
- return {
641
- client: client.withOptions({ apiKey: resolvedApiKey }),
642
- headers: resolvedHeaders,
643
- owner,
644
- ownerId: getSessionResourceOwnerId(owner),
645
- identity: sha256Hex(JSON.stringify([
646
- resolvedApiKey,
647
- client.baseURL,
648
- Object.entries(resolvedHeaders).toSorted(([a], [b]) => a.localeCompare(b))
649
- ]))
650
- };
651
- }
652
- function createWebSocket(connection, onError) {
653
- const socket = new ResponsesWS(connection.client, {
654
- headers: connection.headers,
655
- maxQueueSize: 1
656
- });
657
- socket.on("error", () => onError(socket));
658
- return socket;
659
- }
660
- function createTransientWebSocketLease(connection) {
661
- const socket = createWebSocket(connection, (failedSocket) => closeWebSocketSilently(failedSocket, "transport_error"));
662
- return {
663
- socket,
664
- iterator: socket.stream(),
665
- reusedConnection: false,
666
- release: () => closeWebSocketSilently(socket)
667
- };
668
- }
669
- function createCachedWebSocketLease(cacheKey, entry, reusedConnection) {
670
- entry.busy = true;
671
- const steeringContinuation = entry.steeringContinuation;
672
- entry.steeringContinuation = void 0;
673
- return {
674
- socket: entry.socket,
675
- iterator: steeringContinuation?.iterator ?? entry.socket.stream(),
676
- entry,
677
- reusedConnection,
678
- steeringContinuation,
679
- release: ({ keep } = {}) => {
680
- if (!keep || entry.socket.socket.readyState !== WEBSOCKET_OPEN_STATE) {
681
- invalidateOwnedWebSocketSession(cacheKey, entry);
682
- return;
683
- }
684
- entry.busy = false;
685
- scheduleSessionWebSocketExpiry(cacheKey, entry);
686
- }
687
- };
688
- }
689
- function acquireWebSocket(params, connection) {
690
- if (!(params.mode !== "websocket" && Boolean(params.sessionId)) || !params.sessionId) return createTransientWebSocketLease(connection);
691
- const cacheKey = `${connection.ownerId}\0${params.sessionId}\0${connection.identity}`;
692
- const cached = websocketSessionCache.get(cacheKey);
693
- if (cached) {
694
- if (cached.idleTimer) {
695
- clearTimeout(cached.idleTimer);
696
- cached.idleTimer = void 0;
697
- }
698
- if (cached.busy) return createTransientWebSocketLease(connection);
699
- const expired = Date.now() - cached.createdAt >= SESSION_WEBSOCKET_MAX_AGE_MS;
700
- if (!expired && cached.socket.socket.readyState === WEBSOCKET_OPEN_STATE) return createCachedWebSocketLease(cacheKey, cached, true);
701
- invalidateOwnedWebSocketSession(cacheKey, cached, expired ? "connection_age_limit" : "done");
702
- }
703
- const entry = {
704
- socket: createWebSocket(connection, (failedSocket) => {
705
- const failedEntry = websocketSessionCache.get(cacheKey);
706
- if (failedEntry?.socket === failedSocket) invalidateOwnedWebSocketSession(cacheKey, failedEntry, "transport_error");
707
- else closeWebSocketSilently(failedSocket, "transport_error");
708
- }),
709
- sessionId: params.sessionId,
710
- owner: connection.owner,
711
- busy: true,
712
- createdAt: Date.now()
713
- };
714
- websocketSessionCache.set(cacheKey, entry);
715
- return createCachedWebSocketLease(cacheKey, entry, false);
716
- }
717
- function sanitizeWebSocketRequest(request) {
718
- const { stream: _stream, background: _background, ...websocketRequest } = request;
719
- return websocketRequest;
720
- }
721
- async function nextWebSocketMessage(iterator, signal) {
722
- if (signal?.aborted) throw transportAbortError(signal);
723
- return await racePromiseWithAbortSignal(iterator.next(), signal, transportAbortError);
724
- }
725
- function readServerEvent(message) {
726
- if (message.type === "message") return message.message;
727
- if (message.type === "error") throw parseOpenAIResponsesWebSocketServerError(message.error) ?? new Error("OpenAI Responses WebSocket transport failed", { cause: message.error });
728
- if (message.type === "close") throw new Error(`OpenAI Responses WebSocket closed before completion (code ${message.code})`);
729
- }
730
- function createOpenAIResponsesWebSocketStream(params) {
731
- const connection = prepareWebSocketConnection(params.client, params.headers);
732
- let fullRequest = sanitizeWebSocketRequest(params.request);
733
- const requestModel = typeof fullRequest.model === "string" ? fullRequest.model : "";
734
- const degradationKey = `${connection.ownerId}\0${params.sessionId ?? ""}\0${connection.identity}\0${requestModel}`;
735
- const degraded = degradedWebSocketConnections.get(degradationKey);
736
- if (degraded && degraded.retryAt > Date.now()) throw new OpenAIResponsesWebSocketPreDispatchError(/* @__PURE__ */ new Error("OpenAI Responses WebSocket is cooling down after a transport failure"));
737
- if (degraded) clearTimeout(degraded.expiryTimer);
738
- degradedWebSocketConnections.delete(degradationKey);
739
- const markDegraded = () => {
740
- const cooldownMs = params.degradeCooldownMs;
741
- if (cooldownMs === void 0 || !Number.isFinite(cooldownMs) || cooldownMs <= 0) return;
742
- const entry = {
743
- sessionId: params.sessionId,
744
- owner: connection.owner,
745
- retryAt: Date.now() + cooldownMs,
746
- expiryTimer: setTimeout(() => {
747
- if (degradedWebSocketConnections.get(degradationKey) === entry) degradedWebSocketConnections.delete(degradationKey);
748
- }, cooldownMs)
749
- };
750
- entry.expiryTimer.unref?.();
751
- degradedWebSocketConnections.set(degradationKey, entry);
752
- };
753
- let lease;
754
- try {
755
- lease = acquireWebSocket(params, connection);
756
- } catch (error) {
757
- markDegraded();
758
- throw new OpenAIResponsesWebSocketPreDispatchError(error);
759
- }
760
- let prepared;
761
- let previousContinuation;
762
- const resumedSteering = lease.steeringContinuation;
763
- const steeringMode = resumedSteering ? resumedSteering.requiresInput ? "required-input" : "automatic" : void 0;
764
- try {
765
- const continuation = previousContinuation = lease.entry?.continuation;
766
- if (continuation && lease.entry) {
767
- lease.entry.continuation = void 0;
768
- prepared = resolveResponsesContinuationRequest(continuation, fullRequest, steeringMode);
769
- } else {
770
- fullRequest = params.restoreRequest?.(fullRequest) ?? fullRequest;
771
- prepared = {
772
- request: fullRequest,
773
- continuationStatus: lease.entry ? "no_previous_response" : "socket_not_cached"
774
- };
775
- }
776
- } catch (error) {
777
- lease.iterator.return?.().catch(() => void 0);
778
- lease.release({ keep: false });
779
- throw error;
780
- }
781
- let streamStarted = false;
782
- let terminalResponse;
783
- let terminalReceived = false;
784
- let released = false;
785
- let retainIterator = false;
786
- let deferredInput = false;
787
- let inputReplay;
788
- if (resumedSteering) try {
789
- if (prepared.continuationStatus !== "continued" || !prepared.request.previous_response_id) throw new Error("Responses steering continuation changed its request or history");
790
- const input = omitAcceptedSteering(prepared.request.input ?? [], resumedSteering.acceptedInput);
791
- if (!resumedSteering.requiresInput && (stableStringify(fullRequest.instructions) !== stableStringify(resumedSteering.instructions) || stableStringify(fullRequest.tools) !== stableStringify(resumedSteering.tools))) throw new Error("Responses automatic steering continuation cannot change instructions or tools");
792
- const baseline = prepared.fullRequest ?? fullRequest;
793
- const priorLength = (baseline.input?.length ?? 0) - (prepared.request.input?.length ?? 0);
794
- const fingerprints = input.map(responsesInputFingerprint);
795
- if (fingerprints.length > 0) inputReplay = {
796
- afterResponseId: prepared.request.previous_response_id,
797
- before: resumedSteering.requiresInput ? fingerprints : [],
798
- after: resumedSteering.requiresInput ? [] : fingerprints
799
- };
800
- const delivered = resumedSteering.requiresInput ? input : [];
801
- prepared.fullRequest = {
802
- ...baseline,
803
- input: [
804
- ...(baseline.input ?? []).slice(0, priorLength),
805
- ...resumedSteering.acceptedInput,
806
- ...delivered
807
- ]
808
- };
809
- prepared.request = {
810
- ...prepared.request,
811
- input: delivered
812
- };
813
- deferredInput = !resumedSteering.requiresInput && input.length > 0;
814
- } catch (error) {
815
- lease.iterator.return?.().catch(() => void 0);
816
- lease.release({ keep: false });
817
- throw new OpenAIResponsesWebSocketPostDispatchError(error);
818
- }
819
- const steering = lease.entry && params.onActiveResponse && params.steeringInput ? createResponsesSteering({
820
- onActiveResponse: params.onActiveResponse,
821
- toInput: params.steeringInput,
822
- send: (event) => lease.socket.sendRaw(JSON.stringify(event)),
823
- needsContinuation: () => deferredInput,
824
- assertActive: () => {
825
- if (released || terminalReceived || params.signal?.aborted) throw new Error("Responses steering is no longer active");
826
- }
827
- }) : void 0;
828
- const finish = ({ keep = true } = {}) => {
829
- if (released) return;
830
- released = true;
831
- if (keep && lease.entry && terminalResponse) lease.entry.continuation = recordResponsesContinuationState(previousContinuation, prepared.fullRequest ?? fullRequest, terminalResponse, previousContinuation?.lastResponseId === prepared.request.previous_response_id);
832
- lease.release({ keep });
833
- };
834
- return {
835
- stream: { async *[Symbol.asyncIterator]() {
836
- if (streamStarted) throw new Error("OpenAI Responses WebSocket stream can only be consumed once");
837
- streamStarted = true;
838
- const iterator = lease.iterator;
839
- let requestDispatched = false;
840
- try {
841
- if (params.signal?.aborted) throw transportAbortError(params.signal);
842
- if (resumedSteering) {
843
- requestDispatched = true;
844
- if (resumedSteering.requiresInput) lease.socket.send({
845
- ...prepared.request,
846
- type: "response.create"
847
- });
848
- }
849
- for (;;) {
850
- const buffered = resumedSteering?.buffered.shift();
851
- const next = buffered ? {
852
- value: buffered,
853
- done: false
854
- } : await nextWebSocketMessage(iterator, params.signal);
855
- if (next.done) throw new Error("OpenAI Responses WebSocket closed before a terminal response event");
856
- if (next.value.type === "open") {
857
- if (!requestDispatched) {
858
- requestDispatched = true;
859
- lease.socket.send({
860
- ...prepared.request,
861
- type: "response.create"
862
- });
863
- }
864
- continue;
865
- }
866
- const event = readServerEvent(next.value);
867
- if (!event) continue;
868
- if (isRecord(event) && typeof event.type === "string" && event.type.startsWith("response.steer.")) {
869
- if ((isRecord(event.steer) && event.steer.previous_response_id === steering?.responseId ? steering : resumedSteering?.steering ?? steering)?.handle(event)) continue;
870
- }
871
- steering?.handle(event);
872
- if (event.type === "response.completed") terminalResponse = event.response;
873
- terminalReceived = event.type === "response.completed" || event.type === "response.incomplete" || event.type === "response.failed";
874
- if (terminalReceived) {
875
- steering?.seal();
876
- if (event.type === "response.failed") steering?.close(/* @__PURE__ */ new Error("Responses failed before steering could be applied"));
877
- const continuationBuffer = [];
878
- for (;;) {
879
- if (!steering?.pending) break;
880
- const acknowledgement = await nextWebSocketMessage(iterator, params.signal);
881
- if (acknowledgement.done) throw new Error("Responses closed before acknowledging steering");
882
- const acknowledgedEvent = readServerEvent(acknowledgement.value);
883
- if (!steering.handle(acknowledgedEvent)) continuationBuffer.push(acknowledgement.value);
884
- }
885
- const acceptedInput = steering?.acceptedInput ?? [];
886
- const isSteered = event.type === "response.incomplete" && isRecord(event.response.incomplete_details) && event.response.incomplete_details.reason === "steered";
887
- if (lease.entry && steering && acceptedInput.length > 0 && (event.type === "response.completed" || isSteered)) {
888
- if (event.type === "response.incomplete") terminalResponse = event.response;
889
- lease.entry.steeringContinuation = {
890
- iterator,
891
- buffered: continuationBuffer,
892
- acceptedInput,
893
- requiresInput: (terminalResponse?.output ?? []).some((item) => (item.type === "function_call" || item.type === "custom_tool_call") && !(isRecord(item) && item.async === true) || item.type === "mcp_approval_request"),
894
- steering,
895
- instructions: fullRequest.instructions,
896
- tools: fullRequest.tools
897
- };
898
- retainIterator = true;
899
- if (isSteered) {
900
- yield {
901
- ...event,
902
- type: "response.completed",
903
- response: {
904
- ...event.response,
905
- status: "completed",
906
- incomplete_details: null
907
- }
908
- };
909
- return;
910
- }
911
- }
912
- }
913
- yield event;
914
- if (terminalReceived) {
915
- degradedWebSocketConnections.delete(degradationKey);
916
- return;
917
- }
918
- }
919
- } catch (error) {
920
- const steeringDispatched = Boolean(steering?.pending || steering?.acceptedInput.length || resumedSteering);
921
- steering?.close(error instanceof Error ? error : /* @__PURE__ */ new Error("Responses steering failed"));
922
- if (lease.entry) lease.entry.continuation = void 0;
923
- const safeRetry = error instanceof OpenAIResponsesWebSocketSafeRetryError && !steeringDispatched;
924
- if (!params.callerSignal?.aborted && !safeRetry) markDegraded();
925
- if (!requestDispatched && !params.signal?.aborted) throw new OpenAIResponsesWebSocketPreDispatchError(error);
926
- if (!requestDispatched || params.callerSignal?.aborted || safeRetry) throw error;
927
- throw new OpenAIResponsesWebSocketPostDispatchError(error);
928
- } finally {
929
- steering?.seal();
930
- if (!retainIterator) {
931
- steering?.close(/* @__PURE__ */ new Error("Responses stream ended before steering was confirmed"));
932
- await iterator.return?.().catch(() => void 0);
933
- }
934
- if (!terminalReceived) finish({ keep: false });
935
- }
936
- } },
937
- request: prepared.request,
938
- fullRequest: prepared.fullRequest ?? fullRequest,
939
- reusedConnection: lease.reusedConnection,
940
- continuationStatus: prepared.continuationStatus,
941
- inputReplay,
942
- finish
943
- };
944
- }
945
- function closeOpenAIResponsesWebSocketSessions(sessionId, owner) {
946
- for (const [cacheKey, entry] of websocketSessionCache) {
947
- if (owner && entry.owner !== owner || sessionId && entry.sessionId !== sessionId) continue;
948
- invalidateOwnedWebSocketSession(cacheKey, entry, "session_cleanup");
949
- }
950
- for (const [key, entry] of degradedWebSocketConnections) if ((!owner || entry.owner === owner) && (!sessionId || entry.sessionId === sessionId)) {
951
- clearTimeout(entry.expiryTimer);
952
- degradedWebSocketConnections.delete(key);
953
- }
954
- }
955
- registerSessionResourceCleanup(closeOpenAIResponsesWebSocketSessions);
956
- //#endregion
957
- //#region packages/ai/src/transports/openai-responses-compact-client.ts
958
- async function postOpenAIResponsesCompaction(params) {
959
- const compactInput = typeof params.request.instructions === "string" && params.request.instructions.length > 0 ? [buildOpenAIResponsesCompactSystemMessage(params.model, params.request.instructions), ...params.request.input ?? []] : params.request.input;
960
- const response = await params.client.post("/responses/compact", {
961
- ...buildOpenAISdkRequestOptions(params.model, params.options?.signal, { timeoutMs: params.options?.timeoutMs }),
962
- body: {
963
- model: params.request.model,
964
- input: compactInput
965
- }
966
- });
967
- const output = isRecord(response) && Array.isArray(response.output) ? response.output : [];
968
- const item = output.at(-1);
969
- const retainedItems = output.slice(0, -1);
970
- const retainedUserMessageCount = retainedItems.filter((candidate) => isRecord(candidate) && candidate.type === "message" && candidate.role === "user" && Array.isArray(candidate.content)).length;
971
- const inputUserMessageCount = Array.isArray(params.request.input) ? params.request.input.filter((candidate) => isRecord(candidate) && candidate.type === "message" && candidate.role === "user").length : 0;
972
- const retainedMessagePrefixSupported = supportsNativeOpenAIResponsesEndpoint(params.model);
973
- const usage = isRecord(response) && isRecord(response.usage) ? response.usage : void 0;
974
- if (!isRecord(response) || response.object !== "response.compaction" || !isOpenAIResponsesCompactionOutput(output, params.model) || retainedItems.length > 0 && (!retainedMessagePrefixSupported || retainedUserMessageCount !== inputUserMessageCount) || !isRecord(item) || item.type !== "compaction" || typeof item.encrypted_content !== "string" || item.encrypted_content.length === 0 || !usage || typeof usage.input_tokens !== "number" || typeof usage.output_tokens !== "number") throw new Error("Responses compact endpoint did not return one trailing compaction item");
975
- return {
976
- output,
977
- item,
978
- historyMode: retainedUserMessageCount > 0 ? "retained-users" : "compacted-prefix",
979
- usage,
980
- model: params.model,
981
- replayMetadata: buildOpenAIResponsesReasoningReplayMetadata(params.model, {
982
- authProfileId: params.options?.authProfileId,
983
- sessionId: params.options?.sessionId
984
- })
985
- };
986
- }
987
- //#endregion
988
- //#region packages/ai/src/transports/openai-responses-compact-request.ts
989
- const COMPACT_REQUEST = Symbol("openaiResponsesCompactRequest");
990
- function claimResponsesCompactRequest(options) {
991
- const controller = options ? Reflect.get(options, COMPACT_REQUEST) : void 0;
992
- if (controller?.claimed === false) {
993
- controller.claimed = true;
994
- return controller;
995
- }
996
- }
997
- /** Run a compact-endpoint request through the session's prepared stream stack. */
998
- async function requestPreparedOpenAIResponsesCompaction(streamFn, model, context, options) {
999
- const preparedOptions = { ...options };
1000
- let resolveResult;
1001
- let rejectResult;
1002
- const result = new Promise((resolve, reject) => {
1003
- resolveResult = resolve;
1004
- rejectResult = reject;
1005
- });
1006
- const controller = {
1007
- claimed: false,
1008
- resolve: resolveResult,
1009
- reject: rejectResult
1010
- };
1011
- Reflect.set(preparedOptions, COMPACT_REQUEST, controller);
1012
- const stream = await Promise.resolve(streamFn(model, context, preparedOptions));
1013
- if (!controller.claimed) throw new Error("Prepared stream did not reach an OpenAI Responses transport");
1014
- try {
1015
- return await result;
1016
- } finally {
1017
- await stream.result().catch(() => void 0);
1018
- }
1019
- }
1020
- //#endregion
1021
- //#region packages/ai/src/transports/openai-responses-reasoning-state.ts
1022
- /** Save only admitted settings and hashes, never another copy of the conversation. */
1023
- function recordResponsesReasoningState(message, model, identity, request, output) {
1024
- if (!supportsResponsesReasoningUpdate(request) || !isRecord(request.reasoning) || !request.input || request.previous_response_id || message.providerReplay || output.some((item) => isRecord(item) && item.type === "compaction")) return;
1025
- const reasoning = {
1026
- ...buildProviderReplayContext(model, identity),
1027
- effort: request.reasoning.effort,
1028
- controls: request.input.flatMap((item, index) => isConfigurationUpdate(item) ? [{
1029
- index,
1030
- item
1031
- }] : []),
1032
- inputLength: request.input.length,
1033
- outputLength: output.length,
1034
- prefixHash: responsesContinuationPrefixFingerprint(request.input, output),
1035
- requestHash: responsesContinuationRequestFingerprint(request)
1036
- };
1037
- Object.assign(message, { openclawResponsesInputReplay: {
1038
- ...readResponsesInputReplayState(message),
1039
- reasoning
1040
- } });
1041
- }
1042
- /** A cold transport can replay controls, but cannot resurrect a server response handle. */
1043
- function restoreResponsesReasoningState(context, model, identity, request) {
1044
- const latest = context.messages.findLast((message) => message.role === "assistant");
1045
- const state = latest ? readResponsesInputReplayState(latest)?.reasoning : void 0;
1046
- if (!isRecord(state)) return request;
1047
- const { effort, inputLength, outputLength, controls, prefixHash, requestHash } = state;
1048
- if (!isProviderReplayContext(state) || !providerReplayContextMatches(state, buildProviderReplayContext(model, identity)) || latest?.providerReplay || !supportsResponsesReasoningUpdate(request) || !isRecord(request.reasoning) || !request.input || request.previous_response_id || request.input.some(isConfigurationUpdate) || typeof effort !== "string" || typeof inputLength !== "number" || !Number.isSafeInteger(inputLength) || inputLength < 0 || typeof outputLength !== "number" || !Number.isSafeInteger(outputLength) || outputLength < 0 || !Array.isArray(controls) || controls.length > inputLength || inputLength + outputLength > request.input.length + controls.length) return request;
1049
- const previousInput = request.input.slice(0, inputLength - controls.length);
1050
- let lastIndex = -1;
1051
- for (const control of controls) {
1052
- if (!isRecord(control) || typeof control.index !== "number" || !Number.isSafeInteger(control.index) || control.index <= lastIndex || control.index > previousInput.length || !isConfigurationUpdate(control.item)) return request;
1053
- previousInput.splice(control.index, 0, control.item);
1054
- lastIndex = control.index;
1055
- }
1056
- const previous = {
1057
- ...request,
1058
- reasoning: {
1059
- ...request.reasoning,
1060
- effort
1061
- },
1062
- input: previousInput
1063
- };
1064
- if (responsesContinuationRequestFingerprint(previous) !== requestHash) return request;
1065
- const prepared = replayResponsesReasoningUpdates(previous, request, outputLength);
1066
- if (responsesContinuationPrefixFingerprint((prepared.input ?? []).slice(0, inputLength + outputLength)) !== prefixHash) return request;
1067
- return prepared;
1068
- }
1069
- //#endregion
1070
- //#region packages/ai/src/transports/openai-responses-request-fetch.ts
1071
- function withDefaultResponsesStreamEncoding(fetch) {
1072
- return (input, init) => {
1073
- const headers = new Headers(init?.headers ?? (input instanceof Request ? input.headers : void 0));
1074
- if (headers.has("accept-encoding")) return fetch(input, init);
1075
- headers.set("accept-encoding", "identity");
1076
- return fetch(input, {
1077
- ...init,
1078
- headers
1079
- });
1080
- };
1081
- }
1082
- /** Preserve the existing fetch policy while binding explicit continuation dispatch to its signal. */
1083
- function createResponsesRequestFetch(model, options) {
1084
- const lifecycle = options.lifecycle;
1085
- if (lifecycle && options.compact) throw new Error("Provider review continuation cannot replace its reviewed input with compaction");
1086
- let fetchOverride = options.compact ? createBoundedOpenAIResponsesCompactionFetch(buildGuardedModelFetch(model)) : options.stream ? withDefaultResponsesStreamEncoding(buildGuardedModelFetch(model)) : void 0;
1087
- if (lifecycle) {
1088
- const dispatchFetch = fetchOverride ?? buildGuardedModelFetch(model);
1089
- fetchOverride = async (input, init) => {
1090
- const signal = init?.signal ?? (input instanceof Request ? input.signal : void 0);
1091
- await lifecycle.beforeDispatch(signal ?? void 0);
1092
- signal?.throwIfAborted();
1093
- lifecycle.assertCurrent();
1094
- return dispatchFetch(input, init);
1095
- };
1096
- }
1097
- return fetchOverride;
1098
- }
1099
- //#endregion
1100
- //#region packages/ai/src/transports/openai-responses-client.ts
1101
- function resolveNativeOpenAIResponsesWebSocketMode(model, transport) {
1102
- if (transport !== "websocket" && transport !== "websocket-cached" && transport !== "auto") return;
1103
- if (getAiTransportHost().requiresManagedTransport(model)) return;
1104
- return supportsNativeOpenAIResponsesEndpoint(model) ? transport : void 0;
1105
- }
1106
- function combineWebSocketTimeoutSignal(signal, model, timeoutMs) {
1107
- const resolvedTimeoutMs = timeoutMs !== void 0 && Number.isFinite(timeoutMs) && timeoutMs > 0 ? timeoutMs : getAiTransportHost().resolveModelRequestTimeoutMs(model);
1108
- if (resolvedTimeoutMs === void 0 || !Number.isFinite(resolvedTimeoutMs)) return signal;
1109
- return AbortSignal.any([signal, AbortSignal.timeout(Math.max(1, resolvedTimeoutMs))]);
1110
- }
1111
- function createOpenAIResponsesClient(model, apiKey, defaultHeaders, fetchOverride) {
1112
- return new OpenAI({
1113
- apiKey,
1114
- baseURL: resolveOpenAIClientBaseUrl(model),
1115
- dangerouslyAllowBrowser: true,
1116
- defaultHeaders,
1117
- fetch: fetchOverride ?? buildGuardedModelFetch(model),
1118
- ...buildOpenAISdkClientOptions(model)
1119
- });
1120
- }
1121
- function createResponsesTransportExecutor(config) {
1122
- return (model, context, options) => {
1123
- const responsesOptions = options;
1124
- const compactRequest = claimResponsesCompactRequest(responsesOptions);
1125
- const { eventStream, stream } = createWritableTransportEventStream();
1126
- (async () => {
1127
- const output = createAssistantOutput(model, config.outputApi);
1128
- let firstEventAbort;
1129
- let continuationClaim;
1130
- const requestLifecycle = responsesRequestLifecycle.get(options);
1131
- try {
1132
- const apiKey = options?.apiKey || getEnvApiKey(model.provider) || "";
1133
- const websocketMode = resolveNativeOpenAIResponsesWebSocketMode(model, responsesOptions?.transport);
1134
- const encodeBody = prepareModelRequestBody(websocketMode || compactRequest ? void 0 : options);
1135
- const turnState = resolveProviderTransportTurnState(model, {
1136
- sessionId: options?.sessionId,
1137
- turnId: randomUUID(),
1138
- attempt: 1,
1139
- transport: websocketMode ? "websocket" : "stream"
1140
- });
1141
- const websocketSessionPolicy = websocketMode ? turnState?.websocket : void 0;
1142
- const httpTurnHeaders = filterProviderTurnHeadersForExplicitOpencodeSession(model, options, turnState?.headers);
1143
- const websocketTurnHeaders = filterProviderTurnHeadersForExplicitOpencodeSession(model, options, websocketSessionPolicy?.headers);
1144
- const websocketHeaders = websocketMode ? buildOpenAIClientHeaders(model, context, options?.headers, websocketTurnHeaders, options?.sessionId, options?.cacheRetention) : void 0;
1145
- const httpHeaders = buildOpenAIClientHeaders(model, context, options?.headers, httpTurnHeaders, options?.sessionId, options?.cacheRetention);
1146
- const fetchOverride = createResponsesRequestFetch(model, {
1147
- compact: Boolean(compactRequest),
1148
- stream: config.streamRequest,
1149
- lifecycle: requestLifecycle
1150
- });
1151
- const client = config.createClient(model, apiKey, httpHeaders, fetchOverride);
1152
- const nativeAstra = model.id === "gpt-6-astra" && supportsNativeOpenAIResponsesEndpoint(model);
1153
- const asyncToolExecutionEligible = nativeAstra && options?.asyncToolExecution === true && !responsesOptions?.openclawCodeModeToolSurface;
1154
- const prepareRequest = async (request) => {
1155
- let params = request;
1156
- const nextParams = await options?.onPayload?.(params, model);
1157
- if (nextParams !== void 0) params = nextParams;
1158
- params = sanitizeOpenAICodexResponsesParams(model, params);
1159
- params = sanitizeResponsesImagePayload(params);
1160
- if (responsesOptions?.openclawCodeModeToolSurface === true) {
1161
- const visibleToolNames = resolveCodeModeResponsesVisibleToolNames(context);
1162
- const allowedHostedToolTypes = responsesOptions?.openclawCodeModeAllowedHostedToolTypes;
1163
- enforceCodeModeResponsesToolSurface(params, visibleToolNames, allowedHostedToolTypes, codeModeToolSurfaceObserver.get(options));
1164
- assertCodeModeResponsesToolSurface(params, visibleToolNames, allowedHostedToolTypes);
1165
- }
1166
- if (asyncToolExecutionEligible && params.model === "gpt-6-astra" && params.multi_agent?.enabled !== true && params.tools) params.tools = params.tools.map((tool) => tool.type === "function" ? {
1167
- ...tool,
1168
- async: true
1169
- } : tool);
1170
- return params;
1171
- };
1172
- const buildRequest = (replayMode, requestContext = context) => prepareRequest(config.buildRequest(model, requestContext, responsesOptions, turnState?.metadata, replayMode));
1173
- let params = await buildRequest("checkpoint");
1174
- const asyncTools = asyncToolExecutionEligible && params.model === "gpt-6-astra" && params.multi_agent?.enabled !== true;
1175
- if (compactRequest) {
1176
- const compacted = await postOpenAIResponsesCompaction({
1177
- client,
1178
- model,
1179
- request: params,
1180
- options: responsesOptions
1181
- });
1182
- output.usage.input = compacted.usage.input_tokens;
1183
- output.usage.output = compacted.usage.output_tokens;
1184
- output.usage.totalTokens = compacted.usage.input_tokens + compacted.usage.output_tokens;
1185
- compactRequest.resolve(compacted);
1186
- finalizeTransportStream({
1187
- stream,
1188
- output,
1189
- signal: options?.signal
1190
- });
1191
- return;
1192
- }
1193
- const sessionId = options?.sessionId;
1194
- if (config.httpContinuation && !websocketMode && !getAiTransportHost().requiresManagedTransport(model) && (supportsNativeOpenAIResponsesEndpoint(model) || resolveOpenAIResponsesPayloadPolicy(model).explicitContinuationOptIn) && sessionId && (params.store === true || supportsResponsesReasoningUpdate(params)) && !params.previous_response_id) {
1195
- continuationClaim = claimOpenAIResponsesHttpContinuation({
1196
- sessionId,
1197
- apiKey,
1198
- baseUrl: model.baseUrl,
1199
- headers: httpHeaders,
1200
- request: params,
1201
- restoreRequest: () => restoreResponsesReasoningState(context, model, responsesOptions, params)
1202
- });
1203
- if (continuationClaim) params = continuationClaim.fullRequest;
1204
- }
1205
- const observePrompt = createResponsesPromptEgressObserver(responsesOptions, context.systemPrompt);
1206
- const requestStartedAt = Date.now();
1207
- let started = false;
1208
- const startStream = () => {
1209
- if (!started) {
1210
- started = true;
1211
- stream.push({
1212
- type: "start",
1213
- partial: output
1214
- });
1215
- }
1216
- };
1217
- const firstEvent = createFirstStreamEventAbortController(options?.signal);
1218
- firstEventAbort = firstEvent;
1219
- const requestOptions = buildOpenAISdkRequestOptions(model, firstEvent.signal, {
1220
- stream: config.streamRequest,
1221
- timeoutMs: options?.timeoutMs
1222
- });
1223
- const websocketSignal = combineWebSocketTimeoutSignal(firstEvent.signal, model, requestOptions?.timeout);
1224
- emitModelTransportDebug(log, `[responses] start provider=${model.provider} api=${model.api} model=${model.id} requestIdHash=${redactIdentifier(options?.requestId, { len: 64 })} baseUrl=${formatModelTransportDebugBaseUrl(model.baseUrl)} timeoutMs=${safeDebugValue(requestOptions?.timeout)} apiKey=${apiKey ? "present" : "missing"} ${summarizeResponsesPayload(params)}`);
1225
- const responseModelTracker = createResponseModelTracker(isOpenAICodexResponsesModel(model));
1226
- let continuationBaseline;
1227
- let dispatchedPreviousResponseId;
1228
- let contextUsageEligible = true;
1229
- let requestedTier;
1230
- const createSseStream = async (initialRequest = continuationClaim?.request ?? params, initialAttemptKind = "initial", initialRejectedCompaction) => {
1231
- const { stream: responseStream } = await createResponsesStreamWithEncryptedContentRetry({
1232
- client,
1233
- request: initialRequest,
1234
- requestOptions,
1235
- model,
1236
- encodeBody,
1237
- observePrompt,
1238
- initialAttemptKind,
1239
- initialRejectedCompaction,
1240
- buildFullHistoryRequest: () => buildRequest("full-history"),
1241
- onCompactionRejected: (checkpoint) => suppressOpenAIResponsesCompaction(output, model, responsesOptions, checkpoint),
1242
- canRetryStream: () => output.content.length === 0,
1243
- wrapStream: ({ stream: rawResponseStream, response, attempt }) => {
1244
- requestedTier = attempt.request.service_tier;
1245
- contextUsageEligible &&= attempt.kind === "initial";
1246
- dispatchedPreviousResponseId = attempt.request.previous_response_id;
1247
- continuationBaseline = attempt.request.previous_response_id ? params : attempt.request;
1248
- const trackedResponseStream = responseModelTracker.track(response, rawResponseStream);
1249
- return withProviderResponseHook({
1250
- stream: observeResponsesStream(trackedResponseStream, model, requestStartedAt),
1251
- signal: firstEvent.signal,
1252
- abort: firstEvent.abort,
1253
- hook: createOpenAIProviderAcceptanceHook(options, response, model),
1254
- onReady: () => {
1255
- emitModelTransportDebug(log, `[responses] headers provider=${model.provider} api=${model.api} model=${model.id} transport=sse elapsedMs=${Date.now() - requestStartedAt}`);
1256
- startStream();
1257
- }
1258
- });
1259
- }
1260
- });
1261
- return responseStream;
1262
- };
1263
- let responseStream;
1264
- let websocketBaseline;
1265
- let finishWebSocket;
1266
- let transport = "sse";
1267
- const logWebSocketFallback = (reason) => emitModelTransportDebug(log, `[responses] websocket_fallback provider=${model.provider} api=${model.api} model=${model.id} reason=${reason}`);
1268
- const closeWebSocketForFallback = (reason) => {
1269
- finishWebSocket?.({ keep: false });
1270
- finishWebSocket = void 0;
1271
- transport = "sse";
1272
- logWebSocketFallback(reason);
1273
- };
1274
- if (websocketMode) try {
1275
- const websocket = createOpenAIResponsesWebSocketStream({
1276
- client,
1277
- request: params,
1278
- restoreRequest: (request) => restoreResponsesReasoningState(context, model, responsesOptions, request),
1279
- mode: websocketMode,
1280
- sessionId: options?.sessionId,
1281
- headers: websocketHeaders,
1282
- signal: websocketSignal,
1283
- callerSignal: options?.signal,
1284
- degradeCooldownMs: websocketSessionPolicy?.degradeCooldownMs,
1285
- onActiveResponse: nativeAstra && params.model === "gpt-6-astra" ? options?.onActiveResponse : void 0,
1286
- steeringInput: (messages) => {
1287
- contextUsageEligible = false;
1288
- return projectResponsesSteeringInput(params, () => buildRequest("checkpoint", {
1289
- ...context,
1290
- messages: [...context.messages, ...messages]
1291
- }));
1292
- }
1293
- });
1294
- finishWebSocket = websocket.finish;
1295
- requestedTier = websocket.request.service_tier;
1296
- websocketBaseline = websocket.fullRequest;
1297
- recordResponsesInputReplay(output, websocket.inputReplay);
1298
- contextUsageEligible &&= websocket.inputReplay === void 0;
1299
- observePrompt?.(websocket.request, {
1300
- egress: "responses-websocket",
1301
- payloadVariant: "initial"
1302
- });
1303
- transport = "websocket";
1304
- emitModelTransportDebug(log, `[responses] websocket_selected provider=${model.provider} api=${model.api} model=${model.id} mode=${websocketMode} reused=${websocket.reusedConnection} continuation=${websocket.continuationStatus === "continued"} continuationStatus=${websocket.continuationStatus} sessionIdHash=${redactIdentifier(options?.sessionId)} headersHash=${redactIdentifier(JSON.stringify(Object.entries(websocketHeaders ?? {}).toSorted(([a], [b]) => a.localeCompare(b))))}`);
1305
- const trackedWebSocketStream = responseModelTracker.track(void 0, websocket.stream);
1306
- responseStream = { async *[Symbol.asyncIterator]() {
1307
- let providerAccepted = false;
1308
- try {
1309
- for await (const event of trackedWebSocketStream) {
1310
- if (!providerAccepted) {
1311
- providerAccepted = true;
1312
- await notifyProviderStreamOpened({
1313
- options,
1314
- cancelStream: () => websocket.finish({ keep: false })
1315
- });
1316
- }
1317
- startStream();
1318
- yield event;
1319
- }
1320
- } catch (error) {
1321
- if (error instanceof OpenAIResponsesWebSocketSafeRetryError) {
1322
- const encryptedContentRejected = isInvalidEncryptedContentError(error);
1323
- const recovery = encryptedContentRejected ? await resolveNextResponsesEncryptedContentAttempt({
1324
- kind: "initial",
1325
- request: {
1326
- ...websocket.request,
1327
- stream: true
1328
- }
1329
- }, error, { buildFullHistoryRequest: () => buildRequest("full-history") }) : void 0;
1330
- if (encryptedContentRejected && !recovery) throw error;
1331
- closeWebSocketForFallback(`safe_server_error code=${error.code} status=${safeDebugValue(error.status)} param=${safeDebugValue(error.param)}`);
1332
- yield* await createSseStream(recovery?.request ?? await buildRequest("full-history"), recovery?.kind ?? "continuation-rejected", recovery?.rejectedCompaction);
1333
- return;
1334
- }
1335
- if (websocketSignal.aborted || !(error instanceof OpenAIResponsesWebSocketPreDispatchError)) throw error;
1336
- transport = "sse";
1337
- logWebSocketFallback("before_first_event");
1338
- yield* await createSseStream();
1339
- }
1340
- } };
1341
- } catch (error) {
1342
- if (error instanceof OpenAIResponsesWebSocketPostDispatchError) throw error;
1343
- closeWebSocketForFallback("setup_failure");
1344
- responseStream = await createSseStream();
1345
- }
1346
- else responseStream = await createSseStream();
1347
- try {
1348
- const acceptedResponseStream = withResponsesRequestAcceptance(responseStream, requestLifecycle, transport === "websocket" ? websocketSignal : firstEvent.signal);
1349
- const terminal = await processResponsesStream(acceptedResponseStream, output, stream, model, {
1350
- canRetryIdentityConflict: () => hasOnlyResponsesFunctionTools(transport === "websocket" ? websocketBaseline : continuationBaseline),
1351
- ...config.pricingOptions?.(responsesOptions, model),
1352
- onServiceTier: (responseTier) => responsesServiceTierObserver.observe(options, requestedTier, responseTier),
1353
- firstEventTimeoutMs: getFirstStreamEventTimeoutMs(options) ?? config.firstEventTimeoutMs,
1354
- abortFirstEventStream: firstEvent.abort,
1355
- onFirstEventTimeout: getFirstStreamEventTimeoutHandler(options),
1356
- signal: options?.signal,
1357
- reasoningReplayMetadata: buildOpenAIResponsesReasoningReplayMetadata(model, {
1358
- authProfileId: responsesOptions?.authProfileId,
1359
- sessionId: options?.sessionId
1360
- }),
1361
- asyncToolExecution: asyncTools,
1362
- ...responseModelTracker.terminalOptions
1363
- });
1364
- finishWebSocket?.();
1365
- if (options?.signal?.aborted) throw transportAbortError(options.signal);
1366
- if (output.stopReason === "aborted" || output.stopReason === "error") throw new Error(output.errorMessage ?? "An unknown error occurred");
1367
- const admitted = transport === "websocket" ? websocketBaseline : continuationBaseline;
1368
- if (terminal && admitted && supportsNativeOpenAIResponsesEndpoint(model)) recordResponsesReasoningState(output, model, responsesOptions, admitted, terminal.output);
1369
- if (continuationClaim && continuationBaseline && terminal) continuationClaim.commit(continuationBaseline, terminal, dispatchedPreviousResponseId);
1370
- if (terminal && admitted && contextUsageEligible) recordResponsesContextUsage(output, model, responsesOptions, admitted, terminal.output, "transport");
1371
- } catch (error) {
1372
- finishWebSocket?.({ keep: false });
1373
- throw error;
1374
- }
1375
- emitModelTransportDebug(log, `[responses] completed provider=${model.provider} api=${model.api} model=${model.id} transport=${transport} elapsedMs=${Date.now() - requestStartedAt}`);
1376
- finalizeTransportStream({
1377
- stream,
1378
- output,
1379
- signal: options?.signal
1380
- });
1381
- } catch (error) {
1382
- if (requestLifecycle) await requestLifecycle.settle().catch(() => void 0);
1383
- if (compactRequest) {
1384
- compactRequest.reject(error);
1385
- failTransportStream({
1386
- stream,
1387
- output,
1388
- signal: options?.signal,
1389
- error
1390
- });
1391
- return;
1392
- }
1393
- if (error instanceof ResponsesStreamFailure && error.observation) logResponsesFailedNoDetails(error.observation);
1394
- const incompleteReason = output.diagnostics?.find(({ type }) => type === "openai_responses_terminal")?.details?.incompleteReason;
1395
- log.warn(`[responses] error provider=${model.provider} api=${model.api} model=${model.id} ` + summarizeOpenAITransportError(error) + (typeof incompleteReason === "string" ? ` incompleteReason=${incompleteReason}` : ""));
1396
- failTransportStream({
1397
- stream,
1398
- output,
1399
- signal: options?.signal,
1400
- error
1401
- });
1402
- } finally {
1403
- continuationClaim?.release();
1404
- firstEventAbort?.dispose();
1405
- }
1406
- })();
1407
- return eventStream;
1408
- };
1409
- }
1410
- function createOpenAIResponsesTransportStreamFn() {
1411
- return createResponsesTransportExecutor({
1412
- streamRequest: true,
1413
- httpContinuation: true,
1414
- createClient: createOpenAIResponsesClient,
1415
- buildRequest: buildOpenAIResponsesParams,
1416
- pricingOptions: (options, model) => ({
1417
- serviceTier: options?.serviceTier,
1418
- applyServiceTierPricing: (usage, serviceTier) => applyResponsesServiceTierPricing(usage, serviceTier, model)
1419
- })
1420
- });
1421
- }
1422
- function createAzureOpenAIResponsesTransportStreamFn() {
1423
- return createResponsesTransportExecutor({
1424
- outputApi: "azure-openai-responses",
1425
- firstEventTimeoutMs: AZURE_RESPONSES_FIRST_EVENT_TIMEOUT_MS,
1426
- createClient: createAzureOpenAIClient,
1427
- buildRequest: (model, context, options, metadata, replayMode) => {
1428
- const deploymentName = resolveAzureDeploymentNameFromMap({
1429
- modelId: model.id,
1430
- deploymentMap: process.env.AZURE_OPENAI_DEPLOYMENT_NAME_MAP
1431
- });
1432
- const params = buildOpenAIResponsesParams(model, context, options, metadata, replayMode);
1433
- params.model = deploymentName;
1434
- delete params.store;
1435
- return params;
1436
- }
1437
- });
1438
- }
1439
- function createAzureOpenAIClient(model, apiKey, defaultHeaders, fetchOverride) {
1440
- const baseURL = model.baseUrl.replace(/\/+$/, "");
1441
- const clientOptions = {
1442
- apiKey,
1443
- dangerouslyAllowBrowser: true,
1444
- defaultHeaders,
1445
- baseURL,
1446
- fetch: fetchOverride ?? buildGuardedModelFetch(model),
1447
- ...buildOpenAISdkClientOptions(model)
1448
- };
1449
- if (isOpenAICompatibleAzureResponsesBaseUrl(baseURL)) return new OpenAI(clientOptions);
1450
- return new AzureOpenAI({
1451
- ...clientOptions,
1452
- apiVersion: resolveAzureOpenAIApiVersion()
1453
- });
1454
- }
1455
- //#endregion
1456
295
  //#region packages/ai/src/transports/provider-compaction-checkpoint.ts
1457
296
  /** Whether provider replay state is a prefix-bound server compaction checkpoint. */
1458
297
  function isCompactionReplayCheckpoint(replay) {
@@ -1769,7 +608,7 @@ function resolveProviderStreamApi(model) {
1769
608
  ];
1770
609
  return `${PROVIDER_STREAM_API_PREFIX}${parts.map((part) => encodeURIComponent(part)).join(":")}`;
1771
610
  }
1772
- function applyProviderSimpleCompletionWrapper(registry, model, cfg, hookSourceApi = model.api, auth, agentId) {
611
+ function applyProviderSimpleCompletionWrapper(registry, model, cfg, hookSourceApi, auth, agentId) {
1773
612
  if (model.api.startsWith(PROVIDER_SIMPLE_COMPLETION_API_PREFIX)) return model;
1774
613
  const sourceProvider = registry.getApiProvider(model.api);
1775
614
  if (!sourceProvider) return model;
@@ -1865,4 +704,4 @@ function prepareModelForSimpleCompletion(params) {
1865
704
  return wrap(model);
1866
705
  }
1867
706
  //#endregion
1868
- export { CompactionReplayRefreshRequiredError, GEMINI_THOUGHT_SIGNATURE_VALIDATOR_SKIP, IncompleteToolCallError, MALFORMED_STREAMING_FRAGMENT_ERROR_MESSAGE, OPENAI_RESPONSES_CALL_ID_RE, OPENAI_RESPONSES_FUNCTION_CALL_ITEM_ID_RE, OPENAI_RESPONSES_ID_MAX_LENGTH, applyAnthropicContextManagementToRequest, applyAnthropicEphemeralCacheControlMarkers, applyAnthropicPayloadPolicyToParams, applyAnthropicRequestCacheControl, applyCompletionsAnthropicCacheControl, applyOpenAIResponsesPayloadPolicy, assertCodeModeResponsesToolSurface, assignTransportErrorDetails, buildAnthropicSystemBlocks, buildOpenAIClientHeaders, buildOpenAICompletionsParams, buildOpenAISdkClientOptions, buildOpenAISdkRequestOptions, createTransportAwareStreamFnForModel as buildTransportAwareSimpleStreamFn, createTransportAwareStreamFnForModel, canonicalizeMaxTokensParam, captureOpenAIResponsesCompaction, coerceTransportToolCallArguments, consumeGoogleGenerateContentStream, convertGoogleTools, copyProviderAcceptanceObserver, createAnthropicMessagesTransportStreamFn, createAzureOpenAIResponsesTransportStreamFn, createSupportedTransportStreamFn as createBoundaryAwareStreamFnForModel, createSupportedTransportStreamFn as createOpenClawTransportStreamFnForModel, createDeepSeekTextFilter, createEmptyTransportUsage, createModelStreamCooperativeScheduler, createOpenAICompletionsTransportStreamFn, createOpenAIProviderAcceptanceHook, createOpenAIResponseHook, createOpenAIResponsesTransportStreamFn, createResponseModelTracker, createWritableTransportEventStream, detectOpenAICompletionsCompat, emitModelTransportDebug, enforceCodeModeResponsesToolSurface, failTransportStream, filterCodeModePayloadTools, finalizeTerminalToolCallArguments, finalizeTransportStream, flattenCompletionMessagesToStringContent, formatModelTransportDebugBaseUrl, formatModelTransportDebugUrl, getCompat, googleFlashSupportsMinimalThinking, hasOpenAICompatibleConversationTurn, isAnthropicServerToolClearingEnabled, isCodeModeModelVisibleToolName, isCompactionReplayCheckpoint, isDirectAnthropicModel, isNativeOpenAIEndpoint, isOpenAICodexResponsesModel, isOpenAICompletionsThinkingEnabled, iterateModelStream, log, logAnthropicContextEdits, measureUtf8AppendBytes, mergeTransportHeaders, normalizeCodexResponsesBaseUrlForOpenAISdk, normalizeOpenAIResponsesFunctionCallId, notifyProviderHttpMetadata, notifyProviderHttpResponse, notifyProviderStreamOpened, parseJsonObjectPreservingUnsafeIntegers, parseJsonPreservingUnsafeIntegers, parseOpenAICompletionsUsage, parseTerminalToolCallArguments, prepareHeadersForSimpleCompletion, prepareModelForSimpleCompletion, prepareTransportAwareSimpleModel, preserveCompactionReplayWindow, projectGoogleMessages, quoteUnsafeIntegerLiterals, readCodeModePayloadToolName, readOpenAICompletionsContentDeltas, readOpenAICompletionsReasoningBatch, replaceCompactionReplayOwnerContent, requestPreparedOpenAIResponsesCompaction, requiresCompactionReplayRefresh, requiresGoogleToolCallId, resolveAnthropicCacheOptions, resolveAnthropicEphemeralCacheControl, resolveAnthropicMessagesUrl, resolveAnthropicPayloadPolicy, resolveAnthropicRequestBetaHeader, resolveAnthropicServerCompactionPlan, resolveCodeModeResponsesVisibleToolNames, resolveCompactionReplayEligibility, resolveCompactionReplayPressure, resolveMaxTokensParam, resolveModelPayloadDebugMode, resolveModelSseDebugMode, resolveOpenAIClientBaseUrl, resolveOpenAICompletionsCompat, resolveOpenAIPromptCacheKeySupport, resolveOpenAIReasoningEffortMap, resolveOpenAIResponsesCompactEndpointPlan, resolveOpenAIResponsesPayloadPolicy, resolveOpenAIResponsesServerCompactionPlan, resolveOpenAIStrictToolFlagWithDiagnostics, resolvePromptCacheKey, resolveReplayableResponsesMessageId, resolveTransportAwareSimpleApi, sanitizeNonEmptyTransportPayloadText, sanitizeResponsesImagePayload, sanitizeTransportPayloadText, shouldNormalizeOpenAIResponsesToolCallId, sortPromptCacheToolsByName as sortTransportToolsByName, splitOpenAIFunctionCallPairing, stripCompactionReplayCheckpoint, stripCompactionReplayCheckpointInPlace, stripCompletionMessagesToRoleContent, supportsAnthropicServerSideFallback, throwIfModelStreamAborted, transportAbortError, usesNativeOpenAICodexResponsesBackend, withProviderAcceptanceObserver, withProviderResponseHook };
707
+ export { CompactionReplayRefreshRequiredError, GEMINI_THOUGHT_SIGNATURE_VALIDATOR_SKIP, IncompleteToolCallError, MALFORMED_STREAMING_FRAGMENT_ERROR_MESSAGE, OPENAI_RESPONSES_CALL_ID_RE, OPENAI_RESPONSES_FUNCTION_CALL_ITEM_ID_RE, OPENAI_RESPONSES_ID_MAX_LENGTH, applyAnthropicContextManagementToRequest, applyAnthropicEphemeralCacheControlMarkers, applyAnthropicPayloadPolicyToParams, applyAnthropicRequestCacheControl, applyCompletionsAnthropicCacheControl, applyOpenAIResponsesPayloadPolicy, assertCodeModeResponsesToolSurface, assignTransportErrorDetails, buildAnthropicSystemBlocks, buildOpenAIClientHeaders, buildOpenAICompletionsParams, buildOpenAISdkClientOptions, buildOpenAISdkRequestOptions, createTransportAwareStreamFnForModel as buildTransportAwareSimpleStreamFn, createTransportAwareStreamFnForModel, canonicalizeMaxTokensParam, captureOpenAIResponsesCompaction, coerceTransportToolCallArguments, consumeGoogleGenerateContentStream, convertGoogleTools, copyProviderAcceptanceObserver, createAnthropicMessagesTransportStreamFn, createAzureOpenAIResponsesTransportStreamFn, createSupportedTransportStreamFn as createBoundaryAwareStreamFnForModel, createSupportedTransportStreamFn as createOpenClawTransportStreamFnForModel, createDeepSeekTextFilter, createEmptyTransportUsage, createModelStreamCooperativeScheduler, createOpenAICompletionsTransportStreamFn, createOpenAIProviderAcceptanceHook, createOpenAIResponseHook, createOpenAIResponsesTransportStreamFn, createResponseModelTracker, createWritableTransportEventStream, detectOpenAICompletionsCompat, emitModelTransportDebug, emitModelTransportError, enforceCodeModeResponsesToolSurface, failTransportStream, filterCodeModePayloadTools, finalizeTerminalToolCallArguments, finalizeTransportStream, flattenCompletionMessagesToStringContent, formatModelTransportDebugBaseUrl, formatModelTransportDebugUrl, getCompat, googleFlashSupportsMinimalThinking, hasOpenAICompatibleConversationTurn, isAnthropicServerToolClearingEnabled, isCodeModeModelVisibleToolName, isCompactionReplayCheckpoint, isDirectAnthropicModel, isNativeOpenAIEndpoint, isOpenAICodexResponsesModel, isOpenAICompletionsThinkingEnabled, iterateModelStream, log, logAnthropicContextEdits, measureUtf8AppendBytes, mergeTransportHeaders, normalizeCodexResponsesBaseUrlForOpenAISdk, normalizeOpenAIResponsesFunctionCallId, notifyProviderHttpMetadata, notifyProviderHttpResponse, notifyProviderStreamOpened, parseJsonObjectPreservingUnsafeIntegers, parseJsonPreservingUnsafeIntegers, parseOpenAICompletionsUsage, parseTerminalToolCallArguments, prepareHeadersForSimpleCompletion, prepareModelForSimpleCompletion, prepareTransportAwareSimpleModel, preserveCompactionReplayWindow, projectGoogleMessages, quoteUnsafeIntegerLiterals, readCodeModePayloadToolName, readOpenAICompletionsContentDeltas, readOpenAICompletionsReasoningBatch, replaceCompactionReplayOwnerContent, requestPreparedOpenAIResponsesCompaction, requiresCompactionReplayRefresh, requiresGoogleToolCallId, resolveAnthropicCacheOptions, resolveAnthropicEphemeralCacheControl, resolveAnthropicMessagesUrl, resolveAnthropicPayloadPolicy, resolveAnthropicRequestBetaHeader, resolveAnthropicServerCompactionPlan, resolveCodeModeResponsesVisibleToolNames, resolveCompactionReplayEligibility, resolveCompactionReplayPressure, resolveCompletionTokenReservation, resolveMaxTokensParam, resolveModelPayloadDebugMode, resolveModelSseDebugMode, resolveOpenAIClientBaseUrl, resolveOpenAICompletionsCompat, resolveOpenAIPromptCacheKeySupport, resolveOpenAIReasoningEffortMap, resolveOpenAIResponsesCompactEndpointPlan, resolveOpenAIResponsesPayloadPolicy, resolveOpenAIResponsesServerCompactionPlan, resolveOpenAIStrictToolFlagWithDiagnostics, resolvePromptCacheKey, resolveReplayableResponsesMessageId, resolveTransportAwareSimpleApi, sanitizeNonEmptyTransportPayloadText, sanitizeResponsesImagePayload, sanitizeTransportPayloadText, shouldNormalizeOpenAIResponsesToolCallId, sortPromptCacheToolsByName as sortTransportToolsByName, splitOpenAIFunctionCallPairing, stripCompactionReplayCheckpoint, stripCompactionReplayCheckpointInPlace, stripCompletionMessagesToRoleContent, supportsAnthropicServerSideFallback, throwIfModelStreamAborted, transportAbortError, usesNativeOpenAICodexResponsesBackend, withProviderAcceptanceObserver, withProviderResponseHook };