ai 6.0.33 → 6.0.34
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 +10 -0
- package/dist/index.js +1 -1
- package/dist/index.mjs +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/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 +34 -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/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 +8052 -0
- package/src/ui/process-ui-message-stream.ts +713 -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,99 @@
|
|
|
1
|
+
import { InvalidPromptError } from '@ai-sdk/provider';
|
|
2
|
+
import {
|
|
3
|
+
ModelMessage,
|
|
4
|
+
safeValidateTypes,
|
|
5
|
+
SystemModelMessage,
|
|
6
|
+
} from '@ai-sdk/provider-utils';
|
|
7
|
+
import { z } from 'zod/v4';
|
|
8
|
+
import { modelMessageSchema } from './message';
|
|
9
|
+
import { Prompt } from './prompt';
|
|
10
|
+
import { asArray } from '../util/as-array';
|
|
11
|
+
|
|
12
|
+
export type StandardizedPrompt = {
|
|
13
|
+
/**
|
|
14
|
+
* System message.
|
|
15
|
+
*/
|
|
16
|
+
system?: string | SystemModelMessage | Array<SystemModelMessage>;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Messages.
|
|
20
|
+
*/
|
|
21
|
+
messages: ModelMessage[];
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export async function standardizePrompt(
|
|
25
|
+
prompt: Prompt,
|
|
26
|
+
): Promise<StandardizedPrompt> {
|
|
27
|
+
if (prompt.prompt == null && prompt.messages == null) {
|
|
28
|
+
throw new InvalidPromptError({
|
|
29
|
+
prompt,
|
|
30
|
+
message: 'prompt or messages must be defined',
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (prompt.prompt != null && prompt.messages != null) {
|
|
35
|
+
throw new InvalidPromptError({
|
|
36
|
+
prompt,
|
|
37
|
+
message: 'prompt and messages cannot be defined at the same time',
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// validate that system is a string or a SystemModelMessage
|
|
42
|
+
if (
|
|
43
|
+
prompt.system != null &&
|
|
44
|
+
typeof prompt.system !== 'string' &&
|
|
45
|
+
!asArray(prompt.system).every(
|
|
46
|
+
message =>
|
|
47
|
+
typeof message === 'object' &&
|
|
48
|
+
message !== null &&
|
|
49
|
+
'role' in message &&
|
|
50
|
+
message.role === 'system',
|
|
51
|
+
)
|
|
52
|
+
) {
|
|
53
|
+
throw new InvalidPromptError({
|
|
54
|
+
prompt,
|
|
55
|
+
message:
|
|
56
|
+
'system must be a string, SystemModelMessage, or array of SystemModelMessage',
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
let messages: ModelMessage[];
|
|
61
|
+
|
|
62
|
+
if (prompt.prompt != null && typeof prompt.prompt === 'string') {
|
|
63
|
+
messages = [{ role: 'user', content: prompt.prompt }];
|
|
64
|
+
} else if (prompt.prompt != null && Array.isArray(prompt.prompt)) {
|
|
65
|
+
messages = prompt.prompt;
|
|
66
|
+
} else if (prompt.messages != null) {
|
|
67
|
+
messages = prompt.messages;
|
|
68
|
+
} else {
|
|
69
|
+
throw new InvalidPromptError({
|
|
70
|
+
prompt,
|
|
71
|
+
message: 'prompt or messages must be defined',
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (messages.length === 0) {
|
|
76
|
+
throw new InvalidPromptError({
|
|
77
|
+
prompt,
|
|
78
|
+
message: 'messages must not be empty',
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const validationResult = await safeValidateTypes({
|
|
83
|
+
value: messages,
|
|
84
|
+
schema: z.array(modelMessageSchema),
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
if (!validationResult.success) {
|
|
88
|
+
throw new InvalidPromptError({
|
|
89
|
+
prompt,
|
|
90
|
+
message: 'The messages do not match the ModelMessage[] schema.',
|
|
91
|
+
cause: validationResult.error,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return {
|
|
96
|
+
messages,
|
|
97
|
+
system: prompt.system,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { GatewayAuthenticationError } from '@ai-sdk/gateway';
|
|
2
|
+
import { AISDKError } from '@ai-sdk/provider';
|
|
3
|
+
|
|
4
|
+
export function wrapGatewayError(error: unknown): unknown {
|
|
5
|
+
if (!GatewayAuthenticationError.isInstance(error)) return error;
|
|
6
|
+
|
|
7
|
+
const isProductionEnv = process?.env.NODE_ENV === 'production';
|
|
8
|
+
const moreInfoURL = 'https://ai-sdk.dev/unauthenticated-ai-gateway';
|
|
9
|
+
|
|
10
|
+
if (isProductionEnv) {
|
|
11
|
+
return new AISDKError({
|
|
12
|
+
name: 'GatewayError',
|
|
13
|
+
message: `Unauthenticated. Configure AI_GATEWAY_API_KEY or use a provider module. Learn more: ${moreInfoURL}`,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
return Object.assign(
|
|
18
|
+
new Error(`\u001b[1m\u001b[31mUnauthenticated request to AI Gateway.\u001b[0m
|
|
19
|
+
|
|
20
|
+
To authenticate, set the \u001b[33mAI_GATEWAY_API_KEY\u001b[0m environment variable with your API key.
|
|
21
|
+
|
|
22
|
+
Alternatively, you can use a provider module instead of the AI Gateway.
|
|
23
|
+
|
|
24
|
+
Learn more: \u001b[34m${moreInfoURL}\u001b[0m
|
|
25
|
+
|
|
26
|
+
`),
|
|
27
|
+
{ name: 'GatewayAuthenticationError' },
|
|
28
|
+
);
|
|
29
|
+
}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { NoSuchModelError } from '@ai-sdk/provider';
|
|
2
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
3
|
+
import { MockEmbeddingModelV3 } from '../test/mock-embedding-model-v3';
|
|
4
|
+
import { MockImageModelV3 } from '../test/mock-image-model-v3';
|
|
5
|
+
import { MockLanguageModelV3 } from '../test/mock-language-model-v3';
|
|
6
|
+
import { MockRerankingModelV3 } from '../test/mock-reranking-model-v3';
|
|
7
|
+
import { MockSpeechModelV3 } from '../test/mock-speech-model-v3';
|
|
8
|
+
import { MockTranscriptionModelV3 } from '../test/mock-transcription-model-v3';
|
|
9
|
+
import { customProvider } from './custom-provider';
|
|
10
|
+
|
|
11
|
+
const mockLanguageModel = new MockLanguageModelV3();
|
|
12
|
+
const mockEmbeddingModel = new MockEmbeddingModelV3();
|
|
13
|
+
const mockRerankingModel = new MockRerankingModelV3();
|
|
14
|
+
const mockFallbackProvider = {
|
|
15
|
+
specificationVersion: 'v3' as const,
|
|
16
|
+
languageModel: vi.fn(),
|
|
17
|
+
embeddingModel: vi.fn(),
|
|
18
|
+
imageModel: vi.fn(),
|
|
19
|
+
transcriptionModel: vi.fn(),
|
|
20
|
+
speechModel: vi.fn(),
|
|
21
|
+
rerankingModel: vi.fn(),
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
describe('languageModel', () => {
|
|
25
|
+
it('should return the language model if it exists', () => {
|
|
26
|
+
const provider = customProvider({
|
|
27
|
+
languageModels: { 'test-model': mockLanguageModel },
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
expect(provider.languageModel('test-model')).toBe(mockLanguageModel);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('should use fallback provider if model not found and fallback exists', () => {
|
|
34
|
+
mockFallbackProvider.languageModel.mockReturnValue(mockLanguageModel);
|
|
35
|
+
|
|
36
|
+
const provider = customProvider({
|
|
37
|
+
fallbackProvider: mockFallbackProvider,
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
expect(provider.languageModel('test-model')).toBe(mockLanguageModel);
|
|
41
|
+
expect(mockFallbackProvider.languageModel).toHaveBeenCalledWith(
|
|
42
|
+
'test-model',
|
|
43
|
+
);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it('should throw NoSuchModelError if model not found and no fallback', () => {
|
|
47
|
+
const provider = customProvider({});
|
|
48
|
+
expect(() => provider.languageModel('test-model')).toThrow(
|
|
49
|
+
NoSuchModelError,
|
|
50
|
+
);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
describe('embeddingModel', () => {
|
|
55
|
+
it('should return the embedding model if it exists', () => {
|
|
56
|
+
const provider = customProvider({
|
|
57
|
+
embeddingModels: { 'test-model': mockEmbeddingModel },
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
expect(provider.embeddingModel('test-model')).toBe(mockEmbeddingModel);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it('should use fallback provider if model not found and fallback exists', () => {
|
|
64
|
+
mockFallbackProvider.embeddingModel.mockReturnValue(mockEmbeddingModel);
|
|
65
|
+
|
|
66
|
+
const provider = customProvider({
|
|
67
|
+
fallbackProvider: mockFallbackProvider,
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
expect(provider.embeddingModel('test-model')).toBe(mockEmbeddingModel);
|
|
71
|
+
expect(mockFallbackProvider.embeddingModel).toHaveBeenCalledWith(
|
|
72
|
+
'test-model',
|
|
73
|
+
);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it('should throw NoSuchModelError if model not found and no fallback', () => {
|
|
77
|
+
const provider = customProvider({});
|
|
78
|
+
|
|
79
|
+
expect(() => provider.embeddingModel('test-model')).toThrow(
|
|
80
|
+
NoSuchModelError,
|
|
81
|
+
);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
describe('imageModel', () => {
|
|
86
|
+
const mockImageModel = new MockImageModelV3();
|
|
87
|
+
|
|
88
|
+
it('should return the image model if it exists', () => {
|
|
89
|
+
const provider = customProvider({
|
|
90
|
+
imageModels: { 'test-model': mockImageModel },
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
expect(provider.imageModel('test-model')).toBe(mockImageModel);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it('should use fallback provider if model not found and fallback exists', () => {
|
|
97
|
+
mockFallbackProvider.imageModel = vi.fn().mockReturnValue(mockImageModel);
|
|
98
|
+
|
|
99
|
+
const provider = customProvider({
|
|
100
|
+
fallbackProvider: mockFallbackProvider,
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
expect(provider.imageModel('test-model')).toBe(mockImageModel);
|
|
104
|
+
expect(mockFallbackProvider.imageModel).toHaveBeenCalledWith('test-model');
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it('should throw NoSuchModelError if model not found and no fallback', () => {
|
|
108
|
+
const provider = customProvider({});
|
|
109
|
+
|
|
110
|
+
expect(() => provider.imageModel('test-model')).toThrow(NoSuchModelError);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
describe('transcriptionModel', () => {
|
|
115
|
+
const mockTranscriptionModel = new MockTranscriptionModelV3();
|
|
116
|
+
|
|
117
|
+
it('should return the transcription model if it exists', () => {
|
|
118
|
+
const provider = customProvider({
|
|
119
|
+
transcriptionModels: { 'test-model': mockTranscriptionModel },
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
expect(provider.transcriptionModel('test-model')).toBe(
|
|
123
|
+
mockTranscriptionModel,
|
|
124
|
+
);
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
it('should use fallback provider if model not found and fallback exists', () => {
|
|
128
|
+
mockFallbackProvider.transcriptionModel = vi
|
|
129
|
+
.fn()
|
|
130
|
+
.mockReturnValue(mockTranscriptionModel);
|
|
131
|
+
|
|
132
|
+
const provider = customProvider({
|
|
133
|
+
fallbackProvider: mockFallbackProvider,
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
expect(provider.transcriptionModel('test-model')).toBe(
|
|
137
|
+
mockTranscriptionModel,
|
|
138
|
+
);
|
|
139
|
+
expect(mockFallbackProvider.transcriptionModel).toHaveBeenCalledWith(
|
|
140
|
+
'test-model',
|
|
141
|
+
);
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it('should throw NoSuchModelError if model not found and no fallback', () => {
|
|
145
|
+
const provider = customProvider({});
|
|
146
|
+
|
|
147
|
+
expect(() => provider.transcriptionModel('test-model')).toThrow(
|
|
148
|
+
NoSuchModelError,
|
|
149
|
+
);
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
describe('speechModel', () => {
|
|
154
|
+
const mockSpeechModel = new MockSpeechModelV3();
|
|
155
|
+
|
|
156
|
+
it('should return the speech model if it exists', () => {
|
|
157
|
+
const provider = customProvider({
|
|
158
|
+
speechModels: { 'test-model': mockSpeechModel },
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
expect(provider.speechModel('test-model')).toBe(mockSpeechModel);
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
it('should use fallback provider if model not found and fallback exists', () => {
|
|
165
|
+
mockFallbackProvider.speechModel = vi.fn().mockReturnValue(mockSpeechModel);
|
|
166
|
+
|
|
167
|
+
const provider = customProvider({
|
|
168
|
+
fallbackProvider: mockFallbackProvider,
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
expect(provider.speechModel('test-model')).toBe(mockSpeechModel);
|
|
172
|
+
expect(mockFallbackProvider.speechModel).toHaveBeenCalledWith('test-model');
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
it('should throw NoSuchModelError if model not found and no fallback', () => {
|
|
176
|
+
const provider = customProvider({});
|
|
177
|
+
|
|
178
|
+
expect(() => provider.speechModel('test-model')).toThrow(NoSuchModelError);
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
describe('rerankingModel', () => {
|
|
183
|
+
it('should return the reranking model if it exists', () => {
|
|
184
|
+
const provider = customProvider({
|
|
185
|
+
rerankingModels: { 'test-model': mockRerankingModel },
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
expect(provider.rerankingModel('test-model')).toBe(mockRerankingModel);
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
it('should use fallback provider if model not found and fallback exists', () => {
|
|
192
|
+
mockFallbackProvider.rerankingModel.mockReturnValue(mockRerankingModel);
|
|
193
|
+
|
|
194
|
+
const provider = customProvider({
|
|
195
|
+
fallbackProvider: mockFallbackProvider,
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
expect(provider.rerankingModel('test-model')).toBe(mockRerankingModel);
|
|
199
|
+
expect(mockFallbackProvider.rerankingModel).toHaveBeenCalledWith(
|
|
200
|
+
'test-model',
|
|
201
|
+
);
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
it('should throw NoSuchModelError if model not found and no fallback', () => {
|
|
205
|
+
const provider = customProvider({});
|
|
206
|
+
|
|
207
|
+
expect(() => provider.rerankingModel('test-model')).toThrow(
|
|
208
|
+
NoSuchModelError,
|
|
209
|
+
);
|
|
210
|
+
});
|
|
211
|
+
});
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import {
|
|
2
|
+
EmbeddingModelV3,
|
|
3
|
+
ImageModelV3,
|
|
4
|
+
LanguageModelV3,
|
|
5
|
+
NoSuchModelError,
|
|
6
|
+
ProviderV2,
|
|
7
|
+
ProviderV3,
|
|
8
|
+
RerankingModelV3,
|
|
9
|
+
SpeechModelV3,
|
|
10
|
+
TranscriptionModelV3,
|
|
11
|
+
} from '@ai-sdk/provider';
|
|
12
|
+
import { asProviderV3 } from '../model/as-provider-v3';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Creates a custom provider with specified language models, text embedding models, image models, transcription models, speech models, and an optional fallback provider.
|
|
16
|
+
*
|
|
17
|
+
* @param {Object} options - The options for creating the custom provider.
|
|
18
|
+
* @param {Record<string, LanguageModel>} [options.languageModels] - A record of language models, where keys are model IDs and values are LanguageModel instances.
|
|
19
|
+
* @param {Record<string, EmbeddingModel>} [options.embeddingModels] - A record of text embedding models, where keys are model IDs and values are EmbeddingModel instances.
|
|
20
|
+
* @param {Record<string, ImageModel>} [options.imageModels] - A record of image models, where keys are model IDs and values are ImageModel instances.
|
|
21
|
+
* @param {Record<string, TranscriptionModel>} [options.transcriptionModels] - A record of transcription models, where keys are model IDs and values are TranscriptionModel instances.
|
|
22
|
+
* @param {Record<string, SpeechModel>} [options.speechModels] - A record of speech models, where keys are model IDs and values are SpeechModel instances.
|
|
23
|
+
* @param {Record<string, RerankingModel>} [options.rerankingModels] - A record of reranking models, where keys are model IDs and values are RerankingModel instances.
|
|
24
|
+
* @param {Provider} [options.fallbackProvider] - An optional fallback provider to use when a requested model is not found in the custom provider.
|
|
25
|
+
* @returns {Provider} A Provider object with languageModel, embeddingModel, imageModel, transcriptionModel, and speechModel methods.
|
|
26
|
+
*
|
|
27
|
+
* @throws {NoSuchModelError} Throws when a requested model is not found and no fallback provider is available.
|
|
28
|
+
*/
|
|
29
|
+
export function customProvider<
|
|
30
|
+
LANGUAGE_MODELS extends Record<string, LanguageModelV3>,
|
|
31
|
+
EMBEDDING_MODELS extends Record<string, EmbeddingModelV3>,
|
|
32
|
+
IMAGE_MODELS extends Record<string, ImageModelV3>,
|
|
33
|
+
TRANSCRIPTION_MODELS extends Record<string, TranscriptionModelV3>,
|
|
34
|
+
SPEECH_MODELS extends Record<string, SpeechModelV3>,
|
|
35
|
+
RERANKING_MODELS extends Record<string, RerankingModelV3>,
|
|
36
|
+
>({
|
|
37
|
+
languageModels,
|
|
38
|
+
embeddingModels,
|
|
39
|
+
imageModels,
|
|
40
|
+
transcriptionModels,
|
|
41
|
+
speechModels,
|
|
42
|
+
rerankingModels,
|
|
43
|
+
fallbackProvider: fallbackProviderArg,
|
|
44
|
+
}: {
|
|
45
|
+
languageModels?: LANGUAGE_MODELS;
|
|
46
|
+
embeddingModels?: EMBEDDING_MODELS;
|
|
47
|
+
imageModels?: IMAGE_MODELS;
|
|
48
|
+
transcriptionModels?: TRANSCRIPTION_MODELS;
|
|
49
|
+
speechModels?: SPEECH_MODELS;
|
|
50
|
+
rerankingModels?: RERANKING_MODELS;
|
|
51
|
+
fallbackProvider?: ProviderV3 | ProviderV2;
|
|
52
|
+
}): ProviderV3 & {
|
|
53
|
+
languageModel(modelId: ExtractModelId<LANGUAGE_MODELS>): LanguageModelV3;
|
|
54
|
+
embeddingModel(modelId: ExtractModelId<EMBEDDING_MODELS>): EmbeddingModelV3;
|
|
55
|
+
imageModel(modelId: ExtractModelId<IMAGE_MODELS>): ImageModelV3;
|
|
56
|
+
transcriptionModel(
|
|
57
|
+
modelId: ExtractModelId<TRANSCRIPTION_MODELS>,
|
|
58
|
+
): TranscriptionModelV3;
|
|
59
|
+
rerankingModel(modelId: ExtractModelId<RERANKING_MODELS>): RerankingModelV3;
|
|
60
|
+
speechModel(modelId: ExtractModelId<SPEECH_MODELS>): SpeechModelV3;
|
|
61
|
+
} {
|
|
62
|
+
const fallbackProvider = fallbackProviderArg
|
|
63
|
+
? asProviderV3(fallbackProviderArg)
|
|
64
|
+
: undefined;
|
|
65
|
+
|
|
66
|
+
return {
|
|
67
|
+
specificationVersion: 'v3',
|
|
68
|
+
languageModel(modelId: ExtractModelId<LANGUAGE_MODELS>): LanguageModelV3 {
|
|
69
|
+
if (languageModels != null && modelId in languageModels) {
|
|
70
|
+
return languageModels[modelId];
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (fallbackProvider) {
|
|
74
|
+
return (fallbackProvider as ProviderV3).languageModel(modelId);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
throw new NoSuchModelError({ modelId, modelType: 'languageModel' });
|
|
78
|
+
},
|
|
79
|
+
|
|
80
|
+
embeddingModel(
|
|
81
|
+
modelId: ExtractModelId<EMBEDDING_MODELS>,
|
|
82
|
+
): EmbeddingModelV3 {
|
|
83
|
+
if (embeddingModels != null && modelId in embeddingModels) {
|
|
84
|
+
return embeddingModels[modelId];
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (fallbackProvider) {
|
|
88
|
+
return (fallbackProvider as ProviderV3).embeddingModel(modelId);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });
|
|
92
|
+
},
|
|
93
|
+
|
|
94
|
+
imageModel(modelId: ExtractModelId<IMAGE_MODELS>): ImageModelV3 {
|
|
95
|
+
if (imageModels != null && modelId in imageModels) {
|
|
96
|
+
return imageModels[modelId];
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (fallbackProvider?.imageModel) {
|
|
100
|
+
return (fallbackProvider as ProviderV3).imageModel(modelId);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
throw new NoSuchModelError({ modelId, modelType: 'imageModel' });
|
|
104
|
+
},
|
|
105
|
+
|
|
106
|
+
transcriptionModel(
|
|
107
|
+
modelId: ExtractModelId<TRANSCRIPTION_MODELS>,
|
|
108
|
+
): TranscriptionModelV3 {
|
|
109
|
+
if (transcriptionModels != null && modelId in transcriptionModels) {
|
|
110
|
+
return transcriptionModels[modelId];
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (fallbackProvider?.transcriptionModel) {
|
|
114
|
+
return (fallbackProvider as ProviderV3).transcriptionModel!(modelId);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
throw new NoSuchModelError({ modelId, modelType: 'transcriptionModel' });
|
|
118
|
+
},
|
|
119
|
+
|
|
120
|
+
speechModel(modelId: ExtractModelId<SPEECH_MODELS>): SpeechModelV3 {
|
|
121
|
+
if (speechModels != null && modelId in speechModels) {
|
|
122
|
+
return speechModels[modelId];
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (fallbackProvider?.speechModel) {
|
|
126
|
+
return (fallbackProvider as ProviderV3).speechModel!(modelId);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
throw new NoSuchModelError({ modelId, modelType: 'speechModel' });
|
|
130
|
+
},
|
|
131
|
+
rerankingModel(
|
|
132
|
+
modelId: ExtractModelId<RERANKING_MODELS>,
|
|
133
|
+
): RerankingModelV3 {
|
|
134
|
+
if (rerankingModels != null && modelId in rerankingModels) {
|
|
135
|
+
return rerankingModels[modelId];
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (fallbackProvider?.rerankingModel) {
|
|
139
|
+
return fallbackProvider.rerankingModel(modelId);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
throw new NoSuchModelError({ modelId, modelType: 'rerankingModel' });
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* @deprecated Use `customProvider` instead.
|
|
149
|
+
*/
|
|
150
|
+
export const experimental_customProvider = customProvider;
|
|
151
|
+
|
|
152
|
+
type ExtractModelId<MODELS extends Record<string, unknown>> = Extract<
|
|
153
|
+
keyof MODELS,
|
|
154
|
+
string
|
|
155
|
+
>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { customProvider, experimental_customProvider } from './custom-provider';
|
|
2
|
+
export { NoSuchProviderError } from './no-such-provider-error';
|
|
3
|
+
export {
|
|
4
|
+
createProviderRegistry,
|
|
5
|
+
experimental_createProviderRegistry,
|
|
6
|
+
} from './provider-registry';
|
|
7
|
+
export type { ProviderRegistryProvider } from './provider-registry';
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { AISDKError, NoSuchModelError } from '@ai-sdk/provider';
|
|
2
|
+
|
|
3
|
+
const name = 'AI_NoSuchProviderError';
|
|
4
|
+
const marker = `vercel.ai.error.${name}`;
|
|
5
|
+
const symbol = Symbol.for(marker);
|
|
6
|
+
|
|
7
|
+
export class NoSuchProviderError extends NoSuchModelError {
|
|
8
|
+
private readonly [symbol] = true; // used in isInstance
|
|
9
|
+
|
|
10
|
+
readonly providerId: string;
|
|
11
|
+
readonly availableProviders: string[];
|
|
12
|
+
|
|
13
|
+
constructor({
|
|
14
|
+
modelId,
|
|
15
|
+
modelType,
|
|
16
|
+
providerId,
|
|
17
|
+
availableProviders,
|
|
18
|
+
message = `No such provider: ${providerId} (available providers: ${availableProviders.join()})`,
|
|
19
|
+
}: {
|
|
20
|
+
modelId: string;
|
|
21
|
+
modelType:
|
|
22
|
+
| 'languageModel'
|
|
23
|
+
| 'embeddingModel'
|
|
24
|
+
| 'imageModel'
|
|
25
|
+
| 'transcriptionModel'
|
|
26
|
+
| 'speechModel'
|
|
27
|
+
| 'rerankingModel';
|
|
28
|
+
providerId: string;
|
|
29
|
+
availableProviders: string[];
|
|
30
|
+
message?: string;
|
|
31
|
+
}) {
|
|
32
|
+
super({ errorName: name, modelId, modelType, message });
|
|
33
|
+
|
|
34
|
+
this.providerId = providerId;
|
|
35
|
+
this.availableProviders = availableProviders;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
static isInstance(error: unknown): error is NoSuchProviderError {
|
|
39
|
+
return AISDKError.hasMarker(error, marker);
|
|
40
|
+
}
|
|
41
|
+
}
|