ai 7.0.0-beta.113 → 7.0.0-beta.115
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 +32 -0
- package/dist/index.d.ts +1506 -1468
- package/dist/index.js +889 -979
- package/dist/index.js.map +1 -1
- package/dist/internal/index.d.ts +273 -273
- package/dist/internal/index.js +367 -405
- package/dist/internal/index.js.map +1 -1
- package/dist/test/index.d.ts +18 -18
- package/dist/test/index.js +22 -22
- package/dist/test/index.js.map +1 -1
- package/docs/02-foundations/03-prompts.mdx +13 -11
- package/docs/03-ai-sdk-core/15-tools-and-tool-calling.mdx +2 -1
- package/docs/03-ai-sdk-core/39-file-uploads.mdx +1 -1
- package/docs/03-ai-sdk-core/45-provider-management.mdx +1 -1
- package/docs/03-ai-sdk-core/60-telemetry.mdx +87 -13
- package/docs/07-reference/01-ai-sdk-core/12-generate-speech.mdx +2 -2
- package/docs/07-reference/01-ai-sdk-core/20-tool.mdx +7 -0
- package/docs/07-reference/01-ai-sdk-core/22-dynamic-tool.mdx +7 -0
- package/docs/07-reference/01-ai-sdk-core/30-model-message.mdx +9 -1
- package/docs/07-reference/01-ai-sdk-core/40-provider-registry.mdx +104 -0
- package/docs/07-reference/01-ai-sdk-core/42-custom-provider.mdx +56 -10
- package/docs/07-reference/02-ai-sdk-ui/31-convert-to-model-messages.mdx +1 -1
- package/docs/08-migration-guides/23-migration-guide-7-0.mdx +42 -0
- package/docs/09-troubleshooting/70-high-memory-usage-with-images.mdx +2 -2
- package/package.json +5 -5
- package/src/agent/agent.ts +13 -9
- package/src/agent/create-agent-ui-stream-response.ts +8 -8
- package/src/agent/create-agent-ui-stream.ts +9 -9
- package/src/agent/infer-agent-tools.ts +1 -1
- package/src/agent/infer-agent-ui-message.ts +2 -2
- package/src/agent/pipe-agent-ui-stream-to-response.ts +9 -9
- package/src/agent/tool-loop-agent-settings.ts +17 -19
- package/src/agent/tool-loop-agent.ts +16 -8
- package/src/embed/embed-many-result.ts +3 -4
- package/src/embed/embed-many.ts +5 -5
- package/src/embed/embed-result.ts +3 -4
- package/src/embed/embed.ts +4 -4
- package/src/error/invalid-stream-part-error.ts +1 -1
- package/src/error/no-image-generated-error.ts +1 -1
- package/src/error/no-object-generated-error.ts +3 -3
- package/src/error/no-speech-generated-error.ts +1 -1
- package/src/error/no-transcript-generated-error.ts +1 -1
- package/src/error/no-video-generated-error.ts +1 -1
- package/src/error/tool-call-repair-error.ts +2 -2
- package/src/error/verify-no-object-generated-error.ts +1 -1
- package/src/generate-image/generate-image-result.ts +5 -5
- package/src/generate-image/generate-image.ts +12 -15
- package/src/generate-image/index.ts +3 -2
- package/src/generate-object/generate-object-result.ts +2 -2
- package/src/generate-object/generate-object.ts +14 -14
- package/src/generate-object/inject-json-instruction.ts +1 -1
- package/src/generate-object/output-strategy.ts +10 -10
- package/src/generate-object/parse-and-validate-object-result.ts +1 -1
- package/src/generate-object/repair-text.ts +1 -1
- package/src/generate-object/stream-object-result.ts +4 -4
- package/src/generate-object/stream-object.ts +22 -19
- package/src/generate-object/validate-object-generation-input.ts +1 -1
- package/src/generate-speech/generate-speech-result.ts +4 -4
- package/src/generate-speech/generate-speech.ts +12 -13
- package/src/generate-speech/generated-audio-file.ts +1 -2
- package/src/generate-text/collect-tool-approvals.ts +4 -4
- package/src/generate-text/content-part.ts +9 -9
- package/src/generate-text/create-execute-tools-transformation.ts +9 -7
- package/src/generate-text/execute-tool-call.ts +11 -13
- package/src/generate-text/extract-reasoning-content.ts +1 -1
- package/src/generate-text/extract-text-content.ts +4 -1
- package/src/generate-text/generate-text-events.ts +2 -2
- package/src/generate-text/generate-text-result.ts +18 -14
- package/src/generate-text/generate-text.ts +42 -38
- package/src/generate-text/invoke-tool-callbacks-from-stream.ts +2 -3
- package/src/generate-text/output-utils.ts +1 -1
- package/src/generate-text/output.ts +8 -8
- package/src/generate-text/parse-tool-call.ts +36 -9
- package/src/generate-text/prepare-step.ts +3 -5
- package/src/generate-text/prune-messages.ts +1 -1
- package/src/generate-text/reasoning-output.ts +26 -9
- package/src/generate-text/reasoning.ts +1 -1
- package/src/generate-text/resolve-tool-approval.ts +3 -3
- package/src/generate-text/response-message.ts +1 -1
- package/src/generate-text/restricted-telemetry-dispatcher.ts +1 -1
- package/src/generate-text/smooth-stream.ts +6 -5
- package/src/generate-text/step-result.ts +16 -11
- package/src/generate-text/stop-condition.ts +1 -1
- package/src/generate-text/stream-language-model-call.ts +26 -21
- package/src/generate-text/stream-text-result.ts +29 -26
- package/src/generate-text/stream-text.ts +48 -46
- package/src/generate-text/to-response-messages.ts +2 -2
- package/src/generate-text/tool-approval-configuration.ts +2 -2
- package/src/generate-text/tool-approval-request-output.ts +1 -1
- package/src/generate-text/tool-approval-response-output.ts +1 -1
- package/src/generate-text/tool-call-repair-function.ts +4 -4
- package/src/generate-text/tool-call.ts +3 -4
- package/src/generate-text/tool-error.ts +3 -4
- package/src/generate-text/tool-execution-events.ts +2 -2
- package/src/generate-text/tool-output-denied.ts +1 -1
- package/src/generate-text/tool-output.ts +2 -2
- package/src/generate-text/tool-result.ts +7 -4
- package/src/generate-text/tools-context-parameter.ts +1 -1
- package/src/generate-text/validate-tool-context.ts +1 -2
- package/src/generate-video/generate-video-result.ts +4 -4
- package/src/generate-video/generate-video.ts +6 -10
- package/src/global.ts +2 -2
- package/src/index.ts +3 -3
- package/src/logger/log-warnings.ts +1 -1
- package/src/middleware/add-tool-input-examples-middleware.ts +2 -2
- package/src/middleware/default-embedding-settings-middleware.ts +2 -2
- package/src/middleware/default-settings-middleware.ts +2 -2
- package/src/middleware/extract-json-middleware.ts +1 -1
- package/src/middleware/extract-reasoning-middleware.ts +1 -1
- package/src/middleware/simulate-streaming-middleware.ts +1 -1
- package/src/middleware/wrap-embedding-model.ts +2 -2
- package/src/middleware/wrap-image-model.ts +2 -2
- package/src/middleware/wrap-language-model.ts +2 -2
- package/src/middleware/wrap-provider.ts +2 -2
- package/src/model/as-embedding-model-v3.ts +1 -1
- package/src/model/as-embedding-model-v4.ts +1 -1
- package/src/model/as-image-model-v3.ts +1 -1
- package/src/model/as-image-model-v4.ts +5 -1
- package/src/model/as-language-model-v3.ts +1 -1
- package/src/model/as-language-model-v4.ts +1 -1
- package/src/model/as-provider-v3.ts +1 -1
- package/src/model/as-provider-v4.ts +1 -1
- package/src/model/as-reranking-model-v4.ts +1 -1
- package/src/model/as-speech-model-v3.ts +1 -1
- package/src/model/as-speech-model-v4.ts +5 -1
- package/src/model/as-transcription-model-v3.ts +4 -1
- package/src/model/as-transcription-model-v4.ts +1 -1
- package/src/model/as-video-model-v4.ts +1 -1
- package/src/model/resolve-model.ts +8 -8
- package/src/prompt/content-part.ts +45 -15
- package/src/prompt/convert-to-language-model-prompt.ts +108 -122
- package/src/prompt/create-tool-model-output.ts +2 -2
- package/src/prompt/data-content.ts +1 -78
- package/src/prompt/file-part-data.ts +125 -0
- package/src/prompt/index.ts +3 -2
- package/src/prompt/language-model-call-options.ts +1 -1
- package/src/prompt/message-conversion-error.ts +1 -1
- package/src/prompt/message.ts +1 -1
- package/src/prompt/prepare-language-model-call-options.ts +1 -1
- package/src/prompt/prepare-tool-choice.ts +2 -2
- package/src/prompt/prepare-tools.ts +2 -2
- package/src/prompt/prompt.ts +1 -1
- package/src/prompt/standardize-prompt.ts +3 -3
- package/src/registry/custom-provider.ts +127 -92
- package/src/registry/index.ts +1 -1
- package/src/registry/provider-registry.ts +91 -87
- package/src/rerank/rerank-result.ts +1 -1
- package/src/rerank/rerank.ts +8 -5
- package/src/telemetry/create-telemetry-dispatcher.ts +11 -1
- package/src/telemetry/diagnostic-channel-publisher.ts +50 -0
- package/src/telemetry/diagnostic-channel.ts +24 -0
- package/src/telemetry/index.ts +5 -0
- package/src/telemetry/telemetry.ts +1 -1
- package/src/test/mock-embedding-model-v2.ts +1 -1
- package/src/test/mock-embedding-model-v3.ts +1 -1
- package/src/test/mock-embedding-model-v4.ts +1 -1
- package/src/test/mock-image-model-v2.ts +1 -1
- package/src/test/mock-image-model-v3.ts +1 -1
- package/src/test/mock-image-model-v4.ts +1 -1
- package/src/test/mock-language-model-v2.ts +1 -1
- package/src/test/mock-language-model-v3.ts +1 -1
- package/src/test/mock-language-model-v4.ts +1 -1
- package/src/test/mock-provider-v2.ts +6 -7
- package/src/test/mock-provider-v3.ts +7 -8
- package/src/test/mock-provider-v4.ts +7 -8
- package/src/test/mock-reranking-model-v3.ts +1 -1
- package/src/test/mock-reranking-model-v4.ts +1 -1
- package/src/test/mock-server-response.ts +1 -1
- package/src/test/mock-speech-model-v2.ts +1 -1
- package/src/test/mock-speech-model-v3.ts +1 -1
- package/src/test/mock-speech-model-v4.ts +1 -1
- package/src/test/mock-transcription-model-v2.ts +1 -1
- package/src/test/mock-transcription-model-v3.ts +1 -1
- package/src/test/mock-transcription-model-v4.ts +1 -1
- package/src/test/mock-video-model-v3.ts +1 -1
- package/src/test/mock-video-model-v4.ts +1 -1
- package/src/text-stream/pipe-text-stream-to-response.ts +1 -1
- package/src/transcribe/transcribe-result.ts +3 -3
- package/src/transcribe/transcribe.ts +12 -12
- package/src/types/embedding-model-middleware.ts +1 -1
- package/src/types/embedding-model.ts +1 -1
- package/src/types/image-model-middleware.ts +1 -1
- package/src/types/image-model.ts +1 -1
- package/src/types/json-value.ts +1 -1
- package/src/types/language-model-middleware.ts +1 -1
- package/src/types/language-model.ts +2 -2
- package/src/types/provider-metadata.ts +1 -1
- package/src/types/provider-reference.ts +1 -1
- package/src/types/provider.ts +4 -4
- package/src/types/reranking-model.ts +1 -1
- package/src/types/speech-model.ts +5 -1
- package/src/types/transcription-model.ts +1 -1
- package/src/types/usage.ts +1 -1
- package/src/types/video-model.ts +1 -1
- package/src/types/warning.ts +1 -1
- package/src/ui/call-completion-api.ts +2 -2
- package/src/ui/chat-transport.ts +3 -3
- package/src/ui/chat.ts +10 -11
- package/src/ui/convert-file-list-to-file-ui-parts.ts +1 -1
- package/src/ui/convert-to-model-messages.ts +34 -23
- package/src/ui/default-chat-transport.ts +4 -4
- package/src/ui/direct-chat-transport.ts +6 -6
- package/src/ui/http-chat-transport.ts +5 -5
- package/src/ui/last-assistant-message-is-complete-with-approval-responses.ts +0 -1
- package/src/ui/last-assistant-message-is-complete-with-tool-calls.ts +0 -1
- package/src/ui/process-ui-message-stream.ts +20 -21
- package/src/ui/text-stream-chat-transport.ts +3 -3
- package/src/ui/transform-text-to-ui-message-stream.ts +1 -1
- package/src/ui/ui-messages.ts +13 -6
- package/src/ui/use-completion.ts +1 -1
- package/src/ui/validate-ui-messages.ts +3 -3
- package/src/ui-message-stream/create-ui-message-stream-response.ts +2 -2
- package/src/ui-message-stream/create-ui-message-stream.ts +6 -6
- package/src/ui-message-stream/get-response-ui-message-id.ts +2 -2
- package/src/ui-message-stream/handle-ui-message-stream-finish.ts +6 -6
- package/src/ui-message-stream/pipe-ui-message-stream-to-response.ts +3 -3
- package/src/ui-message-stream/read-ui-message-stream.ts +4 -4
- package/src/ui-message-stream/ui-message-chunks.ts +4 -4
- package/src/ui-message-stream/ui-message-stream-on-finish-callback.ts +2 -2
- package/src/ui-message-stream/ui-message-stream-on-step-finish-callback.ts +1 -1
- package/src/ui-message-stream/ui-message-stream-writer.ts +3 -3
- package/src/upload-file/upload-file-result.ts +3 -3
- package/src/upload-file/upload-file.ts +34 -56
- package/src/upload-skill/upload-skill-result.ts +3 -3
- package/src/upload-skill/upload-skill.ts +27 -8
- package/src/util/create-resolvable-promise.ts +1 -1
- package/src/util/deep-partial.ts +1 -1
- package/src/util/download/download.ts +0 -2
- package/src/util/extract-literal-union.ts +18 -0
- package/src/util/is-node-runtime.ts +3 -0
- package/src/util/notify.ts +1 -1
- package/src/util/parse-partial-json.ts +1 -1
- package/src/util/prepare-retries.ts +1 -2
- package/src/util/serial-job-executor.ts +1 -1
- package/src/util/write-to-server-response.ts +1 -1
- package/src/util/detect-media-type.ts +0 -235
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import type { LanguageModelV4FilePart } from '@ai-sdk/provider';
|
|
2
|
+
import {
|
|
3
|
+
isBuffer,
|
|
4
|
+
isProviderReference,
|
|
5
|
+
type DataContent,
|
|
6
|
+
type FilePart,
|
|
7
|
+
type ProviderReference,
|
|
8
|
+
} from '@ai-sdk/provider-utils';
|
|
9
|
+
import { InvalidDataContentError } from './invalid-data-content-error';
|
|
10
|
+
import { splitDataUrl } from './split-data-url';
|
|
11
|
+
|
|
12
|
+
type TaggedFileData = Extract<FilePart['data'], { type: string }>;
|
|
13
|
+
|
|
14
|
+
function isTaggedFileData(value: unknown): value is TaggedFileData {
|
|
15
|
+
if (typeof value !== 'object' || value === null) return false;
|
|
16
|
+
const type = (value as { type?: unknown }).type;
|
|
17
|
+
return (
|
|
18
|
+
type === 'data' || type === 'url' || type === 'reference' || type === 'text'
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
type ConvertResult = {
|
|
23
|
+
data: LanguageModelV4FilePart['data'];
|
|
24
|
+
mediaType: string | undefined;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
function convertUrlToFilePartData(url: URL): ConvertResult {
|
|
28
|
+
if (url.protocol === 'data:') {
|
|
29
|
+
const { mediaType, base64Content } = splitDataUrl(url.toString());
|
|
30
|
+
|
|
31
|
+
if (mediaType == null || base64Content == null) {
|
|
32
|
+
throw new InvalidDataContentError({
|
|
33
|
+
content: url,
|
|
34
|
+
message: `Invalid data URL format in content ${url.toString()}`,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return { data: { type: 'data', data: base64Content }, mediaType };
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return { data: { type: 'url', url }, mediaType: undefined };
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function convertInlineDataToFilePartData(content: DataContent): ConvertResult {
|
|
45
|
+
if (content instanceof Uint8Array) {
|
|
46
|
+
return { data: { type: 'data', data: content }, mediaType: undefined };
|
|
47
|
+
}
|
|
48
|
+
if (content instanceof ArrayBuffer) {
|
|
49
|
+
return {
|
|
50
|
+
data: { type: 'data', data: new Uint8Array(content) },
|
|
51
|
+
mediaType: undefined,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
if (isBuffer(content)) {
|
|
55
|
+
return {
|
|
56
|
+
data: { type: 'data', data: new Uint8Array(content) },
|
|
57
|
+
mediaType: undefined,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
data: { type: 'data', data: content as string },
|
|
62
|
+
mediaType: undefined,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Converts any legacy-or-tagged top-level `FilePart.data` /
|
|
68
|
+
* `ReasoningFilePart.data` value into the tagged v4 provider prompt shape.
|
|
69
|
+
*
|
|
70
|
+
* Returns the tagged `data` together with the resolved mediaType (extracted
|
|
71
|
+
* from a `data:` URL when applicable).
|
|
72
|
+
*/
|
|
73
|
+
export function convertToLanguageModelV4FilePart(
|
|
74
|
+
content: FilePart['data'],
|
|
75
|
+
): ConvertResult {
|
|
76
|
+
if (isTaggedFileData(content)) {
|
|
77
|
+
switch (content.type) {
|
|
78
|
+
case 'data':
|
|
79
|
+
if (
|
|
80
|
+
typeof content.data === 'string' &&
|
|
81
|
+
content.data.startsWith('data:')
|
|
82
|
+
) {
|
|
83
|
+
throw new InvalidDataContentError({
|
|
84
|
+
content: content.data,
|
|
85
|
+
message:
|
|
86
|
+
'Data URLs are not valid inline data. Pass them as { type: "url", url } instead.',
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
return convertInlineDataToFilePartData(content.data);
|
|
90
|
+
case 'url':
|
|
91
|
+
return convertUrlToFilePartData(content.url);
|
|
92
|
+
case 'reference':
|
|
93
|
+
return {
|
|
94
|
+
data: { type: 'reference', reference: content.reference },
|
|
95
|
+
mediaType: undefined,
|
|
96
|
+
};
|
|
97
|
+
case 'text':
|
|
98
|
+
return {
|
|
99
|
+
data: { type: 'text', text: content.text },
|
|
100
|
+
mediaType: undefined,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (content instanceof URL) {
|
|
106
|
+
return convertUrlToFilePartData(content);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (typeof content === 'string') {
|
|
110
|
+
try {
|
|
111
|
+
return convertUrlToFilePartData(new URL(content));
|
|
112
|
+
} catch {
|
|
113
|
+
return convertInlineDataToFilePartData(content);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (isProviderReference(content)) {
|
|
118
|
+
return {
|
|
119
|
+
data: { type: 'reference', reference: content as ProviderReference },
|
|
120
|
+
mediaType: undefined,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return convertInlineDataToFilePartData(content as DataContent);
|
|
125
|
+
}
|
package/src/prompt/index.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import type { LanguageModelCallOptions } from './language-model-call-options';
|
|
2
|
+
import type { RequestOptions } from './request-options';
|
|
3
|
+
|
|
1
4
|
export type { LanguageModelCallOptions } from './language-model-call-options';
|
|
2
5
|
export type { RequestOptions, TimeoutConfiguration } from './request-options';
|
|
3
6
|
|
|
4
|
-
import type { LanguageModelCallOptions } from './language-model-call-options';
|
|
5
|
-
import type { RequestOptions } from './request-options';
|
|
6
7
|
/** @deprecated Use `LanguageModelCallOptions` combined with `RequestOptions` instead. */
|
|
7
8
|
export type CallSettings = LanguageModelCallOptions &
|
|
8
9
|
Omit<RequestOptions, 'timeout'>;
|
package/src/prompt/message.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { InvalidArgumentError } from '../error/invalid-argument-error';
|
|
2
|
-
import { LanguageModelCallOptions } from './language-model-call-options';
|
|
2
|
+
import type { LanguageModelCallOptions } from './language-model-call-options';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Validates model call options and returns a new object with normalized values.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { LanguageModelV4ToolChoice } from '@ai-sdk/provider';
|
|
2
|
-
import { ToolChoice } from '../types/language-model';
|
|
1
|
+
import type { LanguageModelV4ToolChoice } from '@ai-sdk/provider';
|
|
2
|
+
import type { ToolChoice } from '../types/language-model';
|
|
3
3
|
|
|
4
4
|
export function prepareToolChoice({
|
|
5
5
|
toolChoice,
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type {
|
|
2
2
|
LanguageModelV4FunctionTool,
|
|
3
3
|
LanguageModelV4ProviderTool,
|
|
4
4
|
} from '@ai-sdk/provider';
|
|
5
|
-
import { asSchema, ToolSet } from '@ai-sdk/provider-utils';
|
|
5
|
+
import { asSchema, type ToolSet } from '@ai-sdk/provider-utils';
|
|
6
6
|
import { isNonEmptyObject } from '../util/is-non-empty-object';
|
|
7
7
|
|
|
8
8
|
export async function prepareTools<TOOLS extends ToolSet>({
|
package/src/prompt/prompt.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { InvalidPromptError } from '@ai-sdk/provider';
|
|
2
2
|
import {
|
|
3
3
|
asArray,
|
|
4
|
-
ModelMessage,
|
|
5
4
|
safeValidateTypes,
|
|
6
|
-
|
|
5
|
+
type ModelMessage,
|
|
6
|
+
type SystemModelMessage,
|
|
7
7
|
} from '@ai-sdk/provider-utils';
|
|
8
8
|
import { z } from 'zod/v4';
|
|
9
9
|
import { modelMessageSchema } from './message';
|
|
10
|
-
import { Prompt } from './prompt';
|
|
10
|
+
import type { Prompt } from './prompt';
|
|
11
11
|
|
|
12
12
|
export type StandardizedPrompt = {
|
|
13
13
|
/**
|
|
@@ -1,78 +1,65 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
ImageModelV2,
|
|
8
|
-
ImageModelV3,
|
|
9
|
-
ImageModelV4,
|
|
10
|
-
LanguageModelV2,
|
|
11
|
-
LanguageModelV3,
|
|
12
|
-
LanguageModelV4,
|
|
2
|
+
type EmbeddingModelV4,
|
|
3
|
+
type Experimental_VideoModelV4,
|
|
4
|
+
type FilesV4,
|
|
5
|
+
type ImageModelV4,
|
|
6
|
+
type LanguageModelV4,
|
|
13
7
|
NoSuchModelError,
|
|
14
|
-
ProviderV2,
|
|
15
|
-
ProviderV3,
|
|
16
|
-
ProviderV4,
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
SpeechModelV3,
|
|
22
|
-
SpeechModelV4,
|
|
23
|
-
TranscriptionModelV2,
|
|
24
|
-
TranscriptionModelV3,
|
|
25
|
-
TranscriptionModelV4,
|
|
8
|
+
type ProviderV2,
|
|
9
|
+
type ProviderV3,
|
|
10
|
+
type ProviderV4,
|
|
11
|
+
type RerankingModelV4,
|
|
12
|
+
type SkillsV4,
|
|
13
|
+
type SpeechModelV4,
|
|
14
|
+
type TranscriptionModelV4,
|
|
26
15
|
} from '@ai-sdk/provider';
|
|
27
|
-
import { asEmbeddingModelV4 } from '../model/as-embedding-model-v4';
|
|
28
|
-
import { asImageModelV4 } from '../model/as-image-model-v4';
|
|
29
|
-
import { asLanguageModelV4 } from '../model/as-language-model-v4';
|
|
30
16
|
import { asProviderV4 } from '../model/as-provider-v4';
|
|
31
|
-
import {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
17
|
+
import {
|
|
18
|
+
resolveEmbeddingModel,
|
|
19
|
+
resolveImageModel,
|
|
20
|
+
resolveLanguageModel,
|
|
21
|
+
resolveRerankingModel,
|
|
22
|
+
resolveSpeechModel,
|
|
23
|
+
resolveTranscriptionModel,
|
|
24
|
+
resolveVideoModel,
|
|
25
|
+
} from '../model/resolve-model';
|
|
26
|
+
import type { EmbeddingModel } from '../types/embedding-model';
|
|
27
|
+
import type { ImageModel } from '../types/image-model';
|
|
28
|
+
import type { LanguageModel } from '../types/language-model';
|
|
29
|
+
import type { RerankingModel } from '../types/reranking-model';
|
|
30
|
+
import type { SpeechModel } from '../types/speech-model';
|
|
31
|
+
import type { TranscriptionModel } from '../types/transcription-model';
|
|
32
|
+
import type { VideoModel } from '../types/video-model';
|
|
35
33
|
|
|
36
34
|
/**
|
|
37
|
-
* Creates a custom provider with specified language models, text embedding models, image models, transcription models, speech models, and an optional fallback provider.
|
|
35
|
+
* Creates a custom provider with specified language models, text embedding models, image models, transcription models, speech models, file APIs, skill APIs, and an optional fallback provider.
|
|
38
36
|
*
|
|
39
37
|
* @param {Object} options - The options for creating the custom provider.
|
|
40
|
-
* @param {Record<string,
|
|
41
|
-
* @param {Record<string,
|
|
42
|
-
* @param {Record<string,
|
|
43
|
-
* @param {Record<string,
|
|
44
|
-
* @param {Record<string,
|
|
45
|
-
* @param {Record<string,
|
|
46
|
-
* @param {
|
|
47
|
-
* @
|
|
38
|
+
* @param {Record<string, LanguageModel>} [options.languageModels] - A record of language models, where keys are model IDs and values are language model instances.
|
|
39
|
+
* @param {Record<string, EmbeddingModel>} [options.embeddingModels] - A record of text embedding models, where keys are model IDs and values are embedding model instances.
|
|
40
|
+
* @param {Record<string, ImageModel>} [options.imageModels] - A record of image models, where keys are model IDs and values are image model instances.
|
|
41
|
+
* @param {Record<string, TranscriptionModel>} [options.transcriptionModels] - A record of transcription models, where keys are model IDs and values are transcription model instances.
|
|
42
|
+
* @param {Record<string, SpeechModel>} [options.speechModels] - A record of speech models, where keys are model IDs and values are speech model instances.
|
|
43
|
+
* @param {Record<string, RerankingModel>} [options.rerankingModels] - A record of reranking models, where keys are model IDs and values are reranking model instances.
|
|
44
|
+
* @param {Record<string, VideoModel>} [options.videoModels] - A record of video models, where keys are model IDs and values are video model instances.
|
|
45
|
+
* @param {FilesV4} [options.files] - A files interface for uploading files.
|
|
46
|
+
* @param {SkillsV4} [options.skills] - A skills interface for uploading skills.
|
|
47
|
+
* @param {ProviderV2 | ProviderV3 | ProviderV4} [options.fallbackProvider] - An optional fallback provider to use when a requested model is not found in the custom provider.
|
|
48
|
+
* @returns {ProviderV4} A ProviderV4 object with languageModel, embeddingModel, imageModel, transcriptionModel, speechModel, rerankingModel, and videoModel methods.
|
|
48
49
|
*
|
|
49
50
|
* @throws {NoSuchModelError} Throws when a requested model is not found and no fallback provider is available.
|
|
50
51
|
*/
|
|
51
52
|
export function customProvider<
|
|
52
|
-
LANGUAGE_MODELS extends Record<
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
>,
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
ImageModelV2 | ImageModelV3 | ImageModelV4
|
|
60
|
-
>,
|
|
61
|
-
TRANSCRIPTION_MODELS extends Record<
|
|
62
|
-
string,
|
|
63
|
-
TranscriptionModelV2 | TranscriptionModelV3 | TranscriptionModelV4
|
|
64
|
-
>,
|
|
65
|
-
SPEECH_MODELS extends Record<
|
|
66
|
-
string,
|
|
67
|
-
SpeechModelV2 | SpeechModelV3 | SpeechModelV4
|
|
68
|
-
>,
|
|
69
|
-
RERANKING_MODELS extends Record<string, RerankingModelV3 | RerankingModelV4>,
|
|
70
|
-
VIDEO_MODELS extends Record<
|
|
71
|
-
string,
|
|
72
|
-
Experimental_VideoModelV3 | Experimental_VideoModelV4
|
|
73
|
-
>,
|
|
53
|
+
LANGUAGE_MODELS extends Record<string, LanguageModel>,
|
|
54
|
+
EMBEDDING_MODELS extends Record<string, EmbeddingModel>,
|
|
55
|
+
IMAGE_MODELS extends Record<string, ImageModel>,
|
|
56
|
+
TRANSCRIPTION_MODELS extends Record<string, TranscriptionModel>,
|
|
57
|
+
SPEECH_MODELS extends Record<string, SpeechModel>,
|
|
58
|
+
RERANKING_MODELS extends Record<string, RerankingModel>,
|
|
59
|
+
VIDEO_MODELS extends Record<string, VideoModel>,
|
|
74
60
|
FILES extends FilesV4 | undefined = undefined,
|
|
75
61
|
SKILLS extends SkillsV4 | undefined = undefined,
|
|
62
|
+
FALLBACK extends ProviderV2 | ProviderV3 | ProviderV4 | undefined = undefined,
|
|
76
63
|
>({
|
|
77
64
|
languageModels,
|
|
78
65
|
embeddingModels,
|
|
@@ -94,7 +81,7 @@ export function customProvider<
|
|
|
94
81
|
videoModels?: VIDEO_MODELS;
|
|
95
82
|
files?: FILES;
|
|
96
83
|
skills?: SKILLS;
|
|
97
|
-
fallbackProvider?:
|
|
84
|
+
fallbackProvider?: FALLBACK;
|
|
98
85
|
}): ProviderV4 & {
|
|
99
86
|
languageModel(modelId: ExtractModelId<LANGUAGE_MODELS>): LanguageModelV4;
|
|
100
87
|
embeddingModel(modelId: ExtractModelId<EMBEDDING_MODELS>): EmbeddingModelV4;
|
|
@@ -105,24 +92,40 @@ export function customProvider<
|
|
|
105
92
|
rerankingModel(modelId: ExtractModelId<RERANKING_MODELS>): RerankingModelV4;
|
|
106
93
|
speechModel(modelId: ExtractModelId<SPEECH_MODELS>): SpeechModelV4;
|
|
107
94
|
videoModel(modelId: ExtractModelId<VIDEO_MODELS>): Experimental_VideoModelV4;
|
|
108
|
-
} & (FILES extends FilesV4
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
95
|
+
} & (FILES extends FilesV4
|
|
96
|
+
? { files(): FilesV4 }
|
|
97
|
+
: [FALLBACK] extends [{ files: () => FilesV4 }]
|
|
98
|
+
? { files(): FilesV4 }
|
|
99
|
+
: { files?(): FilesV4 }) &
|
|
100
|
+
(SKILLS extends SkillsV4
|
|
101
|
+
? { skills(): SkillsV4 }
|
|
102
|
+
: [FALLBACK] extends [{ skills: () => SkillsV4 }]
|
|
103
|
+
? { skills(): SkillsV4 }
|
|
104
|
+
: { skills?(): SkillsV4 }) {
|
|
105
|
+
const fallbackProvider =
|
|
106
|
+
fallbackProviderArg == null ? undefined : asProviderV4(fallbackProviderArg);
|
|
116
107
|
|
|
117
|
-
|
|
108
|
+
const baseProvider: ProviderV4 & {
|
|
109
|
+
languageModel(modelId: ExtractModelId<LANGUAGE_MODELS>): LanguageModelV4;
|
|
110
|
+
embeddingModel(modelId: ExtractModelId<EMBEDDING_MODELS>): EmbeddingModelV4;
|
|
111
|
+
imageModel(modelId: ExtractModelId<IMAGE_MODELS>): ImageModelV4;
|
|
112
|
+
transcriptionModel(
|
|
113
|
+
modelId: ExtractModelId<TRANSCRIPTION_MODELS>,
|
|
114
|
+
): TranscriptionModelV4;
|
|
115
|
+
rerankingModel(modelId: ExtractModelId<RERANKING_MODELS>): RerankingModelV4;
|
|
116
|
+
speechModel(modelId: ExtractModelId<SPEECH_MODELS>): SpeechModelV4;
|
|
117
|
+
videoModel(
|
|
118
|
+
modelId: ExtractModelId<VIDEO_MODELS>,
|
|
119
|
+
): Experimental_VideoModelV4;
|
|
120
|
+
} = {
|
|
118
121
|
specificationVersion: 'v4',
|
|
119
122
|
languageModel(modelId: ExtractModelId<LANGUAGE_MODELS>): LanguageModelV4 {
|
|
120
123
|
if (languageModels != null && modelId in languageModels) {
|
|
121
|
-
return
|
|
124
|
+
return resolveLanguageModel(languageModels[modelId]);
|
|
122
125
|
}
|
|
123
126
|
|
|
124
127
|
if (fallbackProvider) {
|
|
125
|
-
return
|
|
128
|
+
return fallbackProvider.languageModel(modelId);
|
|
126
129
|
}
|
|
127
130
|
|
|
128
131
|
throw new NoSuchModelError({ modelId, modelType: 'languageModel' });
|
|
@@ -132,11 +135,11 @@ export function customProvider<
|
|
|
132
135
|
modelId: ExtractModelId<EMBEDDING_MODELS>,
|
|
133
136
|
): EmbeddingModelV4 {
|
|
134
137
|
if (embeddingModels != null && modelId in embeddingModels) {
|
|
135
|
-
return
|
|
138
|
+
return resolveEmbeddingModel(embeddingModels[modelId]);
|
|
136
139
|
}
|
|
137
140
|
|
|
138
141
|
if (fallbackProvider) {
|
|
139
|
-
return
|
|
142
|
+
return fallbackProvider.embeddingModel(modelId);
|
|
140
143
|
}
|
|
141
144
|
|
|
142
145
|
throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });
|
|
@@ -144,11 +147,11 @@ export function customProvider<
|
|
|
144
147
|
|
|
145
148
|
imageModel(modelId: ExtractModelId<IMAGE_MODELS>): ImageModelV4 {
|
|
146
149
|
if (imageModels != null && modelId in imageModels) {
|
|
147
|
-
return
|
|
150
|
+
return resolveImageModel(imageModels[modelId]);
|
|
148
151
|
}
|
|
149
152
|
|
|
150
153
|
if (fallbackProvider?.imageModel) {
|
|
151
|
-
return
|
|
154
|
+
return fallbackProvider.imageModel(modelId);
|
|
152
155
|
}
|
|
153
156
|
|
|
154
157
|
throw new NoSuchModelError({ modelId, modelType: 'imageModel' });
|
|
@@ -158,11 +161,15 @@ export function customProvider<
|
|
|
158
161
|
modelId: ExtractModelId<TRANSCRIPTION_MODELS>,
|
|
159
162
|
): TranscriptionModelV4 {
|
|
160
163
|
if (transcriptionModels != null && modelId in transcriptionModels) {
|
|
161
|
-
|
|
164
|
+
const model = resolveTranscriptionModel(transcriptionModels[modelId]);
|
|
165
|
+
|
|
166
|
+
if (model != null) {
|
|
167
|
+
return model;
|
|
168
|
+
}
|
|
162
169
|
}
|
|
163
170
|
|
|
164
171
|
if (fallbackProvider?.transcriptionModel) {
|
|
165
|
-
return
|
|
172
|
+
return fallbackProvider.transcriptionModel(modelId);
|
|
166
173
|
}
|
|
167
174
|
|
|
168
175
|
throw new NoSuchModelError({ modelId, modelType: 'transcriptionModel' });
|
|
@@ -170,11 +177,15 @@ export function customProvider<
|
|
|
170
177
|
|
|
171
178
|
speechModel(modelId: ExtractModelId<SPEECH_MODELS>): SpeechModelV4 {
|
|
172
179
|
if (speechModels != null && modelId in speechModels) {
|
|
173
|
-
|
|
180
|
+
const model = resolveSpeechModel(speechModels[modelId]);
|
|
181
|
+
|
|
182
|
+
if (model != null) {
|
|
183
|
+
return model;
|
|
184
|
+
}
|
|
174
185
|
}
|
|
175
186
|
|
|
176
187
|
if (fallbackProvider?.speechModel) {
|
|
177
|
-
return
|
|
188
|
+
return fallbackProvider.speechModel(modelId);
|
|
178
189
|
}
|
|
179
190
|
|
|
180
191
|
throw new NoSuchModelError({ modelId, modelType: 'speechModel' });
|
|
@@ -183,7 +194,7 @@ export function customProvider<
|
|
|
183
194
|
modelId: ExtractModelId<RERANKING_MODELS>,
|
|
184
195
|
): RerankingModelV4 {
|
|
185
196
|
if (rerankingModels != null && modelId in rerankingModels) {
|
|
186
|
-
return
|
|
197
|
+
return resolveRerankingModel(rerankingModels[modelId]);
|
|
187
198
|
}
|
|
188
199
|
|
|
189
200
|
if (fallbackProvider?.rerankingModel) {
|
|
@@ -196,25 +207,49 @@ export function customProvider<
|
|
|
196
207
|
modelId: ExtractModelId<VIDEO_MODELS>,
|
|
197
208
|
): Experimental_VideoModelV4 {
|
|
198
209
|
if (videoModels != null && modelId in videoModels) {
|
|
199
|
-
return
|
|
210
|
+
return resolveVideoModel(videoModels[modelId]);
|
|
200
211
|
}
|
|
201
212
|
|
|
202
|
-
|
|
213
|
+
// TODO AI SDK v7
|
|
214
|
+
// @ts-expect-error - videoModel support is experimental
|
|
215
|
+
const videoModel = fallbackProvider?.videoModel;
|
|
203
216
|
if (videoModel) {
|
|
204
217
|
return videoModel(modelId);
|
|
205
218
|
}
|
|
206
219
|
|
|
207
220
|
throw new NoSuchModelError({ modelId, modelType: 'videoModel' });
|
|
208
221
|
},
|
|
209
|
-
|
|
210
|
-
...(resolvedSkills != null ? { skills: () => resolvedSkills } : {}),
|
|
211
|
-
} as any; // necessary workaround to satisfy the complex return type while maintaining type safety
|
|
212
|
-
}
|
|
222
|
+
};
|
|
213
223
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
224
|
+
const filesAndSkills = {
|
|
225
|
+
...(files != null || fallbackProvider?.files != null
|
|
226
|
+
? {
|
|
227
|
+
files(): FilesV4 {
|
|
228
|
+
return files ?? fallbackProvider!.files!();
|
|
229
|
+
},
|
|
230
|
+
}
|
|
231
|
+
: {}),
|
|
232
|
+
|
|
233
|
+
...(skills != null || fallbackProvider?.skills != null
|
|
234
|
+
? {
|
|
235
|
+
skills(): SkillsV4 {
|
|
236
|
+
return skills ?? fallbackProvider!.skills!();
|
|
237
|
+
},
|
|
238
|
+
}
|
|
239
|
+
: {}),
|
|
240
|
+
} as (FILES extends FilesV4
|
|
241
|
+
? { files(): FilesV4 }
|
|
242
|
+
: [FALLBACK] extends [{ files: () => FilesV4 }]
|
|
243
|
+
? { files(): FilesV4 }
|
|
244
|
+
: { files?(): FilesV4 }) &
|
|
245
|
+
(SKILLS extends SkillsV4
|
|
246
|
+
? { skills(): SkillsV4 }
|
|
247
|
+
: [FALLBACK] extends [{ skills: () => SkillsV4 }]
|
|
248
|
+
? { skills(): SkillsV4 }
|
|
249
|
+
: { skills?(): SkillsV4 });
|
|
250
|
+
|
|
251
|
+
return Object.assign(baseProvider, filesAndSkills);
|
|
252
|
+
}
|
|
218
253
|
|
|
219
254
|
type ExtractModelId<MODELS extends Record<string, unknown>> = Extract<
|
|
220
255
|
keyof MODELS,
|
package/src/registry/index.ts
CHANGED