@depup/ai 6.0.116-depup.0

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 (515) hide show
  1. package/CHANGELOG.md +7350 -0
  2. package/LICENSE +13 -0
  3. package/README.md +25 -0
  4. package/changes.json +5 -0
  5. package/dist/index.d.mts +6429 -0
  6. package/dist/index.d.ts +6429 -0
  7. package/dist/index.js +13548 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/index.mjs +13514 -0
  10. package/dist/index.mjs.map +1 -0
  11. package/dist/internal/index.d.mts +314 -0
  12. package/dist/internal/index.d.ts +314 -0
  13. package/dist/internal/index.js +1316 -0
  14. package/dist/internal/index.js.map +1 -0
  15. package/dist/internal/index.mjs +1300 -0
  16. package/dist/internal/index.mjs.map +1 -0
  17. package/dist/test/index.d.mts +133 -0
  18. package/dist/test/index.d.ts +133 -0
  19. package/dist/test/index.js +275 -0
  20. package/dist/test/index.js.map +1 -0
  21. package/dist/test/index.mjs +245 -0
  22. package/dist/test/index.mjs.map +1 -0
  23. package/docs/00-introduction/index.mdx +76 -0
  24. package/docs/02-foundations/01-overview.mdx +43 -0
  25. package/docs/02-foundations/02-providers-and-models.mdx +156 -0
  26. package/docs/02-foundations/03-prompts.mdx +616 -0
  27. package/docs/02-foundations/04-tools.mdx +251 -0
  28. package/docs/02-foundations/05-streaming.mdx +62 -0
  29. package/docs/02-foundations/06-provider-options.mdx +337 -0
  30. package/docs/02-foundations/index.mdx +49 -0
  31. package/docs/02-getting-started/00-choosing-a-provider.mdx +110 -0
  32. package/docs/02-getting-started/01-navigating-the-library.mdx +85 -0
  33. package/docs/02-getting-started/02-nextjs-app-router.mdx +559 -0
  34. package/docs/02-getting-started/03-nextjs-pages-router.mdx +542 -0
  35. package/docs/02-getting-started/04-svelte.mdx +627 -0
  36. package/docs/02-getting-started/05-nuxt.mdx +566 -0
  37. package/docs/02-getting-started/06-nodejs.mdx +512 -0
  38. package/docs/02-getting-started/07-expo.mdx +766 -0
  39. package/docs/02-getting-started/08-tanstack-start.mdx +583 -0
  40. package/docs/02-getting-started/09-coding-agents.mdx +179 -0
  41. package/docs/02-getting-started/index.mdx +44 -0
  42. package/docs/03-agents/01-overview.mdx +96 -0
  43. package/docs/03-agents/02-building-agents.mdx +449 -0
  44. package/docs/03-agents/03-workflows.mdx +386 -0
  45. package/docs/03-agents/04-loop-control.mdx +394 -0
  46. package/docs/03-agents/05-configuring-call-options.mdx +286 -0
  47. package/docs/03-agents/06-memory.mdx +222 -0
  48. package/docs/03-agents/06-subagents.mdx +362 -0
  49. package/docs/03-agents/index.mdx +46 -0
  50. package/docs/03-ai-sdk-core/01-overview.mdx +31 -0
  51. package/docs/03-ai-sdk-core/05-generating-text.mdx +707 -0
  52. package/docs/03-ai-sdk-core/10-generating-structured-data.mdx +498 -0
  53. package/docs/03-ai-sdk-core/15-tools-and-tool-calling.mdx +1144 -0
  54. package/docs/03-ai-sdk-core/16-mcp-tools.mdx +377 -0
  55. package/docs/03-ai-sdk-core/20-prompt-engineering.mdx +146 -0
  56. package/docs/03-ai-sdk-core/25-settings.mdx +198 -0
  57. package/docs/03-ai-sdk-core/30-embeddings.mdx +245 -0
  58. package/docs/03-ai-sdk-core/31-reranking.mdx +218 -0
  59. package/docs/03-ai-sdk-core/35-image-generation.mdx +342 -0
  60. package/docs/03-ai-sdk-core/36-transcription.mdx +227 -0
  61. package/docs/03-ai-sdk-core/37-speech.mdx +169 -0
  62. package/docs/03-ai-sdk-core/38-video-generation.mdx +366 -0
  63. package/docs/03-ai-sdk-core/40-middleware.mdx +485 -0
  64. package/docs/03-ai-sdk-core/45-provider-management.mdx +349 -0
  65. package/docs/03-ai-sdk-core/50-error-handling.mdx +149 -0
  66. package/docs/03-ai-sdk-core/55-testing.mdx +219 -0
  67. package/docs/03-ai-sdk-core/60-telemetry.mdx +391 -0
  68. package/docs/03-ai-sdk-core/65-devtools.mdx +107 -0
  69. package/docs/03-ai-sdk-core/65-event-listeners.mdx +915 -0
  70. package/docs/03-ai-sdk-core/index.mdx +93 -0
  71. package/docs/04-ai-sdk-ui/01-overview.mdx +44 -0
  72. package/docs/04-ai-sdk-ui/02-chatbot.mdx +1313 -0
  73. package/docs/04-ai-sdk-ui/03-chatbot-message-persistence.mdx +535 -0
  74. package/docs/04-ai-sdk-ui/03-chatbot-resume-streams.mdx +263 -0
  75. package/docs/04-ai-sdk-ui/03-chatbot-tool-usage.mdx +682 -0
  76. package/docs/04-ai-sdk-ui/04-generative-user-interfaces.mdx +389 -0
  77. package/docs/04-ai-sdk-ui/05-completion.mdx +181 -0
  78. package/docs/04-ai-sdk-ui/08-object-generation.mdx +344 -0
  79. package/docs/04-ai-sdk-ui/20-streaming-data.mdx +397 -0
  80. package/docs/04-ai-sdk-ui/21-error-handling.mdx +190 -0
  81. package/docs/04-ai-sdk-ui/21-transport.mdx +174 -0
  82. package/docs/04-ai-sdk-ui/24-reading-ui-message-streams.mdx +104 -0
  83. package/docs/04-ai-sdk-ui/25-message-metadata.mdx +152 -0
  84. package/docs/04-ai-sdk-ui/50-stream-protocol.mdx +477 -0
  85. package/docs/04-ai-sdk-ui/index.mdx +64 -0
  86. package/docs/05-ai-sdk-rsc/01-overview.mdx +45 -0
  87. package/docs/05-ai-sdk-rsc/02-streaming-react-components.mdx +209 -0
  88. package/docs/05-ai-sdk-rsc/03-generative-ui-state.mdx +279 -0
  89. package/docs/05-ai-sdk-rsc/03-saving-and-restoring-states.mdx +105 -0
  90. package/docs/05-ai-sdk-rsc/04-multistep-interfaces.mdx +282 -0
  91. package/docs/05-ai-sdk-rsc/05-streaming-values.mdx +157 -0
  92. package/docs/05-ai-sdk-rsc/06-loading-state.mdx +273 -0
  93. package/docs/05-ai-sdk-rsc/08-error-handling.mdx +94 -0
  94. package/docs/05-ai-sdk-rsc/09-authentication.mdx +42 -0
  95. package/docs/05-ai-sdk-rsc/10-migrating-to-ui.mdx +722 -0
  96. package/docs/05-ai-sdk-rsc/index.mdx +63 -0
  97. package/docs/06-advanced/01-prompt-engineering.mdx +96 -0
  98. package/docs/06-advanced/02-stopping-streams.mdx +184 -0
  99. package/docs/06-advanced/03-backpressure.mdx +173 -0
  100. package/docs/06-advanced/04-caching.mdx +169 -0
  101. package/docs/06-advanced/05-multiple-streamables.mdx +68 -0
  102. package/docs/06-advanced/06-rate-limiting.mdx +60 -0
  103. package/docs/06-advanced/07-rendering-ui-with-language-models.mdx +225 -0
  104. package/docs/06-advanced/08-model-as-router.mdx +120 -0
  105. package/docs/06-advanced/09-multistep-interfaces.mdx +115 -0
  106. package/docs/06-advanced/09-sequential-generations.mdx +55 -0
  107. package/docs/06-advanced/10-vercel-deployment-guide.mdx +117 -0
  108. package/docs/06-advanced/index.mdx +11 -0
  109. package/docs/07-reference/01-ai-sdk-core/01-generate-text.mdx +2715 -0
  110. package/docs/07-reference/01-ai-sdk-core/02-stream-text.mdx +3656 -0
  111. package/docs/07-reference/01-ai-sdk-core/05-embed.mdx +197 -0
  112. package/docs/07-reference/01-ai-sdk-core/06-embed-many.mdx +191 -0
  113. package/docs/07-reference/01-ai-sdk-core/06-rerank.mdx +309 -0
  114. package/docs/07-reference/01-ai-sdk-core/10-generate-image.mdx +251 -0
  115. package/docs/07-reference/01-ai-sdk-core/11-transcribe.mdx +152 -0
  116. package/docs/07-reference/01-ai-sdk-core/12-generate-speech.mdx +221 -0
  117. package/docs/07-reference/01-ai-sdk-core/13-generate-video.mdx +264 -0
  118. package/docs/07-reference/01-ai-sdk-core/15-agent.mdx +235 -0
  119. package/docs/07-reference/01-ai-sdk-core/16-tool-loop-agent.mdx +973 -0
  120. package/docs/07-reference/01-ai-sdk-core/17-create-agent-ui-stream.mdx +154 -0
  121. package/docs/07-reference/01-ai-sdk-core/18-create-agent-ui-stream-response.mdx +173 -0
  122. package/docs/07-reference/01-ai-sdk-core/18-pipe-agent-ui-stream-to-response.mdx +150 -0
  123. package/docs/07-reference/01-ai-sdk-core/20-tool.mdx +209 -0
  124. package/docs/07-reference/01-ai-sdk-core/22-dynamic-tool.mdx +223 -0
  125. package/docs/07-reference/01-ai-sdk-core/23-create-mcp-client.mdx +416 -0
  126. package/docs/07-reference/01-ai-sdk-core/24-mcp-stdio-transport.mdx +68 -0
  127. package/docs/07-reference/01-ai-sdk-core/25-json-schema.mdx +94 -0
  128. package/docs/07-reference/01-ai-sdk-core/26-zod-schema.mdx +109 -0
  129. package/docs/07-reference/01-ai-sdk-core/27-valibot-schema.mdx +58 -0
  130. package/docs/07-reference/01-ai-sdk-core/28-output.mdx +342 -0
  131. package/docs/07-reference/01-ai-sdk-core/30-model-message.mdx +415 -0
  132. package/docs/07-reference/01-ai-sdk-core/31-ui-message.mdx +246 -0
  133. package/docs/07-reference/01-ai-sdk-core/32-validate-ui-messages.mdx +101 -0
  134. package/docs/07-reference/01-ai-sdk-core/33-safe-validate-ui-messages.mdx +113 -0
  135. package/docs/07-reference/01-ai-sdk-core/40-provider-registry.mdx +198 -0
  136. package/docs/07-reference/01-ai-sdk-core/42-custom-provider.mdx +157 -0
  137. package/docs/07-reference/01-ai-sdk-core/50-cosine-similarity.mdx +52 -0
  138. package/docs/07-reference/01-ai-sdk-core/60-wrap-language-model.mdx +59 -0
  139. package/docs/07-reference/01-ai-sdk-core/61-wrap-image-model.mdx +64 -0
  140. package/docs/07-reference/01-ai-sdk-core/65-language-model-v2-middleware.mdx +74 -0
  141. package/docs/07-reference/01-ai-sdk-core/66-extract-reasoning-middleware.mdx +68 -0
  142. package/docs/07-reference/01-ai-sdk-core/67-simulate-streaming-middleware.mdx +71 -0
  143. package/docs/07-reference/01-ai-sdk-core/68-default-settings-middleware.mdx +80 -0
  144. package/docs/07-reference/01-ai-sdk-core/69-add-tool-input-examples-middleware.mdx +155 -0
  145. package/docs/07-reference/01-ai-sdk-core/70-extract-json-middleware.mdx +147 -0
  146. package/docs/07-reference/01-ai-sdk-core/70-step-count-is.mdx +84 -0
  147. package/docs/07-reference/01-ai-sdk-core/71-has-tool-call.mdx +120 -0
  148. package/docs/07-reference/01-ai-sdk-core/75-simulate-readable-stream.mdx +94 -0
  149. package/docs/07-reference/01-ai-sdk-core/80-smooth-stream.mdx +145 -0
  150. package/docs/07-reference/01-ai-sdk-core/90-generate-id.mdx +30 -0
  151. package/docs/07-reference/01-ai-sdk-core/91-create-id-generator.mdx +89 -0
  152. package/docs/07-reference/01-ai-sdk-core/92-default-generated-file.mdx +68 -0
  153. package/docs/07-reference/01-ai-sdk-core/index.mdx +160 -0
  154. package/docs/07-reference/02-ai-sdk-ui/01-use-chat.mdx +493 -0
  155. package/docs/07-reference/02-ai-sdk-ui/02-use-completion.mdx +185 -0
  156. package/docs/07-reference/02-ai-sdk-ui/03-use-object.mdx +196 -0
  157. package/docs/07-reference/02-ai-sdk-ui/31-convert-to-model-messages.mdx +231 -0
  158. package/docs/07-reference/02-ai-sdk-ui/32-prune-messages.mdx +108 -0
  159. package/docs/07-reference/02-ai-sdk-ui/40-create-ui-message-stream.mdx +162 -0
  160. package/docs/07-reference/02-ai-sdk-ui/41-create-ui-message-stream-response.mdx +119 -0
  161. package/docs/07-reference/02-ai-sdk-ui/42-pipe-ui-message-stream-to-response.mdx +77 -0
  162. package/docs/07-reference/02-ai-sdk-ui/43-read-ui-message-stream.mdx +57 -0
  163. package/docs/07-reference/02-ai-sdk-ui/46-infer-ui-tools.mdx +99 -0
  164. package/docs/07-reference/02-ai-sdk-ui/47-infer-ui-tool.mdx +75 -0
  165. package/docs/07-reference/02-ai-sdk-ui/50-direct-chat-transport.mdx +333 -0
  166. package/docs/07-reference/02-ai-sdk-ui/index.mdx +89 -0
  167. package/docs/07-reference/03-ai-sdk-rsc/01-stream-ui.mdx +767 -0
  168. package/docs/07-reference/03-ai-sdk-rsc/02-create-ai.mdx +90 -0
  169. package/docs/07-reference/03-ai-sdk-rsc/03-create-streamable-ui.mdx +91 -0
  170. package/docs/07-reference/03-ai-sdk-rsc/04-create-streamable-value.mdx +78 -0
  171. package/docs/07-reference/03-ai-sdk-rsc/05-read-streamable-value.mdx +79 -0
  172. package/docs/07-reference/03-ai-sdk-rsc/06-get-ai-state.mdx +50 -0
  173. package/docs/07-reference/03-ai-sdk-rsc/07-get-mutable-ai-state.mdx +70 -0
  174. package/docs/07-reference/03-ai-sdk-rsc/08-use-ai-state.mdx +26 -0
  175. package/docs/07-reference/03-ai-sdk-rsc/09-use-actions.mdx +42 -0
  176. package/docs/07-reference/03-ai-sdk-rsc/10-use-ui-state.mdx +35 -0
  177. package/docs/07-reference/03-ai-sdk-rsc/11-use-streamable-value.mdx +46 -0
  178. package/docs/07-reference/03-ai-sdk-rsc/20-render.mdx +266 -0
  179. package/docs/07-reference/03-ai-sdk-rsc/index.mdx +67 -0
  180. package/docs/07-reference/05-ai-sdk-errors/ai-api-call-error.mdx +31 -0
  181. package/docs/07-reference/05-ai-sdk-errors/ai-download-error.mdx +28 -0
  182. package/docs/07-reference/05-ai-sdk-errors/ai-empty-response-body-error.mdx +24 -0
  183. package/docs/07-reference/05-ai-sdk-errors/ai-invalid-argument-error.mdx +26 -0
  184. package/docs/07-reference/05-ai-sdk-errors/ai-invalid-data-content-error.mdx +26 -0
  185. package/docs/07-reference/05-ai-sdk-errors/ai-invalid-message-role-error.mdx +25 -0
  186. package/docs/07-reference/05-ai-sdk-errors/ai-invalid-prompt-error.mdx +47 -0
  187. package/docs/07-reference/05-ai-sdk-errors/ai-invalid-response-data-error.mdx +25 -0
  188. package/docs/07-reference/05-ai-sdk-errors/ai-invalid-tool-approval-error.mdx +24 -0
  189. package/docs/07-reference/05-ai-sdk-errors/ai-invalid-tool-input-error.mdx +27 -0
  190. package/docs/07-reference/05-ai-sdk-errors/ai-json-parse-error.mdx +25 -0
  191. package/docs/07-reference/05-ai-sdk-errors/ai-load-api-key-error.mdx +24 -0
  192. package/docs/07-reference/05-ai-sdk-errors/ai-load-setting-error.mdx +24 -0
  193. package/docs/07-reference/05-ai-sdk-errors/ai-message-conversion-error.mdx +25 -0
  194. package/docs/07-reference/05-ai-sdk-errors/ai-no-content-generated-error.mdx +24 -0
  195. package/docs/07-reference/05-ai-sdk-errors/ai-no-image-generated-error.mdx +36 -0
  196. package/docs/07-reference/05-ai-sdk-errors/ai-no-object-generated-error.mdx +43 -0
  197. package/docs/07-reference/05-ai-sdk-errors/ai-no-output-generated-error.mdx +25 -0
  198. package/docs/07-reference/05-ai-sdk-errors/ai-no-speech-generated-error.mdx +24 -0
  199. package/docs/07-reference/05-ai-sdk-errors/ai-no-such-model-error.mdx +26 -0
  200. package/docs/07-reference/05-ai-sdk-errors/ai-no-such-provider-error.mdx +28 -0
  201. package/docs/07-reference/05-ai-sdk-errors/ai-no-such-tool-error.mdx +26 -0
  202. package/docs/07-reference/05-ai-sdk-errors/ai-no-transcript-generated-error.mdx +24 -0
  203. package/docs/07-reference/05-ai-sdk-errors/ai-no-video-generated-error.mdx +39 -0
  204. package/docs/07-reference/05-ai-sdk-errors/ai-retry-error.mdx +27 -0
  205. package/docs/07-reference/05-ai-sdk-errors/ai-too-many-embedding-values-for-call-error.mdx +27 -0
  206. package/docs/07-reference/05-ai-sdk-errors/ai-tool-call-not-found-for-approval-error.mdx +25 -0
  207. package/docs/07-reference/05-ai-sdk-errors/ai-tool-call-repair-error.mdx +28 -0
  208. package/docs/07-reference/05-ai-sdk-errors/ai-type-validation-error.mdx +25 -0
  209. package/docs/07-reference/05-ai-sdk-errors/ai-ui-message-stream-error.mdx +67 -0
  210. package/docs/07-reference/05-ai-sdk-errors/ai-unsupported-functionality-error.mdx +25 -0
  211. package/docs/07-reference/05-ai-sdk-errors/index.mdx +39 -0
  212. package/docs/07-reference/index.mdx +28 -0
  213. package/docs/08-migration-guides/00-versioning.mdx +46 -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 +126 -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 +244 -0
  267. package/src/agent/tool-loop-agent.ts +206 -0
  268. package/src/embed/embed-many-result.ts +53 -0
  269. package/src/embed/embed-many.ts +386 -0
  270. package/src/embed/embed-result.ts +50 -0
  271. package/src/embed/embed.ts +217 -0
  272. package/src/embed/index.ts +4 -0
  273. package/src/error/index.ts +37 -0
  274. package/src/error/invalid-argument-error.ts +34 -0
  275. package/src/error/invalid-stream-part-error.ts +28 -0
  276. package/src/error/invalid-tool-approval-error.ts +26 -0
  277. package/src/error/invalid-tool-input-error.ts +33 -0
  278. package/src/error/missing-tool-result-error.ts +28 -0
  279. package/src/error/no-image-generated-error.ts +39 -0
  280. package/src/error/no-object-generated-error.ts +70 -0
  281. package/src/error/no-output-generated-error.ts +26 -0
  282. package/src/error/no-speech-generated-error.ts +28 -0
  283. package/src/error/no-such-tool-error.ts +35 -0
  284. package/src/error/no-transcript-generated-error.ts +30 -0
  285. package/src/error/no-video-generated-error.ts +57 -0
  286. package/src/error/tool-call-not-found-for-approval-error.ts +32 -0
  287. package/src/error/tool-call-repair-error.ts +30 -0
  288. package/src/error/ui-message-stream-error.ts +48 -0
  289. package/src/error/unsupported-model-version-error.ts +23 -0
  290. package/src/error/verify-no-object-generated-error.ts +27 -0
  291. package/src/generate-image/generate-image-result.ts +42 -0
  292. package/src/generate-image/generate-image.ts +361 -0
  293. package/src/generate-image/index.ts +18 -0
  294. package/src/generate-object/generate-object-result.ts +67 -0
  295. package/src/generate-object/generate-object.ts +517 -0
  296. package/src/generate-object/index.ts +9 -0
  297. package/src/generate-object/inject-json-instruction.ts +30 -0
  298. package/src/generate-object/output-strategy.ts +415 -0
  299. package/src/generate-object/parse-and-validate-object-result.ts +111 -0
  300. package/src/generate-object/repair-text.ts +12 -0
  301. package/src/generate-object/stream-object-result.ts +120 -0
  302. package/src/generate-object/stream-object.ts +985 -0
  303. package/src/generate-object/validate-object-generation-input.ts +144 -0
  304. package/src/generate-speech/generate-speech-result.ts +30 -0
  305. package/src/generate-speech/generate-speech.ts +191 -0
  306. package/src/generate-speech/generated-audio-file.ts +65 -0
  307. package/src/generate-speech/index.ts +3 -0
  308. package/src/generate-text/callback-events.ts +332 -0
  309. package/src/generate-text/collect-tool-approvals.ts +116 -0
  310. package/src/generate-text/content-part.ts +25 -0
  311. package/src/generate-text/execute-tool-call.ts +197 -0
  312. package/src/generate-text/extract-reasoning-content.ts +17 -0
  313. package/src/generate-text/extract-text-content.ts +15 -0
  314. package/src/generate-text/generate-text-result.ts +168 -0
  315. package/src/generate-text/generate-text.ts +1535 -0
  316. package/src/generate-text/generated-file.ts +70 -0
  317. package/src/generate-text/index.ts +74 -0
  318. package/src/generate-text/is-approval-needed.ts +29 -0
  319. package/src/generate-text/output-utils.ts +23 -0
  320. package/src/generate-text/output.ts +590 -0
  321. package/src/generate-text/parse-tool-call.ts +188 -0
  322. package/src/generate-text/prepare-step.ts +103 -0
  323. package/src/generate-text/prune-messages.ts +167 -0
  324. package/src/generate-text/reasoning-output.ts +20 -0
  325. package/src/generate-text/reasoning.ts +8 -0
  326. package/src/generate-text/response-message.ts +10 -0
  327. package/src/generate-text/run-tools-transformation.ts +442 -0
  328. package/src/generate-text/smooth-stream.ts +162 -0
  329. package/src/generate-text/step-result.ts +290 -0
  330. package/src/generate-text/stop-condition.ts +29 -0
  331. package/src/generate-text/stream-text-result.ts +463 -0
  332. package/src/generate-text/stream-text.ts +2807 -0
  333. package/src/generate-text/to-response-messages.ts +163 -0
  334. package/src/generate-text/tool-approval-request-output.ts +21 -0
  335. package/src/generate-text/tool-call-repair-function.ts +27 -0
  336. package/src/generate-text/tool-call.ts +47 -0
  337. package/src/generate-text/tool-error.ts +34 -0
  338. package/src/generate-text/tool-output-denied.ts +21 -0
  339. package/src/generate-text/tool-output.ts +7 -0
  340. package/src/generate-text/tool-result.ts +36 -0
  341. package/src/generate-text/tool-set.ts +14 -0
  342. package/src/generate-video/generate-video-result.ts +36 -0
  343. package/src/generate-video/generate-video.ts +402 -0
  344. package/src/generate-video/index.ts +3 -0
  345. package/src/global.ts +36 -0
  346. package/src/index.ts +49 -0
  347. package/src/logger/index.ts +6 -0
  348. package/src/logger/log-warnings.ts +140 -0
  349. package/src/middleware/add-tool-input-examples-middleware.ts +90 -0
  350. package/src/middleware/default-embedding-settings-middleware.ts +22 -0
  351. package/src/middleware/default-settings-middleware.ts +33 -0
  352. package/src/middleware/extract-json-middleware.ts +197 -0
  353. package/src/middleware/extract-reasoning-middleware.ts +249 -0
  354. package/src/middleware/index.ts +10 -0
  355. package/src/middleware/simulate-streaming-middleware.ts +79 -0
  356. package/src/middleware/wrap-embedding-model.ts +86 -0
  357. package/src/middleware/wrap-image-model.ts +85 -0
  358. package/src/middleware/wrap-language-model.ts +104 -0
  359. package/src/middleware/wrap-provider.ts +51 -0
  360. package/src/model/as-embedding-model-v3.ts +24 -0
  361. package/src/model/as-image-model-v3.ts +24 -0
  362. package/src/model/as-language-model-v3.ts +103 -0
  363. package/src/model/as-provider-v3.ts +36 -0
  364. package/src/model/as-speech-model-v3.ts +24 -0
  365. package/src/model/as-transcription-model-v3.ts +24 -0
  366. package/src/model/resolve-model.ts +159 -0
  367. package/src/prompt/call-settings.ts +148 -0
  368. package/src/prompt/content-part.ts +215 -0
  369. package/src/prompt/convert-to-language-model-prompt.ts +526 -0
  370. package/src/prompt/create-tool-model-output.ts +34 -0
  371. package/src/prompt/data-content.ts +134 -0
  372. package/src/prompt/index.ts +27 -0
  373. package/src/prompt/invalid-data-content-error.ts +29 -0
  374. package/src/prompt/invalid-message-role-error.ts +27 -0
  375. package/src/prompt/message-conversion-error.ts +28 -0
  376. package/src/prompt/message.ts +68 -0
  377. package/src/prompt/prepare-call-settings.ts +108 -0
  378. package/src/prompt/prepare-tools-and-tool-choice.ts +86 -0
  379. package/src/prompt/prompt.ts +43 -0
  380. package/src/prompt/split-data-url.ts +17 -0
  381. package/src/prompt/standardize-prompt.ts +99 -0
  382. package/src/prompt/wrap-gateway-error.ts +29 -0
  383. package/src/registry/custom-provider.ts +176 -0
  384. package/src/registry/index.ts +7 -0
  385. package/src/registry/no-such-provider-error.ts +41 -0
  386. package/src/registry/provider-registry.ts +328 -0
  387. package/src/rerank/index.ts +2 -0
  388. package/src/rerank/rerank-result.ts +70 -0
  389. package/src/rerank/rerank.ts +239 -0
  390. package/src/telemetry/assemble-operation-name.ts +21 -0
  391. package/src/telemetry/get-base-telemetry-attributes.ts +53 -0
  392. package/src/telemetry/get-global-telemetry-integration.ts +85 -0
  393. package/src/telemetry/get-tracer.ts +20 -0
  394. package/src/telemetry/index.ts +4 -0
  395. package/src/telemetry/noop-tracer.ts +69 -0
  396. package/src/telemetry/record-span.ts +75 -0
  397. package/src/telemetry/select-telemetry-attributes.ts +78 -0
  398. package/src/telemetry/stringify-for-telemetry.ts +33 -0
  399. package/src/telemetry/telemetry-integration-registry.ts +17 -0
  400. package/src/telemetry/telemetry-integration.ts +24 -0
  401. package/src/telemetry/telemetry-settings.ts +53 -0
  402. package/src/test/mock-embedding-model-v2.ts +35 -0
  403. package/src/test/mock-embedding-model-v3.ts +48 -0
  404. package/src/test/mock-image-model-v2.ts +28 -0
  405. package/src/test/mock-image-model-v3.ts +28 -0
  406. package/src/test/mock-language-model-v2.ts +72 -0
  407. package/src/test/mock-language-model-v3.ts +77 -0
  408. package/src/test/mock-provider-v2.ts +68 -0
  409. package/src/test/mock-provider-v3.ts +80 -0
  410. package/src/test/mock-reranking-model-v3.ts +25 -0
  411. package/src/test/mock-server-response.ts +69 -0
  412. package/src/test/mock-speech-model-v2.ts +24 -0
  413. package/src/test/mock-speech-model-v3.ts +24 -0
  414. package/src/test/mock-tracer.ts +156 -0
  415. package/src/test/mock-transcription-model-v2.ts +24 -0
  416. package/src/test/mock-transcription-model-v3.ts +24 -0
  417. package/src/test/mock-values.ts +4 -0
  418. package/src/test/mock-video-model-v3.ts +28 -0
  419. package/src/test/not-implemented.ts +3 -0
  420. package/src/text-stream/create-text-stream-response.ts +30 -0
  421. package/src/text-stream/index.ts +2 -0
  422. package/src/text-stream/pipe-text-stream-to-response.ts +38 -0
  423. package/src/transcribe/index.ts +2 -0
  424. package/src/transcribe/transcribe-result.ts +60 -0
  425. package/src/transcribe/transcribe.ts +187 -0
  426. package/src/types/embedding-model-middleware.ts +3 -0
  427. package/src/types/embedding-model.ts +18 -0
  428. package/src/types/image-model-middleware.ts +3 -0
  429. package/src/types/image-model-response-metadata.ts +16 -0
  430. package/src/types/image-model.ts +19 -0
  431. package/src/types/index.ts +29 -0
  432. package/src/types/json-value.ts +15 -0
  433. package/src/types/language-model-middleware.ts +3 -0
  434. package/src/types/language-model-request-metadata.ts +6 -0
  435. package/src/types/language-model-response-metadata.ts +21 -0
  436. package/src/types/language-model.ts +104 -0
  437. package/src/types/provider-metadata.ts +16 -0
  438. package/src/types/provider.ts +55 -0
  439. package/src/types/reranking-model.ts +6 -0
  440. package/src/types/speech-model-response-metadata.ts +21 -0
  441. package/src/types/speech-model.ts +6 -0
  442. package/src/types/transcription-model-response-metadata.ts +16 -0
  443. package/src/types/transcription-model.ts +9 -0
  444. package/src/types/usage.ts +200 -0
  445. package/src/types/video-model-response-metadata.ts +28 -0
  446. package/src/types/video-model.ts +11 -0
  447. package/src/types/warning.ts +7 -0
  448. package/src/ui/call-completion-api.ts +157 -0
  449. package/src/ui/chat-transport.ts +83 -0
  450. package/src/ui/chat.ts +751 -0
  451. package/src/ui/convert-file-list-to-file-ui-parts.ts +36 -0
  452. package/src/ui/convert-to-model-messages.ts +376 -0
  453. package/src/ui/default-chat-transport.ts +36 -0
  454. package/src/ui/direct-chat-transport.ts +118 -0
  455. package/src/ui/http-chat-transport.ts +284 -0
  456. package/src/ui/index.ts +71 -0
  457. package/src/ui/last-assistant-message-is-complete-with-approval-responses.ts +44 -0
  458. package/src/ui/last-assistant-message-is-complete-with-tool-calls.ts +39 -0
  459. package/src/ui/process-text-stream.ts +16 -0
  460. package/src/ui/process-ui-message-stream.ts +793 -0
  461. package/src/ui/text-stream-chat-transport.ts +23 -0
  462. package/src/ui/transform-text-to-ui-message-stream.ts +27 -0
  463. package/src/ui/ui-messages.ts +536 -0
  464. package/src/ui/use-completion.ts +84 -0
  465. package/src/ui/validate-ui-messages.ts +506 -0
  466. package/src/ui-message-stream/create-ui-message-stream-response.ts +44 -0
  467. package/src/ui-message-stream/create-ui-message-stream.ts +145 -0
  468. package/src/ui-message-stream/get-response-ui-message-id.ts +35 -0
  469. package/src/ui-message-stream/handle-ui-message-stream-finish.ts +170 -0
  470. package/src/ui-message-stream/index.ts +14 -0
  471. package/src/ui-message-stream/json-to-sse-transform-stream.ts +17 -0
  472. package/src/ui-message-stream/pipe-ui-message-stream-to-response.ts +51 -0
  473. package/src/ui-message-stream/read-ui-message-stream.ts +87 -0
  474. package/src/ui-message-stream/ui-message-chunks.ts +346 -0
  475. package/src/ui-message-stream/ui-message-stream-headers.ts +7 -0
  476. package/src/ui-message-stream/ui-message-stream-on-finish-callback.ts +32 -0
  477. package/src/ui-message-stream/ui-message-stream-on-step-finish-callback.ts +25 -0
  478. package/src/ui-message-stream/ui-message-stream-response-init.ts +14 -0
  479. package/src/ui-message-stream/ui-message-stream-writer.ts +24 -0
  480. package/src/util/as-array.ts +3 -0
  481. package/src/util/async-iterable-stream.ts +94 -0
  482. package/src/util/consume-stream.ts +31 -0
  483. package/src/util/cosine-similarity.ts +46 -0
  484. package/src/util/create-resolvable-promise.ts +30 -0
  485. package/src/util/create-stitchable-stream.ts +112 -0
  486. package/src/util/data-url.ts +17 -0
  487. package/src/util/deep-partial.ts +84 -0
  488. package/src/util/detect-media-type.ts +226 -0
  489. package/src/util/download/create-download.ts +13 -0
  490. package/src/util/download/download-function.ts +45 -0
  491. package/src/util/download/download.ts +69 -0
  492. package/src/util/error-handler.ts +1 -0
  493. package/src/util/fix-json.ts +401 -0
  494. package/src/util/get-potential-start-index.ts +39 -0
  495. package/src/util/index.ts +12 -0
  496. package/src/util/is-deep-equal-data.ts +48 -0
  497. package/src/util/is-non-empty-object.ts +5 -0
  498. package/src/util/job.ts +1 -0
  499. package/src/util/log-v2-compatibility-warning.ts +21 -0
  500. package/src/util/merge-abort-signals.ts +43 -0
  501. package/src/util/merge-objects.ts +79 -0
  502. package/src/util/notify.ts +22 -0
  503. package/src/util/now.ts +4 -0
  504. package/src/util/parse-partial-json.ts +30 -0
  505. package/src/util/prepare-headers.ts +14 -0
  506. package/src/util/prepare-retries.ts +47 -0
  507. package/src/util/retry-error.ts +41 -0
  508. package/src/util/retry-with-exponential-backoff.ts +154 -0
  509. package/src/util/serial-job-executor.ts +36 -0
  510. package/src/util/simulate-readable-stream.ts +39 -0
  511. package/src/util/split-array.ts +20 -0
  512. package/src/util/value-of.ts +65 -0
  513. package/src/util/write-to-server-response.ts +49 -0
  514. package/src/version.ts +5 -0
  515. package/test.d.ts +1 -0
