openai 7.5.0 → 7.6.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 +105 -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 +58 -19
- package/core/streaming.js.map +1 -1
- package/core/streaming.mjs +58 -19
- 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 +9 -12
- package/resources/beta/responses/responses.d.mts.map +1 -1
- package/resources/beta/responses/responses.d.ts +9 -12
- 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 +9 -12
- package/resources/responses/responses.d.mts.map +1 -1
- package/resources/responses/responses.d.ts +9 -12
- 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 +71 -20
- 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 +9 -12
- 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 +9 -12
- 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
|
@@ -7,6 +7,147 @@ import { SubjectTokenProviderError } from '../core/error';
|
|
|
7
7
|
const DEFAULT_RESOURCE = 'https://management.azure.com/';
|
|
8
8
|
const DEFAULT_AZURE_API_VERSION = '2018-02-01';
|
|
9
9
|
const AZURE_IMDS_BASE_URL = 'http://169.254.169.254/metadata/identity/oauth2/token';
|
|
10
|
+
const MAX_AZURE_IMDS_JSON_ERROR_CAUSES = 32;
|
|
11
|
+
const getOwnErrorDescriptor = Object.getOwnPropertyDescriptor;
|
|
12
|
+
const getErrorPrototype = Object.getPrototypeOf;
|
|
13
|
+
const errorObjectToString = Object.prototype.toString;
|
|
14
|
+
const errorFunctionToString = Function.prototype.toString;
|
|
15
|
+
const nativeErrorSource = errorFunctionToString.call(Error);
|
|
16
|
+
const nativeSyntaxErrorSource = errorFunctionToString.call(SyntaxError);
|
|
17
|
+
const nativeErrorBrandDescriptor = getOwnErrorDescriptor(Error, 'isError');
|
|
18
|
+
const nativeErrorBrand =
|
|
19
|
+
nativeErrorBrandDescriptor &&
|
|
20
|
+
'value' in nativeErrorBrandDescriptor &&
|
|
21
|
+
typeof nativeErrorBrandDescriptor.value === 'function'
|
|
22
|
+
? (nativeErrorBrandDescriptor.value as (error: object) => boolean)
|
|
23
|
+
: undefined;
|
|
24
|
+
|
|
25
|
+
type AzureJSONErrorKind = 'error' | 'syntax' | 'tagged-wrapper' | 'unknown' | 'unsafe';
|
|
26
|
+
|
|
27
|
+
function hasNativeErrorPrototype(prototype: object, kind: 'Error' | 'SyntaxError'): boolean {
|
|
28
|
+
const name = getOwnErrorDescriptor(prototype, 'name');
|
|
29
|
+
const constructor = getOwnErrorDescriptor(prototype, 'constructor');
|
|
30
|
+
if (
|
|
31
|
+
!name ||
|
|
32
|
+
!('value' in name) ||
|
|
33
|
+
name.value !== kind ||
|
|
34
|
+
!constructor ||
|
|
35
|
+
!('value' in constructor) ||
|
|
36
|
+
typeof constructor.value !== 'function'
|
|
37
|
+
) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const originalPrototype = getOwnErrorDescriptor(constructor.value, 'prototype');
|
|
42
|
+
const nativeSource = kind === 'Error' ? nativeErrorSource : nativeSyntaxErrorSource;
|
|
43
|
+
return Boolean(
|
|
44
|
+
originalPrototype &&
|
|
45
|
+
'value' in originalPrototype &&
|
|
46
|
+
originalPrototype.value === prototype &&
|
|
47
|
+
errorFunctionToString.call(constructor.value) === nativeSource,
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function classifyCrossRealmAzureError(error: object): AzureJSONErrorKind {
|
|
52
|
+
try {
|
|
53
|
+
const prototypes: object[] = [];
|
|
54
|
+
let tagged = false;
|
|
55
|
+
for (
|
|
56
|
+
let prototype: object | null = error;
|
|
57
|
+
prototype !== null;
|
|
58
|
+
prototype = getErrorPrototype(prototype) as object | null
|
|
59
|
+
) {
|
|
60
|
+
if (prototypes.length >= MAX_AZURE_IMDS_JSON_ERROR_CAUSES) {
|
|
61
|
+
return 'unsafe';
|
|
62
|
+
}
|
|
63
|
+
prototypes.push(prototype);
|
|
64
|
+
if (!nativeErrorBrand && getOwnErrorDescriptor(prototype, Symbol.toStringTag)) {
|
|
65
|
+
tagged = true;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (
|
|
70
|
+
nativeErrorBrand
|
|
71
|
+
? !nativeErrorBrand(error)
|
|
72
|
+
: !tagged && errorObjectToString.call(error) !== '[object Error]'
|
|
73
|
+
) {
|
|
74
|
+
return 'unknown';
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
let genericErrorPrototype = false;
|
|
78
|
+
for (let index = 1; index < prototypes.length; index += 1) {
|
|
79
|
+
const prototype = prototypes[index];
|
|
80
|
+
if (!prototype) {
|
|
81
|
+
return 'unsafe';
|
|
82
|
+
}
|
|
83
|
+
if (hasNativeErrorPrototype(prototype, 'SyntaxError')) {
|
|
84
|
+
return tagged ? 'unsafe' : 'syntax';
|
|
85
|
+
}
|
|
86
|
+
if (tagged && hasNativeErrorPrototype(prototype, 'Error')) {
|
|
87
|
+
genericErrorPrototype = true;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (!tagged) {
|
|
92
|
+
return 'error';
|
|
93
|
+
}
|
|
94
|
+
return genericErrorPrototype ? 'tagged-wrapper' : 'unknown';
|
|
95
|
+
} catch {
|
|
96
|
+
return 'unsafe';
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function inspectAzureJSONErrorCause(error: unknown): boolean {
|
|
101
|
+
const visited = new Set<object>();
|
|
102
|
+
let current = error;
|
|
103
|
+
|
|
104
|
+
for (let depth = 0; depth < MAX_AZURE_IMDS_JSON_ERROR_CAUSES; depth += 1) {
|
|
105
|
+
if (current instanceof SyntaxError) {
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
if (typeof current !== 'object' || current === null) {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
const kind = current instanceof Error ? 'error' : classifyCrossRealmAzureError(current);
|
|
112
|
+
if (kind === 'syntax' || kind === 'unsafe') {
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
if (kind !== 'error' && kind !== 'tagged-wrapper') {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
if (kind === 'error') {
|
|
119
|
+
const parserType = getOwnErrorDescriptor(current, 'type');
|
|
120
|
+
if (parserType && 'value' in parserType && parserType.value === 'invalid-json') {
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (visited.has(current)) {
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
visited.add(current);
|
|
128
|
+
|
|
129
|
+
let cause: PropertyDescriptor | undefined;
|
|
130
|
+
try {
|
|
131
|
+
cause = getOwnErrorDescriptor(current, 'cause');
|
|
132
|
+
} catch {
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
if (!cause || !('value' in cause)) {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
current = cause.value;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function isMalformedAzureJSONError(error: unknown): boolean {
|
|
145
|
+
try {
|
|
146
|
+
return inspectAzureJSONErrorCause(error);
|
|
147
|
+
} catch {
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
10
151
|
|
|
11
152
|
/** Reads the UTF-8 contents of a Kubernetes service-account token file. */
|
|
12
153
|
type ReadFile = (path: string) => Promise<string>;
|
|
@@ -147,13 +288,43 @@ export function azureManagedIdentityTokenProvider(
|
|
|
147
288
|
});
|
|
148
289
|
|
|
149
290
|
if (!response.ok) {
|
|
291
|
+
let abortListener: (() => void) | undefined;
|
|
292
|
+
|
|
293
|
+
try {
|
|
294
|
+
// oxlint-disable-next-line promise/avoid-new -- AbortSignal is callback-only across supported runtimes.
|
|
295
|
+
const requestAborted = new Promise<void>((resolve) => {
|
|
296
|
+
abortListener = () => resolve();
|
|
297
|
+
if (controller.signal.aborted) {
|
|
298
|
+
abortListener();
|
|
299
|
+
} else {
|
|
300
|
+
controller.signal.addEventListener('abort', abortListener, { once: true });
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
await Promise.race([Shims.CancelReadableStream(response.body), requestAborted]);
|
|
305
|
+
} catch {
|
|
306
|
+
controller.abort();
|
|
307
|
+
} finally {
|
|
308
|
+
if (abortListener) {
|
|
309
|
+
controller.signal.removeEventListener('abort', abortListener);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
150
313
|
throw new SubjectTokenProviderError(
|
|
151
314
|
`Failed to fetch token from Azure IMDS: status ${response.status}`,
|
|
152
315
|
'azure-imds',
|
|
153
316
|
);
|
|
154
317
|
}
|
|
155
318
|
|
|
156
|
-
|
|
319
|
+
let data: { access_token?: string };
|
|
320
|
+
try {
|
|
321
|
+
data = (await response.json()) as { access_token?: string };
|
|
322
|
+
} catch (error) {
|
|
323
|
+
if (isMalformedAzureJSONError(error)) {
|
|
324
|
+
throw new SyntaxError('IMDS response contains invalid JSON');
|
|
325
|
+
}
|
|
326
|
+
throw error;
|
|
327
|
+
}
|
|
157
328
|
|
|
158
329
|
if (!data.access_token) {
|
|
159
330
|
throw new SubjectTokenProviderError("IMDS response missing 'access_token' field", 'azure-imds');
|
|
@@ -199,7 +370,7 @@ export function gcpIDTokenProvider(
|
|
|
199
370
|
fetch?: Fetch;
|
|
200
371
|
},
|
|
201
372
|
): SubjectTokenProvider {
|
|
202
|
-
const timeout = config?.timeout
|
|
373
|
+
const timeout = config?.timeout ?? 10_000;
|
|
203
374
|
|
|
204
375
|
return {
|
|
205
376
|
tokenType: 'id',
|
|
@@ -221,8 +392,29 @@ export function gcpIDTokenProvider(
|
|
|
221
392
|
});
|
|
222
393
|
|
|
223
394
|
if (!response.ok) {
|
|
224
|
-
|
|
225
|
-
|
|
395
|
+
let abortListener: (() => void) | undefined;
|
|
396
|
+
|
|
397
|
+
try {
|
|
398
|
+
// oxlint-disable-next-line promise/avoid-new -- AbortSignal is callback-only across supported runtimes.
|
|
399
|
+
const requestAborted = new Promise<void>((resolve) => {
|
|
400
|
+
abortListener = () => resolve();
|
|
401
|
+
if (controller.signal.aborted) {
|
|
402
|
+
abortListener();
|
|
403
|
+
} else {
|
|
404
|
+
controller.signal.addEventListener('abort', abortListener, { once: true });
|
|
405
|
+
}
|
|
406
|
+
});
|
|
407
|
+
|
|
408
|
+
await Promise.race([Shims.CancelReadableStream(response.body), requestAborted]);
|
|
409
|
+
} catch {
|
|
410
|
+
controller.abort();
|
|
411
|
+
} finally {
|
|
412
|
+
if (abortListener) {
|
|
413
|
+
controller.signal.removeEventListener('abort', abortListener);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
throw new Error(`GCP Metadata Server returned ${response.status}`);
|
|
226
418
|
}
|
|
227
419
|
|
|
228
420
|
const tokenText = await response.text();
|
package/src/auth/types.ts
CHANGED
|
@@ -25,6 +25,30 @@ export interface WorkloadIdentity {
|
|
|
25
25
|
refreshBufferSeconds?: number;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
+
/** Configures OpenAI-only federation from an explicitly attested X.509 client certificate. */
|
|
29
|
+
export interface X509WorkloadIdentity {
|
|
30
|
+
/** Selects certificate-authenticated OAuth federation without an external subject token. */
|
|
31
|
+
type: 'x509';
|
|
32
|
+
|
|
33
|
+
/** Identity-provider resource enrolled for the caller-owned client certificate. */
|
|
34
|
+
identityProviderId: string;
|
|
35
|
+
|
|
36
|
+
/** OpenAI service account authorized for the verified certificate identity. */
|
|
37
|
+
serviceAccountId: string;
|
|
38
|
+
|
|
39
|
+
/** Optional milliseconds before expiry when the certificate-backed token should refresh. */
|
|
40
|
+
refreshBufferMs?: number;
|
|
41
|
+
|
|
42
|
+
/** X.509 federation proves certificate possession instead of supplying a subject token. */
|
|
43
|
+
provider?: never;
|
|
44
|
+
|
|
45
|
+
/** X.509 federation does not send an OAuth client identifier. */
|
|
46
|
+
clientId?: never;
|
|
47
|
+
|
|
48
|
+
/** X.509 federation does not accept subject-token refresh configuration. */
|
|
49
|
+
refreshBufferSeconds?: never;
|
|
50
|
+
}
|
|
51
|
+
|
|
28
52
|
/** OAuth token-exchange response returned by the OpenAI workload-identity endpoint. */
|
|
29
53
|
export interface TokenExchangeResponse {
|
|
30
54
|
/** OpenAI access token to use as the request's bearer credential. */
|
|
@@ -14,6 +14,102 @@ const SUBJECT_TOKEN_TYPES: Record<WorkloadIdentity['provider']['tokenType'], str
|
|
|
14
14
|
};
|
|
15
15
|
|
|
16
16
|
const TOKEN_EXCHANGE_GRANT_TYPE = 'urn:ietf:params:oauth:grant-type:token-exchange';
|
|
17
|
+
const NATIVE_RESPONSE_PROTOTYPE = Response.prototype;
|
|
18
|
+
const READ_NATIVE_RESPONSE_BODY = NATIVE_RESPONSE_PROTOTYPE.arrayBuffer;
|
|
19
|
+
|
|
20
|
+
function isResponsePrototype(response: Response, prototype: object): boolean {
|
|
21
|
+
const constructor = Object.getOwnPropertyDescriptor(prototype, 'constructor')?.value;
|
|
22
|
+
if (
|
|
23
|
+
prototype === response ||
|
|
24
|
+
typeof constructor !== 'function' ||
|
|
25
|
+
Object.getOwnPropertyDescriptor(constructor, 'name')?.value !== 'Response' ||
|
|
26
|
+
Object.getOwnPropertyDescriptor(constructor, 'prototype')?.value !== prototype
|
|
27
|
+
) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const tag = Object.getOwnPropertyDescriptor(prototype, Symbol.toStringTag);
|
|
32
|
+
return (
|
|
33
|
+
(tag?.value === 'Response' || typeof tag?.get === 'function') &&
|
|
34
|
+
typeof Object.getOwnPropertyDescriptor(prototype, 'headers')?.get === 'function' &&
|
|
35
|
+
typeof Object.getOwnPropertyDescriptor(prototype, 'ok')?.get === 'function' &&
|
|
36
|
+
typeof Object.getOwnPropertyDescriptor(prototype, 'status')?.get === 'function'
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function isResponseBodyPrototype(prototype: object, responsePrototype: object | null): boolean {
|
|
41
|
+
if (prototype === responsePrototype) {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const constructor = Object.getOwnPropertyDescriptor(prototype, 'constructor')?.value;
|
|
46
|
+
return (
|
|
47
|
+
responsePrototype !== null &&
|
|
48
|
+
Object.getPrototypeOf(responsePrototype) === prototype &&
|
|
49
|
+
typeof constructor === 'function' &&
|
|
50
|
+
Object.getOwnPropertyDescriptor(constructor, 'name')?.value === 'Body' &&
|
|
51
|
+
Object.getOwnPropertyDescriptor(constructor, 'prototype')?.value === prototype
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function decodeNativeResponseBody(body: ArrayBuffer): string {
|
|
56
|
+
const scope = globalThis as typeof globalThis & { Bun?: { version?: unknown } };
|
|
57
|
+
return new TextDecoder('utf-8', { ignoreBOM: typeof scope.Bun?.version === 'string' }).decode(body);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
async function parseOAuthTokenResponse(response: Response): Promise<unknown> {
|
|
61
|
+
let readText: ((this: Response) => Promise<string>) | undefined;
|
|
62
|
+
let responsePrototype: object | null = null;
|
|
63
|
+
for (
|
|
64
|
+
let depth = 0, prototype: object | null = response;
|
|
65
|
+
prototype !== null && depth < 16;
|
|
66
|
+
prototype = Object.getPrototypeOf(prototype), depth += 1
|
|
67
|
+
) {
|
|
68
|
+
if (prototype === NATIVE_RESPONSE_PROTOTYPE) {
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (isResponsePrototype(response, prototype)) {
|
|
73
|
+
responsePrototype = prototype;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const parser = Object.getOwnPropertyDescriptor(prototype, 'json');
|
|
77
|
+
if (!parser) {
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (typeof parser.value !== 'function') {
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const bodyReader = Object.getOwnPropertyDescriptor(prototype, 'text')?.value;
|
|
86
|
+
if (typeof bodyReader === 'function' && isResponseBodyPrototype(prototype, responsePrototype)) {
|
|
87
|
+
readText = bodyReader;
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Custom parsers own their results and failures; rejection provenance cannot be inferred.
|
|
92
|
+
return parser.value.call(response);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const body =
|
|
96
|
+
readText === undefined
|
|
97
|
+
? decodeNativeResponseBody(await READ_NATIVE_RESPONSE_BODY.call(response))
|
|
98
|
+
: await readText.call(response);
|
|
99
|
+
try {
|
|
100
|
+
return JSON.parse(body);
|
|
101
|
+
} catch {
|
|
102
|
+
throw new SyntaxError('Token exchange response contains invalid JSON');
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function isUnsafeAccessToken(accessToken: string): boolean {
|
|
107
|
+
const scope = globalThis as typeof globalThis & { Bun?: { version?: unknown } };
|
|
108
|
+
if (typeof scope.Bun?.version === 'string') {
|
|
109
|
+
return /[^\t\u0020-\u007E]|^[\t ]|[\t ]$/u.test(accessToken);
|
|
110
|
+
}
|
|
111
|
+
return /[^\t\u0020-\u007E\u0080-\u00FF]|^[\t ]|[\t ]$/u.test(accessToken);
|
|
112
|
+
}
|
|
17
113
|
|
|
18
114
|
/**
|
|
19
115
|
* Exchanges external workload-identity tokens for cached OpenAI access tokens.
|
|
@@ -126,18 +222,19 @@ export class WorkloadIdentityAuth {
|
|
|
126
222
|
);
|
|
127
223
|
}
|
|
128
224
|
|
|
129
|
-
const tokenResponse: unknown = await response
|
|
225
|
+
const tokenResponse: unknown = await parseOAuthTokenResponse(response);
|
|
226
|
+
const accessToken =
|
|
227
|
+
typeof tokenResponse === 'object' && tokenResponse !== null && 'access_token' in tokenResponse
|
|
228
|
+
? tokenResponse.access_token
|
|
229
|
+
: undefined;
|
|
130
230
|
if (
|
|
131
|
-
typeof
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
typeof tokenResponse.access_token !== 'string' ||
|
|
135
|
-
tokenResponse.access_token.trim().length === 0
|
|
231
|
+
typeof accessToken !== 'string' ||
|
|
232
|
+
accessToken.trim().length === 0 ||
|
|
233
|
+
isUnsafeAccessToken(accessToken)
|
|
136
234
|
) {
|
|
137
235
|
throw new OpenAIError("Token exchange response missing 'access_token' field");
|
|
138
236
|
}
|
|
139
237
|
|
|
140
|
-
const accessToken = tokenResponse.access_token;
|
|
141
238
|
const expiresIn = (tokenResponse as Partial<TokenExchangeResponse>).expires_in ?? 3600;
|
|
142
239
|
if (typeof expiresIn !== 'number' || !Number.isFinite(expiresIn) || expiresIn <= 0) {
|
|
143
240
|
throw new OpenAIError("Token exchange response has invalid 'expires_in' field");
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
|
+
import { setTimeout as delay } from 'node:timers/promises';
|
|
3
|
+
import {
|
|
4
|
+
createX509Transport as createCapability,
|
|
5
|
+
registerX509Transport,
|
|
6
|
+
sendX509Request,
|
|
7
|
+
} from '../internal/auth/x509-transport-capability';
|
|
8
|
+
import type { X509Transport, X509TransportOptions } from '../internal/auth/x509-transport-capability';
|
|
9
|
+
import { exchangeX509Token } from '../internal/auth/x509-token-exchange';
|
|
10
|
+
import { isRetryableX509TransportFailure } from '../internal/auth/x509-transport-registry';
|
|
11
|
+
import type { X509RequestScope } from '../internal/auth/x509-transport-registry';
|
|
12
|
+
import { markTransientX509ConnectionError } from '#x509-transport-state';
|
|
13
|
+
|
|
14
|
+
/** Creates one frozen, caller-attested Node.js transport for X.509 workload authentication. */
|
|
15
|
+
export function createX509Transport(options: X509TransportOptions): X509Transport {
|
|
16
|
+
const capability = createCapability(options);
|
|
17
|
+
const scopes = new AsyncLocalStorage<X509RequestScope>();
|
|
18
|
+
registerX509Transport(capability, {
|
|
19
|
+
dispatch: async (target, requestOptions) => {
|
|
20
|
+
try {
|
|
21
|
+
return await sendX509Request(capability, target, requestOptions);
|
|
22
|
+
} catch (error) {
|
|
23
|
+
if (error instanceof Error && isRetryableX509TransportFailure(error)) {
|
|
24
|
+
markTransientX509ConnectionError(error);
|
|
25
|
+
}
|
|
26
|
+
throw error;
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
exchange: async (identityProviderId, serviceAccountId, signal) =>
|
|
30
|
+
await exchangeX509Token({
|
|
31
|
+
transport: capability,
|
|
32
|
+
identityProviderId,
|
|
33
|
+
serviceAccountId,
|
|
34
|
+
...(signal ? { signal } : {}),
|
|
35
|
+
}),
|
|
36
|
+
run: (operation) =>
|
|
37
|
+
scopes.run({ wallStartedAt: Date.now(), monotonicStartedAt: performance.now() }, operation),
|
|
38
|
+
current: () => scopes.getStore(),
|
|
39
|
+
resume: (scope, operation) => scopes.run(scope, operation),
|
|
40
|
+
sleep: async (duration, signal) => await delay(duration, undefined, { signal: signal ?? undefined }),
|
|
41
|
+
});
|
|
42
|
+
return capability;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export type {
|
|
46
|
+
X509ProxyMode,
|
|
47
|
+
X509Transport,
|
|
48
|
+
X509TransportOptions,
|
|
49
|
+
} from '../internal/auth/x509-transport-capability';
|
package/src/azure.ts
CHANGED
|
@@ -7,12 +7,26 @@ import { isObj, readEnv } from './internal/utils';
|
|
|
7
7
|
import { path } from './internal/utils/path';
|
|
8
8
|
import { OpenAI } from './client';
|
|
9
9
|
import type { ClientOptions } from './client';
|
|
10
|
+
import type { WorkloadIdentity } from './auth/types';
|
|
11
|
+
import { assertNoDataResidency } from './internal/data-residency';
|
|
10
12
|
|
|
11
13
|
/** API Client for interfacing with the Azure OpenAI API. */
|
|
12
|
-
export interface AzureClientOptions extends Omit<
|
|
14
|
+
export interface AzureClientOptions extends Omit<
|
|
15
|
+
ClientOptions,
|
|
16
|
+
'provider' | 'dataResidency' | 'workloadIdentity' | 'x509Transport'
|
|
17
|
+
> {
|
|
13
18
|
/** AzureOpenAI does not support third-party provider configuration. */
|
|
14
19
|
provider?: never;
|
|
15
20
|
|
|
21
|
+
/** OpenAI data residency cannot be combined with Azure routing. */
|
|
22
|
+
dataResidency?: never;
|
|
23
|
+
|
|
24
|
+
/** Azure cannot receive OpenAI X.509 workload-identity certificate transports. */
|
|
25
|
+
x509Transport?: never;
|
|
26
|
+
|
|
27
|
+
/** Existing subject-token workload-identity configuration remains unchanged. */
|
|
28
|
+
workloadIdentity?: WorkloadIdentity | undefined;
|
|
29
|
+
|
|
16
30
|
/**
|
|
17
31
|
* Defaults to process.env['OPENAI_API_VERSION'].
|
|
18
32
|
*/
|
|
@@ -74,8 +88,10 @@ export class AzureOpenAI extends OpenAI {
|
|
|
74
88
|
deployment,
|
|
75
89
|
azureADTokenProvider,
|
|
76
90
|
dangerouslyAllowBrowser,
|
|
91
|
+
dataResidency,
|
|
77
92
|
...opts
|
|
78
93
|
}: AzureClientOptions = {}) {
|
|
94
|
+
assertNoDataResidency(dataResidency, 'AzureOpenAI');
|
|
79
95
|
if (!apiVersion) {
|
|
80
96
|
throw new Errors.OpenAIError(
|
|
81
97
|
"The OPENAI_API_VERSION environment variable is missing or empty; either provide it, or instantiate the AzureOpenAI client with an apiVersion option, like new AzureOpenAI({ apiVersion: 'My API Version' }).",
|
|
@@ -131,6 +147,11 @@ export class AzureOpenAI extends OpenAI {
|
|
|
131
147
|
this.deploymentName = deployment;
|
|
132
148
|
}
|
|
133
149
|
|
|
150
|
+
/** Clones this client with Azure options; OpenAI data residency remains unsupported. */
|
|
151
|
+
override withOptions(options: Partial<AzureClientOptions>): this {
|
|
152
|
+
return super.withOptions(options);
|
|
153
|
+
}
|
|
154
|
+
|
|
134
155
|
/** Builds an Azure request and inserts its deployment into model-scoped endpoint paths. */
|
|
135
156
|
override async buildRequest(
|
|
136
157
|
options: FinalRequestOptions,
|
package/src/bedrock.ts
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import * as Errors from './error';
|
|
2
2
|
import { OpenAI } from './client';
|
|
3
3
|
import type { ApiKeySetter, ClientOptions } from './client';
|
|
4
|
-
import {
|
|
4
|
+
import { assertNoDataResidency } from './internal/data-residency';
|
|
5
|
+
import {
|
|
6
|
+
assertBedrockRequestOrigin,
|
|
7
|
+
assertValidBedrockBearerCredential,
|
|
8
|
+
brand_privateBedrockClient,
|
|
9
|
+
} from './internal/bedrock';
|
|
5
10
|
import type { RequestInit } from './internal/builtin-types';
|
|
6
11
|
import type { NullableHeaders } from './internal/headers';
|
|
7
12
|
import { buildHeaders } from './internal/headers';
|
|
@@ -15,7 +20,7 @@ import type * as ResponsesAPI from './resources/responses/responses';
|
|
|
15
20
|
/** Configures Amazon Bedrock's OpenAI-compatible endpoint and bearer-token authentication. */
|
|
16
21
|
export interface BedrockClientOptions extends Omit<
|
|
17
22
|
ClientOptions,
|
|
18
|
-
'apiKey' | 'adminAPIKey' | 'baseURL' | 'workloadIdentity'
|
|
23
|
+
'apiKey' | 'adminAPIKey' | 'baseURL' | 'workloadIdentity' | 'x509Transport' | 'dataResidency'
|
|
19
24
|
> {
|
|
20
25
|
/**
|
|
21
26
|
* Bedrock bearer token used for authentication.
|
|
@@ -38,11 +43,17 @@ export interface BedrockClientOptions extends Omit<
|
|
|
38
43
|
*/
|
|
39
44
|
adminAPIKey?: never;
|
|
40
45
|
|
|
46
|
+
/** OpenAI data residency cannot be combined with Bedrock routing. */
|
|
47
|
+
dataResidency?: never;
|
|
48
|
+
|
|
41
49
|
/**
|
|
42
50
|
* BedrockOpenAI only supports Bedrock bearer token authentication.
|
|
43
51
|
*/
|
|
44
52
|
workloadIdentity?: never;
|
|
45
53
|
|
|
54
|
+
/** Bedrock cannot receive OpenAI X.509 workload-identity certificate transports. */
|
|
55
|
+
x509Transport?: never;
|
|
56
|
+
|
|
46
57
|
/**
|
|
47
58
|
* AWS region used to derive the default Bedrock Mantle endpoint.
|
|
48
59
|
*
|
|
@@ -64,6 +75,11 @@ function deriveBedrockBaseURL(awsRegion: string | undefined): string {
|
|
|
64
75
|
'Must provide one of the `baseURL` or `awsRegion` arguments, or set the `AWS_BEDROCK_BASE_URL`, `AWS_REGION`, or `AWS_DEFAULT_REGION` environment variable.',
|
|
65
76
|
);
|
|
66
77
|
}
|
|
78
|
+
if (!/^[a-z]{2,8}(?:-[a-z0-9]+)+-\d+$/u.test(region)) {
|
|
79
|
+
throw new Errors.OpenAIError(
|
|
80
|
+
'The Bedrock AWS `region` is invalid. Use a standard AWS region such as `us-east-1`.',
|
|
81
|
+
);
|
|
82
|
+
}
|
|
67
83
|
|
|
68
84
|
return `https://bedrock-mantle.${region}.api.aws/openai/v1`;
|
|
69
85
|
}
|
|
@@ -129,9 +145,12 @@ export class BedrockOpenAI extends OpenAI {
|
|
|
129
145
|
bedrockTokenProvider,
|
|
130
146
|
adminAPIKey,
|
|
131
147
|
workloadIdentity,
|
|
148
|
+
x509Transport,
|
|
149
|
+
dataResidency,
|
|
132
150
|
...opts
|
|
133
151
|
}: BedrockClientOptions = {}) {
|
|
134
|
-
|
|
152
|
+
assertNoDataResidency(dataResidency, 'BedrockOpenAI');
|
|
153
|
+
if (adminAPIKey || workloadIdentity || x509Transport) {
|
|
135
154
|
throw new Errors.OpenAIError('BedrockOpenAI only supports Bedrock bearer token authentication.');
|
|
136
155
|
}
|
|
137
156
|
|
|
@@ -166,6 +185,21 @@ export class BedrockOpenAI extends OpenAI {
|
|
|
166
185
|
...opts,
|
|
167
186
|
});
|
|
168
187
|
|
|
188
|
+
let currentApiKey = this.apiKey;
|
|
189
|
+
Object.defineProperty(this, 'apiKey', {
|
|
190
|
+
enumerable: true,
|
|
191
|
+
configurable: true,
|
|
192
|
+
get() {
|
|
193
|
+
if (currentApiKey !== null) {
|
|
194
|
+
assertValidBedrockBearerCredential(currentApiKey);
|
|
195
|
+
}
|
|
196
|
+
return currentApiKey;
|
|
197
|
+
},
|
|
198
|
+
set(nextApiKey: string | null) {
|
|
199
|
+
currentApiKey = nextApiKey;
|
|
200
|
+
},
|
|
201
|
+
});
|
|
202
|
+
|
|
169
203
|
const trustedBaseURL = this.baseURL;
|
|
170
204
|
let currentBaseURL = trustedBaseURL;
|
|
171
205
|
Object.defineProperty(this, 'baseURL', {
|
|
@@ -211,8 +245,18 @@ export class BedrockOpenAI extends OpenAI {
|
|
|
211
245
|
schemes?: { bearerAuth?: boolean; adminAPIKeyAuth?: boolean },
|
|
212
246
|
): Promise<NullableHeaders | undefined> {
|
|
213
247
|
const security = schemes ?? { bearerAuth: true, adminAPIKeyAuth: true };
|
|
214
|
-
|
|
215
|
-
|
|
248
|
+
const credential = this.apiKey;
|
|
249
|
+
if ((security.bearerAuth || security.adminAPIKeyAuth) && credential !== null) {
|
|
250
|
+
assertValidBedrockBearerCredential(credential);
|
|
251
|
+
try {
|
|
252
|
+
return buildHeaders([{ Authorization: `Bearer ${credential}` }]);
|
|
253
|
+
} catch (error) {
|
|
254
|
+
if (error instanceof TypeError) {
|
|
255
|
+
// oxlint-disable-next-line eslint/preserve-caught-error -- The original error contains the bearer credential.
|
|
256
|
+
throw new TypeError('Bedrock bearer credential contains an invalid HTTP header value.');
|
|
257
|
+
}
|
|
258
|
+
throw error;
|
|
259
|
+
}
|
|
216
260
|
}
|
|
217
261
|
|
|
218
262
|
return super.authHeaders(opts, security);
|
|
@@ -7,6 +7,20 @@ import { EventEmitter } from '../../lib/EventEmitter';
|
|
|
7
7
|
import { OpenAIError } from '../../error';
|
|
8
8
|
import type OpenAI from '../../index';
|
|
9
9
|
import { AzureOpenAI } from '../../index';
|
|
10
|
+
import { assertX509WebSocketSupported } from '../../internal/auth/x509-workload-identity-auth';
|
|
11
|
+
|
|
12
|
+
/** Parses frame data without exposing malformed payloads through JSON syntax errors. */
|
|
13
|
+
export function parseRealtimeEvent(data: string): RealtimeServerEvent {
|
|
14
|
+
try {
|
|
15
|
+
return JSON.parse(data) as RealtimeServerEvent;
|
|
16
|
+
} catch (error) {
|
|
17
|
+
if (error instanceof SyntaxError) {
|
|
18
|
+
throw new SyntaxError('Could not parse Realtime WebSocket event data as JSON.');
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
throw error;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
10
24
|
|
|
11
25
|
function safeErrorValue(value: unknown): string {
|
|
12
26
|
try {
|
|
@@ -164,6 +178,7 @@ export function buildRealtimeURL(
|
|
|
164
178
|
client: Pick<OpenAI, 'apiKey' | 'baseURL'>,
|
|
165
179
|
connection: string | RealtimeConnectionConfig,
|
|
166
180
|
): URL {
|
|
181
|
+
assertX509WebSocketSupported(client);
|
|
167
182
|
const config: RealtimeConnectionConfig =
|
|
168
183
|
typeof connection === 'string' ? { model: connection } : connection;
|
|
169
184
|
const baseURL = client.baseURL;
|