ai 6.0.33 → 6.0.35

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 (357) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/index.d.mts +50 -21
  3. package/dist/index.d.ts +50 -21
  4. package/dist/index.js +348 -286
  5. package/dist/index.js.map +1 -1
  6. package/dist/index.mjs +280 -219
  7. package/dist/index.mjs.map +1 -1
  8. package/dist/internal/index.js +1 -1
  9. package/dist/internal/index.mjs +1 -1
  10. package/docs/02-foundations/03-prompts.mdx +2 -2
  11. package/docs/03-ai-sdk-core/15-tools-and-tool-calling.mdx +1 -1
  12. package/docs/07-reference/01-ai-sdk-core/28-output.mdx +1 -1
  13. package/docs/07-reference/05-ai-sdk-errors/ai-ui-message-stream-error.mdx +67 -0
  14. package/package.json +6 -4
  15. package/src/agent/agent.ts +116 -0
  16. package/src/agent/create-agent-ui-stream-response.test.ts +258 -0
  17. package/src/agent/create-agent-ui-stream-response.ts +50 -0
  18. package/src/agent/create-agent-ui-stream.ts +73 -0
  19. package/src/agent/index.ts +33 -0
  20. package/src/agent/infer-agent-tools.ts +7 -0
  21. package/src/agent/infer-agent-ui-message.test-d.ts +54 -0
  22. package/src/agent/infer-agent-ui-message.ts +11 -0
  23. package/src/agent/pipe-agent-ui-stream-to-response.ts +52 -0
  24. package/src/agent/tool-loop-agent-on-finish-callback.ts +31 -0
  25. package/src/agent/tool-loop-agent-on-step-finish-callback.ts +11 -0
  26. package/src/agent/tool-loop-agent-settings.ts +182 -0
  27. package/src/agent/tool-loop-agent.test-d.ts +114 -0
  28. package/src/agent/tool-loop-agent.test.ts +442 -0
  29. package/src/agent/tool-loop-agent.ts +114 -0
  30. package/src/embed/__snapshots__/embed-many.test.ts.snap +191 -0
  31. package/src/embed/__snapshots__/embed.test.ts.snap +81 -0
  32. package/src/embed/embed-many-result.ts +53 -0
  33. package/src/embed/embed-many.test.ts +653 -0
  34. package/src/embed/embed-many.ts +378 -0
  35. package/src/embed/embed-result.ts +50 -0
  36. package/src/embed/embed.test.ts +298 -0
  37. package/src/embed/embed.ts +211 -0
  38. package/src/embed/index.ts +4 -0
  39. package/src/error/index.ts +35 -0
  40. package/src/error/invalid-argument-error.ts +34 -0
  41. package/src/error/invalid-stream-part-error.ts +28 -0
  42. package/src/error/invalid-tool-approval-error.ts +26 -0
  43. package/src/error/invalid-tool-input-error.ts +33 -0
  44. package/src/error/no-image-generated-error.ts +39 -0
  45. package/src/error/no-object-generated-error.ts +70 -0
  46. package/src/error/no-output-generated-error.ts +26 -0
  47. package/src/error/no-speech-generated-error.ts +18 -0
  48. package/src/error/no-such-tool-error.ts +35 -0
  49. package/src/error/no-transcript-generated-error.ts +20 -0
  50. package/src/error/tool-call-not-found-for-approval-error.ts +32 -0
  51. package/src/error/tool-call-repair-error.ts +30 -0
  52. package/src/error/ui-message-stream-error.ts +48 -0
  53. package/src/error/unsupported-model-version-error.ts +23 -0
  54. package/src/error/verify-no-object-generated-error.ts +27 -0
  55. package/src/generate-image/generate-image-result.ts +42 -0
  56. package/src/generate-image/generate-image.test.ts +1420 -0
  57. package/src/generate-image/generate-image.ts +360 -0
  58. package/src/generate-image/index.ts +18 -0
  59. package/src/generate-object/__snapshots__/generate-object.test.ts.snap +133 -0
  60. package/src/generate-object/__snapshots__/stream-object.test.ts.snap +297 -0
  61. package/src/generate-object/generate-object-result.ts +67 -0
  62. package/src/generate-object/generate-object.test-d.ts +49 -0
  63. package/src/generate-object/generate-object.test.ts +1191 -0
  64. package/src/generate-object/generate-object.ts +518 -0
  65. package/src/generate-object/index.ts +9 -0
  66. package/src/generate-object/inject-json-instruction.test.ts +181 -0
  67. package/src/generate-object/inject-json-instruction.ts +30 -0
  68. package/src/generate-object/output-strategy.ts +415 -0
  69. package/src/generate-object/parse-and-validate-object-result.ts +111 -0
  70. package/src/generate-object/repair-text.ts +12 -0
  71. package/src/generate-object/stream-object-result.ts +120 -0
  72. package/src/generate-object/stream-object.test-d.ts +74 -0
  73. package/src/generate-object/stream-object.test.ts +1950 -0
  74. package/src/generate-object/stream-object.ts +986 -0
  75. package/src/generate-object/validate-object-generation-input.ts +144 -0
  76. package/src/generate-speech/generate-speech-result.ts +30 -0
  77. package/src/generate-speech/generate-speech.test.ts +300 -0
  78. package/src/generate-speech/generate-speech.ts +190 -0
  79. package/src/generate-speech/generated-audio-file.ts +65 -0
  80. package/src/generate-speech/index.ts +3 -0
  81. package/src/generate-text/__snapshots__/generate-text.test.ts.snap +1872 -0
  82. package/src/generate-text/__snapshots__/stream-text.test.ts.snap +1255 -0
  83. package/src/generate-text/collect-tool-approvals.test.ts +553 -0
  84. package/src/generate-text/collect-tool-approvals.ts +116 -0
  85. package/src/generate-text/content-part.ts +25 -0
  86. package/src/generate-text/execute-tool-call.ts +129 -0
  87. package/src/generate-text/extract-reasoning-content.ts +17 -0
  88. package/src/generate-text/extract-text-content.ts +15 -0
  89. package/src/generate-text/generate-text-result.ts +168 -0
  90. package/src/generate-text/generate-text.test-d.ts +68 -0
  91. package/src/generate-text/generate-text.test.ts +7011 -0
  92. package/src/generate-text/generate-text.ts +1223 -0
  93. package/src/generate-text/generated-file.ts +70 -0
  94. package/src/generate-text/index.ts +57 -0
  95. package/src/generate-text/is-approval-needed.ts +29 -0
  96. package/src/generate-text/output-utils.ts +23 -0
  97. package/src/generate-text/output.test.ts +698 -0
  98. package/src/generate-text/output.ts +590 -0
  99. package/src/generate-text/parse-tool-call.test.ts +570 -0
  100. package/src/generate-text/parse-tool-call.ts +188 -0
  101. package/src/generate-text/prepare-step.ts +103 -0
  102. package/src/generate-text/prune-messages.test.ts +720 -0
  103. package/src/generate-text/prune-messages.ts +167 -0
  104. package/src/generate-text/reasoning-output.ts +20 -0
  105. package/src/generate-text/reasoning.ts +8 -0
  106. package/src/generate-text/response-message.ts +10 -0
  107. package/src/generate-text/run-tools-transformation.test.ts +1143 -0
  108. package/src/generate-text/run-tools-transformation.ts +420 -0
  109. package/src/generate-text/smooth-stream.test.ts +2101 -0
  110. package/src/generate-text/smooth-stream.ts +162 -0
  111. package/src/generate-text/step-result.ts +238 -0
  112. package/src/generate-text/stop-condition.ts +29 -0
  113. package/src/generate-text/stream-text-result.ts +463 -0
  114. package/src/generate-text/stream-text.test-d.ts +200 -0
  115. package/src/generate-text/stream-text.test.ts +19979 -0
  116. package/src/generate-text/stream-text.ts +2505 -0
  117. package/src/generate-text/to-response-messages.test.ts +922 -0
  118. package/src/generate-text/to-response-messages.ts +163 -0
  119. package/src/generate-text/tool-approval-request-output.ts +21 -0
  120. package/src/generate-text/tool-call-repair-function.ts +27 -0
  121. package/src/generate-text/tool-call.ts +47 -0
  122. package/src/generate-text/tool-error.ts +34 -0
  123. package/src/generate-text/tool-output-denied.ts +21 -0
  124. package/src/generate-text/tool-output.ts +7 -0
  125. package/src/generate-text/tool-result.ts +36 -0
  126. package/src/generate-text/tool-set.ts +14 -0
  127. package/src/global.ts +24 -0
  128. package/src/index.ts +50 -0
  129. package/src/logger/index.ts +6 -0
  130. package/src/logger/log-warnings.test.ts +351 -0
  131. package/src/logger/log-warnings.ts +119 -0
  132. package/src/middleware/__snapshots__/simulate-streaming-middleware.test.ts.snap +64 -0
  133. package/src/middleware/add-tool-input-examples-middleware.test.ts +476 -0
  134. package/src/middleware/add-tool-input-examples-middleware.ts +90 -0
  135. package/src/middleware/default-embedding-settings-middleware.test.ts +126 -0
  136. package/src/middleware/default-embedding-settings-middleware.ts +22 -0
  137. package/src/middleware/default-settings-middleware.test.ts +388 -0
  138. package/src/middleware/default-settings-middleware.ts +33 -0
  139. package/src/middleware/extract-json-middleware.test.ts +827 -0
  140. package/src/middleware/extract-json-middleware.ts +197 -0
  141. package/src/middleware/extract-reasoning-middleware.test.ts +1028 -0
  142. package/src/middleware/extract-reasoning-middleware.ts +238 -0
  143. package/src/middleware/index.ts +10 -0
  144. package/src/middleware/simulate-streaming-middleware.test.ts +911 -0
  145. package/src/middleware/simulate-streaming-middleware.ts +79 -0
  146. package/src/middleware/wrap-embedding-model.test.ts +358 -0
  147. package/src/middleware/wrap-embedding-model.ts +86 -0
  148. package/src/middleware/wrap-image-model.test.ts +423 -0
  149. package/src/middleware/wrap-image-model.ts +85 -0
  150. package/src/middleware/wrap-language-model.test.ts +518 -0
  151. package/src/middleware/wrap-language-model.ts +104 -0
  152. package/src/middleware/wrap-provider.test.ts +120 -0
  153. package/src/middleware/wrap-provider.ts +51 -0
  154. package/src/model/as-embedding-model-v3.test.ts +319 -0
  155. package/src/model/as-embedding-model-v3.ts +24 -0
  156. package/src/model/as-image-model-v3.test.ts +409 -0
  157. package/src/model/as-image-model-v3.ts +24 -0
  158. package/src/model/as-language-model-v3.test.ts +508 -0
  159. package/src/model/as-language-model-v3.ts +103 -0
  160. package/src/model/as-provider-v3.ts +36 -0
  161. package/src/model/as-speech-model-v3.test.ts +356 -0
  162. package/src/model/as-speech-model-v3.ts +24 -0
  163. package/src/model/as-transcription-model-v3.test.ts +529 -0
  164. package/src/model/as-transcription-model-v3.ts +24 -0
  165. package/src/model/resolve-model.test.ts +244 -0
  166. package/src/model/resolve-model.ts +126 -0
  167. package/src/prompt/call-settings.ts +148 -0
  168. package/src/prompt/content-part.ts +209 -0
  169. package/src/prompt/convert-to-language-model-prompt.test.ts +2018 -0
  170. package/src/prompt/convert-to-language-model-prompt.ts +442 -0
  171. package/src/prompt/create-tool-model-output.test.ts +508 -0
  172. package/src/prompt/create-tool-model-output.ts +34 -0
  173. package/src/prompt/data-content.test.ts +15 -0
  174. package/src/prompt/data-content.ts +134 -0
  175. package/src/prompt/index.ts +27 -0
  176. package/src/prompt/invalid-data-content-error.ts +29 -0
  177. package/src/prompt/invalid-message-role-error.ts +27 -0
  178. package/src/prompt/message-conversion-error.ts +28 -0
  179. package/src/prompt/message.ts +68 -0
  180. package/src/prompt/prepare-call-settings.test.ts +159 -0
  181. package/src/prompt/prepare-call-settings.ts +108 -0
  182. package/src/prompt/prepare-tools-and-tool-choice.test.ts +461 -0
  183. package/src/prompt/prepare-tools-and-tool-choice.ts +86 -0
  184. package/src/prompt/prompt.ts +43 -0
  185. package/src/prompt/split-data-url.ts +17 -0
  186. package/src/prompt/standardize-prompt.test.ts +82 -0
  187. package/src/prompt/standardize-prompt.ts +99 -0
  188. package/src/prompt/wrap-gateway-error.ts +29 -0
  189. package/src/registry/custom-provider.test.ts +211 -0
  190. package/src/registry/custom-provider.ts +155 -0
  191. package/src/registry/index.ts +7 -0
  192. package/src/registry/no-such-provider-error.ts +41 -0
  193. package/src/registry/provider-registry.test.ts +691 -0
  194. package/src/registry/provider-registry.ts +328 -0
  195. package/src/rerank/index.ts +2 -0
  196. package/src/rerank/rerank-result.ts +70 -0
  197. package/src/rerank/rerank.test.ts +516 -0
  198. package/src/rerank/rerank.ts +237 -0
  199. package/src/telemetry/assemble-operation-name.ts +21 -0
  200. package/src/telemetry/get-base-telemetry-attributes.ts +53 -0
  201. package/src/telemetry/get-tracer.ts +20 -0
  202. package/src/telemetry/noop-tracer.ts +69 -0
  203. package/src/telemetry/record-span.ts +63 -0
  204. package/src/telemetry/select-telemetry-attributes.ts +78 -0
  205. package/src/telemetry/select-temetry-attributes.test.ts +114 -0
  206. package/src/telemetry/stringify-for-telemetry.test.ts +114 -0
  207. package/src/telemetry/stringify-for-telemetry.ts +33 -0
  208. package/src/telemetry/telemetry-settings.ts +44 -0
  209. package/src/test/mock-embedding-model-v2.ts +35 -0
  210. package/src/test/mock-embedding-model-v3.ts +48 -0
  211. package/src/test/mock-image-model-v2.ts +28 -0
  212. package/src/test/mock-image-model-v3.ts +28 -0
  213. package/src/test/mock-language-model-v2.ts +72 -0
  214. package/src/test/mock-language-model-v3.ts +77 -0
  215. package/src/test/mock-provider-v2.ts +68 -0
  216. package/src/test/mock-provider-v3.ts +80 -0
  217. package/src/test/mock-reranking-model-v3.ts +25 -0
  218. package/src/test/mock-server-response.ts +69 -0
  219. package/src/test/mock-speech-model-v2.ts +24 -0
  220. package/src/test/mock-speech-model-v3.ts +24 -0
  221. package/src/test/mock-tracer.ts +156 -0
  222. package/src/test/mock-transcription-model-v2.ts +24 -0
  223. package/src/test/mock-transcription-model-v3.ts +24 -0
  224. package/src/test/mock-values.ts +4 -0
  225. package/src/test/not-implemented.ts +3 -0
  226. package/src/text-stream/create-text-stream-response.test.ts +38 -0
  227. package/src/text-stream/create-text-stream-response.ts +18 -0
  228. package/src/text-stream/index.ts +2 -0
  229. package/src/text-stream/pipe-text-stream-to-response.test.ts +38 -0
  230. package/src/text-stream/pipe-text-stream-to-response.ts +26 -0
  231. package/src/transcribe/index.ts +2 -0
  232. package/src/transcribe/transcribe-result.ts +60 -0
  233. package/src/transcribe/transcribe.test.ts +313 -0
  234. package/src/transcribe/transcribe.ts +173 -0
  235. package/src/types/embedding-model-middleware.ts +3 -0
  236. package/src/types/embedding-model.ts +18 -0
  237. package/src/types/image-model-middleware.ts +3 -0
  238. package/src/types/image-model-response-metadata.ts +16 -0
  239. package/src/types/image-model.ts +19 -0
  240. package/src/types/index.ts +29 -0
  241. package/src/types/json-value.ts +15 -0
  242. package/src/types/language-model-middleware.ts +3 -0
  243. package/src/types/language-model-request-metadata.ts +6 -0
  244. package/src/types/language-model-response-metadata.ts +21 -0
  245. package/src/types/language-model.ts +104 -0
  246. package/src/types/provider-metadata.ts +16 -0
  247. package/src/types/provider.ts +55 -0
  248. package/src/types/reranking-model.ts +6 -0
  249. package/src/types/speech-model-response-metadata.ts +21 -0
  250. package/src/types/speech-model.ts +6 -0
  251. package/src/types/transcription-model-response-metadata.ts +16 -0
  252. package/src/types/transcription-model.ts +9 -0
  253. package/src/types/usage.ts +200 -0
  254. package/src/types/warning.ts +7 -0
  255. package/src/ui/__snapshots__/append-response-messages.test.ts.snap +416 -0
  256. package/src/ui/__snapshots__/convert-to-model-messages.test.ts.snap +419 -0
  257. package/src/ui/__snapshots__/process-chat-text-response.test.ts.snap +142 -0
  258. package/src/ui/call-completion-api.ts +157 -0
  259. package/src/ui/chat-transport.ts +83 -0
  260. package/src/ui/chat.test-d.ts +233 -0
  261. package/src/ui/chat.test.ts +2695 -0
  262. package/src/ui/chat.ts +716 -0
  263. package/src/ui/convert-file-list-to-file-ui-parts.ts +36 -0
  264. package/src/ui/convert-to-model-messages.test.ts +2775 -0
  265. package/src/ui/convert-to-model-messages.ts +373 -0
  266. package/src/ui/default-chat-transport.ts +36 -0
  267. package/src/ui/direct-chat-transport.test.ts +446 -0
  268. package/src/ui/direct-chat-transport.ts +118 -0
  269. package/src/ui/http-chat-transport.test.ts +185 -0
  270. package/src/ui/http-chat-transport.ts +292 -0
  271. package/src/ui/index.ts +71 -0
  272. package/src/ui/last-assistant-message-is-complete-with-approval-responses.ts +44 -0
  273. package/src/ui/last-assistant-message-is-complete-with-tool-calls.test.ts +371 -0
  274. package/src/ui/last-assistant-message-is-complete-with-tool-calls.ts +39 -0
  275. package/src/ui/process-text-stream.test.ts +38 -0
  276. package/src/ui/process-text-stream.ts +16 -0
  277. package/src/ui/process-ui-message-stream.test.ts +8294 -0
  278. package/src/ui/process-ui-message-stream.ts +761 -0
  279. package/src/ui/text-stream-chat-transport.ts +23 -0
  280. package/src/ui/transform-text-to-ui-message-stream.test.ts +124 -0
  281. package/src/ui/transform-text-to-ui-message-stream.ts +27 -0
  282. package/src/ui/ui-messages.test.ts +48 -0
  283. package/src/ui/ui-messages.ts +534 -0
  284. package/src/ui/use-completion.ts +84 -0
  285. package/src/ui/validate-ui-messages.test.ts +1428 -0
  286. package/src/ui/validate-ui-messages.ts +476 -0
  287. package/src/ui-message-stream/create-ui-message-stream-response.test.ts +266 -0
  288. package/src/ui-message-stream/create-ui-message-stream-response.ts +32 -0
  289. package/src/ui-message-stream/create-ui-message-stream.test.ts +639 -0
  290. package/src/ui-message-stream/create-ui-message-stream.ts +124 -0
  291. package/src/ui-message-stream/get-response-ui-message-id.test.ts +55 -0
  292. package/src/ui-message-stream/get-response-ui-message-id.ts +24 -0
  293. package/src/ui-message-stream/handle-ui-message-stream-finish.test.ts +429 -0
  294. package/src/ui-message-stream/handle-ui-message-stream-finish.ts +135 -0
  295. package/src/ui-message-stream/index.ts +13 -0
  296. package/src/ui-message-stream/json-to-sse-transform-stream.ts +12 -0
  297. package/src/ui-message-stream/pipe-ui-message-stream-to-response.test.ts +90 -0
  298. package/src/ui-message-stream/pipe-ui-message-stream-to-response.ts +40 -0
  299. package/src/ui-message-stream/read-ui-message-stream.test.ts +122 -0
  300. package/src/ui-message-stream/read-ui-message-stream.ts +87 -0
  301. package/src/ui-message-stream/ui-message-chunks.test-d.ts +18 -0
  302. package/src/ui-message-stream/ui-message-chunks.ts +344 -0
  303. package/src/ui-message-stream/ui-message-stream-headers.ts +7 -0
  304. package/src/ui-message-stream/ui-message-stream-on-finish-callback.ts +32 -0
  305. package/src/ui-message-stream/ui-message-stream-response-init.ts +5 -0
  306. package/src/ui-message-stream/ui-message-stream-writer.ts +24 -0
  307. package/src/util/as-array.ts +3 -0
  308. package/src/util/async-iterable-stream.test.ts +241 -0
  309. package/src/util/async-iterable-stream.ts +94 -0
  310. package/src/util/consume-stream.ts +29 -0
  311. package/src/util/cosine-similarity.test.ts +57 -0
  312. package/src/util/cosine-similarity.ts +47 -0
  313. package/src/util/create-resolvable-promise.ts +30 -0
  314. package/src/util/create-stitchable-stream.test.ts +239 -0
  315. package/src/util/create-stitchable-stream.ts +112 -0
  316. package/src/util/data-url.ts +17 -0
  317. package/src/util/deep-partial.ts +84 -0
  318. package/src/util/detect-media-type.test.ts +670 -0
  319. package/src/util/detect-media-type.ts +184 -0
  320. package/src/util/download/download-function.ts +45 -0
  321. package/src/util/download/download.test.ts +69 -0
  322. package/src/util/download/download.ts +46 -0
  323. package/src/util/error-handler.ts +1 -0
  324. package/src/util/fix-json.test.ts +279 -0
  325. package/src/util/fix-json.ts +401 -0
  326. package/src/util/get-potential-start-index.test.ts +34 -0
  327. package/src/util/get-potential-start-index.ts +30 -0
  328. package/src/util/index.ts +11 -0
  329. package/src/util/is-deep-equal-data.test.ts +119 -0
  330. package/src/util/is-deep-equal-data.ts +48 -0
  331. package/src/util/is-non-empty-object.ts +5 -0
  332. package/src/util/job.ts +1 -0
  333. package/src/util/log-v2-compatibility-warning.ts +21 -0
  334. package/src/util/merge-abort-signals.test.ts +155 -0
  335. package/src/util/merge-abort-signals.ts +43 -0
  336. package/src/util/merge-objects.test.ts +118 -0
  337. package/src/util/merge-objects.ts +79 -0
  338. package/src/util/now.ts +4 -0
  339. package/src/util/parse-partial-json.test.ts +80 -0
  340. package/src/util/parse-partial-json.ts +30 -0
  341. package/src/util/prepare-headers.test.ts +51 -0
  342. package/src/util/prepare-headers.ts +14 -0
  343. package/src/util/prepare-retries.test.ts +10 -0
  344. package/src/util/prepare-retries.ts +47 -0
  345. package/src/util/retry-error.ts +41 -0
  346. package/src/util/retry-with-exponential-backoff.test.ts +446 -0
  347. package/src/util/retry-with-exponential-backoff.ts +154 -0
  348. package/src/util/serial-job-executor.test.ts +162 -0
  349. package/src/util/serial-job-executor.ts +36 -0
  350. package/src/util/simulate-readable-stream.test.ts +98 -0
  351. package/src/util/simulate-readable-stream.ts +39 -0
  352. package/src/util/split-array.test.ts +60 -0
  353. package/src/util/split-array.ts +20 -0
  354. package/src/util/value-of.ts +65 -0
  355. package/src/util/write-to-server-response.test.ts +266 -0
  356. package/src/util/write-to-server-response.ts +49 -0
  357. package/src/version.ts +5 -0
