openai 7.16.0 → 7.18.0
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/CHANGELOG.md +49 -0
- package/_vendor/zod-to-json-schema/Options.d.mts.map +1 -1
- package/_vendor/zod-to-json-schema/Options.d.ts.map +1 -1
- package/_vendor/zod-to-json-schema/Options.js +2 -0
- package/_vendor/zod-to-json-schema/Options.js.map +1 -1
- package/_vendor/zod-to-json-schema/Options.mjs +2 -0
- package/_vendor/zod-to-json-schema/Options.mjs.map +1 -1
- package/_vendor/zod-to-json-schema/parseDef.d.mts.map +1 -1
- package/_vendor/zod-to-json-schema/parseDef.d.ts.map +1 -1
- package/_vendor/zod-to-json-schema/parseDef.js +1 -0
- package/_vendor/zod-to-json-schema/parseDef.js.map +1 -1
- package/_vendor/zod-to-json-schema/parseDef.mjs +1 -0
- package/_vendor/zod-to-json-schema/parseDef.mjs.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/bigint.d.mts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/bigint.d.ts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/bigint.js +2 -0
- package/_vendor/zod-to-json-schema/parsers/bigint.js.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/bigint.mjs +2 -0
- package/_vendor/zod-to-json-schema/parsers/bigint.mjs.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/literal.d.mts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/literal.d.ts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/literal.js +1 -0
- package/_vendor/zod-to-json-schema/parsers/literal.js.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/literal.mjs +1 -0
- package/_vendor/zod-to-json-schema/parsers/literal.mjs.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/null.d.mts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/null.d.ts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/null.js +1 -0
- package/_vendor/zod-to-json-schema/parsers/null.js.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/null.mjs +1 -0
- package/_vendor/zod-to-json-schema/parsers/null.mjs.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/nullable.d.mts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/nullable.d.ts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/nullable.js +4 -0
- package/_vendor/zod-to-json-schema/parsers/nullable.js.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/nullable.mjs +4 -0
- package/_vendor/zod-to-json-schema/parsers/nullable.mjs.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/number.d.mts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/number.d.ts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/number.js +2 -0
- package/_vendor/zod-to-json-schema/parsers/number.js.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/number.mjs +2 -0
- package/_vendor/zod-to-json-schema/parsers/number.mjs.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/optional.d.mts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/optional.d.ts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/optional.js +6 -7
- package/_vendor/zod-to-json-schema/parsers/optional.js.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/optional.mjs +6 -7
- package/_vendor/zod-to-json-schema/parsers/optional.mjs.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/record.d.mts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/record.d.ts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/record.js +2 -0
- package/_vendor/zod-to-json-schema/parsers/record.js.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/record.mjs +2 -0
- package/_vendor/zod-to-json-schema/parsers/record.mjs.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/string.d.mts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/string.d.ts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/string.js +1 -0
- package/_vendor/zod-to-json-schema/parsers/string.js.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/string.mjs +1 -0
- package/_vendor/zod-to-json-schema/parsers/string.mjs.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/union.d.mts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/union.d.ts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/union.js +3 -0
- package/_vendor/zod-to-json-schema/parsers/union.js.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/union.mjs +3 -0
- package/_vendor/zod-to-json-schema/parsers/union.mjs.map +1 -1
- package/_vendor/zod-to-json-schema/util.d.mts.map +1 -1
- package/_vendor/zod-to-json-schema/util.d.ts.map +1 -1
- package/_vendor/zod-to-json-schema/util.js +1 -0
- package/_vendor/zod-to-json-schema/util.js.map +1 -1
- package/_vendor/zod-to-json-schema/util.mjs +1 -0
- package/_vendor/zod-to-json-schema/util.mjs.map +1 -1
- package/_vendor/zod-to-json-schema/zodToJsonSchema.d.mts.map +1 -1
- package/_vendor/zod-to-json-schema/zodToJsonSchema.d.ts.map +1 -1
- package/_vendor/zod-to-json-schema/zodToJsonSchema.js +2 -0
- package/_vendor/zod-to-json-schema/zodToJsonSchema.js.map +1 -1
- package/_vendor/zod-to-json-schema/zodToJsonSchema.mjs +2 -0
- package/_vendor/zod-to-json-schema/zodToJsonSchema.mjs.map +1 -1
- package/auth/subject-token-providers.d.mts.map +1 -1
- package/auth/subject-token-providers.d.ts.map +1 -1
- package/auth/subject-token-providers.js +6 -1
- package/auth/subject-token-providers.js.map +1 -1
- package/auth/subject-token-providers.mjs +6 -1
- package/auth/subject-token-providers.mjs.map +1 -1
- package/auth/workload-identity-auth.d.mts.map +1 -1
- package/auth/workload-identity-auth.d.ts.map +1 -1
- package/auth/workload-identity-auth.js +9 -0
- package/auth/workload-identity-auth.js.map +1 -1
- package/auth/workload-identity-auth.mjs +9 -0
- package/auth/workload-identity-auth.mjs.map +1 -1
- package/auth/x509-transport.d.mts.map +1 -1
- package/auth/x509-transport.d.ts.map +1 -1
- package/auth/x509-transport.js +11 -0
- package/auth/x509-transport.js.map +1 -1
- package/auth/x509-transport.mjs +11 -0
- package/auth/x509-transport.mjs.map +1 -1
- package/azure.d.mts.map +1 -1
- package/azure.d.ts.map +1 -1
- package/azure.js +3 -0
- package/azure.js.map +1 -1
- package/azure.mjs +3 -0
- package/azure.mjs.map +1 -1
- package/bedrock.d.mts.map +1 -1
- package/bedrock.d.ts.map +1 -1
- package/bedrock.js +5 -0
- package/bedrock.js.map +1 -1
- package/bedrock.mjs +5 -0
- package/bedrock.mjs.map +1 -1
- package/beta/realtime/internal-base.d.mts.map +1 -1
- package/beta/realtime/internal-base.d.ts.map +1 -1
- package/beta/realtime/internal-base.js +1 -0
- package/beta/realtime/internal-base.js.map +1 -1
- package/beta/realtime/internal-base.mjs +1 -0
- package/beta/realtime/internal-base.mjs.map +1 -1
- package/beta/realtime/websocket.d.mts.map +1 -1
- package/beta/realtime/websocket.d.ts.map +1 -1
- package/beta/realtime/websocket.js +9 -1
- package/beta/realtime/websocket.js.map +1 -1
- package/beta/realtime/websocket.mjs +9 -1
- package/beta/realtime/websocket.mjs.map +1 -1
- package/beta/realtime/ws.d.mts.map +1 -1
- package/beta/realtime/ws.d.ts.map +1 -1
- package/beta/realtime/ws.js +3 -0
- package/beta/realtime/ws.js.map +1 -1
- package/beta/realtime/ws.mjs +3 -0
- package/beta/realtime/ws.mjs.map +1 -1
- package/client.d.mts +3 -0
- package/client.d.mts.map +1 -1
- package/client.d.ts +3 -0
- package/client.d.ts.map +1 -1
- package/client.js +39 -6
- package/client.js.map +1 -1
- package/client.mjs +39 -6
- package/client.mjs.map +1 -1
- package/core/EventEmitter.d.mts.map +1 -1
- package/core/EventEmitter.d.ts.map +1 -1
- package/core/EventEmitter.js +15 -0
- package/core/EventEmitter.js.map +1 -1
- package/core/EventEmitter.mjs +15 -0
- package/core/EventEmitter.mjs.map +1 -1
- package/core/streaming.d.mts +1 -0
- package/core/streaming.d.mts.map +1 -1
- package/core/streaming.d.ts +1 -0
- package/core/streaming.d.ts.map +1 -1
- package/core/streaming.js +28 -1
- package/core/streaming.js.map +1 -1
- package/core/streaming.mjs +28 -1
- package/core/streaming.mjs.map +1 -1
- package/helpers/audio.d.mts.map +1 -1
- package/helpers/audio.d.ts.map +1 -1
- package/helpers/audio.js +2 -0
- package/helpers/audio.js.map +1 -1
- package/helpers/audio.mjs +2 -0
- package/helpers/audio.mjs.map +1 -1
- package/helpers/standard-schema.d.mts.map +1 -1
- package/helpers/standard-schema.d.ts.map +1 -1
- package/helpers/standard-schema.js +28 -18
- package/helpers/standard-schema.js.map +1 -1
- package/helpers/standard-schema.mjs +28 -18
- package/helpers/standard-schema.mjs.map +1 -1
- package/helpers/zod-v3-strict-schema.d.mts.map +1 -1
- package/helpers/zod-v3-strict-schema.d.ts.map +1 -1
- package/helpers/zod-v3-strict-schema.js +5 -0
- package/helpers/zod-v3-strict-schema.js.map +1 -1
- package/helpers/zod-v3-strict-schema.mjs +5 -0
- package/helpers/zod-v3-strict-schema.mjs.map +1 -1
- package/helpers/zod.d.mts.map +1 -1
- package/helpers/zod.d.ts.map +1 -1
- package/helpers/zod.js +16 -1
- package/helpers/zod.js.map +1 -1
- package/helpers/zod.mjs +17 -2
- package/helpers/zod.mjs.map +1 -1
- package/internal/assistant-stream-delta.d.mts.map +1 -1
- package/internal/assistant-stream-delta.d.ts.map +1 -1
- package/internal/assistant-stream-delta.js +8 -1
- package/internal/assistant-stream-delta.js.map +1 -1
- package/internal/assistant-stream-delta.mjs +8 -1
- package/internal/assistant-stream-delta.mjs.map +1 -1
- package/internal/auth/x509-credential-options.d.mts.map +1 -1
- package/internal/auth/x509-credential-options.d.ts.map +1 -1
- package/internal/auth/x509-credential-options.js +3 -0
- package/internal/auth/x509-credential-options.js.map +1 -1
- package/internal/auth/x509-credential-options.mjs +3 -0
- package/internal/auth/x509-credential-options.mjs.map +1 -1
- package/internal/auth/x509-token-exchange.d.mts.map +1 -1
- package/internal/auth/x509-token-exchange.d.ts.map +1 -1
- package/internal/auth/x509-token-exchange.js +2 -0
- package/internal/auth/x509-token-exchange.js.map +1 -1
- package/internal/auth/x509-token-exchange.mjs +2 -0
- package/internal/auth/x509-token-exchange.mjs.map +1 -1
- package/internal/auth/x509-transport-capability.d.mts.map +1 -1
- package/internal/auth/x509-transport-capability.d.ts.map +1 -1
- package/internal/auth/x509-transport-capability.js +1 -0
- package/internal/auth/x509-transport-capability.js.map +1 -1
- package/internal/auth/x509-transport-capability.mjs +1 -0
- package/internal/auth/x509-transport-capability.mjs.map +1 -1
- package/internal/auth/x509-transport-state.mjs +1 -0
- package/internal/auth/x509-workload-identity-auth.d.mts.map +1 -1
- package/internal/auth/x509-workload-identity-auth.d.ts.map +1 -1
- package/internal/auth/x509-workload-identity-auth.js +11 -0
- package/internal/auth/x509-workload-identity-auth.js.map +1 -1
- package/internal/auth/x509-workload-identity-auth.mjs +11 -0
- package/internal/auth/x509-workload-identity-auth.mjs.map +1 -1
- package/internal/bedrock.d.mts.map +1 -1
- package/internal/bedrock.d.ts.map +1 -1
- package/internal/bedrock.js +17 -1
- package/internal/bedrock.js.map +1 -1
- package/internal/bedrock.mjs +17 -1
- package/internal/bedrock.mjs.map +1 -1
- package/internal/decoders/line.d.mts.map +1 -1
- package/internal/decoders/line.d.ts.map +1 -1
- package/internal/decoders/line.js +1 -0
- package/internal/decoders/line.js.map +1 -1
- package/internal/decoders/line.mjs +1 -0
- package/internal/decoders/line.mjs.map +1 -1
- package/internal/parse.d.mts +1 -0
- package/internal/parse.d.mts.map +1 -1
- package/internal/parse.d.ts +1 -0
- package/internal/parse.d.ts.map +1 -1
- package/internal/parse.js.map +1 -1
- package/internal/parse.mjs.map +1 -1
- package/internal/provider.d.mts.map +1 -1
- package/internal/provider.d.ts.map +1 -1
- package/internal/provider.js +3 -0
- package/internal/provider.js.map +1 -1
- package/internal/provider.mjs +3 -0
- package/internal/provider.mjs.map +1 -1
- package/internal/qs/stringify.d.mts.map +1 -1
- package/internal/qs/stringify.d.ts.map +1 -1
- package/internal/qs/stringify.js +3 -0
- package/internal/qs/stringify.js.map +1 -1
- package/internal/qs/stringify.mjs +3 -0
- package/internal/qs/stringify.mjs.map +1 -1
- package/internal/qs/utils.d.mts.map +1 -1
- package/internal/qs/utils.d.ts.map +1 -1
- package/internal/qs/utils.js +15 -3
- package/internal/qs/utils.js.map +1 -1
- package/internal/qs/utils.mjs +15 -3
- package/internal/qs/utils.mjs.map +1 -1
- package/internal/responses/response-accumulator.d.mts.map +1 -1
- package/internal/responses/response-accumulator.d.ts.map +1 -1
- package/internal/responses/response-accumulator.js +20 -4
- package/internal/responses/response-accumulator.js.map +1 -1
- package/internal/responses/response-accumulator.mjs +20 -4
- package/internal/responses/response-accumulator.mjs.map +1 -1
- package/internal/to-file.js.map +1 -1
- package/internal/to-file.mjs.map +1 -1
- package/internal/uploads.d.mts.map +1 -1
- package/internal/uploads.d.ts.map +1 -1
- package/internal/uploads.js +10 -0
- package/internal/uploads.js.map +1 -1
- package/internal/uploads.mjs +10 -0
- package/internal/uploads.mjs.map +1 -1
- package/internal/utils/abort.d.mts.map +1 -1
- package/internal/utils/abort.d.ts.map +1 -1
- package/internal/utils/abort.js +9 -2
- package/internal/utils/abort.js.map +1 -1
- package/internal/utils/abort.mjs +9 -2
- package/internal/utils/abort.mjs.map +1 -1
- package/internal/utils/bytes.d.mts.map +1 -1
- package/internal/utils/bytes.d.ts.map +1 -1
- package/internal/utils/bytes.js +2 -0
- package/internal/utils/bytes.js.map +1 -1
- package/internal/utils/bytes.mjs +2 -0
- package/internal/utils/bytes.mjs.map +1 -1
- package/internal/utils/path.d.mts.map +1 -1
- package/internal/utils/path.d.ts.map +1 -1
- package/internal/utils/path.js +2 -0
- package/internal/utils/path.js.map +1 -1
- package/internal/utils/path.mjs +2 -0
- package/internal/utils/path.mjs.map +1 -1
- package/internal/utils/sleep.d.mts +1 -1
- package/internal/utils/sleep.d.mts.map +1 -1
- package/internal/utils/sleep.d.ts +1 -1
- package/internal/utils/sleep.d.ts.map +1 -1
- package/internal/utils/sleep.js +51 -1
- package/internal/utils/sleep.js.map +1 -1
- package/internal/utils/sleep.mjs +51 -1
- package/internal/utils/sleep.mjs.map +1 -1
- package/internal/ws-adapter-browser.d.mts.map +1 -1
- package/internal/ws-adapter-browser.d.ts.map +1 -1
- package/internal/ws-adapter-browser.js +2 -0
- package/internal/ws-adapter-browser.js.map +1 -1
- package/internal/ws-adapter-browser.mjs +2 -0
- package/internal/ws-adapter-browser.mjs.map +1 -1
- package/internal/ws.d.mts +16 -0
- package/internal/ws.d.mts.map +1 -1
- package/internal/ws.d.ts +16 -0
- package/internal/ws.d.ts.map +1 -1
- package/internal/ws.js +71 -5
- package/internal/ws.js.map +1 -1
- package/internal/ws.mjs +68 -6
- package/internal/ws.mjs.map +1 -1
- package/lib/AbstractChatCompletionRunner.d.mts.map +1 -1
- package/lib/AbstractChatCompletionRunner.d.ts.map +1 -1
- package/lib/AbstractChatCompletionRunner.js +41 -16
- package/lib/AbstractChatCompletionRunner.js.map +1 -1
- package/lib/AbstractChatCompletionRunner.mjs +42 -17
- package/lib/AbstractChatCompletionRunner.mjs.map +1 -1
- package/lib/AssistantStream.d.mts.map +1 -1
- package/lib/AssistantStream.d.ts.map +1 -1
- package/lib/AssistantStream.js +19 -5
- package/lib/AssistantStream.js.map +1 -1
- package/lib/AssistantStream.mjs +20 -6
- package/lib/AssistantStream.mjs.map +1 -1
- package/lib/ChatCompletionRunner.d.mts.map +1 -1
- package/lib/ChatCompletionRunner.d.ts.map +1 -1
- package/lib/ChatCompletionRunner.js +1 -0
- package/lib/ChatCompletionRunner.js.map +1 -1
- package/lib/ChatCompletionRunner.mjs +1 -0
- package/lib/ChatCompletionRunner.mjs.map +1 -1
- package/lib/ChatCompletionStream.d.mts +6 -1
- package/lib/ChatCompletionStream.d.mts.map +1 -1
- package/lib/ChatCompletionStream.d.ts +6 -1
- package/lib/ChatCompletionStream.d.ts.map +1 -1
- package/lib/ChatCompletionStream.js +63 -7
- package/lib/ChatCompletionStream.js.map +1 -1
- package/lib/ChatCompletionStream.mjs +64 -8
- package/lib/ChatCompletionStream.mjs.map +1 -1
- package/lib/EventEmitter.d.mts.map +1 -1
- package/lib/EventEmitter.d.ts.map +1 -1
- package/lib/EventEmitter.js +15 -0
- package/lib/EventEmitter.js.map +1 -1
- package/lib/EventEmitter.mjs +15 -0
- package/lib/EventEmitter.mjs.map +1 -1
- package/lib/EventStream.d.mts +2 -0
- package/lib/EventStream.d.mts.map +1 -1
- package/lib/EventStream.d.ts +2 -0
- package/lib/EventStream.d.ts.map +1 -1
- package/lib/EventStream.js +111 -14
- package/lib/EventStream.js.map +1 -1
- package/lib/EventStream.mjs +111 -14
- package/lib/EventStream.mjs.map +1 -1
- package/lib/ResponsesParser.d.mts.map +1 -1
- package/lib/ResponsesParser.d.ts.map +1 -1
- package/lib/ResponsesParser.js +4 -0
- package/lib/ResponsesParser.js.map +1 -1
- package/lib/ResponsesParser.mjs +4 -0
- package/lib/ResponsesParser.mjs.map +1 -1
- package/lib/RunnableFunction.d.mts.map +1 -1
- package/lib/RunnableFunction.d.ts.map +1 -1
- package/lib/RunnableFunction.js.map +1 -1
- package/lib/RunnableFunction.mjs.map +1 -1
- package/lib/agents/agent-session-stream.d.mts.map +1 -1
- package/lib/agents/agent-session-stream.d.ts.map +1 -1
- package/lib/agents/agent-session-stream.js +5 -2
- package/lib/agents/agent-session-stream.js.map +1 -1
- package/lib/agents/agent-session-stream.mjs +5 -2
- package/lib/agents/agent-session-stream.mjs.map +1 -1
- package/lib/embeddings.d.mts.map +1 -1
- package/lib/embeddings.d.ts.map +1 -1
- package/lib/embeddings.js +2 -0
- package/lib/embeddings.js.map +1 -1
- package/lib/embeddings.mjs +2 -0
- package/lib/embeddings.mjs.map +1 -1
- package/lib/live/transcript-grouper.d.mts.map +1 -1
- package/lib/live/transcript-grouper.d.ts.map +1 -1
- package/lib/live/transcript-grouper.js +8 -2
- package/lib/live/transcript-grouper.js.map +1 -1
- package/lib/live/transcript-grouper.mjs +8 -2
- package/lib/live/transcript-grouper.mjs.map +1 -1
- package/lib/parser.d.mts.map +1 -1
- package/lib/parser.d.ts.map +1 -1
- package/lib/parser.js +13 -0
- package/lib/parser.js.map +1 -1
- package/lib/parser.mjs +13 -0
- package/lib/parser.mjs.map +1 -1
- package/lib/responses/ResponseInputItems.d.mts.map +1 -1
- package/lib/responses/ResponseInputItems.d.ts.map +1 -1
- package/lib/responses/ResponseInputItems.js +11 -0
- package/lib/responses/ResponseInputItems.js.map +1 -1
- package/lib/responses/ResponseInputItems.mjs +11 -0
- package/lib/responses/ResponseInputItems.mjs.map +1 -1
- package/lib/responses/ResponseStream.d.mts.map +1 -1
- package/lib/responses/ResponseStream.d.ts.map +1 -1
- package/lib/responses/ResponseStream.js +7 -3
- package/lib/responses/ResponseStream.js.map +1 -1
- package/lib/responses/ResponseStream.mjs +8 -4
- package/lib/responses/ResponseStream.mjs.map +1 -1
- package/lib/responses/responses-websocket-lane.d.mts +63 -0
- package/lib/responses/responses-websocket-lane.d.mts.map +1 -0
- package/lib/responses/responses-websocket-lane.d.ts +63 -0
- package/lib/responses/responses-websocket-lane.d.ts.map +1 -0
- package/lib/responses/responses-websocket-lane.js +314 -0
- package/lib/responses/responses-websocket-lane.js.map +1 -0
- package/lib/responses/responses-websocket-lane.mjs +309 -0
- package/lib/responses/responses-websocket-lane.mjs.map +1 -0
- package/lib/responses/responses-websocket-session.d.mts +38 -0
- package/lib/responses/responses-websocket-session.d.mts.map +1 -0
- package/lib/responses/responses-websocket-session.d.ts +38 -0
- package/lib/responses/responses-websocket-session.d.ts.map +1 -0
- package/lib/responses/responses-websocket-session.js +268 -0
- package/lib/responses/responses-websocket-session.js.map +1 -0
- package/lib/responses/responses-websocket-session.mjs +263 -0
- package/lib/responses/responses-websocket-session.mjs.map +1 -0
- package/lib/transform.d.mts.map +1 -1
- package/lib/transform.d.ts.map +1 -1
- package/lib/transform.js +69 -33
- package/lib/transform.js.map +1 -1
- package/lib/transform.mjs +69 -33
- package/lib/transform.mjs.map +1 -1
- package/lib/webrtc/connection.d.mts.map +1 -1
- package/lib/webrtc/connection.d.ts.map +1 -1
- package/lib/webrtc/connection.js +6 -1
- package/lib/webrtc/connection.js.map +1 -1
- package/lib/webrtc/connection.mjs +6 -1
- package/lib/webrtc/connection.mjs.map +1 -1
- package/lib/webrtc/data-channel.d.mts.map +1 -1
- package/lib/webrtc/data-channel.d.ts.map +1 -1
- package/lib/webrtc/data-channel.js +9 -1
- package/lib/webrtc/data-channel.js.map +1 -1
- package/lib/webrtc/data-channel.mjs +9 -1
- package/lib/webrtc/data-channel.mjs.map +1 -1
- package/lib/webrtc/subscriptions.d.mts.map +1 -1
- package/lib/webrtc/subscriptions.d.ts.map +1 -1
- package/lib/webrtc/subscriptions.js +2 -0
- package/lib/webrtc/subscriptions.js.map +1 -1
- package/lib/webrtc/subscriptions.mjs +2 -0
- package/lib/webrtc/subscriptions.mjs.map +1 -1
- package/lib/webrtc/types.d.mts.map +1 -1
- package/lib/webrtc/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/providers/bedrock/aws.d.mts.map +1 -1
- package/providers/bedrock/aws.d.ts.map +1 -1
- package/providers/bedrock/aws.js +4 -0
- package/providers/bedrock/aws.js.map +1 -1
- package/providers/bedrock/aws.mjs +4 -0
- package/providers/bedrock/aws.mjs.map +1 -1
- package/realtime/internal-base.d.mts.map +1 -1
- package/realtime/internal-base.d.ts.map +1 -1
- package/realtime/internal-base.js +1 -0
- package/realtime/internal-base.js.map +1 -1
- package/realtime/internal-base.mjs +1 -0
- package/realtime/internal-base.mjs.map +1 -1
- package/realtime/websocket.d.mts.map +1 -1
- package/realtime/websocket.d.ts.map +1 -1
- package/realtime/websocket.js +9 -1
- package/realtime/websocket.js.map +1 -1
- package/realtime/websocket.mjs +9 -1
- package/realtime/websocket.mjs.map +1 -1
- package/realtime/ws.d.mts.map +1 -1
- package/realtime/ws.d.ts.map +1 -1
- package/realtime/ws.js +3 -0
- package/realtime/ws.js.map +1 -1
- package/realtime/ws.mjs +3 -0
- package/realtime/ws.mjs.map +1 -1
- package/resources/beta/agents/agents.d.mts +2 -1
- package/resources/beta/agents/agents.d.mts.map +1 -1
- package/resources/beta/agents/agents.d.ts +2 -1
- package/resources/beta/agents/agents.d.ts.map +1 -1
- package/resources/beta/agents/agents.js.map +1 -1
- package/resources/beta/agents/agents.mjs.map +1 -1
- package/resources/beta/agents/sessions/sessions.d.mts +42 -1
- package/resources/beta/agents/sessions/sessions.d.mts.map +1 -1
- package/resources/beta/agents/sessions/sessions.d.ts +42 -1
- package/resources/beta/agents/sessions/sessions.d.ts.map +1 -1
- package/resources/beta/agents/sessions/sessions.js +2 -1
- package/resources/beta/agents/sessions/sessions.js.map +1 -1
- package/resources/beta/agents/sessions/sessions.mjs +2 -1
- package/resources/beta/agents/sessions/sessions.mjs.map +1 -1
- package/resources/beta/beta.d.mts +2 -2
- package/resources/beta/beta.d.mts.map +1 -1
- package/resources/beta/beta.d.ts +2 -2
- package/resources/beta/beta.d.ts.map +1 -1
- package/resources/beta/beta.js.map +1 -1
- package/resources/beta/beta.mjs.map +1 -1
- package/resources/beta/index.d.mts +1 -1
- package/resources/beta/index.d.mts.map +1 -1
- package/resources/beta/index.d.ts +1 -1
- package/resources/beta/index.d.ts.map +1 -1
- package/resources/beta/index.js.map +1 -1
- package/resources/beta/index.mjs.map +1 -1
- package/resources/beta/responses/index.d.mts +1 -1
- package/resources/beta/responses/index.d.mts.map +1 -1
- package/resources/beta/responses/index.d.ts +1 -1
- package/resources/beta/responses/index.d.ts.map +1 -1
- package/resources/beta/responses/index.js.map +1 -1
- package/resources/beta/responses/index.mjs.map +1 -1
- package/resources/beta/responses/internal-base.d.mts +3 -0
- package/resources/beta/responses/internal-base.d.mts.map +1 -1
- package/resources/beta/responses/internal-base.d.ts +3 -0
- package/resources/beta/responses/internal-base.d.ts.map +1 -1
- package/resources/beta/responses/internal-base.js +21 -12
- package/resources/beta/responses/internal-base.js.map +1 -1
- package/resources/beta/responses/internal-base.mjs +21 -12
- package/resources/beta/responses/internal-base.mjs.map +1 -1
- package/resources/beta/responses/responses.d.mts +65 -7
- package/resources/beta/responses/responses.d.mts.map +1 -1
- package/resources/beta/responses/responses.d.ts +65 -7
- package/resources/beta/responses/responses.d.ts.map +1 -1
- package/resources/beta/responses/responses.js.map +1 -1
- package/resources/beta/responses/responses.mjs.map +1 -1
- package/resources/beta/responses/ws-base.d.mts +9 -1
- package/resources/beta/responses/ws-base.d.mts.map +1 -1
- package/resources/beta/responses/ws-base.d.ts +9 -1
- package/resources/beta/responses/ws-base.d.ts.map +1 -1
- package/resources/beta/responses/ws-base.js +24 -5
- package/resources/beta/responses/ws-base.js.map +1 -1
- package/resources/beta/responses/ws-base.mjs +23 -6
- package/resources/beta/responses/ws-base.mjs.map +1 -1
- package/resources/beta/responses/ws.d.mts +2 -0
- package/resources/beta/responses/ws.d.mts.map +1 -1
- package/resources/beta/responses/ws.d.ts +2 -0
- package/resources/beta/responses/ws.d.ts.map +1 -1
- package/resources/beta/responses/ws.js +21 -8
- package/resources/beta/responses/ws.js.map +1 -1
- package/resources/beta/responses/ws.mjs +21 -8
- package/resources/beta/responses/ws.mjs.map +1 -1
- package/resources/live/forks/internal-base.d.mts +3 -0
- package/resources/live/forks/internal-base.d.mts.map +1 -1
- package/resources/live/forks/internal-base.d.ts +3 -0
- package/resources/live/forks/internal-base.d.ts.map +1 -1
- package/resources/live/forks/internal-base.js +21 -5
- package/resources/live/forks/internal-base.js.map +1 -1
- package/resources/live/forks/internal-base.mjs +21 -5
- package/resources/live/forks/internal-base.mjs.map +1 -1
- package/resources/live/forks/ws.d.mts.map +1 -1
- package/resources/live/forks/ws.d.ts.map +1 -1
- package/resources/live/forks/ws.js +2 -4
- package/resources/live/forks/ws.js.map +1 -1
- package/resources/live/forks/ws.mjs +2 -4
- package/resources/live/forks/ws.mjs.map +1 -1
- package/resources/live/internal-base.d.mts +3 -0
- package/resources/live/internal-base.d.mts.map +1 -1
- package/resources/live/internal-base.d.ts +3 -0
- package/resources/live/internal-base.d.ts.map +1 -1
- package/resources/live/internal-base.js +21 -5
- package/resources/live/internal-base.js.map +1 -1
- package/resources/live/internal-base.mjs +21 -5
- package/resources/live/internal-base.mjs.map +1 -1
- package/resources/live/sideband/internal-base.d.mts +3 -0
- package/resources/live/sideband/internal-base.d.mts.map +1 -1
- package/resources/live/sideband/internal-base.d.ts +3 -0
- package/resources/live/sideband/internal-base.d.ts.map +1 -1
- package/resources/live/sideband/internal-base.js +21 -5
- package/resources/live/sideband/internal-base.js.map +1 -1
- package/resources/live/sideband/internal-base.mjs +21 -5
- package/resources/live/sideband/internal-base.mjs.map +1 -1
- package/resources/live/sideband/ws.d.mts.map +1 -1
- package/resources/live/sideband/ws.d.ts.map +1 -1
- package/resources/live/sideband/ws.js +2 -4
- package/resources/live/sideband/ws.js.map +1 -1
- package/resources/live/sideband/ws.mjs +2 -4
- package/resources/live/sideband/ws.mjs.map +1 -1
- package/resources/live/ws.d.mts.map +1 -1
- package/resources/live/ws.d.ts.map +1 -1
- package/resources/live/ws.js +2 -4
- package/resources/live/ws.js.map +1 -1
- package/resources/live/ws.mjs +2 -4
- package/resources/live/ws.mjs.map +1 -1
- package/resources/responses/internal-base.d.mts +3 -0
- package/resources/responses/internal-base.d.mts.map +1 -1
- package/resources/responses/internal-base.d.ts +3 -0
- package/resources/responses/internal-base.d.ts.map +1 -1
- package/resources/responses/internal-base.js +21 -12
- package/resources/responses/internal-base.js.map +1 -1
- package/resources/responses/internal-base.mjs +21 -12
- package/resources/responses/internal-base.mjs.map +1 -1
- package/resources/responses/responses.d.mts +47 -4
- package/resources/responses/responses.d.mts.map +1 -1
- package/resources/responses/responses.d.ts +47 -4
- package/resources/responses/responses.d.ts.map +1 -1
- package/resources/responses/responses.js.map +1 -1
- package/resources/responses/responses.mjs.map +1 -1
- package/resources/responses/ws-base.d.mts +11 -1
- package/resources/responses/ws-base.d.mts.map +1 -1
- package/resources/responses/ws-base.d.ts +11 -1
- package/resources/responses/ws-base.d.ts.map +1 -1
- package/resources/responses/ws-base.js +29 -8
- package/resources/responses/ws-base.js.map +1 -1
- package/resources/responses/ws-base.mjs +28 -9
- package/resources/responses/ws-base.mjs.map +1 -1
- package/resources/responses/ws.d.mts +2 -0
- package/resources/responses/ws.d.mts.map +1 -1
- package/resources/responses/ws.d.ts +2 -0
- package/resources/responses/ws.d.ts.map +1 -1
- package/resources/responses/ws.js +21 -8
- package/resources/responses/ws.js.map +1 -1
- package/resources/responses/ws.mjs +21 -8
- package/resources/responses/ws.mjs.map +1 -1
- package/resources/shared.d.mts +1 -1
- package/resources/shared.d.mts.map +1 -1
- package/resources/shared.d.ts +1 -1
- package/resources/shared.d.ts.map +1 -1
- package/resources/webhooks/webhooks.d.mts +3 -4
- package/resources/webhooks/webhooks.d.mts.map +1 -1
- package/resources/webhooks/webhooks.d.ts +3 -4
- package/resources/webhooks/webhooks.d.ts.map +1 -1
- package/src/_vendor/zod-to-json-schema/Options.ts +2 -0
- package/src/_vendor/zod-to-json-schema/parseDef.ts +1 -0
- package/src/_vendor/zod-to-json-schema/parsers/bigint.ts +2 -0
- package/src/_vendor/zod-to-json-schema/parsers/literal.ts +1 -0
- package/src/_vendor/zod-to-json-schema/parsers/null.ts +1 -0
- package/src/_vendor/zod-to-json-schema/parsers/nullable.ts +4 -0
- package/src/_vendor/zod-to-json-schema/parsers/number.ts +2 -0
- package/src/_vendor/zod-to-json-schema/parsers/optional.ts +6 -7
- package/src/_vendor/zod-to-json-schema/parsers/record.ts +2 -0
- package/src/_vendor/zod-to-json-schema/parsers/string.ts +1 -0
- package/src/_vendor/zod-to-json-schema/parsers/union.ts +3 -0
- package/src/_vendor/zod-to-json-schema/util.ts +1 -0
- package/src/_vendor/zod-to-json-schema/zodToJsonSchema.ts +3 -1
- package/src/auth/subject-token-providers.ts +6 -1
- package/src/auth/workload-identity-auth.ts +10 -1
- package/src/auth/x509-transport.ts +13 -2
- package/src/azure.ts +3 -0
- package/src/bedrock.ts +5 -0
- package/src/beta/realtime/internal-base.ts +2 -0
- package/src/beta/realtime/websocket.ts +11 -1
- package/src/beta/realtime/ws.ts +3 -0
- package/src/client.ts +50 -3
- package/src/core/EventEmitter.ts +15 -0
- package/src/core/streaming.ts +30 -2
- package/src/helpers/audio.ts +2 -0
- package/src/helpers/standard-schema.ts +31 -19
- package/src/helpers/zod-v3-strict-schema.ts +8 -2
- package/src/helpers/zod.ts +32 -13
- package/src/internal/assistant-stream-delta.ts +7 -1
- package/src/internal/auth/x509-credential-options.ts +3 -0
- package/src/internal/auth/x509-token-exchange.ts +10 -1
- package/src/internal/auth/x509-transport-capability.ts +2 -1
- package/src/internal/auth/x509-workload-identity-auth.ts +13 -8
- package/src/internal/bedrock.ts +15 -0
- package/src/internal/decoders/line.ts +1 -0
- package/src/internal/parse.ts +1 -0
- package/src/internal/provider.ts +3 -0
- package/src/internal/qs/stringify.ts +3 -0
- package/src/internal/qs/utils.ts +14 -3
- package/src/internal/responses/response-accumulator.ts +34 -4
- package/src/internal/to-file.ts +1 -1
- package/src/internal/uploads.ts +11 -1
- package/src/internal/utils/abort.ts +7 -2
- package/src/internal/utils/bytes.ts +2 -0
- package/src/internal/utils/path.ts +2 -0
- package/src/internal/utils/sleep.ts +52 -1
- package/src/internal/ws-adapter-browser.ts +2 -0
- package/src/internal/ws.ts +80 -6
- package/src/lib/AbstractChatCompletionRunner.ts +40 -17
- package/src/lib/AssistantStream.ts +31 -20
- package/src/lib/ChatCompletionRunner.ts +1 -0
- package/src/lib/ChatCompletionStream.ts +81 -14
- package/src/lib/EventEmitter.ts +15 -0
- package/src/lib/EventStream.ts +93 -3
- package/src/lib/ResponsesParser.ts +5 -0
- package/src/lib/RunnableFunction.ts +4 -1
- package/src/lib/agents/agent-session-stream.ts +5 -3
- package/src/lib/embeddings.ts +3 -1
- package/src/lib/live/transcript-grouper.ts +4 -0
- package/src/lib/parser.ts +16 -2
- package/src/lib/responses/ResponseInputItems.ts +11 -0
- package/src/lib/responses/ResponseStream.ts +6 -3
- package/src/lib/responses/responses-websocket-lane.ts +388 -0
- package/src/lib/responses/responses-websocket-session.ts +317 -0
- package/src/lib/transform.ts +70 -35
- package/src/lib/webrtc/connection.ts +5 -1
- package/src/lib/webrtc/data-channel.ts +7 -0
- package/src/lib/webrtc/subscriptions.ts +3 -0
- package/src/lib/webrtc/types.ts +1 -0
- package/src/providers/bedrock/aws.ts +5 -1
- package/src/realtime/internal-base.ts +2 -0
- package/src/realtime/websocket.ts +11 -1
- package/src/realtime/ws.ts +3 -0
- package/src/resources/beta/agents/agents.ts +2 -0
- package/src/resources/beta/agents/sessions/sessions.ts +47 -1
- package/src/resources/beta/beta.ts +2 -0
- package/src/resources/beta/index.ts +1 -0
- package/src/resources/beta/responses/index.ts +1 -0
- package/src/resources/beta/responses/internal-base.ts +24 -11
- package/src/resources/beta/responses/responses.ts +82 -4
- package/src/resources/beta/responses/ws-base.ts +31 -6
- package/src/resources/beta/responses/ws.ts +29 -11
- package/src/resources/live/forks/internal-base.ts +24 -5
- package/src/resources/live/forks/ws.ts +4 -5
- package/src/resources/live/internal-base.ts +24 -5
- package/src/resources/live/sideband/internal-base.ts +24 -5
- package/src/resources/live/sideband/ws.ts +4 -5
- package/src/resources/live/ws.ts +4 -5
- package/src/resources/responses/api.md +1 -0
- package/src/resources/responses/internal-base.ts +24 -11
- package/src/resources/responses/responses.ts +56 -1
- package/src/resources/responses/ws-base.ts +36 -9
- package/src/resources/responses/ws.ts +29 -11
- package/src/resources/shared.ts +4 -2
- package/src/resources/webhooks/webhooks.ts +3 -4
- package/src/version.ts +1 -1
- package/version.d.mts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.mjs +1 -1
|
@@ -20,7 +20,7 @@ import type {
|
|
|
20
20
|
} from '../resources/beta/threads/runs/runs';
|
|
21
21
|
import type { ReadableStream } from '../internal/shim-types';
|
|
22
22
|
import { Stream } from '../streaming';
|
|
23
|
-
import { APIError,
|
|
23
|
+
import { APIError, OpenAIError } from '../error';
|
|
24
24
|
import type {
|
|
25
25
|
AssistantStreamEvent,
|
|
26
26
|
MessageStreamEvent,
|
|
@@ -99,14 +99,13 @@ export type RunSubmitToolOutputsParamsStream = Omit<RunSubmitToolOutputsParamsBa
|
|
|
99
99
|
stream?: true;
|
|
100
100
|
};
|
|
101
101
|
|
|
102
|
-
function stabilizeAssistantStreamEvent(event: AssistantStreamEvent)
|
|
103
|
-
event: AssistantStreamEvent;
|
|
104
|
-
exposedEvent: AssistantStreamEvent;
|
|
105
|
-
} {
|
|
102
|
+
function stabilizeAssistantStreamEvent(event: AssistantStreamEvent) {
|
|
106
103
|
const eventDescriptor = Object.getOwnPropertyDescriptor(event, 'event');
|
|
107
104
|
const dataDescriptor = Object.getOwnPropertyDescriptor(event, 'data');
|
|
108
|
-
|
|
109
|
-
const
|
|
105
|
+
// oxlint-disable-next-line anti-slop/no-reflect-get -- Reflective wire reads reject primitive frames and preserve the original event receiver.
|
|
106
|
+
const eventType: AssistantStreamEvent['event'] = Reflect.get(event, 'event', event);
|
|
107
|
+
// oxlint-disable-next-line anti-slop/no-reflect-get -- Keep the paired wire-data read on the original receiver after reading the event discriminator.
|
|
108
|
+
const data: AssistantStreamEvent['data'] = Reflect.get(event, 'data', event);
|
|
110
109
|
let stableData = data;
|
|
111
110
|
if (
|
|
112
111
|
eventType === 'thread.message.created' ||
|
|
@@ -123,15 +122,24 @@ function stabilizeAssistantStreamEvent(event: AssistantStreamEvent): {
|
|
|
123
122
|
eventType === 'thread.run.step.expired'
|
|
124
123
|
) {
|
|
125
124
|
const messageID = Object.getOwnPropertyDescriptor(data, 'id');
|
|
126
|
-
if (
|
|
125
|
+
if (
|
|
126
|
+
messageID &&
|
|
127
|
+
'value' in messageID &&
|
|
128
|
+
// SAFETY: The own id descriptor was found above; keep its live read unknown while comparing it with the captured descriptor value.
|
|
129
|
+
(data as { id: unknown }).id !== messageID.value
|
|
130
|
+
) {
|
|
131
|
+
// SAFETY: Descriptor values are untyped; retaining this value as unknown avoids trusting a mutable message identifier.
|
|
127
132
|
const canonicalID = messageID.value as unknown;
|
|
133
|
+
// SAFETY: The proxy retains the event data and substitutes only its captured own id; all other properties forward to the original receiver.
|
|
128
134
|
stableData = new Proxy(data, {
|
|
129
135
|
get(target, property) {
|
|
136
|
+
// oxlint-disable-next-line anti-slop/no-reflect-get -- Proxy forwarding must preserve arbitrary keys with the original target as accessor receiver.
|
|
130
137
|
return property === 'id' ? canonicalID : Reflect.get(target, property, target);
|
|
131
138
|
},
|
|
132
139
|
}) as AssistantStreamEvent['data'];
|
|
133
140
|
}
|
|
134
141
|
}
|
|
142
|
+
// SAFETY: The captured event discriminator and data originate from the same event; TypeScript loses their correlation when constructing the stabilized copy.
|
|
135
143
|
const stableEvent = Object.freeze({ event: eventType, data: stableData }) as AssistantStreamEvent;
|
|
136
144
|
const ordinaryEvent =
|
|
137
145
|
eventDescriptor !== undefined &&
|
|
@@ -142,6 +150,7 @@ function stabilizeAssistantStreamEvent(event: AssistantStreamEvent): {
|
|
|
142
150
|
dataDescriptor.value === data &&
|
|
143
151
|
stableData === data;
|
|
144
152
|
|
|
153
|
+
// SAFETY: The captured event discriminator and data originate from the same event; TypeScript loses their correlation when constructing the stabilized copy.
|
|
145
154
|
return {
|
|
146
155
|
event: stableEvent,
|
|
147
156
|
exposedEvent: ordinaryEvent ? event : ({ event: eventType, data: stableData } as AssistantStreamEvent),
|
|
@@ -204,7 +213,7 @@ export class AssistantStream
|
|
|
204
213
|
this.#addEvent(event);
|
|
205
214
|
}
|
|
206
215
|
if (stream.controller.signal?.aborted) {
|
|
207
|
-
throw
|
|
216
|
+
throw this._userAbortError();
|
|
208
217
|
}
|
|
209
218
|
return this._addRun(this.#endRequest());
|
|
210
219
|
}
|
|
@@ -252,7 +261,7 @@ export class AssistantStream
|
|
|
252
261
|
this.#addEvent(event);
|
|
253
262
|
}
|
|
254
263
|
if (stream.controller.signal?.aborted) {
|
|
255
|
-
throw
|
|
264
|
+
throw this._userAbortError();
|
|
256
265
|
}
|
|
257
266
|
|
|
258
267
|
return this._addRun(this.#endRequest());
|
|
@@ -358,7 +367,7 @@ export class AssistantStream
|
|
|
358
367
|
this.#addEvent(event);
|
|
359
368
|
}
|
|
360
369
|
if (stream.controller.signal?.aborted) {
|
|
361
|
-
throw
|
|
370
|
+
throw this._userAbortError();
|
|
362
371
|
}
|
|
363
372
|
|
|
364
373
|
return this._addRun(this.#endRequest());
|
|
@@ -381,7 +390,7 @@ export class AssistantStream
|
|
|
381
390
|
this.#addEvent(event);
|
|
382
391
|
}
|
|
383
392
|
if (stream.controller.signal?.aborted) {
|
|
384
|
-
throw
|
|
393
|
+
throw this._userAbortError();
|
|
385
394
|
}
|
|
386
395
|
|
|
387
396
|
return this._addRun(this.#endRequest());
|
|
@@ -777,6 +786,7 @@ export class AssistantStream
|
|
|
777
786
|
) {
|
|
778
787
|
for (const toolCall of delta.step_details.tool_calls) {
|
|
779
788
|
if (toolCall.index === this.#currentToolCallIndex) {
|
|
789
|
+
// SAFETY: The indexed tool call comes from this run-step snapshot after applying the delta for the same tool-call index.
|
|
780
790
|
this.#emitExposed(
|
|
781
791
|
'toolCallDelta',
|
|
782
792
|
toolCall,
|
|
@@ -807,7 +817,7 @@ export class AssistantStream
|
|
|
807
817
|
this.#activeRunStepID = undefined;
|
|
808
818
|
const details = event.data.step_details;
|
|
809
819
|
if (details.type === 'tool_calls' && this.#currentToolCall) {
|
|
810
|
-
this.#emitExposed('toolCallDone', this.#currentToolCall
|
|
820
|
+
this.#emitExposed('toolCallDone', this.#currentToolCall);
|
|
811
821
|
}
|
|
812
822
|
this.#emitExposed('runStepDone', event.data, accumulatedRunStep);
|
|
813
823
|
this.#currentToolCallIndex = undefined;
|
|
@@ -844,6 +854,7 @@ export class AssistantStream
|
|
|
844
854
|
}
|
|
845
855
|
|
|
846
856
|
case 'thread.run.step.delta': {
|
|
857
|
+
// SAFETY: Run-step snapshots are stored by their canonical run-step id; the delta path checks that the snapshot exists before updating it.
|
|
847
858
|
const snapshot = this.#runStepSnapshots[runStepID] as Runs.RunStep;
|
|
848
859
|
if (!snapshot) {
|
|
849
860
|
throw new Error('Received a RunStepDelta before creation of a snapshot');
|
|
@@ -856,10 +867,11 @@ export class AssistantStream
|
|
|
856
867
|
if (hasOwn(delta, 'id')) {
|
|
857
868
|
throw new OpenAIError('Run-step deltas must not contain an id field');
|
|
858
869
|
}
|
|
859
|
-
const accumulated = accumulateAssistantStreamDelta(snapshot, delta, true)
|
|
870
|
+
const accumulated = accumulateAssistantStreamDelta(snapshot, delta, true);
|
|
860
871
|
this.#runStepSnapshots[runStepID] = accumulated;
|
|
861
872
|
}
|
|
862
873
|
|
|
874
|
+
// SAFETY: Run-step snapshots are stored by their canonical run-step id; the delta path checks that the snapshot exists before updating it.
|
|
863
875
|
return this.#runStepSnapshots[runStepID] as Runs.RunStep;
|
|
864
876
|
}
|
|
865
877
|
|
|
@@ -874,7 +886,7 @@ export class AssistantStream
|
|
|
874
886
|
}
|
|
875
887
|
|
|
876
888
|
if (this.#runStepSnapshots[runStepID]) {
|
|
877
|
-
return this.#runStepSnapshots[runStepID]
|
|
889
|
+
return this.#runStepSnapshots[runStepID];
|
|
878
890
|
}
|
|
879
891
|
throw new Error('No snapshot available');
|
|
880
892
|
}
|
|
@@ -951,11 +963,10 @@ export class AssistantStream
|
|
|
951
963
|
currentContent: MessageContent | undefined,
|
|
952
964
|
cacheArrays: boolean,
|
|
953
965
|
): TextContentBlock | ImageFileContentBlock {
|
|
954
|
-
return
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
) as TextContentBlock | ImageFileContentBlock;
|
|
966
|
+
// SAFETY: The accumulator merges the matching message-content delta into its existing block; the public return remains the text/image block union.
|
|
967
|
+
return accumulateAssistantStreamDelta(currentContent as Record<any, any>, contentElement, cacheArrays) as
|
|
968
|
+
| TextContentBlock
|
|
969
|
+
| ImageFileContentBlock;
|
|
959
970
|
}
|
|
960
971
|
|
|
961
972
|
/**
|
|
@@ -100,6 +100,7 @@ export class ChatCompletionRunner<ParsedT = null> extends AbstractChatCompletion
|
|
|
100
100
|
) {
|
|
101
101
|
super._addMessage(message, emit, normalizeContent);
|
|
102
102
|
if (emit && isAssistantMessage(message) && message.content) {
|
|
103
|
+
// SAFETY: The runner's content event preserves the existing string-content contract for assistant messages supplied by the API or caller.
|
|
103
104
|
this._emit('content', message.content as string);
|
|
104
105
|
}
|
|
105
106
|
}
|
|
@@ -1,11 +1,5 @@
|
|
|
1
1
|
import { MalformedJSON, partialParse } from '../_vendor/partial-json-parser/parser';
|
|
2
|
-
import {
|
|
3
|
-
APIError,
|
|
4
|
-
APIUserAbortError,
|
|
5
|
-
ContentFilterFinishReasonError,
|
|
6
|
-
LengthFinishReasonError,
|
|
7
|
-
OpenAIError,
|
|
8
|
-
} from '../error';
|
|
2
|
+
import { APIError, ContentFilterFinishReasonError, LengthFinishReasonError, OpenAIError } from '../error';
|
|
9
3
|
import type OpenAI from '../index';
|
|
10
4
|
import { observeJSONRequestBody, type RequestOptions } from '../internal/request-options';
|
|
11
5
|
import type { ReadableStream } from '../internal/shim-types';
|
|
@@ -35,8 +29,20 @@ import type {
|
|
|
35
29
|
} from '../resources/chat/completions/completions';
|
|
36
30
|
import { Stream } from '../streaming';
|
|
37
31
|
import { AbstractChatCompletionRunner } from './AbstractChatCompletionRunner';
|
|
38
|
-
import type { AbstractChatCompletionRunnerEvents } from './AbstractChatCompletionRunner';
|
|
32
|
+
import type { AbstractChatCompletionRunnerEvents, RunnerOptions } from './AbstractChatCompletionRunner';
|
|
33
|
+
import type {
|
|
34
|
+
ChatCompletionRunner,
|
|
35
|
+
ChatCompletionToolRunnerParamsWithContext,
|
|
36
|
+
ChatCompletionToolRunnerParamsWithoutContext,
|
|
37
|
+
} from './ChatCompletionRunner';
|
|
38
|
+
import type {
|
|
39
|
+
ChatCompletionStreamingRunner,
|
|
40
|
+
ChatCompletionStreamingToolRunnerParamsWithContext,
|
|
41
|
+
ChatCompletionStreamingToolRunnerParamsWithoutContext,
|
|
42
|
+
} from './ChatCompletionStreamingRunner';
|
|
43
|
+
import type { BaseFunctionsArgs } from './RunnableFunction';
|
|
39
44
|
|
|
45
|
+
// oxlint-disable-next-line anti-slop/no-unknown-returns -- Partial JSON may have any shape; callers validate or parse it against their response schema.
|
|
40
46
|
function parseStructuredStreamingJSON(content: string): unknown {
|
|
41
47
|
try {
|
|
42
48
|
return partialParse(content);
|
|
@@ -218,6 +224,7 @@ export function makeChatCompletionReadableStreamMessageChunk(
|
|
|
218
224
|
const payload: ChatCompletionReadableStreamMessage = {
|
|
219
225
|
type: 'message',
|
|
220
226
|
message,
|
|
227
|
+
// Spread creates an own data property without invoking inherited setters or changing the object prototype.
|
|
221
228
|
...(toolCallIds ? { tool_call_ids: toolCallIds } : {}),
|
|
222
229
|
};
|
|
223
230
|
|
|
@@ -248,6 +255,7 @@ function getChatCompletionReadableStreamMessage(
|
|
|
248
255
|
return item;
|
|
249
256
|
}
|
|
250
257
|
|
|
258
|
+
// SAFETY: This decoder reads the SDK's tagged readable-stream envelope; JSON parsing restores its serialized message fields for the stream accumulator.
|
|
251
259
|
return JSON.parse(
|
|
252
260
|
item.object.slice(CHAT_COMPLETION_READABLE_STREAM_MESSAGE_PREFIX.length),
|
|
253
261
|
) as ChatCompletionReadableStreamMessage;
|
|
@@ -465,16 +473,18 @@ function reservePartialJSONParse(state: PartialJSONParseState, budget: PartialJS
|
|
|
465
473
|
}
|
|
466
474
|
|
|
467
475
|
function captureStructuredJSONSnapshot(
|
|
468
|
-
snapshot:
|
|
476
|
+
snapshot: ChatCompletionSnapshot.Choice.Message | ChatCompletionSnapshot.Choice.Message.ToolCall.Function,
|
|
469
477
|
property: 'content' | 'arguments' | 'refusal',
|
|
470
478
|
): string | null | undefined {
|
|
471
479
|
const descriptor = Object.getOwnPropertyDescriptor(snapshot, property);
|
|
472
480
|
if (!descriptor) {
|
|
481
|
+
// SAFETY: Object.getPrototypeOf returns an object or null; the following traversal checks inherited properties without assuming a specific prototype type.
|
|
473
482
|
let prototype = Object.getPrototypeOf(snapshot) as object | null;
|
|
474
483
|
for (let depth = 0; prototype !== null; depth += 1) {
|
|
475
484
|
if (depth >= MAX_PARTIAL_JSON_DEPTH || Object.getOwnPropertyDescriptor(prototype, property)) {
|
|
476
485
|
throw new OpenAIError('Chat completion stream contains an unsafe structured JSON snapshot');
|
|
477
486
|
}
|
|
487
|
+
// SAFETY: Object.getPrototypeOf returns an object or null; the following traversal checks inherited properties without assuming a specific prototype type.
|
|
478
488
|
prototype = Object.getPrototypeOf(prototype) as object | null;
|
|
479
489
|
}
|
|
480
490
|
return undefined;
|
|
@@ -486,6 +496,7 @@ function captureStructuredJSONSnapshot(
|
|
|
486
496
|
throw new OpenAIError('Chat completion stream contains an unsafe structured JSON snapshot');
|
|
487
497
|
}
|
|
488
498
|
|
|
499
|
+
// SAFETY: The own data descriptor was explicitly checked to contain only a string, null, or undefined.
|
|
489
500
|
return descriptor.value as string | null | undefined;
|
|
490
501
|
}
|
|
491
502
|
|
|
@@ -502,22 +513,25 @@ function captureStructuredMessageSnapshot(
|
|
|
502
513
|
throw new OpenAIError('Chat completion stream contains an unsafe structured JSON snapshot');
|
|
503
514
|
}
|
|
504
515
|
|
|
516
|
+
// SAFETY: The choice contract supplies a message; the own data descriptor check prevents getters from changing which object is captured.
|
|
505
517
|
return descriptor.value as ChatCompletionSnapshot.Choice.Message;
|
|
506
518
|
}
|
|
507
519
|
|
|
508
520
|
function captureSnapshotArray<Item>(
|
|
509
|
-
snapshot:
|
|
521
|
+
snapshot: ChatCompletionSnapshot | ChatCompletionSnapshot.Choice.Message,
|
|
510
522
|
property: 'choices' | 'tool_calls',
|
|
511
523
|
maximum: number,
|
|
512
524
|
kind: 'choice' | 'tool-call',
|
|
513
525
|
): Item[] | undefined {
|
|
514
526
|
const descriptor = Object.getOwnPropertyDescriptor(snapshot, property);
|
|
515
527
|
if (!descriptor) {
|
|
528
|
+
// SAFETY: Object.getPrototypeOf returns an object or null; the following traversal checks inherited properties without assuming a specific prototype type.
|
|
516
529
|
let prototype = Object.getPrototypeOf(snapshot) as object | null;
|
|
517
530
|
for (let depth = 0; prototype !== null; depth += 1) {
|
|
518
531
|
if (depth >= MAX_PARTIAL_JSON_DEPTH || Object.getOwnPropertyDescriptor(prototype, property)) {
|
|
519
532
|
throw new OpenAIError(`Chat completion stream contains an unsafe snapshot ${kind} collection`);
|
|
520
533
|
}
|
|
534
|
+
// SAFETY: Object.getPrototypeOf returns an object or null; the following traversal checks inherited properties without assuming a specific prototype type.
|
|
521
535
|
prototype = Object.getPrototypeOf(prototype) as object | null;
|
|
522
536
|
}
|
|
523
537
|
return undefined;
|
|
@@ -531,6 +545,7 @@ function captureSnapshotArray<Item>(
|
|
|
531
545
|
throw new OpenAIError(`Chat completion stream exceeded its snapshot ${kind} limit`);
|
|
532
546
|
}
|
|
533
547
|
|
|
548
|
+
// SAFETY: The captured data property is an array with a checked bounded length; Item comes from the owning snapshot collection's contract.
|
|
534
549
|
return descriptor.value as Item[];
|
|
535
550
|
}
|
|
536
551
|
|
|
@@ -543,6 +558,7 @@ function captureSnapshotArrayItem<Item>(array: Item[], index: number): Item | un
|
|
|
543
558
|
throw new OpenAIError('Chat completion stream contains an unsafe structured JSON snapshot');
|
|
544
559
|
}
|
|
545
560
|
|
|
561
|
+
// SAFETY: The descriptor is a data property of the typed Item array, so its value retains that array's element contract.
|
|
546
562
|
return descriptor.value as Item;
|
|
547
563
|
}
|
|
548
564
|
|
|
@@ -568,6 +584,7 @@ function mapCapturedSnapshotArray<Item, Mapped>(
|
|
|
568
584
|
if (!('value' in item)) {
|
|
569
585
|
throw new OpenAIError('Chat completion stream contains an unsafe structured JSON snapshot');
|
|
570
586
|
}
|
|
587
|
+
// SAFETY: The descriptor is a data property of the typed Item array, so its value retains that array's element contract.
|
|
571
588
|
mapped[index] = map(item.value as Item, index);
|
|
572
589
|
}
|
|
573
590
|
|
|
@@ -616,6 +633,7 @@ function assertBoundToolCallIdentity(toolCall: PartialToolCallSnapshot, identity
|
|
|
616
633
|
}
|
|
617
634
|
}
|
|
618
635
|
|
|
636
|
+
// oxlint-disable-next-line anti-slop/no-object-parameters -- This assignment primitive copies own properties from heterogeneous snapshot and delta objects.
|
|
619
637
|
function assignOwnProperties<T extends object>(target: T, source: object): T {
|
|
620
638
|
if (Object.prototype.propertyIsEnumerable.call(source, '__proto__') && !hasOwn(target, '__proto__')) {
|
|
621
639
|
Object.defineProperty(target, '__proto__', {
|
|
@@ -641,6 +659,7 @@ function cloneParserConfigObject<Value extends object>(
|
|
|
641
659
|
}
|
|
642
660
|
|
|
643
661
|
descriptors[field] = {
|
|
662
|
+
// oxlint-disable-next-line anti-slop/no-reflect-get -- Generic config cloning must resolve inherited/accessor keys outside the declared config shape.
|
|
644
663
|
value: descriptor && 'value' in descriptor ? descriptor.value : Reflect.get(value, field, value),
|
|
645
664
|
enumerable: descriptor?.enumerable ?? false,
|
|
646
665
|
configurable: descriptor?.configurable ?? true,
|
|
@@ -648,6 +667,7 @@ function cloneParserConfigObject<Value extends object>(
|
|
|
648
667
|
};
|
|
649
668
|
}
|
|
650
669
|
|
|
670
|
+
// SAFETY: The clone preserves the original prototype and descriptors, replacing only the parser metadata captured from that same value.
|
|
651
671
|
return Object.create(Object.getPrototypeOf(value), descriptors) as Value;
|
|
652
672
|
}
|
|
653
673
|
|
|
@@ -670,6 +690,7 @@ function snapshotChatCompletionParserParams(params: ChatCompletionCreateParams):
|
|
|
670
690
|
continue;
|
|
671
691
|
}
|
|
672
692
|
|
|
693
|
+
// SAFETY: This own data descriptor comes from the request's typed tools array; the following code captures its parser metadata.
|
|
673
694
|
const tool = item.value as NonNullable<ChatCompletionCreateParams['tools']>[number];
|
|
674
695
|
const stableTool = cloneParserConfigObject(tool, [
|
|
675
696
|
'type',
|
|
@@ -690,6 +711,7 @@ function snapshotChatCompletionParserParams(params: ChatCompletionCreateParams):
|
|
|
690
711
|
};
|
|
691
712
|
}
|
|
692
713
|
|
|
714
|
+
// SAFETY: The cloned tool retains the original prototype and descriptors while substituting its captured parser configuration.
|
|
693
715
|
stableTools[index] = Object.create(Object.getPrototypeOf(tool), descriptors) as typeof tool;
|
|
694
716
|
}
|
|
695
717
|
snapshot.tools = stableTools;
|
|
@@ -763,6 +785,7 @@ function canonicalSerializedParserSchema(
|
|
|
763
785
|
return true;
|
|
764
786
|
};
|
|
765
787
|
|
|
788
|
+
// SAFETY: Object.getPrototypeOf returns an object or null; the following traversal checks inherited properties without assuming a specific prototype type.
|
|
766
789
|
const visit = (current: unknown, depth: number): CanonicalSerializedParserValue => {
|
|
767
790
|
if (depth > MAX_SERIALIZED_PARSER_SCHEMA_DEPTH || budget.nodes >= MAX_SERIALIZED_PARSER_SCHEMA_NODES) {
|
|
768
791
|
return UNSAFE_SERIALIZED_PARSER_VALUE;
|
|
@@ -792,6 +815,7 @@ function canonicalSerializedParserSchema(
|
|
|
792
815
|
}
|
|
793
816
|
|
|
794
817
|
const array = Array.isArray(current);
|
|
818
|
+
// SAFETY: Object.getPrototypeOf returns an object or null; the following traversal checks inherited properties without assuming a specific prototype type.
|
|
795
819
|
const prototype = Object.getPrototypeOf(current) as object | null;
|
|
796
820
|
if (
|
|
797
821
|
(array && prototype !== Array.prototype) ||
|
|
@@ -923,7 +947,9 @@ function canonicalSerializedParserSchema(
|
|
|
923
947
|
|
|
924
948
|
function rememberSerializedParserSchema(
|
|
925
949
|
signatures: WeakMap<object, string>,
|
|
950
|
+
// oxlint-disable-next-line anti-slop/no-object-parameters -- Parser owners are tracked by identity before their metadata descriptors are validated.
|
|
926
951
|
source: object,
|
|
952
|
+
// oxlint-disable-next-line anti-slop/no-object-parameters -- Serialized schema holders may be arbitrary objects with hostile accessors or prototypes.
|
|
927
953
|
holder: object,
|
|
928
954
|
key: string,
|
|
929
955
|
): void {
|
|
@@ -947,7 +973,9 @@ function rememberSerializedParserSchema(
|
|
|
947
973
|
|
|
948
974
|
function hasMatchingSerializedParserSchema(
|
|
949
975
|
signatures: WeakMap<object, string>,
|
|
976
|
+
// oxlint-disable-next-line anti-slop/no-object-parameters -- Parser signatures belong to the original object identity, independent of its fields.
|
|
950
977
|
source: object | undefined,
|
|
978
|
+
// oxlint-disable-next-line anti-slop/no-object-parameters -- The schema holder is inspected through own descriptors before its contents are trusted.
|
|
951
979
|
holder: object,
|
|
952
980
|
key: string,
|
|
953
981
|
value: unknown,
|
|
@@ -973,7 +1001,7 @@ function serializedParserDescriptor(
|
|
|
973
1001
|
|
|
974
1002
|
function shadowSerializedParserMetadata(
|
|
975
1003
|
descriptors: PropertyDescriptorMap,
|
|
976
|
-
source:
|
|
1004
|
+
source: ChatCompletionInputTool | ChatCompletionResponseFormat,
|
|
977
1005
|
fields: readonly string[],
|
|
978
1006
|
): void {
|
|
979
1007
|
for (const field of fields) {
|
|
@@ -994,6 +1022,7 @@ function shadowSerializedParserMetadata(
|
|
|
994
1022
|
}
|
|
995
1023
|
|
|
996
1024
|
function snapshotSerializedParserTool(serialized: SerializedToolParserConfig): ChatCompletionInputTool {
|
|
1025
|
+
// SAFETY: The fallback is a serialization scaffold: the code below installs the captured wire fields before the tool is returned.
|
|
997
1026
|
const source =
|
|
998
1027
|
serialized.source ??
|
|
999
1028
|
({
|
|
@@ -1008,10 +1037,12 @@ function snapshotSerializedParserTool(serialized: SerializedToolParserConfig): C
|
|
|
1008
1037
|
descriptors.function = serializedParserDescriptor(descriptors.function, undefined);
|
|
1009
1038
|
}
|
|
1010
1039
|
shadowSerializedParserMetadata(descriptors, source, ['$brand', '$parseRaw', '$callback']);
|
|
1040
|
+
// SAFETY: The descriptors reconstruct the tool's captured serialized fields and shadow parser metadata while retaining its original prototype.
|
|
1011
1041
|
return Object.create(Object.getPrototypeOf(source), descriptors) as ChatCompletionInputTool;
|
|
1012
1042
|
}
|
|
1013
1043
|
|
|
1014
1044
|
const descriptor = descriptors.function;
|
|
1045
|
+
// SAFETY: The preceding guard proves this data descriptor contains a non-null object; no more specific type is assumed.
|
|
1015
1046
|
const original =
|
|
1016
1047
|
descriptor && 'value' in descriptor && typeof descriptor.value === 'object' && descriptor.value !== null
|
|
1017
1048
|
? (descriptor.value as object)
|
|
@@ -1033,21 +1064,25 @@ function snapshotSerializedParserTool(serialized: SerializedToolParserConfig): C
|
|
|
1033
1064
|
shadowSerializedParserMetadata(descriptors, source, ['$brand', '$parseRaw', '$callback']);
|
|
1034
1065
|
}
|
|
1035
1066
|
|
|
1067
|
+
// SAFETY: The descriptors reconstruct the tool's captured serialized fields and shadow parser metadata while retaining its original prototype.
|
|
1036
1068
|
return Object.create(Object.getPrototypeOf(source), descriptors) as ChatCompletionInputTool;
|
|
1037
1069
|
}
|
|
1038
1070
|
|
|
1039
1071
|
function snapshotSerializedResponseFormat(
|
|
1040
1072
|
serialized: SerializedResponseParserConfig,
|
|
1041
1073
|
): ChatCompletionResponseFormat {
|
|
1074
|
+
// SAFETY: The fallback seeds only the discriminator; the captured response-format fields are installed below before returning it.
|
|
1042
1075
|
const source = serialized.source ?? ({ type: serialized.type } as ChatCompletionResponseFormat);
|
|
1043
1076
|
const descriptors = Object.getOwnPropertyDescriptors(source);
|
|
1044
1077
|
descriptors.type = serializedParserDescriptor(descriptors.type, serialized.type);
|
|
1045
1078
|
if (serialized.type !== 'json_schema' || !serialized.source || !serialized.schemaMatches) {
|
|
1046
1079
|
shadowSerializedParserMetadata(descriptors, source, ['$brand', '$parseRaw']);
|
|
1047
1080
|
}
|
|
1081
|
+
// SAFETY: The descriptors restore the captured response-format fields and parser metadata on the original prototype.
|
|
1048
1082
|
return Object.create(Object.getPrototypeOf(source), descriptors) as ChatCompletionResponseFormat;
|
|
1049
1083
|
}
|
|
1050
1084
|
|
|
1085
|
+
// oxlint-disable-next-line anti-slop/no-object-parameters -- The serialization visitor accepts arbitrary object and array holders, inspecting own descriptors only.
|
|
1051
1086
|
function ownSerializedParserObject(holder: object, key: string): object | undefined {
|
|
1052
1087
|
const descriptor = Object.getOwnPropertyDescriptor(holder, key);
|
|
1053
1088
|
if (!descriptor || !('value' in descriptor)) {
|
|
@@ -1126,6 +1161,8 @@ function observeSerializedChatCompletionParserParams(
|
|
|
1126
1161
|
if (Array.isArray(value)) {
|
|
1127
1162
|
tools = new Proxy(value, {
|
|
1128
1163
|
get(target, property) {
|
|
1164
|
+
// SAFETY: Proxy property values may be arbitrary; unknown preserves that uncertainty before the property-specific checks below.
|
|
1165
|
+
// oxlint-disable-next-line anti-slop/no-reflect-get -- Proxy forwarding must preserve arbitrary keys with the original target as accessor receiver.
|
|
1129
1166
|
const actual = Reflect.get(target, property, target) as unknown;
|
|
1130
1167
|
if (typeof property === 'string') {
|
|
1131
1168
|
const index = Number(property);
|
|
@@ -1254,6 +1291,7 @@ export class ChatCompletionStream<ParsedT = null>
|
|
|
1254
1291
|
implements AsyncIterable<ChatCompletionChunk>
|
|
1255
1292
|
{
|
|
1256
1293
|
#params: ChatCompletionCreateParams | null;
|
|
1294
|
+
#rejectsUnfinishedTurns = false;
|
|
1257
1295
|
#audioDoneChoiceIndexes: Set<number>;
|
|
1258
1296
|
#choiceEventStates: ChoiceEventState[];
|
|
1259
1297
|
#currentChatCompletionSnapshot: ChatCompletionSnapshot | undefined;
|
|
@@ -1276,6 +1314,7 @@ export class ChatCompletionStream<ParsedT = null>
|
|
|
1276
1314
|
if (!descriptor || !('value' in descriptor)) {
|
|
1277
1315
|
continue;
|
|
1278
1316
|
}
|
|
1317
|
+
// SAFETY: The descriptor is read from the typed request tools array and checked as an own data property before accessing the tool.
|
|
1279
1318
|
const tool = descriptor.value as ChatCompletionInputTool;
|
|
1280
1319
|
if (
|
|
1281
1320
|
isChatCompletionFunctionTool(tool) &&
|
|
@@ -1313,6 +1352,7 @@ export class ChatCompletionStream<ParsedT = null>
|
|
|
1313
1352
|
params: ChatCompletionStreamParams,
|
|
1314
1353
|
options?: RequestOptions,
|
|
1315
1354
|
): ChatCompletionStream<ParsedT> {
|
|
1355
|
+
// SAFETY: The runner forces stream: true when sending this request; the same parameters retain the caller's parsing configuration.
|
|
1316
1356
|
const runner = new ChatCompletionStream<ParsedT>(params as ChatCompletionCreateParamsStreaming);
|
|
1317
1357
|
runner._run(() =>
|
|
1318
1358
|
runner._runChatCompletion(
|
|
@@ -1490,10 +1530,12 @@ export class ChatCompletionStream<ParsedT = null>
|
|
|
1490
1530
|
}
|
|
1491
1531
|
|
|
1492
1532
|
if (toolCallSnapshot.type === 'function') {
|
|
1533
|
+
// SAFETY: The find predicate verifies the function-tool discriminator before matching its name; the cast carries that refinement through find.
|
|
1493
1534
|
const inputTool = this.#params?.tools?.find(
|
|
1494
1535
|
(tool) => isChatCompletionFunctionTool(tool) && tool.function.name === toolCallSnapshot.function.name,
|
|
1495
1536
|
) as ChatCompletionFunctionTool | undefined; // TS doesn't narrow based on isChatCompletionTool
|
|
1496
1537
|
|
|
1538
|
+
// oxlint-disable-next-line anti-slop/no-known-value-widening -- The initial null is replaced with an arbitrary tool-parser result after snapshot validation.
|
|
1497
1539
|
let parsedArguments: unknown = null;
|
|
1498
1540
|
const parseable = isAutoParsableTool(inputTool) || inputTool?.function.strict === true;
|
|
1499
1541
|
let argumentsSnapshot: string;
|
|
@@ -1680,6 +1722,7 @@ export class ChatCompletionStream<ParsedT = null>
|
|
|
1680
1722
|
if (!descriptor || !('value' in descriptor)) {
|
|
1681
1723
|
throw new OpenAIError('Chat completion stream contains an unsafe structured JSON snapshot');
|
|
1682
1724
|
}
|
|
1725
|
+
// SAFETY: The tool-call function is captured through an own data descriptor; its fields are subsequently checked by the structured snapshot reader.
|
|
1683
1726
|
const fn = descriptor.value as ChatCompletionSnapshot.Choice.Message.ToolCall.Function;
|
|
1684
1727
|
const argumentsSnapshot = captureStructuredJSONSnapshot(fn, 'arguments');
|
|
1685
1728
|
if (typeof argumentsSnapshot !== 'string') {
|
|
@@ -1717,6 +1760,21 @@ export class ChatCompletionStream<ParsedT = null>
|
|
|
1717
1760
|
return finalizeChatCompletion(snapshot, this.#params, audioDoneChoiceIndexes, validatedMessages);
|
|
1718
1761
|
}
|
|
1719
1762
|
|
|
1763
|
+
/** Rejects unfinished turns before tool callbacks while preserving ordinary stream and replay behavior. */
|
|
1764
|
+
protected override _runTools<FunctionsArgs extends BaseFunctionsArgs, ToolContext>(
|
|
1765
|
+
client: OpenAI,
|
|
1766
|
+
params:
|
|
1767
|
+
| ChatCompletionToolRunnerParamsWithContext<FunctionsArgs, ToolContext>
|
|
1768
|
+
| ChatCompletionToolRunnerParamsWithoutContext<FunctionsArgs>
|
|
1769
|
+
| ChatCompletionStreamingToolRunnerParamsWithContext<FunctionsArgs, ToolContext>
|
|
1770
|
+
| ChatCompletionStreamingToolRunnerParamsWithoutContext<FunctionsArgs>,
|
|
1771
|
+
runner: ChatCompletionRunner<any> | ChatCompletionStreamingRunner<any>,
|
|
1772
|
+
options?: RunnerOptions,
|
|
1773
|
+
): Promise<void> {
|
|
1774
|
+
this.#rejectsUnfinishedTurns = true;
|
|
1775
|
+
return super._runTools(client, params, runner, options);
|
|
1776
|
+
}
|
|
1777
|
+
|
|
1720
1778
|
protected override async _createChatCompletion(
|
|
1721
1779
|
client: OpenAI,
|
|
1722
1780
|
params: ChatCompletionCreateParams,
|
|
@@ -1757,7 +1815,7 @@ export class ChatCompletionStream<ParsedT = null>
|
|
|
1757
1815
|
this.#addChunk(chunk);
|
|
1758
1816
|
}
|
|
1759
1817
|
if (stream.controller.signal?.aborted) {
|
|
1760
|
-
throw
|
|
1818
|
+
throw this._userAbortError();
|
|
1761
1819
|
}
|
|
1762
1820
|
return this._addChatCompletion(this.#endRequest());
|
|
1763
1821
|
}
|
|
@@ -1810,7 +1868,7 @@ export class ChatCompletionStream<ParsedT = null>
|
|
|
1810
1868
|
}
|
|
1811
1869
|
}
|
|
1812
1870
|
if (stream.controller.signal?.aborted) {
|
|
1813
|
-
throw
|
|
1871
|
+
throw this._userAbortError();
|
|
1814
1872
|
}
|
|
1815
1873
|
if (this.#currentChatCompletionSnapshot) {
|
|
1816
1874
|
return this._addChatCompletion(this.#endRequest());
|
|
@@ -1896,7 +1954,7 @@ export class ChatCompletionStream<ParsedT = null>
|
|
|
1896
1954
|
if (finish_reason) {
|
|
1897
1955
|
choice.finish_reason = finish_reason;
|
|
1898
1956
|
|
|
1899
|
-
if (this.#params && hasAutoParseableInput(this.#params)) {
|
|
1957
|
+
if (this.#params && (this.#rejectsUnfinishedTurns || hasAutoParseableInput(this.#params))) {
|
|
1900
1958
|
if (finish_reason === 'length') {
|
|
1901
1959
|
throw new LengthFinishReasonError();
|
|
1902
1960
|
}
|
|
@@ -1915,6 +1973,7 @@ export class ChatCompletionStream<ParsedT = null>
|
|
|
1915
1973
|
} // Shouldn't happen; just in case.
|
|
1916
1974
|
|
|
1917
1975
|
this.#audioDoneChoiceIndexes.delete(index);
|
|
1976
|
+
// SAFETY: Streaming audio fields arrive incrementally even though the generated delta type omits them; each present field is merged below.
|
|
1918
1977
|
const { audio, content, refusal, function_call, role, ...capturedDeltaFields } =
|
|
1919
1978
|
delta as typeof delta & {
|
|
1920
1979
|
audio?: Partial<ChatCompletionAudio> | null;
|
|
@@ -2001,6 +2060,7 @@ export class ChatCompletionStream<ParsedT = null>
|
|
|
2001
2060
|
// Tool calls are built up across chunks, so while the stream is in progress the
|
|
2002
2061
|
// entries are only partially filled in; they match `ChatCompletionSnapshot.Choice.Message.ToolCall`
|
|
2003
2062
|
// once every delta for them has been accumulated.
|
|
2063
|
+
// SAFETY: This SDK-owned collection holds partial tool calls during accumulation; finalization checks required fields before exposing completed calls.
|
|
2004
2064
|
const toolCallSnapshots = (choice.message.tool_calls ??= []) as PartialToolCallSnapshot[];
|
|
2005
2065
|
|
|
2006
2066
|
for (const toolCallDelta of tool_calls) {
|
|
@@ -2159,6 +2219,7 @@ function finalizeChatCompletion<ParsedT>(
|
|
|
2159
2219
|
}
|
|
2160
2220
|
const stableChoice = new Proxy(choice, {
|
|
2161
2221
|
get(target, property, receiver) {
|
|
2222
|
+
// oxlint-disable-next-line anti-slop/no-reflect-get -- Proxy forwarding must preserve arbitrary keys and the original accessor receiver.
|
|
2162
2223
|
return property === 'message' ? validated.message : Reflect.get(target, property, receiver);
|
|
2163
2224
|
},
|
|
2164
2225
|
});
|
|
@@ -2174,6 +2235,7 @@ function finalizeChatCompletion<ParsedT>(
|
|
|
2174
2235
|
if (property === 'tool_calls') {
|
|
2175
2236
|
return validated.toolCallCollection;
|
|
2176
2237
|
}
|
|
2238
|
+
// oxlint-disable-next-line anti-slop/no-reflect-get -- Proxy forwarding must preserve arbitrary keys and the original accessor receiver.
|
|
2177
2239
|
return Reflect.get(target, property, receiver);
|
|
2178
2240
|
},
|
|
2179
2241
|
});
|
|
@@ -2186,7 +2248,9 @@ function finalizeChatCompletion<ParsedT>(
|
|
|
2186
2248
|
throw new OpenAIError(`missing finish_reason for choice ${index}`);
|
|
2187
2249
|
}
|
|
2188
2250
|
|
|
2251
|
+
// SAFETY: The completed API response contract supplies the audio fields; this preserves the existing pass-through behavior at finalization.
|
|
2189
2252
|
const audioResponse = audio ? { audio: audio as ChatCompletionAudio } : {};
|
|
2253
|
+
// SAFETY: The API completion contract uses assistant role; retaining the wire role preserves existing behavior without adding runtime rejection.
|
|
2190
2254
|
const role = message.role as 'assistant'; // this is what we expect; in theory it could be different which would make our types a slight lie but would be fine.
|
|
2191
2255
|
if (!role) {
|
|
2192
2256
|
throw new OpenAIError(`missing role for choice ${index}`);
|
|
@@ -2262,6 +2326,7 @@ function finalizeChatCompletion<ParsedT>(
|
|
|
2262
2326
|
if (property === 'name') {
|
|
2263
2327
|
return captured.name;
|
|
2264
2328
|
}
|
|
2329
|
+
// oxlint-disable-next-line anti-slop/no-reflect-get -- Proxy forwarding must preserve arbitrary keys and the original accessor receiver.
|
|
2265
2330
|
return Reflect.get(target, property, receiver);
|
|
2266
2331
|
},
|
|
2267
2332
|
});
|
|
@@ -2275,6 +2340,7 @@ function finalizeChatCompletion<ParsedT>(
|
|
|
2275
2340
|
if (property === 'function') {
|
|
2276
2341
|
return stableFunction;
|
|
2277
2342
|
}
|
|
2343
|
+
// oxlint-disable-next-line anti-slop/no-reflect-get -- Proxy forwarding must preserve arbitrary keys and the original accessor receiver.
|
|
2278
2344
|
return Reflect.get(target, property, receiver);
|
|
2279
2345
|
},
|
|
2280
2346
|
})
|
|
@@ -2329,6 +2395,7 @@ function finalizeChatCompletion<ParsedT>(
|
|
|
2329
2395
|
created,
|
|
2330
2396
|
model,
|
|
2331
2397
|
object: 'chat.completion',
|
|
2398
|
+
// Spread creates an own data property without invoking inherited setters or changing the object prototype.
|
|
2332
2399
|
...(system_fingerprint ? { system_fingerprint } : {}),
|
|
2333
2400
|
};
|
|
2334
2401
|
|