ai 6.0.33 → 6.0.35
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 +16 -0
- package/dist/index.d.mts +50 -21
- package/dist/index.d.ts +50 -21
- package/dist/index.js +348 -286
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +280 -219
- package/dist/index.mjs.map +1 -1
- package/dist/internal/index.js +1 -1
- package/dist/internal/index.mjs +1 -1
- package/docs/02-foundations/03-prompts.mdx +2 -2
- package/docs/03-ai-sdk-core/15-tools-and-tool-calling.mdx +1 -1
- package/docs/07-reference/01-ai-sdk-core/28-output.mdx +1 -1
- package/docs/07-reference/05-ai-sdk-errors/ai-ui-message-stream-error.mdx +67 -0
- package/package.json +6 -4
- package/src/agent/agent.ts +116 -0
- package/src/agent/create-agent-ui-stream-response.test.ts +258 -0
- package/src/agent/create-agent-ui-stream-response.ts +50 -0
- package/src/agent/create-agent-ui-stream.ts +73 -0
- package/src/agent/index.ts +33 -0
- package/src/agent/infer-agent-tools.ts +7 -0
- package/src/agent/infer-agent-ui-message.test-d.ts +54 -0
- package/src/agent/infer-agent-ui-message.ts +11 -0
- package/src/agent/pipe-agent-ui-stream-to-response.ts +52 -0
- package/src/agent/tool-loop-agent-on-finish-callback.ts +31 -0
- package/src/agent/tool-loop-agent-on-step-finish-callback.ts +11 -0
- package/src/agent/tool-loop-agent-settings.ts +182 -0
- package/src/agent/tool-loop-agent.test-d.ts +114 -0
- package/src/agent/tool-loop-agent.test.ts +442 -0
- package/src/agent/tool-loop-agent.ts +114 -0
- package/src/embed/__snapshots__/embed-many.test.ts.snap +191 -0
- package/src/embed/__snapshots__/embed.test.ts.snap +81 -0
- package/src/embed/embed-many-result.ts +53 -0
- package/src/embed/embed-many.test.ts +653 -0
- package/src/embed/embed-many.ts +378 -0
- package/src/embed/embed-result.ts +50 -0
- package/src/embed/embed.test.ts +298 -0
- package/src/embed/embed.ts +211 -0
- package/src/embed/index.ts +4 -0
- package/src/error/index.ts +35 -0
- package/src/error/invalid-argument-error.ts +34 -0
- package/src/error/invalid-stream-part-error.ts +28 -0
- package/src/error/invalid-tool-approval-error.ts +26 -0
- package/src/error/invalid-tool-input-error.ts +33 -0
- package/src/error/no-image-generated-error.ts +39 -0
- package/src/error/no-object-generated-error.ts +70 -0
- package/src/error/no-output-generated-error.ts +26 -0
- package/src/error/no-speech-generated-error.ts +18 -0
- package/src/error/no-such-tool-error.ts +35 -0
- package/src/error/no-transcript-generated-error.ts +20 -0
- package/src/error/tool-call-not-found-for-approval-error.ts +32 -0
- package/src/error/tool-call-repair-error.ts +30 -0
- package/src/error/ui-message-stream-error.ts +48 -0
- package/src/error/unsupported-model-version-error.ts +23 -0
- package/src/error/verify-no-object-generated-error.ts +27 -0
- package/src/generate-image/generate-image-result.ts +42 -0
- package/src/generate-image/generate-image.test.ts +1420 -0
- package/src/generate-image/generate-image.ts +360 -0
- package/src/generate-image/index.ts +18 -0
- package/src/generate-object/__snapshots__/generate-object.test.ts.snap +133 -0
- package/src/generate-object/__snapshots__/stream-object.test.ts.snap +297 -0
- package/src/generate-object/generate-object-result.ts +67 -0
- package/src/generate-object/generate-object.test-d.ts +49 -0
- package/src/generate-object/generate-object.test.ts +1191 -0
- package/src/generate-object/generate-object.ts +518 -0
- package/src/generate-object/index.ts +9 -0
- package/src/generate-object/inject-json-instruction.test.ts +181 -0
- package/src/generate-object/inject-json-instruction.ts +30 -0
- package/src/generate-object/output-strategy.ts +415 -0
- package/src/generate-object/parse-and-validate-object-result.ts +111 -0
- package/src/generate-object/repair-text.ts +12 -0
- package/src/generate-object/stream-object-result.ts +120 -0
- package/src/generate-object/stream-object.test-d.ts +74 -0
- package/src/generate-object/stream-object.test.ts +1950 -0
- package/src/generate-object/stream-object.ts +986 -0
- package/src/generate-object/validate-object-generation-input.ts +144 -0
- package/src/generate-speech/generate-speech-result.ts +30 -0
- package/src/generate-speech/generate-speech.test.ts +300 -0
- package/src/generate-speech/generate-speech.ts +190 -0
- package/src/generate-speech/generated-audio-file.ts +65 -0
- package/src/generate-speech/index.ts +3 -0
- package/src/generate-text/__snapshots__/generate-text.test.ts.snap +1872 -0
- package/src/generate-text/__snapshots__/stream-text.test.ts.snap +1255 -0
- package/src/generate-text/collect-tool-approvals.test.ts +553 -0
- package/src/generate-text/collect-tool-approvals.ts +116 -0
- package/src/generate-text/content-part.ts +25 -0
- package/src/generate-text/execute-tool-call.ts +129 -0
- package/src/generate-text/extract-reasoning-content.ts +17 -0
- package/src/generate-text/extract-text-content.ts +15 -0
- package/src/generate-text/generate-text-result.ts +168 -0
- package/src/generate-text/generate-text.test-d.ts +68 -0
- package/src/generate-text/generate-text.test.ts +7011 -0
- package/src/generate-text/generate-text.ts +1223 -0
- package/src/generate-text/generated-file.ts +70 -0
- package/src/generate-text/index.ts +57 -0
- package/src/generate-text/is-approval-needed.ts +29 -0
- package/src/generate-text/output-utils.ts +23 -0
- package/src/generate-text/output.test.ts +698 -0
- package/src/generate-text/output.ts +590 -0
- package/src/generate-text/parse-tool-call.test.ts +570 -0
- package/src/generate-text/parse-tool-call.ts +188 -0
- package/src/generate-text/prepare-step.ts +103 -0
- package/src/generate-text/prune-messages.test.ts +720 -0
- package/src/generate-text/prune-messages.ts +167 -0
- package/src/generate-text/reasoning-output.ts +20 -0
- package/src/generate-text/reasoning.ts +8 -0
- package/src/generate-text/response-message.ts +10 -0
- package/src/generate-text/run-tools-transformation.test.ts +1143 -0
- package/src/generate-text/run-tools-transformation.ts +420 -0
- package/src/generate-text/smooth-stream.test.ts +2101 -0
- package/src/generate-text/smooth-stream.ts +162 -0
- package/src/generate-text/step-result.ts +238 -0
- package/src/generate-text/stop-condition.ts +29 -0
- package/src/generate-text/stream-text-result.ts +463 -0
- package/src/generate-text/stream-text.test-d.ts +200 -0
- package/src/generate-text/stream-text.test.ts +19979 -0
- package/src/generate-text/stream-text.ts +2505 -0
- package/src/generate-text/to-response-messages.test.ts +922 -0
- package/src/generate-text/to-response-messages.ts +163 -0
- package/src/generate-text/tool-approval-request-output.ts +21 -0
- package/src/generate-text/tool-call-repair-function.ts +27 -0
- package/src/generate-text/tool-call.ts +47 -0
- package/src/generate-text/tool-error.ts +34 -0
- package/src/generate-text/tool-output-denied.ts +21 -0
- package/src/generate-text/tool-output.ts +7 -0
- package/src/generate-text/tool-result.ts +36 -0
- package/src/generate-text/tool-set.ts +14 -0
- package/src/global.ts +24 -0
- package/src/index.ts +50 -0
- package/src/logger/index.ts +6 -0
- package/src/logger/log-warnings.test.ts +351 -0
- package/src/logger/log-warnings.ts +119 -0
- package/src/middleware/__snapshots__/simulate-streaming-middleware.test.ts.snap +64 -0
- package/src/middleware/add-tool-input-examples-middleware.test.ts +476 -0
- package/src/middleware/add-tool-input-examples-middleware.ts +90 -0
- package/src/middleware/default-embedding-settings-middleware.test.ts +126 -0
- package/src/middleware/default-embedding-settings-middleware.ts +22 -0
- package/src/middleware/default-settings-middleware.test.ts +388 -0
- package/src/middleware/default-settings-middleware.ts +33 -0
- package/src/middleware/extract-json-middleware.test.ts +827 -0
- package/src/middleware/extract-json-middleware.ts +197 -0
- package/src/middleware/extract-reasoning-middleware.test.ts +1028 -0
- package/src/middleware/extract-reasoning-middleware.ts +238 -0
- package/src/middleware/index.ts +10 -0
- package/src/middleware/simulate-streaming-middleware.test.ts +911 -0
- package/src/middleware/simulate-streaming-middleware.ts +79 -0
- package/src/middleware/wrap-embedding-model.test.ts +358 -0
- package/src/middleware/wrap-embedding-model.ts +86 -0
- package/src/middleware/wrap-image-model.test.ts +423 -0
- package/src/middleware/wrap-image-model.ts +85 -0
- package/src/middleware/wrap-language-model.test.ts +518 -0
- package/src/middleware/wrap-language-model.ts +104 -0
- package/src/middleware/wrap-provider.test.ts +120 -0
- package/src/middleware/wrap-provider.ts +51 -0
- package/src/model/as-embedding-model-v3.test.ts +319 -0
- package/src/model/as-embedding-model-v3.ts +24 -0
- package/src/model/as-image-model-v3.test.ts +409 -0
- package/src/model/as-image-model-v3.ts +24 -0
- package/src/model/as-language-model-v3.test.ts +508 -0
- package/src/model/as-language-model-v3.ts +103 -0
- package/src/model/as-provider-v3.ts +36 -0
- package/src/model/as-speech-model-v3.test.ts +356 -0
- package/src/model/as-speech-model-v3.ts +24 -0
- package/src/model/as-transcription-model-v3.test.ts +529 -0
- package/src/model/as-transcription-model-v3.ts +24 -0
- package/src/model/resolve-model.test.ts +244 -0
- package/src/model/resolve-model.ts +126 -0
- package/src/prompt/call-settings.ts +148 -0
- package/src/prompt/content-part.ts +209 -0
- package/src/prompt/convert-to-language-model-prompt.test.ts +2018 -0
- package/src/prompt/convert-to-language-model-prompt.ts +442 -0
- package/src/prompt/create-tool-model-output.test.ts +508 -0
- package/src/prompt/create-tool-model-output.ts +34 -0
- package/src/prompt/data-content.test.ts +15 -0
- package/src/prompt/data-content.ts +134 -0
- package/src/prompt/index.ts +27 -0
- package/src/prompt/invalid-data-content-error.ts +29 -0
- package/src/prompt/invalid-message-role-error.ts +27 -0
- package/src/prompt/message-conversion-error.ts +28 -0
- package/src/prompt/message.ts +68 -0
- package/src/prompt/prepare-call-settings.test.ts +159 -0
- package/src/prompt/prepare-call-settings.ts +108 -0
- package/src/prompt/prepare-tools-and-tool-choice.test.ts +461 -0
- package/src/prompt/prepare-tools-and-tool-choice.ts +86 -0
- package/src/prompt/prompt.ts +43 -0
- package/src/prompt/split-data-url.ts +17 -0
- package/src/prompt/standardize-prompt.test.ts +82 -0
- package/src/prompt/standardize-prompt.ts +99 -0
- package/src/prompt/wrap-gateway-error.ts +29 -0
- package/src/registry/custom-provider.test.ts +211 -0
- package/src/registry/custom-provider.ts +155 -0
- package/src/registry/index.ts +7 -0
- package/src/registry/no-such-provider-error.ts +41 -0
- package/src/registry/provider-registry.test.ts +691 -0
- package/src/registry/provider-registry.ts +328 -0
- package/src/rerank/index.ts +2 -0
- package/src/rerank/rerank-result.ts +70 -0
- package/src/rerank/rerank.test.ts +516 -0
- package/src/rerank/rerank.ts +237 -0
- package/src/telemetry/assemble-operation-name.ts +21 -0
- package/src/telemetry/get-base-telemetry-attributes.ts +53 -0
- package/src/telemetry/get-tracer.ts +20 -0
- package/src/telemetry/noop-tracer.ts +69 -0
- package/src/telemetry/record-span.ts +63 -0
- package/src/telemetry/select-telemetry-attributes.ts +78 -0
- package/src/telemetry/select-temetry-attributes.test.ts +114 -0
- package/src/telemetry/stringify-for-telemetry.test.ts +114 -0
- package/src/telemetry/stringify-for-telemetry.ts +33 -0
- package/src/telemetry/telemetry-settings.ts +44 -0
- package/src/test/mock-embedding-model-v2.ts +35 -0
- package/src/test/mock-embedding-model-v3.ts +48 -0
- package/src/test/mock-image-model-v2.ts +28 -0
- package/src/test/mock-image-model-v3.ts +28 -0
- package/src/test/mock-language-model-v2.ts +72 -0
- package/src/test/mock-language-model-v3.ts +77 -0
- package/src/test/mock-provider-v2.ts +68 -0
- package/src/test/mock-provider-v3.ts +80 -0
- package/src/test/mock-reranking-model-v3.ts +25 -0
- package/src/test/mock-server-response.ts +69 -0
- package/src/test/mock-speech-model-v2.ts +24 -0
- package/src/test/mock-speech-model-v3.ts +24 -0
- package/src/test/mock-tracer.ts +156 -0
- package/src/test/mock-transcription-model-v2.ts +24 -0
- package/src/test/mock-transcription-model-v3.ts +24 -0
- package/src/test/mock-values.ts +4 -0
- package/src/test/not-implemented.ts +3 -0
- package/src/text-stream/create-text-stream-response.test.ts +38 -0
- package/src/text-stream/create-text-stream-response.ts +18 -0
- package/src/text-stream/index.ts +2 -0
- package/src/text-stream/pipe-text-stream-to-response.test.ts +38 -0
- package/src/text-stream/pipe-text-stream-to-response.ts +26 -0
- package/src/transcribe/index.ts +2 -0
- package/src/transcribe/transcribe-result.ts +60 -0
- package/src/transcribe/transcribe.test.ts +313 -0
- package/src/transcribe/transcribe.ts +173 -0
- package/src/types/embedding-model-middleware.ts +3 -0
- package/src/types/embedding-model.ts +18 -0
- package/src/types/image-model-middleware.ts +3 -0
- package/src/types/image-model-response-metadata.ts +16 -0
- package/src/types/image-model.ts +19 -0
- package/src/types/index.ts +29 -0
- package/src/types/json-value.ts +15 -0
- package/src/types/language-model-middleware.ts +3 -0
- package/src/types/language-model-request-metadata.ts +6 -0
- package/src/types/language-model-response-metadata.ts +21 -0
- package/src/types/language-model.ts +104 -0
- package/src/types/provider-metadata.ts +16 -0
- package/src/types/provider.ts +55 -0
- package/src/types/reranking-model.ts +6 -0
- package/src/types/speech-model-response-metadata.ts +21 -0
- package/src/types/speech-model.ts +6 -0
- package/src/types/transcription-model-response-metadata.ts +16 -0
- package/src/types/transcription-model.ts +9 -0
- package/src/types/usage.ts +200 -0
- package/src/types/warning.ts +7 -0
- package/src/ui/__snapshots__/append-response-messages.test.ts.snap +416 -0
- package/src/ui/__snapshots__/convert-to-model-messages.test.ts.snap +419 -0
- package/src/ui/__snapshots__/process-chat-text-response.test.ts.snap +142 -0
- package/src/ui/call-completion-api.ts +157 -0
- package/src/ui/chat-transport.ts +83 -0
- package/src/ui/chat.test-d.ts +233 -0
- package/src/ui/chat.test.ts +2695 -0
- package/src/ui/chat.ts +716 -0
- package/src/ui/convert-file-list-to-file-ui-parts.ts +36 -0
- package/src/ui/convert-to-model-messages.test.ts +2775 -0
- package/src/ui/convert-to-model-messages.ts +373 -0
- package/src/ui/default-chat-transport.ts +36 -0
- package/src/ui/direct-chat-transport.test.ts +446 -0
- package/src/ui/direct-chat-transport.ts +118 -0
- package/src/ui/http-chat-transport.test.ts +185 -0
- package/src/ui/http-chat-transport.ts +292 -0
- package/src/ui/index.ts +71 -0
- package/src/ui/last-assistant-message-is-complete-with-approval-responses.ts +44 -0
- package/src/ui/last-assistant-message-is-complete-with-tool-calls.test.ts +371 -0
- package/src/ui/last-assistant-message-is-complete-with-tool-calls.ts +39 -0
- package/src/ui/process-text-stream.test.ts +38 -0
- package/src/ui/process-text-stream.ts +16 -0
- package/src/ui/process-ui-message-stream.test.ts +8294 -0
- package/src/ui/process-ui-message-stream.ts +761 -0
- package/src/ui/text-stream-chat-transport.ts +23 -0
- package/src/ui/transform-text-to-ui-message-stream.test.ts +124 -0
- package/src/ui/transform-text-to-ui-message-stream.ts +27 -0
- package/src/ui/ui-messages.test.ts +48 -0
- package/src/ui/ui-messages.ts +534 -0
- package/src/ui/use-completion.ts +84 -0
- package/src/ui/validate-ui-messages.test.ts +1428 -0
- package/src/ui/validate-ui-messages.ts +476 -0
- package/src/ui-message-stream/create-ui-message-stream-response.test.ts +266 -0
- package/src/ui-message-stream/create-ui-message-stream-response.ts +32 -0
- package/src/ui-message-stream/create-ui-message-stream.test.ts +639 -0
- package/src/ui-message-stream/create-ui-message-stream.ts +124 -0
- package/src/ui-message-stream/get-response-ui-message-id.test.ts +55 -0
- package/src/ui-message-stream/get-response-ui-message-id.ts +24 -0
- package/src/ui-message-stream/handle-ui-message-stream-finish.test.ts +429 -0
- package/src/ui-message-stream/handle-ui-message-stream-finish.ts +135 -0
- package/src/ui-message-stream/index.ts +13 -0
- package/src/ui-message-stream/json-to-sse-transform-stream.ts +12 -0
- package/src/ui-message-stream/pipe-ui-message-stream-to-response.test.ts +90 -0
- package/src/ui-message-stream/pipe-ui-message-stream-to-response.ts +40 -0
- package/src/ui-message-stream/read-ui-message-stream.test.ts +122 -0
- package/src/ui-message-stream/read-ui-message-stream.ts +87 -0
- package/src/ui-message-stream/ui-message-chunks.test-d.ts +18 -0
- package/src/ui-message-stream/ui-message-chunks.ts +344 -0
- package/src/ui-message-stream/ui-message-stream-headers.ts +7 -0
- package/src/ui-message-stream/ui-message-stream-on-finish-callback.ts +32 -0
- package/src/ui-message-stream/ui-message-stream-response-init.ts +5 -0
- package/src/ui-message-stream/ui-message-stream-writer.ts +24 -0
- package/src/util/as-array.ts +3 -0
- package/src/util/async-iterable-stream.test.ts +241 -0
- package/src/util/async-iterable-stream.ts +94 -0
- package/src/util/consume-stream.ts +29 -0
- package/src/util/cosine-similarity.test.ts +57 -0
- package/src/util/cosine-similarity.ts +47 -0
- package/src/util/create-resolvable-promise.ts +30 -0
- package/src/util/create-stitchable-stream.test.ts +239 -0
- package/src/util/create-stitchable-stream.ts +112 -0
- package/src/util/data-url.ts +17 -0
- package/src/util/deep-partial.ts +84 -0
- package/src/util/detect-media-type.test.ts +670 -0
- package/src/util/detect-media-type.ts +184 -0
- package/src/util/download/download-function.ts +45 -0
- package/src/util/download/download.test.ts +69 -0
- package/src/util/download/download.ts +46 -0
- package/src/util/error-handler.ts +1 -0
- package/src/util/fix-json.test.ts +279 -0
- package/src/util/fix-json.ts +401 -0
- package/src/util/get-potential-start-index.test.ts +34 -0
- package/src/util/get-potential-start-index.ts +30 -0
- package/src/util/index.ts +11 -0
- package/src/util/is-deep-equal-data.test.ts +119 -0
- package/src/util/is-deep-equal-data.ts +48 -0
- package/src/util/is-non-empty-object.ts +5 -0
- package/src/util/job.ts +1 -0
- package/src/util/log-v2-compatibility-warning.ts +21 -0
- package/src/util/merge-abort-signals.test.ts +155 -0
- package/src/util/merge-abort-signals.ts +43 -0
- package/src/util/merge-objects.test.ts +118 -0
- package/src/util/merge-objects.ts +79 -0
- package/src/util/now.ts +4 -0
- package/src/util/parse-partial-json.test.ts +80 -0
- package/src/util/parse-partial-json.ts +30 -0
- package/src/util/prepare-headers.test.ts +51 -0
- package/src/util/prepare-headers.ts +14 -0
- package/src/util/prepare-retries.test.ts +10 -0
- package/src/util/prepare-retries.ts +47 -0
- package/src/util/retry-error.ts +41 -0
- package/src/util/retry-with-exponential-backoff.test.ts +446 -0
- package/src/util/retry-with-exponential-backoff.ts +154 -0
- package/src/util/serial-job-executor.test.ts +162 -0
- package/src/util/serial-job-executor.ts +36 -0
- package/src/util/simulate-readable-stream.test.ts +98 -0
- package/src/util/simulate-readable-stream.ts +39 -0
- package/src/util/split-array.test.ts +60 -0
- package/src/util/split-array.ts +20 -0
- package/src/util/value-of.ts +65 -0
- package/src/util/write-to-server-response.test.ts +266 -0
- package/src/util/write-to-server-response.ts +49 -0
- package/src/version.ts +5 -0
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import { JSONObject, TranscriptionModelV3 } from '@ai-sdk/provider';
|
|
2
|
+
import {
|
|
3
|
+
afterEach,
|
|
4
|
+
beforeEach,
|
|
5
|
+
describe,
|
|
6
|
+
expect,
|
|
7
|
+
it,
|
|
8
|
+
vitest,
|
|
9
|
+
vi,
|
|
10
|
+
} from 'vitest';
|
|
11
|
+
import * as logWarningsModule from '../logger/log-warnings';
|
|
12
|
+
import { MockTranscriptionModelV3 } from '../test/mock-transcription-model-v3';
|
|
13
|
+
import { transcribe } from './transcribe';
|
|
14
|
+
import { Warning } from '../types/warning';
|
|
15
|
+
|
|
16
|
+
vi.mock('../version', () => {
|
|
17
|
+
return {
|
|
18
|
+
VERSION: '0.0.0-test',
|
|
19
|
+
};
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
const audioData = new Uint8Array([1, 2, 3, 4]); // Sample audio data
|
|
23
|
+
const testDate = new Date(2024, 0, 1);
|
|
24
|
+
|
|
25
|
+
const sampleTranscript = {
|
|
26
|
+
text: 'This is a sample transcript.',
|
|
27
|
+
segments: [
|
|
28
|
+
{
|
|
29
|
+
startSecond: 0,
|
|
30
|
+
endSecond: 2.5,
|
|
31
|
+
text: 'This is a',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
startSecond: 2.5,
|
|
35
|
+
endSecond: 4.0,
|
|
36
|
+
text: 'sample transcript.',
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
language: 'en',
|
|
40
|
+
durationInSeconds: 4.0,
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const createMockResponse = (options: {
|
|
44
|
+
text: string;
|
|
45
|
+
segments: Array<{
|
|
46
|
+
text: string;
|
|
47
|
+
startSecond: number;
|
|
48
|
+
endSecond: number;
|
|
49
|
+
}>;
|
|
50
|
+
language?: string;
|
|
51
|
+
durationInSeconds?: number;
|
|
52
|
+
warnings?: Warning[];
|
|
53
|
+
timestamp?: Date;
|
|
54
|
+
modelId?: string;
|
|
55
|
+
headers?: Record<string, string>;
|
|
56
|
+
providerMetadata?: Record<string, JSONObject>;
|
|
57
|
+
}) => ({
|
|
58
|
+
text: options.text,
|
|
59
|
+
segments: options.segments,
|
|
60
|
+
language: options.language,
|
|
61
|
+
durationInSeconds: options.durationInSeconds,
|
|
62
|
+
warnings: options.warnings ?? [],
|
|
63
|
+
response: {
|
|
64
|
+
timestamp: options.timestamp ?? new Date(),
|
|
65
|
+
modelId: options.modelId ?? 'test-model-id',
|
|
66
|
+
headers: options.headers ?? {},
|
|
67
|
+
},
|
|
68
|
+
providerMetadata: options.providerMetadata ?? {},
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
describe('transcribe', () => {
|
|
72
|
+
let logWarningsSpy: ReturnType<typeof vitest.spyOn>;
|
|
73
|
+
|
|
74
|
+
beforeEach(() => {
|
|
75
|
+
logWarningsSpy = vitest
|
|
76
|
+
.spyOn(logWarningsModule, 'logWarnings')
|
|
77
|
+
.mockImplementation(() => {});
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
afterEach(() => {
|
|
81
|
+
logWarningsSpy.mockRestore();
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it('should send args to doGenerate', async () => {
|
|
85
|
+
const abortController = new AbortController();
|
|
86
|
+
const abortSignal = abortController.signal;
|
|
87
|
+
|
|
88
|
+
let capturedArgs!: Parameters<TranscriptionModelV3['doGenerate']>[0];
|
|
89
|
+
|
|
90
|
+
await transcribe({
|
|
91
|
+
model: new MockTranscriptionModelV3({
|
|
92
|
+
doGenerate: async args => {
|
|
93
|
+
capturedArgs = args;
|
|
94
|
+
return createMockResponse({
|
|
95
|
+
...sampleTranscript,
|
|
96
|
+
});
|
|
97
|
+
},
|
|
98
|
+
}),
|
|
99
|
+
audio: audioData,
|
|
100
|
+
headers: {
|
|
101
|
+
'custom-request-header': 'request-header-value',
|
|
102
|
+
},
|
|
103
|
+
abortSignal,
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
expect(capturedArgs).toStrictEqual({
|
|
107
|
+
audio: audioData,
|
|
108
|
+
mediaType: 'audio/wav',
|
|
109
|
+
headers: {
|
|
110
|
+
'custom-request-header': 'request-header-value',
|
|
111
|
+
'user-agent': 'ai/0.0.0-test',
|
|
112
|
+
},
|
|
113
|
+
abortSignal,
|
|
114
|
+
providerOptions: {},
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it('should return warnings', async () => {
|
|
119
|
+
const result = await transcribe({
|
|
120
|
+
model: new MockTranscriptionModelV3({
|
|
121
|
+
doGenerate: async () =>
|
|
122
|
+
createMockResponse({
|
|
123
|
+
...sampleTranscript,
|
|
124
|
+
warnings: [
|
|
125
|
+
{
|
|
126
|
+
type: 'other',
|
|
127
|
+
message: 'Setting is not supported',
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
providerMetadata: {
|
|
131
|
+
'test-provider': {
|
|
132
|
+
'test-key': 'test-value',
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
}),
|
|
136
|
+
}),
|
|
137
|
+
audio: audioData,
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
expect(result.warnings).toStrictEqual([
|
|
141
|
+
{
|
|
142
|
+
type: 'other',
|
|
143
|
+
message: 'Setting is not supported',
|
|
144
|
+
},
|
|
145
|
+
]);
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
it('should call logWarnings with the correct warnings', async () => {
|
|
149
|
+
const expectedWarnings: Warning[] = [
|
|
150
|
+
{
|
|
151
|
+
type: 'other',
|
|
152
|
+
message: 'Setting is not supported',
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
type: 'unsupported',
|
|
156
|
+
feature: 'mediaType',
|
|
157
|
+
details: 'MediaType parameter not supported',
|
|
158
|
+
},
|
|
159
|
+
];
|
|
160
|
+
|
|
161
|
+
await transcribe({
|
|
162
|
+
model: new MockTranscriptionModelV3({
|
|
163
|
+
doGenerate: async () =>
|
|
164
|
+
createMockResponse({
|
|
165
|
+
...sampleTranscript,
|
|
166
|
+
warnings: expectedWarnings,
|
|
167
|
+
}),
|
|
168
|
+
}),
|
|
169
|
+
audio: audioData,
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
expect(logWarningsSpy).toHaveBeenCalledOnce();
|
|
173
|
+
expect(logWarningsSpy).toHaveBeenCalledWith({
|
|
174
|
+
warnings: expectedWarnings,
|
|
175
|
+
provider: 'mock-provider',
|
|
176
|
+
model: 'mock-model-id',
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
it('should call logWarnings with empty array when no warnings are present', async () => {
|
|
181
|
+
await transcribe({
|
|
182
|
+
model: new MockTranscriptionModelV3({
|
|
183
|
+
doGenerate: async () =>
|
|
184
|
+
createMockResponse({
|
|
185
|
+
...sampleTranscript,
|
|
186
|
+
warnings: [], // no warnings
|
|
187
|
+
}),
|
|
188
|
+
}),
|
|
189
|
+
audio: audioData,
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
expect(logWarningsSpy).toHaveBeenCalledOnce();
|
|
193
|
+
expect(logWarningsSpy).toHaveBeenCalledWith({
|
|
194
|
+
warnings: [],
|
|
195
|
+
provider: 'mock-provider',
|
|
196
|
+
model: 'mock-model-id',
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
it('should return the transcript', async () => {
|
|
201
|
+
const result = await transcribe({
|
|
202
|
+
model: new MockTranscriptionModelV3({
|
|
203
|
+
doGenerate: async () =>
|
|
204
|
+
createMockResponse({
|
|
205
|
+
...sampleTranscript,
|
|
206
|
+
}),
|
|
207
|
+
}),
|
|
208
|
+
audio: audioData,
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
expect(result).toEqual({
|
|
212
|
+
...sampleTranscript,
|
|
213
|
+
warnings: [],
|
|
214
|
+
responses: [
|
|
215
|
+
{
|
|
216
|
+
timestamp: expect.any(Date),
|
|
217
|
+
modelId: 'test-model-id',
|
|
218
|
+
headers: {},
|
|
219
|
+
},
|
|
220
|
+
],
|
|
221
|
+
providerMetadata: {},
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
describe('error handling', () => {
|
|
226
|
+
it('should throw NoTranscriptGeneratedError when no transcript is returned', async () => {
|
|
227
|
+
await expect(
|
|
228
|
+
transcribe({
|
|
229
|
+
model: new MockTranscriptionModelV3({
|
|
230
|
+
doGenerate: async () =>
|
|
231
|
+
createMockResponse({
|
|
232
|
+
text: '',
|
|
233
|
+
segments: [],
|
|
234
|
+
language: 'en',
|
|
235
|
+
durationInSeconds: 0,
|
|
236
|
+
timestamp: testDate,
|
|
237
|
+
}),
|
|
238
|
+
}),
|
|
239
|
+
audio: audioData,
|
|
240
|
+
}),
|
|
241
|
+
).rejects.toMatchObject({
|
|
242
|
+
name: 'AI_NoTranscriptGeneratedError',
|
|
243
|
+
message: 'No transcript generated.',
|
|
244
|
+
responses: [
|
|
245
|
+
{
|
|
246
|
+
timestamp: testDate,
|
|
247
|
+
modelId: expect.any(String),
|
|
248
|
+
},
|
|
249
|
+
],
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
it('should include response headers in error when no transcript generated', async () => {
|
|
254
|
+
await expect(
|
|
255
|
+
transcribe({
|
|
256
|
+
model: new MockTranscriptionModelV3({
|
|
257
|
+
doGenerate: async () =>
|
|
258
|
+
createMockResponse({
|
|
259
|
+
text: '',
|
|
260
|
+
segments: [],
|
|
261
|
+
language: 'en',
|
|
262
|
+
durationInSeconds: 0,
|
|
263
|
+
timestamp: testDate,
|
|
264
|
+
headers: {
|
|
265
|
+
'custom-response-header': 'response-header-value',
|
|
266
|
+
'user-agent': 'ai/0.0.0-test',
|
|
267
|
+
},
|
|
268
|
+
}),
|
|
269
|
+
}),
|
|
270
|
+
audio: audioData,
|
|
271
|
+
}),
|
|
272
|
+
).rejects.toMatchObject({
|
|
273
|
+
name: 'AI_NoTranscriptGeneratedError',
|
|
274
|
+
message: 'No transcript generated.',
|
|
275
|
+
responses: [
|
|
276
|
+
{
|
|
277
|
+
timestamp: testDate,
|
|
278
|
+
modelId: expect.any(String),
|
|
279
|
+
headers: {
|
|
280
|
+
'custom-response-header': 'response-header-value',
|
|
281
|
+
'user-agent': 'ai/0.0.0-test',
|
|
282
|
+
},
|
|
283
|
+
},
|
|
284
|
+
],
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
it('should return response metadata', async () => {
|
|
290
|
+
const testHeaders = { 'x-test': 'value' };
|
|
291
|
+
|
|
292
|
+
const result = await transcribe({
|
|
293
|
+
model: new MockTranscriptionModelV3({
|
|
294
|
+
doGenerate: async () =>
|
|
295
|
+
createMockResponse({
|
|
296
|
+
...sampleTranscript,
|
|
297
|
+
timestamp: testDate,
|
|
298
|
+
modelId: 'test-model',
|
|
299
|
+
headers: testHeaders,
|
|
300
|
+
}),
|
|
301
|
+
}),
|
|
302
|
+
audio: audioData,
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
expect(result.responses).toStrictEqual([
|
|
306
|
+
{
|
|
307
|
+
timestamp: testDate,
|
|
308
|
+
modelId: 'test-model',
|
|
309
|
+
headers: testHeaders,
|
|
310
|
+
},
|
|
311
|
+
]);
|
|
312
|
+
});
|
|
313
|
+
});
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { JSONObject } from '@ai-sdk/provider';
|
|
2
|
+
import { ProviderOptions, withUserAgentSuffix } from '@ai-sdk/provider-utils';
|
|
3
|
+
import { NoTranscriptGeneratedError } from '../error/no-transcript-generated-error';
|
|
4
|
+
import { logWarnings } from '../logger/log-warnings';
|
|
5
|
+
import { DataContent } from '../prompt';
|
|
6
|
+
import { convertDataContentToUint8Array } from '../prompt/data-content';
|
|
7
|
+
import { TranscriptionModel } from '../types/transcription-model';
|
|
8
|
+
import { TranscriptionModelResponseMetadata } from '../types/transcription-model-response-metadata';
|
|
9
|
+
import {
|
|
10
|
+
audioMediaTypeSignatures,
|
|
11
|
+
detectMediaType,
|
|
12
|
+
} from '../util/detect-media-type';
|
|
13
|
+
import { download } from '../util/download/download';
|
|
14
|
+
import { prepareRetries } from '../util/prepare-retries';
|
|
15
|
+
import { TranscriptionResult } from './transcribe-result';
|
|
16
|
+
import { VERSION } from '../version';
|
|
17
|
+
import { resolveTranscriptionModel } from '../model/resolve-model';
|
|
18
|
+
import { Warning } from '../types';
|
|
19
|
+
/**
|
|
20
|
+
Generates transcripts using a transcription model.
|
|
21
|
+
|
|
22
|
+
@param model - The transcription model to use.
|
|
23
|
+
@param audio - The audio data to transcribe as DataContent (string | Uint8Array | ArrayBuffer | Buffer) or a URL.
|
|
24
|
+
@param providerOptions - Additional provider-specific options that are passed through to the provider
|
|
25
|
+
as body parameters.
|
|
26
|
+
@param maxRetries - Maximum number of retries. Set to 0 to disable retries. Default: 2.
|
|
27
|
+
@param abortSignal - An optional abort signal that can be used to cancel the call.
|
|
28
|
+
@param headers - Additional HTTP headers to be sent with the request. Only applicable for HTTP-based providers.
|
|
29
|
+
|
|
30
|
+
@returns A result object that contains the generated transcript.
|
|
31
|
+
*/
|
|
32
|
+
export async function transcribe({
|
|
33
|
+
model,
|
|
34
|
+
audio,
|
|
35
|
+
providerOptions = {},
|
|
36
|
+
maxRetries: maxRetriesArg,
|
|
37
|
+
abortSignal,
|
|
38
|
+
headers,
|
|
39
|
+
}: {
|
|
40
|
+
/**
|
|
41
|
+
The transcription model to use.
|
|
42
|
+
*/
|
|
43
|
+
model: TranscriptionModel;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
The audio data to transcribe.
|
|
47
|
+
*/
|
|
48
|
+
audio: DataContent | URL;
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
Additional provider-specific options that are passed through to the provider
|
|
52
|
+
as body parameters.
|
|
53
|
+
|
|
54
|
+
The outer record is keyed by the provider name, and the inner
|
|
55
|
+
record is keyed by the provider-specific metadata key.
|
|
56
|
+
```ts
|
|
57
|
+
{
|
|
58
|
+
"openai": {
|
|
59
|
+
"temperature": 0
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
*/
|
|
64
|
+
providerOptions?: ProviderOptions;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
Maximum number of retries per transcript model call. Set to 0 to disable retries.
|
|
68
|
+
|
|
69
|
+
@default 2
|
|
70
|
+
*/
|
|
71
|
+
maxRetries?: number;
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
Abort signal.
|
|
75
|
+
*/
|
|
76
|
+
abortSignal?: AbortSignal;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
Additional headers to include in the request.
|
|
80
|
+
Only applicable for HTTP-based providers.
|
|
81
|
+
*/
|
|
82
|
+
headers?: Record<string, string>;
|
|
83
|
+
}): Promise<TranscriptionResult> {
|
|
84
|
+
const resolvedModel = resolveTranscriptionModel(model);
|
|
85
|
+
if (!resolvedModel) {
|
|
86
|
+
throw new Error('Model could not be resolved');
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const { retry } = prepareRetries({
|
|
90
|
+
maxRetries: maxRetriesArg,
|
|
91
|
+
abortSignal,
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
const headersWithUserAgent = withUserAgentSuffix(
|
|
95
|
+
headers ?? {},
|
|
96
|
+
`ai/${VERSION}`,
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
const audioData =
|
|
100
|
+
audio instanceof URL
|
|
101
|
+
? (await download({ url: audio })).data
|
|
102
|
+
: convertDataContentToUint8Array(audio);
|
|
103
|
+
|
|
104
|
+
const result = await retry(() =>
|
|
105
|
+
resolvedModel.doGenerate({
|
|
106
|
+
audio: audioData,
|
|
107
|
+
abortSignal,
|
|
108
|
+
headers: headersWithUserAgent,
|
|
109
|
+
providerOptions,
|
|
110
|
+
mediaType:
|
|
111
|
+
detectMediaType({
|
|
112
|
+
data: audioData,
|
|
113
|
+
signatures: audioMediaTypeSignatures,
|
|
114
|
+
}) ?? 'audio/wav',
|
|
115
|
+
}),
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
logWarnings({
|
|
119
|
+
warnings: result.warnings,
|
|
120
|
+
provider: resolvedModel.provider,
|
|
121
|
+
model: resolvedModel.modelId,
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
if (!result.text) {
|
|
125
|
+
throw new NoTranscriptGeneratedError({ responses: [result.response] });
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return new DefaultTranscriptionResult({
|
|
129
|
+
text: result.text,
|
|
130
|
+
segments: result.segments,
|
|
131
|
+
language: result.language,
|
|
132
|
+
durationInSeconds: result.durationInSeconds,
|
|
133
|
+
warnings: result.warnings,
|
|
134
|
+
responses: [result.response],
|
|
135
|
+
providerMetadata: result.providerMetadata,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
class DefaultTranscriptionResult implements TranscriptionResult {
|
|
140
|
+
readonly text: string;
|
|
141
|
+
readonly segments: Array<{
|
|
142
|
+
text: string;
|
|
143
|
+
startSecond: number;
|
|
144
|
+
endSecond: number;
|
|
145
|
+
}>;
|
|
146
|
+
readonly language: string | undefined;
|
|
147
|
+
readonly durationInSeconds: number | undefined;
|
|
148
|
+
readonly warnings: Array<Warning>;
|
|
149
|
+
readonly responses: Array<TranscriptionModelResponseMetadata>;
|
|
150
|
+
readonly providerMetadata: Record<string, JSONObject>;
|
|
151
|
+
|
|
152
|
+
constructor(options: {
|
|
153
|
+
text: string;
|
|
154
|
+
segments: Array<{
|
|
155
|
+
text: string;
|
|
156
|
+
startSecond: number;
|
|
157
|
+
endSecond: number;
|
|
158
|
+
}>;
|
|
159
|
+
language: string | undefined;
|
|
160
|
+
durationInSeconds: number | undefined;
|
|
161
|
+
warnings: Array<Warning>;
|
|
162
|
+
responses: Array<TranscriptionModelResponseMetadata>;
|
|
163
|
+
providerMetadata: Record<string, JSONObject> | undefined;
|
|
164
|
+
}) {
|
|
165
|
+
this.text = options.text;
|
|
166
|
+
this.segments = options.segments;
|
|
167
|
+
this.language = options.language;
|
|
168
|
+
this.durationInSeconds = options.durationInSeconds;
|
|
169
|
+
this.warnings = options.warnings;
|
|
170
|
+
this.responses = options.responses;
|
|
171
|
+
this.providerMetadata = options.providerMetadata ?? {};
|
|
172
|
+
}
|
|
173
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import {
|
|
2
|
+
EmbeddingModelV2,
|
|
3
|
+
EmbeddingModelV3,
|
|
4
|
+
EmbeddingModelV3Embedding,
|
|
5
|
+
} from '@ai-sdk/provider';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
Embedding model that is used by the AI SDK.
|
|
9
|
+
*/
|
|
10
|
+
export type EmbeddingModel =
|
|
11
|
+
| string
|
|
12
|
+
| EmbeddingModelV3
|
|
13
|
+
| EmbeddingModelV2<string>;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
Embedding.
|
|
17
|
+
*/
|
|
18
|
+
export type Embedding = EmbeddingModelV3Embedding;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type ImageModelResponseMetadata = {
|
|
2
|
+
/**
|
|
3
|
+
Timestamp for the start of the generated response.
|
|
4
|
+
*/
|
|
5
|
+
timestamp: Date;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
The ID of the response model that was used to generate the response.
|
|
9
|
+
*/
|
|
10
|
+
modelId: string;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
Response headers.
|
|
14
|
+
*/
|
|
15
|
+
headers?: Record<string, string>;
|
|
16
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ImageModelV2,
|
|
3
|
+
ImageModelV3,
|
|
4
|
+
ImageModelV3ProviderMetadata,
|
|
5
|
+
ImageModelV2ProviderMetadata,
|
|
6
|
+
} from '@ai-sdk/provider';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
Image model that is used by the AI SDK.
|
|
10
|
+
*/
|
|
11
|
+
export type ImageModel = string | ImageModelV3 | ImageModelV2;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
Metadata from the model provider for this call
|
|
15
|
+
*/
|
|
16
|
+
// TODO should this be v3 only?
|
|
17
|
+
export type ImageModelProviderMetadata =
|
|
18
|
+
| ImageModelV3ProviderMetadata
|
|
19
|
+
| ImageModelV2ProviderMetadata;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type { JSONSchema7 } from '@ai-sdk/provider';
|
|
2
|
+
export type { Embedding, EmbeddingModel } from './embedding-model';
|
|
3
|
+
export type { EmbeddingModelMiddleware } from './embedding-model-middleware';
|
|
4
|
+
export type { ImageModel, ImageModelProviderMetadata } from './image-model';
|
|
5
|
+
export type { ImageModelMiddleware } from './image-model-middleware';
|
|
6
|
+
export type { ImageModelResponseMetadata } from './image-model-response-metadata';
|
|
7
|
+
export type { JSONValue } from './json-value';
|
|
8
|
+
export type {
|
|
9
|
+
CallWarning,
|
|
10
|
+
FinishReason,
|
|
11
|
+
LanguageModel,
|
|
12
|
+
ToolChoice,
|
|
13
|
+
} from './language-model';
|
|
14
|
+
export type { LanguageModelMiddleware } from './language-model-middleware';
|
|
15
|
+
export type { LanguageModelRequestMetadata } from './language-model-request-metadata';
|
|
16
|
+
export type { LanguageModelResponseMetadata } from './language-model-response-metadata';
|
|
17
|
+
export type { Provider } from './provider';
|
|
18
|
+
export type { ProviderMetadata } from './provider-metadata';
|
|
19
|
+
export type { RerankingModel } from './reranking-model';
|
|
20
|
+
export type { SpeechModel } from './speech-model';
|
|
21
|
+
export type { SpeechModelResponseMetadata } from './speech-model-response-metadata';
|
|
22
|
+
export type { TranscriptionModel } from './transcription-model';
|
|
23
|
+
export type { TranscriptionModelResponseMetadata } from './transcription-model-response-metadata';
|
|
24
|
+
export type {
|
|
25
|
+
EmbeddingModelUsage,
|
|
26
|
+
ImageModelUsage,
|
|
27
|
+
LanguageModelUsage,
|
|
28
|
+
} from './usage';
|
|
29
|
+
export type { Warning } from './warning';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { JSONValue as OriginalJSONValue } from '@ai-sdk/provider';
|
|
2
|
+
import { z } from 'zod/v4';
|
|
3
|
+
|
|
4
|
+
export const jsonValueSchema: z.ZodType<JSONValue> = z.lazy(() =>
|
|
5
|
+
z.union([
|
|
6
|
+
z.null(),
|
|
7
|
+
z.string(),
|
|
8
|
+
z.number(),
|
|
9
|
+
z.boolean(),
|
|
10
|
+
z.record(z.string(), jsonValueSchema.optional()),
|
|
11
|
+
z.array(jsonValueSchema),
|
|
12
|
+
]),
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
export type JSONValue = OriginalJSONValue;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type LanguageModelResponseMetadata = {
|
|
2
|
+
/**
|
|
3
|
+
ID for the generated response.
|
|
4
|
+
*/
|
|
5
|
+
id: string;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
Timestamp for the start of the generated response.
|
|
9
|
+
*/
|
|
10
|
+
timestamp: Date;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
The ID of the response model that was used to generate the response.
|
|
14
|
+
*/
|
|
15
|
+
modelId: string;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
Response headers (available only for providers that use HTTP requests).
|
|
19
|
+
*/
|
|
20
|
+
headers?: Record<string, string>;
|
|
21
|
+
};
|