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
@@ -1,10 +1,10 @@
1
- import { ServerResponse } from 'node:http';
1
+ import type { ServerResponse } from 'node:http';
2
2
  import { prepareHeaders } from '../util/prepare-headers';
3
3
  import { writeToServerResponse } from '../util/write-to-server-response';
4
4
  import { JsonToSseTransformStream } from './json-to-sse-transform-stream';
5
5
  import { UI_MESSAGE_STREAM_HEADERS } from './ui-message-stream-headers';
6
- import { UIMessageChunk } from './ui-message-chunks';
7
- import { UIMessageStreamResponseInit } from './ui-message-stream-response-init';
6
+ import type { UIMessageChunk } from './ui-message-chunks';
7
+ import type { UIMessageStreamResponseInit } from './ui-message-stream-response-init';
8
8
 
9
9
  /**
10
10
  * Pipes a UI message stream to a Node.js ServerResponse object.
@@ -1,13 +1,13 @@
1
- import { UIMessage } from '../ui/ui-messages';
2
- import { UIMessageChunk } from './ui-message-chunks';
1
+ import type { UIMessage } from '../ui/ui-messages';
2
+ import type { UIMessageChunk } from './ui-message-chunks';
3
3
  import {
4
4
  createStreamingUIMessageState,
5
5
  processUIMessageStream,
6
- StreamingUIMessageState,
6
+ type StreamingUIMessageState,
7
7
  } from '../ui/process-ui-message-stream';
8
8
  import {
9
- AsyncIterableStream,
10
9
  createAsyncIterableStream,
10
+ type AsyncIterableStream,
11
11
  } from '../util/async-iterable-stream';
12
12
  import { consumeStream } from '../util/consume-stream';
13
13
 
@@ -1,16 +1,16 @@
1
1
  import { z } from 'zod/v4';
2
2
  import {
3
- ProviderMetadata,
4
3
  providerMetadataSchema,
4
+ type ProviderMetadata,
5
5
  } from '../types/provider-metadata';
6
- import { FinishReason } from '../types/language-model';
7
- import {
6
+ import type { FinishReason } from '../types/language-model';
7
+ import type {
8
8
  InferUIMessageData,
9
9
  InferUIMessageMetadata,
10
10
  UIDataTypes,
11
11
  UIMessage,
12
12
  } from '../ui/ui-messages';
13
- import { ValueOf } from '../util/value-of';
13
+ import type { ValueOf } from '../util/value-of';
14
14
  import { lazySchema, zodSchema } from '@ai-sdk/provider-utils';
15
15
 
16
16
  export const uiMessageChunkSchema = lazySchema(() =>
@@ -1,5 +1,5 @@
1
- import { FinishReason } from '../types/language-model';
2
- import { UIMessage } from '../ui/ui-messages';
1
+ import type { FinishReason } from '../types/language-model';
2
+ import type { UIMessage } from '../ui/ui-messages';
3
3
 
4
4
  export type UIMessageStreamOnFinishCallback<UI_MESSAGE extends UIMessage> =
5
5
  (event: {
@@ -1,4 +1,4 @@
1
- import { UIMessage } from '../ui/ui-messages';
1
+ import type { UIMessage } from '../ui/ui-messages';
2
2
 
3
3
  /**
4
4
  * Callback that is called when a step finishes during streaming.
@@ -1,6 +1,6 @@
1
- import { UIMessage } from '../ui';
2
- import { ErrorHandler } from '../util/error-handler';
3
- import { InferUIMessageChunk } from './ui-message-chunks';
1
+ import type { UIMessage } from '../ui';
2
+ import type { ErrorHandler } from '../util/error-handler';
3
+ import type { InferUIMessageChunk } from './ui-message-chunks';
4
4
 
5
5
  export interface UIMessageStreamWriter<
6
6
  UI_MESSAGE extends UIMessage = UIMessage,
@@ -1,6 +1,6 @@
1
- import { ProviderMetadata } from '../types/provider-metadata';
2
- import { ProviderReference } from '../types/provider-reference';
3
- import { Warning } from '../types/warning';
1
+ import type { ProviderMetadata } from '../types/provider-metadata';
2
+ import type { ProviderReference } from '../types/provider-reference';
3
+ import type { Warning } from '../types/warning';
4
4
 
5
5
  export interface UploadFileResult {
6
6
  readonly providerReference: ProviderReference;
@@ -1,28 +1,24 @@
1
- import { FilesV4, ProviderV4 } from '@ai-sdk/provider';
1
+ import type {
2
+ FilesV4,
3
+ FilesV4UploadFileCallOptions,
4
+ ProviderV4,
5
+ } from '@ai-sdk/provider';
2
6
  import {
3
7
  convertBase64ToUint8Array,
4
- DataContent,
5
- ProviderOptions,
6
- } from '@ai-sdk/provider-utils';
7
- import { convertToLanguageModelV4DataContent } from '../prompt/data-content';
8
- import { ProviderMetadata } from '../types/provider-metadata';
9
- import { ProviderReference } from '../types/provider-reference';
10
- import { Warning } from '../types/warning';
11
- import {
12
- audioMediaTypeSignatures,
13
8
  detectMediaType,
14
- documentMediaTypeSignatures,
15
- imageMediaTypeSignatures,
16
- videoMediaTypeSignatures,
17
- } from '../util/detect-media-type';
18
- import { UploadFileResult } from './upload-file-result';
9
+ } from '@ai-sdk/provider-utils';
10
+ import type { ProviderMetadata } from '../types/provider-metadata';
11
+ import type { ProviderReference } from '../types/provider-reference';
12
+ import type { Warning } from '../types/warning';
13
+ import type { UploadFileResult } from './upload-file-result';
19
14
 
20
15
  /**
21
16
  * Uploads a file using a files API interface.
22
17
  *
23
18
  * @param api - The Files API interface to use for uploading.
24
- * @param data - The file data to upload.
25
- * @param mediaType - Optional IANA media type. Auto-detected from file bytes if not provided.
19
+ * @param data - The file data to upload (tagged `{ type: 'data' | 'text' }`).
20
+ * @param mediaType - Optional IANA media type. Auto-detected from file bytes
21
+ * when omitted (falls back to `text/plain` for the `text` variant).
26
22
  * @param filename - Optional filename for the uploaded file.
27
23
  * @param providerOptions - Additional provider-specific options.
28
24
  *
@@ -40,48 +36,30 @@ export async function uploadFile({
40
36
  * Can be a `FilesV4` instance or a `ProviderV4` instance with a `files()` method.
41
37
  */
