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.
Files changed (236) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/index.d.ts +1506 -1468
  3. package/dist/index.js +889 -979
  4. package/dist/index.js.map +1 -1
  5. package/dist/internal/index.d.ts +273 -273
  6. package/dist/internal/index.js +367 -405
  7. package/dist/internal/index.js.map +1 -1
  8. package/dist/test/index.d.ts +18 -18
  9. package/dist/test/index.js +22 -22
  10. package/dist/test/index.js.map +1 -1
  11. package/docs/02-foundations/03-prompts.mdx +13 -11
  12. package/docs/03-ai-sdk-core/15-tools-and-tool-calling.mdx +2 -1
  13. package/docs/03-ai-sdk-core/39-file-uploads.mdx +1 -1
  14. package/docs/03-ai-sdk-core/45-provider-management.mdx +1 -1
  15. package/docs/03-ai-sdk-core/60-telemetry.mdx +87 -13
  16. package/docs/07-reference/01-ai-sdk-core/12-generate-speech.mdx +2 -2
  17. package/docs/07-reference/01-ai-sdk-core/20-tool.mdx +7 -0
  18. package/docs/07-reference/01-ai-sdk-core/22-dynamic-tool.mdx +7 -0
  19. package/docs/07-reference/01-ai-sdk-core/30-model-message.mdx +9 -1
  20. package/docs/07-reference/01-ai-sdk-core/40-provider-registry.mdx +104 -0
  21. package/docs/07-reference/01-ai-sdk-core/42-custom-provider.mdx +56 -10
  22. package/docs/07-reference/02-ai-sdk-ui/31-convert-to-model-messages.mdx +1 -1
  23. package/docs/08-migration-guides/23-migration-guide-7-0.mdx +42 -0
  24. package/docs/09-troubleshooting/70-high-memory-usage-with-images.mdx +2 -2
  25. package/package.json +5 -5
  26. package/src/agent/agent.ts +13 -9
  27. package/src/agent/create-agent-ui-stream-response.ts +8 -8
  28. package/src/agent/create-agent-ui-stream.ts +9 -9
  29. package/src/agent/infer-agent-tools.ts +1 -1
  30. package/src/agent/infer-agent-ui-message.ts +2 -2
  31. package/src/agent/pipe-agent-ui-stream-to-response.ts +9 -9
  32. package/src/agent/tool-loop-agent-settings.ts +17 -19
  33. package/src/agent/tool-loop-agent.ts +16 -8
  34. package/src/embed/embed-many-result.ts +3 -4
  35. package/src/embed/embed-many.ts +5 -5
  36. package/src/embed/embed-result.ts +3 -4
  37. package/src/embed/embed.ts +4 -4
  38. package/src/error/invalid-stream-part-error.ts +1 -1
  39. package/src/error/no-image-generated-error.ts +1 -1
  40. package/src/error/no-object-generated-error.ts +3 -3
  41. package/src/error/no-speech-generated-error.ts +1 -1
  42. package/src/error/no-transcript-generated-error.ts +1 -1
  43. package/src/error/no-video-generated-error.ts +1 -1
  44. package/src/error/tool-call-repair-error.ts +2 -2
  45. package/src/error/verify-no-object-generated-error.ts +1 -1
  46. package/src/generate-image/generate-image-result.ts +5 -5
  47. package/src/generate-image/generate-image.ts +12 -15
  48. package/src/generate-image/index.ts +3 -2
  49. package/src/generate-object/generate-object-result.ts +2 -2
  50. package/src/generate-object/generate-object.ts +14 -14
  51. package/src/generate-object/inject-json-instruction.ts +1 -1
  52. package/src/generate-object/output-strategy.ts +10 -10
  53. package/src/generate-object/parse-and-validate-object-result.ts +1 -1
  54. package/src/generate-object/repair-text.ts +1 -1
  55. package/src/generate-object/stream-object-result.ts +4 -4
  56. package/src/generate-object/stream-object.ts +22 -19
  57. package/src/generate-object/validate-object-generation-input.ts +1 -1
  58. package/src/generate-speech/generate-speech-result.ts +4 -4
  59. package/src/generate-speech/generate-speech.ts +12 -13
  60. package/src/generate-speech/generated-audio-file.ts +1 -2
  61. package/src/generate-text/collect-tool-approvals.ts +4 -4
  62. package/src/generate-text/content-part.ts +9 -9
  63. package/src/generate-text/create-execute-tools-transformation.ts +9 -7
  64. package/src/generate-text/execute-tool-call.ts +11 -13
  65. package/src/generate-text/extract-reasoning-content.ts +1 -1
  66. package/src/generate-text/extract-text-content.ts +4 -1
  67. package/src/generate-text/generate-text-events.ts +2 -2
  68. package/src/generate-text/generate-text-result.ts +18 -14
  69. package/src/generate-text/generate-text.ts +42 -38
  70. package/src/generate-text/invoke-tool-callbacks-from-stream.ts +2 -3
  71. package/src/generate-text/output-utils.ts +1 -1
  72. package/src/generate-text/output.ts +8 -8
  73. package/src/generate-text/parse-tool-call.ts +36 -9
  74. package/src/generate-text/prepare-step.ts +3 -5
  75. package/src/generate-text/prune-messages.ts +1 -1
  76. package/src/generate-text/reasoning-output.ts +26 -9
  77. package/src/generate-text/reasoning.ts +1 -1
  78. package/src/generate-text/resolve-tool-approval.ts +3 -3
  79. package/src/generate-text/response-message.ts +1 -1
  80. package/src/generate-text/restricted-telemetry-dispatcher.ts +1 -1
  81. package/src/generate-text/smooth-stream.ts +6 -5
  82. package/src/generate-text/step-result.ts +16 -11
  83. package/src/generate-text/stop-condition.ts +1 -1
  84. package/src/generate-text/stream-language-model-call.ts +26 -21
  85. package/src/generate-text/stream-text-result.ts +29 -26
  86. package/src/generate-text/stream-text.ts +48 -46
  87. package/src/generate-text/to-response-messages.ts +2 -2
  88. package/src/generate-text/tool-approval-configuration.ts +2 -2
  89. package/src/generate-text/tool-approval-request-output.ts +1 -1
  90. package/src/generate-text/tool-approval-response-output.ts +1 -1
  91. package/src/generate-text/tool-call-repair-function.ts +4 -4
  92. package/src/generate-text/tool-call.ts +3 -4
  93. package/src/generate-text/tool-error.ts +3 -4
  94. package/src/generate-text/tool-execution-events.ts +2 -2
  95. package/src/generate-text/tool-output-denied.ts +1 -1
  96. package/src/generate-text/tool-output.ts +2 -2
  97. package/src/generate-text/tool-result.ts +7 -4
  98. package/src/generate-text/tools-context-parameter.ts +1 -1
  99. package/src/generate-text/validate-tool-context.ts +1 -2
  100. package/src/generate-video/generate-video-result.ts +4 -4
  101. package/src/generate-video/generate-video.ts +6 -10
  102. package/src/global.ts +2 -2
  103. package/src/index.ts +3 -3
  104. package/src/logger/log-warnings.ts +1 -1
  105. package/src/middleware/add-tool-input-examples-middleware.ts +2 -2
  106. package/src/middleware/default-embedding-settings-middleware.ts +2 -2
  107. package/src/middleware/default-settings-middleware.ts +2 -2
  108. package/src/middleware/extract-json-middleware.ts +1 -1
  109. package/src/middleware/extract-reasoning-middleware.ts +1 -1
  110. package/src/middleware/simulate-streaming-middleware.ts +1 -1
  111. package/src/middleware/wrap-embedding-model.ts +2 -2
  112. package/src/middleware/wrap-image-model.ts +2 -2
  113. package/src/middleware/wrap-language-model.ts +2 -2
  114. package/src/middleware/wrap-provider.ts +2 -2
  115. package/src/model/as-embedding-model-v3.ts +1 -1
  116. package/src/model/as-embedding-model-v4.ts +1 -1
  117. package/src/model/as-image-model-v3.ts +1 -1
  118. package/src/model/as-image-model-v4.ts +5 -1
  119. package/src/model/as-language-model-v3.ts +1 -1
  120. package/src/model/as-language-model-v4.ts +1 -1
  121. package/src/model/as-provider-v3.ts +1 -1
  122. package/src/model/as-provider-v4.ts +1 -1
  123. package/src/model/as-reranking-model-v4.ts +1 -1
  124. package/src/model/as-speech-model-v3.ts +1 -1
  125. package/src/model/as-speech-model-v4.ts +5 -1
  126. package/src/model/as-transcription-model-v3.ts +4 -1
  127. package/src/model/as-transcription-model-v4.ts +1 -1
  128. package/src/model/as-video-model-v4.ts +1 -1
  129. package/src/model/resolve-model.ts +8 -8
  130. package/src/prompt/content-part.ts +45 -15
  131. package/src/prompt/convert-to-language-model-prompt.ts +108 -122
  132. package/src/prompt/create-tool-model-output.ts +2 -2
  133. package/src/prompt/data-content.ts +1 -78
  134. package/src/prompt/file-part-data.ts +125 -0
  135. package/src/prompt/index.ts +3 -2
  136. package/src/prompt/language-model-call-options.ts +1 -1
  137. package/src/prompt/message-conversion-error.ts +1 -1
  138. package/src/prompt/message.ts +1 -1
  139. package/src/prompt/prepare-language-model-call-options.ts +1 -1
  140. package/src/prompt/prepare-tool-choice.ts +2 -2
  141. package/src/prompt/prepare-tools.ts +2 -2
  142. package/src/prompt/prompt.ts +1 -1
  143. package/src/prompt/standardize-prompt.ts +3 -3
  144. package/src/registry/custom-provider.ts +127 -92
  145. package/src/registry/index.ts +1 -1
  146. package/src/registry/provider-registry.ts +91 -87
  147. package/src/rerank/rerank-result.ts +1 -1
  148. package/src/rerank/rerank.ts +8 -5
  149. package/src/telemetry/create-telemetry-dispatcher.ts +11 -1
  150. package/src/telemetry/diagnostic-channel-publisher.ts +50 -0
  151. package/src/telemetry/diagnostic-channel.ts +24 -0
  152. package/src/telemetry/index.ts +5 -0
  153. package/src/telemetry/telemetry.ts +1 -1
  154. package/src/test/mock-embedding-model-v2.ts +1 -1
  155. package/src/test/mock-embedding-model-v3.ts +1 -1
  156. package/src/test/mock-embedding-model-v4.ts +1 -1
  157. package/src/test/mock-image-model-v2.ts +1 -1
  158. package/src/test/mock-image-model-v3.ts +1 -1
  159. package/src/test/mock-image-model-v4.ts +1 -1
  160. package/src/test/mock-language-model-v2.ts +1 -1
  161. package/src/test/mock-language-model-v3.ts +1 -1
  162. package/src/test/mock-language-model-v4.ts +1 -1
  163. package/src/test/mock-provider-v2.ts +6 -7
  164. package/src/test/mock-provider-v3.ts +7 -8
  165. package/src/test/mock-provider-v4.ts +7 -8
  166. package/src/test/mock-reranking-model-v3.ts +1 -1
  167. package/src/test/mock-reranking-model-v4.ts +1 -1
  168. package/src/test/mock-server-response.ts +1 -1
  169. package/src/test/mock-speech-model-v2.ts +1 -1
  170. package/src/test/mock-speech-model-v3.ts +1 -1
  171. package/src/test/mock-speech-model-v4.ts +1 -1
  172. package/src/test/mock-transcription-model-v2.ts +1 -1
  173. package/src/test/mock-transcription-model-v3.ts +1 -1
  174. package/src/test/mock-transcription-model-v4.ts +1 -1
  175. package/src/test/mock-video-model-v3.ts +1 -1
  176. package/src/test/mock-video-model-v4.ts +1 -1
  177. package/src/text-stream/pipe-text-stream-to-response.ts +1 -1
  178. package/src/transcribe/transcribe-result.ts +3 -3
  179. package/src/transcribe/transcribe.ts +12 -12
  180. package/src/types/embedding-model-middleware.ts +1 -1
  181. package/src/types/embedding-model.ts +1 -1
  182. package/src/types/image-model-middleware.ts +1 -1
  183. package/src/types/image-model.ts +1 -1
  184. package/src/types/json-value.ts +1 -1
  185. package/src/types/language-model-middleware.ts +1 -1
  186. package/src/types/language-model.ts +2 -2
  187. package/src/types/provider-metadata.ts +1 -1
  188. package/src/types/provider-reference.ts +1 -1
  189. package/src/types/provider.ts +4 -4
  190. package/src/types/reranking-model.ts +1 -1
  191. package/src/types/speech-model.ts +5 -1
  192. package/src/types/transcription-model.ts +1 -1
  193. package/src/types/usage.ts +1 -1
  194. package/src/types/video-model.ts +1 -1
  195. package/src/types/warning.ts +1 -1
  196. package/src/ui/call-completion-api.ts +2 -2
  197. package/src/ui/chat-transport.ts +3 -3
  198. package/src/ui/chat.ts +10 -11
  199. package/src/ui/convert-file-list-to-file-ui-parts.ts +1 -1
  200. package/src/ui/convert-to-model-messages.ts +34 -23
  201. package/src/ui/default-chat-transport.ts +4 -4
  202. package/src/ui/direct-chat-transport.ts +6 -6
  203. package/src/ui/http-chat-transport.ts +5 -5
  204. package/src/ui/last-assistant-message-is-complete-with-approval-responses.ts +0 -1
  205. package/src/ui/last-assistant-message-is-complete-with-tool-calls.ts +0 -1
  206. package/src/ui/process-ui-message-stream.ts +20 -21
  207. package/src/ui/text-stream-chat-transport.ts +3 -3
  208. package/src/ui/transform-text-to-ui-message-stream.ts +1 -1
  209. package/src/ui/ui-messages.ts +13 -6
  210. package/src/ui/use-completion.ts +1 -1
  211. package/src/ui/validate-ui-messages.ts +3 -3
  212. package/src/ui-message-stream/create-ui-message-stream-response.ts +2 -2
  213. package/src/ui-message-stream/create-ui-message-stream.ts +6 -6
  214. package/src/ui-message-stream/get-response-ui-message-id.ts +2 -2
  215. package/src/ui-message-stream/handle-ui-message-stream-finish.ts +6 -6
  216. package/src/ui-message-stream/pipe-ui-message-stream-to-response.ts +3 -3
  217. package/src/ui-message-stream/read-ui-message-stream.ts +4 -4
  218. package/src/ui-message-stream/ui-message-chunks.ts +4 -4
  219. package/src/ui-message-stream/ui-message-stream-on-finish-callback.ts +2 -2
  220. package/src/ui-message-stream/ui-message-stream-on-step-finish-callback.ts +1 -1
  221. package/src/ui-message-stream/ui-message-stream-writer.ts +3 -3
  222. package/src/upload-file/upload-file-result.ts +3 -3
  223. package/src/upload-file/upload-file.ts +34 -56
  224. package/src/upload-skill/upload-skill-result.ts +3 -3
  225. package/src/upload-skill/upload-skill.ts +27 -8
  226. package/src/util/create-resolvable-promise.ts +1 -1
  227. package/src/util/deep-partial.ts +1 -1
  228. package/src/util/download/download.ts +0 -2
  229. package/src/util/extract-literal-union.ts +18 -0
  230. package/src/util/is-node-runtime.ts +3 -0
  231. package/src/util/notify.ts +1 -1
  232. package/src/util/parse-partial-json.ts +1 -1
  233. package/src/util/prepare-retries.ts +1 -2
  234. package/src/util/serial-job-executor.ts +1 -1
  235. package/src/util/write-to-server-response.ts +1 -1
  236. 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
