@openclaw/ai 2026.9.33 → 2026.9.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{anthropic-a0uD7NUz.mjs → anthropic-BL3z3SiB.mjs} +2 -2
- package/dist/{anthropic-payload-policy-BVcxWtQD.d.mts → anthropic-payload-policy-CFbalbbU.d.mts} +3 -3
- package/dist/{anthropic-stream-reducer-Cis7c1sm.mjs → anthropic-stream-reducer-XCL_L8KJ.mjs} +1 -1
- package/dist/{api-registry-pGjnPg1z.d.mts → api-registry-BLbq15N5.d.mts} +2 -2
- package/dist/{azure-openai-responses-CqWvI8x6.mjs → azure-openai-responses-DqXyjyTC.mjs} +2 -2
- package/dist/diagnostics.d.mts +4 -4
- package/dist/env-api-keys-BR0MUYYD.d.mts +17 -0
- package/dist/event-stream-B0vjWzHd.d.mts +1 -0
- package/dist/{event-stream-DOPFYVqs.d.mts → event-stream-CiaHxSK0.d.mts} +1 -1
- package/dist/event-stream.d.mts +2 -2
- package/dist/{google-BfYNxKpG.mjs → google-D9zpPelZ.mjs} +1 -1
- package/dist/{google-interactions-BJNj0ugu.mjs → google-interactions-Br_n4tZB.mjs} +14 -11
- package/dist/{google-messages-C4ZiLG1P.mjs → google-messages-pvt0rKfN.mjs} +3 -1
- package/dist/{google-shared-6u4WCDyl.mjs → google-shared-DPeR7LLA.mjs} +9 -14
- package/dist/{google-vertex-CX1QaTs3.mjs → google-vertex-D4Qde9Qq.mjs} +1 -1
- package/dist/{host-COwfRiSL.d.mts → host-BhpDO5Sy.d.mts} +3 -3
- package/dist/{index-DHeFfpcz.d.mts → index-Iw8l620S.d.mts} +3 -3
- package/dist/index.d.mts +6 -6
- package/dist/internal/anthropic.d.mts +5 -5
- package/dist/internal/anthropic.mjs +2 -2
- package/dist/internal/env-api-keys.d.mts +2 -0
- package/dist/internal/env-api-keys.mjs +2 -0
- package/dist/internal/google-model-family.d.mts +2 -0
- package/dist/internal/google-model-family.mjs +6 -2
- package/dist/internal/openai-completions-compat.d.mts +1 -1
- package/dist/internal/openai-responses-payload-policy.d.mts +1 -1
- package/dist/internal/openai.d.mts +9 -9
- package/dist/internal/openai.mjs +5 -5
- package/dist/internal/runtime.d.mts +8 -23
- package/dist/internal/shared.d.mts +3 -3
- package/dist/internal/tool-schema.mjs +1 -1
- package/dist/{openai-chatgpt-responses-L0Jc-0DF.mjs → openai-chatgpt-responses-CHluxZ0P.mjs} +58 -49
- package/dist/{openai-completions-gyTpI3xG.mjs → openai-completions-D0f28olp.mjs} +3 -3
- package/dist/{openai-completions-compat-CqWP1fn5.d.mts → openai-completions-compat-CQbGsPt0.d.mts} +3 -3
- package/dist/{openai-completions-stream-BrsoGafc.mjs → openai-completions-stream-iagLwGz6.mjs} +9 -8
- package/dist/{openai-prompt-cache-YTmJ_iMS.d.mts → openai-prompt-cache-CuY5QDIc.d.mts} +2 -2
- package/dist/{openai-provider-client-D1gd0dfR.mjs → openai-provider-client-Bcjj6_fK.mjs} +1 -1
- package/dist/{openai-responses-DluFZzn_.mjs → openai-responses-D2ElJYAb.mjs} +3 -3
- package/dist/{openai-responses-compaction-replay-CQHR2isp.d.mts → openai-responses-compaction-replay-DiGjwK4d.d.mts} +4 -4
- package/dist/{openai-responses-contracts-C2H8pffb.d.mts → openai-responses-contracts-CYScOS7J.d.mts} +4 -4
- package/dist/{openai-responses-prompt-observer-internal-C5WB2Kxf.mjs → openai-responses-prompt-observer-internal-CWhVpkYl.mjs} +4 -4
- package/dist/{openai-responses-shared-BpGnmnV8.mjs → openai-responses-shared-BUaK4Pb3.mjs} +503 -11
- package/dist/{openai-responses-terminal-usage-D0WZQlIF.d.mts → openai-responses-terminal-usage-CLzeNWqW.d.mts} +2 -2
- package/dist/{openai-tool-schema-vsl-cE-n.mjs → openai-tool-schema-DSAxYnHW.mjs} +18 -1
- package/dist/{openai-transport-params-C4eZAXf2.mjs → openai-transport-params-CqLxK93q.mjs} +15 -3
- package/dist/{provider-options-yDbWMoEr.d.mts → provider-options-CFiaIG4K.d.mts} +2 -2
- package/dist/{provider-types-CHsKHBBD.d.mts → provider-types-Bx_6hBmK.d.mts} +3 -3
- package/dist/provider-types.d.mts +5 -5
- package/dist/providers.d.mts +2 -2
- package/dist/providers.mjs +8 -8
- package/dist/{transport-stream-shared-CYLM2HEK.d.mts → transport-stream-shared-B_REuIea.d.mts} +4 -4
- package/dist/{transport-utils-CnxX8hPj.mjs → transport-utils-B11GlmDO.mjs} +5 -1
- package/dist/transports.d.mts +14 -13
- package/dist/transports.mjs +17 -502
- package/dist/{types-CLLR3eB4.d.mts → types-B89w6ly2.d.mts} +11 -0
- package/dist/types-DbmNRKvK.d.mts +1 -0
- package/dist/types.d.mts +5 -5
- package/dist/{validation-Cat2wQsc.d.mts → validation-DblQWSRA.d.mts} +1 -1
- package/dist/validation.d.mts +1 -1
- package/package.json +6 -1
- package/dist/event-stream-CMQfX_yr.d.mts +0 -1
- package/dist/types-CoL-LJ7j.d.mts +0 -1
package/dist/transports.mjs
CHANGED
|
@@ -2,36 +2,34 @@ import { S as resolveClaudeSonnet5ModelIdentity, b as resolveClaudeOpus5ModelIde
|
|
|
2
2
|
import { o as isRecord } from "./record-coerce-CNDovvft.mjs";
|
|
3
3
|
import { _ as requiresClaudeAdaptiveThinking, b as usesClaudeFable5MessagesContract, f as applyClaudeRequestContract, g as prepareClaudeNoPrefillRequestContext, m as defaultsClaudeAdaptiveThinking, n as getAiTransportHost, p as buildAnthropicClaudeCodeIdentity, r as resolveAiTransportHeaderSentinels, v as resolveAnthropicThinkingEffort, x as usesClaudeStreamingRefusalContract } from "./host-DqhMLv8J.mjs";
|
|
4
4
|
import { n as normalizeLowercaseStringOrEmpty, t as hasNonEmptyString } from "./string-coerce-fsri9iCu.mjs";
|
|
5
|
-
import { a as redactDiagnosticText, o as truncateUtf16Safe
|
|
5
|
+
import { a as redactDiagnosticText, o as truncateUtf16Safe } from "./provider-error-CwT_j2v0.mjs";
|
|
6
6
|
import { a as resolveModelSseDebugMode, i as resolveModelPayloadDebugMode, n as formatModelTransportDebugUrl, r as emitModelTransportDebug, t as formatModelTransportDebugBaseUrl, u as hasOnlyResponsesFunctionTools, v as toErrorObject } from "./diagnostics-CJaB6g8J.mjs";
|
|
7
|
-
import { a as readResponseTextSnippet, i as isCodeModeModelVisibleToolName, n as createAbortError$1, s as resolveModelHeaderSentinels, t as MALFORMED_STREAMING_FRAGMENT_ERROR_MESSAGE } from "./transport-utils-
|
|
7
|
+
import { a as readResponseTextSnippet, i as isCodeModeModelVisibleToolName, n as createAbortError$1, s as resolveModelHeaderSentinels, t as MALFORMED_STREAMING_FRAGMENT_ERROR_MESSAGE } from "./transport-utils-B11GlmDO.mjs";
|
|
8
8
|
import { a as resolveOpenAIPromptCacheKeySupport, i as resolveOpenAICompletionsCompat, n as isNativeOpenAIEndpoint, o as usesNativeOpenAICodexResponsesBackend, r as isOpenAICodexResponsesModel, t as detectOpenAICompletionsCompat } from "./openai-completions-compat-D1q02qdx.mjs";
|
|
9
9
|
import { r as resolveProviderEndpoint, t as buildGuardedModelFetch } from "./host-policy-B3DuH3Le.mjs";
|
|
10
|
-
import { A as applyAnthropicRequestCacheControl, B as ANTHROPIC_SERVER_SIDE_FALLBACKS, C as applyAnthropicThinkingBindingControls, D as applyAnthropicContextManagementToRequest, F as resolveAnthropicCacheOptions, I as resolveAnthropicEphemeralCacheControl, J as usesFoundryBearerAuth, K as isAnthropicOAuthApiKey, L as resolveAnthropicPayloadPolicy, M as isAnthropicServerToolClearingEnabled, N as isDirectAnthropicModel, O as applyAnthropicEphemeralCacheControlMarkers, P as logAnthropicContextEdits, R as resolveAnthropicRequestBetaHeader, d as convertAnthropicTools, f as buildAnthropicReplayPlan, g as normalizeAnthropicToolCallId, h as suppressAnthropicCompaction, j as buildAnthropicSystemBlocks, k as applyAnthropicPayloadPolicyToParams, l as buildAnthropicGenerationParams, m as resolveNewestAnthropicCompaction, p as isAnthropicReplayRejection, q as omitFoundryBearerCredentialHeaders, t as consumeAnthropicStream, u as convertAnthropicMessages, z as resolveAnthropicServerCompactionPlan } from "./anthropic-stream-reducer-
|
|
10
|
+
import { A as applyAnthropicRequestCacheControl, B as ANTHROPIC_SERVER_SIDE_FALLBACKS, C as applyAnthropicThinkingBindingControls, D as applyAnthropicContextManagementToRequest, F as resolveAnthropicCacheOptions, I as resolveAnthropicEphemeralCacheControl, J as usesFoundryBearerAuth, K as isAnthropicOAuthApiKey, L as resolveAnthropicPayloadPolicy, M as isAnthropicServerToolClearingEnabled, N as isDirectAnthropicModel, O as applyAnthropicEphemeralCacheControlMarkers, P as logAnthropicContextEdits, R as resolveAnthropicRequestBetaHeader, d as convertAnthropicTools, f as buildAnthropicReplayPlan, g as normalizeAnthropicToolCallId, h as suppressAnthropicCompaction, j as buildAnthropicSystemBlocks, k as applyAnthropicPayloadPolicyToParams, l as buildAnthropicGenerationParams, m as resolveNewestAnthropicCompaction, p as isAnthropicReplayRejection, q as omitFoundryBearerCredentialHeaders, t as consumeAnthropicStream, u as convertAnthropicMessages, z as resolveAnthropicServerCompactionPlan } from "./anthropic-stream-reducer-XCL_L8KJ.mjs";
|
|
11
11
|
import { t as resolveCacheRetention } from "./cache-retention-0x979a5V.mjs";
|
|
12
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, 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-Dt7VrJFd.mjs";
|
|
13
13
|
import { D as sortPromptCacheToolsByName, l as codeModeToolSurfaceObserver, s as prepareModelRequestBody, t as adjustMaxTokensForThinking, u as reasoningTagTextPolicy } from "./simple-options-B9u6-CF3.mjs";
|
|
14
|
-
import { A as
|
|
14
|
+
import { A as resolvePromptCacheKey, C as isOpenAICompletionsThinkingEnabled, D as readOpenAICompletionsContentDeltas, E as parseOpenAICompletionsUsage, O as readOpenAICompletionsReasoningBatch, S as detachPartialSnapshot, T as measureUtf8AppendBytes, _ as resolveOpenAIReasoningEffortMap, a as enforceCodeModeResponsesToolSurface, b as createOpenAIResponseHook, c as readCodeModePayloadToolName, i as buildOpenAISdkRequestOptions, j as redactIdentifier, k as resolveOpenAIClientBaseUrl, l as resolveCodeModeResponsesVisibleToolNames, 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 log, x as createResponseModelTracker, y as createOpenAIProviderAcceptanceHook } from "./openai-transport-params-CqLxK93q.mjs";
|
|
15
15
|
import { n as getEnvApiKey } from "./env-api-keys-CyX4VKGO.mjs";
|
|
16
16
|
import { t as createDeferredEventBuffer } from "./deferred-event-buffer-DAvyP7qA.mjs";
|
|
17
17
|
import { n as providerReplayContextMatches, t as buildProviderReplayContext } from "./provider-replay-context-BwVRJUQZ.mjs";
|
|
18
18
|
import { a as tagUnresolvedTextAsCommentary } from "./assistant-text-phase-C20rxWwP.mjs";
|
|
19
19
|
import { n as createAssistantOutput } from "./provider-transcript-transform-Cg-36VSt.mjs";
|
|
20
20
|
import { n as resolveOpencodeSessionHeaders } from "./session-affinity-Bcunsn4I.mjs";
|
|
21
|
-
import { c as flattenCompletionMessagesToStringContent, d as canonicalizeMaxTokensParam, f as resolveMaxTokensParam, l as stripCompletionMessagesToRoleContent, n as shouldEmitOpenAICompletionsReasoning, o as isAzureOpenAICompatibleHost, p as createDeepSeekTextFilter, r as buildOpenAICompletionsParams, s as finalizeOpenAICompletionsToolCalls, t as processCompletionsStream, u as applyCompletionsAnthropicCacheControl } from "./openai-completions-stream-
|
|
22
|
-
import { a as googleFlashSupportsMinimalThinking, i as consumeGoogleGenerateContentStream, n as projectGoogleMessages, r as requiresGoogleToolCallId, t as convertGoogleTools } from "./google-messages-
|
|
21
|
+
import { c as flattenCompletionMessagesToStringContent, d as canonicalizeMaxTokensParam, f as resolveMaxTokensParam, l as stripCompletionMessagesToRoleContent, n as shouldEmitOpenAICompletionsReasoning, o as isAzureOpenAICompatibleHost, p as createDeepSeekTextFilter, r as buildOpenAICompletionsParams, s as finalizeOpenAICompletionsToolCalls, t as processCompletionsStream, u as applyCompletionsAnthropicCacheControl } from "./openai-completions-stream-iagLwGz6.mjs";
|
|
22
|
+
import { a as googleFlashSupportsMinimalThinking, i as consumeGoogleGenerateContentStream, n as projectGoogleMessages, r as requiresGoogleToolCallId, t as convertGoogleTools } from "./google-messages-pvt0rKfN.mjs";
|
|
23
23
|
import { i as getFirstStreamEventTimeoutMs, r as getFirstStreamEventTimeoutHandler, t as createFirstStreamEventAbortController } from "./stream-first-event-timeout-B9o0S4SZ.mjs";
|
|
24
|
-
import { d as OpenAIResponsesWebSocketSafeRetryError, i as OPENAI_RESPONSES_APIS, l as OpenAIResponsesWebSocketPostDispatchError,
|
|
24
|
+
import { d as OpenAIResponsesWebSocketSafeRetryError, i as OPENAI_RESPONSES_APIS, l as OpenAIResponsesWebSocketPostDispatchError, t as AZURE_RESPONSES_FIRST_EVENT_TIMEOUT_MS, u as OpenAIResponsesWebSocketPreDispatchError } from "./openai-responses-contracts-CLxnqS9p.mjs";
|
|
25
25
|
import { r as resolveProviderTransportTurnState, t as filterProviderTurnHeadersForExplicitOpencodeSession } from "./provider-transport-turn-state-CUUfdJPN.mjs";
|
|
26
26
|
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-CYGCjAQz.mjs";
|
|
27
|
-
import { $ as OPENAI_RESPONSES_FUNCTION_CALL_ITEM_ID_RE, A as recordResponsesContextUsage, B as
|
|
27
|
+
import { $ as OPENAI_RESPONSES_FUNCTION_CALL_ITEM_ID_RE, A as recordResponsesContextUsage, B as claimOpenAIResponsesHttpContinuation, C as resolveAzureOpenAIApiVersion, D as safeDebugValue, E as logResponsesFailedNoDetails, G as supportsResponsesReasoningUpdate, H as responsesContinuationRequestFingerprint, I as createOpenAIResponsesWebSocketStream, J as captureOpenAIResponsesCompaction, K as CompactionReplayRefreshRequiredError, L as supportsNativeOpenAIResponsesEndpoint, O as summarizeOpenAITransportError, Q as OPENAI_RESPONSES_CALL_ID_RE, R as projectResponsesSteeringInput, S as isInvalidEncryptedContentError, T as ResponsesStreamFailure, U as isConfigurationUpdate, V as responsesContinuationPrefixFingerprint, W as replayResponsesReasoningUpdates, X as resolveNewestOpenAIResponsesCompactionReplay, Y as isOpenAIResponsesReplayContext, Z as suppressOpenAIResponsesCompaction, 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 buildOpenAIResponsesReasoningReplayMetadata, rt as splitOpenAIFunctionCallPairing, s as processResponsesStream, tt as normalizeOpenAIResponsesFunctionCallId, w as resolveNextResponsesEncryptedContentAttempt, x as createResponsesStreamWithEncryptedContentRetry, z as recordResponsesInputReplay } from "./openai-responses-shared-BUaK4Pb3.mjs";
|
|
28
28
|
import { i as resolveAzureDeploymentNameFromMap, t as isOpenAICompatibleAzureResponsesBaseUrl } from "./azure-openai-responses-client-compat-C7K7QfUE.mjs";
|
|
29
|
-
import { n as
|
|
30
|
-
import { a as sanitizeOpenAICodexResponsesParams, n as buildOpenAIResponsesCompactSystemMessage, r as buildOpenAIResponsesParams, t as createResponsesPromptEgressObserver } from "./openai-responses-prompt-observer-internal-C5WB2Kxf.mjs";
|
|
29
|
+
import { a as sanitizeOpenAICodexResponsesParams, n as buildOpenAIResponsesCompactSystemMessage, r as buildOpenAIResponsesParams, t as createResponsesPromptEgressObserver } from "./openai-responses-prompt-observer-internal-CWhVpkYl.mjs";
|
|
31
30
|
import { n as withResponsesRequestAcceptance, t as responsesRequestLifecycle } from "./openai-responses-request-lifecycle-Fsag-IGZ.mjs";
|
|
32
31
|
import { randomUUID } from "node:crypto";
|
|
33
32
|
import OpenAI, { AzureOpenAI } from "openai";
|
|
34
|
-
import { ResponsesWS } from "openai/resources/responses/ws.js";
|
|
35
33
|
//#region packages/ai/src/transports/anthropic-transport-options.ts
|
|
36
34
|
const ANTHROPIC_MESSAGES_DEFAULT_MAX_TOKENS = 4096;
|
|
37
35
|
const ANTHROPIC_MESSAGES_FALLBACK_CONTEXT_DIVISOR = 4;
|
|
@@ -687,492 +685,6 @@ function createOpenAICompletionsTransportStreamFn() {
|
|
|
687
685
|
};
|
|
688
686
|
}
|
|
689
687
|
//#endregion
|
|
690
|
-
//#region packages/ai/src/transports/openai-responses-steering.ts
|
|
691
|
-
function cloneWireRequest(request) {
|
|
692
|
-
const serialized = JSON.stringify(request);
|
|
693
|
-
return JSON.parse(serialized);
|
|
694
|
-
}
|
|
695
|
-
async function projectResponsesSteeringInput(request, project) {
|
|
696
|
-
const { input: activeInput, ...activeSettings } = cloneWireRequest(request);
|
|
697
|
-
if (!Array.isArray(activeInput)) return [];
|
|
698
|
-
const { input, ...settings } = cloneWireRequest(await project());
|
|
699
|
-
if (!Array.isArray(input) || stableStringify(settings) !== stableStringify(activeSettings) || stableStringify(input.slice(0, activeInput.length)) !== stableStringify(activeInput)) return [];
|
|
700
|
-
const projected = input.slice(activeInput.length);
|
|
701
|
-
return projected.every((item) => isRecord(item) && item.role === "user") ? projected : [];
|
|
702
|
-
}
|
|
703
|
-
/** One response owns admission; accepted input stays on this connection until continuation. */
|
|
704
|
-
function createResponsesSteering(params) {
|
|
705
|
-
let responseId;
|
|
706
|
-
let sealed = false;
|
|
707
|
-
let unsubscribe;
|
|
708
|
-
const pending = [];
|
|
709
|
-
const accepted = /* @__PURE__ */ new Map();
|
|
710
|
-
const acknowledged = /* @__PURE__ */ new Set();
|
|
711
|
-
const seal = () => {
|
|
712
|
-
sealed = true;
|
|
713
|
-
const cleanup = unsubscribe;
|
|
714
|
-
unsubscribe = void 0;
|
|
715
|
-
cleanup?.();
|
|
716
|
-
};
|
|
717
|
-
return {
|
|
718
|
-
get responseId() {
|
|
719
|
-
return responseId;
|
|
720
|
-
},
|
|
721
|
-
get pending() {
|
|
722
|
-
return pending.length > 0;
|
|
723
|
-
},
|
|
724
|
-
get acceptedInput() {
|
|
725
|
-
return [...accepted.values()].flat();
|
|
726
|
-
},
|
|
727
|
-
seal,
|
|
728
|
-
close(error) {
|
|
729
|
-
seal();
|
|
730
|
-
for (const submission of pending.splice(0)) submission.reject(error);
|
|
731
|
-
},
|
|
732
|
-
handle(event) {
|
|
733
|
-
if (!isRecord(event)) return false;
|
|
734
|
-
if (event.type === "response.created" && !responseId && !sealed) {
|
|
735
|
-
const response = isRecord(event.response) ? event.response : void 0;
|
|
736
|
-
if (typeof response?.id !== "string" || !response.id.trim()) throw new Error("Responses steering requires a response identity");
|
|
737
|
-
const activeResponseId = response.id;
|
|
738
|
-
responseId = activeResponseId;
|
|
739
|
-
const cleanup = params.onActiveResponse({
|
|
740
|
-
needsContinuation: params.needsContinuation,
|
|
741
|
-
steer(messages) {
|
|
742
|
-
if (sealed || messages.length === 0) return Promise.resolve(false);
|
|
743
|
-
params.assertActive();
|
|
744
|
-
const converted = params.toInput(messages);
|
|
745
|
-
const submit = (input) => {
|
|
746
|
-
if (sealed || input.length === 0) return Promise.resolve(false);
|
|
747
|
-
params.assertActive();
|
|
748
|
-
return new Promise((resolve, reject) => {
|
|
749
|
-
pending.push({
|
|
750
|
-
input,
|
|
751
|
-
resolve,
|
|
752
|
-
reject
|
|
753
|
-
});
|
|
754
|
-
params.send({
|
|
755
|
-
type: "response.steer",
|
|
756
|
-
previous_response_id: activeResponseId,
|
|
757
|
-
input
|
|
758
|
-
});
|
|
759
|
-
});
|
|
760
|
-
};
|
|
761
|
-
return Array.isArray(converted) ? submit(converted) : converted.then(submit);
|
|
762
|
-
}
|
|
763
|
-
});
|
|
764
|
-
if (sealed) cleanup?.();
|
|
765
|
-
else unsubscribe = cleanup;
|
|
766
|
-
return false;
|
|
767
|
-
}
|
|
768
|
-
if (event.type !== "response.steer.accepted" && event.type !== "response.steer.failed" && event.type !== "response.steer.pending") return false;
|
|
769
|
-
const steer = isRecord(event.steer) ? event.steer : void 0;
|
|
770
|
-
if (!responseId || steer?.previous_response_id !== responseId) throw new Error("Responses steering acknowledgement has an unexpected identity");
|
|
771
|
-
if (event.type === "response.steer.failed" && steer.id === void 0) {
|
|
772
|
-
const index = pending.findIndex((submission) => stableStringify(submission.input) === stableStringify(steer.input));
|
|
773
|
-
const submission = pending[index];
|
|
774
|
-
if (!submission) throw new Error("Responses steering acknowledgement has no pending submission");
|
|
775
|
-
pending.splice(index, 1);
|
|
776
|
-
submission.resolve(false);
|
|
777
|
-
return true;
|
|
778
|
-
}
|
|
779
|
-
if (typeof steer.id !== "string" || !steer.id.trim()) throw new Error("Responses steering acknowledgement has an unexpected identity");
|
|
780
|
-
if (event.type === "response.steer.pending") {
|
|
781
|
-
if (!accepted.has(steer.id)) throw new Error("Responses steering pending event has no accepted submission");
|
|
782
|
-
return true;
|
|
783
|
-
}
|
|
784
|
-
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");
|
|
785
|
-
if (acknowledged.has(steer.id)) throw new Error("Responses steering acknowledgement was already applied");
|
|
786
|
-
const submission = pending.shift();
|
|
787
|
-
if (!submission) throw new Error("Responses steering acknowledgement has no pending submission");
|
|
788
|
-
acknowledged.add(steer.id);
|
|
789
|
-
if (event.type === "response.steer.accepted") {
|
|
790
|
-
accepted.set(steer.id, submission.input);
|
|
791
|
-
submission.resolve(true);
|
|
792
|
-
} else submission.resolve(false);
|
|
793
|
-
return true;
|
|
794
|
-
}
|
|
795
|
-
};
|
|
796
|
-
}
|
|
797
|
-
/** Accepted steering is prepended by the server, so never repeat it in response.create. */
|
|
798
|
-
function omitAcceptedSteering(input, accepted) {
|
|
799
|
-
const remaining = [...input];
|
|
800
|
-
for (const message of accepted) {
|
|
801
|
-
const index = remaining.findIndex((item) => stableStringify(item) === stableStringify(message));
|
|
802
|
-
if (index < 0) throw new Error("Responses steering continuation no longer contains the accepted user input");
|
|
803
|
-
remaining.splice(index, 1);
|
|
804
|
-
}
|
|
805
|
-
return remaining;
|
|
806
|
-
}
|
|
807
|
-
//#endregion
|
|
808
|
-
//#region packages/ai/src/transports/openai-responses-websocket.ts
|
|
809
|
-
const SESSION_WEBSOCKET_CACHE_TTL_MS = 3e5;
|
|
810
|
-
const SESSION_WEBSOCKET_MAX_AGE_MS = 33e5;
|
|
811
|
-
const WEBSOCKET_OPEN_STATE = 1;
|
|
812
|
-
const websocketSessionCache = /* @__PURE__ */ new Map();
|
|
813
|
-
const degradedWebSocketConnections = /* @__PURE__ */ new Map();
|
|
814
|
-
function isOfficialOpenAIResponsesBaseUrl(baseUrl) {
|
|
815
|
-
if (!baseUrl) return false;
|
|
816
|
-
try {
|
|
817
|
-
const url = new URL(baseUrl);
|
|
818
|
-
return url.origin === "https://api.openai.com" && url.username === "" && url.password === "" && url.search === "" && url.hash === "" && url.pathname.replace(/\/+$/, "") === "/v1";
|
|
819
|
-
} catch {
|
|
820
|
-
return false;
|
|
821
|
-
}
|
|
822
|
-
}
|
|
823
|
-
function supportsNativeOpenAIResponsesEndpoint(params) {
|
|
824
|
-
return params.provider.trim().toLowerCase() === "openai" && params.api === "openai-responses" && isOfficialOpenAIResponsesBaseUrl(params.baseUrl);
|
|
825
|
-
}
|
|
826
|
-
function closeWebSocketSilently(socket, reason = "done") {
|
|
827
|
-
try {
|
|
828
|
-
socket.close({
|
|
829
|
-
code: 1e3,
|
|
830
|
-
reason
|
|
831
|
-
});
|
|
832
|
-
} catch {}
|
|
833
|
-
}
|
|
834
|
-
function invalidateOwnedWebSocketSession(cacheKey, entry, reason = "done") {
|
|
835
|
-
if (entry.idleTimer) {
|
|
836
|
-
clearTimeout(entry.idleTimer);
|
|
837
|
-
entry.idleTimer = void 0;
|
|
838
|
-
}
|
|
839
|
-
closeWebSocketSilently(entry.socket, reason);
|
|
840
|
-
entry.steeringContinuation?.steering.close(/* @__PURE__ */ new Error("Responses steering connection closed"));
|
|
841
|
-
entry.steeringContinuation?.iterator.return?.().catch(() => void 0);
|
|
842
|
-
entry.steeringContinuation = void 0;
|
|
843
|
-
if (websocketSessionCache.get(cacheKey) === entry) websocketSessionCache.delete(cacheKey);
|
|
844
|
-
}
|
|
845
|
-
function scheduleSessionWebSocketExpiry(cacheKey, entry) {
|
|
846
|
-
if (entry.idleTimer) clearTimeout(entry.idleTimer);
|
|
847
|
-
entry.idleTimer = setTimeout(() => {
|
|
848
|
-
if (entry.busy) return;
|
|
849
|
-
invalidateOwnedWebSocketSession(cacheKey, entry, "idle_timeout");
|
|
850
|
-
}, SESSION_WEBSOCKET_CACHE_TTL_MS);
|
|
851
|
-
entry.idleTimer.unref?.();
|
|
852
|
-
}
|
|
853
|
-
function prepareWebSocketConnection(client, headers) {
|
|
854
|
-
if (!isOfficialOpenAIResponsesBaseUrl(client.baseURL)) throw new Error("OpenAI Responses WebSocket requires the official API endpoint");
|
|
855
|
-
if (typeof client.apiKey !== "string" || client.apiKey.length === 0) throw new Error("OpenAI Responses WebSocket requires an API key");
|
|
856
|
-
const resolvedApiKey = getAiTransportHost().resolveSecretSentinel(client.apiKey);
|
|
857
|
-
const resolvedHeaders = { ...resolveAiTransportHeaderSentinels(headers) };
|
|
858
|
-
for (const key of Object.keys(resolvedHeaders)) {
|
|
859
|
-
const normalizedKey = key.toLowerCase();
|
|
860
|
-
if (normalizedKey === "authorization" || normalizedKey === "traceparent") delete resolvedHeaders[key];
|
|
861
|
-
}
|
|
862
|
-
if (!resolvedApiKey) throw new Error("OpenAI Responses WebSocket requires a resolved API key");
|
|
863
|
-
return {
|
|
864
|
-
client: client.withOptions({ apiKey: resolvedApiKey }),
|
|
865
|
-
headers: resolvedHeaders,
|
|
866
|
-
identity: sha256Hex(JSON.stringify([
|
|
867
|
-
resolvedApiKey,
|
|
868
|
-
client.baseURL,
|
|
869
|
-
Object.entries(resolvedHeaders).toSorted(([a], [b]) => a.localeCompare(b))
|
|
870
|
-
]))
|
|
871
|
-
};
|
|
872
|
-
}
|
|
873
|
-
function createWebSocket(connection, onError) {
|
|
874
|
-
const socket = new ResponsesWS(connection.client, {
|
|
875
|
-
headers: connection.headers,
|
|
876
|
-
maxQueueSize: 1
|
|
877
|
-
});
|
|
878
|
-
socket.on("error", () => onError(socket));
|
|
879
|
-
return socket;
|
|
880
|
-
}
|
|
881
|
-
function createTransientWebSocketLease(connection) {
|
|
882
|
-
const socket = createWebSocket(connection, (failedSocket) => closeWebSocketSilently(failedSocket, "transport_error"));
|
|
883
|
-
return {
|
|
884
|
-
socket,
|
|
885
|
-
iterator: socket.stream(),
|
|
886
|
-
reusedConnection: false,
|
|
887
|
-
release: () => closeWebSocketSilently(socket)
|
|
888
|
-
};
|
|
889
|
-
}
|
|
890
|
-
function createCachedWebSocketLease(cacheKey, entry, reusedConnection) {
|
|
891
|
-
entry.busy = true;
|
|
892
|
-
const steeringContinuation = entry.steeringContinuation;
|
|
893
|
-
entry.steeringContinuation = void 0;
|
|
894
|
-
return {
|
|
895
|
-
socket: entry.socket,
|
|
896
|
-
iterator: steeringContinuation?.iterator ?? entry.socket.stream(),
|
|
897
|
-
entry,
|
|
898
|
-
reusedConnection,
|
|
899
|
-
steeringContinuation,
|
|
900
|
-
release: ({ keep } = {}) => {
|
|
901
|
-
if (!keep || entry.socket.socket.readyState !== WEBSOCKET_OPEN_STATE) {
|
|
902
|
-
invalidateOwnedWebSocketSession(cacheKey, entry);
|
|
903
|
-
return;
|
|
904
|
-
}
|
|
905
|
-
entry.busy = false;
|
|
906
|
-
scheduleSessionWebSocketExpiry(cacheKey, entry);
|
|
907
|
-
}
|
|
908
|
-
};
|
|
909
|
-
}
|
|
910
|
-
function acquireWebSocket(params, connection) {
|
|
911
|
-
if (!(params.mode !== "websocket" && Boolean(params.sessionId)) || !params.sessionId) return createTransientWebSocketLease(connection);
|
|
912
|
-
const cacheKey = `${params.sessionId}\0${connection.identity}`;
|
|
913
|
-
const cached = websocketSessionCache.get(cacheKey);
|
|
914
|
-
if (cached) {
|
|
915
|
-
if (cached.idleTimer) {
|
|
916
|
-
clearTimeout(cached.idleTimer);
|
|
917
|
-
cached.idleTimer = void 0;
|
|
918
|
-
}
|
|
919
|
-
if (cached.busy) return createTransientWebSocketLease(connection);
|
|
920
|
-
const expired = Date.now() - cached.createdAt >= SESSION_WEBSOCKET_MAX_AGE_MS;
|
|
921
|
-
if (!expired && cached.socket.socket.readyState === WEBSOCKET_OPEN_STATE) return createCachedWebSocketLease(cacheKey, cached, true);
|
|
922
|
-
invalidateOwnedWebSocketSession(cacheKey, cached, expired ? "connection_age_limit" : "done");
|
|
923
|
-
}
|
|
924
|
-
const entry = {
|
|
925
|
-
socket: createWebSocket(connection, (failedSocket) => {
|
|
926
|
-
const failedEntry = websocketSessionCache.get(cacheKey);
|
|
927
|
-
if (failedEntry?.socket === failedSocket) invalidateOwnedWebSocketSession(cacheKey, failedEntry, "transport_error");
|
|
928
|
-
else closeWebSocketSilently(failedSocket, "transport_error");
|
|
929
|
-
}),
|
|
930
|
-
sessionId: params.sessionId,
|
|
931
|
-
busy: true,
|
|
932
|
-
createdAt: Date.now()
|
|
933
|
-
};
|
|
934
|
-
websocketSessionCache.set(cacheKey, entry);
|
|
935
|
-
return createCachedWebSocketLease(cacheKey, entry, false);
|
|
936
|
-
}
|
|
937
|
-
function sanitizeWebSocketRequest(request) {
|
|
938
|
-
const { stream: _stream, background: _background, ...websocketRequest } = request;
|
|
939
|
-
return websocketRequest;
|
|
940
|
-
}
|
|
941
|
-
async function nextWebSocketMessage(iterator, signal) {
|
|
942
|
-
if (!signal) return iterator.next();
|
|
943
|
-
if (signal.aborted) throw transportAbortError(signal);
|
|
944
|
-
let onAbort;
|
|
945
|
-
try {
|
|
946
|
-
return await Promise.race([iterator.next(), new Promise((_resolve, reject) => {
|
|
947
|
-
onAbort = () => reject(transportAbortError(signal));
|
|
948
|
-
signal.addEventListener("abort", onAbort, { once: true });
|
|
949
|
-
})]);
|
|
950
|
-
} finally {
|
|
951
|
-
if (onAbort) signal.removeEventListener("abort", onAbort);
|
|
952
|
-
}
|
|
953
|
-
}
|
|
954
|
-
function readServerEvent(message) {
|
|
955
|
-
if (message.type === "message") return message.message;
|
|
956
|
-
if (message.type === "error") throw parseOpenAIResponsesWebSocketServerError(message.error) ?? new Error("OpenAI Responses WebSocket transport failed", { cause: message.error });
|
|
957
|
-
if (message.type === "close") throw new Error(`OpenAI Responses WebSocket closed before completion (code ${message.code})`);
|
|
958
|
-
}
|
|
959
|
-
function createOpenAIResponsesWebSocketStream(params) {
|
|
960
|
-
const connection = prepareWebSocketConnection(params.client, params.headers);
|
|
961
|
-
let fullRequest = sanitizeWebSocketRequest(params.request);
|
|
962
|
-
const requestModel = typeof fullRequest.model === "string" ? fullRequest.model : "";
|
|
963
|
-
const degradationKey = `${params.sessionId ?? ""}\0${connection.identity}\0${requestModel}`;
|
|
964
|
-
const degraded = degradedWebSocketConnections.get(degradationKey);
|
|
965
|
-
if (degraded && degraded.retryAt > Date.now()) throw new OpenAIResponsesWebSocketPreDispatchError(/* @__PURE__ */ new Error("OpenAI Responses WebSocket is cooling down after a transport failure"));
|
|
966
|
-
degradedWebSocketConnections.delete(degradationKey);
|
|
967
|
-
const markDegraded = () => {
|
|
968
|
-
const cooldownMs = params.degradeCooldownMs;
|
|
969
|
-
if (cooldownMs === void 0 || !Number.isFinite(cooldownMs) || cooldownMs <= 0) return;
|
|
970
|
-
degradedWebSocketConnections.set(degradationKey, {
|
|
971
|
-
sessionId: params.sessionId,
|
|
972
|
-
retryAt: Date.now() + cooldownMs
|
|
973
|
-
});
|
|
974
|
-
};
|
|
975
|
-
let lease;
|
|
976
|
-
try {
|
|
977
|
-
lease = acquireWebSocket(params, connection);
|
|
978
|
-
} catch (error) {
|
|
979
|
-
markDegraded();
|
|
980
|
-
throw new OpenAIResponsesWebSocketPreDispatchError(error);
|
|
981
|
-
}
|
|
982
|
-
let prepared;
|
|
983
|
-
let previousContinuation;
|
|
984
|
-
const resumedSteering = lease.steeringContinuation;
|
|
985
|
-
const steeringMode = resumedSteering ? resumedSteering.requiresInput ? "required-input" : "automatic" : void 0;
|
|
986
|
-
try {
|
|
987
|
-
const continuation = previousContinuation = lease.entry?.continuation;
|
|
988
|
-
if (continuation && lease.entry) {
|
|
989
|
-
lease.entry.continuation = void 0;
|
|
990
|
-
prepared = resolveResponsesContinuationRequest(continuation, fullRequest, steeringMode);
|
|
991
|
-
} else {
|
|
992
|
-
fullRequest = params.restoreRequest?.(fullRequest) ?? fullRequest;
|
|
993
|
-
prepared = {
|
|
994
|
-
request: fullRequest,
|
|
995
|
-
continuationStatus: lease.entry ? "no_previous_response" : "socket_not_cached"
|
|
996
|
-
};
|
|
997
|
-
}
|
|
998
|
-
} catch (error) {
|
|
999
|
-
lease.iterator.return?.().catch(() => void 0);
|
|
1000
|
-
lease.release({ keep: false });
|
|
1001
|
-
throw error;
|
|
1002
|
-
}
|
|
1003
|
-
let streamStarted = false;
|
|
1004
|
-
let terminalResponse;
|
|
1005
|
-
let terminalReceived = false;
|
|
1006
|
-
let released = false;
|
|
1007
|
-
let retainIterator = false;
|
|
1008
|
-
let deferredInput = false;
|
|
1009
|
-
let inputReplay;
|
|
1010
|
-
if (resumedSteering) try {
|
|
1011
|
-
if (prepared.continuationStatus !== "continued" || !prepared.request.previous_response_id) throw new Error("Responses steering continuation changed its request or history");
|
|
1012
|
-
const input = omitAcceptedSteering(prepared.request.input ?? [], resumedSteering.acceptedInput);
|
|
1013
|
-
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");
|
|
1014
|
-
const baseline = prepared.fullRequest ?? fullRequest;
|
|
1015
|
-
const priorLength = (baseline.input?.length ?? 0) - (prepared.request.input?.length ?? 0);
|
|
1016
|
-
const fingerprints = input.map(responsesInputFingerprint);
|
|
1017
|
-
if (fingerprints.length > 0) inputReplay = {
|
|
1018
|
-
afterResponseId: prepared.request.previous_response_id,
|
|
1019
|
-
before: resumedSteering.requiresInput ? fingerprints : [],
|
|
1020
|
-
after: resumedSteering.requiresInput ? [] : fingerprints
|
|
1021
|
-
};
|
|
1022
|
-
const delivered = resumedSteering.requiresInput ? input : [];
|
|
1023
|
-
prepared.fullRequest = {
|
|
1024
|
-
...baseline,
|
|
1025
|
-
input: [
|
|
1026
|
-
...(baseline.input ?? []).slice(0, priorLength),
|
|
1027
|
-
...resumedSteering.acceptedInput,
|
|
1028
|
-
...delivered
|
|
1029
|
-
]
|
|
1030
|
-
};
|
|
1031
|
-
prepared.request = {
|
|
1032
|
-
...prepared.request,
|
|
1033
|
-
input: delivered
|
|
1034
|
-
};
|
|
1035
|
-
deferredInput = !resumedSteering.requiresInput && input.length > 0;
|
|
1036
|
-
} catch (error) {
|
|
1037
|
-
lease.iterator.return?.().catch(() => void 0);
|
|
1038
|
-
lease.release({ keep: false });
|
|
1039
|
-
throw new OpenAIResponsesWebSocketPostDispatchError(error);
|
|
1040
|
-
}
|
|
1041
|
-
const steering = lease.entry && params.onActiveResponse && params.steeringInput ? createResponsesSteering({
|
|
1042
|
-
onActiveResponse: params.onActiveResponse,
|
|
1043
|
-
toInput: params.steeringInput,
|
|
1044
|
-
send: (event) => lease.socket.sendRaw(JSON.stringify(event)),
|
|
1045
|
-
needsContinuation: () => deferredInput,
|
|
1046
|
-
assertActive: () => {
|
|
1047
|
-
if (released || terminalReceived || params.signal?.aborted) throw new Error("Responses steering is no longer active");
|
|
1048
|
-
}
|
|
1049
|
-
}) : void 0;
|
|
1050
|
-
const finish = ({ keep = true } = {}) => {
|
|
1051
|
-
if (released) return;
|
|
1052
|
-
released = true;
|
|
1053
|
-
if (keep && lease.entry && terminalResponse) lease.entry.continuation = recordResponsesContinuationState(previousContinuation, prepared.fullRequest ?? fullRequest, terminalResponse, previousContinuation?.lastResponseId === prepared.request.previous_response_id);
|
|
1054
|
-
lease.release({ keep });
|
|
1055
|
-
};
|
|
1056
|
-
return {
|
|
1057
|
-
stream: { async *[Symbol.asyncIterator]() {
|
|
1058
|
-
if (streamStarted) throw new Error("OpenAI Responses WebSocket stream can only be consumed once");
|
|
1059
|
-
streamStarted = true;
|
|
1060
|
-
const iterator = lease.iterator;
|
|
1061
|
-
let requestDispatched = false;
|
|
1062
|
-
try {
|
|
1063
|
-
if (params.signal?.aborted) throw transportAbortError(params.signal);
|
|
1064
|
-
if (resumedSteering) {
|
|
1065
|
-
requestDispatched = true;
|
|
1066
|
-
if (resumedSteering.requiresInput) lease.socket.send({
|
|
1067
|
-
...prepared.request,
|
|
1068
|
-
type: "response.create"
|
|
1069
|
-
});
|
|
1070
|
-
}
|
|
1071
|
-
for (;;) {
|
|
1072
|
-
const buffered = resumedSteering?.buffered.shift();
|
|
1073
|
-
const next = buffered ? {
|
|
1074
|
-
value: buffered,
|
|
1075
|
-
done: false
|
|
1076
|
-
} : await nextWebSocketMessage(iterator, params.signal);
|
|
1077
|
-
if (next.done) throw new Error("OpenAI Responses WebSocket closed before a terminal response event");
|
|
1078
|
-
if (next.value.type === "open") {
|
|
1079
|
-
if (!requestDispatched) {
|
|
1080
|
-
requestDispatched = true;
|
|
1081
|
-
lease.socket.send({
|
|
1082
|
-
...prepared.request,
|
|
1083
|
-
type: "response.create"
|
|
1084
|
-
});
|
|
1085
|
-
}
|
|
1086
|
-
continue;
|
|
1087
|
-
}
|
|
1088
|
-
const event = readServerEvent(next.value);
|
|
1089
|
-
if (!event) continue;
|
|
1090
|
-
if (isRecord(event) && typeof event.type === "string" && event.type.startsWith("response.steer.")) {
|
|
1091
|
-
if ((isRecord(event.steer) && event.steer.previous_response_id === steering?.responseId ? steering : resumedSteering?.steering ?? steering)?.handle(event)) continue;
|
|
1092
|
-
}
|
|
1093
|
-
steering?.handle(event);
|
|
1094
|
-
if (event.type === "response.completed") terminalResponse = event.response;
|
|
1095
|
-
terminalReceived = event.type === "response.completed" || event.type === "response.incomplete" || event.type === "response.failed";
|
|
1096
|
-
if (terminalReceived) {
|
|
1097
|
-
steering?.seal();
|
|
1098
|
-
if (event.type === "response.failed") steering?.close(/* @__PURE__ */ new Error("Responses failed before steering could be applied"));
|
|
1099
|
-
const continuationBuffer = [];
|
|
1100
|
-
for (;;) {
|
|
1101
|
-
if (!steering?.pending) break;
|
|
1102
|
-
const acknowledgement = await nextWebSocketMessage(iterator, params.signal);
|
|
1103
|
-
if (acknowledgement.done) throw new Error("Responses closed before acknowledging steering");
|
|
1104
|
-
const acknowledgedEvent = readServerEvent(acknowledgement.value);
|
|
1105
|
-
if (!steering.handle(acknowledgedEvent)) continuationBuffer.push(acknowledgement.value);
|
|
1106
|
-
}
|
|
1107
|
-
const acceptedInput = steering?.acceptedInput ?? [];
|
|
1108
|
-
const isSteered = event.type === "response.incomplete" && isRecord(event.response.incomplete_details) && event.response.incomplete_details.reason === "steered";
|
|
1109
|
-
if (lease.entry && steering && acceptedInput.length > 0 && (event.type === "response.completed" || isSteered)) {
|
|
1110
|
-
if (event.type === "response.incomplete") terminalResponse = event.response;
|
|
1111
|
-
lease.entry.steeringContinuation = {
|
|
1112
|
-
iterator,
|
|
1113
|
-
buffered: continuationBuffer,
|
|
1114
|
-
acceptedInput,
|
|
1115
|
-
requiresInput: (terminalResponse?.output ?? []).some((item) => (item.type === "function_call" || item.type === "custom_tool_call") && !(isRecord(item) && item.async === true) || item.type === "mcp_approval_request"),
|
|
1116
|
-
steering,
|
|
1117
|
-
instructions: fullRequest.instructions,
|
|
1118
|
-
tools: fullRequest.tools
|
|
1119
|
-
};
|
|
1120
|
-
retainIterator = true;
|
|
1121
|
-
if (isSteered) {
|
|
1122
|
-
yield {
|
|
1123
|
-
...event,
|
|
1124
|
-
type: "response.completed",
|
|
1125
|
-
response: {
|
|
1126
|
-
...event.response,
|
|
1127
|
-
status: "completed",
|
|
1128
|
-
incomplete_details: null
|
|
1129
|
-
}
|
|
1130
|
-
};
|
|
1131
|
-
return;
|
|
1132
|
-
}
|
|
1133
|
-
}
|
|
1134
|
-
}
|
|
1135
|
-
yield event;
|
|
1136
|
-
if (terminalReceived) {
|
|
1137
|
-
degradedWebSocketConnections.delete(degradationKey);
|
|
1138
|
-
return;
|
|
1139
|
-
}
|
|
1140
|
-
}
|
|
1141
|
-
} catch (error) {
|
|
1142
|
-
const steeringDispatched = Boolean(steering?.pending || steering?.acceptedInput.length || resumedSteering);
|
|
1143
|
-
steering?.close(error instanceof Error ? error : /* @__PURE__ */ new Error("Responses steering failed"));
|
|
1144
|
-
if (lease.entry) lease.entry.continuation = void 0;
|
|
1145
|
-
const safeRetry = error instanceof OpenAIResponsesWebSocketSafeRetryError && !steeringDispatched;
|
|
1146
|
-
if (!params.callerSignal?.aborted && !safeRetry) markDegraded();
|
|
1147
|
-
if (!requestDispatched && !params.signal?.aborted) throw new OpenAIResponsesWebSocketPreDispatchError(error);
|
|
1148
|
-
if (!requestDispatched || params.callerSignal?.aborted || safeRetry) throw error;
|
|
1149
|
-
throw new OpenAIResponsesWebSocketPostDispatchError(error);
|
|
1150
|
-
} finally {
|
|
1151
|
-
steering?.seal();
|
|
1152
|
-
if (!retainIterator) {
|
|
1153
|
-
steering?.close(/* @__PURE__ */ new Error("Responses stream ended before steering was confirmed"));
|
|
1154
|
-
await iterator.return?.().catch(() => void 0);
|
|
1155
|
-
}
|
|
1156
|
-
if (!terminalReceived) finish({ keep: false });
|
|
1157
|
-
}
|
|
1158
|
-
} },
|
|
1159
|
-
request: prepared.request,
|
|
1160
|
-
fullRequest: prepared.fullRequest ?? fullRequest,
|
|
1161
|
-
reusedConnection: lease.reusedConnection,
|
|
1162
|
-
continuationStatus: prepared.continuationStatus,
|
|
1163
|
-
inputReplay,
|
|
1164
|
-
finish
|
|
1165
|
-
};
|
|
1166
|
-
}
|
|
1167
|
-
function closeOpenAIResponsesWebSocketSessions(sessionId) {
|
|
1168
|
-
for (const [cacheKey, entry] of websocketSessionCache) {
|
|
1169
|
-
if (sessionId && entry.sessionId !== sessionId) continue;
|
|
1170
|
-
invalidateOwnedWebSocketSession(cacheKey, entry, "session_cleanup");
|
|
1171
|
-
}
|
|
1172
|
-
for (const [key, entry] of degradedWebSocketConnections) if (!sessionId || entry.sessionId === sessionId) degradedWebSocketConnections.delete(key);
|
|
1173
|
-
}
|
|
1174
|
-
registerSessionResourceCleanup(closeOpenAIResponsesWebSocketSessions);
|
|
1175
|
-
//#endregion
|
|
1176
688
|
//#region packages/ai/src/transports/openai-responses-compact-client.ts
|
|
1177
689
|
async function postOpenAIResponsesCompaction(params) {
|
|
1178
690
|
const compactInput = typeof params.request.instructions === "string" && params.request.instructions.length > 0 ? [buildOpenAIResponsesCompactSystemMessage(params.model, params.request.instructions), ...params.request.input ?? []] : params.request.input;
|
|
@@ -1390,10 +902,13 @@ function createResponsesTransportExecutor(config) {
|
|
|
1390
902
|
enforceCodeModeResponsesToolSurface(params, visibleToolNames, allowedHostedToolTypes, codeModeToolSurfaceObserver.get(options));
|
|
1391
903
|
assertCodeModeResponsesToolSurface(params, visibleToolNames, allowedHostedToolTypes);
|
|
1392
904
|
}
|
|
1393
|
-
if (asyncToolExecutionEligible && params.model === "gpt-6-astra" && params.multi_agent?.enabled !== true && params.tools)
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
905
|
+
if (asyncToolExecutionEligible && params.model === "gpt-6-astra" && params.multi_agent?.enabled !== true && params.tools) {
|
|
906
|
+
const sync = new Set(context.tools?.flatMap((t) => t.async === false ? t.name : []));
|
|
907
|
+
params.tools = params.tools.map((tool) => tool.type === "function" && !sync.has(tool.name) ? {
|
|
908
|
+
...tool,
|
|
909
|
+
async: true
|
|
910
|
+
} : tool);
|
|
911
|
+
}
|
|
1397
912
|
return params;
|
|
1398
913
|
};
|
|
1399
914
|
const buildRequest = (replayMode, requestContext = context) => prepareRequest(config.buildRequest(model, requestContext, responsesOptions, turnState?.metadata, replayMode));
|
|
@@ -2109,4 +1624,4 @@ function prepareModelForSimpleCompletion(params) {
|
|
|
2109
1624
|
return wrap(model);
|
|
2110
1625
|
}
|
|
2111
1626
|
//#endregion
|
|
2112
|
-
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, buildTransportAwareSimpleStreamFn, canonicalizeMaxTokensParam, captureOpenAIResponsesCompaction, coerceTransportToolCallArguments, consumeGoogleGenerateContentStream, convertGoogleTools, copyProviderAcceptanceObserver, createAnthropicMessagesTransportStreamFn, createAzureOpenAIResponsesTransportStreamFn, createBoundaryAwareStreamFnForModel, createDeepSeekTextFilter, createEmptyTransportUsage, createModelStreamCooperativeScheduler, createOpenAICompletionsTransportStreamFn, createOpenAIProviderAcceptanceHook, createOpenAIResponseHook, createOpenAIResponsesTransportStreamFn, createOpenClawTransportStreamFnForModel, createResponseModelTracker, createTransportAwareStreamFnForModel, 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, throwIfModelStreamAborted, transportAbortError, usesNativeOpenAICodexResponsesBackend, withProviderAcceptanceObserver, withProviderResponseHook };
|
|
1627
|
+
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, buildTransportAwareSimpleStreamFn, canonicalizeMaxTokensParam, captureOpenAIResponsesCompaction, coerceTransportToolCallArguments, consumeGoogleGenerateContentStream, convertGoogleTools, copyProviderAcceptanceObserver, createAnthropicMessagesTransportStreamFn, createAzureOpenAIResponsesTransportStreamFn, createBoundaryAwareStreamFnForModel, createDeepSeekTextFilter, createEmptyTransportUsage, createModelStreamCooperativeScheduler, createOpenAICompletionsTransportStreamFn, createOpenAIProviderAcceptanceHook, createOpenAIResponseHook, createOpenAIResponsesTransportStreamFn, createOpenClawTransportStreamFnForModel, createResponseModelTracker, createTransportAwareStreamFnForModel, createWritableTransportEventStream, detachPartialSnapshot, 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, throwIfModelStreamAborted, transportAbortError, usesNativeOpenAICodexResponsesBackend, withProviderAcceptanceObserver, withProviderResponseHook };
|
|
@@ -384,6 +384,8 @@ declare const MALFORMED_TOOL_CALL_ARGUMENTS_ERROR_CODE = "malformed_tool_call_ar
|
|
|
384
384
|
/** User turn in a text-model conversation. */
|
|
385
385
|
interface UserMessage {
|
|
386
386
|
role: "user";
|
|
387
|
+
/** Host-generated context projected as a user message, not a human-authored turn. */
|
|
388
|
+
synthetic?: true;
|
|
387
389
|
content: string | (TextContent | ImageContent)[];
|
|
388
390
|
timestamp: number;
|
|
389
391
|
/**
|
|
@@ -394,6 +396,10 @@ interface UserMessage {
|
|
|
394
396
|
runtimeContextCarrier?: boolean;
|
|
395
397
|
/** Explicit replay-policy retention decision; absent preserves model-derived behavior. */
|
|
396
398
|
runtimeContextCarrierRetained?: boolean;
|
|
399
|
+
/** Operator-authored text projected to system authority on capable routes. */
|
|
400
|
+
operatorMessage?: {
|
|
401
|
+
turnScoped: boolean;
|
|
402
|
+
};
|
|
397
403
|
}
|
|
398
404
|
/** Assistant turn, including provider identity and final stop state. */
|
|
399
405
|
type AssistantDeliveryTtsFacts = {
|
|
@@ -475,6 +481,11 @@ interface Tool<TParameters extends TSchema = TSchema> {
|
|
|
475
481
|
name: string;
|
|
476
482
|
description: string;
|
|
477
483
|
parameters: TParameters;
|
|
484
|
+
/**
|
|
485
|
+
* `false` keeps calls synchronous where the provider can keep generating after a call
|
|
486
|
+
* (OpenAI async tools): the response pauses until earlier results are delivered.
|
|
487
|
+
*/
|
|
488
|
+
async?: false;
|
|
478
489
|
}
|
|
479
490
|
/** Text-model request context shared by provider adapters. */
|
|
480
491
|
interface Context {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import "./index-Iw8l620S.mjs";
|