openai 7.5.0 → 7.7.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 +117 -0
- package/README.md +46 -2
- package/auth/index.d.mts +1 -1
- package/auth/index.d.mts.map +1 -1
- package/auth/index.d.ts +1 -1
- package/auth/index.d.ts.map +1 -1
- package/auth/index.js.map +1 -1
- package/auth/index.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 +176 -4
- package/auth/subject-token-providers.js.map +1 -1
- package/auth/subject-token-providers.mjs +176 -4
- package/auth/subject-token-providers.mjs.map +1 -1
- package/auth/types.d.mts +17 -0
- package/auth/types.d.mts.map +1 -1
- package/auth/types.d.ts +17 -0
- package/auth/types.d.ts.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 +80 -7
- package/auth/workload-identity-auth.js.map +1 -1
- package/auth/workload-identity-auth.mjs +80 -7
- package/auth/workload-identity-auth.mjs.map +1 -1
- package/auth/x509-transport.d.mts +5 -0
- package/auth/x509-transport.d.mts.map +1 -0
- package/auth/x509-transport.d.ts +5 -0
- package/auth/x509-transport.d.ts.map +1 -0
- package/auth/x509-transport.js +39 -0
- package/auth/x509-transport.js.map +1 -0
- package/auth/x509-transport.mjs +36 -0
- package/auth/x509-transport.mjs.map +1 -0
- package/azure.d.mts +11 -2
- package/azure.d.mts.map +1 -1
- package/azure.d.ts +11 -2
- package/azure.d.ts.map +1 -1
- package/azure.js +7 -1
- package/azure.js.map +1 -1
- package/azure.mjs +7 -1
- package/azure.mjs.map +1 -1
- package/bedrock.d.mts +6 -2
- package/bedrock.d.mts.map +1 -1
- package/bedrock.d.ts +6 -2
- package/bedrock.d.ts.map +1 -1
- package/bedrock.js +34 -4
- package/bedrock.js.map +1 -1
- package/bedrock.mjs +35 -5
- package/bedrock.mjs.map +1 -1
- package/beta/realtime/internal-base.d.mts +2 -0
- package/beta/realtime/internal-base.d.mts.map +1 -1
- package/beta/realtime/internal-base.d.ts +2 -0
- package/beta/realtime/internal-base.d.ts.map +1 -1
- package/beta/realtime/internal-base.js +15 -0
- package/beta/realtime/internal-base.js.map +1 -1
- package/beta/realtime/internal-base.mjs +14 -0
- package/beta/realtime/internal-base.mjs.map +1 -1
- package/beta/realtime/websocket.d.mts +11 -5
- package/beta/realtime/websocket.d.mts.map +1 -1
- package/beta/realtime/websocket.d.ts +11 -5
- package/beta/realtime/websocket.d.ts.map +1 -1
- package/beta/realtime/websocket.js +106 -31
- package/beta/realtime/websocket.js.map +1 -1
- package/beta/realtime/websocket.mjs +107 -32
- package/beta/realtime/websocket.mjs.map +1 -1
- package/beta/realtime/ws.d.mts +0 -2
- package/beta/realtime/ws.d.mts.map +1 -1
- package/beta/realtime/ws.d.ts +0 -2
- package/beta/realtime/ws.d.ts.map +1 -1
- package/beta/realtime/ws.js +24 -5
- package/beta/realtime/ws.js.map +1 -1
- package/beta/realtime/ws.mjs +25 -6
- package/beta/realtime/ws.mjs.map +1 -1
- package/client.d.mts +17 -2
- package/client.d.mts.map +1 -1
- package/client.d.ts +17 -2
- package/client.d.ts.map +1 -1
- package/client.js +422 -70
- package/client.js.map +1 -1
- package/client.mjs +423 -71
- 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 +67 -9
- package/core/EventEmitter.js.map +1 -1
- package/core/EventEmitter.mjs +68 -10
- 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 +216 -26
- package/core/streaming.js.map +1 -1
- package/core/streaming.mjs +216 -26
- package/core/streaming.mjs.map +1 -1
- package/helpers/audio.d.mts +5 -5
- package/helpers/audio.d.mts.map +1 -1
- package/helpers/audio.d.ts +5 -5
- package/helpers/audio.d.ts.map +1 -1
- package/helpers/audio.js +93 -22
- package/helpers/audio.js.map +1 -1
- package/helpers/audio.mjs +93 -22
- 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 +34 -14
- package/helpers/standard-schema.js.map +1 -1
- package/helpers/standard-schema.mjs +35 -15
- package/helpers/standard-schema.mjs.map +1 -1
- package/helpers/zod-v3-strict-schema.d.mts +7 -0
- package/helpers/zod-v3-strict-schema.d.mts.map +1 -0
- package/helpers/zod-v3-strict-schema.d.ts +7 -0
- package/helpers/zod-v3-strict-schema.d.ts.map +1 -0
- package/helpers/zod-v3-strict-schema.js +403 -0
- package/helpers/zod-v3-strict-schema.js.map +1 -0
- package/helpers/zod-v3-strict-schema.mjs +399 -0
- package/helpers/zod-v3-strict-schema.mjs.map +1 -0
- package/helpers/zod.d.mts.map +1 -1
- package/helpers/zod.d.ts.map +1 -1
- package/helpers/zod.js +11 -3
- package/helpers/zod.js.map +1 -1
- package/helpers/zod.mjs +12 -4
- package/helpers/zod.mjs.map +1 -1
- package/index.d.mts +1 -1
- package/index.d.mts.map +1 -1
- package/index.d.ts +1 -1
- package/index.d.ts.map +1 -1
- package/index.js.map +1 -1
- package/index.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 +28 -8
- package/internal/assistant-stream-delta.js.map +1 -1
- package/internal/assistant-stream-delta.mjs +28 -8
- package/internal/assistant-stream-delta.mjs.map +1 -1
- package/internal/auth/x509-token-exchange.d.mts +16 -0
- package/internal/auth/x509-token-exchange.d.mts.map +1 -0
- package/internal/auth/x509-token-exchange.d.ts +16 -0
- package/internal/auth/x509-token-exchange.d.ts.map +1 -0
- package/internal/auth/x509-token-exchange.js +246 -0
- package/internal/auth/x509-token-exchange.js.map +1 -0
- package/internal/auth/x509-token-exchange.mjs +243 -0
- package/internal/auth/x509-token-exchange.mjs.map +1 -0
- package/internal/auth/x509-transport-capability.d.mts +37 -0
- package/internal/auth/x509-transport-capability.d.mts.map +1 -0
- package/internal/auth/x509-transport-capability.d.ts +37 -0
- package/internal/auth/x509-transport-capability.d.ts.map +1 -0
- package/internal/auth/x509-transport-capability.js +169 -0
- package/internal/auth/x509-transport-capability.js.map +1 -0
- package/internal/auth/x509-transport-capability.mjs +164 -0
- package/internal/auth/x509-transport-capability.mjs.map +1 -0
- package/internal/auth/x509-transport-registry.d.mts +63 -0
- package/internal/auth/x509-transport-registry.d.mts.map +1 -0
- package/internal/auth/x509-transport-registry.d.ts +63 -0
- package/internal/auth/x509-transport-registry.d.ts.map +1 -0
- package/internal/auth/x509-transport-registry.js +53 -0
- package/internal/auth/x509-transport-registry.js.map +1 -0
- package/internal/auth/x509-transport-registry.mjs +48 -0
- package/internal/auth/x509-transport-registry.mjs.map +1 -0
- package/internal/auth/x509-transport-state-browser.d.mts +21 -0
- package/internal/auth/x509-transport-state-browser.d.mts.map +1 -0
- package/internal/auth/x509-transport-state-browser.d.ts +21 -0
- package/internal/auth/x509-transport-state-browser.d.ts.map +1 -0
- package/internal/auth/x509-transport-state-browser.js +30 -0
- package/internal/auth/x509-transport-state-browser.js.map +1 -0
- package/internal/auth/x509-transport-state-browser.mjs +27 -0
- package/internal/auth/x509-transport-state-browser.mjs.map +1 -0
- package/internal/auth/x509-transport-state.cjs +30 -0
- package/internal/auth/x509-transport-state.cjs.map +1 -0
- package/internal/auth/x509-transport-state.d.cts +21 -0
- package/internal/auth/x509-transport-state.d.cts.map +1 -0
- package/internal/auth/x509-workload-identity-auth.d.mts +128 -0
- package/internal/auth/x509-workload-identity-auth.d.mts.map +1 -0
- package/internal/auth/x509-workload-identity-auth.d.ts +128 -0
- package/internal/auth/x509-workload-identity-auth.d.ts.map +1 -0
- package/internal/auth/x509-workload-identity-auth.js +767 -0
- package/internal/auth/x509-workload-identity-auth.js.map +1 -0
- package/internal/auth/x509-workload-identity-auth.mjs +757 -0
- package/internal/auth/x509-workload-identity-auth.mjs.map +1 -0
- package/internal/bedrock.d.mts +2 -0
- package/internal/bedrock.d.mts.map +1 -1
- package/internal/bedrock.d.ts +2 -0
- package/internal/bedrock.d.ts.map +1 -1
- package/internal/bedrock.js +169 -5
- package/internal/bedrock.js.map +1 -1
- package/internal/bedrock.mjs +168 -5
- package/internal/bedrock.mjs.map +1 -1
- package/internal/data-residency.d.mts +12 -0
- package/internal/data-residency.d.mts.map +1 -0
- package/internal/data-residency.d.ts +12 -0
- package/internal/data-residency.d.ts.map +1 -0
- package/internal/data-residency.js +34 -0
- package/internal/data-residency.js.map +1 -0
- package/internal/data-residency.mjs +30 -0
- package/internal/data-residency.mjs.map +1 -0
- package/internal/multipart-encoding.d.mts +8 -0
- package/internal/multipart-encoding.d.mts.map +1 -0
- package/internal/multipart-encoding.d.ts +8 -0
- package/internal/multipart-encoding.d.ts.map +1 -0
- package/internal/multipart-encoding.js +51 -0
- package/internal/multipart-encoding.js.map +1 -0
- package/internal/multipart-encoding.mjs +48 -0
- package/internal/multipart-encoding.mjs.map +1 -0
- package/internal/qs/utils.d.mts.map +1 -1
- package/internal/qs/utils.d.ts.map +1 -1
- package/internal/qs/utils.js +307 -10
- package/internal/qs/utils.js.map +1 -1
- package/internal/qs/utils.mjs +307 -10
- package/internal/qs/utils.mjs.map +1 -1
- package/internal/request-options.d.mts +7 -0
- package/internal/request-options.d.mts.map +1 -1
- package/internal/request-options.d.ts +7 -0
- package/internal/request-options.d.ts.map +1 -1
- package/internal/request-options.js +43 -1
- package/internal/request-options.js.map +1 -1
- package/internal/request-options.mjs +42 -1
- package/internal/request-options.mjs.map +1 -1
- package/internal/responses/canonical-output-text.js +3 -3
- package/internal/responses/canonical-output-text.js.map +1 -1
- package/internal/responses/canonical-output-text.mjs +3 -3
- package/internal/responses/canonical-output-text.mjs.map +1 -1
- package/internal/responses/response-accumulator.d.mts +1 -1
- package/internal/responses/response-accumulator.d.mts.map +1 -1
- package/internal/responses/response-accumulator.d.ts +1 -1
- package/internal/responses/response-accumulator.d.ts.map +1 -1
- package/internal/responses/response-accumulator.js +331 -25
- package/internal/responses/response-accumulator.js.map +1 -1
- package/internal/responses/response-accumulator.mjs +331 -25
- package/internal/responses/response-accumulator.mjs.map +1 -1
- package/internal/tslib.js +6 -0
- package/internal/tslib.mjs +6 -1
- package/internal/uploads.d.mts +10 -6
- package/internal/uploads.d.mts.map +1 -1
- package/internal/uploads.d.ts +10 -6
- package/internal/uploads.d.ts.map +1 -1
- package/internal/uploads.js +65 -24
- package/internal/uploads.js.map +1 -1
- package/internal/uploads.mjs +65 -24
- package/internal/uploads.mjs.map +1 -1
- package/internal/utils/env.d.mts.map +1 -1
- package/internal/utils/env.d.ts.map +1 -1
- package/internal/utils/env.js +9 -4
- package/internal/utils/env.js.map +1 -1
- package/internal/utils/env.mjs +9 -4
- package/internal/utils/env.mjs.map +1 -1
- package/internal/ws.d.mts.map +1 -1
- package/internal/ws.d.ts.map +1 -1
- package/internal/ws.js +23 -1
- package/internal/ws.js.map +1 -1
- package/internal/ws.mjs +23 -1
- 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 +32 -7
- package/lib/AbstractChatCompletionRunner.js.map +1 -1
- package/lib/AbstractChatCompletionRunner.mjs +34 -9
- 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 +211 -23
- package/lib/AssistantStream.js.map +1 -1
- package/lib/AssistantStream.mjs +211 -23
- package/lib/AssistantStream.mjs.map +1 -1
- package/lib/ChatCompletionStream.d.mts +1 -1
- package/lib/ChatCompletionStream.d.mts.map +1 -1
- package/lib/ChatCompletionStream.d.ts +1 -1
- package/lib/ChatCompletionStream.d.ts.map +1 -1
- package/lib/ChatCompletionStream.js +1118 -67
- package/lib/ChatCompletionStream.js.map +1 -1
- package/lib/ChatCompletionStream.mjs +1119 -68
- 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 +67 -9
- package/lib/EventEmitter.js.map +1 -1
- package/lib/EventEmitter.mjs +68 -10
- package/lib/EventEmitter.mjs.map +1 -1
- package/lib/EventStream.d.mts +4 -0
- package/lib/EventStream.d.mts.map +1 -1
- package/lib/EventStream.d.ts +4 -0
- package/lib/EventStream.d.ts.map +1 -1
- package/lib/EventStream.js +1096 -11
- package/lib/EventStream.js.map +1 -1
- package/lib/EventStream.mjs +1097 -12
- 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 +1 -1
- package/lib/ResponsesParser.js.map +1 -1
- package/lib/ResponsesParser.mjs +1 -1
- package/lib/ResponsesParser.mjs.map +1 -1
- package/lib/Util.d.mts +2 -0
- package/lib/Util.d.mts.map +1 -1
- package/lib/Util.d.ts +2 -0
- package/lib/Util.d.ts.map +1 -1
- package/lib/Util.js +7 -4
- package/lib/Util.js.map +1 -1
- package/lib/Util.mjs +7 -4
- package/lib/Util.mjs.map +1 -1
- package/lib/assistant-run-polling.d.mts +12 -0
- package/lib/assistant-run-polling.d.mts.map +1 -0
- package/lib/assistant-run-polling.d.ts +12 -0
- package/lib/assistant-run-polling.d.ts.map +1 -0
- package/lib/assistant-run-polling.js +17 -0
- package/lib/assistant-run-polling.js.map +1 -0
- package/lib/assistant-run-polling.mjs +14 -0
- package/lib/assistant-run-polling.mjs.map +1 -0
- package/lib/embeddings.d.mts +18 -0
- package/lib/embeddings.d.mts.map +1 -0
- package/lib/embeddings.d.ts +18 -0
- package/lib/embeddings.d.ts.map +1 -0
- package/lib/embeddings.js +50 -0
- package/lib/embeddings.js.map +1 -0
- package/lib/embeddings.mjs +47 -0
- package/lib/embeddings.mjs.map +1 -0
- package/lib/file-processing.d.mts +10 -0
- package/lib/file-processing.d.mts.map +1 -0
- package/lib/file-processing.d.ts +10 -0
- package/lib/file-processing.d.ts.map +1 -0
- package/lib/file-processing.js +30 -0
- package/lib/file-processing.js.map +1 -0
- package/lib/file-processing.mjs +27 -0
- package/lib/file-processing.mjs.map +1 -0
- package/lib/parser.d.mts.map +1 -1
- package/lib/parser.d.ts.map +1 -1
- package/lib/parser.js +16 -4
- package/lib/parser.js.map +1 -1
- package/lib/parser.mjs +16 -4
- package/lib/parser.mjs.map +1 -1
- package/lib/polling.d.mts +20 -0
- package/lib/polling.d.mts.map +1 -0
- package/lib/polling.d.ts +20 -0
- package/lib/polling.d.ts.map +1 -0
- package/lib/polling.js +130 -0
- package/lib/polling.js.map +1 -0
- package/lib/polling.mjs +127 -0
- package/lib/polling.mjs.map +1 -0
- package/lib/responses/ResponseStream.d.mts.map +1 -1
- package/lib/responses/ResponseStream.d.ts.map +1 -1
- package/lib/responses/ResponseStream.js +21 -11
- package/lib/responses/ResponseStream.js.map +1 -1
- package/lib/responses/ResponseStream.mjs +21 -11
- package/lib/responses/ResponseStream.mjs.map +1 -1
- package/lib/vector-store-polling.d.mts +22 -0
- package/lib/vector-store-polling.d.mts.map +1 -0
- package/lib/vector-store-polling.d.ts +22 -0
- package/lib/vector-store-polling.d.ts.map +1 -0
- package/lib/vector-store-polling.js +24 -0
- package/lib/vector-store-polling.js.map +1 -0
- package/lib/vector-store-polling.mjs +20 -0
- package/lib/vector-store-polling.mjs.map +1 -0
- package/lib/vector-store-upload.d.mts +17 -0
- package/lib/vector-store-upload.d.mts.map +1 -0
- package/lib/vector-store-upload.d.ts +17 -0
- package/lib/vector-store-upload.d.ts.map +1 -0
- package/lib/vector-store-upload.js +37 -0
- package/lib/vector-store-upload.js.map +1 -0
- package/lib/vector-store-upload.mjs +34 -0
- package/lib/vector-store-upload.mjs.map +1 -0
- package/lib/webhook-signature.d.mts +15 -0
- package/lib/webhook-signature.d.mts.map +1 -0
- package/lib/webhook-signature.d.ts +15 -0
- package/lib/webhook-signature.d.ts.map +1 -0
- package/lib/webhook-signature.js +125 -0
- package/lib/webhook-signature.js.map +1 -0
- package/lib/webhook-signature.mjs +121 -0
- package/lib/webhook-signature.mjs.map +1 -0
- package/package.json +14 -1
- package/realtime/internal-base.d.mts +2 -0
- package/realtime/internal-base.d.mts.map +1 -1
- package/realtime/internal-base.d.ts +2 -0
- package/realtime/internal-base.d.ts.map +1 -1
- package/realtime/internal-base.js +15 -0
- package/realtime/internal-base.js.map +1 -1
- package/realtime/internal-base.mjs +14 -0
- package/realtime/internal-base.mjs.map +1 -1
- package/realtime/websocket.d.mts +3 -2
- package/realtime/websocket.d.mts.map +1 -1
- package/realtime/websocket.d.ts +3 -2
- package/realtime/websocket.d.ts.map +1 -1
- package/realtime/websocket.js +90 -26
- package/realtime/websocket.js.map +1 -1
- package/realtime/websocket.mjs +91 -27
- 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 +9 -1
- package/realtime/ws.js.map +1 -1
- package/realtime/ws.mjs +10 -2
- package/realtime/ws.mjs.map +1 -1
- package/resources/admin/organization/index.d.mts +2 -2
- package/resources/admin/organization/index.d.mts.map +1 -1
- package/resources/admin/organization/index.d.ts +2 -2
- package/resources/admin/organization/index.d.ts.map +1 -1
- package/resources/admin/organization/index.js.map +1 -1
- package/resources/admin/organization/index.mjs.map +1 -1
- package/resources/admin/organization/organization.d.mts +4 -4
- package/resources/admin/organization/organization.d.mts.map +1 -1
- package/resources/admin/organization/organization.d.ts +4 -4
- package/resources/admin/organization/organization.d.ts.map +1 -1
- package/resources/admin/organization/organization.js.map +1 -1
- package/resources/admin/organization/organization.mjs.map +1 -1
- package/resources/admin/organization/projects/index.d.mts +1 -1
- package/resources/admin/organization/projects/index.d.mts.map +1 -1
- package/resources/admin/organization/projects/index.d.ts +1 -1
- package/resources/admin/organization/projects/index.d.ts.map +1 -1
- package/resources/admin/organization/projects/index.js.map +1 -1
- package/resources/admin/organization/projects/index.mjs.map +1 -1
- package/resources/admin/organization/projects/projects.d.mts +22 -5
- package/resources/admin/organization/projects/projects.d.mts.map +1 -1
- package/resources/admin/organization/projects/projects.d.ts +22 -5
- package/resources/admin/organization/projects/projects.d.ts.map +1 -1
- package/resources/admin/organization/projects/projects.js.map +1 -1
- package/resources/admin/organization/projects/projects.mjs.map +1 -1
- package/resources/admin/organization/usage.d.mts +62 -1
- package/resources/admin/organization/usage.d.mts.map +1 -1
- package/resources/admin/organization/usage.d.ts +62 -1
- package/resources/admin/organization/usage.d.ts.map +1 -1
- package/resources/admin/organization/usage.js.map +1 -1
- package/resources/admin/organization/usage.mjs.map +1 -1
- package/resources/beta/responses/internal-base.d.mts.map +1 -1
- package/resources/beta/responses/internal-base.d.ts.map +1 -1
- package/resources/beta/responses/internal-base.js +2 -0
- package/resources/beta/responses/internal-base.js.map +1 -1
- package/resources/beta/responses/internal-base.mjs +2 -0
- package/resources/beta/responses/internal-base.mjs.map +1 -1
- package/resources/beta/responses/responses.d.mts +17 -20
- package/resources/beta/responses/responses.d.mts.map +1 -1
- package/resources/beta/responses/responses.d.ts +17 -20
- 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/threads/runs/index.d.mts +1 -1
- package/resources/beta/threads/runs/index.d.mts.map +1 -1
- package/resources/beta/threads/runs/index.d.ts +1 -1
- package/resources/beta/threads/runs/index.d.ts.map +1 -1
- package/resources/beta/threads/runs/runs.d.mts.map +1 -1
- package/resources/beta/threads/runs/runs.d.ts.map +1 -1
- package/resources/beta/threads/runs/runs.js +2 -43
- package/resources/beta/threads/runs/runs.js.map +1 -1
- package/resources/beta/threads/runs/runs.mjs +2 -43
- package/resources/beta/threads/runs/runs.mjs.map +1 -1
- package/resources/chat/completions/completions.d.mts +6 -0
- package/resources/chat/completions/completions.d.mts.map +1 -1
- package/resources/chat/completions/completions.d.ts +6 -0
- package/resources/chat/completions/completions.d.ts.map +1 -1
- package/resources/chat/completions/completions.js.map +1 -1
- package/resources/chat/completions/completions.mjs.map +1 -1
- package/resources/embeddings.d.mts.map +1 -1
- package/resources/embeddings.d.ts.map +1 -1
- package/resources/embeddings.js +2 -36
- package/resources/embeddings.js.map +1 -1
- package/resources/embeddings.mjs +2 -36
- package/resources/embeddings.mjs.map +1 -1
- package/resources/files.d.mts.map +1 -1
- package/resources/files.d.ts.map +1 -1
- package/resources/files.js +2 -15
- package/resources/files.js.map +1 -1
- package/resources/files.mjs +2 -15
- package/resources/files.mjs.map +1 -1
- package/resources/images.d.mts +12 -22
- package/resources/images.d.mts.map +1 -1
- package/resources/images.d.ts +12 -22
- package/resources/images.d.ts.map +1 -1
- package/resources/realtime/calls.d.mts +23 -1
- package/resources/realtime/calls.d.mts.map +1 -1
- package/resources/realtime/calls.d.ts +23 -1
- package/resources/realtime/calls.d.ts.map +1 -1
- package/resources/realtime/calls.js +24 -0
- package/resources/realtime/calls.js.map +1 -1
- package/resources/realtime/calls.mjs +24 -0
- package/resources/realtime/calls.mjs.map +1 -1
- package/resources/realtime/index.d.mts +1 -1
- package/resources/realtime/index.d.mts.map +1 -1
- package/resources/realtime/index.d.ts +1 -1
- package/resources/realtime/index.d.ts.map +1 -1
- package/resources/realtime/index.js.map +1 -1
- package/resources/realtime/index.mjs +1 -1
- package/resources/realtime/index.mjs.map +1 -1
- package/resources/realtime/realtime.d.mts +5 -4
- package/resources/realtime/realtime.d.mts.map +1 -1
- package/resources/realtime/realtime.d.ts +5 -4
- package/resources/realtime/realtime.d.ts.map +1 -1
- package/resources/realtime/realtime.js.map +1 -1
- package/resources/realtime/realtime.mjs.map +1 -1
- package/resources/responses/internal-base.d.mts.map +1 -1
- package/resources/responses/internal-base.d.ts.map +1 -1
- package/resources/responses/internal-base.js +2 -0
- package/resources/responses/internal-base.js.map +1 -1
- package/resources/responses/internal-base.mjs +2 -0
- package/resources/responses/internal-base.mjs.map +1 -1
- package/resources/responses/responses.d.mts +17 -20
- package/resources/responses/responses.d.mts.map +1 -1
- package/resources/responses/responses.d.ts +17 -20
- 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/vector-stores/file-batches.d.mts.map +1 -1
- package/resources/vector-stores/file-batches.d.ts.map +1 -1
- package/resources/vector-stores/file-batches.js +4 -61
- package/resources/vector-stores/file-batches.js.map +1 -1
- package/resources/vector-stores/file-batches.mjs +4 -61
- package/resources/vector-stores/file-batches.mjs.map +1 -1
- package/resources/vector-stores/files.d.mts +1 -1
- package/resources/vector-stores/files.d.mts.map +1 -1
- package/resources/vector-stores/files.d.ts +1 -1
- package/resources/vector-stores/files.d.ts.map +1 -1
- package/resources/vector-stores/files.js +2 -35
- package/resources/vector-stores/files.js.map +1 -1
- package/resources/vector-stores/files.mjs +2 -35
- package/resources/vector-stores/files.mjs.map +1 -1
- package/resources/webhooks/webhooks.d.mts.map +1 -1
- package/resources/webhooks/webhooks.d.ts.map +1 -1
- package/resources/webhooks/webhooks.js +5 -43
- package/resources/webhooks/webhooks.js.map +1 -1
- package/resources/webhooks/webhooks.mjs +5 -43
- package/resources/webhooks/webhooks.mjs.map +1 -1
- package/src/auth/index.ts +6 -1
- package/src/auth/subject-token-providers.ts +196 -4
- package/src/auth/types.ts +24 -0
- package/src/auth/workload-identity-auth.ts +104 -7
- package/src/auth/x509-transport.ts +49 -0
- package/src/azure.ts +22 -1
- package/src/bedrock.ts +49 -5
- package/src/beta/realtime/internal-base.ts +15 -0
- package/src/beta/realtime/websocket.ts +148 -40
- package/src/beta/realtime/ws.ts +31 -13
- package/src/client.ts +536 -92
- package/src/core/EventEmitter.ts +91 -7
- package/src/core/streaming.ts +226 -30
- package/src/helpers/audio.ts +93 -22
- package/src/helpers/standard-schema.ts +50 -16
- package/src/helpers/zod-v3-strict-schema.ts +514 -0
- package/src/helpers/zod.ts +17 -4
- package/src/index.ts +1 -1
- package/src/internal/assistant-stream-delta.ts +33 -10
- package/src/internal/auth/x509-token-exchange.ts +310 -0
- package/src/internal/auth/x509-transport-capability.ts +219 -0
- package/src/internal/auth/x509-transport-registry.ts +118 -0
- package/src/internal/auth/x509-transport-state-browser.ts +36 -0
- package/src/internal/auth/x509-transport-state.cts +36 -0
- package/src/internal/auth/x509-workload-identity-auth.ts +958 -0
- package/src/internal/bedrock.ts +182 -5
- package/src/internal/data-residency.ts +44 -0
- package/src/internal/multipart-encoding.ts +53 -0
- package/src/internal/qs/utils.ts +375 -13
- package/src/internal/request-options.ts +52 -1
- package/src/internal/responses/canonical-output-text.ts +3 -3
- package/src/internal/responses/response-accumulator.ts +411 -24
- package/src/internal/uploads.ts +81 -26
- package/src/internal/utils/env.ts +9 -5
- package/src/internal/ws.ts +24 -3
- package/src/lib/AbstractChatCompletionRunner.ts +33 -6
- package/src/lib/AssistantStream.ts +262 -22
- package/src/lib/ChatCompletionStream.ts +1467 -103
- package/src/lib/EventEmitter.ts +91 -7
- package/src/lib/EventStream.ts +1483 -10
- package/src/lib/ResponsesParser.ts +4 -1
- package/src/lib/Util.ts +7 -5
- package/src/lib/assistant-run-polling.ts +27 -0
- package/src/lib/embeddings.ts +65 -0
- package/src/lib/file-processing.ts +36 -0
- package/src/lib/parser.ts +19 -4
- package/src/lib/polling.ts +144 -0
- package/src/lib/responses/ResponseStream.ts +22 -10
- package/src/lib/vector-store-polling.ts +46 -0
- package/src/lib/vector-store-upload.ts +53 -0
- package/src/lib/webhook-signature.ts +164 -0
- package/src/realtime/internal-base.ts +15 -0
- package/src/realtime/websocket.ts +130 -27
- package/src/realtime/ws.ts +15 -2
- package/src/resources/admin/organization/index.ts +2 -0
- package/src/resources/admin/organization/organization.ts +4 -0
- package/src/resources/admin/organization/projects/index.ts +1 -0
- package/src/resources/admin/organization/projects/projects.ts +37 -4
- package/src/resources/admin/organization/usage.ts +83 -0
- package/src/resources/beta/responses/internal-base.ts +2 -0
- package/src/resources/beta/responses/responses.ts +19 -22
- package/src/resources/beta/threads/runs/index.ts +1 -1
- package/src/resources/beta/threads/runs/runs.ts +2 -45
- package/src/resources/chat/completions/completions.ts +7 -0
- package/src/resources/embeddings.ts +2 -42
- package/src/resources/files.ts +2 -19
- package/src/resources/images.ts +12 -22
- package/src/resources/realtime/api.md +1 -0
- package/src/resources/realtime/calls.ts +46 -0
- package/src/resources/realtime/index.ts +7 -1
- package/src/resources/realtime/realtime.ts +5 -3
- package/src/resources/responses/internal-base.ts +2 -0
- package/src/resources/responses/responses.ts +19 -22
- package/src/resources/vector-stores/file-batches.ts +8 -77
- package/src/resources/vector-stores/files.ts +3 -43
- package/src/resources/webhooks/webhooks.ts +5 -61
- 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
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { InvalidWebhookSignatureError } from '../error';
|
|
2
|
+
import { fromBase64 } from '../internal/utils/base64';
|
|
3
|
+
import { encodeUTF8 } from '../internal/utils/bytes';
|
|
4
|
+
|
|
5
|
+
const MAX_DIRECT_WEBHOOK_VERIFICATIONS = 32;
|
|
6
|
+
const SHA256_SIGNATURE_LENGTH = 32;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Checks whether a webhook header requires constant-work HMAC signing without
|
|
10
|
+
* retaining an unbounded number of signature candidates.
|
|
11
|
+
*
|
|
12
|
+
* @internal
|
|
13
|
+
*/
|
|
14
|
+
export function webhookSignatureRequiresSigning(signatureHeader: string): boolean {
|
|
15
|
+
return (
|
|
16
|
+
signatureHeader.split(' ', MAX_DIRECT_WEBHOOK_VERIFICATIONS + 1).length > MAX_DIRECT_WEBHOOK_VERIFICATIONS
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function* signatureCandidates(signatureHeader: string): Generator<string> {
|
|
21
|
+
let start = 0;
|
|
22
|
+
|
|
23
|
+
while (start <= signatureHeader.length) {
|
|
24
|
+
const separator = signatureHeader.indexOf(' ', start);
|
|
25
|
+
const candidate = signatureHeader.slice(start, separator === -1 ? undefined : separator);
|
|
26
|
+
yield candidate.startsWith('v1,') ? candidate.slice(3) : candidate;
|
|
27
|
+
|
|
28
|
+
if (separator === -1) {
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
start = separator + 1;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function decodeSignature(signature: string): Uint8Array | undefined {
|
|
36
|
+
try {
|
|
37
|
+
const signatureBytes = fromBase64(signature);
|
|
38
|
+
return signatureBytes.byteLength === SHA256_SIGNATURE_LENGTH ? signatureBytes : undefined;
|
|
39
|
+
} catch {
|
|
40
|
+
// Invalid base64 does not prevent trying the next value.
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function firstValidLengthSignature(signatureHeader: string): Uint8Array | undefined {
|
|
46
|
+
for (const signature of signatureCandidates(signatureHeader)) {
|
|
47
|
+
const signatureBytes = decodeSignature(signature);
|
|
48
|
+
if (signatureBytes) {
|
|
49
|
+
return signatureBytes;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function selectMatchingSignature(
|
|
57
|
+
signatureHeader: string,
|
|
58
|
+
expectedSignature: Uint8Array,
|
|
59
|
+
firstSignature: Uint8Array,
|
|
60
|
+
): Uint8Array {
|
|
61
|
+
let matchingSignature = firstSignature;
|
|
62
|
+
|
|
63
|
+
for (const signature of signatureCandidates(signatureHeader)) {
|
|
64
|
+
const signatureBytes = decodeSignature(signature);
|
|
65
|
+
if (!signatureBytes) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
let difference = 0;
|
|
70
|
+
for (const [index, byte] of signatureBytes.entries()) {
|
|
71
|
+
// oxlint-disable-next-line no-bitwise -- Compare every HMAC byte without short-circuiting on shared prefixes.
|
|
72
|
+
difference |= byte ^ (expectedSignature[index] ?? 0);
|
|
73
|
+
}
|
|
74
|
+
if (difference === 0) {
|
|
75
|
+
matchingSignature = signatureBytes;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return matchingSignature;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Checks the timestamp and HMAC signatures after the resource has validated its
|
|
84
|
+
* crypto capabilities, secret, and required headers.
|
|
85
|
+
*
|
|
86
|
+
* @internal
|
|
87
|
+
*/
|
|
88
|
+
export async function verifyWebhookSignature(
|
|
89
|
+
payload: string,
|
|
90
|
+
signatureHeader: string,
|
|
91
|
+
timestamp: string,
|
|
92
|
+
webhookId: string,
|
|
93
|
+
secret: string,
|
|
94
|
+
tolerance: number,
|
|
95
|
+
): Promise<void> {
|
|
96
|
+
// oxlint-disable-next-line unicorn/prefer-number-coercion -- Preserve numeric-prefix parsing while signing the original timestamp text.
|
|
97
|
+
const timestampSeconds = Number.parseInt(timestamp, 10);
|
|
98
|
+
if (Number.isNaN(timestampSeconds)) {
|
|
99
|
+
throw new InvalidWebhookSignatureError('Invalid webhook timestamp format');
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const nowSeconds = Math.floor(Date.now() / 1000);
|
|
103
|
+
if (nowSeconds - timestampSeconds > tolerance) {
|
|
104
|
+
throw new InvalidWebhookSignatureError('Webhook timestamp is too old');
|
|
105
|
+
}
|
|
106
|
+
if (timestampSeconds > nowSeconds + tolerance) {
|
|
107
|
+
throw new InvalidWebhookSignatureError('Webhook timestamp is too new');
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Multiple signatures are space-separated; accept a matching value at any position.
|
|
111
|
+
const useBoundedVerification = webhookSignatureRequiresSigning(signatureHeader);
|
|
112
|
+
const firstSignature = useBoundedVerification ? firstValidLengthSignature(signatureHeader) : undefined;
|
|
113
|
+
|
|
114
|
+
if (useBoundedVerification && !firstSignature) {
|
|
115
|
+
throw new InvalidWebhookSignatureError(
|
|
116
|
+
'The given webhook signature does not match the expected signature',
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const decodedSecret = Uint8Array.from(
|
|
121
|
+
secret.startsWith('whsec_') ? fromBase64(secret.slice('whsec_'.length)) : encodeUTF8(secret),
|
|
122
|
+
);
|
|
123
|
+
const signedPayload = webhookId ? `${webhookId}.${timestamp}.${payload}` : `${timestamp}.${payload}`;
|
|
124
|
+
const signedPayloadBytes = Uint8Array.from(encodeUTF8(signedPayload));
|
|
125
|
+
const key = await crypto.subtle.importKey(
|
|
126
|
+
'raw',
|
|
127
|
+
decodedSecret,
|
|
128
|
+
{ name: 'HMAC', hash: 'SHA-256' },
|
|
129
|
+
false,
|
|
130
|
+
useBoundedVerification ? ['sign', 'verify'] : ['verify'],
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
if (useBoundedVerification && firstSignature) {
|
|
134
|
+
const expectedSignature = new Uint8Array(await crypto.subtle.sign('HMAC', key, signedPayloadBytes));
|
|
135
|
+
const signatureToVerify = selectMatchingSignature(signatureHeader, expectedSignature, firstSignature);
|
|
136
|
+
|
|
137
|
+
try {
|
|
138
|
+
if (await crypto.subtle.verify('HMAC', key, Uint8Array.from(signatureToVerify), signedPayloadBytes)) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
} catch {
|
|
142
|
+
// Provider verification failures have the same typed mismatch as the direct path.
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
throw new InvalidWebhookSignatureError(
|
|
146
|
+
'The given webhook signature does not match the expected signature',
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
for (const signature of signatureCandidates(signatureHeader)) {
|
|
151
|
+
try {
|
|
152
|
+
const signatureBytes = Uint8Array.from(fromBase64(signature));
|
|
153
|
+
// oxlint-disable-next-line no-await-in-loop -- Check signatures in order and stop at the first match.
|
|
154
|
+
const isValid = await crypto.subtle.verify('HMAC', key, signatureBytes, signedPayloadBytes);
|
|
155
|
+
if (isValid) {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
} catch {
|
|
159
|
+
// Invalid base64 or signature format does not prevent trying the next value.
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
throw new InvalidWebhookSignatureError('The given webhook signature does not match the expected signature');
|
|
164
|
+
}
|
|
@@ -8,6 +8,20 @@ import { EventEmitter } from '../lib/EventEmitter';
|
|
|
8
8
|
import { OpenAIError } from '../error';
|
|
9
9
|
import type OpenAI from '../index';
|
|
10
10
|
import { AzureOpenAI } from '../index';
|
|
11
|
+
import { assertX509WebSocketSupported } from '../internal/auth/x509-workload-identity-auth';
|
|
12
|
+
|
|
13
|
+
/** Parses frame data without exposing malformed payloads through JSON syntax errors. */
|
|
14
|
+
export function parseRealtimeEvent(data: string): RealtimeServerEvent {
|
|
15
|
+
try {
|
|
16
|
+
return JSON.parse(data) as RealtimeServerEvent;
|
|
17
|
+
} catch (error) {
|
|
18
|
+
if (error instanceof SyntaxError) {
|
|
19
|
+
throw new SyntaxError('Could not parse Realtime WebSocket event data as JSON.');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
throw error;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
11
25
|
|
|
12
26
|
function safeErrorValue(value: unknown): string {
|
|
13
27
|
try {
|
|
@@ -239,6 +253,7 @@ export function buildRealtimeURL(
|
|
|
239
253
|
client: Pick<OpenAI, 'apiKey' | 'baseURL'>,
|
|
240
254
|
connection: string | RealtimeConnectionConfig,
|
|
241
255
|
): URL {
|
|
256
|
+
assertX509WebSocketSupported(client);
|
|
242
257
|
const config: RealtimeConnectionConfig =
|
|
243
258
|
typeof connection === 'string' ? { model: connection } : connection;
|
|
244
259
|
const baseURL = client.baseURL;
|
|
@@ -2,12 +2,13 @@ import type { AzureOpenAI } from '../index';
|
|
|
2
2
|
import { assertBedrockWebSocketOrigin } from '../internal/bedrock';
|
|
3
3
|
import { OpenAI } from '../index';
|
|
4
4
|
import { OpenAIError } from '../error';
|
|
5
|
-
import type { RealtimeClientEvent
|
|
5
|
+
import type { RealtimeClientEvent } from '../resources/realtime/realtime';
|
|
6
6
|
import {
|
|
7
7
|
OpenAIRealtimeEmitter,
|
|
8
8
|
buildRealtimeURL,
|
|
9
9
|
getAzureRealtimeConnection,
|
|
10
10
|
isAzure,
|
|
11
|
+
parseRealtimeEvent,
|
|
11
12
|
} from './internal-base';
|
|
12
13
|
import type { AzureRealtimeConnectionConfig, RealtimeConnectionConfig } from './internal-base';
|
|
13
14
|
import { isRunningInBrowser } from '../internal/detect-platform';
|
|
@@ -25,10 +26,82 @@ type _WebSocket = typeof globalThis extends {
|
|
|
25
26
|
InstanceType<ws>
|
|
26
27
|
: any;
|
|
27
28
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
type RuntimeScope = typeof globalThis & {
|
|
30
|
+
process?: { versions?: { node?: string } };
|
|
31
|
+
WorkerGlobalScope?: typeof Object;
|
|
32
|
+
WorkerNavigator?: typeof Object;
|
|
33
|
+
Deno?: { version?: { deno?: string } };
|
|
34
|
+
Bun?: { version?: string };
|
|
35
|
+
EdgeRuntime?: unknown;
|
|
36
|
+
WebSocketPair?: unknown;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/** Identifies browser pages and workers without blocking trusted server runtimes. */
|
|
40
|
+
function isRunningInBrowserOrBrowserWorker(): boolean {
|
|
41
|
+
if (isRunningInBrowser()) {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const scope = globalThis as RuntimeScope;
|
|
46
|
+
return (
|
|
47
|
+
typeof scope.WorkerGlobalScope === 'function' &&
|
|
48
|
+
scope instanceof scope.WorkerGlobalScope &&
|
|
49
|
+
typeof scope.WorkerNavigator === 'function' &&
|
|
50
|
+
scope.navigator instanceof scope.WorkerNavigator &&
|
|
51
|
+
typeof scope.navigator?.userAgent === 'string' &&
|
|
52
|
+
scope.navigator.userAgent !== 'Cloudflare-Workers' &&
|
|
53
|
+
scope.process?.versions?.node === undefined &&
|
|
54
|
+
scope.Deno === undefined &&
|
|
55
|
+
scope.Bun === undefined &&
|
|
56
|
+
scope.EdgeRuntime === undefined &&
|
|
57
|
+
scope.WebSocketPair === undefined
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Reports whether the runtime supports request headers in native WebSocket options. */
|
|
62
|
+
function supportsWebSocketRequestHeaders(): boolean {
|
|
63
|
+
const scope = globalThis as RuntimeScope;
|
|
64
|
+
if (
|
|
65
|
+
isRunningInBrowserOrBrowserWorker() ||
|
|
66
|
+
scope.EdgeRuntime !== undefined ||
|
|
67
|
+
scope.WebSocketPair !== undefined ||
|
|
68
|
+
scope.navigator?.userAgent === 'Cloudflare-Workers'
|
|
69
|
+
) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (scope.Deno !== undefined) {
|
|
74
|
+
const [major, minor] = (scope.Deno.version?.deno ?? '').split('.').map(Number);
|
|
75
|
+
return major !== undefined && minor !== undefined && (major > 2 || (major === 2 && minor >= 5));
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (typeof scope.Bun?.version === 'string') {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return (
|
|
83
|
+
Object.prototype.toString.call(scope.process) === '[object process]' &&
|
|
84
|
+
typeof scope.process?.versions?.node === 'string'
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** Removes Azure credentials while preserving the existing public URL redaction contract. */
|
|
89
|
+
function redactAzureCredentials(url: URL, isBearerToken: boolean): void {
|
|
90
|
+
let hasApiKey = !isBearerToken;
|
|
91
|
+
let hasAuthorization = isBearerToken;
|
|
92
|
+
const parameterNames = [...url.searchParams.keys()];
|
|
93
|
+
|
|
94
|
+
for (const name of parameterNames) {
|
|
95
|
+
if (name.toLowerCase() === 'api-key') {
|
|
96
|
+
hasApiKey = true;
|
|
97
|
+
url.searchParams.delete(name);
|
|
98
|
+
} else if (name.toLowerCase() === 'authorization') {
|
|
99
|
+
hasAuthorization = true;
|
|
100
|
+
url.searchParams.delete(name);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (hasApiKey) {
|
|
32
105
|
url.searchParams.set('api-key', '<REDACTED>');
|
|
33
106
|
}
|
|
34
107
|
if (hasAuthorization) {
|
|
@@ -36,6 +109,32 @@ function redactAzureCredentials(url: URL): void {
|
|
|
36
109
|
}
|
|
37
110
|
}
|
|
38
111
|
|
|
112
|
+
/** Opens an Azure native socket with header authentication and a credential-free URL. */
|
|
113
|
+
function createAzureWebSocket(
|
|
114
|
+
url: URL,
|
|
115
|
+
apiKey: string | null,
|
|
116
|
+
isBearerToken: boolean,
|
|
117
|
+
protocols: string[],
|
|
118
|
+
): _WebSocket {
|
|
119
|
+
if (!supportsWebSocketRequestHeaders()) {
|
|
120
|
+
throw new OpenAIError(
|
|
121
|
+
'Azure OpenAI Realtime credentials require a WebSocket transport that supports request headers; use openai/realtime/ws or a server-side authentication proxy.',
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
if (!apiKey) {
|
|
125
|
+
throw new Error('Azure OpenAI Realtime requires an API key');
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
redactAzureCredentials(url, isBearerToken);
|
|
129
|
+
const socketURL = new URL(url);
|
|
130
|
+
socketURL.searchParams.delete('api-key');
|
|
131
|
+
socketURL.searchParams.delete('Authorization');
|
|
132
|
+
const headers = isBearerToken ? { Authorization: `Bearer ${apiKey}` } : { 'api-key': apiKey };
|
|
133
|
+
|
|
134
|
+
// @ts-ignore
|
|
135
|
+
return new WebSocket(socketURL.toString(), { protocols, headers });
|
|
136
|
+
}
|
|
137
|
+
|
|
39
138
|
/**
|
|
40
139
|
* Connects to the Realtime API using the runtime's native `WebSocket` implementation.
|
|
41
140
|
*
|
|
@@ -85,7 +184,7 @@ export class OpenAIRealtimeWebSocket extends OpenAIRealtimeEmitter {
|
|
|
85
184
|
props.dangerouslyAllowBrowser ??
|
|
86
185
|
(client as any)?._options?.dangerouslyAllowBrowser ??
|
|
87
186
|
(client?.apiKey?.startsWith('ek_') ? true : null);
|
|
88
|
-
if (!dangerouslyAllowBrowser &&
|
|
187
|
+
if (!dangerouslyAllowBrowser && isRunningInBrowserOrBrowserWorker()) {
|
|
89
188
|
throw new OpenAIError(
|
|
90
189
|
"It looks like you're running in a browser-like environment.\n\nThis is disabled by default, as it risks exposing your secret API credentials to attackers.\n\nYou can avoid this error by creating an ephemeral session token:\nhttps://platform.openai.com/docs/api-reference/realtime-sessions\n",
|
|
91
190
|
);
|
|
@@ -104,18 +203,34 @@ export class OpenAIRealtimeWebSocket extends OpenAIRealtimeEmitter {
|
|
|
104
203
|
|
|
105
204
|
this.url = buildRealtimeURL(client, props);
|
|
106
205
|
props.onURL?.(this.url);
|
|
206
|
+
if (this.url.protocol !== 'wss:') {
|
|
207
|
+
throw new OpenAIError('Realtime WebSocket URLs must use the wss: protocol.');
|
|
208
|
+
}
|
|
107
209
|
assertBedrockWebSocketOrigin(client, this.url);
|
|
108
210
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
211
|
+
const azure = isAzure(client);
|
|
212
|
+
const protocols = ['realtime', ...(azure ? [] : [`openai-insecure-api-key.${client.apiKey}`])];
|
|
213
|
+
|
|
214
|
+
this.socket = azure
|
|
215
|
+
? createAzureWebSocket(this.url, client.apiKey, props.__resolvedApiKey === true, protocols)
|
|
216
|
+
: new WebSocket(this.url.toString(), protocols);
|
|
114
217
|
|
|
115
218
|
this.socket.addEventListener('message', (websocketEvent: MessageEvent) => {
|
|
116
219
|
const event = (() => {
|
|
117
220
|
try {
|
|
118
|
-
|
|
221
|
+
const parsedEvent = parseRealtimeEvent(websocketEvent.data.toString());
|
|
222
|
+
|
|
223
|
+
if (
|
|
224
|
+
typeof parsedEvent !== 'object' ||
|
|
225
|
+
parsedEvent === null ||
|
|
226
|
+
Array.isArray(parsedEvent) ||
|
|
227
|
+
!Object.getOwnPropertyDescriptor(parsedEvent, 'type') ||
|
|
228
|
+
typeof parsedEvent.type !== 'string'
|
|
229
|
+
) {
|
|
230
|
+
throw new TypeError('Realtime WebSocket event must be an object with a string type.');
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return parsedEvent;
|
|
119
234
|
} catch (err) {
|
|
120
235
|
this._onError(null, 'could not parse websocket event', err);
|
|
121
236
|
return null;
|
|
@@ -137,10 +252,6 @@ export class OpenAIRealtimeWebSocket extends OpenAIRealtimeEmitter {
|
|
|
137
252
|
this.socket.addEventListener('error', (event: any) => {
|
|
138
253
|
this._onError(null, event.message, null);
|
|
139
254
|
});
|
|
140
|
-
|
|
141
|
-
if (isAzure(client)) {
|
|
142
|
-
redactAzureCredentials(this.url);
|
|
143
|
-
}
|
|
144
255
|
}
|
|
145
256
|
|
|
146
257
|
/**
|
|
@@ -174,8 +285,9 @@ export class OpenAIRealtimeWebSocket extends OpenAIRealtimeEmitter {
|
|
|
174
285
|
/**
|
|
175
286
|
* Opens a native Azure deployment or transcription session, or an existing sideband call.
|
|
176
287
|
*
|
|
177
|
-
* Azure credentials are
|
|
178
|
-
*
|
|
288
|
+
* Azure credentials are sent in WebSocket handshake headers and never appear
|
|
289
|
+
* in the native socket URL. Browser WebSockets cannot set these headers;
|
|
290
|
+
* use a server-side authentication proxy or the Node.js `ws` transport.
|
|
179
291
|
*
|
|
180
292
|
* @param client Azure OpenAI client that supplies the endpoint and credential.
|
|
181
293
|
* @param options Deployment, transcription intent, or call ID, plus browser-safety settings.
|
|
@@ -194,19 +306,10 @@ export class OpenAIRealtimeWebSocket extends OpenAIRealtimeEmitter {
|
|
|
194
306
|
if (!apiKey) {
|
|
195
307
|
throw new Error('Azure OpenAI Realtime requires an API key');
|
|
196
308
|
}
|
|
197
|
-
const azureApiKey = apiKey;
|
|
198
|
-
function onURL(url: URL) {
|
|
199
|
-
if (isApiKeyProvider) {
|
|
200
|
-
url.searchParams.set('Authorization', `Bearer ${azureApiKey}`);
|
|
201
|
-
} else {
|
|
202
|
-
url.searchParams.set('api-key', azureApiKey);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
309
|
const { dangerouslyAllowBrowser } = options;
|
|
206
310
|
return new OpenAIRealtimeWebSocket(
|
|
207
311
|
{
|
|
208
312
|
...connection,
|
|
209
|
-
onURL,
|
|
210
313
|
...(dangerouslyAllowBrowser === undefined ? {} : { dangerouslyAllowBrowser }),
|
|
211
314
|
__resolvedApiKey: isApiKeyProvider,
|
|
212
315
|
},
|
package/src/realtime/ws.ts
CHANGED
|
@@ -3,12 +3,13 @@ import { assertBedrockWebSocketOrigin } from '../internal/bedrock';
|
|
|
3
3
|
import { protectWebSocketOptionsFromCredentialRedirects } from '../internal/ws';
|
|
4
4
|
import type { AzureOpenAI } from '../index';
|
|
5
5
|
import { OpenAI } from '../index';
|
|
6
|
-
import type { RealtimeClientEvent
|
|
6
|
+
import type { RealtimeClientEvent } from '../resources/realtime/realtime';
|
|
7
7
|
import {
|
|
8
8
|
OpenAIRealtimeEmitter,
|
|
9
9
|
buildRealtimeURL,
|
|
10
10
|
getAzureRealtimeConnection,
|
|
11
11
|
isAzure,
|
|
12
|
+
parseRealtimeEvent,
|
|
12
13
|
} from './internal-base';
|
|
13
14
|
import type { AzureRealtimeConnectionConfig, RealtimeConnectionConfig } from './internal-base';
|
|
14
15
|
|
|
@@ -76,7 +77,19 @@ export class OpenAIRealtimeWS extends OpenAIRealtimeEmitter {
|
|
|
76
77
|
this.socket.on('message', (wsEvent) => {
|
|
77
78
|
const event = (() => {
|
|
78
79
|
try {
|
|
79
|
-
|
|
80
|
+
const parsedEvent = parseRealtimeEvent(wsEvent.toString());
|
|
81
|
+
|
|
82
|
+
if (
|
|
83
|
+
typeof parsedEvent !== 'object' ||
|
|
84
|
+
parsedEvent === null ||
|
|
85
|
+
Array.isArray(parsedEvent) ||
|
|
86
|
+
!Object.getOwnPropertyDescriptor(parsedEvent, 'type') ||
|
|
87
|
+
typeof parsedEvent.type !== 'string'
|
|
88
|
+
) {
|
|
89
|
+
throw new TypeError('Realtime WebSocket event must be an object with a string type.');
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return parsedEvent;
|
|
80
93
|
} catch (err) {
|
|
81
94
|
this._onError(null, 'could not parse websocket event', err);
|
|
82
95
|
return null;
|
|
@@ -59,6 +59,7 @@ export { Organization } from './organization';
|
|
|
59
59
|
export {
|
|
60
60
|
Projects,
|
|
61
61
|
type Project,
|
|
62
|
+
type ProjectResidency,
|
|
62
63
|
type ProjectCreateParams,
|
|
63
64
|
type ProjectUpdateParams,
|
|
64
65
|
type ProjectListParams,
|
|
@@ -90,6 +91,7 @@ export {
|
|
|
90
91
|
} from './spend-limit';
|
|
91
92
|
export {
|
|
92
93
|
Usage,
|
|
94
|
+
type CostQuantityUnit,
|
|
93
95
|
type UsageAudioSpeechesResponse,
|
|
94
96
|
type UsageAudioTranscriptionsResponse,
|
|
95
97
|
type UsageCodeInterpreterSessionsResponse,
|
|
@@ -71,6 +71,7 @@ import {
|
|
|
71
71
|
} from './spend-limit';
|
|
72
72
|
import * as UsageAPI from './usage';
|
|
73
73
|
import {
|
|
74
|
+
CostQuantityUnit,
|
|
74
75
|
Usage,
|
|
75
76
|
UsageAudioSpeechesParams,
|
|
76
77
|
UsageAudioSpeechesResponse,
|
|
@@ -111,6 +112,7 @@ import {
|
|
|
111
112
|
Project,
|
|
112
113
|
ProjectCreateParams,
|
|
113
114
|
ProjectListParams,
|
|
115
|
+
ProjectResidency,
|
|
114
116
|
ProjectUpdateParams,
|
|
115
117
|
Projects,
|
|
116
118
|
ProjectsPage,
|
|
@@ -173,6 +175,7 @@ export declare namespace Organization {
|
|
|
173
175
|
|
|
174
176
|
export {
|
|
175
177
|
Usage as Usage,
|
|
178
|
+
type CostQuantityUnit as CostQuantityUnit,
|
|
176
179
|
type UsageAudioSpeechesResponse as UsageAudioSpeechesResponse,
|
|
177
180
|
type UsageAudioTranscriptionsResponse as UsageAudioTranscriptionsResponse,
|
|
178
181
|
type UsageCodeInterpreterSessionsResponse as UsageCodeInterpreterSessionsResponse,
|
|
@@ -280,6 +283,7 @@ export declare namespace Organization {
|
|
|
280
283
|
export {
|
|
281
284
|
Projects as Projects,
|
|
282
285
|
type Project as Project,
|
|
286
|
+
type ProjectResidency as ProjectResidency,
|
|
283
287
|
type ProjectsPage as ProjectsPage,
|
|
284
288
|
type ProjectCreateParams as ProjectCreateParams,
|
|
285
289
|
type ProjectUpdateParams as ProjectUpdateParams,
|
|
@@ -273,12 +273,31 @@ export interface Project {
|
|
|
273
273
|
*/
|
|
274
274
|
name?: string | null;
|
|
275
275
|
|
|
276
|
+
/**
|
|
277
|
+
* The residency configuration for the project.
|
|
278
|
+
*/
|
|
279
|
+
residency?: ProjectResidency;
|
|
280
|
+
|
|
276
281
|
/**
|
|
277
282
|
* `active` or `archived`
|
|
278
283
|
*/
|
|
279
284
|
status?: string | null;
|
|
280
285
|
}
|
|
281
286
|
|
|
287
|
+
export type ProjectResidency =
|
|
288
|
+
| 'GLOBAL'
|
|
289
|
+
| 'US_STORAGE_PROCESSING'
|
|
290
|
+
| 'EU_STORAGE_PROCESSING'
|
|
291
|
+
| 'JP_STORAGE'
|
|
292
|
+
| 'KR_STORAGE'
|
|
293
|
+
| 'CA_STORAGE'
|
|
294
|
+
| 'SG_STORAGE'
|
|
295
|
+
| 'IN_STORAGE'
|
|
296
|
+
| 'AU_STORAGE'
|
|
297
|
+
| 'GB_STORAGE'
|
|
298
|
+
| 'AE_STORAGE'
|
|
299
|
+
| 'AE_STORAGE_PROCESSING';
|
|
300
|
+
|
|
282
301
|
export interface ProjectCreateParams {
|
|
283
302
|
/**
|
|
284
303
|
* The friendly name of the project, this name appears in reports.
|
|
@@ -291,12 +310,23 @@ export interface ProjectCreateParams {
|
|
|
291
310
|
external_key_id?: string | null;
|
|
292
311
|
|
|
293
312
|
/**
|
|
294
|
-
* Create the project with the specified data residency region. Your
|
|
295
|
-
* must have access to Data residency functionality in order to use.
|
|
313
|
+
* @deprecated Create the project with the specified data residency region. Your
|
|
314
|
+
* organization must have access to Data residency functionality in order to use.
|
|
315
|
+
* See
|
|
296
316
|
* [data residency controls](https://platform.openai.com/docs/guides/your-data#data-residency-controls)
|
|
297
|
-
* to review the functionality and limitations of setting this field.
|
|
317
|
+
* to review the functionality and limitations of setting this field. Deprecated:
|
|
318
|
+
* use `residency` instead. Do not provide both `geography` and `residency`.
|
|
298
319
|
*/
|
|
299
320
|
geography?: string | null;
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Create the project with the specified residency configuration. Your organization
|
|
324
|
+
* must have access to the requested residency configuration in order to use it.
|
|
325
|
+
* See
|
|
326
|
+
* [data residency controls](https://platform.openai.com/docs/guides/your-data#data-residency-controls)
|
|
327
|
+
* to review the functionality and limitations of setting this field.
|
|
328
|
+
*/
|
|
329
|
+
residency?: ProjectResidency | null;
|
|
300
330
|
}
|
|
301
331
|
|
|
302
332
|
export interface ProjectUpdateParams {
|
|
@@ -306,7 +336,9 @@ export interface ProjectUpdateParams {
|
|
|
306
336
|
external_key_id?: string | null;
|
|
307
337
|
|
|
308
338
|
/**
|
|
309
|
-
* Geography for the project.
|
|
339
|
+
* @deprecated Geography for the project. Deprecated: use `residency` when creating
|
|
340
|
+
* a project to configure data residency. This field is retained for backward
|
|
341
|
+
* compatibility.
|
|
310
342
|
*/
|
|
311
343
|
geography?: string | null;
|
|
312
344
|
|
|
@@ -340,6 +372,7 @@ Projects.Certificates = Certificates;
|
|
|
340
372
|
export declare namespace Projects {
|
|
341
373
|
export {
|
|
342
374
|
type Project as Project,
|
|
375
|
+
type ProjectResidency as ProjectResidency,
|
|
343
376
|
type ProjectsPage as ProjectsPage,
|
|
344
377
|
type ProjectCreateParams as ProjectCreateParams,
|
|
345
378
|
type ProjectUpdateParams as ProjectUpdateParams,
|