+ }
@@ -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'>;
@@ -1,4 +1,4 @@
1
- import { LanguageModelV4CallOptions } from '@ai-sdk/provider';
1
+ import type { LanguageModelV4CallOptions } from '@ai-sdk/provider';
2
2
 
3
3
  /**
4
4
  * Model-facing generation controls. These settings influence how the model
@@ -1,5 +1,5 @@
1
1
  import { AISDKError } from '@ai-sdk/provider';
2
- import { UIMessage } from '../ui/ui-messages';
2
+ import type { UIMessage } from '../ui/ui-messages';
3
3
 
4
4
  const name = 'AI_MessageConversionError';
5
5
  const marker = `vercel.ai.error.${name}`;
@@ -1,4 +1,4 @@
1
- import {
1
+ import type {
2
2
  AssistantModelMessage,
3
3
  ModelMessage,
4
4
  SystemModelMessage,
@@ -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>({
@@ -1,4 +1,4 @@
1
- import { ModelMessage, SystemModelMessage } from '@ai-sdk/provider-utils';
1
+ import type { ModelMessage, SystemModelMessage } from '@ai-sdk/provider-utils';
2
2
 
3
3
  /**
4
4
  * Prompt part of the AI function options.
@@ -1,13 +1,13 @@
1
1
  import { InvalidPromptError } from '@ai-sdk/provider';
2
2
  import {
3
3
  asArray,
4
- ModelMessage,
5
4
  safeValidateTypes,
6
- SystemModelMessage,
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
- EmbeddingModelV3,
3
- EmbeddingModelV4,
4
- Experimental_VideoModelV3,
5
- Experimental_VideoModelV4,
6
- FilesV4,
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
- RerankingModelV3,
18
- RerankingModelV4,
19
- SkillsV4,
20
- SpeechModelV2,
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 { asRerankingModelV4 } from '../model/as-reranking-model-v4';
32
- import { asSpeechModelV4 } from '../model/as-speech-model-v4';
33
- import { asTranscriptionModelV4 } from '../model/as-transcription-model-v4';
34
- import { asVideoModelV4 } from '../model/as-video-model-v4';
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, LanguageModelV4>} [options.languageModels] - A record of language models, where keys are model IDs and values are LanguageModelV4 instances.
41
- * @param {Record<string, EmbeddingModelV4>} [options.embeddingModels] - A record of text embedding models, where keys are model IDs and values are EmbeddingModelV4 instances.
42
- * @param {Record<string, ImageModelV4>} [options.imageModels] - A record of image models, where keys are model IDs and values are ImageModelV4 instances.
43
- * @param {Record<string, TranscriptionModelV4>} [options.transcriptionModels] - A record of transcription models, where keys are model IDs and values are TranscriptionModelV4 instances.
44
- * @param {Record<string, SpeechModelV4>} [options.speechModels] - A record of speech models, where keys are model IDs and values are SpeechModelV4 instances.
45
- * @param {Record<string, RerankingModelV4>} [options.rerankingModels] - A record of reranking models, where keys are model IDs and values are RerankingModelV4 instances.
46
- * @param {ProviderV4} [options.fallbackProvider] - An optional fallback provider to use when a requested model is not found in the custom provider.
47
- * @returns {ProviderV4} A ProviderV4 object with languageModel, embeddingModel, imageModel, transcriptionModel, and speechModel methods.
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
- string,
54
- LanguageModelV2 | LanguageModelV3 | LanguageModelV4
55
- >,
56
- EMBEDDING_MODELS extends Record<string, EmbeddingModelV3 | EmbeddingModelV4>,
57
- IMAGE_MODELS extends Record<
58
- string,
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?: ProviderV4 | ProviderV3 | ProviderV2;
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 ? { files(): FilesV4 } : { files?(): FilesV4 }) &
109
- (SKILLS extends SkillsV4 ? { skills(): SkillsV4 } : { skills?(): SkillsV4 }) {
110
- const fallbackProvider = fallbackProviderArg
111
- ? asProviderV4(fallbackProviderArg)
112
- : undefined;
113
-
114
- const resolvedFiles = files ?? fallbackProvider?.files?.();
115
- const resolvedSkills = skills ?? fallbackProvider?.skills?.();
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
- return {
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 asLanguageModelV4(languageModels[modelId]);
124
+ return resolveLanguageModel(languageModels[modelId]);
122
125
  }
123
126
 
124
127
  if (fallbackProvider) {
125
- return (fallbackProvider as ProviderV4).languageModel(modelId);
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 asEmbeddingModelV4(embeddingModels[modelId]);
138
+ return resolveEmbeddingModel(embeddingModels[modelId]);
136
139
  }
137
140
 
138
141
  if (fallbackProvider) {
139
- return (fallbackProvider as ProviderV4).embeddingModel(modelId);
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 asImageModelV4(imageModels[modelId]);
150
+ return resolveImageModel(imageModels[modelId]);
148
151
  }
149
152
 
150
153
  if (fallbackProvider?.imageModel) {
151
- return (fallbackProvider as ProviderV4).imageModel(modelId);
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
- return asTranscriptionModelV4(transcriptionModels[modelId]);
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 (fallbackProvider as ProviderV4).transcriptionModel!(modelId);
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
- return asSpeechModelV4(speechModels[modelId]);
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 (fallbackProvider as ProviderV4).speechModel!(modelId);
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 asRerankingModelV4(rerankingModels[modelId]);
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 asVideoModelV4(videoModels[modelId]);
210
+ return resolveVideoModel(videoModels[modelId]);
200
211
  }
201
212
 
202
- const videoModel = (fallbackProvider as any)?.videoModel;
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
- ...(resolvedFiles != null ? { files: () => resolvedFiles } : {}),
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
- * @deprecated Use `customProvider` instead.
216
- */
217
- export const experimental_customProvider = customProvider;
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,
@@ -1,4 +1,4 @@
1
- export { customProvider, experimental_customProvider } from './custom-provider';
1
+ export { customProvider } from './custom-provider';
2
2
  export { NoSuchProviderError } from './no-such-provider-error';
3
3
  export {
4
4
  createProviderRegistry,