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,244 @@
|
|
|
1
|
+
import { gateway } from '@ai-sdk/gateway';
|
|
2
|
+
import { EmbeddingModelV2, LanguageModelV2 } from '@ai-sdk/provider';
|
|
3
|
+
import { beforeEach, afterEach, describe, expect, it, vi } from 'vitest';
|
|
4
|
+
|
|
5
|
+
import { MockEmbeddingModelV3 } from '../test/mock-embedding-model-v3';
|
|
6
|
+
import { MockLanguageModelV3 } from '../test/mock-language-model-v3';
|
|
7
|
+
import { customProvider } from '../registry/custom-provider';
|
|
8
|
+
import { MockImageModelV2 } from '../test/mock-image-model-v2';
|
|
9
|
+
import {
|
|
10
|
+
resolveEmbeddingModel,
|
|
11
|
+
resolveImageModel,
|
|
12
|
+
resolveLanguageModel,
|
|
13
|
+
} from './resolve-model';
|
|
14
|
+
|
|
15
|
+
describe('resolveLanguageModel', () => {
|
|
16
|
+
describe('when a language model v3 is provided', () => {
|
|
17
|
+
it('should return the language model v3', () => {
|
|
18
|
+
const resolvedModel = resolveLanguageModel(
|
|
19
|
+
new MockLanguageModelV3({
|
|
20
|
+
provider: 'test-provider',
|
|
21
|
+
modelId: 'test-model-id',
|
|
22
|
+
}),
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
expect(resolvedModel.provider).toBe('test-provider');
|
|
26
|
+
expect(resolvedModel.modelId).toBe('test-model-id');
|
|
27
|
+
expect(resolvedModel.specificationVersion).toBe('v3');
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
describe('when a language model v2 is provided', () => {
|
|
32
|
+
it('should adapt to v3 and preserve prototype methods', async () => {
|
|
33
|
+
class TestLanguageModelV2 implements LanguageModelV2 {
|
|
34
|
+
readonly specificationVersion = 'v2' as const;
|
|
35
|
+
readonly provider = 'test-provider';
|
|
36
|
+
readonly modelId = 'test-model-id';
|
|
37
|
+
readonly supportedUrls = {};
|
|
38
|
+
|
|
39
|
+
async doGenerate() {
|
|
40
|
+
return {
|
|
41
|
+
content: [],
|
|
42
|
+
finishReason: 'stop' as const,
|
|
43
|
+
usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },
|
|
44
|
+
warnings: [],
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async doStream() {
|
|
49
|
+
return { stream: new ReadableStream() };
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const v2 = new TestLanguageModelV2();
|
|
54
|
+
const resolvedModel = resolveLanguageModel(v2);
|
|
55
|
+
|
|
56
|
+
expect(resolvedModel.provider).toBe('test-provider');
|
|
57
|
+
expect(resolvedModel.modelId).toBe('test-model-id');
|
|
58
|
+
expect(resolvedModel.specificationVersion).toBe('v3');
|
|
59
|
+
|
|
60
|
+
await resolvedModel.doGenerate({
|
|
61
|
+
prompt: [{ role: 'user', content: [{ type: 'text', text: 'hello' }] }],
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
const { stream } = await resolvedModel.doStream({
|
|
65
|
+
prompt: [{ role: 'user', content: [{ type: 'text', text: 'hello' }] }],
|
|
66
|
+
});
|
|
67
|
+
expect(stream).toBeInstanceOf(ReadableStream);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
describe('when a string is provided and the global default provider is not set', () => {
|
|
72
|
+
it('should return a gateway language model', () => {
|
|
73
|
+
const resolvedModel = resolveLanguageModel('test-model-id');
|
|
74
|
+
|
|
75
|
+
expect(resolvedModel.provider).toBe('gateway');
|
|
76
|
+
expect(resolvedModel.modelId).toBe('test-model-id');
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
describe('when a string is provided and the global default provider is set', () => {
|
|
81
|
+
beforeEach(() => {
|
|
82
|
+
globalThis.AI_SDK_DEFAULT_PROVIDER = customProvider({
|
|
83
|
+
languageModels: {
|
|
84
|
+
'test-model-id': new MockLanguageModelV3({
|
|
85
|
+
provider: 'global-test-provider',
|
|
86
|
+
modelId: 'actual-test-model-id',
|
|
87
|
+
}),
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
afterEach(() => {
|
|
93
|
+
delete globalThis.AI_SDK_DEFAULT_PROVIDER;
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it('should return a language model from the global default provider', () => {
|
|
97
|
+
const resolvedModel = resolveLanguageModel('test-model-id');
|
|
98
|
+
|
|
99
|
+
expect(resolvedModel.provider).toBe('global-test-provider');
|
|
100
|
+
expect(resolvedModel.modelId).toBe('actual-test-model-id');
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
describe('resolveEmbeddingModel', () => {
|
|
106
|
+
describe('when an embedding model v2 is provided', () => {
|
|
107
|
+
it('should adapt to v3 and preserve prototype methods', async () => {
|
|
108
|
+
class TestEmbeddingModelV2 implements EmbeddingModelV2<string> {
|
|
109
|
+
readonly specificationVersion = 'v2' as const;
|
|
110
|
+
readonly provider = 'test-provider';
|
|
111
|
+
readonly modelId = 'test-model-id';
|
|
112
|
+
readonly maxEmbeddingsPerCall = 1;
|
|
113
|
+
readonly supportsParallelCalls = false;
|
|
114
|
+
|
|
115
|
+
async doEmbed() {
|
|
116
|
+
return { embeddings: [[0.1, 0.2, 0.3]] };
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const v2 = new TestEmbeddingModelV2();
|
|
121
|
+
const resolvedModel = resolveEmbeddingModel(v2);
|
|
122
|
+
|
|
123
|
+
expect(resolvedModel.provider).toBe('test-provider');
|
|
124
|
+
expect(resolvedModel.modelId).toBe('test-model-id');
|
|
125
|
+
expect(resolvedModel.specificationVersion).toBe('v3');
|
|
126
|
+
|
|
127
|
+
const result = await resolvedModel.doEmbed({ values: ['hello'] });
|
|
128
|
+
expect(result.embeddings).toHaveLength(1);
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
describe('when a embedding model v3 is provided', () => {
|
|
133
|
+
it('should return the embedding model v3', () => {
|
|
134
|
+
const resolvedModel = resolveEmbeddingModel(
|
|
135
|
+
new MockEmbeddingModelV3({
|
|
136
|
+
provider: 'test-provider',
|
|
137
|
+
modelId: 'test-model-id',
|
|
138
|
+
}),
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
expect(resolvedModel.provider).toBe('test-provider');
|
|
142
|
+
expect(resolvedModel.modelId).toBe('test-model-id');
|
|
143
|
+
expect(resolvedModel.specificationVersion).toBe('v3');
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
describe('when a string is provided and the global default provider is not set', () => {
|
|
148
|
+
it('should return a gateway embedding model', () => {
|
|
149
|
+
const resolvedModel = resolveEmbeddingModel('test-model-id');
|
|
150
|
+
|
|
151
|
+
expect(resolvedModel.provider).toBe('gateway');
|
|
152
|
+
expect(resolvedModel.modelId).toBe('test-model-id');
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
describe('when a string is provided and the global default provider is set', () => {
|
|
157
|
+
beforeEach(() => {
|
|
158
|
+
globalThis.AI_SDK_DEFAULT_PROVIDER = customProvider({
|
|
159
|
+
embeddingModels: {
|
|
160
|
+
'test-model-id': new MockEmbeddingModelV3({
|
|
161
|
+
provider: 'global-test-provider',
|
|
162
|
+
modelId: 'actual-test-model-id',
|
|
163
|
+
}),
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
afterEach(() => {
|
|
169
|
+
delete globalThis.AI_SDK_DEFAULT_PROVIDER;
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
it('should return a embedding model from the global default provider', () => {
|
|
173
|
+
const resolvedModel = resolveEmbeddingModel('test-model-id');
|
|
174
|
+
|
|
175
|
+
expect(resolvedModel.provider).toBe('global-test-provider');
|
|
176
|
+
expect(resolvedModel.modelId).toBe('actual-test-model-id');
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
describe('resolveImageModel', () => {
|
|
182
|
+
describe('when an image model v2 is provided', () => {
|
|
183
|
+
it('should return the image model v2', () => {
|
|
184
|
+
const resolvedModel = resolveImageModel(
|
|
185
|
+
new MockImageModelV2({
|
|
186
|
+
provider: 'test-provider',
|
|
187
|
+
modelId: 'test-model-id',
|
|
188
|
+
}),
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
expect(resolvedModel.provider).toBe('test-provider');
|
|
192
|
+
expect(resolvedModel.modelId).toBe('test-model-id');
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
describe('when a string is provided and the global default provider is not set', () => {
|
|
197
|
+
it('should return a gateway image model', () => {
|
|
198
|
+
const resolvedModel = resolveImageModel(
|
|
199
|
+
new MockImageModelV2({
|
|
200
|
+
provider: 'gateway',
|
|
201
|
+
modelId: 'test-model-id',
|
|
202
|
+
}),
|
|
203
|
+
);
|
|
204
|
+
|
|
205
|
+
const imageModelSpy = vi
|
|
206
|
+
.spyOn(gateway, 'imageModel')
|
|
207
|
+
.mockReturnValue(resolvedModel);
|
|
208
|
+
|
|
209
|
+
try {
|
|
210
|
+
const resolvedModel = resolveImageModel('test-model-id');
|
|
211
|
+
|
|
212
|
+
expect(resolvedModel).toBe(resolvedModel);
|
|
213
|
+
} finally {
|
|
214
|
+
imageModelSpy.mockRestore();
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
describe('when a string is provided and the global default provider is set', () => {
|
|
220
|
+
beforeEach(() => {
|
|
221
|
+
globalThis.AI_SDK_DEFAULT_PROVIDER = customProvider({
|
|
222
|
+
imageModels: {
|
|
223
|
+
'test-model-id': resolveImageModel(
|
|
224
|
+
new MockImageModelV2({
|
|
225
|
+
provider: 'global-test-provider',
|
|
226
|
+
modelId: 'actual-test-model-id',
|
|
227
|
+
}),
|
|
228
|
+
),
|
|
229
|
+
},
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
afterEach(() => {
|
|
234
|
+
delete globalThis.AI_SDK_DEFAULT_PROVIDER;
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
it('should return an image model from the global default provider', () => {
|
|
238
|
+
const resolvedModel = resolveImageModel('test-model-id');
|
|
239
|
+
|
|
240
|
+
expect(resolvedModel.provider).toBe('global-test-provider');
|
|
241
|
+
expect(resolvedModel.modelId).toBe('actual-test-model-id');
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
});
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { gateway } from '@ai-sdk/gateway';
|
|
2
|
+
import {
|
|
3
|
+
EmbeddingModelV3,
|
|
4
|
+
ImageModelV3,
|
|
5
|
+
LanguageModelV3,
|
|
6
|
+
ProviderV3,
|
|
7
|
+
SpeechModelV3,
|
|
8
|
+
TranscriptionModelV3,
|
|
9
|
+
} from '@ai-sdk/provider';
|
|
10
|
+
import { UnsupportedModelVersionError } from '../error';
|
|
11
|
+
import { EmbeddingModel } from '../types/embedding-model';
|
|
12
|
+
import { LanguageModel } from '../types/language-model';
|
|
13
|
+
import { SpeechModel } from '../types/speech-model';
|
|
14
|
+
import { TranscriptionModel } from '../types/transcription-model';
|
|
15
|
+
import { asEmbeddingModelV3 } from './as-embedding-model-v3';
|
|
16
|
+
import { asImageModelV3 } from './as-image-model-v3';
|
|
17
|
+
import { asLanguageModelV3 } from './as-language-model-v3';
|
|
18
|
+
import { asSpeechModelV3 } from './as-speech-model-v3';
|
|
19
|
+
import { asTranscriptionModelV3 } from './as-transcription-model-v3';
|
|
20
|
+
import { ImageModel } from '../types/image-model';
|
|
21
|
+
|
|
22
|
+
export function resolveLanguageModel(model: LanguageModel): LanguageModelV3 {
|
|
23
|
+
if (typeof model !== 'string') {
|
|
24
|
+
if (
|
|
25
|
+
model.specificationVersion !== 'v3' &&
|
|
26
|
+
model.specificationVersion !== 'v2'
|
|
27
|
+
) {
|
|
28
|
+
const unsupportedModel: any = model;
|
|
29
|
+
throw new UnsupportedModelVersionError({
|
|
30
|
+
version: unsupportedModel.specificationVersion,
|
|
31
|
+
provider: unsupportedModel.provider,
|
|
32
|
+
modelId: unsupportedModel.modelId,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return asLanguageModelV3(model);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return getGlobalProvider().languageModel(model);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function resolveEmbeddingModel(model: EmbeddingModel): EmbeddingModelV3 {
|
|
43
|
+
if (typeof model !== 'string') {
|
|
44
|
+
if (
|
|
45
|
+
model.specificationVersion !== 'v3' &&
|
|
46
|
+
model.specificationVersion !== 'v2'
|
|
47
|
+
) {
|
|
48
|
+
const unsupportedModel: any = model;
|
|
49
|
+
throw new UnsupportedModelVersionError({
|
|
50
|
+
version: unsupportedModel.specificationVersion,
|
|
51
|
+
provider: unsupportedModel.provider,
|
|
52
|
+
modelId: unsupportedModel.modelId,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return asEmbeddingModelV3(model);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return getGlobalProvider().embeddingModel(model);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function resolveTranscriptionModel(
|
|
63
|
+
model: TranscriptionModel,
|
|
64
|
+
): TranscriptionModelV3 | undefined {
|
|
65
|
+
if (typeof model !== 'string') {
|
|
66
|
+
if (
|
|
67
|
+
model.specificationVersion !== 'v3' &&
|
|
68
|
+
model.specificationVersion !== 'v2'
|
|
69
|
+
) {
|
|
70
|
+
const unsupportedModel: any = model;
|
|
71
|
+
throw new UnsupportedModelVersionError({
|
|
72
|
+
version: unsupportedModel.specificationVersion,
|
|
73
|
+
provider: unsupportedModel.provider,
|
|
74
|
+
modelId: unsupportedModel.modelId,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
return asTranscriptionModelV3(model);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return getGlobalProvider().transcriptionModel?.(model);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function resolveSpeechModel(
|
|
84
|
+
model: SpeechModel,
|
|
85
|
+
): SpeechModelV3 | undefined {
|
|
86
|
+
if (typeof model !== 'string') {
|
|
87
|
+
if (
|
|
88
|
+
model.specificationVersion !== 'v3' &&
|
|
89
|
+
model.specificationVersion !== 'v2'
|
|
90
|
+
) {
|
|
91
|
+
const unsupportedModel: any = model;
|
|
92
|
+
throw new UnsupportedModelVersionError({
|
|
93
|
+
version: unsupportedModel.specificationVersion,
|
|
94
|
+
provider: unsupportedModel.provider,
|
|
95
|
+
modelId: unsupportedModel.modelId,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
return asSpeechModelV3(model);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return getGlobalProvider().speechModel?.(model);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export function resolveImageModel(model: ImageModel): ImageModelV3 {
|
|
105
|
+
if (typeof model !== 'string') {
|
|
106
|
+
if (
|
|
107
|
+
model.specificationVersion !== 'v3' &&
|
|
108
|
+
model.specificationVersion !== 'v2'
|
|
109
|
+
) {
|
|
110
|
+
const unsupportedModel: any = model;
|
|
111
|
+
throw new UnsupportedModelVersionError({
|
|
112
|
+
version: unsupportedModel.specificationVersion,
|
|
113
|
+
provider: unsupportedModel.provider,
|
|
114
|
+
modelId: unsupportedModel.modelId,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return asImageModelV3(model);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return getGlobalProvider().imageModel(model);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function getGlobalProvider(): ProviderV3 {
|
|
125
|
+
return globalThis.AI_SDK_DEFAULT_PROVIDER ?? gateway;
|
|
126
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
Timeout configuration for API calls. Can be specified as:
|
|
3
|
+
- A number representing milliseconds
|
|
4
|
+
- An object with `totalMs` property for the total timeout in milliseconds
|
|
5
|
+
- An object with `stepMs` property for the timeout of each step in milliseconds
|
|
6
|
+
- An object with `chunkMs` property for the timeout between stream chunks (streaming only)
|
|
7
|
+
*/
|
|
8
|
+
export type TimeoutConfiguration =
|
|
9
|
+
| number
|
|
10
|
+
| { totalMs?: number; stepMs?: number; chunkMs?: number };
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
Extracts the total timeout value in milliseconds from a TimeoutConfiguration.
|
|
14
|
+
|
|
15
|
+
@param timeout - The timeout configuration.
|
|
16
|
+
@returns The total timeout in milliseconds, or undefined if no timeout is configured.
|
|
17
|
+
*/
|
|
18
|
+
export function getTotalTimeoutMs(
|
|
19
|
+
timeout: TimeoutConfiguration | undefined,
|
|
20
|
+
): number | undefined {
|
|
21
|
+
if (timeout == null) {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
if (typeof timeout === 'number') {
|
|
25
|
+
return timeout;
|
|
26
|
+
}
|
|
27
|
+
return timeout.totalMs;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
Extracts the step timeout value in milliseconds from a TimeoutConfiguration.
|
|
32
|
+
|
|
33
|
+
@param timeout - The timeout configuration.
|
|
34
|
+
@returns The step timeout in milliseconds, or undefined if no step timeout is configured.
|
|
35
|
+
*/
|
|
36
|
+
export function getStepTimeoutMs(
|
|
37
|
+
timeout: TimeoutConfiguration | undefined,
|
|
38
|
+
): number | undefined {
|
|
39
|
+
if (timeout == null || typeof timeout === 'number') {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
return timeout.stepMs;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
Extracts the chunk timeout value in milliseconds from a TimeoutConfiguration.
|
|
47
|
+
This timeout is for streaming only - it aborts if no new chunk is received within the specified duration.
|
|
48
|
+
|
|
49
|
+
@param timeout - The timeout configuration.
|
|
50
|
+
@returns The chunk timeout in milliseconds, or undefined if no chunk timeout is configured.
|
|
51
|
+
*/
|
|
52
|
+
export function getChunkTimeoutMs(
|
|
53
|
+
timeout: TimeoutConfiguration | undefined,
|
|
54
|
+
): number | undefined {
|
|
55
|
+
if (timeout == null || typeof timeout === 'number') {
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
return timeout.chunkMs;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export type CallSettings = {
|
|
62
|
+
/**
|
|
63
|
+
Maximum number of tokens to generate.
|
|
64
|
+
*/
|
|
65
|
+
maxOutputTokens?: number;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
Temperature setting. The range depends on the provider and model.
|
|
69
|
+
|
|
70
|
+
It is recommended to set either `temperature` or `topP`, but not both.
|
|
71
|
+
*/
|
|
72
|
+
temperature?: number;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
Nucleus sampling. This is a number between 0 and 1.
|
|
76
|
+
|
|
77
|
+
E.g. 0.1 would mean that only tokens with the top 10% probability mass
|
|
78
|
+
are considered.
|
|
79
|
+
|
|
80
|
+
It is recommended to set either `temperature` or `topP`, but not both.
|
|
81
|
+
*/
|
|
82
|
+
topP?: number;
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
Only sample from the top K options for each subsequent token.
|
|
86
|
+
|
|
87
|
+
Used to remove "long tail" low probability responses.
|
|
88
|
+
Recommended for advanced use cases only. You usually only need to use temperature.
|
|
89
|
+
*/
|
|
90
|
+
topK?: number;
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
Presence penalty setting. It affects the likelihood of the model to
|
|
94
|
+
repeat information that is already in the prompt.
|
|
95
|
+
|
|
96
|
+
The presence penalty is a number between -1 (increase repetition)
|
|
97
|
+
and 1 (maximum penalty, decrease repetition). 0 means no penalty.
|
|
98
|
+
*/
|
|
99
|
+
presencePenalty?: number;
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
Frequency penalty setting. It affects the likelihood of the model
|
|
103
|
+
to repeatedly use the same words or phrases.
|
|
104
|
+
|
|
105
|
+
The frequency penalty is a number between -1 (increase repetition)
|
|
106
|
+
and 1 (maximum penalty, decrease repetition). 0 means no penalty.
|
|
107
|
+
*/
|
|
108
|
+
frequencyPenalty?: number;
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
Stop sequences.
|
|
112
|
+
If set, the model will stop generating text when one of the stop sequences is generated.
|
|
113
|
+
Providers may have limits on the number of stop sequences.
|
|
114
|
+
*/
|
|
115
|
+
stopSequences?: string[];
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
The seed (integer) to use for random sampling. If set and supported
|
|
119
|
+
by the model, calls will generate deterministic results.
|
|
120
|
+
*/
|
|
121
|
+
seed?: number;
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
Maximum number of retries. Set to 0 to disable retries.
|
|
125
|
+
|
|
126
|
+
@default 2
|
|
127
|
+
*/
|
|
128
|
+
maxRetries?: number;
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
Abort signal.
|
|
132
|
+
*/
|
|
133
|
+
abortSignal?: AbortSignal;
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
Timeout in milliseconds. The call will be aborted if it takes longer
|
|
137
|
+
than the specified timeout. Can be used alongside abortSignal.
|
|
138
|
+
|
|
139
|
+
Can be specified as a number (milliseconds) or as an object with `totalMs`.
|
|
140
|
+
*/
|
|
141
|
+
timeout?: TimeoutConfiguration;
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
Additional HTTP headers to be sent with the request.
|
|
145
|
+
Only applicable for HTTP-based providers.
|
|
146
|
+
*/
|
|
147
|
+
headers?: Record<string, string | undefined>;
|
|
148
|
+
};
|