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
|
@@ -128,6 +128,7 @@ type ResponseIgnoredEvent = Extract<
|
|
|
128
128
|
| 'response.audio.done'
|
|
129
129
|
| 'response.audio.transcript.delta'
|
|
130
130
|
| 'response.audio.transcript.done'
|
|
131
|
+
| 'response.compaction.compacting'
|
|
131
132
|
| 'response.image_generation_call.partial_image'
|
|
132
133
|
| 'response.mcp_list_tools.in_progress'
|
|
133
134
|
| 'response.mcp_list_tools.completed'
|
|
@@ -198,6 +199,7 @@ function hasRoutedOutputCallIdentity(
|
|
|
198
199
|
}
|
|
199
200
|
|
|
200
201
|
function getOutputItemIdentityKeys(output: Response['output'][number], eventType: string): string[] {
|
|
202
|
+
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- Validate untrusted streamed item identifiers and discriminators before mutating the response snapshot.
|
|
201
203
|
if (!hasOwn(output, 'type') || typeof output.type !== 'string') {
|
|
202
204
|
throw new OpenAIError(`expected an own output item type for ${eventType}`);
|
|
203
205
|
}
|
|
@@ -206,6 +208,7 @@ function getOutputItemIdentityKeys(output: Response['output'][number], eventType
|
|
|
206
208
|
const identities: string[] = [];
|
|
207
209
|
|
|
208
210
|
if (hasOwn(output, 'id')) {
|
|
211
|
+
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- Validate untrusted streamed item identifiers and discriminators before mutating the response snapshot.
|
|
209
212
|
if (typeof output.id !== 'string' || output.id.length === 0) {
|
|
210
213
|
throw new OpenAIError(`expected a non-empty output item id for ${eventType}`);
|
|
211
214
|
}
|
|
@@ -215,6 +218,7 @@ function getOutputItemIdentityKeys(output: Response['output'][number], eventType
|
|
|
215
218
|
}
|
|
216
219
|
|
|
217
220
|
if (hasRoutedOutputCallIdentity(output)) {
|
|
221
|
+
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- Validate untrusted streamed item identifiers and discriminators before mutating the response snapshot.
|
|
218
222
|
if (!hasOwn(output, 'call_id') || typeof output.call_id !== 'string' || output.call_id.length === 0) {
|
|
219
223
|
throw new OpenAIError(`expected a non-empty output item call_id for ${eventType}`);
|
|
220
224
|
}
|
|
@@ -328,6 +332,7 @@ const expectedOutputItemTypes = {
|
|
|
328
332
|
'response.mcp_list_tools.in_progress': 'mcp_list_tools',
|
|
329
333
|
'response.mcp_list_tools.completed': 'mcp_list_tools',
|
|
330
334
|
'response.mcp_list_tools.failed': 'mcp_list_tools',
|
|
335
|
+
'response.compaction.compacting': 'compaction',
|
|
331
336
|
} satisfies Record<
|
|
332
337
|
Exclude<ResponseItemScopedEvent['type'], 'response.content_part.added' | 'response.content_part.done'>,
|
|
333
338
|
Response['output'][number]['type']
|
|
@@ -400,7 +405,9 @@ function validateOutputItemIdentity(
|
|
|
400
405
|
return;
|
|
401
406
|
}
|
|
402
407
|
|
|
408
|
+
// SAFETY: The event type was classified as item-scoped; the following checks validate its own item_id before use.
|
|
403
409
|
const itemEvent = event as ResponseItemScopedEvent;
|
|
410
|
+
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- Validate untrusted streamed item identifiers and discriminators before mutating the response snapshot.
|
|
404
411
|
if (!hasOwn(event, 'item_id') || typeof itemEvent.item_id !== 'string' || itemEvent.item_id.length === 0) {
|
|
405
412
|
throw new OpenAIError(`expected a non-empty item_id for ${event.type}`);
|
|
406
413
|
}
|
|
@@ -514,6 +521,7 @@ const supportedResponseEventTypes = createSupportedResponseEventTypes([
|
|
|
514
521
|
'response.audio.done',
|
|
515
522
|
'response.audio.transcript.delta',
|
|
516
523
|
'response.audio.transcript.done',
|
|
524
|
+
'response.compaction.compacting',
|
|
517
525
|
'response.image_generation_call.partial_image',
|
|
518
526
|
'response.mcp_list_tools.in_progress',
|
|
519
527
|
'response.mcp_list_tools.completed',
|
|
@@ -535,19 +543,37 @@ const responseEventRoutingFields = [
|
|
|
535
543
|
'summary_index',
|
|
536
544
|
] as const;
|
|
537
545
|
|
|
538
|
-
|
|
546
|
+
// These fields are snapshotted before the event-specific validators inspect them.
|
|
547
|
+
interface ResponseEventPayload {
|
|
548
|
+
item_id?: unknown;
|
|
549
|
+
output_index?: unknown;
|
|
550
|
+
content_index?: unknown;
|
|
551
|
+
annotation_index?: unknown;
|
|
552
|
+
command_index?: unknown;
|
|
553
|
+
summary_index?: unknown;
|
|
554
|
+
item?: unknown;
|
|
555
|
+
part?: unknown;
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
function sanitizeResponseEvent(
|
|
559
|
+
event: ResponseAccumulatorEvent & ResponseEventPayload,
|
|
560
|
+
): ResponseAccumulatorEvent {
|
|
539
561
|
let descriptor: PropertyDescriptor | undefined;
|
|
540
562
|
try {
|
|
541
563
|
descriptor = Object.getOwnPropertyDescriptor(event, 'type');
|
|
542
564
|
} catch {
|
|
565
|
+
// SAFETY: assertNever always throws; the cast routes invalid runtime events through the existing unsupported-event error path.
|
|
543
566
|
return assertNever(event as never);
|
|
544
567
|
}
|
|
545
568
|
|
|
546
569
|
const type: unknown = descriptor?.value;
|
|
570
|
+
// SAFETY: The string is used only as a Set lookup key; membership performs the supported-event check.
|
|
547
571
|
if (
|
|
572
|
+
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- Validate untrusted streamed item identifiers and discriminators before mutating the response snapshot.
|
|
548
573
|
typeof type !== 'string' ||
|
|
549
574
|
!supportedResponseEventTypes.has(type as ResponseAccumulatorEvent['type'])
|
|
550
575
|
) {
|
|
576
|
+
// SAFETY: assertNever always throws; the cast routes invalid runtime events through the existing unsupported-event error path.
|
|
551
577
|
return assertNever(event as never);
|
|
552
578
|
}
|
|
553
579
|
|
|
@@ -566,21 +592,23 @@ function sanitizeResponseEvent(event: ResponseAccumulatorEvent): ResponseAccumul
|
|
|
566
592
|
try {
|
|
567
593
|
for (const field of responseEventRoutingFields) {
|
|
568
594
|
const routingDescriptor = Object.getOwnPropertyDescriptor(event, field);
|
|
569
|
-
stableValues.set(field, routingDescriptor ?
|
|
595
|
+
stableValues.set(field, routingDescriptor ? event[field] : undefined);
|
|
570
596
|
}
|
|
571
597
|
|
|
572
598
|
if (type === 'response.output_item.done') {
|
|
573
|
-
stableValues.set('item', structuredClone(
|
|
599
|
+
stableValues.set('item', structuredClone(event.item));
|
|
574
600
|
} else if (type === 'response.content_part.added' || type === 'response.content_part.done') {
|
|
575
|
-
stableValues.set('part', structuredClone(
|
|
601
|
+
stableValues.set('part', structuredClone(event.part));
|
|
576
602
|
}
|
|
577
603
|
} catch {
|
|
604
|
+
// SAFETY: assertNever always throws; the cast routes invalid runtime events through the existing unsupported-event error path.
|
|
578
605
|
return assertNever(event as never);
|
|
579
606
|
}
|
|
580
607
|
}
|
|
581
608
|
|
|
582
609
|
return new Proxy(event, {
|
|
583
610
|
get(target, property) {
|
|
611
|
+
// oxlint-disable-next-line anti-slop/no-reflect-get -- Proxy forwarding must preserve arbitrary keys with the original target as accessor receiver.
|
|
584
612
|
return stableValues.has(property) ? stableValues.get(property) : Reflect.get(target, property, target);
|
|
585
613
|
},
|
|
586
614
|
});
|
|
@@ -772,6 +800,7 @@ function accumulateOutputTextEvent(
|
|
|
772
800
|
throw new OpenAIError(`expected content to be 'output_text', got ${content.type}`);
|
|
773
801
|
}
|
|
774
802
|
validateArrayIndex(content.annotations, event.annotation_index, 'annotation', true);
|
|
803
|
+
// SAFETY: The output_text discriminator and annotation index were checked; the annotation is cloned from the corresponding API event contract.
|
|
775
804
|
content.annotations[event.annotation_index] = structuredClone(
|
|
776
805
|
event.annotation,
|
|
777
806
|
) as ResponseOutputText['annotations'][number];
|
|
@@ -1151,6 +1180,7 @@ function isIgnoredResponseEvent(event: ResponseAccumulatorEvent): event is Respo
|
|
|
1151
1180
|
case 'response.audio.done':
|
|
1152
1181
|
case 'response.audio.transcript.delta':
|
|
1153
1182
|
case 'response.audio.transcript.done':
|
|
1183
|
+
case 'response.compaction.compacting':
|
|
1154
1184
|
case 'response.image_generation_call.partial_image':
|
|
1155
1185
|
case 'response.mcp_list_tools.in_progress':
|
|
1156
1186
|
case 'response.mcp_list_tools.completed':
|
package/src/internal/to-file.ts
CHANGED
|
@@ -186,7 +186,7 @@ async function getBytes(value: BlobLikePart | AsyncIterable<BlobLikePart>): Prom
|
|
|
186
186
|
isAsyncIterable(value) // includes Readable, ReadableStream, etc.
|
|
187
187
|
) {
|
|
188
188
|
for await (const chunk of value) {
|
|
189
|
-
parts.push(...(await getBytes(chunk
|
|
189
|
+
parts.push(...(await getBytes(chunk)));
|
|
190
190
|
}
|
|
191
191
|
} else {
|
|
192
192
|
const constructor = value?.constructor?.name;
|
package/src/internal/uploads.ts
CHANGED
|
@@ -105,6 +105,7 @@ type NamedBlob = Blob & {
|
|
|
105
105
|
*/
|
|
106
106
|
export const checkFileSupport = () => {
|
|
107
107
|
if (typeof File === 'undefined') {
|
|
108
|
+
// SAFETY: This optional Node global is inspected only to improve the missing-File diagnostic in runtimes without process.
|
|
108
109
|
const { process } = globalThis as any;
|
|
109
110
|
const isOldNode =
|
|
110
111
|
typeof process?.versions?.node === 'string' &&
|
|
@@ -148,6 +149,7 @@ export function makeFile(
|
|
|
148
149
|
options?: FilePropertyBag,
|
|
149
150
|
): File {
|
|
150
151
|
checkFileSupport();
|
|
152
|
+
// SAFETY: The SDK BlobPart union supports Node and web binary inputs; the native File constructor handles those parts across their differing ambient types.
|
|
151
153
|
return new File(fileBits as any, fileName ?? 'unknown_file', options);
|
|
152
154
|
}
|
|
153
155
|
|
|
@@ -268,6 +270,7 @@ const supportsFormDataMap = /* @__PURE__ */ new WeakMap<Fetch, Promise<boolean>>
|
|
|
268
270
|
* confusing error messages later on.
|
|
269
271
|
*/
|
|
270
272
|
function supportsFormData(fetchObject: OpenAI | Fetch): Promise<boolean> {
|
|
273
|
+
// SAFETY: The union has already excluded callable fetch values; the remaining OpenAI client owns the fetch implementation used by this probe.
|
|
271
274
|
const fetch: Fetch = typeof fetchObject === 'function' ? fetchObject : (fetchObject as any).fetch;
|
|
272
275
|
const cached = supportsFormDataMap.get(fetch);
|
|
273
276
|
if (cached) {
|
|
@@ -277,10 +280,12 @@ function supportsFormData(fetchObject: OpenAI | Fetch): Promise<boolean> {
|
|
|
277
280
|
try {
|
|
278
281
|
let FetchResponse: typeof Response;
|
|
279
282
|
if ('Response' in fetch) {
|
|
283
|
+
// SAFETY: Custom fetch implementations may expose their matching Response constructor; the enclosing probe catches incompatible constructors.
|
|
280
284
|
FetchResponse = fetch.Response as typeof Response;
|
|
281
285
|
} else {
|
|
282
286
|
const response = await fetch('data:,');
|
|
283
287
|
await response.arrayBuffer();
|
|
288
|
+
// SAFETY: The successful fetch response supplies the constructor used to test its own FormData support; failures remain inside the probe's catch.
|
|
284
289
|
FetchResponse = response.constructor as typeof Response;
|
|
285
290
|
}
|
|
286
291
|
const data = new FormData();
|
|
@@ -351,6 +356,7 @@ const isUploadable = (value: unknown): value is Uploadable =>
|
|
|
351
356
|
isStreamingFile(value) ||
|
|
352
357
|
isBlob(value));
|
|
353
358
|
|
|
359
|
+
// SAFETY: The enclosing object guard and own-key enumeration allow reading these property values without assigning them a trusted value type.
|
|
354
360
|
const hasStreamingUploadableValue = (value: unknown): boolean => {
|
|
355
361
|
if (isStreamingFile(value) || isAsyncIterable(value) || isReadableStream(value)) {
|
|
356
362
|
return true;
|
|
@@ -369,6 +375,7 @@ const hasStreamingUploadableValue = (value: unknown): boolean => {
|
|
|
369
375
|
return false;
|
|
370
376
|
};
|
|
371
377
|
|
|
378
|
+
// SAFETY: The enclosing object guard and own-key enumeration allow reading these property values without assigning them a trusted value type.
|
|
372
379
|
const hasUploadableValue = (value: unknown): boolean => {
|
|
373
380
|
if (isUploadable(value)) {
|
|
374
381
|
return true;
|
|
@@ -496,6 +503,7 @@ function* iterateFormValue(key: string, value: unknown): Generator<FormEntry> {
|
|
|
496
503
|
}
|
|
497
504
|
|
|
498
505
|
function getStreamingFileName(value: Uploadable, options: CreateFormOptions): string {
|
|
506
|
+
// oxlint-disable-next-line anti-slop/no-known-value-widening -- The runtime guard validates JavaScript and custom upload values before trusting the StreamingFile brand.
|
|
499
507
|
if (isStreamingFile(value)) {
|
|
500
508
|
const { name } = value;
|
|
501
509
|
if (typeof name !== 'string' || !name) {
|
|
@@ -513,6 +521,7 @@ function getStreamingFileName(value: Uploadable, options: CreateFormOptions): st
|
|
|
513
521
|
function getStreamingFileType(value: Uploadable): string {
|
|
514
522
|
let type: string | undefined;
|
|
515
523
|
|
|
524
|
+
// oxlint-disable-next-line anti-slop/no-known-value-widening -- Runtime upload-brand checks intentionally accept unknown inputs despite the static Uploadable annotation.
|
|
516
525
|
if (isStreamingFile(value) || isBlob(value)) {
|
|
517
526
|
({ type } = value);
|
|
518
527
|
} else if (value instanceof Response) {
|
|
@@ -537,7 +546,8 @@ function validateStreamingFileType(type: string): string {
|
|
|
537
546
|
return type;
|
|
538
547
|
}
|
|
539
548
|
|
|
540
|
-
function getStreamingFileData(value: Uploadable):
|
|
549
|
+
function getStreamingFileData(value: Uploadable): Exclude<Uploadable, StreamingFile> {
|
|
550
|
+
// oxlint-disable-next-line anti-slop/no-known-value-widening -- The runtime guard validates the streaming wrapper before accessing its potentially custom data.
|
|
541
551
|
if (isStreamingFile(value)) {
|
|
542
552
|
return value.data;
|
|
543
553
|
}
|
|
@@ -4,16 +4,18 @@ interface WeakReference<T> {
|
|
|
4
4
|
}
|
|
5
5
|
type WeakAbortCallback = WeakReference<AbortCallback>;
|
|
6
6
|
interface AbortFinalizer {
|
|
7
|
-
register: (target: AbortCallback, cleanup: AbortCallback, token:
|
|
8
|
-
unregister: (token:
|
|
7
|
+
register: (target: AbortCallback, cleanup: AbortCallback, token: WeakAbortCallback) => void;
|
|
8
|
+
unregister: (token: WeakAbortCallback) => boolean;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
// Keep these optional runtime features out of the SDK's ES2020 type requirements.
|
|
12
|
+
// SAFETY: These host features are optional and checked before use; the structural view avoids requiring newer ambient library declarations.
|
|
12
13
|
const weakGlobals = globalThis as typeof globalThis & {
|
|
13
14
|
WeakRef?: new <T extends object>(target: T) => WeakReference<T>;
|
|
14
15
|
FinalizationRegistry?: new (cleanup: (value: AbortCallback) => void) => AbortFinalizer;
|
|
15
16
|
};
|
|
16
17
|
const finalizer =
|
|
18
|
+
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- Weak references and finalizers are optional host capabilities, so probe them before constructing either.
|
|
17
19
|
typeof weakGlobals.FinalizationRegistry === 'function'
|
|
18
20
|
? new weakGlobals.FinalizationRegistry((cleanup) => {
|
|
19
21
|
try {
|
|
@@ -68,10 +70,12 @@ function releaseOnAbort(
|
|
|
68
70
|
|
|
69
71
|
/** Keep cancellation alive until abort or collection of the response body or bodyless custom response. */
|
|
70
72
|
export function retainRequestAbortCallback(
|
|
73
|
+
// oxlint-disable-next-line anti-slop/no-object-parameters -- Abort callbacks are retained by any response-body or custom-response owner identity.
|
|
71
74
|
owner: object,
|
|
72
75
|
abort: AbortCallback,
|
|
73
76
|
requestSignal: AbortSignal,
|
|
74
77
|
): void {
|
|
78
|
+
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- Weak references and finalizers are optional host capabilities, so probe them before constructing either.
|
|
75
79
|
if (typeof weakGlobals.WeakRef === 'function' && finalizer && !requestSignal.aborted) {
|
|
76
80
|
let callbacks = callbackOwners.get(owner);
|
|
77
81
|
if (!callbacks) {
|
|
@@ -99,6 +103,7 @@ export function addRequestAbortListener(
|
|
|
99
103
|
// No listener was installed for an already aborted signal.
|
|
100
104
|
};
|
|
101
105
|
}
|
|
106
|
+
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- Weak references and finalizers are optional host capabilities, so probe them before constructing either.
|
|
102
107
|
if (typeof weakGlobals.WeakRef !== 'function' || !finalizer) {
|
|
103
108
|
signal.addEventListener('abort', abort, { once: true });
|
|
104
109
|
return () => signal.removeEventListener('abort', abort);
|
|
@@ -19,6 +19,7 @@ let encodeUTF8_: (str: string) => Uint8Array;
|
|
|
19
19
|
/** Encodes text as UTF-8 bytes, reusing the platform encoder after its first call. */
|
|
20
20
|
export function encodeUTF8(str: string) {
|
|
21
21
|
let encoder;
|
|
22
|
+
// SAFETY: Supported runtimes provide the standard TextEncoder/TextDecoder globals; the cast keeps their ambient DOM declarations optional.
|
|
22
23
|
return (
|
|
23
24
|
encodeUTF8_ ??
|
|
24
25
|
((encoder = new (globalThis as any).TextEncoder()), (encodeUTF8_ = encoder.encode.bind(encoder)))
|
|
@@ -30,6 +31,7 @@ let decodeUTF8_: (bytes: Uint8Array) => string;
|
|
|
30
31
|
/** Decodes UTF-8 bytes as text, reusing the platform decoder after its first call. */
|
|
31
32
|
export function decodeUTF8(bytes: Uint8Array) {
|
|
32
33
|
let decoder;
|
|
34
|
+
// SAFETY: Supported runtimes provide the standard TextEncoder/TextDecoder globals; the cast keeps their ambient DOM declarations optional.
|
|
33
35
|
return (
|
|
34
36
|
decodeUTF8_ ??
|
|
35
37
|
((decoder = new (globalThis as any).TextDecoder()), (decodeUTF8_ = decoder.decode.bind(decoder)))
|
|
@@ -24,6 +24,7 @@ const EMPTY = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.create(null))
|
|
|
24
24
|
* `encodeURIComponent`. Nullish values, ordinary objects, and literal or
|
|
25
25
|
* percent-encoded `.`/`..` path segments are rejected with an SDK error.
|
|
26
26
|
*/
|
|
27
|
+
// SAFETY: This branch compares prototype methods to recognize cross-realm plain values; it does not call the optional hasOwnProperty member.
|
|
27
28
|
export const createPathTagFunction = (pathEncoder = encodeURIPath) =>
|
|
28
29
|
function path(statics: readonly string[], ...params: readonly unknown[]): string {
|
|
29
30
|
// If there are no params, no processing is needed.
|
|
@@ -45,6 +46,7 @@ export const createPathTagFunction = (pathEncoder = encodeURIPath) =>
|
|
|
45
46
|
if (
|
|
46
47
|
index !== params.length &&
|
|
47
48
|
(value == null ||
|
|
49
|
+
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- Path parameters may arrive from JavaScript callers and require runtime validation before URL encoding.
|
|
48
50
|
(typeof value === 'object' &&
|
|
49
51
|
// handle values from other realms
|
|
50
52
|
value.toString ===
|
|
@@ -1 +1,52 @@
|
|
|
1
|
-
export const sleep = (ms: number
|
|
1
|
+
export const sleep = (ms: number, ...signals: (AbortSignal | null | undefined)[]): Promise<void> =>
|
|
2
|
+
new Promise((resolve, reject) => {
|
|
3
|
+
const activeSignals = [...new Set(signals.filter((signal): signal is AbortSignal => signal != null))];
|
|
4
|
+
let timeout: ReturnType<typeof setTimeout> | undefined;
|
|
5
|
+
let settled = false;
|
|
6
|
+
const cleanup = () => {
|
|
7
|
+
for (const signal of activeSignals) {
|
|
8
|
+
try {
|
|
9
|
+
signal.removeEventListener('abort', abort);
|
|
10
|
+
} catch {
|
|
11
|
+
// Structural signal cleanup must not prevent the promise from settling.
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
const settle = (callback: () => void) => {
|
|
16
|
+
if (settled) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
settled = true;
|
|
20
|
+
if (timeout !== undefined) {
|
|
21
|
+
clearTimeout(timeout);
|
|
22
|
+
timeout = undefined;
|
|
23
|
+
}
|
|
24
|
+
cleanup();
|
|
25
|
+
callback();
|
|
26
|
+
};
|
|
27
|
+
const abort = () => {
|
|
28
|
+
settle(() => reject());
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
if (activeSignals.some((signal) => signal.aborted)) {
|
|
32
|
+
abort();
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
timeout = setTimeout(() => {
|
|
37
|
+
settle(resolve);
|
|
38
|
+
}, ms);
|
|
39
|
+
for (const signal of activeSignals) {
|
|
40
|
+
if (settled) {
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
45
|
+
} catch (error) {
|
|
46
|
+
settle(() => reject(error));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (activeSignals.some((signal) => signal.aborted)) {
|
|
50
|
+
abort();
|
|
51
|
+
}
|
|
52
|
+
});
|
|
@@ -166,6 +166,7 @@ export class BrowserWebSocket implements WebSocketLike {
|
|
|
166
166
|
const message = ev?.message || ev?.error?.message || 'WebSocket error';
|
|
167
167
|
const err = new Error(message);
|
|
168
168
|
if (ev?.error) {
|
|
169
|
+
// SAFETY: The locally created Error receives the browser error event's cause; the cast avoids requiring newer Error ambient declarations.
|
|
169
170
|
(err as any).cause = ev.error;
|
|
170
171
|
}
|
|
171
172
|
listener(err);
|
|
@@ -173,6 +174,7 @@ export class BrowserWebSocket implements WebSocketLike {
|
|
|
173
174
|
}
|
|
174
175
|
|
|
175
176
|
default: {
|
|
177
|
+
// SAFETY: Non-special events use the native DOM handler contract directly; the adapter only wraps message, close, and error variants above.
|
|
176
178
|
return listener as DOMEventHandler;
|
|
177
179
|
}
|
|
178
180
|
}
|
package/src/internal/ws.ts
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
import { concatBytes, encodeUTF8 } from './utils/bytes';
|
|
2
2
|
import { OpenAIError } from '../core/error';
|
|
3
|
+
import type { WebSocketLike } from './ws-adapter';
|
|
4
|
+
|
|
5
|
+
const webSocketErrors = new WeakMap<WebSocketLike, Error>();
|
|
6
|
+
|
|
7
|
+
/** Records physical failure before transport callbacks notify public observers. @internal */
|
|
8
|
+
export function recordWebSocketError(socket: WebSocketLike, error: Error): void {
|
|
9
|
+
webSocketErrors.set(socket, error);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** Returns physical failure for this socket instance, never for a replacement. @internal */
|
|
13
|
+
export function getWebSocketError(socket: WebSocketLike): Error | undefined {
|
|
14
|
+
return webSocketErrors.get(socket);
|
|
15
|
+
}
|
|
3
16
|
|
|
4
17
|
/** Options for an independently buffered WebSocket stream iterator. */
|
|
5
18
|
export interface WebSocketStreamOptions {
|
|
@@ -86,14 +99,59 @@ const REDIRECT_SAFE_WEBSOCKET_HEADERS = new Set([
|
|
|
86
99
|
'x-trace-id',
|
|
87
100
|
]);
|
|
88
101
|
|
|
102
|
+
function isWebSocketCredentialHeader(name: string): boolean {
|
|
103
|
+
return !REDIRECT_SAFE_WEBSOCKET_HEADERS.has(name.toLowerCase().split('_').join('-'));
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Snapshots credential values in final socket options before validation and dispatch.
|
|
108
|
+
* Reports potential caller authentication, including custom headers; the server
|
|
109
|
+
* remains responsible for validating credentials. Noncredential headers are left intact.
|
|
110
|
+
*/
|
|
111
|
+
export function snapshotWebSocketCredentials(options: {
|
|
112
|
+
auth?: unknown;
|
|
113
|
+
headers?: Record<string, unknown> | undefined;
|
|
114
|
+
}): boolean {
|
|
115
|
+
if (options.auth !== null && options.auth !== undefined) {
|
|
116
|
+
options.auth = String(options.auth);
|
|
117
|
+
}
|
|
118
|
+
const credentials = new Map<string, boolean>();
|
|
119
|
+
const headers = options.headers ?? {};
|
|
120
|
+
for (const [name, value] of Object.entries(headers)) {
|
|
121
|
+
const normalizedName = name.toLowerCase().split('_').join('-');
|
|
122
|
+
// Routing metadata is still protected on redirects, but cannot authenticate a socket.
|
|
123
|
+
if (
|
|
124
|
+
!isWebSocketCredentialHeader(name) ||
|
|
125
|
+
normalizedName === 'openai-organization' ||
|
|
126
|
+
normalizedName === 'openai-project'
|
|
127
|
+
) {
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
let snapshot = value;
|
|
131
|
+
if (Array.isArray(value)) {
|
|
132
|
+
snapshot = value.map(String);
|
|
133
|
+
} else if (value !== null && value !== undefined) {
|
|
134
|
+
snapshot = String(value);
|
|
135
|
+
}
|
|
136
|
+
headers[name] = snapshot;
|
|
137
|
+
const values = Array.isArray(snapshot) ? snapshot : [snapshot];
|
|
138
|
+
credentials.set(
|
|
139
|
+
name.toLowerCase(),
|
|
140
|
+
values.some((item) => typeof item === 'string' && item.trim().length > 0),
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
// Node applies header names case-insensitively, and Authorization overrides Basic auth.
|
|
144
|
+
return (
|
|
145
|
+
[...credentials.values()].some(Boolean) ||
|
|
146
|
+
(!credentials.has('authorization') && typeof options.auth === 'string' && options.auth.trim().length > 0)
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
|
|
89
150
|
/** Prevents WebSocket redirects from forwarding caller or SDK credentials to another origin. */
|
|
90
151
|
export function protectWebSocketOptionsFromCredentialRedirects<Options extends CredentialedWebSocketOptions>(
|
|
91
152
|
options: Options,
|
|
92
153
|
): Options {
|
|
93
|
-
const hasSensitiveHeader = Object.keys(options.headers ?? {}).some(
|
|
94
|
-
const normalized = name.toLowerCase().split('_').join('-');
|
|
95
|
-
return !REDIRECT_SAFE_WEBSOCKET_HEADERS.has(normalized);
|
|
96
|
-
});
|
|
154
|
+
const hasSensitiveHeader = Object.keys(options.headers ?? {}).some(isWebSocketCredentialHeader);
|
|
97
155
|
|
|
98
156
|
if (!options.auth && !hasSensitiveHeader) {
|
|
99
157
|
return options;
|
|
@@ -157,9 +215,24 @@ function snapshotRawData(data: RawWebSocketData): Exclude<RawWebSocketData, Arra
|
|
|
157
215
|
return data.slice(0);
|
|
158
216
|
}
|
|
159
217
|
|
|
160
|
-
|
|
218
|
+
/** Counts wire bytes without allocating another payload-sized buffer. */
|
|
219
|
+
export function rawByteLength(data: RawWebSocketData): number {
|
|
161
220
|
if (typeof data === 'string') {
|
|
162
|
-
|
|
221
|
+
let bytes = 0;
|
|
222
|
+
for (let index = 0; index < data.length; index += 1) {
|
|
223
|
+
const code = data.codePointAt(index)!;
|
|
224
|
+
if (code < 128) {
|
|
225
|
+
bytes += 1;
|
|
226
|
+
} else if (code < 2048) {
|
|
227
|
+
bytes += 2;
|
|
228
|
+
} else if (code <= 65_535) {
|
|
229
|
+
bytes += 3;
|
|
230
|
+
} else {
|
|
231
|
+
bytes += 4;
|
|
232
|
+
index += 1;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return bytes;
|
|
163
236
|
}
|
|
164
237
|
if (Array.isArray(data)) {
|
|
165
238
|
return data.reduce((sum, buf) => sum + buf.byteLength, 0);
|
|
@@ -252,6 +325,7 @@ export class SendQueue<T = unknown> {
|
|
|
252
325
|
if (entry.kind === 'raw') {
|
|
253
326
|
return { type: 'raw', data: entry.data };
|
|
254
327
|
}
|
|
328
|
+
// SAFETY: T is the transport caller's event contract; JSON syntax is parsed here without imposing a runtime schema on forward-compatible events.
|
|
255
329
|
return { type: 'message', message: JSON.parse(entry.data) as T };
|
|
256
330
|
});
|
|
257
331
|
this._queue = [];
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { OpenAIError } from '../error';
|
|
2
2
|
import type OpenAI from '../index';
|
|
3
3
|
import type { RequestOptions } from '../internal/request-options';
|
|
4
4
|
import { uuid4 } from '../internal/utils/uuid';
|
|
@@ -142,6 +142,7 @@ export class AbstractChatCompletionRunner<
|
|
|
142
142
|
this._emit('chatCompletion', chatCompletion);
|
|
143
143
|
const message = chatCompletion.choices[0]?.message;
|
|
144
144
|
if (message) {
|
|
145
|
+
// SAFETY: An API assistant message is also accepted as a subsequent conversation message; this preserves that existing input/output bridge.
|
|
145
146
|
this._addMessage(message as ChatCompletionMessageParam);
|
|
146
147
|
}
|
|
147
148
|
return chatCompletion;
|
|
@@ -163,6 +164,7 @@ export class AbstractChatCompletionRunner<
|
|
|
163
164
|
this._emit('message', message);
|
|
164
165
|
if (isToolMessage(message) && message.content) {
|
|
165
166
|
// Note, this assumes that {role: 'tool', content: …} is always the result of a call of tool of type=function.
|
|
167
|
+
// SAFETY: The legacy function-tool result event assumes textual tool output, as documented by the adjacent compatibility comment.
|
|
166
168
|
this._emit('functionToolCallResult', message.content as string);
|
|
167
169
|
} else if (isAssistantMessage(message) && message.tool_calls) {
|
|
168
170
|
for (const tool_call of message.tool_calls) {
|
|
@@ -206,6 +208,7 @@ export class AbstractChatCompletionRunner<
|
|
|
206
208
|
const message = this.messages[i];
|
|
207
209
|
if (isAssistantMessage(message)) {
|
|
208
210
|
// Audio is intentionally omitted from the final message snapshot.
|
|
211
|
+
// SAFETY: The assistant-message branch normalizes missing content and refusal to null when constructing the completed message.
|
|
209
212
|
const ret: Omit<ChatCompletionMessage, 'audio'> = {
|
|
210
213
|
...message,
|
|
211
214
|
content: (message as ChatCompletionMessage).content ?? null,
|
|
@@ -257,6 +260,7 @@ export class AbstractChatCompletionRunner<
|
|
|
257
260
|
if (
|
|
258
261
|
isToolMessage(message) &&
|
|
259
262
|
message.content != null &&
|
|
263
|
+
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- Chat history and tool-choice inputs can contain runtime variants that select different runner behavior.
|
|
260
264
|
typeof message.content === 'string' &&
|
|
261
265
|
this.messages.some(
|
|
262
266
|
(x) =>
|
|
@@ -340,13 +344,7 @@ export class AbstractChatCompletionRunner<
|
|
|
340
344
|
|
|
341
345
|
#throwIfAborted() {
|
|
342
346
|
if (this.controller.signal.aborted) {
|
|
343
|
-
|
|
344
|
-
Object.defineProperty(error, 'cause', {
|
|
345
|
-
value: this.controller.signal.reason,
|
|
346
|
-
writable: true,
|
|
347
|
-
configurable: true,
|
|
348
|
-
});
|
|
349
|
-
throw error;
|
|
347
|
+
throw this._userAbortError();
|
|
350
348
|
}
|
|
351
349
|
}
|
|
352
350
|
|
|
@@ -397,8 +395,10 @@ export class AbstractChatCompletionRunner<
|
|
|
397
395
|
) {
|
|
398
396
|
const role = 'tool' as const;
|
|
399
397
|
const { tool_choice = 'auto', stream, toolContext: inputToolContext, ...restParams } = params;
|
|
398
|
+
// SAFETY: The generic runner parameters tie toolContext to ToolContext; undefined remains valid when the caller omits it under that contract.
|
|
400
399
|
const toolContext = inputToolContext as ToolContext;
|
|
401
400
|
const singleFunctionToCall =
|
|
401
|
+
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- Chat history and tool-choice inputs can contain runtime variants that select different runner behavior.
|
|
402
402
|
typeof tool_choice !== 'string' && tool_choice.type === 'function' && tool_choice?.function?.name;
|
|
403
403
|
const { maxChatCompletions = DEFAULT_MAX_CHAT_COMPLETIONS, afterCompletion } = options || {};
|
|
404
404
|
const runAfterCompletion = async (completion: ChatCompletion) => {
|
|
@@ -417,6 +417,7 @@ export class AbstractChatCompletionRunner<
|
|
|
417
417
|
throw new OpenAIError('Tool given to `.runTools()` that does not have an associated function');
|
|
418
418
|
}
|
|
419
419
|
|
|
420
|
+
// SAFETY: The auto-parseable tool supplies its own validated parameter schema and parser; this bridges the legacy runnable-tool parameter type.
|
|
420
421
|
return {
|
|
421
422
|
type: 'function',
|
|
422
423
|
function: {
|
|
@@ -430,7 +431,8 @@ export class AbstractChatCompletionRunner<
|
|
|
430
431
|
};
|
|
431
432
|
}
|
|
432
433
|
|
|
433
|
-
|
|
434
|
+
// SAFETY: Unbranded tools follow the existing runnable-tool contract; the function-tool branch below performs its normal dispatch.
|
|
435
|
+
return tool as RunnableToolFunction<any>;
|
|
434
436
|
});
|
|
435
437
|
|
|
436
438
|
const functionsByName: Record<string, RunnableFunction<any, ToolContext>> = Object.create(null);
|
|
@@ -440,6 +442,9 @@ export class AbstractChatCompletionRunner<
|
|
|
440
442
|
}
|
|
441
443
|
}
|
|
442
444
|
|
|
445
|
+
// SAFETY: The runnable function's parameter schema is forwarded as JSON keyword properties without changing or inspecting its values.
|
|
446
|
+
// SAFETY: This is the intentional non-function tool pass-through; the runnable and wire types differ in index signatures, not the forwarded value.
|
|
447
|
+
// SAFETY: Omitting the tools list preserves the optional wire field; the existing conditional result type is broader than the runnable helper's declaration.
|
|
443
448
|
const tools: ChatCompletionTool[] =
|
|
444
449
|
'tools' in params
|
|
445
450
|
? inputTools.map((t) =>
|
|
@@ -448,12 +453,14 @@ export class AbstractChatCompletionRunner<
|
|
|
448
453
|
type: 'function',
|
|
449
454
|
function: {
|
|
450
455
|
name: t.function.name || t.function.function.name,
|
|
456
|
+
// oxlint-disable-next-line anti-slop/no-unsafe-dictionary-type -- Tool parameter schemas use the published open JSON Schema dictionary contract, including arbitrary extensions.
|
|
451
457
|
parameters: t.function.parameters as Record<string, unknown>,
|
|
452
458
|
description: t.function.description,
|
|
453
459
|
strict: t.function.strict,
|
|
454
460
|
},
|
|
455
461
|
}
|
|
456
|
-
:
|
|
462
|
+
: // oxlint-disable-next-line anti-slop/no-chained-type-assertions -- Preserve the existing non-function tool pass-through; runnable and wire schema interfaces have incompatible index signatures.
|
|
463
|
+
(t as unknown as ChatCompletionTool),
|
|
457
464
|
)
|
|
458
465
|
: (undefined as any);
|
|
459
466
|
|
|
@@ -504,20 +511,34 @@ export class AbstractChatCompletionRunner<
|
|
|
504
511
|
parsed = await fn.parse(args);
|
|
505
512
|
} catch (error) {
|
|
506
513
|
if (this.controller.signal.aborted) {
|
|
507
|
-
throw
|
|
514
|
+
throw this._userAbortError();
|
|
508
515
|
}
|
|
509
516
|
const content = error instanceof Error ? error.message : String(error);
|
|
510
517
|
return { message: { role, tool_call_id, content }, functionCalled: false };
|
|
511
518
|
}
|
|
512
519
|
if (this.controller.signal.aborted) {
|
|
513
|
-
throw
|
|
520
|
+
throw this._userAbortError();
|
|
521
|
+
}
|
|
522
|
+
try {
|
|
523
|
+
rawContent = await fn.function(parsed, runner, toolContext);
|
|
524
|
+
} catch (error) {
|
|
525
|
+
if (this.controller.signal.aborted && Object.is(error, this.controller.signal.reason)) {
|
|
526
|
+
throw this._userAbortError();
|
|
527
|
+
}
|
|
528
|
+
throw error;
|
|
514
529
|
}
|
|
515
|
-
rawContent = await fn.function(parsed, runner, toolContext);
|
|
516
530
|
} else {
|
|
517
531
|
if (this.controller.signal.aborted && !bufferedToolCall) {
|
|
518
|
-
throw
|
|
532
|
+
throw this._userAbortError();
|
|
533
|
+
}
|
|
534
|
+
try {
|
|
535
|
+
rawContent = await fn.function(args, runner, toolContext);
|
|
536
|
+
} catch (error) {
|
|
537
|
+
if (this.controller.signal.aborted && Object.is(error, this.controller.signal.reason)) {
|
|
538
|
+
throw this._userAbortError();
|
|
539
|
+
}
|
|
540
|
+
throw error;
|
|
519
541
|
}
|
|
520
|
-
rawContent = await fn.function(args, runner, toolContext);
|
|
521
542
|
}
|
|
522
543
|
|
|
523
544
|
const content = AbstractChatCompletionRunner.#stringifyFunctionCallResult(rawContent);
|
|
@@ -555,7 +576,7 @@ export class AbstractChatCompletionRunner<
|
|
|
555
576
|
this._addMessage(result.message);
|
|
556
577
|
}
|
|
557
578
|
if (this.controller.signal.aborted) {
|
|
558
|
-
throw
|
|
579
|
+
throw this._userAbortError();
|
|
559
580
|
}
|
|
560
581
|
|
|
561
582
|
if (singleFunctionToCall && result.functionCalled) {
|
|
@@ -584,7 +605,7 @@ export class AbstractChatCompletionRunner<
|
|
|
584
605
|
}
|
|
585
606
|
}
|
|
586
607
|
if (this.controller.signal.aborted) {
|
|
587
|
-
throw
|
|
608
|
+
throw this._userAbortError();
|
|
588
609
|
}
|
|
589
610
|
}
|
|
590
611
|
|
|
@@ -592,7 +613,9 @@ export class AbstractChatCompletionRunner<
|
|
|
592
613
|
}
|
|
593
614
|
}
|
|
594
615
|
|
|
616
|
+
// oxlint-disable-next-line anti-slop/no-unknown-parameters -- Public tool callbacks can return any JavaScript value; this boundary normalizes their results for the API.
|
|
595
617
|
static #stringifyFunctionCallResult(rawContent: unknown): string {
|
|
618
|
+
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- Chat history and tool-choice inputs can contain runtime variants that select different runner behavior.
|
|
596
619
|
if (typeof rawContent === 'string') {
|
|
597
620
|
return rawContent;
|
|
598
621
|
}
|