@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,394 @@
1
+ ---
2
+ title: Loop Control
3
+ description: Control agent execution with built-in loop management using stopWhen and prepareStep
4
+ ---
5
+
6
+ # Loop Control
7
+
8
+ You can control both the execution flow and the settings at each step of the agent loop. The loop continues until:
9
+
10
+ - A finish reasoning other than tool-calls is returned, or
11
+ - A tool that is invoked does not have an execute function, or
12
+ - A tool call needs approval, or
13
+ - A stop condition is met
14
+
15
+ The AI SDK provides built-in loop control through two parameters: `stopWhen` for defining stopping conditions and `prepareStep` for modifying settings (model, tools, messages, and more) between steps.
16
+
17
+ ## Stop Conditions
18
+
19
+ The `stopWhen` parameter controls when to stop execution when there are tool results in the last step. By default, agents stop after 20 steps using `stepCountIs(20)`.
20
+
21
+ When you provide `stopWhen`, the agent continues executing after tool calls until a stopping condition is met. When the condition is an array, execution stops when any of the conditions are met.
22
+
23
+ ### Use Built-in Conditions
24
+
25
+ The AI SDK provides several built-in stopping conditions:
26
+
27
+ ```ts
28
+ import { ToolLoopAgent, stepCountIs } from 'ai';
29
+ __PROVIDER_IMPORT__;
30
+
31
+ const agent = new ToolLoopAgent({
32
+ model: __MODEL__,
33
+ tools: {
34
+ // your tools
35
+ },
36
+ stopWhen: stepCountIs(20), // Default state: stop after 20 steps maximum
37
+ });
38
+
39
+ const result = await agent.generate({
40
+ prompt: 'Analyze this dataset and create a summary report',
41
+ });
42
+ ```
43
+
44
+ ### Combine Multiple Conditions
45
+
46
+ Combine multiple stopping conditions. The loop stops when it meets any condition:
47
+
48
+ ```ts
49
+ import { ToolLoopAgent, stepCountIs, hasToolCall } from 'ai';
50
+ __PROVIDER_IMPORT__;
51
+
52
+ const agent = new ToolLoopAgent({
53
+ model: __MODEL__,
54
+ tools: {
55
+ // your tools
56
+ },
57
+ stopWhen: [
58
+ stepCountIs(20), // Maximum 20 steps
59
+ hasToolCall('someTool'), // Stop after calling 'someTool'
60
+ ],
61
+ });
62
+
63
+ const result = await agent.generate({
64
+ prompt: 'Research and analyze the topic',
65
+ });
66
+ ```
67
+
68
+ ### Create Custom Conditions
69
+
70
+ Build custom stopping conditions for specific requirements:
71
+
72
+ ```ts
73
+ import { ToolLoopAgent, StopCondition, ToolSet } from 'ai';
74
+ __PROVIDER_IMPORT__;
75
+
76
+ const tools = {
77
+ // your tools
78
+ } satisfies ToolSet;
79
+
80
+ const hasAnswer: StopCondition<typeof tools> = ({ steps }) => {
81
+ // Stop when the model generates text containing "ANSWER:"
82
+ return steps.some(step => step.text?.includes('ANSWER:')) ?? false;
83
+ };
84
+
85
+ const agent = new ToolLoopAgent({
86
+ model: __MODEL__,
87
+ tools,
88
+ stopWhen: hasAnswer,
89
+ });
90
+
91
+ const result = await agent.generate({
92
+ prompt: 'Find the answer and respond with "ANSWER: [your answer]"',
93
+ });
94
+ ```
95
+
96
+ Custom conditions receive step information across all steps:
97
+
98
+ ```ts
99
+ const budgetExceeded: StopCondition<typeof tools> = ({ steps }) => {
100
+ const totalUsage = steps.reduce(
101
+ (acc, step) => ({
102
+ inputTokens: acc.inputTokens + (step.usage?.inputTokens ?? 0),
103
+ outputTokens: acc.outputTokens + (step.usage?.outputTokens ?? 0),
104
+ }),
105
+ { inputTokens: 0, outputTokens: 0 },
106
+ );
107
+
108
+ const costEstimate =
109
+ (totalUsage.inputTokens * 0.01 + totalUsage.outputTokens * 0.03) / 1000;
110
+ return costEstimate > 0.5; // Stop if cost exceeds $0.50
111
+ };
112
+ ```
113
+
114
+ ## Prepare Step
115
+
116
+ The `prepareStep` callback runs before each step in the loop and defaults to the initial settings if you don't return any changes. Use it to modify settings, manage context, or implement dynamic behavior based on execution history.
117
+
118
+ ### Dynamic Model Selection
119
+
120
+ Switch models based on step requirements:
121
+
122
+ ```ts
123
+ import { ToolLoopAgent } from 'ai';
124
+ __PROVIDER_IMPORT__;
125
+
126
+ const agent = new ToolLoopAgent({
127
+ model: 'openai/gpt-4o-mini', // Default model
128
+ tools: {
129
+ // your tools
130
+ },
131
+ prepareStep: async ({ stepNumber, messages }) => {
132
+ // Use a stronger model for complex reasoning after initial steps
133
+ if (stepNumber > 2 && messages.length > 10) {
134
+ return {
135
+ model: __MODEL__,
136
+ };
137
+ }
138
+ // Continue with default settings
139
+ return {};
140
+ },
141
+ });
142
+
143
+ const result = await agent.generate({
144
+ prompt: '...',
145
+ });
146
+ ```
147
+
148
+ ### Context Management
149
+
150
+ Manage growing conversation history in long-running loops:
151
+
152
+ ```ts
153
+ import { ToolLoopAgent } from 'ai';
154
+ __PROVIDER_IMPORT__;
155
+
156
+ const agent = new ToolLoopAgent({
157
+ model: __MODEL__,
158
+ tools: {
159
+ // your tools
160
+ },
161
+ prepareStep: async ({ messages }) => {
162
+ // Keep only recent messages to stay within context limits
163
+ if (messages.length > 20) {
164
+ return {
165
+ messages: [
166
+ messages[0], // Keep system instructions
167
+ ...messages.slice(-10), // Keep last 10 messages
168
+ ],
169
+ };
170
+ }
171
+ return {};
172
+ },
173
+ });
174
+
175
+ const result = await agent.generate({
176
+ prompt: '...',
177
+ });
178
+ ```
179
+
180
+ ### Tool Selection
181
+
182
+ Control which tools are available at each step:
183
+
184
+ ```ts
185
+ import { ToolLoopAgent } from 'ai';
186
+ __PROVIDER_IMPORT__;
187
+
188
+ const agent = new ToolLoopAgent({
189
+ model: __MODEL__,
190
+ tools: {
191
+ search: searchTool,
192
+ analyze: analyzeTool,
193
+ summarize: summarizeTool,
194
+ },
195
+ prepareStep: async ({ stepNumber, steps }) => {
196
+ // Search phase (steps 0-2)
197
+ if (stepNumber <= 2) {
198
+ return {
199
+ activeTools: ['search'],
200
+ toolChoice: 'required',
201
+ };
202
+ }
203
+
204
+ // Analysis phase (steps 3-5)
205
+ if (stepNumber <= 5) {
206
+ return {
207
+ activeTools: ['analyze'],
208
+ };
209
+ }
210
+
211
+ // Summary phase (step 6+)
212
+ return {
213
+ activeTools: ['summarize'],
214
+ toolChoice: 'required',
215
+ };
216
+ },
217
+ });
218
+
219
+ const result = await agent.generate({
220
+ prompt: '...',
221
+ });
222
+ ```
223
+
224
+ You can also force a specific tool to be used:
225
+
226
+ ```ts
227
+ prepareStep: async ({ stepNumber }) => {
228
+ if (stepNumber === 0) {
229
+ // Force the search tool to be used first
230
+ return {
231
+ toolChoice: { type: 'tool', toolName: 'search' },
232
+ };
233
+ }
234
+
235
+ if (stepNumber === 5) {
236
+ // Force the summarize tool after analysis
237
+ return {
238
+ toolChoice: { type: 'tool', toolName: 'summarize' },
239
+ };
240
+ }
241
+
242
+ return {};
243
+ };
244
+ ```
245
+
246
+ ### Message Modification
247
+
248
+ Transform messages before sending them to the model:
249
+
250
+ ```ts
251
+ import { ToolLoopAgent } from 'ai';
252
+ __PROVIDER_IMPORT__;
253
+
254
+ const agent = new ToolLoopAgent({
255
+ model: __MODEL__,
256
+ tools: {
257
+ // your tools
258
+ },
259
+ prepareStep: async ({ messages, stepNumber }) => {
260
+ // Summarize tool results to reduce token usage
261
+ const processedMessages = messages.map(msg => {
262
+ if (msg.role === 'tool' && msg.content.length > 1000) {
263
+ return {
264
+ ...msg,
265
+ content: summarizeToolResult(msg.content),
266
+ };
267
+ }
268
+ return msg;
269
+ });
270
+
271
+ return { messages: processedMessages };
272
+ },
273
+ });
274
+
275
+ const result = await agent.generate({
276
+ prompt: '...',
277
+ });
278
+ ```
279
+
280
+ ## Access Step Information
281
+
282
+ Both `stopWhen` and `prepareStep` receive detailed information about the current execution:
283
+
284
+ ```ts
285
+ prepareStep: async ({
286
+ model, // Current model configuration
287
+ stepNumber, // Current step number (0-indexed)
288
+ steps, // All previous steps with their results
289
+ messages, // Messages to be sent to the model
290
+ }) => {
291
+ // Access previous tool calls and results
292
+ const previousToolCalls = steps.flatMap(step => step.toolCalls);
293
+ const previousResults = steps.flatMap(step => step.toolResults);
294
+
295
+ // Make decisions based on execution history
296
+ if (previousToolCalls.some(call => call.toolName === 'dataAnalysis')) {
297
+ return {
298
+ toolChoice: { type: 'tool', toolName: 'reportGenerator' },
299
+ };
300
+ }
301
+
302
+ return {};
303
+ },
304
+ ```
305
+
306
+ ## Forced Tool Calling
307
+
308
+ You can force the agent to always use tools by combining `toolChoice: 'required'` with a `done` tool that has no `execute` function. This pattern ensures the agent uses tools for every step and stops only when it explicitly signals completion.
309
+
310
+ ```ts
311
+ import { ToolLoopAgent, tool } from 'ai';
312
+ import { z } from 'zod';
313
+ __PROVIDER_IMPORT__;
314
+
315
+ const agent = new ToolLoopAgent({
316
+ model: __MODEL__,
317
+ tools: {
318
+ search: searchTool,
319
+ analyze: analyzeTool,
320
+ done: tool({
321
+ description: 'Signal that you have finished your work',
322
+ inputSchema: z.object({
323
+ answer: z.string().describe('The final answer'),
324
+ }),
325
+ // No execute function - stops the agent when called
326
+ }),
327
+ },
328
+ toolChoice: 'required', // Force tool calls at every step
329
+ });
330
+
331
+ const result = await agent.generate({
332
+ prompt: 'Research and analyze this topic, then provide your answer.',
333
+ });
334
+
335
+ // extract answer from done tool call
336
+ const toolCall = result.staticToolCalls[0]; // tool call from final step
337
+ if (toolCall?.toolName === 'done') {
338
+ console.log(toolCall.input.answer);
339
+ }
340
+ ```
341
+
342
+ Key aspects of this pattern:
343
+
344
+ - **`toolChoice: 'required'`**: Forces the model to call a tool at every step instead of generating text directly. This ensures the agent follows a structured workflow.
345
+ - **`done` tool without `execute`**: A tool that has no `execute` function acts as a termination signal. When the agent calls this tool, the loop stops because there's no function to execute.
346
+ - **Accessing results**: The final answer is available in `result.staticToolCalls`, which contains tool calls that weren't executed.
347
+
348
+ This pattern is useful when you want the agent to always use specific tools for operations (like code execution or data retrieval) rather than attempting to answer directly.
349
+
350
+ ## Manual Loop Control
351
+
352
+ For scenarios requiring complete control over the agent loop, you can use AI SDK Core functions (`generateText` and `streamText`) to implement your own loop management instead of using `stopWhen` and `prepareStep`. This approach provides maximum flexibility for complex workflows.
353
+
354
+ ### Implementing a Manual Loop
355
+
356
+ Build your own agent loop when you need full control over execution:
357
+
358
+ ```ts
359
+ import { generateText, ModelMessage } from 'ai';
360
+ __PROVIDER_IMPORT__;
361
+
362
+ const messages: ModelMessage[] = [{ role: 'user', content: '...' }];
363
+
364
+ let step = 0;
365
+ const maxSteps = 10;
366
+
367
+ while (step < maxSteps) {
368
+ const result = await generateText({
369
+ model: __MODEL__,
370
+ messages,
371
+ tools: {
372
+ // your tools here
373
+ },
374
+ });
375
+
376
+ messages.push(...result.response.messages);
377
+
378
+ if (result.text) {
379
+ break; // Stop when model generates text
380
+ }
381
+
382
+ step++;
383
+ }
384
+ ```
385
+
386
+ This manual approach gives you complete control over:
387
+
388
+ - Message history management
389
+ - Step-by-step decision making
390
+ - Custom stopping conditions
391
+ - Dynamic tool and model selection
392
+ - Error handling and recovery
393
+
394
+ [Learn more about manual agent loops in the cookbook](/cookbook/node/manual-agent-loop).
@@ -0,0 +1,286 @@
1
+ ---
2
+ title: Configuring Call Options
3
+ description: Pass type-safe runtime inputs to dynamically configure agent behavior.
4
+ ---
5
+
6
+ # Configuring Call Options
7
+
8
+ Call options allow you to pass type-safe structured inputs to your agent. Use them to dynamically modify any agent setting based on the specific request.
9
+
10
+ ## Why Use Call Options?
11
+
12
+ When you need agent behavior to change based on runtime context:
13
+
14
+ - **Add dynamic context** - Inject retrieved documents, user preferences, or session data into prompts
15
+ - **Select models dynamically** - Choose faster or more capable models based on request complexity
16
+ - **Configure tools per request** - Pass user location to search tools or adjust tool behavior
17
+ - **Customize provider options** - Set reasoning effort, temperature, or other provider-specific settings
18
+
19
+ Without call options, you'd need to create multiple agents or handle configuration logic outside the agent.
20
+
21
+ ## How It Works
22
+
23
+ Define call options in three steps:
24
+
25
+ 1. **Define the schema** - Specify what inputs you accept using `callOptionsSchema`
26
+ 2. **Configure with `prepareCall`** - Use those inputs to modify agent settings
27
+ 3. **Pass options at runtime** - Provide the options when calling `generate()` or `stream()`
28
+
29
+ ## Basic Example
30
+
31
+ Add user context to your agent's prompt at runtime:
32
+
33
+ ```ts
34
+ import { ToolLoopAgent } from 'ai';
35
+ __PROVIDER_IMPORT__;
36
+ import { z } from 'zod';
37
+
38
+ const supportAgent = new ToolLoopAgent({
39
+ model: __MODEL__,
40
+ callOptionsSchema: z.object({
41
+ userId: z.string(),
42
+ accountType: z.enum(['free', 'pro', 'enterprise']),
43
+ }),
44
+ instructions: 'You are a helpful customer support agent.',
45
+ prepareCall: ({ options, ...settings }) => ({
46
+ ...settings,
47
+ instructions:
48
+ settings.instructions +
49
+ `\nUser context:
50
+ - Account type: ${options.accountType}
51
+ - User ID: ${options.userId}
52
+
53
+ Adjust your response based on the user's account level.`,
54
+ }),
55
+ });
56
+
57
+ // Call the agent with specific user context
58
+ const result = await supportAgent.generate({
59
+ prompt: 'How do I upgrade my account?',
60
+ options: {
61
+ userId: 'user_123',
62
+ accountType: 'free',
63
+ },
64
+ });
65
+ ```
66
+
67
+ The `options` parameter is now required and type-checked. If you don't provide it or pass incorrect types, TypeScript will error.
68
+
69
+ ## Modifying Agent Settings
70
+
71
+ Use `prepareCall` to modify any agent setting. Return only the settings you want to change.
72
+
73
+ ### Dynamic Model Selection
74
+
75
+ Choose models based on request characteristics:
76
+
77
+ ```ts
78
+ import { ToolLoopAgent } from 'ai';
79
+ __PROVIDER_IMPORT__;
80
+ import { z } from 'zod';
81
+
82
+ const agent = new ToolLoopAgent({
83
+ model: __MODEL__, // Default model
84
+ callOptionsSchema: z.object({
85
+ complexity: z.enum(['simple', 'complex']),
86
+ }),
87
+ prepareCall: ({ options, ...settings }) => ({
88
+ ...settings,
89
+ model:
90
+ options.complexity === 'simple' ? 'openai/gpt-4o-mini' : 'openai/o1-mini',
91
+ }),
92
+ });
93
+
94
+ // Use faster model for simple queries
95
+ await agent.generate({
96
+ prompt: 'What is 2+2?',
97
+ options: { complexity: 'simple' },
98
+ });
99
+
100
+ // Use more capable model for complex reasoning
101
+ await agent.generate({
102
+ prompt: 'Explain quantum entanglement',
103
+ options: { complexity: 'complex' },
104
+ });
105
+ ```
106
+
107
+ ### Dynamic Tool Configuration
108
+
109
+ Configure tools based on runtime context:
110
+
111
+ ```ts
112
+ import { openai } from '@ai-sdk/openai';
113
+ import { ToolLoopAgent } from 'ai';
114
+ __PROVIDER_IMPORT__;
115
+ import { z } from 'zod';
116
+
117
+ const newsAgent = new ToolLoopAgent({
118
+ model: __MODEL__,
119
+ callOptionsSchema: z.object({
120
+ userCity: z.string().optional(),
121
+ userRegion: z.string().optional(),
122
+ }),
123
+ tools: {
124
+ web_search: openai.tools.webSearch(),
125
+ },
126
+ prepareCall: ({ options, ...settings }) => ({
127
+ ...settings,
128
+ tools: {
129
+ web_search: openai.tools.webSearch({
130
+ searchContextSize: 'low',
131
+ userLocation: {
132
+ type: 'approximate',
133
+ city: options.userCity,
134
+ region: options.userRegion,
135
+ country: 'US',
136
+ },
137
+ }),
138
+ },
139
+ }),
140
+ });
141
+
142
+ await newsAgent.generate({
143
+ prompt: 'What are the top local news stories?',
144
+ options: {
145
+ userCity: 'San Francisco',
146
+ userRegion: 'California',
147
+ },
148
+ });
149
+ ```
150
+
151
+ ### Provider-Specific Options
152
+
153
+ Configure provider settings dynamically:
154
+
155
+ ```ts
156
+ import { OpenAILanguageModelResponsesOptions } from '@ai-sdk/openai';
157
+ import { ToolLoopAgent } from 'ai';
158
+ import { z } from 'zod';
159
+
160
+ const agent = new ToolLoopAgent({
161
+ model: 'openai/o3',
162
+ callOptionsSchema: z.object({
163
+ taskDifficulty: z.enum(['low', 'medium', 'high']),
164
+ }),
165
+ prepareCall: ({ options, ...settings }) => ({
166
+ ...settings,
167
+ providerOptions: {
168
+ openai: {
169
+ reasoningEffort: options.taskDifficulty,
170
+ } satisfies OpenAILanguageModelResponsesOptions,
171
+ },
172
+ }),
173
+ });
174
+
175
+ await agent.generate({
176
+ prompt: 'Analyze this complex scenario...',
177
+ options: { taskDifficulty: 'high' },
178
+ });
179
+ ```
180
+
181
+ ## Advanced Patterns
182
+
183
+ ### Retrieval Augmented Generation (RAG)
184
+
185
+ Fetch relevant context and inject it into your prompt:
186
+
187
+ ```ts
188
+ import { ToolLoopAgent } from 'ai';
189
+ __PROVIDER_IMPORT__;
190
+ import { z } from 'zod';
191
+
192
+ const ragAgent = new ToolLoopAgent({
193
+ model: __MODEL__,
194
+ callOptionsSchema: z.object({
195
+ query: z.string(),
196
+ }),
197
+ prepareCall: async ({ options, ...settings }) => {
198
+ // Fetch relevant documents (this can be async)
199
+ const documents = await vectorSearch(options.query);
200
+
201
+ return {
202
+ ...settings,
203
+ instructions: `Answer questions using the following context:
204
+
205
+ ${documents.map(doc => doc.content).join('\n\n')}`,
206
+ };
207
+ },
208
+ });
209
+
210
+ await ragAgent.generate({
211
+ prompt: 'What is our refund policy?',
212
+ options: { query: 'refund policy' },
213
+ });
214
+ ```
215
+
216
+ The `prepareCall` function can be async, enabling you to fetch data before configuring the agent.
217
+
218
+ ### Combining Multiple Modifications
219
+
220
+ Modify multiple settings together:
221
+
222
+ ```ts
223
+ import { ToolLoopAgent } from 'ai';
224
+ __PROVIDER_IMPORT__;
225
+ import { z } from 'zod';
226
+
227
+ const agent = new ToolLoopAgent({
228
+ model: __MODEL__,
229
+ callOptionsSchema: z.object({
230
+ userRole: z.enum(['admin', 'user']),
231
+ urgency: z.enum(['low', 'high']),
232
+ }),
233
+ tools: {
234
+ readDatabase: readDatabaseTool,
235
+ writeDatabase: writeDatabaseTool,
236
+ },
237
+ prepareCall: ({ options, ...settings }) => ({
238
+ ...settings,
239
+ // Upgrade model for urgent requests
240
+ model: options.urgency === 'high' ? __MODEL__ : settings.model,
241
+ // Limit tools based on user role
242
+ activeTools:
243
+ options.userRole === 'admin'
244
+ ? ['readDatabase', 'writeDatabase']
245
+ : ['readDatabase'],
246
+ // Adjust instructions
247
+ instructions: `You are a ${options.userRole} assistant.
248
+ ${options.userRole === 'admin' ? 'You have full database access.' : 'You have read-only access.'}`,
249
+ }),
250
+ });
251
+
252
+ await agent.generate({
253
+ prompt: 'Update the user record',
254
+ options: {
255
+ userRole: 'admin',
256
+ urgency: 'high',
257
+ },
258
+ });
259
+ ```
260
+
261
+ ## Using with createAgentUIStreamResponse
262
+
263
+ Pass call options through API routes to your agent:
264
+
265
+ ```ts filename="app/api/chat/route.ts"
266
+ import { createAgentUIStreamResponse } from 'ai';
267
+ import { myAgent } from '@/ai/agents/my-agent';
268
+
269
+ export async function POST(request: Request) {
270
+ const { messages, userId, accountType } = await request.json();
271
+
272
+ return createAgentUIStreamResponse({
273
+ agent: myAgent,
274
+ messages,
275
+ options: {
276
+ userId,
277
+ accountType,
278
+ },
279
+ });
280
+ }
281
+ ```
282
+
283
+ ## Next Steps
284
+
285
+ - Learn about [loop control](/docs/agents/loop-control) for execution management
286
+ - Explore [workflow patterns](/docs/agents/workflows) for complex multi-step processes