@fondation-io/ai 7.0.0-beta.45

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 (536) hide show
  1. package/CHANGELOG.md +7687 -0
  2. package/README.md +238 -0
  3. package/dist/index.d.mts +7056 -0
  4. package/dist/index.d.ts +7056 -0
  5. package/dist/index.js +14607 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/index.mjs +14578 -0
  8. package/dist/index.mjs.map +1 -0
  9. package/dist/internal/index.d.mts +303 -0
  10. package/dist/internal/index.d.ts +303 -0
  11. package/dist/internal/index.js +1352 -0
  12. package/dist/internal/index.js.map +1 -0
  13. package/dist/internal/index.mjs +1336 -0
  14. package/dist/internal/index.mjs.map +1 -0
  15. package/dist/test/index.d.mts +265 -0
  16. package/dist/test/index.d.ts +265 -0
  17. package/dist/test/index.js +509 -0
  18. package/dist/test/index.js.map +1 -0
  19. package/dist/test/index.mjs +472 -0
  20. package/dist/test/index.mjs.map +1 -0
  21. package/docs/00-introduction/index.mdx +76 -0
  22. package/docs/02-foundations/01-overview.mdx +43 -0
  23. package/docs/02-foundations/02-providers-and-models.mdx +160 -0
  24. package/docs/02-foundations/03-prompts.mdx +616 -0
  25. package/docs/02-foundations/04-tools.mdx +251 -0
  26. package/docs/02-foundations/05-streaming.mdx +62 -0
  27. package/docs/02-foundations/06-provider-options.mdx +345 -0
  28. package/docs/02-foundations/index.mdx +49 -0
  29. package/docs/02-getting-started/00-choosing-a-provider.mdx +110 -0
  30. package/docs/02-getting-started/01-navigating-the-library.mdx +85 -0
  31. package/docs/02-getting-started/02-nextjs-app-router.mdx +559 -0
  32. package/docs/02-getting-started/03-nextjs-pages-router.mdx +542 -0
  33. package/docs/02-getting-started/04-svelte.mdx +627 -0
  34. package/docs/02-getting-started/05-nuxt.mdx +566 -0
  35. package/docs/02-getting-started/06-nodejs.mdx +512 -0
  36. package/docs/02-getting-started/07-expo.mdx +766 -0
  37. package/docs/02-getting-started/08-tanstack-start.mdx +583 -0
  38. package/docs/02-getting-started/09-coding-agents.mdx +179 -0
  39. package/docs/02-getting-started/index.mdx +44 -0
  40. package/docs/03-agents/01-overview.mdx +96 -0
  41. package/docs/03-agents/02-building-agents.mdx +449 -0
  42. package/docs/03-agents/03-workflows.mdx +386 -0
  43. package/docs/03-agents/04-loop-control.mdx +394 -0
  44. package/docs/03-agents/05-configuring-call-options.mdx +286 -0
  45. package/docs/03-agents/06-memory.mdx +222 -0
  46. package/docs/03-agents/06-subagents.mdx +362 -0
  47. package/docs/03-agents/index.mdx +46 -0
  48. package/docs/03-ai-sdk-core/01-overview.mdx +31 -0
  49. package/docs/03-ai-sdk-core/05-generating-text.mdx +707 -0
  50. package/docs/03-ai-sdk-core/10-generating-structured-data.mdx +498 -0
  51. package/docs/03-ai-sdk-core/15-tools-and-tool-calling.mdx +1148 -0
  52. package/docs/03-ai-sdk-core/16-mcp-tools.mdx +383 -0
  53. package/docs/03-ai-sdk-core/20-prompt-engineering.mdx +146 -0
  54. package/docs/03-ai-sdk-core/25-settings.mdx +216 -0
  55. package/docs/03-ai-sdk-core/26-reasoning.mdx +190 -0
  56. package/docs/03-ai-sdk-core/30-embeddings.mdx +236 -0
  57. package/docs/03-ai-sdk-core/31-reranking.mdx +218 -0
  58. package/docs/03-ai-sdk-core/35-image-generation.mdx +341 -0
  59. package/docs/03-ai-sdk-core/36-transcription.mdx +227 -0
  60. package/docs/03-ai-sdk-core/37-speech.mdx +169 -0
  61. package/docs/03-ai-sdk-core/38-video-generation.mdx +366 -0
  62. package/docs/03-ai-sdk-core/40-middleware.mdx +485 -0
  63. package/docs/03-ai-sdk-core/45-provider-management.mdx +349 -0
  64. package/docs/03-ai-sdk-core/50-error-handling.mdx +149 -0
  65. package/docs/03-ai-sdk-core/55-testing.mdx +219 -0
  66. package/docs/03-ai-sdk-core/60-telemetry.mdx +391 -0
  67. package/docs/03-ai-sdk-core/65-devtools.mdx +107 -0
  68. package/docs/03-ai-sdk-core/65-event-listeners.mdx +1303 -0
  69. package/docs/03-ai-sdk-core/index.mdx +99 -0
  70. package/docs/04-ai-sdk-ui/01-overview.mdx +44 -0
  71. package/docs/04-ai-sdk-ui/02-chatbot.mdx +1320 -0
  72. package/docs/04-ai-sdk-ui/03-chatbot-message-persistence.mdx +534 -0
  73. package/docs/04-ai-sdk-ui/03-chatbot-resume-streams.mdx +263 -0
  74. package/docs/04-ai-sdk-ui/03-chatbot-tool-usage.mdx +682 -0
  75. package/docs/04-ai-sdk-ui/04-generative-user-interfaces.mdx +389 -0
  76. package/docs/04-ai-sdk-ui/05-completion.mdx +181 -0
  77. package/docs/04-ai-sdk-ui/08-object-generation.mdx +344 -0
  78. package/docs/04-ai-sdk-ui/20-streaming-data.mdx +397 -0
  79. package/docs/04-ai-sdk-ui/21-error-handling.mdx +190 -0
  80. package/docs/04-ai-sdk-ui/21-transport.mdx +174 -0
  81. package/docs/04-ai-sdk-ui/24-reading-ui-message-streams.mdx +104 -0
  82. package/docs/04-ai-sdk-ui/25-message-metadata.mdx +152 -0
  83. package/docs/04-ai-sdk-ui/50-stream-protocol.mdx +503 -0
  84. package/docs/04-ai-sdk-ui/index.mdx +64 -0
  85. package/docs/05-ai-sdk-rsc/01-overview.mdx +45 -0
  86. package/docs/05-ai-sdk-rsc/02-streaming-react-components.mdx +209 -0
  87. package/docs/05-ai-sdk-rsc/03-generative-ui-state.mdx +279 -0
  88. package/docs/05-ai-sdk-rsc/03-saving-and-restoring-states.mdx +105 -0
  89. package/docs/05-ai-sdk-rsc/04-multistep-interfaces.mdx +282 -0
  90. package/docs/05-ai-sdk-rsc/05-streaming-values.mdx +157 -0
  91. package/docs/05-ai-sdk-rsc/06-loading-state.mdx +273 -0
  92. package/docs/05-ai-sdk-rsc/08-error-handling.mdx +94 -0
  93. package/docs/05-ai-sdk-rsc/09-authentication.mdx +42 -0
  94. package/docs/05-ai-sdk-rsc/10-migrating-to-ui.mdx +722 -0
  95. package/docs/05-ai-sdk-rsc/index.mdx +63 -0
  96. package/docs/06-advanced/01-prompt-engineering.mdx +96 -0
  97. package/docs/06-advanced/02-stopping-streams.mdx +184 -0
  98. package/docs/06-advanced/03-backpressure.mdx +173 -0
  99. package/docs/06-advanced/04-caching.mdx +169 -0
  100. package/docs/06-advanced/05-multiple-streamables.mdx +68 -0
  101. package/docs/06-advanced/06-rate-limiting.mdx +60 -0
  102. package/docs/06-advanced/07-rendering-ui-with-language-models.mdx +225 -0
  103. package/docs/06-advanced/08-model-as-router.mdx +120 -0
  104. package/docs/06-advanced/09-multistep-interfaces.mdx +115 -0
  105. package/docs/06-advanced/09-sequential-generations.mdx +55 -0
  106. package/docs/06-advanced/10-vercel-deployment-guide.mdx +117 -0
  107. package/docs/06-advanced/index.mdx +11 -0
  108. package/docs/07-reference/01-ai-sdk-core/01-generate-text.mdx +2785 -0
  109. package/docs/07-reference/01-ai-sdk-core/02-stream-text.mdx +3752 -0
  110. package/docs/07-reference/01-ai-sdk-core/05-embed.mdx +332 -0
  111. package/docs/07-reference/01-ai-sdk-core/06-embed-many.mdx +330 -0
  112. package/docs/07-reference/01-ai-sdk-core/06-rerank.mdx +323 -0
  113. package/docs/07-reference/01-ai-sdk-core/10-generate-image.mdx +251 -0
  114. package/docs/07-reference/01-ai-sdk-core/11-transcribe.mdx +152 -0
  115. package/docs/07-reference/01-ai-sdk-core/12-generate-speech.mdx +221 -0
  116. package/docs/07-reference/01-ai-sdk-core/13-generate-video.mdx +264 -0
  117. package/docs/07-reference/01-ai-sdk-core/15-agent.mdx +235 -0
  118. package/docs/07-reference/01-ai-sdk-core/16-tool-loop-agent.mdx +973 -0
  119. package/docs/07-reference/01-ai-sdk-core/17-create-agent-ui-stream.mdx +154 -0
  120. package/docs/07-reference/01-ai-sdk-core/18-create-agent-ui-stream-response.mdx +173 -0
  121. package/docs/07-reference/01-ai-sdk-core/18-pipe-agent-ui-stream-to-response.mdx +150 -0
  122. package/docs/07-reference/01-ai-sdk-core/20-tool.mdx +209 -0
  123. package/docs/07-reference/01-ai-sdk-core/22-dynamic-tool.mdx +223 -0
  124. package/docs/07-reference/01-ai-sdk-core/23-create-mcp-client.mdx +423 -0
  125. package/docs/07-reference/01-ai-sdk-core/24-mcp-stdio-transport.mdx +68 -0
  126. package/docs/07-reference/01-ai-sdk-core/25-json-schema.mdx +94 -0
  127. package/docs/07-reference/01-ai-sdk-core/26-zod-schema.mdx +109 -0
  128. package/docs/07-reference/01-ai-sdk-core/27-valibot-schema.mdx +58 -0
  129. package/docs/07-reference/01-ai-sdk-core/28-output.mdx +342 -0
  130. package/docs/07-reference/01-ai-sdk-core/30-model-message.mdx +435 -0
  131. package/docs/07-reference/01-ai-sdk-core/31-ui-message.mdx +264 -0
  132. package/docs/07-reference/01-ai-sdk-core/32-validate-ui-messages.mdx +101 -0
  133. package/docs/07-reference/01-ai-sdk-core/33-safe-validate-ui-messages.mdx +113 -0
  134. package/docs/07-reference/01-ai-sdk-core/40-provider-registry.mdx +198 -0
  135. package/docs/07-reference/01-ai-sdk-core/42-custom-provider.mdx +157 -0
  136. package/docs/07-reference/01-ai-sdk-core/50-cosine-similarity.mdx +52 -0
  137. package/docs/07-reference/01-ai-sdk-core/60-wrap-language-model.mdx +59 -0
  138. package/docs/07-reference/01-ai-sdk-core/61-wrap-image-model.mdx +64 -0
  139. package/docs/07-reference/01-ai-sdk-core/65-language-model-v2-middleware.mdx +74 -0
  140. package/docs/07-reference/01-ai-sdk-core/66-extract-reasoning-middleware.mdx +68 -0
  141. package/docs/07-reference/01-ai-sdk-core/67-simulate-streaming-middleware.mdx +71 -0
  142. package/docs/07-reference/01-ai-sdk-core/68-default-settings-middleware.mdx +80 -0
  143. package/docs/07-reference/01-ai-sdk-core/69-add-tool-input-examples-middleware.mdx +155 -0
  144. package/docs/07-reference/01-ai-sdk-core/70-extract-json-middleware.mdx +147 -0
  145. package/docs/07-reference/01-ai-sdk-core/70-step-count-is.mdx +84 -0
  146. package/docs/07-reference/01-ai-sdk-core/71-has-tool-call.mdx +120 -0
  147. package/docs/07-reference/01-ai-sdk-core/75-simulate-readable-stream.mdx +94 -0
  148. package/docs/07-reference/01-ai-sdk-core/80-smooth-stream.mdx +145 -0
  149. package/docs/07-reference/01-ai-sdk-core/90-generate-id.mdx +30 -0
  150. package/docs/07-reference/01-ai-sdk-core/91-create-id-generator.mdx +89 -0
  151. package/docs/07-reference/01-ai-sdk-core/92-default-generated-file.mdx +68 -0
  152. package/docs/07-reference/01-ai-sdk-core/index.mdx +160 -0
  153. package/docs/07-reference/02-ai-sdk-ui/01-use-chat.mdx +493 -0
  154. package/docs/07-reference/02-ai-sdk-ui/02-use-completion.mdx +185 -0
  155. package/docs/07-reference/02-ai-sdk-ui/03-use-object.mdx +196 -0
  156. package/docs/07-reference/02-ai-sdk-ui/31-convert-to-model-messages.mdx +231 -0
  157. package/docs/07-reference/02-ai-sdk-ui/32-prune-messages.mdx +108 -0
  158. package/docs/07-reference/02-ai-sdk-ui/40-create-ui-message-stream.mdx +162 -0
  159. package/docs/07-reference/02-ai-sdk-ui/41-create-ui-message-stream-response.mdx +119 -0
  160. package/docs/07-reference/02-ai-sdk-ui/42-pipe-ui-message-stream-to-response.mdx +77 -0
  161. package/docs/07-reference/02-ai-sdk-ui/43-read-ui-message-stream.mdx +57 -0
  162. package/docs/07-reference/02-ai-sdk-ui/46-infer-ui-tools.mdx +99 -0
  163. package/docs/07-reference/02-ai-sdk-ui/47-infer-ui-tool.mdx +75 -0
  164. package/docs/07-reference/02-ai-sdk-ui/50-direct-chat-transport.mdx +333 -0
  165. package/docs/07-reference/02-ai-sdk-ui/index.mdx +89 -0
  166. package/docs/07-reference/03-ai-sdk-rsc/01-stream-ui.mdx +767 -0
  167. package/docs/07-reference/03-ai-sdk-rsc/02-create-ai.mdx +90 -0
  168. package/docs/07-reference/03-ai-sdk-rsc/03-create-streamable-ui.mdx +91 -0
  169. package/docs/07-reference/03-ai-sdk-rsc/04-create-streamable-value.mdx +78 -0
  170. package/docs/07-reference/03-ai-sdk-rsc/05-read-streamable-value.mdx +79 -0
  171. package/docs/07-reference/03-ai-sdk-rsc/06-get-ai-state.mdx +50 -0
  172. package/docs/07-reference/03-ai-sdk-rsc/07-get-mutable-ai-state.mdx +70 -0
  173. package/docs/07-reference/03-ai-sdk-rsc/08-use-ai-state.mdx +26 -0
  174. package/docs/07-reference/03-ai-sdk-rsc/09-use-actions.mdx +42 -0
  175. package/docs/07-reference/03-ai-sdk-rsc/10-use-ui-state.mdx +35 -0
  176. package/docs/07-reference/03-ai-sdk-rsc/11-use-streamable-value.mdx +46 -0
  177. package/docs/07-reference/03-ai-sdk-rsc/20-render.mdx +266 -0
  178. package/docs/07-reference/03-ai-sdk-rsc/index.mdx +67 -0
  179. package/docs/07-reference/05-ai-sdk-errors/ai-api-call-error.mdx +31 -0
  180. package/docs/07-reference/05-ai-sdk-errors/ai-download-error.mdx +28 -0
  181. package/docs/07-reference/05-ai-sdk-errors/ai-empty-response-body-error.mdx +24 -0
  182. package/docs/07-reference/05-ai-sdk-errors/ai-invalid-argument-error.mdx +26 -0
  183. package/docs/07-reference/05-ai-sdk-errors/ai-invalid-data-content-error.mdx +26 -0
  184. package/docs/07-reference/05-ai-sdk-errors/ai-invalid-message-role-error.mdx +25 -0
  185. package/docs/07-reference/05-ai-sdk-errors/ai-invalid-prompt-error.mdx +47 -0
  186. package/docs/07-reference/05-ai-sdk-errors/ai-invalid-response-data-error.mdx +25 -0
  187. package/docs/07-reference/05-ai-sdk-errors/ai-invalid-tool-approval-error.mdx +24 -0
  188. package/docs/07-reference/05-ai-sdk-errors/ai-invalid-tool-input-error.mdx +27 -0
  189. package/docs/07-reference/05-ai-sdk-errors/ai-json-parse-error.mdx +25 -0
  190. package/docs/07-reference/05-ai-sdk-errors/ai-load-api-key-error.mdx +24 -0
  191. package/docs/07-reference/05-ai-sdk-errors/ai-load-setting-error.mdx +24 -0
  192. package/docs/07-reference/05-ai-sdk-errors/ai-message-conversion-error.mdx +25 -0
  193. package/docs/07-reference/05-ai-sdk-errors/ai-no-content-generated-error.mdx +24 -0
  194. package/docs/07-reference/05-ai-sdk-errors/ai-no-image-generated-error.mdx +36 -0
  195. package/docs/07-reference/05-ai-sdk-errors/ai-no-object-generated-error.mdx +43 -0
  196. package/docs/07-reference/05-ai-sdk-errors/ai-no-output-generated-error.mdx +25 -0
  197. package/docs/07-reference/05-ai-sdk-errors/ai-no-speech-generated-error.mdx +24 -0
  198. package/docs/07-reference/05-ai-sdk-errors/ai-no-such-model-error.mdx +26 -0
  199. package/docs/07-reference/05-ai-sdk-errors/ai-no-such-provider-error.mdx +28 -0
  200. package/docs/07-reference/05-ai-sdk-errors/ai-no-such-tool-error.mdx +26 -0
  201. package/docs/07-reference/05-ai-sdk-errors/ai-no-transcript-generated-error.mdx +24 -0
  202. package/docs/07-reference/05-ai-sdk-errors/ai-no-video-generated-error.mdx +39 -0
  203. package/docs/07-reference/05-ai-sdk-errors/ai-retry-error.mdx +27 -0
  204. package/docs/07-reference/05-ai-sdk-errors/ai-too-many-embedding-values-for-call-error.mdx +27 -0
  205. package/docs/07-reference/05-ai-sdk-errors/ai-tool-call-not-found-for-approval-error.mdx +25 -0
  206. package/docs/07-reference/05-ai-sdk-errors/ai-tool-call-repair-error.mdx +28 -0
  207. package/docs/07-reference/05-ai-sdk-errors/ai-type-validation-error.mdx +25 -0
  208. package/docs/07-reference/05-ai-sdk-errors/ai-ui-message-stream-error.mdx +67 -0
  209. package/docs/07-reference/05-ai-sdk-errors/ai-unsupported-functionality-error.mdx +25 -0
  210. package/docs/07-reference/05-ai-sdk-errors/index.mdx +39 -0
  211. package/docs/07-reference/index.mdx +28 -0
  212. package/docs/08-migration-guides/00-versioning.mdx +46 -0
  213. package/docs/08-migration-guides/23-migration-guide-7-0.mdx +95 -0
  214. package/docs/08-migration-guides/24-migration-guide-6-0.mdx +823 -0
  215. package/docs/08-migration-guides/25-migration-guide-5-0-data.mdx +882 -0
  216. package/docs/08-migration-guides/26-migration-guide-5-0.mdx +3427 -0
  217. package/docs/08-migration-guides/27-migration-guide-4-2.mdx +99 -0
  218. package/docs/08-migration-guides/28-migration-guide-4-1.mdx +14 -0
  219. package/docs/08-migration-guides/29-migration-guide-4-0.mdx +1157 -0
  220. package/docs/08-migration-guides/36-migration-guide-3-4.mdx +14 -0
  221. package/docs/08-migration-guides/37-migration-guide-3-3.mdx +64 -0
  222. package/docs/08-migration-guides/38-migration-guide-3-2.mdx +46 -0
  223. package/docs/08-migration-guides/39-migration-guide-3-1.mdx +168 -0
  224. package/docs/08-migration-guides/index.mdx +22 -0
  225. package/docs/09-troubleshooting/01-azure-stream-slow.mdx +33 -0
  226. package/docs/09-troubleshooting/03-server-actions-in-client-components.mdx +40 -0
  227. package/docs/09-troubleshooting/04-strange-stream-output.mdx +36 -0
  228. package/docs/09-troubleshooting/05-streamable-ui-errors.mdx +16 -0
  229. package/docs/09-troubleshooting/05-tool-invocation-missing-result.mdx +106 -0
  230. package/docs/09-troubleshooting/06-streaming-not-working-when-deployed.mdx +31 -0
  231. package/docs/09-troubleshooting/06-streaming-not-working-when-proxied.mdx +31 -0
  232. package/docs/09-troubleshooting/06-timeout-on-vercel.mdx +60 -0
  233. package/docs/09-troubleshooting/07-unclosed-streams.mdx +34 -0
  234. package/docs/09-troubleshooting/08-use-chat-failed-to-parse-stream.mdx +26 -0
  235. package/docs/09-troubleshooting/09-client-stream-error.mdx +25 -0
  236. package/docs/09-troubleshooting/10-use-chat-tools-no-response.mdx +32 -0
  237. package/docs/09-troubleshooting/11-use-chat-custom-request-options.mdx +149 -0
  238. package/docs/09-troubleshooting/12-typescript-performance-zod.mdx +46 -0
  239. package/docs/09-troubleshooting/12-use-chat-an-error-occurred.mdx +59 -0
  240. package/docs/09-troubleshooting/13-repeated-assistant-messages.mdx +73 -0
  241. package/docs/09-troubleshooting/14-stream-abort-handling.mdx +73 -0
  242. package/docs/09-troubleshooting/14-tool-calling-with-structured-outputs.mdx +48 -0
  243. package/docs/09-troubleshooting/15-abort-breaks-resumable-streams.mdx +55 -0
  244. package/docs/09-troubleshooting/15-stream-text-not-working.mdx +33 -0
  245. package/docs/09-troubleshooting/16-streaming-status-delay.mdx +63 -0
  246. package/docs/09-troubleshooting/17-use-chat-stale-body-data.mdx +141 -0
  247. package/docs/09-troubleshooting/18-ontoolcall-type-narrowing.mdx +66 -0
  248. package/docs/09-troubleshooting/19-unsupported-model-version.mdx +50 -0
  249. package/docs/09-troubleshooting/20-no-object-generated-content-filter.mdx +76 -0
  250. package/docs/09-troubleshooting/21-missing-tool-results-error.mdx +82 -0
  251. package/docs/09-troubleshooting/30-model-is-not-assignable-to-type.mdx +21 -0
  252. package/docs/09-troubleshooting/40-typescript-cannot-find-namespace-jsx.mdx +24 -0
  253. package/docs/09-troubleshooting/50-react-maximum-update-depth-exceeded.mdx +39 -0
  254. package/docs/09-troubleshooting/60-jest-cannot-find-module-ai-rsc.mdx +22 -0
  255. package/docs/09-troubleshooting/70-high-memory-usage-with-images.mdx +108 -0
  256. package/docs/09-troubleshooting/index.mdx +11 -0
  257. package/internal.d.ts +1 -0
  258. package/package.json +120 -0
  259. package/src/agent/agent.ts +156 -0
  260. package/src/agent/create-agent-ui-stream-response.ts +61 -0
  261. package/src/agent/create-agent-ui-stream.ts +84 -0
  262. package/src/agent/index.ts +37 -0
  263. package/src/agent/infer-agent-tools.ts +7 -0
  264. package/src/agent/infer-agent-ui-message.ts +11 -0
  265. package/src/agent/pipe-agent-ui-stream-to-response.ts +64 -0
  266. package/src/agent/tool-loop-agent-settings.ts +252 -0
  267. package/src/agent/tool-loop-agent.ts +205 -0
  268. package/src/embed/embed-events.ts +181 -0
  269. package/src/embed/embed-many-result.ts +53 -0
  270. package/src/embed/embed-many.ts +428 -0
  271. package/src/embed/embed-result.ts +50 -0
  272. package/src/embed/embed.ts +266 -0
  273. package/src/embed/index.ts +5 -0
  274. package/src/error/index.ts +37 -0
  275. package/src/error/invalid-argument-error.ts +34 -0
  276. package/src/error/invalid-stream-part-error.ts +28 -0
  277. package/src/error/invalid-tool-approval-error.ts +26 -0
  278. package/src/error/invalid-tool-input-error.ts +33 -0
  279. package/src/error/missing-tool-result-error.ts +28 -0
  280. package/src/error/no-image-generated-error.ts +39 -0
  281. package/src/error/no-object-generated-error.ts +70 -0
  282. package/src/error/no-output-generated-error.ts +26 -0
  283. package/src/error/no-speech-generated-error.ts +28 -0
  284. package/src/error/no-such-tool-error.ts +35 -0
  285. package/src/error/no-transcript-generated-error.ts +30 -0
  286. package/src/error/no-video-generated-error.ts +57 -0
  287. package/src/error/tool-call-not-found-for-approval-error.ts +32 -0
  288. package/src/error/tool-call-repair-error.ts +30 -0
  289. package/src/error/ui-message-stream-error.ts +48 -0
  290. package/src/error/unsupported-model-version-error.ts +23 -0
  291. package/src/error/verify-no-object-generated-error.ts +27 -0
  292. package/src/generate-image/generate-image-result.ts +42 -0
  293. package/src/generate-image/generate-image.ts +361 -0
  294. package/src/generate-image/index.ts +18 -0
  295. package/src/generate-object/generate-object-result.ts +67 -0
  296. package/src/generate-object/generate-object.ts +514 -0
  297. package/src/generate-object/index.ts +9 -0
  298. package/src/generate-object/inject-json-instruction.ts +30 -0
  299. package/src/generate-object/output-strategy.ts +415 -0
  300. package/src/generate-object/parse-and-validate-object-result.ts +111 -0
  301. package/src/generate-object/repair-text.ts +12 -0
  302. package/src/generate-object/stream-object-result.ts +120 -0
  303. package/src/generate-object/stream-object.ts +984 -0
  304. package/src/generate-object/validate-object-generation-input.ts +144 -0
  305. package/src/generate-speech/generate-speech-result.ts +30 -0
  306. package/src/generate-speech/generate-speech.ts +191 -0
  307. package/src/generate-speech/generated-audio-file.ts +65 -0
  308. package/src/generate-speech/index.ts +3 -0
  309. package/src/generate-text/collect-tool-approvals.ts +116 -0
  310. package/src/generate-text/content-part.ts +31 -0
  311. package/src/generate-text/core-events.ts +390 -0
  312. package/src/generate-text/create-execute-tools-transformation.ts +144 -0
  313. package/src/generate-text/execute-tool-call.ts +190 -0
  314. package/src/generate-text/extract-reasoning-content.ts +17 -0
  315. package/src/generate-text/extract-text-content.ts +15 -0
  316. package/src/generate-text/generate-text-result.ts +168 -0
  317. package/src/generate-text/generate-text.ts +1445 -0
  318. package/src/generate-text/generated-file.ts +70 -0
  319. package/src/generate-text/index.ts +78 -0
  320. package/src/generate-text/invoke-tool-callbacks-from-stream.ts +81 -0
  321. package/src/generate-text/is-approval-needed.ts +29 -0
  322. package/src/generate-text/output-utils.ts +23 -0
  323. package/src/generate-text/output.ts +590 -0
  324. package/src/generate-text/parse-tool-call.ts +188 -0
  325. package/src/generate-text/prepare-step.ts +103 -0
  326. package/src/generate-text/prune-messages.ts +167 -0
  327. package/src/generate-text/reasoning-output.ts +99 -0
  328. package/src/generate-text/reasoning.ts +10 -0
  329. package/src/generate-text/response-message.ts +10 -0
  330. package/src/generate-text/smooth-stream.ts +162 -0
  331. package/src/generate-text/step-result.ts +310 -0
  332. package/src/generate-text/stop-condition.ts +29 -0
  333. package/src/generate-text/stream-model-call.ts +418 -0
  334. package/src/generate-text/stream-text-result.ts +536 -0
  335. package/src/generate-text/stream-text.ts +2696 -0
  336. package/src/generate-text/to-response-messages.ts +195 -0
  337. package/src/generate-text/tool-approval-request-output.ts +21 -0
  338. package/src/generate-text/tool-call-repair-function.ts +27 -0
  339. package/src/generate-text/tool-call.ts +47 -0
  340. package/src/generate-text/tool-error.ts +34 -0
  341. package/src/generate-text/tool-output-denied.ts +21 -0
  342. package/src/generate-text/tool-output.ts +7 -0
  343. package/src/generate-text/tool-result.ts +36 -0
  344. package/src/generate-text/tool-set.ts +14 -0
  345. package/src/generate-video/generate-video-result.ts +36 -0
  346. package/src/generate-video/generate-video.ts +402 -0
  347. package/src/generate-video/index.ts +3 -0
  348. package/src/global.ts +36 -0
  349. package/src/index.ts +49 -0
  350. package/src/logger/index.ts +6 -0
  351. package/src/logger/log-warnings.ts +140 -0
  352. package/src/middleware/add-tool-input-examples-middleware.ts +90 -0
  353. package/src/middleware/default-embedding-settings-middleware.ts +22 -0
  354. package/src/middleware/default-settings-middleware.ts +33 -0
  355. package/src/middleware/extract-json-middleware.ts +197 -0
  356. package/src/middleware/extract-reasoning-middleware.ts +249 -0
  357. package/src/middleware/index.ts +10 -0
  358. package/src/middleware/simulate-streaming-middleware.ts +79 -0
  359. package/src/middleware/wrap-embedding-model.ts +89 -0
  360. package/src/middleware/wrap-image-model.ts +92 -0
  361. package/src/middleware/wrap-language-model.ts +108 -0
  362. package/src/middleware/wrap-provider.ts +51 -0
  363. package/src/model/as-embedding-model-v3.ts +24 -0
  364. package/src/model/as-embedding-model-v4.ts +25 -0
  365. package/src/model/as-image-model-v3.ts +24 -0
  366. package/src/model/as-image-model-v4.ts +21 -0
  367. package/src/model/as-language-model-v3.ts +103 -0
  368. package/src/model/as-language-model-v4.ts +25 -0
  369. package/src/model/as-provider-v3.ts +36 -0
  370. package/src/model/as-provider-v4.ts +47 -0
  371. package/src/model/as-reranking-model-v4.ts +16 -0
  372. package/src/model/as-speech-model-v3.ts +24 -0
  373. package/src/model/as-speech-model-v4.ts +21 -0
  374. package/src/model/as-transcription-model-v3.ts +24 -0
  375. package/src/model/as-transcription-model-v4.ts +25 -0
  376. package/src/model/as-video-model-v4.ts +19 -0
  377. package/src/model/resolve-model.ts +172 -0
  378. package/src/prompt/call-settings.ts +169 -0
  379. package/src/prompt/content-part.ts +236 -0
  380. package/src/prompt/convert-to-language-model-prompt.ts +548 -0
  381. package/src/prompt/create-tool-model-output.ts +34 -0
  382. package/src/prompt/data-content.ts +134 -0
  383. package/src/prompt/index.ts +27 -0
  384. package/src/prompt/invalid-data-content-error.ts +29 -0
  385. package/src/prompt/invalid-message-role-error.ts +27 -0
  386. package/src/prompt/message-conversion-error.ts +28 -0
  387. package/src/prompt/message.ts +72 -0
  388. package/src/prompt/prepare-call-settings.ts +110 -0
  389. package/src/prompt/prepare-tools-and-tool-choice.ts +86 -0
  390. package/src/prompt/prompt.ts +43 -0
  391. package/src/prompt/split-data-url.ts +17 -0
  392. package/src/prompt/standardize-prompt.ts +99 -0
  393. package/src/prompt/wrap-gateway-error.ts +29 -0
  394. package/src/registry/custom-provider.ts +210 -0
  395. package/src/registry/index.ts +7 -0
  396. package/src/registry/no-such-provider-error.ts +41 -0
  397. package/src/registry/provider-registry.ts +331 -0
  398. package/src/rerank/index.ts +8 -0
  399. package/src/rerank/rerank-events.ts +189 -0
  400. package/src/rerank/rerank-result.ts +70 -0
  401. package/src/rerank/rerank.ts +348 -0
  402. package/src/telemetry/assemble-operation-name.ts +21 -0
  403. package/src/telemetry/get-base-telemetry-attributes.ts +45 -0
  404. package/src/telemetry/get-global-telemetry-integration.ts +126 -0
  405. package/src/telemetry/get-tracer.ts +20 -0
  406. package/src/telemetry/index.ts +4 -0
  407. package/src/telemetry/noop-tracer.ts +69 -0
  408. package/src/telemetry/open-telemetry-integration.ts +875 -0
  409. package/src/telemetry/record-span.ts +75 -0
  410. package/src/telemetry/select-telemetry-attributes.ts +78 -0
  411. package/src/telemetry/stringify-for-telemetry.ts +33 -0
  412. package/src/telemetry/telemetry-integration-registry.ts +22 -0
  413. package/src/telemetry/telemetry-integration.ts +139 -0
  414. package/src/telemetry/telemetry-settings.ts +55 -0
  415. package/src/test/mock-embedding-model-v2.ts +35 -0
  416. package/src/test/mock-embedding-model-v3.ts +48 -0
  417. package/src/test/mock-embedding-model-v4.ts +48 -0
  418. package/src/test/mock-image-model-v2.ts +28 -0
  419. package/src/test/mock-image-model-v3.ts +28 -0
  420. package/src/test/mock-image-model-v4.ts +28 -0
  421. package/src/test/mock-language-model-v2.ts +72 -0
  422. package/src/test/mock-language-model-v3.ts +77 -0
  423. package/src/test/mock-language-model-v4.ts +77 -0
  424. package/src/test/mock-provider-v2.ts +68 -0
  425. package/src/test/mock-provider-v3.ts +80 -0
  426. package/src/test/mock-provider-v4.ts +80 -0
  427. package/src/test/mock-reranking-model-v3.ts +25 -0
  428. package/src/test/mock-reranking-model-v4.ts +25 -0
  429. package/src/test/mock-server-response.ts +69 -0
  430. package/src/test/mock-speech-model-v2.ts +24 -0
  431. package/src/test/mock-speech-model-v3.ts +24 -0
  432. package/src/test/mock-speech-model-v4.ts +24 -0
  433. package/src/test/mock-tracer.ts +156 -0
  434. package/src/test/mock-transcription-model-v2.ts +24 -0
  435. package/src/test/mock-transcription-model-v3.ts +24 -0
  436. package/src/test/mock-transcription-model-v4.ts +24 -0
  437. package/src/test/mock-values.ts +4 -0
  438. package/src/test/mock-video-model-v3.ts +28 -0
  439. package/src/test/mock-video-model-v4.ts +28 -0
  440. package/src/test/not-implemented.ts +3 -0
  441. package/src/text-stream/create-text-stream-response.ts +30 -0
  442. package/src/text-stream/index.ts +2 -0
  443. package/src/text-stream/pipe-text-stream-to-response.ts +38 -0
  444. package/src/transcribe/index.ts +2 -0
  445. package/src/transcribe/transcribe-result.ts +60 -0
  446. package/src/transcribe/transcribe.ts +187 -0
  447. package/src/types/embedding-model-middleware.ts +15 -0
  448. package/src/types/embedding-model.ts +20 -0
  449. package/src/types/image-model-middleware.ts +15 -0
  450. package/src/types/image-model-response-metadata.ts +16 -0
  451. package/src/types/image-model.ts +19 -0
  452. package/src/types/index.ts +29 -0
  453. package/src/types/json-value.ts +15 -0
  454. package/src/types/language-model-middleware.ts +15 -0
  455. package/src/types/language-model-request-metadata.ts +6 -0
  456. package/src/types/language-model-response-metadata.ts +21 -0
  457. package/src/types/language-model.ts +106 -0
  458. package/src/types/provider-metadata.ts +16 -0
  459. package/src/types/provider.ts +55 -0
  460. package/src/types/reranking-model.ts +6 -0
  461. package/src/types/speech-model-response-metadata.ts +21 -0
  462. package/src/types/speech-model.ts +10 -0
  463. package/src/types/transcription-model-response-metadata.ts +16 -0
  464. package/src/types/transcription-model.ts +14 -0
  465. package/src/types/usage.ts +200 -0
  466. package/src/types/video-model-response-metadata.ts +28 -0
  467. package/src/types/video-model.ts +15 -0
  468. package/src/types/warning.ts +7 -0
  469. package/src/ui/call-completion-api.ts +157 -0
  470. package/src/ui/chat-transport.ts +83 -0
  471. package/src/ui/chat.ts +786 -0
  472. package/src/ui/convert-file-list-to-file-ui-parts.ts +36 -0
  473. package/src/ui/convert-to-model-messages.ts +403 -0
  474. package/src/ui/default-chat-transport.ts +36 -0
  475. package/src/ui/direct-chat-transport.ts +117 -0
  476. package/src/ui/http-chat-transport.ts +273 -0
  477. package/src/ui/index.ts +76 -0
  478. package/src/ui/last-assistant-message-is-complete-with-approval-responses.ts +44 -0
  479. package/src/ui/last-assistant-message-is-complete-with-tool-calls.ts +39 -0
  480. package/src/ui/process-text-stream.ts +16 -0
  481. package/src/ui/process-ui-message-stream.ts +858 -0
  482. package/src/ui/text-stream-chat-transport.ts +23 -0
  483. package/src/ui/transform-text-to-ui-message-stream.ts +27 -0
  484. package/src/ui/ui-messages.ts +602 -0
  485. package/src/ui/use-completion.ts +84 -0
  486. package/src/ui/validate-ui-messages.ts +521 -0
  487. package/src/ui-message-stream/create-ui-message-stream-response.ts +44 -0
  488. package/src/ui-message-stream/create-ui-message-stream.ts +145 -0
  489. package/src/ui-message-stream/get-response-ui-message-id.ts +35 -0
  490. package/src/ui-message-stream/handle-ui-message-stream-finish.ts +170 -0
  491. package/src/ui-message-stream/index.ts +14 -0
  492. package/src/ui-message-stream/json-to-sse-transform-stream.ts +17 -0
  493. package/src/ui-message-stream/pipe-ui-message-stream-to-response.ts +51 -0
  494. package/src/ui-message-stream/read-ui-message-stream.ts +87 -0
  495. package/src/ui-message-stream/ui-message-chunks.ts +372 -0
  496. package/src/ui-message-stream/ui-message-stream-headers.ts +7 -0
  497. package/src/ui-message-stream/ui-message-stream-on-finish-callback.ts +32 -0
  498. package/src/ui-message-stream/ui-message-stream-on-step-finish-callback.ts +25 -0
  499. package/src/ui-message-stream/ui-message-stream-response-init.ts +14 -0
  500. package/src/ui-message-stream/ui-message-stream-writer.ts +24 -0
  501. package/src/util/as-array.ts +3 -0
  502. package/src/util/async-iterable-stream.ts +94 -0
  503. package/src/util/consume-stream.ts +31 -0
  504. package/src/util/cosine-similarity.ts +46 -0
  505. package/src/util/create-resolvable-promise.ts +30 -0
  506. package/src/util/create-stitchable-stream.ts +112 -0
  507. package/src/util/data-url.ts +17 -0
  508. package/src/util/deep-partial.ts +84 -0
  509. package/src/util/detect-media-type.ts +226 -0
  510. package/src/util/download/create-download.ts +13 -0
  511. package/src/util/download/download-function.ts +45 -0
  512. package/src/util/download/download.ts +74 -0
  513. package/src/util/error-handler.ts +1 -0
  514. package/src/util/fix-json.ts +401 -0
  515. package/src/util/get-potential-start-index.ts +39 -0
  516. package/src/util/index.ts +12 -0
  517. package/src/util/is-deep-equal-data.ts +48 -0
  518. package/src/util/is-non-empty-object.ts +5 -0
  519. package/src/util/job.ts +1 -0
  520. package/src/util/log-v2-compatibility-warning.ts +21 -0
  521. package/src/util/merge-abort-signals.ts +43 -0
  522. package/src/util/merge-objects.ts +79 -0
  523. package/src/util/notify.ts +22 -0
  524. package/src/util/now.ts +4 -0
  525. package/src/util/parse-partial-json.ts +30 -0
  526. package/src/util/prepare-headers.ts +14 -0
  527. package/src/util/prepare-retries.ts +47 -0
  528. package/src/util/retry-error.ts +41 -0
  529. package/src/util/retry-with-exponential-backoff.ts +154 -0
  530. package/src/util/serial-job-executor.ts +36 -0
  531. package/src/util/simulate-readable-stream.ts +39 -0
  532. package/src/util/split-array.ts +20 -0
  533. package/src/util/value-of.ts +65 -0
  534. package/src/util/write-to-server-response.ts +49 -0
  535. package/src/version.ts +5 -0
  536. package/test.d.ts +1 -0
