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
package/src/core/EventEmitter.ts
CHANGED
|
@@ -4,6 +4,8 @@ type EventListener<Events, EventType extends keyof Events> = Events[EventType];
|
|
|
4
4
|
type EventListeners<Events, EventType extends keyof Events> = {
|
|
5
5
|
listener: EventListener<Events, EventType>;
|
|
6
6
|
once?: boolean;
|
|
7
|
+
removed?: boolean;
|
|
8
|
+
detached?: boolean;
|
|
7
9
|
}[];
|
|
8
10
|
|
|
9
11
|
/** Extracts the ordered listener-argument tuple for one named event. */
|
|
@@ -17,6 +19,12 @@ export class EventEmitter<EventTypes extends Record<string, (...args: any) => an
|
|
|
17
19
|
#listeners: {
|
|
18
20
|
[Event in keyof EventTypes]?: EventListeners<EventTypes, Event>;
|
|
19
21
|
} = Object.create(null);
|
|
22
|
+
#emittedListenerRegistrations = new WeakMap<
|
|
23
|
+
object,
|
|
24
|
+
{ event: PropertyKey; registration: { removed?: boolean; detached?: boolean } }
|
|
25
|
+
>();
|
|
26
|
+
#pendingListenerCleanup = new Set<PropertyKey>();
|
|
27
|
+
#listenerDispatchDepth = 0;
|
|
20
28
|
|
|
21
29
|
/**
|
|
22
30
|
* Adds the listener function to the end of the listeners array for the event.
|
|
@@ -43,7 +51,22 @@ export class EventEmitter<EventTypes extends Record<string, (...args: any) => an
|
|
|
43
51
|
if (!listeners) {
|
|
44
52
|
return this;
|
|
45
53
|
}
|
|
46
|
-
|
|
54
|
+
|
|
55
|
+
const emittedRegistration = this.#emittedListenerRegistrations.get(listener as object);
|
|
56
|
+
if (
|
|
57
|
+
emittedRegistration?.event === event &&
|
|
58
|
+
!emittedRegistration.registration.removed &&
|
|
59
|
+
!emittedRegistration.registration.detached
|
|
60
|
+
) {
|
|
61
|
+
this.#removeEmittedListener(
|
|
62
|
+
event,
|
|
63
|
+
emittedRegistration.registration as EventListeners<EventTypes, Event>[number],
|
|
64
|
+
);
|
|
65
|
+
return this;
|
|
66
|
+
}
|
|
67
|
+
const index = listeners.findIndex(
|
|
68
|
+
(registration) => !registration.removed && registration.listener === listener,
|
|
69
|
+
);
|
|
47
70
|
if (index !== -1) {
|
|
48
71
|
listeners.splice(index, 1);
|
|
49
72
|
}
|
|
@@ -61,6 +84,52 @@ export class EventEmitter<EventTypes extends Record<string, (...args: any) => an
|
|
|
61
84
|
return this;
|
|
62
85
|
}
|
|
63
86
|
|
|
87
|
+
#onceForEmitted<Event extends keyof EventTypes>(
|
|
88
|
+
event: Event,
|
|
89
|
+
listener: EventListener<EventTypes, Event>,
|
|
90
|
+
): void {
|
|
91
|
+
const previousListeners = this.#listeners[event];
|
|
92
|
+
const previousLength = previousListeners?.length ?? 0;
|
|
93
|
+
this.once(event, listener);
|
|
94
|
+
const listeners = this.#listeners[event];
|
|
95
|
+
const [registration] = listeners?.slice(-1) ?? [];
|
|
96
|
+
if (
|
|
97
|
+
(previousListeners === undefined || listeners === previousListeners) &&
|
|
98
|
+
listeners?.length === previousLength + 1 &&
|
|
99
|
+
registration?.listener === listener &&
|
|
100
|
+
registration.once
|
|
101
|
+
) {
|
|
102
|
+
this.#emittedListenerRegistrations.set(listener as object, { event, registration });
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
#removeEmittedListener<Event extends keyof EventTypes>(
|
|
107
|
+
event: Event,
|
|
108
|
+
registration: EventListeners<EventTypes, Event>[number],
|
|
109
|
+
): void {
|
|
110
|
+
if (registration.removed) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
registration.removed = true;
|
|
115
|
+
this.#emittedListenerRegistrations.delete(registration.listener as object);
|
|
116
|
+
this.#pendingListenerCleanup.add(event);
|
|
117
|
+
if (this.#listenerDispatchDepth === 0) {
|
|
118
|
+
this.#cleanupEmittedListeners();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
#cleanupEmittedListeners(): void {
|
|
123
|
+
for (const event of this.#pendingListenerCleanup) {
|
|
124
|
+
const eventType = event as keyof EventTypes;
|
|
125
|
+
const listeners = this.#listeners[eventType];
|
|
126
|
+
if (listeners) {
|
|
127
|
+
this.#listeners[eventType] = listeners.filter((listener) => !listener.removed) as any;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
this.#pendingListenerCleanup.clear();
|
|
131
|
+
}
|
|
132
|
+
|
|
64
133
|
/**
|
|
65
134
|
* This is similar to `.once()`, but returns a Promise that resolves the next time
|
|
66
135
|
* the event is triggered, instead of calling a listener callback.
|
|
@@ -98,9 +167,9 @@ export class EventEmitter<EventTypes extends Record<string, (...args: any) => an
|
|
|
98
167
|
};
|
|
99
168
|
|
|
100
169
|
if (event !== 'error') {
|
|
101
|
-
this
|
|
170
|
+
this.#onceForEmitted('error', listeners.onError as any);
|
|
102
171
|
}
|
|
103
|
-
this
|
|
172
|
+
this.#onceForEmitted(event, listeners.onEvent as any);
|
|
104
173
|
});
|
|
105
174
|
}
|
|
106
175
|
|
|
@@ -111,16 +180,31 @@ export class EventEmitter<EventTypes extends Record<string, (...args: any) => an
|
|
|
111
180
|
) {
|
|
112
181
|
const listeners: EventListeners<EventTypes, Event> | undefined = this.#listeners[event];
|
|
113
182
|
if (listeners) {
|
|
114
|
-
this.#listeners[event] = listeners.filter((
|
|
115
|
-
|
|
116
|
-
|
|
183
|
+
this.#listeners[event] = listeners.filter((listener) => {
|
|
184
|
+
if (listener.once) {
|
|
185
|
+
listener.detached = true;
|
|
186
|
+
}
|
|
187
|
+
return !listener.once && !listener.removed;
|
|
188
|
+
}) as any;
|
|
189
|
+
this.#listenerDispatchDepth += 1;
|
|
190
|
+
try {
|
|
191
|
+
for (const registration of listeners as any) {
|
|
192
|
+
if (!registration.removed) {
|
|
193
|
+
registration.listener(...(args as any));
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
} finally {
|
|
197
|
+
this.#listenerDispatchDepth -= 1;
|
|
198
|
+
if (this.#listenerDispatchDepth === 0) {
|
|
199
|
+
this.#cleanupEmittedListeners();
|
|
200
|
+
}
|
|
117
201
|
}
|
|
118
202
|
}
|
|
119
203
|
}
|
|
120
204
|
|
|
121
205
|
protected _hasListener(event: keyof EventTypes): boolean {
|
|
122
206
|
const listeners = this.#listeners[event];
|
|
123
|
-
return listeners && listeners.
|
|
207
|
+
return listeners && listeners.some((listener) => !listener.removed);
|
|
124
208
|
}
|
|
125
209
|
}
|
|
126
210
|
|
package/src/core/streaming.ts
CHANGED
|
@@ -9,6 +9,45 @@ import type { OpenAI } from '../client';
|
|
|
9
9
|
|
|
10
10
|
type Bytes = string | ArrayBuffer | Uint8Array | null | undefined;
|
|
11
11
|
|
|
12
|
+
type StreamTeeQueue<Item> = {
|
|
13
|
+
readonly length: number;
|
|
14
|
+
enqueue: (value: Promise<IteratorResult<Item>>) => void;
|
|
15
|
+
dequeue: () => Promise<IteratorResult<Item>> | undefined;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
function createStreamTeeQueue<Item>(): StreamTeeQueue<Item> {
|
|
19
|
+
let entries: (Promise<IteratorResult<Item>> | undefined)[] = [];
|
|
20
|
+
let head = 0;
|
|
21
|
+
|
|
22
|
+
return {
|
|
23
|
+
get length() {
|
|
24
|
+
return entries.length - head;
|
|
25
|
+
},
|
|
26
|
+
enqueue(value) {
|
|
27
|
+
entries.push(value);
|
|
28
|
+
},
|
|
29
|
+
dequeue() {
|
|
30
|
+
if (head === entries.length) {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const value = entries[head];
|
|
35
|
+
entries[head] = undefined;
|
|
36
|
+
head += 1;
|
|
37
|
+
|
|
38
|
+
if (head === entries.length) {
|
|
39
|
+
entries = [];
|
|
40
|
+
head = 0;
|
|
41
|
+
} else if (head >= 1024 && head * 2 >= entries.length) {
|
|
42
|
+
entries = entries.slice(head);
|
|
43
|
+
head = 0;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return value;
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
12
51
|
/** A decoded server-sent event before its JSON payload has been parsed. */
|
|
13
52
|
export type ServerSentEvent = {
|
|
14
53
|
/** Explicit SSE event name, or `null` when the event has no `event:` field. */
|
|
@@ -64,7 +103,7 @@ export class Stream<Item> implements AsyncIterable<Item> {
|
|
|
64
103
|
let receivedCompletionSentinel = false;
|
|
65
104
|
try {
|
|
66
105
|
for await (const sse of _iterSSEMessages(response, controller)) {
|
|
67
|
-
if (sse.data
|
|
106
|
+
if (sse.data === '[DONE]') {
|
|
68
107
|
receivedCompletionSentinel = true;
|
|
69
108
|
break;
|
|
70
109
|
}
|
|
@@ -74,10 +113,14 @@ export class Stream<Item> implements AsyncIterable<Item> {
|
|
|
74
113
|
|
|
75
114
|
try {
|
|
76
115
|
data = JSON.parse(sse.data) as any;
|
|
77
|
-
} catch
|
|
78
|
-
logger.error(`Could not parse message into JSON
|
|
79
|
-
logger.error(`From chunk
|
|
80
|
-
throw
|
|
116
|
+
} catch {
|
|
117
|
+
logger.error(`Could not parse message into JSON:`);
|
|
118
|
+
logger.error(`From chunk:`);
|
|
119
|
+
throw new SyntaxError('Error reading response: malformed server-sent event JSON.');
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (sse.event === 'error') {
|
|
123
|
+
throw new APIError(undefined, data?.error ?? data, undefined, response.headers);
|
|
81
124
|
}
|
|
82
125
|
|
|
83
126
|
if (data && data.error) {
|
|
@@ -89,14 +132,10 @@ export class Stream<Item> implements AsyncIterable<Item> {
|
|
|
89
132
|
let data;
|
|
90
133
|
try {
|
|
91
134
|
data = JSON.parse(sse.data);
|
|
92
|
-
} catch
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
throw
|
|
96
|
-
}
|
|
97
|
-
// SSE error events surface as APIError instances.
|
|
98
|
-
if (sse.event === 'error') {
|
|
99
|
-
throw new APIError(undefined, data.error, data.message, undefined);
|
|
135
|
+
} catch {
|
|
136
|
+
logger.error(`Could not parse message into JSON:`);
|
|
137
|
+
logger.error(`From chunk:`);
|
|
138
|
+
throw new SyntaxError('Error reading response: malformed server-sent event JSON.');
|
|
100
139
|
}
|
|
101
140
|
yield { event: sse.event, data } as any;
|
|
102
141
|
}
|
|
@@ -199,7 +238,18 @@ export class Stream<Item> implements AsyncIterable<Item> {
|
|
|
199
238
|
continue;
|
|
200
239
|
}
|
|
201
240
|
if (line) {
|
|
202
|
-
|
|
241
|
+
let data: Item;
|
|
242
|
+
try {
|
|
243
|
+
data = JSON.parse(line) as Item;
|
|
244
|
+
} catch (error) {
|
|
245
|
+
if (error instanceof SyntaxError) {
|
|
246
|
+
throw new SyntaxError('Error reading response: malformed newline-delimited JSON.');
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
throw error;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
yield data;
|
|
203
253
|
}
|
|
204
254
|
}
|
|
205
255
|
done = true;
|
|
@@ -230,18 +280,18 @@ export class Stream<Item> implements AsyncIterable<Item> {
|
|
|
230
280
|
* independently read from at different speeds.
|
|
231
281
|
*/
|
|
232
282
|
tee(): [Stream<Item>, Stream<Item>] {
|
|
233
|
-
const left
|
|
234
|
-
const right
|
|
283
|
+
const left = createStreamTeeQueue<Item>();
|
|
284
|
+
const right = createStreamTeeQueue<Item>();
|
|
235
285
|
const iterator = this.iterator();
|
|
236
286
|
|
|
237
|
-
const teeIterator = (queue:
|
|
287
|
+
const teeIterator = (queue: StreamTeeQueue<Item>): AsyncIterator<Item> => ({
|
|
238
288
|
next: () => {
|
|
239
289
|
if (queue.length === 0) {
|
|
240
290
|
const result = iterator.next();
|
|
241
|
-
left.
|
|
242
|
-
right.
|
|
291
|
+
left.enqueue(result);
|
|
292
|
+
right.enqueue(result);
|
|
243
293
|
}
|
|
244
|
-
return queue.
|
|
294
|
+
return queue.dequeue()!;
|
|
245
295
|
},
|
|
246
296
|
});
|
|
247
297
|
|
|
@@ -286,6 +336,7 @@ export class Stream<Item> implements AsyncIterable<Item> {
|
|
|
286
336
|
|
|
287
337
|
/**
|
|
288
338
|
* Decodes complete SSE records from a response and aborts when its body is absent.
|
|
339
|
+
* Complete events are decoded on demand without imposing a line or event size limit.
|
|
289
340
|
*
|
|
290
341
|
* @yields {ServerSentEvent} Each decoded server-sent event in wire order.
|
|
291
342
|
*/
|
package/src/helpers/audio.ts
CHANGED
|
@@ -100,7 +100,7 @@ export async function playAudio(input: NodeJS.ReadableStream | Response | File):
|
|
|
100
100
|
|
|
101
101
|
/** Controls microphone selection and when an in-progress recording is finalized. */
|
|
102
102
|
type RecordAudioOptions = {
|
|
103
|
-
/** Stops recording when aborted
|
|
103
|
+
/** Stops recording when aborted; successful termination returns the captured audio. */
|
|
104
104
|
signal?: AbortSignal;
|
|
105
105
|
|
|
106
106
|
/** Zero-based audio-input device number passed to FFmpeg; defaults to `0`. */
|
|
@@ -110,6 +110,14 @@ type RecordAudioOptions = {
|
|
|
110
110
|
timeout?: number;
|
|
111
111
|
};
|
|
112
112
|
|
|
113
|
+
function removeRecordingAbortListener(signal: AbortSignal | undefined, listener: () => void): void {
|
|
114
|
+
try {
|
|
115
|
+
signal?.removeEventListener('abort', listener);
|
|
116
|
+
} catch {
|
|
117
|
+
// A cleanup callback must not replace the recording's terminal outcome.
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
113
121
|
function nodejsRecordAudio({ signal, device, timeout }: RecordAudioOptions = {}): Promise<File> {
|
|
114
122
|
checkFileSupport();
|
|
115
123
|
return new Promise((resolve, reject) => {
|
|
@@ -119,27 +127,48 @@ function nodejsRecordAudio({ signal, device, timeout }: RecordAudioOptions = {})
|
|
|
119
127
|
let internalSignal: AbortSignal | undefined;
|
|
120
128
|
let wasStopped = false;
|
|
121
129
|
let settled = false;
|
|
130
|
+
let callerAbortObserved = false;
|
|
131
|
+
let timeoutAbortObserved = false;
|
|
132
|
+
let rejectRecording: (error: unknown) => void = reject;
|
|
122
133
|
|
|
123
134
|
const collectData = (chunk: Buffer) => {
|
|
124
|
-
|
|
135
|
+
if (!settled) {
|
|
136
|
+
data.push(chunk);
|
|
137
|
+
}
|
|
125
138
|
};
|
|
126
139
|
const stopRecording = () => {
|
|
127
140
|
if (!settled && ffmpeg) {
|
|
128
|
-
|
|
141
|
+
try {
|
|
142
|
+
wasStopped ||= ffmpeg.kill('SIGTERM');
|
|
143
|
+
} catch (error) {
|
|
144
|
+
rejectRecording(error);
|
|
145
|
+
}
|
|
129
146
|
}
|
|
130
147
|
};
|
|
148
|
+
const stopCallerRecording = () => {
|
|
149
|
+
callerAbortObserved = true;
|
|
150
|
+
stopRecording();
|
|
151
|
+
};
|
|
152
|
+
const stopTimeoutRecording = () => {
|
|
153
|
+
timeoutAbortObserved = true;
|
|
154
|
+
stopRecording();
|
|
155
|
+
};
|
|
131
156
|
const cleanup = () => {
|
|
132
157
|
if (settled) {
|
|
133
158
|
return false;
|
|
134
159
|
}
|
|
135
160
|
|
|
136
161
|
settled = true;
|
|
137
|
-
signal
|
|
138
|
-
internalSignal
|
|
139
|
-
|
|
162
|
+
removeRecordingAbortListener(signal, stopCallerRecording);
|
|
163
|
+
removeRecordingAbortListener(internalSignal, stopTimeoutRecording);
|
|
164
|
+
try {
|
|
165
|
+
ffmpeg?.stdout?.removeListener('data', collectData);
|
|
166
|
+
} catch {
|
|
167
|
+
// Continue settling even when the output stream rejects cleanup.
|
|
168
|
+
}
|
|
140
169
|
return true;
|
|
141
170
|
};
|
|
142
|
-
|
|
171
|
+
rejectRecording = (error: unknown) => {
|
|
143
172
|
if (cleanup()) {
|
|
144
173
|
reject(error);
|
|
145
174
|
}
|
|
@@ -154,6 +183,35 @@ function nodejsRecordAudio({ signal, device, timeout }: RecordAudioOptions = {})
|
|
|
154
183
|
resolve(audioFile);
|
|
155
184
|
};
|
|
156
185
|
|
|
186
|
+
const observeTimeout = () => {
|
|
187
|
+
internalSignal?.addEventListener('abort', stopTimeoutRecording, { once: true });
|
|
188
|
+
if (settled) {
|
|
189
|
+
removeRecordingAbortListener(internalSignal, stopTimeoutRecording);
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
if (internalSignal && !timeoutAbortObserved && internalSignal.aborted) {
|
|
194
|
+
stopTimeoutRecording();
|
|
195
|
+
}
|
|
196
|
+
return !settled;
|
|
197
|
+
};
|
|
198
|
+
const observeCaller = () => {
|
|
199
|
+
if (!signal) {
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
if (signal.aborted) {
|
|
203
|
+
stopRecording();
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
signal.addEventListener('abort', stopCallerRecording, { once: true });
|
|
208
|
+
if (settled) {
|
|
209
|
+
removeRecordingAbortListener(signal, stopCallerRecording);
|
|
210
|
+
} else if (!callerAbortObserved && signal.aborted) {
|
|
211
|
+
stopCallerRecording();
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
|
|
157
215
|
try {
|
|
158
216
|
if (typeof timeout === 'number' && (timeout > 0 || Number.isNaN(timeout))) {
|
|
159
217
|
internalSignal = AbortSignal.timeout(timeout);
|
|
@@ -182,8 +240,16 @@ function nodejsRecordAudio({ signal, device, timeout }: RecordAudioOptions = {})
|
|
|
182
240
|
ffmpeg.stdout?.on('data', collectData);
|
|
183
241
|
|
|
184
242
|
ffmpeg.on('error', (error) => {
|
|
185
|
-
|
|
186
|
-
|
|
243
|
+
if (!cleanup()) {
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
try {
|
|
248
|
+
console.error(error);
|
|
249
|
+
} catch {
|
|
250
|
+
// A custom logger must not hide the original process failure.
|
|
251
|
+
}
|
|
252
|
+
reject(error);
|
|
187
253
|
});
|
|
188
254
|
|
|
189
255
|
ffmpeg.on('close', (code) => {
|
|
@@ -194,18 +260,23 @@ function nodejsRecordAudio({ signal, device, timeout }: RecordAudioOptions = {})
|
|
|
194
260
|
returnData();
|
|
195
261
|
});
|
|
196
262
|
|
|
197
|
-
|
|
263
|
+
if (settled || !observeTimeout()) {
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
observeCaller();
|
|
267
|
+
} catch (error) {
|
|
268
|
+
if (!cleanup()) {
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
198
271
|
|
|
199
|
-
|
|
200
|
-
if (
|
|
201
|
-
|
|
202
|
-
} else {
|
|
203
|
-
signal.addEventListener('abort', stopRecording, { once: true });
|
|
272
|
+
try {
|
|
273
|
+
if (!wasStopped) {
|
|
274
|
+
ffmpeg?.kill('SIGTERM');
|
|
204
275
|
}
|
|
276
|
+
} catch {
|
|
277
|
+
// Preserve the original setup error when process termination also fails.
|
|
205
278
|
}
|
|
206
|
-
|
|
207
|
-
stopRecording();
|
|
208
|
-
rejectRecording(error);
|
|
279
|
+
reject(error);
|
|
209
280
|
}
|
|
210
281
|
});
|
|
211
282
|
}
|
|
@@ -216,13 +287,13 @@ function nodejsRecordAudio({ signal, device, timeout }: RecordAudioOptions = {})
|
|
|
216
287
|
* This helper is supported only in Node.js-compatible runtimes and requires
|
|
217
288
|
* the `ffmpeg` executable from FFmpeg to be available on `PATH`. Recording
|
|
218
289
|
* continues until the FFmpeg process exits, the supplied signal is aborted, or
|
|
219
|
-
* a positive timeout elapses.
|
|
220
|
-
*
|
|
290
|
+
* a positive timeout elapses. Successful cancellation returns the audio captured
|
|
291
|
+
* so far; if sending `SIGTERM` throws, recording rejects with that error.
|
|
221
292
|
*
|
|
222
293
|
* @param options Audio-input device, optional abort signal, and recording timeout.
|
|
223
294
|
* @returns The captured WAV file with MIME type `audio/wav`.
|
|
224
|
-
* @throws {Error} If recording is unsupported, `ffmpeg` cannot start
|
|
225
|
-
*
|
|
295
|
+
* @throws {Error} If recording is unsupported, `ffmpeg` cannot start or exits
|
|
296
|
+
* unsuccessfully before an intentional stop, or sending it `SIGTERM` throws.
|
|
226
297
|
*/
|
|
227
298
|
export async function recordAudio(options: RecordAudioOptions = {}): Promise<File> {
|
|
228
299
|
if (isNode) {
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import { OpenAIError } from '../error';
|
|
2
2
|
import type { AutoParseableResponseFormat, AutoParseableTextFormat, AutoParseableTool } from '../lib/parser';
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
makeParseableResponseFormat,
|
|
5
|
+
makeParseableTextFormat,
|
|
6
|
+
makeParseableTool,
|
|
7
|
+
parseResponseFormatContent,
|
|
8
|
+
} from '../lib/parser';
|
|
4
9
|
import type { AutoParseableResponseTool } from '../lib/ResponsesParser';
|
|
5
10
|
import { makeParseableResponseTool } from '../lib/ResponsesParser';
|
|
6
11
|
import type { JSONSchema } from '../lib/jsonschema';
|
|
@@ -500,11 +505,30 @@ function normalizeStructuredOutputSchema(schema: JSONSchema): JSONSchema {
|
|
|
500
505
|
return normalizedSchema;
|
|
501
506
|
}
|
|
502
507
|
|
|
508
|
+
type StandardSchemaBinding<Schema extends StandardSchemaLike> = {
|
|
509
|
+
standard: Schema['~standard'];
|
|
510
|
+
validate: Schema['~standard']['validate'];
|
|
511
|
+
};
|
|
512
|
+
|
|
513
|
+
function bindStandardSchema<Schema extends StandardSchemaLike>(standardSchema: Schema) {
|
|
514
|
+
let binding: StandardSchemaBinding<Schema> | undefined;
|
|
515
|
+
|
|
516
|
+
return (): StandardSchemaBinding<Schema> => {
|
|
517
|
+
if (!binding) {
|
|
518
|
+
const standard = standardSchema['~standard'];
|
|
519
|
+
binding = { standard, validate: standard.validate };
|
|
520
|
+
}
|
|
521
|
+
return binding;
|
|
522
|
+
};
|
|
523
|
+
}
|
|
524
|
+
|
|
503
525
|
function parseStandardSchema<Schema extends StandardSchemaLike>(
|
|
504
|
-
|
|
526
|
+
getBinding: () => StandardSchemaBinding<Schema>,
|
|
505
527
|
content: string,
|
|
506
528
|
): InferStandardOutput<Schema> {
|
|
507
|
-
const
|
|
529
|
+
const parsed = parseResponseFormatContent({ type: 'json_schema', $parseRaw: undefined }, content);
|
|
530
|
+
const { standard, validate } = getBinding();
|
|
531
|
+
const result = Reflect.apply(validate, standard, [parsed]);
|
|
508
532
|
|
|
509
533
|
if (isPromiseLike(result)) {
|
|
510
534
|
void Promise.resolve(result).catch(() => undefined);
|
|
@@ -520,11 +544,11 @@ function parseStandardSchema<Schema extends StandardSchemaLike>(
|
|
|
520
544
|
return result.value as InferStandardOutput<Schema>;
|
|
521
545
|
}
|
|
522
546
|
|
|
523
|
-
function resolveStandardJSONSchema(
|
|
524
|
-
|
|
547
|
+
function resolveStandardJSONSchema<Schema extends StandardSchemaLike>(
|
|
548
|
+
getBinding: () => StandardSchemaBinding<Schema>,
|
|
525
549
|
schemaOverride?: JSONSchema | Record<string, unknown> | undefined,
|
|
526
550
|
): Record<string, unknown> {
|
|
527
|
-
const schema = (schemaOverride ??
|
|
551
|
+
const schema = (schemaOverride ?? getBinding().standard.jsonSchema?.input({ target: 'draft-07' })) as
|
|
528
552
|
| JSONSchema
|
|
529
553
|
| undefined;
|
|
530
554
|
|
|
@@ -564,6 +588,7 @@ export function standardResponseFormat<Schema extends StandardSchemaLike>(
|
|
|
564
588
|
props?: StandardResponseFormatProps,
|
|
565
589
|
): AutoParseableResponseFormat<InferStandardOutput<Schema>> {
|
|
566
590
|
const { schema, ...formatProps } = props ?? {};
|
|
591
|
+
const getBinding = bindStandardSchema(standardSchema);
|
|
567
592
|
|
|
568
593
|
return makeParseableResponseFormat<InferStandardOutput<Schema>>(
|
|
569
594
|
{
|
|
@@ -572,10 +597,10 @@ export function standardResponseFormat<Schema extends StandardSchemaLike>(
|
|
|
572
597
|
...formatProps,
|
|
573
598
|
name,
|
|
574
599
|
strict: true,
|
|
575
|
-
schema: resolveStandardJSONSchema(
|
|
600
|
+
schema: resolveStandardJSONSchema(getBinding, schema),
|
|
576
601
|
},
|
|
577
602
|
},
|
|
578
|
-
(content) => parseStandardSchema(
|
|
603
|
+
(content) => parseStandardSchema(getBinding, content),
|
|
579
604
|
);
|
|
580
605
|
}
|
|
581
606
|
|
|
@@ -602,6 +627,7 @@ export function standardTextFormat<Schema extends StandardSchemaLike>(
|
|
|
602
627
|
props?: StandardTextFormatProps,
|
|
603
628
|
): AutoParseableTextFormat<InferStandardOutput<Schema>> {
|
|
604
629
|
const { schema, ...formatProps } = props ?? {};
|
|
630
|
+
const getBinding = bindStandardSchema(standardSchema);
|
|
605
631
|
|
|
606
632
|
return makeParseableTextFormat<InferStandardOutput<Schema>>(
|
|
607
633
|
{
|
|
@@ -609,9 +635,9 @@ export function standardTextFormat<Schema extends StandardSchemaLike>(
|
|
|
609
635
|
...formatProps,
|
|
610
636
|
name,
|
|
611
637
|
strict: true,
|
|
612
|
-
schema: resolveStandardJSONSchema(
|
|
638
|
+
schema: resolveStandardJSONSchema(getBinding, schema),
|
|
613
639
|
},
|
|
614
|
-
(content) => parseStandardSchema(
|
|
640
|
+
(content) => parseStandardSchema(getBinding, content),
|
|
615
641
|
);
|
|
616
642
|
}
|
|
617
643
|
|
|
@@ -678,19 +704,23 @@ export function standardFunction<Parameters extends StandardSchemaLike>(
|
|
|
678
704
|
export function standardFunction<Parameters extends StandardSchemaLike>(
|
|
679
705
|
options: StandardToolOptions<Parameters>,
|
|
680
706
|
) {
|
|
707
|
+
const name = options.name;
|
|
708
|
+
const parameters = options.parameters;
|
|
709
|
+
const getBinding = bindStandardSchema(parameters);
|
|
710
|
+
|
|
681
711
|
return makeParseableTool<any>(
|
|
682
712
|
{
|
|
683
713
|
type: 'function',
|
|
684
714
|
function: {
|
|
685
|
-
name
|
|
686
|
-
parameters: resolveStandardJSONSchema(
|
|
715
|
+
name,
|
|
716
|
+
parameters: resolveStandardJSONSchema(getBinding, options.schema),
|
|
687
717
|
strict: true,
|
|
688
718
|
...(options.description ? { description: options.description } : undefined),
|
|
689
719
|
},
|
|
690
720
|
},
|
|
691
721
|
{
|
|
692
722
|
callback: options.function,
|
|
693
|
-
parser: (args) => parseStandardSchema(
|
|
723
|
+
parser: (args) => parseStandardSchema(getBinding, args),
|
|
694
724
|
},
|
|
695
725
|
);
|
|
696
726
|
}
|
|
@@ -757,17 +787,21 @@ export function standardResponsesFunction<Parameters extends StandardSchemaLike>
|
|
|
757
787
|
export function standardResponsesFunction<Parameters extends StandardSchemaLike>(
|
|
758
788
|
options: StandardToolOptions<Parameters>,
|
|
759
789
|
) {
|
|
790
|
+
const name = options.name;
|
|
791
|
+
const parameters = options.parameters;
|
|
792
|
+
const getBinding = bindStandardSchema(parameters);
|
|
793
|
+
|
|
760
794
|
return makeParseableResponseTool<any>(
|
|
761
795
|
{
|
|
762
796
|
type: 'function',
|
|
763
|
-
name
|
|
764
|
-
parameters: resolveStandardJSONSchema(
|
|
797
|
+
name,
|
|
798
|
+
parameters: resolveStandardJSONSchema(getBinding, options.schema),
|
|
765
799
|
strict: true,
|
|
766
800
|
...(options.description ? { description: options.description } : undefined),
|
|
767
801
|
},
|
|
768
802
|
{
|
|
769
803
|
callback: options.function,
|
|
770
|
-
parser: (args) => parseStandardSchema(
|
|
804
|
+
parser: (args) => parseStandardSchema(getBinding, args),
|
|
771
805
|
},
|
|
772
806
|
);
|
|
773
807
|
}
|