42
38
  api: FilesV4 | ProviderV4;
43
-
44
- /**
45
- * The file data to upload.
46
- */
47
- data: DataContent;
48
-
49
- /**
50
- * Optional IANA media type of the file.
51
- * Auto-detected from file bytes if not provided.
52
- */
53
- mediaType?: string;
54
-
55
- /**
56
- * Optional filename for the uploaded file.
57
- */
58
- filename?: string;
59
-
60
- /**
61
- * Additional provider-specific options.
62
- */
63
- providerOptions?: ProviderOptions;
64
- }): Promise<UploadFileResult> {
65
- const { data } = convertToLanguageModelV4DataContent(dataArg);
66
-
67
- if (data instanceof URL) {
68
- throw new Error(
69
- 'URL data is not supported for file uploads. Fetch the URL content first and pass the bytes.',
70
- );
71
- }
39
+ } & Omit<FilesV4UploadFileCallOptions, 'mediaType' | 'data'> & {
40
+ /**
41
+ * The file data. Accepts the tagged `{ type: 'data' | 'text' }` shapes, or
42
+ * the shorthand `Uint8Array | string` (treated as `{ type: 'data', data }`).
43
+ */
44
+ data: FilesV4UploadFileCallOptions['data'] | Uint8Array | string;
45
+
46
+ /**
47
+ * Optional IANA media type of the file. Auto-detected from file bytes when
48
+ * omitted; falls back to `text/plain` for the `text` variant.
49
+ */
50
+ mediaType?: string;
51
+ }): Promise<UploadFileResult> {
52
+ const data: FilesV4UploadFileCallOptions['data'] =
53
+ dataArg instanceof Uint8Array || typeof dataArg === 'string'
54
+ ? { type: 'data', data: dataArg }
55
+ : dataArg;
72
56
 
73
57
  const mediaType =
74
58
  mediaTypeArg ??
75
- detectMediaType({
76
- data,
77
- signatures: [
78
- ...imageMediaTypeSignatures,
79
- ...documentMediaTypeSignatures,
80
- ...audioMediaTypeSignatures,
81
- ...videoMediaTypeSignatures,
82
- ],
83
- }) ??
84
- (isLikelyText(data) ? 'text/plain' : 'application/octet-stream');
59
+ (data.type === 'text'
60
+ ? 'text/plain'
61
+ : (detectMediaType({ data: data.data }) ??
62
+ (isLikelyText(data.data) ? 'text/plain' : 'application/octet-stream')));
85
63
 
86
64
  const filesApi: FilesV4 =
87
65
  'uploadFile' in api
@@ -1,6 +1,6 @@
1
- import { SkillsV4UploadSkillResult } from '@ai-sdk/provider';
2
- import { ProviderReference } from '../types/provider-reference';
3
- import { Warning } from '../types/warning';
1
+ import type { SkillsV4UploadSkillResult } from '@ai-sdk/provider';
2
+ import type { ProviderReference } from '../types/provider-reference';
3
+ import type { Warning } from '../types/warning';
4
4
 
5
5
  export type UploadSkillResult = Omit<
6
6
  SkillsV4UploadSkillResult,
@@ -1,6 +1,18 @@
1
- import { ProviderV4, SkillsV4, SkillsV4File } from '@ai-sdk/provider';
2
- import { ProviderOptions } from '@ai-sdk/provider-utils';
3
- import { UploadSkillResult } from './upload-skill-result';
1
+ import type {
2
+ ProviderV4,
3
+ SkillsV4,
4
+ SkillsV4File,
5
+ SkillsV4UploadSkillCallOptions,
6
+ } from '@ai-sdk/provider';
7
+ import type { UploadSkillResult } from './upload-skill-result';
8
+
9
+ type UploadSkillFile = Omit<SkillsV4File, 'data'> & {
10
+ /**
11
+ * The file data. Accepts the tagged `{ type: 'data' | 'text' }` shapes, or
12
+ * the shorthand `Uint8Array | string` (treated as `{ type: 'data', data }`).
13
+ */
14
+ data: SkillsV4File['data'] | Uint8Array | string;
15
+ };
4
16
 
5
17
  export async function uploadSkill({
6
18
  api,
@@ -9,10 +21,9 @@ export async function uploadSkill({
9
21
  providerOptions,
10
22
  }: {
11
23
  api: SkillsV4 | ProviderV4;
12
- files: SkillsV4File[];
13
- displayTitle?: string;
14
- providerOptions?: ProviderOptions;
15
- }): Promise<UploadSkillResult> {
24
+ } & Omit<SkillsV4UploadSkillCallOptions, 'files'> & {
25
+ files: UploadSkillFile[];
26
+ }): Promise<UploadSkillResult> {
16
27
  const skillsApi: SkillsV4 =
17
28
  'uploadSkill' in api
18
29
  ? api
@@ -24,8 +35,16 @@ export async function uploadSkill({
24
35
  );
25
36
  })();
26
37
 
38
+ const normalizedFiles: SkillsV4File[] = files.map(file => ({
39
+ ...file,
40
+ data:
41
+ file.data instanceof Uint8Array || typeof file.data === 'string'
42
+ ? { type: 'data', data: file.data }
43
+ : file.data,
44
+ }));
45
+
27
46
  const result = await skillsApi.uploadSkill({
28
- files,
47
+ files: normalizedFiles,
29
48
  displayTitle,
30
49
  providerOptions,
31
50
  });
@@ -1,4 +1,4 @@
1
- import { ErrorHandler } from './error-handler';
1
+ import type { ErrorHandler } from './error-handler';
2
2
 
3
3
  /**
4
4
  * Creates a Promise with externally accessible resolve and reject functions.
@@ -19,7 +19,7 @@
19
19
  // CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
20
20
  // IN THE SOFTWARE.
21
21
 
22
- import { FlexibleSchema, InferSchema } from '@ai-sdk/provider-utils';
22
+ import type { FlexibleSchema, InferSchema } from '@ai-sdk/provider-utils';
23
23
 
24
24
  /**
25
25
  * Create a type from an object with all keys and nested keys set to optional.
@@ -3,8 +3,6 @@ import {
3
3
  readResponseWithSizeLimit,
4
4
  DEFAULT_MAX_DOWNLOAD_SIZE,
5
5
  validateDownloadUrl,
6
- } from '@ai-sdk/provider-utils';
7
- import {
8
6
  withUserAgentSuffix,
9
7
  getRuntimeEnvironmentUserAgent,
10
8
  } from '@ai-sdk/provider-utils';
@@ -0,0 +1,18 @@
1
+ /**
2
+ * If `text` is exactly the wide `string` type, there are no string literals to
3
+ * preserve, so this resolves to `never`.
4
+ *
5
+ * If `text` is a string literal or a union of string literals, this resolves
6
+ * to that literal union unchanged.
7
+ *
8
+ * This is used when building template-literal model identifiers (for example
9
+ * `"provider:modelId"`) so that editors can suggest concrete `modelId` values
10
+ * when the underlying method parameter is narrowed, while falling back to a
11
+ * generic `"provider:${string}"` style overload when the parameter is only
12
+ * typed as `string`.
13
+ */
14
+ export type ExtractLiteralUnion<text> = text extends string
15
+ ? string extends text
16
+ ? never
17
+ : text
18
+ : never;
@@ -0,0 +1,3 @@
1
+ export function isNodeRuntime(): boolean {
2
+ return typeof process !== 'undefined' && process.release?.name === 'node';
3
+ }
@@ -1,4 +1,4 @@
1
- import { Arrayable, asArray } from '@ai-sdk/provider-utils';
1
+ import { asArray, type Arrayable } from '@ai-sdk/provider-utils';
2
2
  import type { Callback } from './callback';
3
3
 
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { JSONValue } from '@ai-sdk/provider';
1
+ import type { JSONValue } from '@ai-sdk/provider';
2
2
  import { safeParseJSON } from '@ai-sdk/provider-utils';
3
3
  import { fixJson } from './fix-json';
4
4
 
@@ -1,9 +1,8 @@
1
1
  import { InvalidArgumentError } from '../error/invalid-argument-error';
2
2
  import {
3
- RetryFunction,
4
3
  retryWithExponentialBackoffRespectingRetryHeaders,
4
+ type RetryFunction,
5
5
  } from '../util/retry-with-exponential-backoff';
6
-
7
6
  /**
8
7
  * Validate and prepare retries.
9
8
  */
@@ -1,4 +1,4 @@
1
- import { Job } from './job';
1
+ import type { Job } from './job';
2
2
 
3
3
  export class SerialJobExecutor {
4
4
  private queue: Array<Job> = [];
@@ -1,4 +1,4 @@
1
- import { ServerResponse } from 'node:http';
1
+ import type { ServerResponse } from 'node:http';
2
2
 
3
3
  /**
4
4
  * Writes the content of a stream to a server response.
@@ -1,235 +0,0 @@
1
- import { convertBase64ToUint8Array } from '@ai-sdk/provider-utils';
2
-
3
- export const imageMediaTypeSignatures = [
4
- {
5
- mediaType: 'image/gif' as const,
6
- bytesPrefix: [0x47, 0x49, 0x46], // GIF
7
- },
8
- {
9
- mediaType: 'image/png' as const,
10
- bytesPrefix: [0x89, 0x50, 0x4e, 0x47], // PNG
11
- },
12
- {
13
- mediaType: 'image/jpeg' as const,
14
- bytesPrefix: [0xff, 0xd8], // JPEG
15
- },
16
- {
17
- mediaType: 'image/webp' as const,
18
- bytesPrefix: [
19
- 0x52,
20
- 0x49,
21
- 0x46,
22
- 0x46, // "RIFF"
23
- null,
24
- null,
25
- null,
26
- null, // file size (variable)
27
- 0x57,
28
- 0x45,
29
- 0x42,
30
- 0x50, // "WEBP"
31
- ],
32
- },
33
- {
34
- mediaType: 'image/bmp' as const,
35
- bytesPrefix: [0x42, 0x4d],
36
- },
37
- {
38
- mediaType: 'image/tiff' as const,
39
- bytesPrefix: [0x49, 0x49, 0x2a, 0x00],
40
- },
41
- {
42
- mediaType: 'image/tiff' as const,
43
- bytesPrefix: [0x4d, 0x4d, 0x00, 0x2a],
44
- },
45
- {
46
- mediaType: 'image/avif' as const,
47
- bytesPrefix: [
48
- 0x00, 0x00, 0x00, 0x20, 0x66, 0x74, 0x79, 0x70, 0x61, 0x76, 0x69, 0x66,
49
- ],
50
- },
51
- {
52
- mediaType: 'image/heic' as const,
53
- bytesPrefix: [
54
- 0x00, 0x00, 0x00, 0x20, 0x66, 0x74, 0x79, 0x70, 0x68, 0x65, 0x69, 0x63,
55
- ],
56
- },
57
- ] as const;
58
-
59
- export const documentMediaTypeSignatures = [
60
- {
61
- mediaType: 'application/pdf' as const,
62
- bytesPrefix: [0x25, 0x50, 0x44, 0x46], // %PDF
63
- },
64
- ] as const;
65
-
66
- export const audioMediaTypeSignatures = [
67
- {
68
- mediaType: 'audio/mpeg' as const,
69
- bytesPrefix: [0xff, 0xfb],
70
- },
71
- {
72
- mediaType: 'audio/mpeg' as const,
73
- bytesPrefix: [0xff, 0xfa],
74
- },
75
- {
76
- mediaType: 'audio/mpeg' as const,
77
- bytesPrefix: [0xff, 0xf3],
78
- },
79
- {
80
- mediaType: 'audio/mpeg' as const,
81
- bytesPrefix: [0xff, 0xf2],
82
- },
83
- {
84
- mediaType: 'audio/mpeg' as const,
85
- bytesPrefix: [0xff, 0xe3],
86
- },
87
- {
88
- mediaType: 'audio/mpeg' as const,
89
- bytesPrefix: [0xff, 0xe2],
90
- },
91
- {
92
- mediaType: 'audio/wav' as const,
93
- bytesPrefix: [
94
- 0x52, // R
95
- 0x49, // I
96
- 0x46, // F
97
- 0x46, // F
98
- null,
99
- null,
100
- null,
101
- null,
102
- 0x57, // W
103
- 0x41, // A
104
- 0x56, // V
105
- 0x45, // E
106
- ],
107
- },
108
- {
109
- mediaType: 'audio/ogg' as const,
110
- bytesPrefix: [0x4f, 0x67, 0x67, 0x53],
111
- },
112
- {
113
- mediaType: 'audio/flac' as const,
114
- bytesPrefix: [0x66, 0x4c, 0x61, 0x43],
115
- },
116
- {
117
- mediaType: 'audio/aac' as const,
118
- bytesPrefix: [0x40, 0x15, 0x00, 0x00],
119
- },
120
- {
121
- mediaType: 'audio/mp4' as const,
122
- bytesPrefix: [0x66, 0x74, 0x79, 0x70],
123
- },
124
- {
125
- mediaType: 'audio/webm',
126
- bytesPrefix: [0x1a, 0x45, 0xdf, 0xa3],
127
- },
128
- ] as const;
129
-
130
- export const videoMediaTypeSignatures = [
131
- {
132
- mediaType: 'video/mp4' as const,
133
- bytesPrefix: [
134
- 0x00,
135
- 0x00,
136
- 0x00,
137
- null,
138
- 0x66,
139
- 0x74,
140
- 0x79,
141
- 0x70, // ftyp
142
- ],
143
- },
144
- {
145
- mediaType: 'video/webm' as const,
146
- bytesPrefix: [0x1a, 0x45, 0xdf, 0xa3], // EBML
147
- },
148
- {
149
- mediaType: 'video/quicktime' as const,
150
- bytesPrefix: [
151
- 0x00,
152
- 0x00,
153
- 0x00,
154
- 0x14,
155
- 0x66,
156
- 0x74,
157
- 0x79,
158
- 0x70,
159
- 0x71,
160
- 0x74, // ftypqt
161
- ],
162
- },
163
- {
164
- mediaType: 'video/x-msvideo' as const,
165
- bytesPrefix: [0x52, 0x49, 0x46, 0x46], // RIFF (AVI)
166
- },
167
- ] as const;
168
-
169
- const stripID3 = (data: Uint8Array | string) => {
170
- const bytes =
171
- typeof data === 'string' ? convertBase64ToUint8Array(data) : data;
172
- const id3Size =
173
- ((bytes[6] & 0x7f) << 21) |
174
- ((bytes[7] & 0x7f) << 14) |
175
- ((bytes[8] & 0x7f) << 7) |
176
- (bytes[9] & 0x7f);
177
-
178
- // The raw MP3 starts here
179
- return bytes.slice(id3Size + 10);
180
- };
181
-
182
- function stripID3TagsIfPresent(data: Uint8Array | string): Uint8Array | string {
183
- const hasId3 =
184
- (typeof data === 'string' && data.startsWith('SUQz')) ||
185
- (typeof data !== 'string' &&
186
- data.length > 10 &&
187
- data[0] === 0x49 && // 'I'
188
- data[1] === 0x44 && // 'D'
189
- data[2] === 0x33); // '3'
190
-
191
- return hasId3 ? stripID3(data) : data;
192
- }
193
-
194
- /**
195
- * Detect the media IANA media type of a file using a list of signatures.
196
- *
197
- * @param data - The file data.
198
- * @param signatures - The signatures to use for detection.
199
- * @returns The media type of the file.
200
- */
201
- type MediaTypeSignatures = ReadonlyArray<{
202
- readonly mediaType: string;
203
- readonly bytesPrefix: ReadonlyArray<number | null>;
204
- }>;
205
-
206
- export function detectMediaType<T extends MediaTypeSignatures>({
207
- data,
208
- signatures,
209
- }: {
210
- data: Uint8Array | string;
211
- signatures: T;
212
- }): T[number]['mediaType'] | undefined {
213
- const processedData = stripID3TagsIfPresent(data);
214
-
215
- // Convert the first ~18 bytes (24 base64 chars) for consistent detection logic:
216
- const bytes =
217
- typeof processedData === 'string'
218
- ? convertBase64ToUint8Array(
219
- processedData.substring(0, Math.min(processedData.length, 24)),
220
- )
221
- : processedData;
222
-
223
- for (const signature of signatures) {
224
- if (
225
- bytes.length >= signature.bytesPrefix.length &&
226
- signature.bytesPrefix.every(
227
- (byte, index) => byte === null || bytes[index] === byte,
228
- )
229
- ) {
230
- return signature.mediaType;
231
- }
232
- }
233
-
234
- return undefined;
235
- }