@@ -0,0 +1,1535 @@
1
+ import {
2
+ LanguageModelV3,
3
+ LanguageModelV3Content,
4
+ LanguageModelV3ToolCall,
5
+ LanguageModelV3ToolChoice,
6
+ } from '@ai-sdk/provider';
7
+ import {
8
+ createIdGenerator,
9
+ getErrorMessage,
10
+ IdGenerator,
11
+ ProviderOptions,
12
+ SystemModelMessage,
13
+ ToolApprovalResponse,
14
+ withUserAgentSuffix,
15
+ } from '@ai-sdk/provider-utils';
16
+ import { Tracer } from '@opentelemetry/api';
17
+ import { NoOutputGeneratedError } from '../error';
18
+ import { notify } from '../util/notify';
19
+ import { logWarnings } from '../logger/log-warnings';
20
+ import { resolveLanguageModel } from '../model/resolve-model';
21
+ import { ModelMessage } from '../prompt';
22
+ import {
23
+ CallSettings,
24
+ getStepTimeoutMs,
25
+ getTotalTimeoutMs,
26
+ TimeoutConfiguration,
27
+ } from '../prompt/call-settings';
28
+ import { convertToLanguageModelPrompt } from '../prompt/convert-to-language-model-prompt';
29
+ import { createToolModelOutput } from '../prompt/create-tool-model-output';
30
+ import { prepareCallSettings } from '../prompt/prepare-call-settings';
31
+ import { prepareToolsAndToolChoice } from '../prompt/prepare-tools-and-tool-choice';
32
+ import { Prompt } from '../prompt/prompt';
33
+ import { standardizePrompt } from '../prompt/standardize-prompt';
34
+ import { wrapGatewayError } from '../prompt/wrap-gateway-error';
35
+ import { ToolCallNotFoundForApprovalError } from '../error/tool-call-not-found-for-approval-error';
36
+ import { assembleOperationName } from '../telemetry/assemble-operation-name';
37
+ import { getBaseTelemetryAttributes } from '../telemetry/get-base-telemetry-attributes';
38
+ import { getTracer } from '../telemetry/get-tracer';
39
+ import { recordSpan } from '../telemetry/record-span';
40
+ import { selectTelemetryAttributes } from '../telemetry/select-telemetry-attributes';
41
+ import { stringifyForTelemetry } from '../telemetry/stringify-for-telemetry';
42
+ import { getGlobalTelemetryIntegration } from '../telemetry/get-global-telemetry-integration';
43
+ import { TelemetrySettings } from '../telemetry/telemetry-settings';
44
+ import {
45
+ LanguageModel,
46
+ LanguageModelRequestMetadata,
47
+ ToolChoice,
48
+ } from '../types';
49
+ import {
50
+ addLanguageModelUsage,
51
+ asLanguageModelUsage,
52
+ LanguageModelUsage,
53
+ } from '../types/usage';
54
+ import { asArray } from '../util/as-array';
55
+ import { DownloadFunction } from '../util/download/download-function';
56
+ import { mergeObjects } from '../util/merge-objects';
57
+ import { prepareRetries } from '../util/prepare-retries';
58
+ import { VERSION } from '../version';
59
+ import type {
60
+ OnFinishEvent,
61
+ OnStartEvent,
62
+ OnStepFinishEvent,
63
+ OnStepStartEvent,
64
+ OnToolCallFinishEvent,
65
+ OnToolCallStartEvent,
66
+ } from './callback-events';
67
+ import { collectToolApprovals } from './collect-tool-approvals';
68
+ import { ContentPart } from './content-part';
69
+ import { executeToolCall } from './execute-tool-call';
70
+ import { extractReasoningContent } from './extract-reasoning-content';
71
+ import { extractTextContent } from './extract-text-content';
72
+ import { GenerateTextResult } from './generate-text-result';
73
+ import { DefaultGeneratedFile } from './generated-file';
74
+ import { isApprovalNeeded } from './is-approval-needed';
75
+ import { Output, text } from './output';
76
+ import { InferCompleteOutput } from './output-utils';
77
+ import { parseToolCall } from './parse-tool-call';
78
+ import { PrepareStepFunction } from './prepare-step';
79
+ import { ResponseMessage } from './response-message';
80
+ import { DefaultStepResult, StepResult } from './step-result';
81
+ import {
82
+ isStopConditionMet,
83
+ stepCountIs,
84
+ StopCondition,
85
+ } from './stop-condition';
86
+ import { toResponseMessages } from './to-response-messages';
87
+ import { ToolApprovalRequestOutput } from './tool-approval-request-output';
88
+ import { TypedToolCall } from './tool-call';
89
+ import { ToolCallRepairFunction } from './tool-call-repair-function';
90
+ import { TypedToolError } from './tool-error';
91
+ import { ToolOutput } from './tool-output';
92
+ import { TypedToolResult } from './tool-result';
93
+ import { ToolSet } from './tool-set';
94
+ import { mergeAbortSignals } from '../util/merge-abort-signals';
95
+
96
+ const originalGenerateId = createIdGenerator({
97
+ prefix: 'aitxt',
98
+ size: 24,
99
+ });
100
+
101
+ /**
102
+ * Include settings for generateText (requestBody and responseBody).
103
+ */
104
+ type GenerateTextIncludeSettings = {
105
+ requestBody?: boolean;
106
+ responseBody?: boolean;
107
+ };
108
+
109
+ /**
110
+ * Callback that is set using the `experimental_onStart` option.
111
+ *
112
+ * Called when the generateText operation begins, before any LLM calls.
113
+ * Use this callback for logging, analytics, or initializing state at the
114
+ * start of a generation.
115
+ *
116
+ * @param event - The event object containing generation configuration.
117
+ */
118
+ export type GenerateTextOnStartCallback<
119
+ TOOLS extends ToolSet = ToolSet,
120
+ OUTPUT extends Output = Output,
121
+ > = (
122
+ event: OnStartEvent<TOOLS, OUTPUT, GenerateTextIncludeSettings>,
123
+ ) => PromiseLike<void> | void;
124
+
125
+ /**
126
+ * Callback that is set using the `experimental_onStepStart` option.
127
+ *
128
+ * Called when a step (LLM call) begins, before the provider is called.
129
+ * Each step represents a single LLM invocation. Multiple steps occur when
130
+ * using tool calls (the model may be called multiple times in a loop).
131
+ *
132
+ * @param event - The event object containing step configuration.
133
+ */
134
+ export type GenerateTextOnStepStartCallback<
135
+ TOOLS extends ToolSet = ToolSet,
136
+ OUTPUT extends Output = Output,
137
+ > = (
138
+ event: OnStepStartEvent<TOOLS, OUTPUT, GenerateTextIncludeSettings>,
139
+ ) => PromiseLike<void> | void;
140
+
141
+ /**
142
+ * Callback that is set using the `experimental_onToolCallStart` option.
143
+ *
144
+ * Called when a tool execution begins, before the tool's `execute` function is invoked.
145
+ * Use this for logging tool invocations, tracking tool usage, or pre-execution validation.
146
+ *
147
+ * @param event - The event object containing tool call information.
148
+ */
149
+ export type GenerateTextOnToolCallStartCallback<
150
+ TOOLS extends ToolSet = ToolSet,
151
+ > = (event: OnToolCallStartEvent<TOOLS>) => PromiseLike<void> | void;
152
+
153
+ /**
154
+ * Callback that is set using the `experimental_onToolCallFinish` option.
155
+ *
156
+ * Called when a tool execution completes, either successfully or with an error.
157
+ * Use this for logging tool results, tracking execution time, or error handling.
158
+ *
159
+ * The event uses a discriminated union on the `success` field:
160
+ * - When `success: true`: `output` contains the tool result, `error` is never present.
161
+ * - When `success: false`: `error` contains the error, `output` is never present.
162
+ *
163
+ * @param event - The event object containing tool call result information.
164
+ */
165
+ export type GenerateTextOnToolCallFinishCallback<
166
+ TOOLS extends ToolSet = ToolSet,
167
+ > = (event: OnToolCallFinishEvent<TOOLS>) => PromiseLike<void> | void;
168
+
169
+ /**
170
+ * Callback that is set using the `onStepFinish` option.
171
+ *
172
+ * Called when a step (LLM call) completes. The event includes all step result
173
+ * properties (text, tool calls, usage, etc.) along with additional metadata.
174
+ *
175
+ * @param stepResult - The result of the step.
176
+ */
177
+ export type GenerateTextOnStepFinishCallback<TOOLS extends ToolSet> = (
178
+ event: OnStepFinishEvent<TOOLS>,
179
+ ) => Promise<void> | void;
180
+
181
+ /**
182
+ * Callback that is set using the `onFinish` option.
183
+ *
184
+ * Called when the entire generation completes (all steps finished).
185
+ * The event includes the final step's result properties along with
186
+ * aggregated data from all steps.
187
+ *
188
+ * @param event - The final result along with aggregated step data.
189
+ */
190
+ export type GenerateTextOnFinishCallback<TOOLS extends ToolSet> = (
191
+ event: OnFinishEvent<TOOLS>,
192
+ ) => PromiseLike<void> | void;
193
+
194
+ /**
195
+ * Generate a text and call tools for a given prompt using a language model.
196
+ *
197
+ * This function does not stream the output. If you want to stream the output, use `streamText` instead.
198
+ *
199
+ * @param model - The language model to use.
200
+ *
201
+ * @param tools - Tools that are accessible to and can be called by the model. The model needs to support calling tools.
202
+ * @param toolChoice - The tool choice strategy. Default: 'auto'.
203
+ *
204
+ * @param system - A system message that will be part of the prompt.
205
+ * @param prompt - A simple text prompt. You can either use `prompt` or `messages` but not both.
206
+ * @param messages - A list of messages. You can either use `prompt` or `messages` but not both.
207
+ *
208
+ * @param maxOutputTokens - Maximum number of tokens to generate.
209
+ * @param temperature - Temperature setting.
210
+ * The value is passed through to the provider. The range depends on the provider and model.
211
+ * It is recommended to set either `temperature` or `topP`, but not both.
212
+ * @param topP - Nucleus sampling.
213
+ * The value is passed through to the provider. The range depends on the provider and model.
214
+ * It is recommended to set either `temperature` or `topP`, but not both.
215
+ * @param topK - Only sample from the top K options for each subsequent token.
216
+ * Used to remove "long tail" low probability responses.
217
+ * Recommended for advanced use cases only. You usually only need to use temperature.
218
+ * @param presencePenalty - Presence penalty setting.
219
+ * It affects the likelihood of the model to repeat information that is already in the prompt.
220
+ * The value is passed through to the provider. The range depends on the provider and model.
221
+ * @param frequencyPenalty - Frequency penalty setting.
222
+ * It affects the likelihood of the model to repeatedly use the same words or phrases.
223
+ * The value is passed through to the provider. The range depends on the provider and model.
224
+ * @param stopSequences - Stop sequences.
225
+ * If set, the model will stop generating text when one of the stop sequences is generated.
226
+ * @param seed - The seed (integer) to use for random sampling.
227
+ * If set and supported by the model, calls will generate deterministic results.
228
+ *
229
+ * @param maxRetries - Maximum number of retries. Set to 0 to disable retries. Default: 2.
230
+ * @param abortSignal - An optional abort signal that can be used to cancel the call.
231
+ * @param timeout - An optional timeout in milliseconds. The call will be aborted if it takes longer than the specified timeout.
232
+ * @param headers - Additional HTTP headers to be sent with the request. Only applicable for HTTP-based providers.
233
+ *
234
+ * @param experimental_context - User-defined context object that flows through the entire generation lifecycle.
235
+ * @param experimental_onStart - Callback invoked when generation begins, before any LLM calls.
236
+ * @param experimental_onStepStart - Callback invoked when each step begins, before the provider is called.
237
+ * Receives step number, messages (in ModelMessage format), tools, and context.
238
+ * @param experimental_onToolCallStart - Callback invoked before each tool execution begins.
239
+ * Receives tool name, call ID, input, and context.
240
+ * @param experimental_onToolCallFinish - Callback invoked after each tool execution completes.
241
+ * Uses a discriminated union: check `success` to determine if `output` or `error` is present.
242
+ * @param onStepFinish - Callback that is called when each step (LLM call) is finished, including intermediate steps.
243
+ * @param onFinish - Callback that is called when all steps are finished and the response is complete.
244
+ *
245
+ * @returns
246
+ * A result object that contains the generated text, the results of the tool calls, and additional information.
247
+ */
248
+ export async function generateText<
249
+ TOOLS extends ToolSet,
250
+ OUTPUT extends Output = Output<string, string>,
251
+ >({
252
+ model: modelArg,
253
+ tools,
254
+ toolChoice,
255
+ system,
256
+ prompt,
257
+ messages,
258
+ maxRetries: maxRetriesArg,
259
+ abortSignal,
260
+ timeout,
261
+ headers,
262
+ stopWhen = stepCountIs(1),
263
+ experimental_output,
264
+ output = experimental_output,
265
+ experimental_telemetry: telemetry,
266
+ providerOptions,
267
+ experimental_activeTools,
268
+ activeTools = experimental_activeTools,
269
+ experimental_prepareStep,
270
+ prepareStep = experimental_prepareStep,
271
+ experimental_repairToolCall: repairToolCall,
272
+ experimental_download: download,
273
+ experimental_context,
274
+ experimental_include: include,
275
+ _internal: { generateId = originalGenerateId } = {},
276
+ experimental_onStart: onStart,
277
+ experimental_onStepStart: onStepStart,
278
+ experimental_onToolCallStart: onToolCallStart,
279
+ experimental_onToolCallFinish: onToolCallFinish,
280
+ onStepFinish,
281
+ onFinish,
282
+ ...settings
283
+ }: CallSettings &
284
+ Prompt & {
285
+ /**
286
+ * The language model to use.
287
+ */
288
+ model: LanguageModel;
289
+
290
+ /**
291
+ * The tools that the model can call. The model needs to support calling tools.
292
+ */
293
+ tools?: TOOLS;
294
+
295
+ /**
296
+ * The tool choice strategy. Default: 'auto'.
297
+ */
298
+ toolChoice?: ToolChoice<NoInfer<TOOLS>>;
299
+
300
+ /**
301
+ * Condition for stopping the generation when there are tool results in the last step.
302
+ * When the condition is an array, any of the conditions can be met to stop the generation.
303
+ *
304
+ * @default stepCountIs(1)
305
+ */
306
+ stopWhen?:
307
+ | StopCondition<NoInfer<TOOLS>>
308
+ | Array<StopCondition<NoInfer<TOOLS>>>;
309
+
310
+ /**
311
+ * Optional telemetry configuration (experimental).
312
+ */
313
+ experimental_telemetry?: TelemetrySettings;
314
+
315
+ /**
316
+ * Additional provider-specific options. They are passed through
317
+ * to the provider from the AI SDK and enable provider-specific
318
+ * functionality that can be fully encapsulated in the provider.
319
+ */
320
+ providerOptions?: ProviderOptions;
321
+
322
+ /**
323
+ * @deprecated Use `activeTools` instead.
324
+ */
325
+ experimental_activeTools?: Array<keyof NoInfer<TOOLS>>;
326
+
327
+ /**
328
+ * Limits the tools that are available for the model to call without
329
+ * changing the tool call and result types in the result.
330
+ */
331
+ activeTools?: Array<keyof NoInfer<TOOLS>>;
332
+
333
+ /**
334
+ * Optional specification for parsing structured outputs from the LLM response.
335
+ */
336
+ output?: OUTPUT;
337
+
338
+ /**
339
+ * Optional specification for parsing structured outputs from the LLM response.
340
+ *
341
+ * @deprecated Use `output` instead.
342
+ */
343
+ experimental_output?: OUTPUT;
344
+
345
+ /**
346
+ * Custom download function to use for URLs.
347
+ *
348
+ * By default, files are downloaded if the model does not support the URL for the given media type.
349
+ */
350
+ experimental_download?: DownloadFunction | undefined;
351
+
352
+ /**
353
+ * @deprecated Use `prepareStep` instead.
354
+ */
355
+ experimental_prepareStep?: PrepareStepFunction<NoInfer<TOOLS>>;
356
+
357
+ /**
358
+ * Optional function that you can use to provide different settings for a step.
359
+ */
360
+ prepareStep?: PrepareStepFunction<NoInfer<TOOLS>>;
361
+
362
+ /**
363
+ * A function that attempts to repair a tool call that failed to parse.
364
+ */
365
+ experimental_repairToolCall?: ToolCallRepairFunction<NoInfer<TOOLS>>;
366
+
367
+ /**
368
+ * Callback that is called when the generateText operation begins,
369
+ * before any LLM calls are made.
370
+ */
371
+ experimental_onStart?: GenerateTextOnStartCallback<NoInfer<TOOLS>, OUTPUT>;
372
+
373
+ /**
374
+ * Callback that is called when a step (LLM call) begins,
375
+ * before the provider is called.
376
+ */
377
+ experimental_onStepStart?: GenerateTextOnStepStartCallback<
378
+ NoInfer<TOOLS>,
379
+ OUTPUT
380
+ >;
381
+
382
+ /**
383
+ * Callback that is called right before a tool's execute function runs.
384
+ */
385
+ experimental_onToolCallStart?: GenerateTextOnToolCallStartCallback<
386
+ NoInfer<TOOLS>
387
+ >;
388
+
389
+ /**
390
+ * Callback that is called right after a tool's execute function completes (or errors).
391
+ */
392
+ experimental_onToolCallFinish?: GenerateTextOnToolCallFinishCallback<
393
+ NoInfer<TOOLS>
394
+ >;
395
+
396
+ /**
397
+ * Callback that is called when each step (LLM call) is finished, including intermediate steps.
398
+ */
399
+ onStepFinish?: GenerateTextOnStepFinishCallback<NoInfer<TOOLS>>;
400
+
401
+ /**
402
+ * Callback that is called when all steps are finished and the response is complete.
403
+ */
404
+ onFinish?: GenerateTextOnFinishCallback<NoInfer<TOOLS>>;
405
+
406
+ /**
407
+ * Context that is passed into tool execution.
408
+ *
409
+ * Experimental (can break in patch releases).
410
+ *
411
+ * @default undefined
412
+ */
413
+ experimental_context?: unknown;
414
+
415
+ /**
416
+ * Settings for controlling what data is included in step results.
417
+ * Disabling inclusion can help reduce memory usage when processing
418
+ * large payloads like images.
419
+ *
420
+ * By default, all data is included for backwards compatibility.
421
+ */
422
+ experimental_include?: {
423
+ /**
424
+ * Whether to retain the request body in step results.
425
+ * The request body can be large when sending images or files.
426
+ * @default true
427
+ */
428
+ requestBody?: boolean;
429
+
430
+ /**
431
+ * Whether to retain the response body in step results.
432
+ * @default true
433
+ */
434
+ responseBody?: boolean;
435
+ };
436
+
437
+ /**
438
+ * Internal. For test use only. May change without notice.
439
+ */
440
+ _internal?: {
441
+ generateId?: IdGenerator;
442
+ };
443
+ }): Promise<GenerateTextResult<TOOLS, OUTPUT>> {
444
+ const model = resolveLanguageModel(modelArg);
445
+ const createGlobalTelemetry = getGlobalTelemetryIntegration<TOOLS, OUTPUT>();
446
+ const stopConditions = asArray(stopWhen);
447
+
448
+ const totalTimeoutMs = getTotalTimeoutMs(timeout);
449
+ const stepTimeoutMs = getStepTimeoutMs(timeout);
450
+ const stepAbortController =
451
+ stepTimeoutMs != null ? new AbortController() : undefined;
452
+ const mergedAbortSignal = mergeAbortSignals(
453
+ abortSignal,
454
+ totalTimeoutMs != null ? AbortSignal.timeout(totalTimeoutMs) : undefined,
455
+ stepAbortController?.signal,
456
+ );
457
+
458
+ const { maxRetries, retry } = prepareRetries({
459
+ maxRetries: maxRetriesArg,
460
+ abortSignal: mergedAbortSignal,
461
+ });
462
+
463
+ const callSettings = prepareCallSettings(settings);
464
+
465
+ const headersWithUserAgent = withUserAgentSuffix(
466
+ headers ?? {},
467
+ `ai/${VERSION}`,
468
+ );
469
+
470
+ const baseTelemetryAttributes = getBaseTelemetryAttributes({
471
+ model,
472
+ telemetry,
473
+ headers: headersWithUserAgent,
474
+ settings: { ...callSettings, maxRetries },
475
+ });
476
+
477
+ const modelInfo = { provider: model.provider, modelId: model.modelId };
478
+
479
+ const initialPrompt = await standardizePrompt({
480
+ system,
481
+ prompt,
482
+ messages,
483
+ } as Prompt);
484
+
485
+ const globalTelemetry = createGlobalTelemetry(telemetry?.integrations);
486
+
487
+ await notify({
488
+ event: {
489
+ model: modelInfo,
490
+ system,
491
+ prompt,
492
+ messages,
493
+ tools,
494
+ toolChoice,
495
+ activeTools,
496
+ maxOutputTokens: callSettings.maxOutputTokens,
497
+ temperature: callSettings.temperature,
498
+ topP: callSettings.topP,
499
+ topK: callSettings.topK,
500
+ presencePenalty: callSettings.presencePenalty,
501
+ frequencyPenalty: callSettings.frequencyPenalty,
502
+ stopSequences: callSettings.stopSequences,
503
+ seed: callSettings.seed,
504
+ maxRetries,
505
+ timeout,
506
+ headers,
507
+ providerOptions,
508
+ stopWhen,
509
+ output,
510
+ abortSignal,
511
+ include,
512
+ functionId: telemetry?.functionId,
513
+ metadata: telemetry?.metadata as Record<string, unknown> | undefined,
514
+ experimental_context,
515
+ },
516
+ callbacks: [
517
+ onStart,
518
+ globalTelemetry.onStart as
519
+ | undefined
520
+ | GenerateTextOnStartCallback<TOOLS, OUTPUT>,
521
+ ],
522
+ });
523
+
524
+ const tracer = getTracer(telemetry);
525
+
526
+ try {
527
+ return await recordSpan({
528
+ name: 'ai.generateText',
529
+ attributes: selectTelemetryAttributes({
530
+ telemetry,
531
+ attributes: {
532
+ ...assembleOperationName({
533
+ operationId: 'ai.generateText',
534
+ telemetry,
535
+ }),
536
+ ...baseTelemetryAttributes,
537
+ // model:
538
+ 'ai.model.provider': model.provider,
539
+ 'ai.model.id': model.modelId,
540
+ // specific settings that only make sense on the outer level:
541
+ 'ai.prompt': {
542
+ input: () => JSON.stringify({ system, prompt, messages }),
543
+ },
544
+ },
545
+ }),
546
+ tracer,
547
+ fn: async span => {
548
+ const initialMessages = initialPrompt.messages;
549
+ const responseMessages: Array<ResponseMessage> = [];
550
+
551
+ const { approvedToolApprovals, deniedToolApprovals } =
552
+ collectToolApprovals<TOOLS>({ messages: initialMessages });
553
+
554
+ const localApprovedToolApprovals = approvedToolApprovals.filter(
555
+ toolApproval => !toolApproval.toolCall.providerExecuted,
556
+ );
557
+
558
+ if (
559
+ deniedToolApprovals.length > 0 ||
560
+ localApprovedToolApprovals.length > 0
561
+ ) {
562
+ const toolOutputs = await executeTools({
563
+ toolCalls: localApprovedToolApprovals.map(
564
+ toolApproval => toolApproval.toolCall,
565
+ ),
566
+ tools: tools as TOOLS,
567
+ tracer,
568
+ telemetry,
569
+ messages: initialMessages,
570
+ abortSignal: mergedAbortSignal,
571
+ experimental_context,
572
+ stepNumber: 0,
573
+ model: modelInfo,
574
+ onToolCallStart: [
575
+ onToolCallStart,
576
+ globalTelemetry.onToolCallStart as
577
+ | undefined
578
+ | GenerateTextOnToolCallStartCallback<TOOLS>,
579
+ ],
580
+ onToolCallFinish: [
581
+ onToolCallFinish,
582
+ globalTelemetry.onToolCallFinish as
583
+ | undefined
584
+ | GenerateTextOnToolCallFinishCallback<TOOLS>,
585
+ ],
586
+ });
587
+
588
+ const toolContent: Array<any> = [];
589
+
590
+ // add regular tool results for approved tool calls:
591
+ for (const output of toolOutputs) {
592
+ const modelOutput = await createToolModelOutput({
593
+ toolCallId: output.toolCallId,
594
+ input: output.input,
595
+ tool: tools?.[output.toolName],
596
+ output:
597
+ output.type === 'tool-result' ? output.output : output.error,
598
+ errorMode: output.type === 'tool-error' ? 'text' : 'none',
599
+ });
600
+
601
+ toolContent.push({
602
+ type: 'tool-result' as const,
603
+ toolCallId: output.toolCallId,
604
+ toolName: output.toolName,
605
+ output: modelOutput,
606
+ });
607
+ }
608
+
609
+ // add execution denied tool results for all denied tool approvals:
610
+ for (const toolApproval of deniedToolApprovals) {
611
+ toolContent.push({
612
+ type: 'tool-result' as const,
613
+ toolCallId: toolApproval.toolCall.toolCallId,
614
+ toolName: toolApproval.toolCall.toolName,
615
+ output: {
616
+ type: 'execution-denied' as const,
617
+ reason: toolApproval.approvalResponse.reason,
618
+ // For provider-executed tools, include approvalId so provider can correlate
619
+ ...(toolApproval.toolCall.providerExecuted && {
620
+ providerOptions: {
621
+ openai: {
622
+ approvalId: toolApproval.approvalResponse.approvalId,
623
+ },
624
+ },
625
+ }),
626
+ },
627
+ });
628
+ }
629
+
630
+ responseMessages.push({
631
+ role: 'tool',
632
+ content: toolContent,
633
+ });
634
+ }
635
+
636
+ // Forward provider-executed approval responses to the provider
637
+ const providerExecutedToolApprovals = [
638
+ ...approvedToolApprovals,
639
+ ...deniedToolApprovals,
640
+ ].filter(toolApproval => toolApproval.toolCall.providerExecuted);
641
+
642
+ if (providerExecutedToolApprovals.length > 0) {
643
+ responseMessages.push({
644
+ role: 'tool',
645
+ content: providerExecutedToolApprovals.map(
646
+ toolApproval =>
647
+ ({
648
+ type: 'tool-approval-response',
649
+ approvalId: toolApproval.approvalResponse.approvalId,
650
+ approved: toolApproval.approvalResponse.approved,
651
+ reason: toolApproval.approvalResponse.reason,
652
+ providerExecuted: true,
653
+ }) satisfies ToolApprovalResponse,
654
+ ),
655
+ });
656
+ }
657
+
658
+ const callSettings = prepareCallSettings(settings);
659
+
660
+ let currentModelResponse: Awaited<
661
+ ReturnType<LanguageModelV3['doGenerate']>
662
+ > & { response: { id: string; timestamp: Date; modelId: string } };
663
+ let clientToolCalls: Array<TypedToolCall<TOOLS>> = [];
664
+ let clientToolOutputs: Array<ToolOutput<TOOLS>> = [];
665
+ const steps: GenerateTextResult<TOOLS, OUTPUT>['steps'] = [];
666
+
667
+ // Track provider-executed tool calls that support deferred results
668
+ // (e.g., code_execution in programmatic tool calling scenarios).
669
+ // These tools may not return their results in the same turn as their call.
670
+ const pendingDeferredToolCalls = new Map<
671
+ string,
672
+ { toolName: string }
673
+ >();
674
+
675
+ do {
676
+ // Set up step timeout if configured
677
+ const stepTimeoutId =
678
+ stepTimeoutMs != null
679
+ ? setTimeout(() => stepAbortController!.abort(), stepTimeoutMs)
680
+ : undefined;
681
+
682
+ try {
683
+ const stepInputMessages = [...initialMessages, ...responseMessages];
684
+
685
+ const prepareStepResult = await prepareStep?.({
686
+ model,
687
+ steps,
688
+ stepNumber: steps.length,
689
+ messages: stepInputMessages,
690
+ experimental_context,
691
+ });
692
+
693
+ const stepModel = resolveLanguageModel(
694
+ prepareStepResult?.model ?? model,
695
+ );
696
+ const stepModelInfo = {
697
+ provider: stepModel.provider,
698
+ modelId: stepModel.modelId,
699
+ };
700
+
701
+ const promptMessages = await convertToLanguageModelPrompt({
702
+ prompt: {
703
+ system: prepareStepResult?.system ?? initialPrompt.system,
704
+ messages: prepareStepResult?.messages ?? stepInputMessages,
705
+ },
706
+ supportedUrls: await stepModel.supportedUrls,
707
+ download,
708
+ });
709
+
710
+ experimental_context =
711
+ prepareStepResult?.experimental_context ?? experimental_context;
712
+
713
+ const stepActiveTools =
714
+ prepareStepResult?.activeTools ?? activeTools;
715
+
716
+ const { toolChoice: stepToolChoice, tools: stepTools } =
717
+ await prepareToolsAndToolChoice({
718
+ tools,
719
+ toolChoice: prepareStepResult?.toolChoice ?? toolChoice,
720
+ activeTools: stepActiveTools,
721
+ });
722
+
723
+ const stepMessages =
724
+ prepareStepResult?.messages ?? stepInputMessages;
725
+
726
+ const stepSystem =
727
+ prepareStepResult?.system ?? initialPrompt.system;
728
+
729
+ const stepProviderOptions = mergeObjects(
730
+ providerOptions,
731
+ prepareStepResult?.providerOptions,
732
+ );
733
+
734
+ await notify({
735
+ event: {
736
+ stepNumber: steps.length,
737
+ model: stepModelInfo,
738
+ system: stepSystem,
739
+ messages: stepMessages,
740
+ tools,
741
+ toolChoice: stepToolChoice,
742
+ activeTools: stepActiveTools,
743
+ steps: [...steps],
744
+ providerOptions: stepProviderOptions,
745
+ timeout,
746
+ headers,
747
+ stopWhen,
748
+ output,
749
+ abortSignal,
750
+ include,
751
+ functionId: telemetry?.functionId,
752
+ metadata: telemetry?.metadata as
753
+ | Record<string, unknown>
754
+ | undefined,
755
+ experimental_context,
756
+ },
757
+ callbacks: [
758
+ onStepStart,
759
+ globalTelemetry.onStepStart as
760
+ | undefined
761
+ | GenerateTextOnStepStartCallback<TOOLS, OUTPUT>,
762
+ ],
763
+ });
764
+
765
+ currentModelResponse = await retry(() =>
766
+ recordSpan({
767
+ name: 'ai.generateText.doGenerate',
768
+ attributes: selectTelemetryAttributes({
769
+ telemetry,
770
+ attributes: {
771
+ ...assembleOperationName({
772
+ operationId: 'ai.generateText.doGenerate',
773
+ telemetry,
774
+ }),
775
+ ...baseTelemetryAttributes,
776
+ // model:
777
+ 'ai.model.provider': stepModel.provider,
778
+ 'ai.model.id': stepModel.modelId,
779
+ // prompt:
780
+ 'ai.prompt.messages': {
781
+ input: () => stringifyForTelemetry(promptMessages),
782
+ },
783
+ 'ai.prompt.tools': {
784
+ // convert the language model level tools:
785
+ input: () => stepTools?.map(tool => JSON.stringify(tool)),
786
+ },
787
+ 'ai.prompt.toolChoice': {
788
+ input: () =>
789
+ stepToolChoice != null
790
+ ? JSON.stringify(stepToolChoice)
791
+ : undefined,
792
+ },
793
+
794
+ // standardized gen-ai llm span attributes:
795
+ 'gen_ai.system': stepModel.provider,
796
+ 'gen_ai.request.model': stepModel.modelId,
797
+ 'gen_ai.request.frequency_penalty':
798
+ settings.frequencyPenalty,
799
+ 'gen_ai.request.max_tokens': settings.maxOutputTokens,
800
+ 'gen_ai.request.presence_penalty': settings.presencePenalty,
801
+ 'gen_ai.request.stop_sequences': settings.stopSequences,
802
+ 'gen_ai.request.temperature':
803
+ settings.temperature ?? undefined,
804
+ 'gen_ai.request.top_k': settings.topK,
805
+ 'gen_ai.request.top_p': settings.topP,
806
+ },
807
+ }),
808
+ tracer,
809
+ fn: async span => {
810
+ const result = await stepModel.doGenerate({
811
+ ...callSettings,
812
+ tools: stepTools,
813
+ toolChoice: stepToolChoice,
814
+ responseFormat: await output?.responseFormat,
815
+ prompt: promptMessages,
816
+ providerOptions: stepProviderOptions,
817
+ abortSignal: mergedAbortSignal,
818
+ headers: headersWithUserAgent,
819
+ });
820
+
821
+ // Fill in default values:
822
+ const responseData = {
823
+ id: result.response?.id ?? generateId(),
824
+ timestamp: result.response?.timestamp ?? new Date(),
825
+ modelId: result.response?.modelId ?? stepModel.modelId,
826
+ headers: result.response?.headers,
827
+ body: result.response?.body,
828
+ };
829
+
830
+ // Add response information to the span:
831
+ span.setAttributes(
832
+ await selectTelemetryAttributes({
833
+ telemetry,
834
+ attributes: {
835
+ 'ai.response.finishReason': result.finishReason.unified,
836
+ 'ai.response.text': {
837
+ output: () => extractTextContent(result.content),
838
+ },
839
+ 'ai.response.reasoning': {
840
+ output: () => extractReasoningContent(result.content),
841
+ },
842
+ 'ai.response.toolCalls': {
843
+ output: () => {
844
+ const toolCalls = asToolCalls(result.content);
845
+ return toolCalls == null
846
+ ? undefined
847
+ : JSON.stringify(toolCalls);
848
+ },
849
+ },
850
+ 'ai.response.id': responseData.id,
851
+ 'ai.response.model': responseData.modelId,
852
+ 'ai.response.timestamp':
853
+ responseData.timestamp.toISOString(),
854
+ 'ai.response.providerMetadata': JSON.stringify(
855
+ result.providerMetadata,
856
+ ),
857
+
858
+ // TODO rename telemetry attributes to inputTokens and outputTokens
859
+ 'ai.usage.promptTokens': result.usage.inputTokens.total,
860
+ 'ai.usage.completionTokens':
861
+ result.usage.outputTokens.total,
862
+
863
+ // standardized gen-ai llm span attributes:
864
+ 'gen_ai.response.finish_reasons': [
865
+ result.finishReason.unified,
866
+ ],
867
+ 'gen_ai.response.id': responseData.id,
868
+ 'gen_ai.response.model': responseData.modelId,
869
+ 'gen_ai.usage.input_tokens':
870
+ result.usage.inputTokens.total,
871
+ 'gen_ai.usage.output_tokens':
872
+ result.usage.outputTokens.total,
873
+ },
874
+ }),
875
+ );
876
+
877
+ return { ...result, response: responseData };
878
+ },
879
+ }),
880
+ );
881
+
882
+ // parse tool calls:
883
+ const stepToolCalls: TypedToolCall<TOOLS>[] = await Promise.all(
884
+ currentModelResponse.content
885
+ .filter(
886
+ (part): part is LanguageModelV3ToolCall =>
887
+ part.type === 'tool-call',
888
+ )
889
+ .map(toolCall =>
890
+ parseToolCall({
891
+ toolCall,
892
+ tools,
893
+ repairToolCall,
894
+ system,
895
+ messages: stepInputMessages,
896
+ }),
897
+ ),
898
+ );
899
+ const toolApprovalRequests: Record<
900
+ string,
901
+ ToolApprovalRequestOutput<TOOLS>
902
+ > = {};
903
+
904
+ // notify the tools that the tool calls are available:
905
+ for (const toolCall of stepToolCalls) {
906
+ if (toolCall.invalid) {
907
+ continue; // ignore invalid tool calls
908
+ }
909
+
910
+ const tool = tools?.[toolCall.toolName];
911
+
912
+ if (tool == null) {
913
+ // ignore tool calls for tools that are not available,
914
+ // e.g. provider-executed dynamic tools
915
+ continue;
916
+ }
917
+
918
+ if (tool?.onInputAvailable != null) {
919
+ await tool.onInputAvailable({
920
+ input: toolCall.input,
921
+ toolCallId: toolCall.toolCallId,
922
+ messages: stepInputMessages,
923
+ abortSignal: mergedAbortSignal,
924
+ experimental_context,
925
+ });
926
+ }
927
+
928
+ if (
929
+ await isApprovalNeeded({
930
+ tool,
931
+ toolCall,
932
+ messages: stepInputMessages,
933
+ experimental_context,
934
+ })
935
+ ) {
936
+ toolApprovalRequests[toolCall.toolCallId] = {
937
+ type: 'tool-approval-request',
938
+ approvalId: generateId(),
939
+ toolCall,
940
+ };
941
+ }
942
+ }
943
+
944
+ // insert error tool outputs for invalid tool calls:
945
+ // TODO AI SDK 6: invalid inputs should not require output parts
946
+ const invalidToolCalls = stepToolCalls.filter(
947
+ toolCall => toolCall.invalid && toolCall.dynamic,
948
+ );
949
+
950
+ clientToolOutputs = [];
951
+
952
+ for (const toolCall of invalidToolCalls) {
953
+ clientToolOutputs.push({
954
+ type: 'tool-error',
955
+ toolCallId: toolCall.toolCallId,
956
+ toolName: toolCall.toolName,
957
+ input: toolCall.input,
958
+ error: getErrorMessage(toolCall.error!),
959
+ dynamic: true,
960
+ });
961
+ }
962
+
963
+ // execute client tool calls:
964
+ clientToolCalls = stepToolCalls.filter(
965
+ toolCall => !toolCall.providerExecuted,
966
+ );
967
+
968
+ if (tools != null) {
969
+ clientToolOutputs.push(
970
+ ...(await executeTools({
971
+ toolCalls: clientToolCalls.filter(
972
+ toolCall =>
973
+ !toolCall.invalid &&
974
+ toolApprovalRequests[toolCall.toolCallId] == null,
975
+ ),
976
+ tools,
977
+ tracer,
978
+ telemetry,
979
+ messages: stepInputMessages,
980
+ abortSignal: mergedAbortSignal,
981
+ experimental_context,
982
+ stepNumber: steps.length,
983
+ model: stepModelInfo,
984
+ onToolCallStart: [
985
+ onToolCallStart,
986
+ globalTelemetry.onToolCallStart as
987
+ | undefined
988
+ | GenerateTextOnToolCallStartCallback<TOOLS>,
989
+ ],
990
+ onToolCallFinish: [
991
+ onToolCallFinish,
992
+ globalTelemetry.onToolCallFinish,
993
+ ],
994
+ })),
995
+ );
996
+ }
997
+
998
+ // Track provider-executed tool calls that support deferred results.
999
+ // In programmatic tool calling, a server tool (e.g., code_execution) may
1000
+ // trigger a client tool, and the server tool's result is deferred until
1001
+ // the client tool's result is sent back.
1002
+ for (const toolCall of stepToolCalls) {
1003
+ if (!toolCall.providerExecuted) continue;
1004
+ const tool = tools?.[toolCall.toolName];
1005
+ if (tool?.type === 'provider' && tool.supportsDeferredResults) {
1006
+ // Check if this tool call already has a result in the current response
1007
+ const hasResultInResponse = currentModelResponse.content.some(
1008
+ part =>
1009
+ part.type === 'tool-result' &&
1010
+ part.toolCallId === toolCall.toolCallId,
1011
+ );
1012
+ if (!hasResultInResponse) {
1013
+ pendingDeferredToolCalls.set(toolCall.toolCallId, {
1014
+ toolName: toolCall.toolName,
1015
+ });
1016
+ }
1017
+ }
1018
+ }
1019
+
1020
+ // Mark deferred tool calls as resolved when we receive their results
1021
+ for (const part of currentModelResponse.content) {
1022
+ if (part.type === 'tool-result') {
1023
+ pendingDeferredToolCalls.delete(part.toolCallId);
1024
+ }
1025
+ }
1026
+
1027
+ // content:
1028
+ const stepContent = asContent({
1029
+ content: currentModelResponse.content,
1030
+ toolCalls: stepToolCalls,
1031
+ toolOutputs: clientToolOutputs,
1032
+ toolApprovalRequests: Object.values(toolApprovalRequests),
1033
+ tools,
1034
+ });
1035
+
1036
+ // append to messages for potential next step:
1037
+ responseMessages.push(
1038
+ ...(await toResponseMessages({
1039
+ content: stepContent,
1040
+ tools,
1041
+ })),
1042
+ );
1043
+
1044
+ // Add step information (after response messages are updated):
1045
+ // Conditionally include request.body and response.body based on include settings.
1046
+ // Large payloads (e.g., base64-encoded images) can cause memory issues.
1047
+ const stepRequest: LanguageModelRequestMetadata =
1048
+ (include?.requestBody ?? true)
1049
+ ? (currentModelResponse.request ?? {})
1050
+ : { ...currentModelResponse.request, body: undefined };
1051
+
1052
+ const stepResponse = {
1053
+ ...currentModelResponse.response,
1054
+ // deep clone msgs to avoid mutating past messages in multi-step:
1055
+ messages: structuredClone(responseMessages),
1056
+ // Conditionally include response body:
1057
+ body:
1058
+ (include?.responseBody ?? true)
1059
+ ? currentModelResponse.response?.body
1060
+ : undefined,
1061
+ };
1062
+
1063
+ const stepNumber = steps.length;
1064
+
1065
+ const currentStepResult: StepResult<TOOLS> = new DefaultStepResult({
1066
+ stepNumber,
1067
+ model: stepModelInfo,
1068
+ functionId: telemetry?.functionId,
1069
+ metadata: telemetry?.metadata as
1070
+ | Record<string, unknown>
1071
+ | undefined,
1072
+ experimental_context,
1073
+ content: stepContent,
1074
+ finishReason: currentModelResponse.finishReason.unified,
1075
+ rawFinishReason: currentModelResponse.finishReason.raw,
1076
+ usage: asLanguageModelUsage(currentModelResponse.usage),
1077
+ warnings: currentModelResponse.warnings,
1078
+ providerMetadata: currentModelResponse.providerMetadata,
1079
+ request: stepRequest,
1080
+ response: stepResponse,
1081
+ });
1082
+
1083
+ logWarnings({
1084
+ warnings: currentModelResponse.warnings ?? [],
1085
+ provider: stepModelInfo.provider,
1086
+ model: stepModelInfo.modelId,
1087
+ });
1088
+
1089
+ steps.push(currentStepResult);
1090
+
1091
+ await notify({
1092
+ event: currentStepResult,
1093
+ callbacks: [onStepFinish, globalTelemetry.onStepFinish],
1094
+ });
1095
+ } finally {
1096
+ if (stepTimeoutId != null) {
1097
+ clearTimeout(stepTimeoutId);
1098
+ }
1099
+ }
1100
+ } while (
1101
+ // Continue if:
1102
+ // 1. There are client tool calls that have all been executed, OR
1103
+ // 2. There are pending deferred results from provider-executed tools
1104
+ ((clientToolCalls.length > 0 &&
1105
+ clientToolOutputs.length === clientToolCalls.length) ||
1106
+ pendingDeferredToolCalls.size > 0) &&
1107
+ // continue until a stop condition is met:
1108
+ !(await isStopConditionMet({ stopConditions, steps }))
1109
+ );
1110
+
1111
+ // Add response information to the span:
1112
+ span.setAttributes(
1113
+ await selectTelemetryAttributes({
1114
+ telemetry,
1115
+ attributes: {
1116
+ 'ai.response.finishReason':
1117
+ currentModelResponse.finishReason.unified,
1118
+ 'ai.response.text': {
1119
+ output: () => extractTextContent(currentModelResponse.content),
1120
+ },
1121
+ 'ai.response.reasoning': {
1122
+ output: () =>
1123
+ extractReasoningContent(currentModelResponse.content),
1124
+ },
1125
+ 'ai.response.toolCalls': {
1126
+ output: () => {
1127
+ const toolCalls = asToolCalls(currentModelResponse.content);
1128
+ return toolCalls == null
1129
+ ? undefined
1130
+ : JSON.stringify(toolCalls);
1131
+ },
1132
+ },
1133
+ 'ai.response.providerMetadata': JSON.stringify(
1134
+ currentModelResponse.providerMetadata,
1135
+ ),
1136
+
1137
+ // TODO rename telemetry attributes to inputTokens and outputTokens
1138
+ 'ai.usage.promptTokens':
1139
+ currentModelResponse.usage.inputTokens.total,
1140
+ 'ai.usage.completionTokens':
1141
+ currentModelResponse.usage.outputTokens.total,
1142
+ },
1143
+ }),
1144
+ );
1145
+
1146
+ const lastStep = steps[steps.length - 1];
1147
+
1148
+ const totalUsage = steps.reduce(
1149
+ (totalUsage, step) => {
1150
+ return addLanguageModelUsage(totalUsage, step.usage);
1151
+ },
1152
+ {
1153
+ inputTokens: undefined,
1154
+ outputTokens: undefined,
1155
+ totalTokens: undefined,
1156
+ reasoningTokens: undefined,
1157
+ cachedInputTokens: undefined,
1158
+ } as LanguageModelUsage,
1159
+ );
1160
+
1161
+ await notify({
1162
+ event: {
1163
+ stepNumber: lastStep.stepNumber,
1164
+ model: lastStep.model,
1165
+ functionId: lastStep.functionId,
1166
+ metadata: lastStep.metadata,
1167
+ experimental_context: lastStep.experimental_context,
1168
+ finishReason: lastStep.finishReason,
1169
+ rawFinishReason: lastStep.rawFinishReason,
1170
+ usage: lastStep.usage,
1171
+ content: lastStep.content,
1172
+ text: lastStep.text,
1173
+ reasoningText: lastStep.reasoningText,
1174
+ reasoning: lastStep.reasoning,
1175
+ files: lastStep.files,
1176
+ sources: lastStep.sources,
1177
+ toolCalls: lastStep.toolCalls,
1178
+ staticToolCalls: lastStep.staticToolCalls,
1179
+ dynamicToolCalls: lastStep.dynamicToolCalls,
1180
+ toolResults: lastStep.toolResults,
1181
+ staticToolResults: lastStep.staticToolResults,
1182
+ dynamicToolResults: lastStep.dynamicToolResults,
1183
+ request: lastStep.request,
1184
+ response: lastStep.response,
1185
+ warnings: lastStep.warnings,
1186
+ providerMetadata: lastStep.providerMetadata,
1187
+ steps,
1188
+ totalUsage,
1189
+ },
1190
+ callbacks: [
1191
+ onFinish,
1192
+ globalTelemetry.onFinish as
1193
+ | undefined
1194
+ | GenerateTextOnFinishCallback<TOOLS>,
1195
+ ],
1196
+ });
1197
+
1198
+ // parse output only if the last step was finished with "stop":
1199
+ let resolvedOutput;
1200
+ if (lastStep.finishReason === 'stop') {
1201
+ const outputSpecification = output ?? text();
1202
+ resolvedOutput = await outputSpecification.parseCompleteOutput(
1203
+ { text: lastStep.text },
1204
+ {
1205
+ response: lastStep.response,
1206
+ usage: lastStep.usage,
1207
+ finishReason: lastStep.finishReason,
1208
+ },
1209
+ );
1210
+ }
1211
+
1212
+ return new DefaultGenerateTextResult({
1213
+ steps,
1214
+ totalUsage,
1215
+ output: resolvedOutput,
1216
+ });
1217
+ },
1218
+ });
1219
+ } catch (error) {
1220
+ throw wrapGatewayError(error);
1221
+ }
1222
+ }
1223
+
1224
+ async function executeTools<TOOLS extends ToolSet>({
1225
+ toolCalls,
1226
+ tools,
1227
+ tracer,
1228
+ telemetry,
1229
+ messages,
1230
+ abortSignal,
1231
+ experimental_context,
1232
+ stepNumber,
1233
+ model,
1234
+ onToolCallStart,
1235
+ onToolCallFinish,
1236
+ }: {
1237
+ toolCalls: Array<TypedToolCall<TOOLS>>;
1238
+ tools: TOOLS;
1239
+ tracer: Tracer;
1240
+ telemetry: TelemetrySettings | undefined;
1241
+ messages: ModelMessage[];
1242
+ abortSignal: AbortSignal | undefined;
1243
+ experimental_context: unknown;
1244
+ stepNumber: number;
1245
+ model: { provider: string; modelId: string };
1246
+ onToolCallStart:
1247
+ | GenerateTextOnToolCallStartCallback<TOOLS>
1248
+ | Array<GenerateTextOnToolCallStartCallback<TOOLS> | undefined | null>
1249
+ | undefined;
1250
+ onToolCallFinish:
1251
+ | GenerateTextOnToolCallFinishCallback<TOOLS>
1252
+ | Array<GenerateTextOnToolCallFinishCallback<TOOLS> | undefined | null>
1253
+ | undefined;
1254
+ }): Promise<Array<ToolOutput<TOOLS>>> {
1255
+ const toolOutputs = await Promise.all(
1256
+ toolCalls.map(async toolCall =>
1257
+ executeToolCall({
1258
+ toolCall,
1259
+ tools,
1260
+ tracer,
1261
+ telemetry,
1262
+ messages,
1263
+ abortSignal,
1264
+ experimental_context,
1265
+ stepNumber,
1266
+ model,
1267
+ onToolCallStart,
1268
+ onToolCallFinish,
1269
+ }),
1270
+ ),
1271
+ );
1272
+
1273
+ return toolOutputs.filter(
1274
+ (output): output is NonNullable<typeof output> => output != null,
1275
+ );
1276
+ }
1277
+
1278
+ class DefaultGenerateTextResult<TOOLS extends ToolSet, OUTPUT extends Output>
1279
+ implements GenerateTextResult<TOOLS, OUTPUT>
1280
+ {
1281
+ readonly steps: GenerateTextResult<TOOLS, OUTPUT>['steps'];
1282
+ readonly totalUsage: LanguageModelUsage;
1283
+ private readonly _output: InferCompleteOutput<OUTPUT> | undefined;
1284
+
1285
+ constructor(options: {
1286
+ steps: GenerateTextResult<TOOLS, OUTPUT>['steps'];
1287
+ output: InferCompleteOutput<OUTPUT> | undefined;
1288
+ totalUsage: LanguageModelUsage;
1289
+ }) {
1290
+ this.steps = options.steps;
1291
+ this._output = options.output;
1292
+ this.totalUsage = options.totalUsage;
1293
+ }
1294
+
1295
+ private get finalStep() {
1296
+ return this.steps[this.steps.length - 1];
1297
+ }
1298
+
1299
+ get content() {
1300
+ return this.finalStep.content;
1301
+ }
1302
+
1303
+ get text() {
1304
+ return this.finalStep.text;
1305
+ }
1306
+
1307
+ get files() {
1308
+ return this.finalStep.files;
1309
+ }
1310
+
1311
+ get reasoningText() {
1312
+ return this.finalStep.reasoningText;
1313
+ }
1314
+
1315
+ get reasoning() {
1316
+ return this.finalStep.reasoning;
1317
+ }
1318
+
1319
+ get toolCalls() {
1320
+ return this.finalStep.toolCalls;
1321
+ }
1322
+
1323
+ get staticToolCalls() {
1324
+ return this.finalStep.staticToolCalls;
1325
+ }
1326
+
1327
+ get dynamicToolCalls() {
1328
+ return this.finalStep.dynamicToolCalls;
1329
+ }
1330
+
1331
+ get toolResults() {
1332
+ return this.finalStep.toolResults;
1333
+ }
1334
+
1335
+ get staticToolResults() {
1336
+ return this.finalStep.staticToolResults;
1337
+ }
1338
+
1339
+ get dynamicToolResults() {
1340
+ return this.finalStep.dynamicToolResults;
1341
+ }
1342
+
1343
+ get sources() {
1344
+ return this.finalStep.sources;
1345
+ }
1346
+
1347
+ get finishReason() {
1348
+ return this.finalStep.finishReason;
1349
+ }
1350
+
1351
+ get rawFinishReason() {
1352
+ return this.finalStep.rawFinishReason;
1353
+ }
1354
+
1355
+ get warnings() {
1356
+ return this.finalStep.warnings;
1357
+ }
1358
+
1359
+ get providerMetadata() {
1360
+ return this.finalStep.providerMetadata;
1361
+ }
1362
+
1363
+ get response() {
1364
+ return this.finalStep.response;
1365
+ }
1366
+
1367
+ get request() {
1368
+ return this.finalStep.request;
1369
+ }
1370
+
1371
+ get usage() {
1372
+ return this.finalStep.usage;
1373
+ }
1374
+
1375
+ get experimental_output() {
1376
+ return this.output;
1377
+ }
1378
+
1379
+ get output() {
1380
+ if (this._output == null) {
1381
+ throw new NoOutputGeneratedError();
1382
+ }
1383
+
1384
+ return this._output;
1385
+ }
1386
+ }
1387
+
1388
+ function asToolCalls(content: Array<LanguageModelV3Content>) {
1389
+ const parts = content.filter(
1390
+ (part): part is LanguageModelV3ToolCall => part.type === 'tool-call',
1391
+ );
1392
+
1393
+ if (parts.length === 0) {
1394
+ return undefined;
1395
+ }
1396
+
1397
+ return parts.map(toolCall => ({
1398
+ toolCallId: toolCall.toolCallId,
1399
+ toolName: toolCall.toolName,
1400
+ input: toolCall.input,
1401
+ }));
1402
+ }
1403
+
1404
+ function asContent<TOOLS extends ToolSet>({
1405
+ content,
1406
+ toolCalls,
1407
+ toolOutputs,
1408
+ toolApprovalRequests,
1409
+ tools,
1410
+ }: {
1411
+ content: Array<LanguageModelV3Content>;
1412
+ toolCalls: Array<TypedToolCall<TOOLS>>;
1413
+ toolOutputs: Array<ToolOutput<TOOLS>>;
1414
+ toolApprovalRequests: Array<ToolApprovalRequestOutput<TOOLS>>;
1415
+ tools: TOOLS | undefined;
1416
+ }): Array<ContentPart<TOOLS>> {
1417
+ const contentParts: Array<ContentPart<TOOLS>> = [];
1418
+
1419
+ for (const part of content) {
1420
+ switch (part.type) {
1421
+ case 'text':
1422
+ case 'reasoning':
1423
+ case 'source':
1424
+ contentParts.push(part);
1425
+ break;
1426
+
1427
+ case 'file': {
1428
+ contentParts.push({
1429
+ type: 'file' as const,
1430
+ file: new DefaultGeneratedFile(part),
1431
+ ...(part.providerMetadata != null
1432
+ ? { providerMetadata: part.providerMetadata }
1433
+ : {}),
1434
+ });
1435
+ break;
1436
+ }
1437
+
1438
+ case 'tool-call': {
1439
+ contentParts.push(
1440
+ toolCalls.find(toolCall => toolCall.toolCallId === part.toolCallId)!,
1441
+ );
1442
+ break;
1443
+ }
1444
+
1445
+ case 'tool-result': {
1446
+ const toolCall = toolCalls.find(
1447
+ toolCall => toolCall.toolCallId === part.toolCallId,
1448
+ );
1449
+
1450
+ // Handle deferred results for provider-executed tools (e.g., programmatic tool calling).
1451
+ // When a server tool (like code_execution) triggers a client tool, the server tool's
1452
+ // result may be deferred to a later turn. In this case, there's no matching tool-call
1453
+ // in the current response.
1454
+ if (toolCall == null) {
1455
+ const tool = tools?.[part.toolName];
1456
+ const supportsDeferredResults =
1457
+ tool?.type === 'provider' && tool.supportsDeferredResults;
1458
+
1459
+ if (!supportsDeferredResults) {
1460
+ throw new Error(`Tool call ${part.toolCallId} not found.`);
1461
+ }
1462
+
1463
+ // Create tool result without tool call input (deferred result)
1464
+ if (part.isError) {
1465
+ contentParts.push({
1466
+ type: 'tool-error' as const,
1467
+ toolCallId: part.toolCallId,
1468
+ toolName: part.toolName as keyof TOOLS & string,
1469
+ input: undefined,
1470
+ error: part.result,
1471
+ providerExecuted: true,
1472
+ dynamic: part.dynamic,
1473
+ } as TypedToolError<TOOLS>);
1474
+ } else {
1475
+ contentParts.push({
1476
+ type: 'tool-result' as const,
1477
+ toolCallId: part.toolCallId,
1478
+ toolName: part.toolName as keyof TOOLS & string,
1479
+ input: undefined,
1480
+ output: part.result,
1481
+ providerExecuted: true,
1482
+ dynamic: part.dynamic,
1483
+ } as TypedToolResult<TOOLS>);
1484
+ }
1485
+ break;
1486
+ }
1487
+
1488
+ if (part.isError) {
1489
+ contentParts.push({
1490
+ type: 'tool-error' as const,
1491
+ toolCallId: part.toolCallId,
1492
+ toolName: part.toolName as keyof TOOLS & string,
1493
+ input: toolCall.input,
1494
+ error: part.result,
1495
+ providerExecuted: true,
1496
+ dynamic: toolCall.dynamic,
1497
+ } as TypedToolError<TOOLS>);
1498
+ } else {
1499
+ contentParts.push({
1500
+ type: 'tool-result' as const,
1501
+ toolCallId: part.toolCallId,
1502
+ toolName: part.toolName as keyof TOOLS & string,
1503
+ input: toolCall.input,
1504
+ output: part.result,
1505
+ providerExecuted: true,
1506
+ dynamic: toolCall.dynamic,
1507
+ } as TypedToolResult<TOOLS>);
1508
+ }
1509
+ break;
1510
+ }
1511
+
1512
+ case 'tool-approval-request': {
1513
+ const toolCall = toolCalls.find(
1514
+ toolCall => toolCall.toolCallId === part.toolCallId,
1515
+ );
1516
+
1517
+ if (toolCall == null) {
1518
+ throw new ToolCallNotFoundForApprovalError({
1519
+ toolCallId: part.toolCallId,
1520
+ approvalId: part.approvalId,
1521
+ });
1522
+ }
1523
+
1524
+ contentParts.push({
1525
+ type: 'tool-approval-request' as const,
1526
+ approvalId: part.approvalId,
1527
+ toolCall,
1528
+ });
1529
+ break;
1530
+ }
1531
+ }
1532
+ }
1533
+
1534
+ return [...contentParts, ...toolOutputs, ...toolApprovalRequests];
1535
+ }