@@ -0,0 +1,112 @@
1
+ import { createResolvablePromise } from './create-resolvable-promise';
2
+
3
+ /**
4
+ * Creates a stitchable stream that can pipe one stream at a time.
5
+ *
6
+ * @template T - The type of values emitted by the streams.
7
+ * @returns {Object} An object containing the stitchable stream and control methods.
8
+ */
9
+ export function createStitchableStream<T>(): {
10
+ stream: ReadableStream<T>;
11
+ addStream: (innerStream: ReadableStream<T>) => void;
12
+ close: () => void;
13
+ terminate: () => void;
14
+ } {
15
+ let innerStreamReaders: ReadableStreamDefaultReader<T>[] = [];
16
+ let controller: ReadableStreamDefaultController<T> | null = null;
17
+ let isClosed = false;
18
+ let waitForNewStream = createResolvablePromise<void>();
19
+
20
+ const terminate = () => {
21
+ isClosed = true;
22
+ waitForNewStream.resolve();
23
+
24
+ innerStreamReaders.forEach(reader => reader.cancel());
25
+ innerStreamReaders = [];
26
+ controller?.close();
27
+ };
28
+
29
+ const processPull = async () => {
30
+ // Case 1: Outer stream is closed and no more inner streams
31
+ if (isClosed && innerStreamReaders.length === 0) {
32
+ controller?.close();
33
+ return;
34
+ }
35
+
36
+ // Case 2: No inner streams available, but outer stream is open
37
+ // wait for a new inner stream to be added or the outer stream to close
38
+ if (innerStreamReaders.length === 0) {
39
+ waitForNewStream = createResolvablePromise<void>();
40
+ await waitForNewStream.promise;
41
+ return processPull();
42
+ }
43
+
44
+ try {
45
+ const { value, done } = await innerStreamReaders[0].read();
46
+
47
+ if (done) {
48
+ // Case 3: Current inner stream is done
49
+ innerStreamReaders.shift(); // Remove the finished stream
50
+
51
+ if (innerStreamReaders.length === 0 && isClosed) {
52
+ // when closed and no more inner streams, stop pulling
53
+ controller?.close();
54
+ } else {
55
+ // continue pulling from the next stream
56
+ await processPull();
57
+ }
58
+ } else {
59
+ // Case 4: Current inner stream returns an item
60
+ controller?.enqueue(value);
61
+ }
62
+ } catch (error) {
63
+ // Case 5: Current inner stream throws an error
64
+ controller?.error(error);
65
+ innerStreamReaders.shift(); // Remove the errored stream
66
+ terminate(); // we have errored, terminate all streams
67
+ }
68
+ };
69
+
70
+ return {
71
+ stream: new ReadableStream<T>({
72
+ start(controllerParam) {
73
+ controller = controllerParam;
74
+ },
75
+ pull: processPull,
76
+ async cancel() {
77
+ for (const reader of innerStreamReaders) {
78
+ await reader.cancel();
79
+ }
80
+ innerStreamReaders = [];
81
+ isClosed = true;
82
+ },
83
+ }),
84
+ addStream: (innerStream: ReadableStream<T>) => {
85
+ if (isClosed) {
86
+ throw new Error('Cannot add inner stream: outer stream is closed');
87
+ }
88
+
89
+ innerStreamReaders.push(innerStream.getReader());
90
+ waitForNewStream.resolve();
91
+ },
92
+
93
+ /**
94
+ * Gracefully close the outer stream. This will let the inner streams
95
+ * finish processing and then close the outer stream.
96
+ */
97
+ close: () => {
98
+ isClosed = true;
99
+ waitForNewStream.resolve();
100
+
101
+ if (innerStreamReaders.length === 0) {
102
+ controller?.close();
103
+ }
104
+ },
105
+
106
+ /**
107
+ * Immediately close the outer stream. This will cancel all inner streams
108
+ * and close the outer stream.
109
+ */
110
+ terminate,
111
+ };
112
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Converts a data URL of type text/* to a text string.
3
+ */
4
+ export function getTextFromDataUrl(dataUrl: string): string {
5
+ const [header, base64Content] = dataUrl.split(',');
6
+ const mediaType = header.split(';')[0].split(':')[1];
7
+
8
+ if (mediaType == null || base64Content == null) {
9
+ throw new Error('Invalid data URL format');
10
+ }
11
+
12
+ try {
13
+ return window.atob(base64Content);
14
+ } catch (error) {
15
+ throw new Error(`Error decoding data URL`);
16
+ }
17
+ }
@@ -0,0 +1,84 @@
1
+ // License for this File only:
2
+ //
3
+ // MIT License
4
+ //
5
+ // Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
6
+ // Copyright (c) Vercel, Inc. (https://vercel.com)
7
+ //
8
+ // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
9
+ // documentation files (the "Software"), to deal in the Software without restriction, including without limitation
10
+ // the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
11
+ // to permit persons to whom the Software is furnished to do so, subject to the following conditions:
12
+ //
13
+ // The above copyright notice and this permission notice shall be included in all copies or substantial portions
14
+ // of the Software.
15
+ //
16
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
17
+ // TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18
+ // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
19
+ // CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
20
+ // IN THE SOFTWARE.
21
+
22
+ import { FlexibleSchema, InferSchema } from '@ai-sdk/provider-utils';
23
+
24
+ /**
25
+ * Create a type from an object with all keys and nested keys set to optional.
26
+ * The helper supports normal objects and schemas (which are resolved automatically).
27
+ * It always recurses into arrays.
28
+ *
29
+ * Adopted from [type-fest](https://github.com/sindresorhus/type-fest/tree/main) PartialDeep.
30
+ */
31
+
32
+ export type DeepPartial<T> = T extends FlexibleSchema
33
+ ? DeepPartialInternal<InferSchema<T>> // resolve schemas first to prevent infinite recursion
34
+ : DeepPartialInternal<T>;
35
+
36
+ type DeepPartialInternal<T> = T extends
37
+ | null
38
+ | undefined
39
+ | string
40
+ | number
41
+ | boolean
42
+ | symbol
43
+ | bigint
44
+ | void
45
+ | Date
46
+ | RegExp
47
+ | ((...arguments_: any[]) => unknown)
48
+ | (new (...arguments_: any[]) => unknown)
49
+ ? T
50
+ : T extends Map<infer KeyType, infer ValueType>
51
+ ? PartialMap<KeyType, ValueType>
52
+ : T extends Set<infer ItemType>
53
+ ? PartialSet<ItemType>
54
+ : T extends ReadonlyMap<infer KeyType, infer ValueType>
55
+ ? PartialReadonlyMap<KeyType, ValueType>
56
+ : T extends ReadonlySet<infer ItemType>
57
+ ? PartialReadonlySet<ItemType>
58
+ : T extends object
59
+ ? T extends ReadonlyArray<infer ItemType> // Test for arrays/tuples, per https://github.com/microsoft/TypeScript/issues/35156
60
+ ? ItemType[] extends T // Test for arrays (non-tuples) specifically
61
+ ? readonly ItemType[] extends T // Differentiate readonly and mutable arrays
62
+ ? ReadonlyArray<DeepPartialInternal<ItemType | undefined>>
63
+ : Array<DeepPartialInternal<ItemType | undefined>>
64
+ : PartialObject<T> // Tuples behave properly
65
+ : PartialObject<T>
66
+ : unknown;
67
+
68
+ type PartialMap<KeyType, ValueType> = {} & Map<
69
+ DeepPartialInternal<KeyType>,
70
+ DeepPartialInternal<ValueType>
71
+ >;
72
+
73
+ type PartialSet<T> = {} & Set<DeepPartialInternal<T>>;
74
+
75
+ type PartialReadonlyMap<KeyType, ValueType> = {} & ReadonlyMap<
76
+ DeepPartialInternal<KeyType>,
77
+ DeepPartialInternal<ValueType>
78
+ >;
79
+
80
+ type PartialReadonlySet<T> = {} & ReadonlySet<DeepPartialInternal<T>>;
81
+
82
+ type PartialObject<ObjectType extends object> = {
83
+ [KeyType in keyof ObjectType]?: DeepPartialInternal<ObjectType[KeyType]>;
84
+ };
@@ -0,0 +1,226 @@
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 audioMediaTypeSignatures = [
60
+ {
61
+ mediaType: 'audio/mpeg' as const,
62
+ bytesPrefix: [0xff, 0xfb],
63
+ },
64
+ {
65
+ mediaType: 'audio/mpeg' as const,
66
+ bytesPrefix: [0xff, 0xfa],
67
+ },
68
+ {
69
+ mediaType: 'audio/mpeg' as const,
70
+ bytesPrefix: [0xff, 0xf3],
71
+ },
72
+ {
73
+ mediaType: 'audio/mpeg' as const,
74
+ bytesPrefix: [0xff, 0xf2],
75
+ },
76
+ {
77
+ mediaType: 'audio/mpeg' as const,
78
+ bytesPrefix: [0xff, 0xe3],
79
+ },
80
+ {
81
+ mediaType: 'audio/mpeg' as const,
82
+ bytesPrefix: [0xff, 0xe2],
83
+ },
84
+ {
85
+ mediaType: 'audio/wav' as const,
86
+ bytesPrefix: [
87
+ 0x52, // R
88
+ 0x49, // I
89
+ 0x46, // F
90
+ 0x46, // F
91
+ null,
92
+ null,
93
+ null,
94
+ null,
95
+ 0x57, // W
96
+ 0x41, // A
97
+ 0x56, // V
98
+ 0x45, // E
99
+ ],
100
+ },
101
+ {
102
+ mediaType: 'audio/ogg' as const,
103
+ bytesPrefix: [0x4f, 0x67, 0x67, 0x53],
104
+ },
105
+ {
106
+ mediaType: 'audio/flac' as const,
107
+ bytesPrefix: [0x66, 0x4c, 0x61, 0x43],
108
+ },
109
+ {
110
+ mediaType: 'audio/aac' as const,
111
+ bytesPrefix: [0x40, 0x15, 0x00, 0x00],
112
+ },
113
+ {
114
+ mediaType: 'audio/mp4' as const,
115
+ bytesPrefix: [0x66, 0x74, 0x79, 0x70],
116
+ },
117
+ {
118
+ mediaType: 'audio/webm',
119
+ bytesPrefix: [0x1a, 0x45, 0xdf, 0xa3],
120
+ },
121
+ ] as const;
122
+
123
+ export const videoMediaTypeSignatures = [
124
+ {
125
+ mediaType: 'video/mp4' as const,
126
+ bytesPrefix: [
127
+ 0x00,
128
+ 0x00,
129
+ 0x00,
130
+ null,
131
+ 0x66,
132
+ 0x74,
133
+ 0x79,
134
+ 0x70, // ftyp
135
+ ],
136
+ },
137
+ {
138
+ mediaType: 'video/webm' as const,
139
+ bytesPrefix: [0x1a, 0x45, 0xdf, 0xa3], // EBML
140
+ },
141
+ {
142
+ mediaType: 'video/quicktime' as const,
143
+ bytesPrefix: [
144
+ 0x00,
145
+ 0x00,
146
+ 0x00,
147
+ 0x14,
148
+ 0x66,
149
+ 0x74,
150
+ 0x79,
151
+ 0x70,
152
+ 0x71,
153
+ 0x74, // ftypqt
154
+ ],
155
+ },
156
+ {
157
+ mediaType: 'video/x-msvideo' as const,
158
+ bytesPrefix: [0x52, 0x49, 0x46, 0x46], // RIFF (AVI)
159
+ },
160
+ ] as const;
161
+
162
+ const stripID3 = (data: Uint8Array | string) => {
163
+ const bytes =
164
+ typeof data === 'string' ? convertBase64ToUint8Array(data) : data;
165
+ const id3Size =
166
+ ((bytes[6] & 0x7f) << 21) |
167
+ ((bytes[7] & 0x7f) << 14) |
168
+ ((bytes[8] & 0x7f) << 7) |
169
+ (bytes[9] & 0x7f);
170
+
171
+ // The raw MP3 starts here
172
+ return bytes.slice(id3Size + 10);
173
+ };
174
+
175
+ function stripID3TagsIfPresent(data: Uint8Array | string): Uint8Array | string {
176
+ const hasId3 =
177
+ (typeof data === 'string' && data.startsWith('SUQz')) ||
178
+ (typeof data !== 'string' &&
179
+ data.length > 10 &&
180
+ data[0] === 0x49 && // 'I'
181
+ data[1] === 0x44 && // 'D'
182
+ data[2] === 0x33); // '3'
183
+
184
+ return hasId3 ? stripID3(data) : data;
185
+ }
186
+
187
+ /**
188
+ * Detect the media IANA media type of a file using a list of signatures.
189
+ *
190
+ * @param data - The file data.
191
+ * @param signatures - The signatures to use for detection.
192
+ * @returns The media type of the file.
193
+ */
194
+ export function detectMediaType({
195
+ data,
196
+ signatures,
197
+ }: {
198
+ data: Uint8Array | string;
199
+ signatures:
200
+ | typeof audioMediaTypeSignatures
201
+ | typeof imageMediaTypeSignatures
202
+ | typeof videoMediaTypeSignatures;
203
+ }): (typeof signatures)[number]['mediaType'] | undefined {
204
+ const processedData = stripID3TagsIfPresent(data);
205
+
206
+ // Convert the first ~18 bytes (24 base64 chars) for consistent detection logic:
207
+ const bytes =
208
+ typeof processedData === 'string'
209
+ ? convertBase64ToUint8Array(
210
+ processedData.substring(0, Math.min(processedData.length, 24)),
211
+ )
212
+ : processedData;
213
+
214
+ for (const signature of signatures) {
215
+ if (
216
+ bytes.length >= signature.bytesPrefix.length &&
217
+ signature.bytesPrefix.every(
218
+ (byte, index) => byte === null || bytes[index] === byte,
219
+ )
220
+ ) {
221
+ return signature.mediaType;
222
+ }
223
+ }
224
+
225
+ return undefined;
226
+ }
@@ -0,0 +1,13 @@
1
+ import { download as internalDownload } from './download';
2
+
3
+ /**
4
+ * Creates a download function with configurable options.
5
+ *
6
+ * @param options - Configuration options for the download function.
7
+ * @param options.maxBytes - Maximum allowed download size in bytes. Default: 2 GiB.
8
+ * @returns A download function that can be passed to `transcribe()` or `experimental_generateVideo()`.
9
+ */
10
+ export function createDownload(options?: { maxBytes?: number }) {
11
+ return ({ url, abortSignal }: { url: URL; abortSignal?: AbortSignal }) =>
12
+ internalDownload({ url, maxBytes: options?.maxBytes, abortSignal });
13
+ }
@@ -0,0 +1,45 @@
1
+ import { download as originalDownload } from './download';
2
+
3
+ /**
4
+ * Experimental. Can change in patch versions without warning.
5
+ *
6
+ * Download function. Called with the array of URLs and a boolean indicating
7
+ * whether the URL is supported by the model.
8
+ *
9
+ * The download function can decide for each URL:
10
+ * - to return null (which means that the URL should be passed to the model)
11
+ * - to download the asset and return the data (incl. retries, authentication, etc.)
12
+ *
13
+ * Should throw DownloadError if the download fails.
14
+ *
15
+ * Should return an array of objects sorted by the order of the requested downloads.
16
+ * For each object, the data should be a Uint8Array if the URL was downloaded.
17
+ * For each object, the mediaType should be the media type of the downloaded asset.
18
+ * For each object, the data should be null if the URL should be passed through as is.
19
+ */
20
+ export type DownloadFunction = (
21
+ options: Array<{
22
+ url: URL;
23
+ isUrlSupportedByModel: boolean;
24
+ }>,
25
+ ) => PromiseLike<
26
+ Array<{
27
+ data: Uint8Array;
28
+ mediaType: string | undefined;
29
+ } | null>
30
+ >;
31
+
32
+ /**
33
+ * Default download function.
34
+ * Downloads the file if it is not supported by the model.
35
+ */
36
+ export const createDefaultDownloadFunction =
37
+ (download: typeof originalDownload = originalDownload): DownloadFunction =>
38
+ requestedDownloads =>
39
+ Promise.all(
40
+ requestedDownloads.map(async requestedDownload =>
41
+ requestedDownload.isUrlSupportedByModel
42
+ ? null
43
+ : download(requestedDownload),
44
+ ),
45
+ );
@@ -0,0 +1,74 @@
1
+ import {
2
+ DownloadError,
3
+ readResponseWithSizeLimit,
4
+ DEFAULT_MAX_DOWNLOAD_SIZE,
5
+ validateDownloadUrl,
6
+ } from '@ai-sdk/provider-utils';
7
+ import {
8
+ withUserAgentSuffix,
9
+ getRuntimeEnvironmentUserAgent,
10
+ } from '@ai-sdk/provider-utils';
11
+ import { VERSION } from '../../version';
12
+
13
+ /**
14
+ * Download a file from a URL.
15
+ *
16
+ * @param url - The URL to download from.
17
+ * @param maxBytes - Maximum allowed download size in bytes. Defaults to 100 MiB.
18
+ * @param abortSignal - An optional abort signal to cancel the download.
19
+ * @returns The downloaded data and media type.
20
+ *
21
+ * @throws DownloadError if the download fails or exceeds maxBytes.
22
+ */
23
+ export const download = async ({
24
+ url,
25
+ maxBytes,
26
+ abortSignal,
27
+ }: {
28
+ url: URL;
29
+ maxBytes?: number;
30
+ abortSignal?: AbortSignal;
31
+ }) => {
32
+ const urlText = url.toString();
33
+ validateDownloadUrl(urlText);
34
+ try {
35
+ const response = await fetch(urlText, {
36
+ headers: withUserAgentSuffix(
37
+ {},
38
+ `ai-sdk/${VERSION}`,
39
+ getRuntimeEnvironmentUserAgent(),
40
+ ),
41
+ signal: abortSignal,
42
+ });
43
+
44
+ // Validate final URL after redirects to prevent SSRF via open redirect
45
+ if (response.redirected) {
46
+ validateDownloadUrl(response.url);
47
+ }
48
+
49
+ if (!response.ok) {
50
+ throw new DownloadError({
51
+ url: urlText,
52
+ statusCode: response.status,
53
+ statusText: response.statusText,
54
+ });
55
+ }
56
+
57
+ const data = await readResponseWithSizeLimit({
58
+ response,
59
+ url: urlText,
60
+ maxBytes: maxBytes ?? DEFAULT_MAX_DOWNLOAD_SIZE,
61
+ });
62
+
63
+ return {
64
+ data,
65
+ mediaType: response.headers.get('content-type') ?? undefined,
66
+ };
67
+ } catch (error) {
68
+ if (DownloadError.isInstance(error)) {
69
+ throw error;
70
+ }
71
+
72
+ throw new DownloadError({ url: urlText, cause: error });
73
+ }
74
+ };
@@ -0,0 +1 @@
1
+ export type ErrorHandler = (error: unknown) => void;