@@ -0,0 +1,7 @@
1
+ import { Agent } from './agent';
2
+
3
+ /**
4
+ * Infer the type of the tools of an agent.
5
+ */
6
+ export type InferAgentTools<AGENT> =
7
+ AGENT extends Agent<any, infer TOOLS, any> ? TOOLS : never;
@@ -0,0 +1,54 @@
1
+ import { describe, expectTypeOf, it } from 'vitest';
2
+ import {
3
+ DataUIPart,
4
+ DynamicToolUIPart,
5
+ FileUIPart,
6
+ ReasoningUIPart,
7
+ SourceDocumentUIPart,
8
+ SourceUrlUIPart,
9
+ StepStartUIPart,
10
+ TextUIPart,
11
+ UIMessage,
12
+ } from '../ui/ui-messages';
13
+ import { ToolLoopAgent } from './tool-loop-agent';
14
+ import { InferAgentUIMessage } from './infer-agent-ui-message';
15
+
16
+ describe('InferAgentUIMessage', () => {
17
+ it('should not contain arbitrary static tools when no tools are provided', () => {
18
+ const agent = new ToolLoopAgent({
19
+ model: 'openai/gpt-4o',
20
+ // no tools
21
+ });
22
+
23
+ type Message = InferAgentUIMessage<typeof agent>;
24
+
25
+ expectTypeOf<Message>().toMatchTypeOf<UIMessage<unknown, never, {}>>();
26
+
27
+ type MessagePart = Message['parts'][number];
28
+
29
+ expectTypeOf<MessagePart>().toMatchTypeOf<
30
+ | TextUIPart
31
+ | ReasoningUIPart
32
+ // No static tools, so no ToolUIPart
33
+ | DynamicToolUIPart
34
+ | SourceUrlUIPart
35
+ | SourceDocumentUIPart
36
+ | FileUIPart
37
+ | DataUIPart<never>
38
+ | StepStartUIPart
39
+ >();
40
+ });
41
+
42
+ it('should include metadata when provided', () => {
43
+ const agent = new ToolLoopAgent({
44
+ model: 'openai/gpt-4o',
45
+ // no tools
46
+ });
47
+
48
+ type Message = InferAgentUIMessage<typeof agent, { foo: string }>;
49
+
50
+ expectTypeOf<Message>().toMatchTypeOf<
51
+ UIMessage<{ foo: string }, never, {}>
52
+ >();
53
+ });
54
+ });
@@ -0,0 +1,11 @@
1
+ import { InferUITools, UIMessage } from '../ui/ui-messages';
2
+ import { InferAgentTools } from './infer-agent-tools';
3
+
4
+ /**
5
+ * Infer the UI message type of an agent.
6
+ */
7
+ export type InferAgentUIMessage<AGENT, MESSAGE_METADATA = unknown> = UIMessage<
8
+ MESSAGE_METADATA,
9
+ never,
10
+ InferUITools<InferAgentTools<AGENT>>
11
+ >;
@@ -0,0 +1,52 @@
1
+ import { ServerResponse } from 'node:http';
2
+ import { StreamTextTransform, UIMessageStreamOptions } from '../generate-text';
3
+ import { Output } from '../generate-text/output';
4
+ import { ToolSet } from '../generate-text/tool-set';
5
+ import { TimeoutConfiguration } from '../prompt/call-settings';
6
+ import { pipeUIMessageStreamToResponse } from '../ui-message-stream';
7
+ import { UIMessageStreamResponseInit } from '../ui-message-stream/ui-message-stream-response-init';
8
+ import { InferUITools, UIMessage } from '../ui/ui-messages';
9
+ import { Agent } from './agent';
10
+ import { createAgentUIStream } from './create-agent-ui-stream';
11
+
12
+ /**
13
+ * Pipes the agent UI message stream to a Node.js ServerResponse object.
14
+ *
15
+ * @param agent - The agent to run.
16
+ * @param uiMessages - The input UI messages.
17
+ */
18
+ export async function pipeAgentUIStreamToResponse<
19
+ CALL_OPTIONS = never,
20
+ TOOLS extends ToolSet = {},
21
+ OUTPUT extends Output = never,
22
+ MESSAGE_METADATA = unknown,
23
+ >({
24
+ response,
25
+ headers,
26
+ status,
27
+ statusText,
28
+ consumeSseStream,
29
+ ...options
30
+ }: {
31
+ response: ServerResponse;
32
+ agent: Agent<CALL_OPTIONS, TOOLS, OUTPUT>;
33
+ uiMessages: unknown[];
34
+ abortSignal?: AbortSignal;
35
+ timeout?: TimeoutConfiguration;
36
+ options?: CALL_OPTIONS;
37
+ experimental_transform?:
38
+ | StreamTextTransform<TOOLS>
39
+ | Array<StreamTextTransform<TOOLS>>;
40
+ } & UIMessageStreamResponseInit &
41
+ UIMessageStreamOptions<
42
+ UIMessage<MESSAGE_METADATA, never, InferUITools<TOOLS>>
43
+ >): Promise<void> {
44
+ pipeUIMessageStreamToResponse({
45
+ response,
46
+ headers,
47
+ status,
48
+ statusText,
49
+ consumeSseStream,
50
+ stream: await createAgentUIStream(options),
51
+ });
52
+ }
@@ -0,0 +1,31 @@
1
+ import { StepResult } from '../generate-text/step-result';
2
+ import { ToolSet } from '../generate-text/tool-set';
3
+ import { LanguageModelUsage } from '../types/usage';
4
+
5
+ /**
6
+ Callback that is set using the `onFinish` option.
7
+
8
+ @param event - The event that is passed to the callback.
9
+ */
10
+ export type ToolLoopAgentOnFinishCallback<TOOLS extends ToolSet = {}> = (
11
+ event: StepResult<TOOLS> & {
12
+ /**
13
+ * Details for all steps.
14
+ */
15
+ readonly steps: StepResult<TOOLS>[];
16
+
17
+ /**
18
+ * Total usage for all steps. This is the sum of the usage of all steps.
19
+ */
20
+ readonly totalUsage: LanguageModelUsage;
21
+
22
+ /**
23
+ * Context that is passed into tool calls.
24
+ *
25
+ * Experimental (can break in patch releases).
26
+ *
27
+ * @default undefined
28
+ */
29
+ experimental_context?: unknown;
30
+ },
31
+ ) => PromiseLike<void> | void;
@@ -0,0 +1,11 @@
1
+ import { StepResult } from '../generate-text/step-result';
2
+ import { ToolSet } from '../generate-text/tool-set';
3
+
4
+ /**
5
+ Callback that is set using the `onStepFinish` option.
6
+
7
+ @param stepResult - The result of the step.
8
+ */
9
+ export type ToolLoopAgentOnStepFinishCallback<TOOLS extends ToolSet = {}> = (
10
+ stepResult: StepResult<TOOLS>,
11
+ ) => Promise<void> | void;
@@ -0,0 +1,182 @@
1
+ import {
2
+ FlexibleSchema,
3
+ MaybePromiseLike,
4
+ ProviderOptions,
5
+ SystemModelMessage,
6
+ } from '@ai-sdk/provider-utils';
7
+ import { Output } from '../generate-text/output';
8
+ import { PrepareStepFunction } from '../generate-text/prepare-step';
9
+ import { StopCondition } from '../generate-text/stop-condition';
10
+ import { ToolCallRepairFunction } from '../generate-text/tool-call-repair-function';
11
+ import { ToolSet } from '../generate-text/tool-set';
12
+ import { CallSettings } from '../prompt/call-settings';
13
+ import { Prompt } from '../prompt/prompt';
14
+ import { TelemetrySettings } from '../telemetry/telemetry-settings';
15
+ import { LanguageModel, ToolChoice } from '../types/language-model';
16
+ import { DownloadFunction } from '../util/download/download-function';
17
+ import { AgentCallParameters } from './agent';
18
+ import { ToolLoopAgentOnFinishCallback } from './tool-loop-agent-on-finish-callback';
19
+ import { ToolLoopAgentOnStepFinishCallback } from './tool-loop-agent-on-step-finish-callback';
20
+
21
+ /**
22
+ * Configuration options for an agent.
23
+ */
24
+ export type ToolLoopAgentSettings<
25
+ CALL_OPTIONS = never,
26
+ TOOLS extends ToolSet = {},
27
+ OUTPUT extends Output = never,
28
+ > = Omit<CallSettings, 'abortSignal'> & {
29
+ /**
30
+ * The id of the agent.
31
+ */
32
+ id?: string;
33
+
34
+ /**
35
+ * The instructions for the agent.
36
+ *
37
+ * It can be a string, or, if you need to pass additional provider options (e.g. for caching), a `SystemModelMessage`.
38
+ */
39
+ instructions?: string | SystemModelMessage | Array<SystemModelMessage>;
40
+
41
+ /**
42
+ The language model to use.
43
+ */
44
+ model: LanguageModel;
45
+
46
+ /**
47
+ The tools that the model can call. The model needs to support calling tools.
48
+ */
49
+ tools?: TOOLS;
50
+
51
+ /**
52
+ The tool choice strategy. Default: 'auto'.
53
+ */
54
+ toolChoice?: ToolChoice<NoInfer<TOOLS>>;
55
+
56
+ /**
57
+ Condition for stopping the generation when there are tool results in the last step.
58
+ When the condition is an array, any of the conditions can be met to stop the generation.
59
+
60
+ @default stepCountIs(20)
61
+ */
62
+ stopWhen?:
63
+ | StopCondition<NoInfer<TOOLS>>
64
+ | Array<StopCondition<NoInfer<TOOLS>>>;
65
+
66
+ /**
67
+ Optional telemetry configuration (experimental).
68
+ */
69
+ experimental_telemetry?: TelemetrySettings;
70
+
71
+ /**
72
+ Limits the tools that are available for the model to call without
73
+ changing the tool call and result types in the result.
74
+ */
75
+ activeTools?: Array<keyof NoInfer<TOOLS>>;
76
+
77
+ /**
78
+ Optional specification for generating structured outputs.
79
+ */
80
+ output?: OUTPUT;
81
+
82
+ /**
83
+ Optional function that you can use to provide different settings for a step.
84
+ */
85
+ prepareStep?: PrepareStepFunction<NoInfer<TOOLS>>;
86
+
87
+ /**
88
+ A function that attempts to repair a tool call that failed to parse.
89
+ */
90
+ experimental_repairToolCall?: ToolCallRepairFunction<NoInfer<TOOLS>>;
91
+
92
+ /**
93
+ * Callback that is called when each step (LLM call) is finished, including intermediate steps.
94
+ */
95
+ onStepFinish?: ToolLoopAgentOnStepFinishCallback<NoInfer<TOOLS>>;
96
+
97
+ /**
98
+ * Callback that is called when all steps are finished and the response is complete.
99
+ */
100
+ onFinish?: ToolLoopAgentOnFinishCallback<NoInfer<TOOLS>>;
101
+
102
+ /**
103
+ Additional provider-specific options. They are passed through
104
+ to the provider from the AI SDK and enable provider-specific
105
+ functionality that can be fully encapsulated in the provider.
106
+ */
107
+ providerOptions?: ProviderOptions;
108
+
109
+ /**
110
+ * Context that is passed into tool calls.
111
+ *
112
+ * Experimental (can break in patch releases).
113
+ *
114
+ * @default undefined
115
+ */
116
+ experimental_context?: unknown;
117
+
118
+ /**
119
+ Custom download function to use for URLs.
120
+
121
+ By default, files are downloaded if the model does not support the URL for the given media type.
122
+ */
123
+ experimental_download?: DownloadFunction | undefined;
124
+
125
+ /**
126
+ * The schema for the call options.
127
+ */
128
+ callOptionsSchema?: FlexibleSchema<CALL_OPTIONS>;
129
+
130
+ /**
131
+ * Prepare the parameters for the generateText or streamText call.
132
+ *
133
+ * You can use this to have templates based on call options.
134
+ */
135
+ prepareCall?: (
136
+ options: AgentCallParameters<CALL_OPTIONS> &
137
+ Pick<
138
+ ToolLoopAgentSettings<CALL_OPTIONS, TOOLS, OUTPUT>,
139
+ | 'model'
140
+ | 'tools'
141
+ | 'maxOutputTokens'
142
+ | 'temperature'
143
+ | 'topP'
144
+ | 'topK'
145
+ | 'presencePenalty'
146
+ | 'frequencyPenalty'
147
+ | 'stopSequences'
148
+ | 'seed'
149
+ | 'headers'
150
+ | 'instructions'
151
+ | 'stopWhen'
152
+ | 'experimental_telemetry'
153
+ | 'activeTools'
154
+ | 'providerOptions'
155
+ | 'experimental_context'
156
+ | 'experimental_download'
157
+ >,
158
+ ) => MaybePromiseLike<
159
+ Pick<
160
+ ToolLoopAgentSettings<CALL_OPTIONS, TOOLS, OUTPUT>,
161
+ | 'model'
162
+ | 'tools'
163
+ | 'maxOutputTokens'
164
+ | 'temperature'
165
+ | 'topP'
166
+ | 'topK'
167
+ | 'presencePenalty'
168
+ | 'frequencyPenalty'
169
+ | 'stopSequences'
170
+ | 'seed'
171
+ | 'headers'
172
+ | 'instructions'
173
+ | 'stopWhen'
174
+ | 'experimental_telemetry'
175
+ | 'activeTools'
176
+ | 'providerOptions'
177
+ | 'experimental_context'
178
+ | 'experimental_download'
179
+ > &
180
+ Omit<Prompt, 'system'>
181
+ >;
182
+ };
@@ -0,0 +1,114 @@
1
+ import { describe, expectTypeOf, it } from 'vitest';
2
+ import { z } from 'zod';
3
+ import { Output } from '../generate-text';
4
+ import { MockLanguageModelV3 } from '../test/mock-language-model-v3';
5
+ import { AsyncIterableStream } from '../util/async-iterable-stream';
6
+ import { DeepPartial } from '../util/deep-partial';
7
+ import { AgentCallParameters, AgentStreamParameters } from './agent';
8
+ import { ToolLoopAgent } from './tool-loop-agent';
9
+
10
+ describe('ToolLoopAgent', () => {
11
+ describe('generate', () => {
12
+ it('should not allow system prompt', async () => {
13
+ const agent = new ToolLoopAgent({
14
+ model: new MockLanguageModelV3(),
15
+ });
16
+
17
+ await agent.generate({
18
+ // @ts-expect-error - system prompt is not allowed
19
+ system: '123',
20
+ prompt: 'Hello, world!',
21
+ });
22
+ });
23
+
24
+ it('should require options when call options are provided', async () => {
25
+ const agent = new ToolLoopAgent<{ callOption: string }>({
26
+ model: new MockLanguageModelV3(),
27
+ });
28
+
29
+ expectTypeOf<Parameters<typeof agent.generate>[0]>().toEqualTypeOf<
30
+ AgentCallParameters<{ callOption: string }>
31
+ >();
32
+ });
33
+
34
+ it('should not require options when call options are not provided', async () => {
35
+ const agent = new ToolLoopAgent({
36
+ model: new MockLanguageModelV3(),
37
+ });
38
+
39
+ expectTypeOf<Parameters<typeof agent.generate>[0]>().toEqualTypeOf<
40
+ AgentCallParameters<never>
41
+ >();
42
+ });
43
+
44
+ it('should infer output type', async () => {
45
+ const agent = new ToolLoopAgent({
46
+ model: new MockLanguageModelV3(),
47
+ output: Output.object({
48
+ schema: z.object({ value: z.string() }),
49
+ }),
50
+ });
51
+
52
+ const generateResult = await agent.generate({
53
+ prompt: 'Hello, world!',
54
+ });
55
+
56
+ const output = generateResult.output;
57
+
58
+ expectTypeOf<typeof output>().toEqualTypeOf<{ value: string }>();
59
+ });
60
+ });
61
+
62
+ describe('stream', () => {
63
+ it('should not allow system prompt', () => {
64
+ const agent = new ToolLoopAgent({
65
+ model: new MockLanguageModelV3(),
66
+ });
67
+
68
+ agent.stream({
69
+ // @ts-expect-error - system prompt is not allowed
70
+ system: '123',
71
+ prompt: 'Hello, world!',
72
+ });
73
+ });
74
+
75
+ it('should require options when call options are provided', async () => {
76
+ const agent = new ToolLoopAgent<{ callOption: string }>({
77
+ model: new MockLanguageModelV3(),
78
+ });
79
+
80
+ expectTypeOf<Parameters<typeof agent.stream>[0]>().toEqualTypeOf<
81
+ AgentStreamParameters<{ callOption: string }, {}>
82
+ >();
83
+ });
84
+
85
+ it('should not require options when call options are not provided', async () => {
86
+ const agent = new ToolLoopAgent({
87
+ model: new MockLanguageModelV3(),
88
+ });
89
+
90
+ expectTypeOf<Parameters<typeof agent.stream>[0]>().toEqualTypeOf<
91
+ AgentStreamParameters<never, {}>
92
+ >();
93
+ });
94
+
95
+ it('should infer output type', async () => {
96
+ const agent = new ToolLoopAgent({
97
+ model: new MockLanguageModelV3(),
98
+ output: Output.object({
99
+ schema: z.object({ value: z.string() }),
100
+ }),
101
+ });
102
+
103
+ const streamResult = await agent.stream({
104
+ prompt: 'Hello, world!',
105
+ });
106
+
107
+ const partialOutputStream = streamResult.partialOutputStream;
108
+
109
+ expectTypeOf<typeof partialOutputStream>().toEqualTypeOf<
110
+ AsyncIterableStream<DeepPartial<{ value: string }>>
111
+ >();
112
+ });
113
+ });
114
+ });