@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,415 @@
1
+ import {
2
+ isJSONArray,
3
+ isJSONObject,
4
+ JSONObject,
5
+ JSONSchema7,
6
+ JSONValue,
7
+ TypeValidationError,
8
+ UnsupportedFunctionalityError,
9
+ } from '@ai-sdk/provider';
10
+ import {
11
+ asSchema,
12
+ FlexibleSchema,
13
+ safeValidateTypes,
14
+ Schema,
15
+ ValidationResult,
16
+ } from '@ai-sdk/provider-utils';
17
+ import { NoObjectGeneratedError } from '../error/no-object-generated-error';
18
+ import {
19
+ FinishReason,
20
+ LanguageModelResponseMetadata,
21
+ LanguageModelUsage,
22
+ } from '../types';
23
+ import {
24
+ AsyncIterableStream,
25
+ createAsyncIterableStream,
26
+ } from '../util/async-iterable-stream';
27
+ import { DeepPartial } from '../util/deep-partial';
28
+ import { ObjectStreamPart } from './stream-object-result';
29
+
30
+ export interface OutputStrategy<PARTIAL, RESULT, ELEMENT_STREAM> {
31
+ readonly type: 'object' | 'array' | 'enum' | 'no-schema';
32
+
33
+ jsonSchema(): Promise<JSONSchema7 | undefined>;
34
+
35
+ validatePartialResult({
36
+ value,
37
+ textDelta,
38
+ isFinalDelta,
39
+ }: {
40
+ value: JSONValue;
41
+ textDelta: string;
42
+ isFirstDelta: boolean;
43
+ isFinalDelta: boolean;
44
+ latestObject: PARTIAL | undefined;
45
+ }): Promise<
46
+ ValidationResult<{
47
+ partial: PARTIAL;
48
+ textDelta: string;
49
+ }>
50
+ >;
51
+ validateFinalResult(
52
+ value: JSONValue | undefined,
53
+ context: {
54
+ text: string;
55
+ response: LanguageModelResponseMetadata;
56
+ usage: LanguageModelUsage;
57
+ },
58
+ ): Promise<ValidationResult<RESULT>>;
59
+
60
+ createElementStream(
61
+ originalStream: ReadableStream<ObjectStreamPart<PARTIAL>>,
62
+ ): ELEMENT_STREAM;
63
+ }
64
+
65
+ const noSchemaOutputStrategy: OutputStrategy<JSONValue, JSONValue, never> = {
66
+ type: 'no-schema',
67
+ jsonSchema: async () => undefined,
68
+
69
+ async validatePartialResult({ value, textDelta }) {
70
+ return { success: true, value: { partial: value, textDelta } };
71
+ },
72
+
73
+ async validateFinalResult(
74
+ value: JSONValue | undefined,
75
+ context: {
76
+ text: string;
77
+ response: LanguageModelResponseMetadata;
78
+ usage: LanguageModelUsage;
79
+ finishReason: FinishReason;
80
+ },
81
+ ): Promise<ValidationResult<JSONValue>> {
82
+ return value === undefined
83
+ ? {
84
+ success: false,
85
+ error: new NoObjectGeneratedError({
86
+ message: 'No object generated: response did not match schema.',
87
+ text: context.text,
88
+ response: context.response,
89
+ usage: context.usage,
90
+ finishReason: context.finishReason,
91
+ }),
92
+ }
93
+ : { success: true, value };
94
+ },
95
+
96
+ createElementStream() {
97
+ throw new UnsupportedFunctionalityError({
98
+ functionality: 'element streams in no-schema mode',
99
+ });
100
+ },
101
+ };
102
+
103
+ const objectOutputStrategy = <OBJECT>(
104
+ schema: Schema<OBJECT>,
105
+ ): OutputStrategy<DeepPartial<OBJECT>, OBJECT, never> => ({
106
+ type: 'object',
107
+ jsonSchema: async () => await schema.jsonSchema,
108
+
109
+ async validatePartialResult({ value, textDelta }) {
110
+ return {
111
+ success: true,
112
+ value: {
113
+ // Note: currently no validation of partial results:
114
+ partial: value as DeepPartial<OBJECT>,
115
+ textDelta,
116
+ },
117
+ };
118
+ },
119
+
120
+ async validateFinalResult(
121
+ value: JSONValue | undefined,
122
+ ): Promise<ValidationResult<OBJECT>> {
123
+ return safeValidateTypes({ value, schema });
124
+ },
125
+
126
+ createElementStream() {
127
+ throw new UnsupportedFunctionalityError({
128
+ functionality: 'element streams in object mode',
129
+ });
130
+ },
131
+ });
132
+
133
+ const arrayOutputStrategy = <ELEMENT>(
134
+ schema: Schema<ELEMENT>,
135
+ ): OutputStrategy<ELEMENT[], ELEMENT[], AsyncIterableStream<ELEMENT>> => {
136
+ return {
137
+ type: 'array',
138
+
139
+ // wrap in object that contains array of elements, since most LLMs will not
140
+ // be able to generate an array directly:
141
+ // possible future optimization: use arrays directly when model supports grammar-guided generation
142
+ jsonSchema: async () => {
143
+ // remove $schema from schema.jsonSchema:
144
+ const { $schema, ...itemSchema } = await schema.jsonSchema;
145
+
146
+ return {
147
+ $schema: 'http://json-schema.org/draft-07/schema#',
148
+ type: 'object',
149
+ properties: {
150
+ elements: { type: 'array', items: itemSchema },
151
+ },
152
+ required: ['elements'],
153
+ additionalProperties: false,
154
+ };
155
+ },
156
+
157
+ async validatePartialResult({
158
+ value,
159
+ latestObject,
160
+ isFirstDelta,
161
+ isFinalDelta,
162
+ }) {
163
+ // check that the value is an object that contains an array of elements:
164
+ if (!isJSONObject(value) || !isJSONArray(value.elements)) {
165
+ return {
166
+ success: false,
167
+ error: new TypeValidationError({
168
+ value,
169
+ cause: 'value must be an object that contains an array of elements',
170
+ }),
171
+ };
172
+ }
173
+
174
+ const inputArray = value.elements as Array<JSONObject>;
175
+ const resultArray: Array<ELEMENT> = [];
176
+
177
+ for (let i = 0; i < inputArray.length; i++) {
178
+ const element = inputArray[i];
179
+ const result = await safeValidateTypes({ value: element, schema });
180
+
181
+ // special treatment for last processed element:
182
+ // ignore parse or validation failures, since they indicate that the
183
+ // last element is incomplete and should not be included in the result,
184
+ // unless it is the final delta
185
+ if (i === inputArray.length - 1 && !isFinalDelta) {
186
+ continue;
187
+ }
188
+
189
+ if (!result.success) {
190
+ return result;
191
+ }
192
+
193
+ resultArray.push(result.value);
194
+ }
195
+
196
+ // calculate delta:
197
+ const publishedElementCount = latestObject?.length ?? 0;
198
+
199
+ let textDelta = '';
200
+
201
+ if (isFirstDelta) {
202
+ textDelta += '[';
203
+ }
204
+
205
+ if (publishedElementCount > 0) {
206
+ textDelta += ',';
207
+ }
208
+
209
+ textDelta += resultArray
210
+ .slice(publishedElementCount) // only new elements
211
+ .map(element => JSON.stringify(element))
212
+ .join(',');
213
+
214
+ if (isFinalDelta) {
215
+ textDelta += ']';
216
+ }
217
+
218
+ return {
219
+ success: true,
220
+ value: {
221
+ partial: resultArray,
222
+ textDelta,
223
+ },
224
+ };
225
+ },
226
+
227
+ async validateFinalResult(
228
+ value: JSONValue | undefined,
229
+ ): Promise<ValidationResult<Array<ELEMENT>>> {
230
+ // check that the value is an object that contains an array of elements:
231
+ if (!isJSONObject(value) || !isJSONArray(value.elements)) {
232
+ return {
233
+ success: false,
234
+ error: new TypeValidationError({
235
+ value,
236
+ cause: 'value must be an object that contains an array of elements',
237
+ }),
238
+ };
239
+ }
240
+
241
+ const inputArray = value.elements as Array<JSONObject>;
242
+
243
+ // check that each element in the array is of the correct type:
244
+ for (const element of inputArray) {
245
+ const result = await safeValidateTypes({ value: element, schema });
246
+ if (!result.success) {
247
+ return result;
248
+ }
249
+ }
250
+
251
+ return { success: true, value: inputArray as Array<ELEMENT> };
252
+ },
253
+
254
+ createElementStream(
255
+ originalStream: ReadableStream<ObjectStreamPart<ELEMENT[]>>,
256
+ ) {
257
+ let publishedElements = 0;
258
+
259
+ return createAsyncIterableStream(
260
+ originalStream.pipeThrough(
261
+ new TransformStream<ObjectStreamPart<ELEMENT[]>, ELEMENT>({
262
+ transform(chunk, controller) {
263
+ switch (chunk.type) {
264
+ case 'object': {
265
+ const array = chunk.object;
266
+
267
+ // publish new elements one by one:
268
+ for (
269
+ ;
270
+ publishedElements < array.length;
271
+ publishedElements++
272
+ ) {
273
+ controller.enqueue(array[publishedElements]);
274
+ }
275
+
276
+ break;
277
+ }
278
+
279
+ case 'text-delta':
280
+ case 'finish':
281
+ case 'error': // suppress error (use onError instead)
282
+ break;
283
+
284
+ default: {
285
+ const _exhaustiveCheck: never = chunk;
286
+ throw new Error(
287
+ `Unsupported chunk type: ${_exhaustiveCheck}`,
288
+ );
289
+ }
290
+ }
291
+ },
292
+ }),
293
+ ),
294
+ );
295
+ },
296
+ };
297
+ };
298
+
299
+ const enumOutputStrategy = <ENUM extends string>(
300
+ enumValues: Array<ENUM>,
301
+ ): OutputStrategy<string, ENUM, never> => {
302
+ return {
303
+ type: 'enum',
304
+
305
+ // wrap in object that contains result, since most LLMs will not
306
+ // be able to generate an enum value directly:
307
+ // possible future optimization: use enums directly when model supports top-level enums
308
+ jsonSchema: async () => ({
309
+ $schema: 'http://json-schema.org/draft-07/schema#',
310
+ type: 'object',
311
+ properties: {
312
+ result: { type: 'string', enum: enumValues },
313
+ },
314
+ required: ['result'],
315
+ additionalProperties: false,
316
+ }),
317
+
318
+ async validateFinalResult(
319
+ value: JSONValue | undefined,
320
+ ): Promise<ValidationResult<ENUM>> {
321
+ // check that the value is an object that contains an array of elements:
322
+ if (!isJSONObject(value) || typeof value.result !== 'string') {
323
+ return {
324
+ success: false,
325
+ error: new TypeValidationError({
326
+ value,
327
+ cause:
328
+ 'value must be an object that contains a string in the "result" property.',
329
+ }),
330
+ };
331
+ }
332
+
333
+ const result = value.result as string;
334
+
335
+ return enumValues.includes(result as ENUM)
336
+ ? { success: true, value: result as ENUM }
337
+ : {
338
+ success: false,
339
+ error: new TypeValidationError({
340
+ value,
341
+ cause: 'value must be a string in the enum',
342
+ }),
343
+ };
344
+ },
345
+
346
+ async validatePartialResult({ value, textDelta }) {
347
+ if (!isJSONObject(value) || typeof value.result !== 'string') {
348
+ return {
349
+ success: false,
350
+ error: new TypeValidationError({
351
+ value,
352
+ cause:
353
+ 'value must be an object that contains a string in the "result" property.',
354
+ }),
355
+ };
356
+ }
357
+
358
+ const result = value.result as string;
359
+ const possibleEnumValues = enumValues.filter(enumValue =>
360
+ enumValue.startsWith(result),
361
+ );
362
+
363
+ if (value.result.length === 0 || possibleEnumValues.length === 0) {
364
+ return {
365
+ success: false,
366
+ error: new TypeValidationError({
367
+ value,
368
+ cause: 'value must be a string in the enum',
369
+ }),
370
+ };
371
+ }
372
+
373
+ return {
374
+ success: true,
375
+ value: {
376
+ partial:
377
+ possibleEnumValues.length > 1 ? result : possibleEnumValues[0],
378
+ textDelta,
379
+ },
380
+ };
381
+ },
382
+
383
+ createElementStream() {
384
+ // no streaming in enum mode
385
+ throw new UnsupportedFunctionalityError({
386
+ functionality: 'element streams in enum mode',
387
+ });
388
+ },
389
+ };
390
+ };
391
+
392
+ export function getOutputStrategy<SCHEMA>({
393
+ output,
394
+ schema,
395
+ enumValues,
396
+ }: {
397
+ output: 'object' | 'array' | 'enum' | 'no-schema';
398
+ schema?: FlexibleSchema<SCHEMA>;
399
+ enumValues?: Array<SCHEMA>;
400
+ }): OutputStrategy<any, any, any> {
401
+ switch (output) {
402
+ case 'object':
403
+ return objectOutputStrategy(asSchema(schema!));
404
+ case 'array':
405
+ return arrayOutputStrategy(asSchema(schema!));
406
+ case 'enum':
407
+ return enumOutputStrategy(enumValues! as Array<string>);
408
+ case 'no-schema':
409
+ return noSchemaOutputStrategy;
410
+ default: {
411
+ const _exhaustiveCheck: never = output;
412
+ throw new Error(`Unsupported output: ${_exhaustiveCheck}`);
413
+ }
414
+ }
415
+ }
@@ -0,0 +1,111 @@
1
+ import { JSONParseError, TypeValidationError } from '@ai-sdk/provider';
2
+ import { safeParseJSON } from '@ai-sdk/provider-utils';
3
+ import { NoObjectGeneratedError } from '../error/no-object-generated-error';
4
+ import type {
5
+ FinishReason,
6
+ LanguageModelResponseMetadata,
7
+ LanguageModelUsage,
8
+ } from '../types';
9
+ import type { OutputStrategy } from './output-strategy';
10
+ import { RepairTextFunction } from './repair-text';
11
+
12
+ /**
13
+ * Parses and validates a result string by parsing it as JSON and validating against the output strategy.
14
+ *
15
+ * @param result - The result string to parse and validate
16
+ * @param outputStrategy - The output strategy containing validation logic
17
+ * @param context - Additional context for error reporting
18
+ * @returns The validated result
19
+ * @throws NoObjectGeneratedError if parsing or validation fails
20
+ */
21
+ async function parseAndValidateObjectResult<RESULT>(
22
+ result: string,
23
+ outputStrategy: OutputStrategy<any, RESULT, any>,
24
+ context: {
25
+ response: LanguageModelResponseMetadata;
26
+ usage: LanguageModelUsage;
27
+ finishReason: FinishReason;
28
+ },
29
+ ): Promise<RESULT> {
30
+ const parseResult = await safeParseJSON({ text: result });
31
+
32
+ if (!parseResult.success) {
33
+ throw new NoObjectGeneratedError({
34
+ message: 'No object generated: could not parse the response.',
35
+ cause: parseResult.error,
36
+ text: result,
37
+ response: context.response,
38
+ usage: context.usage,
39
+ finishReason: context.finishReason,
40
+ });
41
+ }
42
+
43
+ const validationResult = await outputStrategy.validateFinalResult(
44
+ parseResult.value,
45
+ {
46
+ text: result,
47
+ response: context.response,
48
+ usage: context.usage,
49
+ },
50
+ );
51
+
52
+ if (!validationResult.success) {
53
+ throw new NoObjectGeneratedError({
54
+ message: 'No object generated: response did not match schema.',
55
+ cause: validationResult.error,
56
+ text: result,
57
+ response: context.response,
58
+ usage: context.usage,
59
+ finishReason: context.finishReason,
60
+ });
61
+ }
62
+
63
+ return validationResult.value;
64
+ }
65
+
66
+ /**
67
+ * Parses and validates a result string by parsing it as JSON and validating against the output strategy.
68
+ * If the result cannot be parsed, it attempts to repair the result using the repairText function.
69
+ *
70
+ * @param result - The result string to parse and validate
71
+ * @param outputStrategy - The output strategy containing validation logic
72
+ * @param repairText - A function that attempts to repair the result string
73
+ * @param context - Additional context for error reporting
74
+ * @returns The validated result
75
+ * @throws NoObjectGeneratedError if parsing or validation fails
76
+ */
77
+ export async function parseAndValidateObjectResultWithRepair<RESULT>(
78
+ result: string,
79
+ outputStrategy: OutputStrategy<any, RESULT, any>,
80
+ repairText: RepairTextFunction | undefined,
81
+ context: {
82
+ response: LanguageModelResponseMetadata;
83
+ usage: LanguageModelUsage;
84
+ finishReason: FinishReason;
85
+ },
86
+ ): Promise<RESULT> {
87
+ try {
88
+ return await parseAndValidateObjectResult(result, outputStrategy, context);
89
+ } catch (error) {
90
+ if (
91
+ repairText != null &&
92
+ NoObjectGeneratedError.isInstance(error) &&
93
+ (JSONParseError.isInstance(error.cause) ||
94
+ TypeValidationError.isInstance(error.cause))
95
+ ) {
96
+ const repairedText = await repairText({
97
+ text: result,
98
+ error: error.cause,
99
+ });
100
+ if (repairedText === null) {
101
+ throw error;
102
+ }
103
+ return await parseAndValidateObjectResult(
104
+ repairedText,
105
+ outputStrategy,
106
+ context,
107
+ );
108
+ }
109
+ throw error;
110
+ }
111
+ }
@@ -0,0 +1,12 @@
1
+ import { JSONParseError, TypeValidationError } from '@ai-sdk/provider';
2
+
3
+ /**
4
+ * A function that attempts to repair the raw output of the model
5
+ * to enable JSON parsing.
6
+ *
7
+ * Should return the repaired text or null if the text cannot be repaired.
8
+ */
9
+ export type RepairTextFunction = (options: {
10
+ text: string;
11
+ error: JSONParseError | TypeValidationError;
12
+ }) => Promise<string | null>;
@@ -0,0 +1,120 @@
1
+ import { ServerResponse } from 'http';
2
+ import { AsyncIterableStream } from '../util/async-iterable-stream';
3
+ import {
4
+ CallWarning,
5
+ FinishReason,
6
+ LanguageModelRequestMetadata,
7
+ LanguageModelResponseMetadata,
8
+ ProviderMetadata,
9
+ } from '../types';
10
+ import { LanguageModelUsage } from '../types/usage';
11
+
12
+ /**
13
+ * The result of a `streamObject` call that contains the partial object stream and additional information.
14
+ */
15
+ export interface StreamObjectResult<PARTIAL, RESULT, ELEMENT_STREAM> {
16
+ /**
17
+ * Warnings from the model provider (e.g. unsupported settings)
18
+ */
19
+ readonly warnings: Promise<CallWarning[] | undefined>;
20
+
21
+ /**
22
+ * The token usage of the generated response. Resolved when the response is finished.
23
+ */
24
+ readonly usage: Promise<LanguageModelUsage>;
25
+
26
+ /**
27
+ * Additional provider-specific metadata. They are passed through
28
+ * from the provider to the AI SDK and enable provider-specific
29
+ * results that can be fully encapsulated in the provider.
30
+ */
31
+ readonly providerMetadata: Promise<ProviderMetadata | undefined>;
32
+
33
+ /**
34
+ * Additional request information from the last step.
35
+ */
36
+ readonly request: Promise<LanguageModelRequestMetadata>;
37
+
38
+ /**
39
+ * Additional response information.
40
+ */
41
+ readonly response: Promise<LanguageModelResponseMetadata>;
42
+
43
+ /**
44
+ * The reason why the generation finished. Taken from the last step.
45
+ *
46
+ * Resolved when the response is finished.
47
+ */
48
+ readonly finishReason: Promise<FinishReason>;
49
+
50
+ /**
51
+ * The generated object (typed according to the schema). Resolved when the response is finished.
52
+ */
53
+ readonly object: Promise<RESULT>;
54
+
55
+ /**
56
+ * Stream of partial objects. It gets more complete as the stream progresses.
57
+ *
58
+ * Note that the partial object is not validated.
59
+ * If you want to be certain that the actual content matches your schema, you need to implement your own validation for partial results.
60
+ */
61
+ readonly partialObjectStream: AsyncIterableStream<PARTIAL>;
62
+
63
+ /**
64
+ * Stream over complete array elements. Only available if the output strategy is set to `array`.
65
+ */
66
+ readonly elementStream: ELEMENT_STREAM;
67
+
68
+ /**
69
+ * Text stream of the JSON representation of the generated object. It contains text chunks.
70
+ * When the stream is finished, the object is valid JSON that can be parsed.
71
+ */
72
+ readonly textStream: AsyncIterableStream<string>;
73
+
74
+ /**
75
+ * Stream of different types of events, including partial objects, errors, and finish events.
76
+ * Only errors that stop the stream, such as network errors, are thrown.
77
+ */
78
+ readonly fullStream: AsyncIterableStream<ObjectStreamPart<PARTIAL>>;
79
+
80
+ /**
81
+ * Writes text delta output to a Node.js response-like object.
82
+ * It sets a `Content-Type` header to `text/plain; charset=utf-8` and
83
+ * writes each text delta as a separate chunk.
84
+ *
85
+ * @param response A Node.js response-like object (ServerResponse).
86
+ * @param init Optional headers, status code, and status text.
87
+ */
88
+ pipeTextStreamToResponse(response: ServerResponse, init?: ResponseInit): void;
89
+
90
+ /**
91
+ * Creates a simple text stream response.
92
+ * The response has a `Content-Type` header set to `text/plain; charset=utf-8`.
93
+ * Each text delta is encoded as UTF-8 and sent as a separate chunk.
94
+ * Non-text-delta events are ignored.
95
+ *
96
+ * @param init Optional headers, status code, and status text.
97
+ */
98
+ toTextStreamResponse(init?: ResponseInit): Response;
99
+ }
100
+
101
+ export type ObjectStreamPart<PARTIAL> =
102
+ | {
103
+ type: 'object';
104
+ object: PARTIAL;
105
+ }
106
+ | {
107
+ type: 'text-delta';
108
+ textDelta: string;
109
+ }
110
+ | {
111
+ type: 'error';
112
+ error: unknown;
113
+ }
114
+ | {
115
+ type: 'finish';
116
+ finishReason: FinishReason;
117
+ usage: LanguageModelUsage;
118
+ response: LanguageModelResponseMetadata;
119
+ providerMetadata?: ProviderMetadata;
120
+ };