ai 6.0.32 → 6.0.34

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 (353) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/index.js +12 -2
  3. package/dist/index.js.map +1 -1
  4. package/dist/index.mjs +12 -2
  5. package/dist/index.mjs.map +1 -1
  6. package/dist/internal/index.js +1 -1
  7. package/dist/internal/index.mjs +1 -1
  8. package/docs/02-foundations/03-prompts.mdx +2 -2
  9. package/docs/03-ai-sdk-core/15-tools-and-tool-calling.mdx +1 -1
  10. package/docs/07-reference/01-ai-sdk-core/28-output.mdx +1 -1
  11. package/package.json +6 -4
  12. package/src/agent/agent.ts +116 -0
  13. package/src/agent/create-agent-ui-stream-response.test.ts +258 -0
  14. package/src/agent/create-agent-ui-stream-response.ts +50 -0
  15. package/src/agent/create-agent-ui-stream.ts +73 -0
  16. package/src/agent/index.ts +33 -0
  17. package/src/agent/infer-agent-tools.ts +7 -0
  18. package/src/agent/infer-agent-ui-message.test-d.ts +54 -0
  19. package/src/agent/infer-agent-ui-message.ts +11 -0
  20. package/src/agent/pipe-agent-ui-stream-to-response.ts +52 -0
  21. package/src/agent/tool-loop-agent-on-finish-callback.ts +31 -0
  22. package/src/agent/tool-loop-agent-on-step-finish-callback.ts +11 -0
  23. package/src/agent/tool-loop-agent-settings.ts +182 -0
  24. package/src/agent/tool-loop-agent.test-d.ts +114 -0
  25. package/src/agent/tool-loop-agent.test.ts +442 -0
  26. package/src/agent/tool-loop-agent.ts +114 -0
  27. package/src/embed/__snapshots__/embed-many.test.ts.snap +191 -0
  28. package/src/embed/__snapshots__/embed.test.ts.snap +81 -0
  29. package/src/embed/embed-many-result.ts +53 -0
  30. package/src/embed/embed-many.test.ts +653 -0
  31. package/src/embed/embed-many.ts +378 -0
  32. package/src/embed/embed-result.ts +50 -0
  33. package/src/embed/embed.test.ts +298 -0
  34. package/src/embed/embed.ts +211 -0
  35. package/src/embed/index.ts +4 -0
  36. package/src/error/index.ts +34 -0
  37. package/src/error/invalid-argument-error.ts +34 -0
  38. package/src/error/invalid-stream-part-error.ts +28 -0
  39. package/src/error/invalid-tool-approval-error.ts +26 -0
  40. package/src/error/invalid-tool-input-error.ts +33 -0
  41. package/src/error/no-image-generated-error.ts +39 -0
  42. package/src/error/no-object-generated-error.ts +70 -0
  43. package/src/error/no-output-generated-error.ts +26 -0
  44. package/src/error/no-speech-generated-error.ts +18 -0
  45. package/src/error/no-such-tool-error.ts +35 -0
  46. package/src/error/no-transcript-generated-error.ts +20 -0
  47. package/src/error/tool-call-not-found-for-approval-error.ts +32 -0
  48. package/src/error/tool-call-repair-error.ts +30 -0
  49. package/src/error/unsupported-model-version-error.ts +23 -0
  50. package/src/error/verify-no-object-generated-error.ts +27 -0
  51. package/src/generate-image/generate-image-result.ts +42 -0
  52. package/src/generate-image/generate-image.test.ts +1420 -0
  53. package/src/generate-image/generate-image.ts +360 -0
  54. package/src/generate-image/index.ts +18 -0
  55. package/src/generate-object/__snapshots__/generate-object.test.ts.snap +133 -0
  56. package/src/generate-object/__snapshots__/stream-object.test.ts.snap +297 -0
  57. package/src/generate-object/generate-object-result.ts +67 -0
  58. package/src/generate-object/generate-object.test-d.ts +49 -0
  59. package/src/generate-object/generate-object.test.ts +1191 -0
  60. package/src/generate-object/generate-object.ts +518 -0
  61. package/src/generate-object/index.ts +9 -0
  62. package/src/generate-object/inject-json-instruction.test.ts +181 -0
  63. package/src/generate-object/inject-json-instruction.ts +30 -0
  64. package/src/generate-object/output-strategy.ts +415 -0
  65. package/src/generate-object/parse-and-validate-object-result.ts +111 -0
  66. package/src/generate-object/repair-text.ts +12 -0
  67. package/src/generate-object/stream-object-result.ts +120 -0
  68. package/src/generate-object/stream-object.test-d.ts +74 -0
  69. package/src/generate-object/stream-object.test.ts +1950 -0
  70. package/src/generate-object/stream-object.ts +986 -0
  71. package/src/generate-object/validate-object-generation-input.ts +144 -0
  72. package/src/generate-speech/generate-speech-result.ts +30 -0
  73. package/src/generate-speech/generate-speech.test.ts +300 -0
  74. package/src/generate-speech/generate-speech.ts +190 -0
  75. package/src/generate-speech/generated-audio-file.ts +65 -0
  76. package/src/generate-speech/index.ts +3 -0
  77. package/src/generate-text/__snapshots__/generate-text.test.ts.snap +1872 -0
  78. package/src/generate-text/__snapshots__/stream-text.test.ts.snap +1255 -0
  79. package/src/generate-text/collect-tool-approvals.test.ts +553 -0
  80. package/src/generate-text/collect-tool-approvals.ts +116 -0
  81. package/src/generate-text/content-part.ts +25 -0
  82. package/src/generate-text/execute-tool-call.ts +129 -0
  83. package/src/generate-text/extract-reasoning-content.ts +17 -0
  84. package/src/generate-text/extract-text-content.ts +15 -0
  85. package/src/generate-text/generate-text-result.ts +168 -0
  86. package/src/generate-text/generate-text.test-d.ts +68 -0
  87. package/src/generate-text/generate-text.test.ts +7011 -0
  88. package/src/generate-text/generate-text.ts +1223 -0
  89. package/src/generate-text/generated-file.ts +70 -0
  90. package/src/generate-text/index.ts +57 -0
  91. package/src/generate-text/is-approval-needed.ts +29 -0
  92. package/src/generate-text/output-utils.ts +23 -0
  93. package/src/generate-text/output.test.ts +698 -0
  94. package/src/generate-text/output.ts +590 -0
  95. package/src/generate-text/parse-tool-call.test.ts +570 -0
  96. package/src/generate-text/parse-tool-call.ts +188 -0
  97. package/src/generate-text/prepare-step.ts +103 -0
  98. package/src/generate-text/prune-messages.test.ts +720 -0
  99. package/src/generate-text/prune-messages.ts +167 -0
  100. package/src/generate-text/reasoning-output.ts +20 -0
  101. package/src/generate-text/reasoning.ts +8 -0
  102. package/src/generate-text/response-message.ts +10 -0
  103. package/src/generate-text/run-tools-transformation.test.ts +1143 -0
  104. package/src/generate-text/run-tools-transformation.ts +420 -0
  105. package/src/generate-text/smooth-stream.test.ts +2101 -0
  106. package/src/generate-text/smooth-stream.ts +162 -0
  107. package/src/generate-text/step-result.ts +238 -0
  108. package/src/generate-text/stop-condition.ts +29 -0
  109. package/src/generate-text/stream-text-result.ts +463 -0
  110. package/src/generate-text/stream-text.test-d.ts +200 -0
  111. package/src/generate-text/stream-text.test.ts +19979 -0
  112. package/src/generate-text/stream-text.ts +2505 -0
  113. package/src/generate-text/to-response-messages.test.ts +922 -0
  114. package/src/generate-text/to-response-messages.ts +163 -0
  115. package/src/generate-text/tool-approval-request-output.ts +21 -0
  116. package/src/generate-text/tool-call-repair-function.ts +27 -0
  117. package/src/generate-text/tool-call.ts +47 -0
  118. package/src/generate-text/tool-error.ts +34 -0
  119. package/src/generate-text/tool-output-denied.ts +21 -0
  120. package/src/generate-text/tool-output.ts +7 -0
  121. package/src/generate-text/tool-result.ts +36 -0
  122. package/src/generate-text/tool-set.ts +14 -0
  123. package/src/global.ts +24 -0
  124. package/src/index.ts +50 -0
  125. package/src/logger/index.ts +6 -0
  126. package/src/logger/log-warnings.test.ts +351 -0
  127. package/src/logger/log-warnings.ts +119 -0
  128. package/src/middleware/__snapshots__/simulate-streaming-middleware.test.ts.snap +64 -0
  129. package/src/middleware/add-tool-input-examples-middleware.test.ts +476 -0
  130. package/src/middleware/add-tool-input-examples-middleware.ts +90 -0
  131. package/src/middleware/default-embedding-settings-middleware.test.ts +126 -0
  132. package/src/middleware/default-embedding-settings-middleware.ts +22 -0
  133. package/src/middleware/default-settings-middleware.test.ts +388 -0
  134. package/src/middleware/default-settings-middleware.ts +33 -0
  135. package/src/middleware/extract-json-middleware.test.ts +827 -0
  136. package/src/middleware/extract-json-middleware.ts +197 -0
  137. package/src/middleware/extract-reasoning-middleware.test.ts +1028 -0
  138. package/src/middleware/extract-reasoning-middleware.ts +238 -0
  139. package/src/middleware/index.ts +10 -0
  140. package/src/middleware/simulate-streaming-middleware.test.ts +911 -0
  141. package/src/middleware/simulate-streaming-middleware.ts +79 -0
  142. package/src/middleware/wrap-embedding-model.test.ts +358 -0
  143. package/src/middleware/wrap-embedding-model.ts +86 -0
  144. package/src/middleware/wrap-image-model.test.ts +423 -0
  145. package/src/middleware/wrap-image-model.ts +85 -0
  146. package/src/middleware/wrap-language-model.test.ts +518 -0
  147. package/src/middleware/wrap-language-model.ts +104 -0
  148. package/src/middleware/wrap-provider.test.ts +120 -0
  149. package/src/middleware/wrap-provider.ts +51 -0
  150. package/src/model/as-embedding-model-v3.test.ts +319 -0
  151. package/src/model/as-embedding-model-v3.ts +24 -0
  152. package/src/model/as-image-model-v3.test.ts +409 -0
  153. package/src/model/as-image-model-v3.ts +24 -0
  154. package/src/model/as-language-model-v3.test.ts +508 -0
  155. package/src/model/as-language-model-v3.ts +103 -0
  156. package/src/model/as-provider-v3.ts +36 -0
  157. package/src/model/as-speech-model-v3.test.ts +356 -0
  158. package/src/model/as-speech-model-v3.ts +24 -0
  159. package/src/model/as-transcription-model-v3.test.ts +529 -0
  160. package/src/model/as-transcription-model-v3.ts +24 -0
  161. package/src/model/resolve-model.test.ts +244 -0
  162. package/src/model/resolve-model.ts +126 -0
  163. package/src/prompt/call-settings.ts +148 -0
  164. package/src/prompt/content-part.ts +209 -0
  165. package/src/prompt/convert-to-language-model-prompt.test.ts +2018 -0
  166. package/src/prompt/convert-to-language-model-prompt.ts +442 -0
  167. package/src/prompt/create-tool-model-output.test.ts +508 -0
  168. package/src/prompt/create-tool-model-output.ts +34 -0
  169. package/src/prompt/data-content.test.ts +15 -0
  170. package/src/prompt/data-content.ts +134 -0
  171. package/src/prompt/index.ts +27 -0
  172. package/src/prompt/invalid-data-content-error.ts +29 -0
  173. package/src/prompt/invalid-message-role-error.ts +27 -0
  174. package/src/prompt/message-conversion-error.ts +28 -0
  175. package/src/prompt/message.ts +68 -0
  176. package/src/prompt/prepare-call-settings.test.ts +159 -0
  177. package/src/prompt/prepare-call-settings.ts +108 -0
  178. package/src/prompt/prepare-tools-and-tool-choice.test.ts +461 -0
  179. package/src/prompt/prepare-tools-and-tool-choice.ts +86 -0
  180. package/src/prompt/prompt.ts +43 -0
  181. package/src/prompt/split-data-url.ts +17 -0
  182. package/src/prompt/standardize-prompt.test.ts +82 -0
  183. package/src/prompt/standardize-prompt.ts +99 -0
  184. package/src/prompt/wrap-gateway-error.ts +29 -0
  185. package/src/registry/custom-provider.test.ts +211 -0
  186. package/src/registry/custom-provider.ts +155 -0
  187. package/src/registry/index.ts +7 -0
  188. package/src/registry/no-such-provider-error.ts +41 -0
  189. package/src/registry/provider-registry.test.ts +691 -0
  190. package/src/registry/provider-registry.ts +328 -0
  191. package/src/rerank/index.ts +2 -0
  192. package/src/rerank/rerank-result.ts +70 -0
  193. package/src/rerank/rerank.test.ts +516 -0
  194. package/src/rerank/rerank.ts +237 -0
  195. package/src/telemetry/assemble-operation-name.ts +21 -0
  196. package/src/telemetry/get-base-telemetry-attributes.ts +53 -0
  197. package/src/telemetry/get-tracer.ts +20 -0
  198. package/src/telemetry/noop-tracer.ts +69 -0
  199. package/src/telemetry/record-span.ts +63 -0
  200. package/src/telemetry/select-telemetry-attributes.ts +78 -0
  201. package/src/telemetry/select-temetry-attributes.test.ts +114 -0
  202. package/src/telemetry/stringify-for-telemetry.test.ts +114 -0
  203. package/src/telemetry/stringify-for-telemetry.ts +33 -0
  204. package/src/telemetry/telemetry-settings.ts +44 -0
  205. package/src/test/mock-embedding-model-v2.ts +35 -0
  206. package/src/test/mock-embedding-model-v3.ts +48 -0
  207. package/src/test/mock-image-model-v2.ts +28 -0
  208. package/src/test/mock-image-model-v3.ts +28 -0
  209. package/src/test/mock-language-model-v2.ts +72 -0
  210. package/src/test/mock-language-model-v3.ts +77 -0
  211. package/src/test/mock-provider-v2.ts +68 -0
  212. package/src/test/mock-provider-v3.ts +80 -0
  213. package/src/test/mock-reranking-model-v3.ts +25 -0
  214. package/src/test/mock-server-response.ts +69 -0
  215. package/src/test/mock-speech-model-v2.ts +24 -0
  216. package/src/test/mock-speech-model-v3.ts +24 -0
  217. package/src/test/mock-tracer.ts +156 -0
  218. package/src/test/mock-transcription-model-v2.ts +24 -0
  219. package/src/test/mock-transcription-model-v3.ts +24 -0
  220. package/src/test/mock-values.ts +4 -0
  221. package/src/test/not-implemented.ts +3 -0
  222. package/src/text-stream/create-text-stream-response.test.ts +38 -0
  223. package/src/text-stream/create-text-stream-response.ts +18 -0
  224. package/src/text-stream/index.ts +2 -0
  225. package/src/text-stream/pipe-text-stream-to-response.test.ts +38 -0
  226. package/src/text-stream/pipe-text-stream-to-response.ts +26 -0
  227. package/src/transcribe/index.ts +2 -0
  228. package/src/transcribe/transcribe-result.ts +60 -0
  229. package/src/transcribe/transcribe.test.ts +313 -0
  230. package/src/transcribe/transcribe.ts +173 -0
  231. package/src/types/embedding-model-middleware.ts +3 -0
  232. package/src/types/embedding-model.ts +18 -0
  233. package/src/types/image-model-middleware.ts +3 -0
  234. package/src/types/image-model-response-metadata.ts +16 -0
  235. package/src/types/image-model.ts +19 -0
  236. package/src/types/index.ts +29 -0
  237. package/src/types/json-value.ts +15 -0
  238. package/src/types/language-model-middleware.ts +3 -0
  239. package/src/types/language-model-request-metadata.ts +6 -0
  240. package/src/types/language-model-response-metadata.ts +21 -0
  241. package/src/types/language-model.ts +104 -0
  242. package/src/types/provider-metadata.ts +16 -0
  243. package/src/types/provider.ts +55 -0
  244. package/src/types/reranking-model.ts +6 -0
  245. package/src/types/speech-model-response-metadata.ts +21 -0
  246. package/src/types/speech-model.ts +6 -0
  247. package/src/types/transcription-model-response-metadata.ts +16 -0
  248. package/src/types/transcription-model.ts +9 -0
  249. package/src/types/usage.ts +200 -0
  250. package/src/types/warning.ts +7 -0
  251. package/src/ui/__snapshots__/append-response-messages.test.ts.snap +416 -0
  252. package/src/ui/__snapshots__/convert-to-model-messages.test.ts.snap +419 -0
  253. package/src/ui/__snapshots__/process-chat-text-response.test.ts.snap +142 -0
  254. package/src/ui/call-completion-api.ts +157 -0
  255. package/src/ui/chat-transport.ts +83 -0
  256. package/src/ui/chat.test-d.ts +233 -0
  257. package/src/ui/chat.test.ts +2695 -0
  258. package/src/ui/chat.ts +716 -0
  259. package/src/ui/convert-file-list-to-file-ui-parts.ts +36 -0
  260. package/src/ui/convert-to-model-messages.test.ts +2775 -0
  261. package/src/ui/convert-to-model-messages.ts +373 -0
  262. package/src/ui/default-chat-transport.ts +36 -0
  263. package/src/ui/direct-chat-transport.test.ts +446 -0
  264. package/src/ui/direct-chat-transport.ts +118 -0
  265. package/src/ui/http-chat-transport.test.ts +185 -0
  266. package/src/ui/http-chat-transport.ts +292 -0
  267. package/src/ui/index.ts +71 -0
  268. package/src/ui/last-assistant-message-is-complete-with-approval-responses.ts +44 -0
  269. package/src/ui/last-assistant-message-is-complete-with-tool-calls.test.ts +371 -0
  270. package/src/ui/last-assistant-message-is-complete-with-tool-calls.ts +39 -0
  271. package/src/ui/process-text-stream.test.ts +38 -0
  272. package/src/ui/process-text-stream.ts +16 -0
  273. package/src/ui/process-ui-message-stream.test.ts +8052 -0
  274. package/src/ui/process-ui-message-stream.ts +713 -0
  275. package/src/ui/text-stream-chat-transport.ts +23 -0
  276. package/src/ui/transform-text-to-ui-message-stream.test.ts +124 -0
  277. package/src/ui/transform-text-to-ui-message-stream.ts +27 -0
  278. package/src/ui/ui-messages.test.ts +48 -0
  279. package/src/ui/ui-messages.ts +534 -0
  280. package/src/ui/use-completion.ts +84 -0
  281. package/src/ui/validate-ui-messages.test.ts +1428 -0
  282. package/src/ui/validate-ui-messages.ts +476 -0
  283. package/src/ui-message-stream/create-ui-message-stream-response.test.ts +266 -0
  284. package/src/ui-message-stream/create-ui-message-stream-response.ts +32 -0
  285. package/src/ui-message-stream/create-ui-message-stream.test.ts +639 -0
  286. package/src/ui-message-stream/create-ui-message-stream.ts +124 -0
  287. package/src/ui-message-stream/get-response-ui-message-id.test.ts +55 -0
  288. package/src/ui-message-stream/get-response-ui-message-id.ts +24 -0
  289. package/src/ui-message-stream/handle-ui-message-stream-finish.test.ts +429 -0
  290. package/src/ui-message-stream/handle-ui-message-stream-finish.ts +135 -0
  291. package/src/ui-message-stream/index.ts +13 -0
  292. package/src/ui-message-stream/json-to-sse-transform-stream.ts +12 -0
  293. package/src/ui-message-stream/pipe-ui-message-stream-to-response.test.ts +90 -0
  294. package/src/ui-message-stream/pipe-ui-message-stream-to-response.ts +40 -0
  295. package/src/ui-message-stream/read-ui-message-stream.test.ts +122 -0
  296. package/src/ui-message-stream/read-ui-message-stream.ts +87 -0
  297. package/src/ui-message-stream/ui-message-chunks.test-d.ts +18 -0
  298. package/src/ui-message-stream/ui-message-chunks.ts +344 -0
  299. package/src/ui-message-stream/ui-message-stream-headers.ts +7 -0
  300. package/src/ui-message-stream/ui-message-stream-on-finish-callback.ts +32 -0
  301. package/src/ui-message-stream/ui-message-stream-response-init.ts +5 -0
  302. package/src/ui-message-stream/ui-message-stream-writer.ts +24 -0
  303. package/src/util/as-array.ts +3 -0
  304. package/src/util/async-iterable-stream.test.ts +241 -0
  305. package/src/util/async-iterable-stream.ts +94 -0
  306. package/src/util/consume-stream.ts +29 -0
  307. package/src/util/cosine-similarity.test.ts +57 -0
  308. package/src/util/cosine-similarity.ts +47 -0
  309. package/src/util/create-resolvable-promise.ts +30 -0
  310. package/src/util/create-stitchable-stream.test.ts +239 -0
  311. package/src/util/create-stitchable-stream.ts +112 -0
  312. package/src/util/data-url.ts +17 -0
  313. package/src/util/deep-partial.ts +84 -0
  314. package/src/util/detect-media-type.test.ts +670 -0
  315. package/src/util/detect-media-type.ts +184 -0
  316. package/src/util/download/download-function.ts +45 -0
  317. package/src/util/download/download.test.ts +69 -0
  318. package/src/util/download/download.ts +46 -0
  319. package/src/util/error-handler.ts +1 -0
  320. package/src/util/fix-json.test.ts +279 -0
  321. package/src/util/fix-json.ts +401 -0
  322. package/src/util/get-potential-start-index.test.ts +34 -0
  323. package/src/util/get-potential-start-index.ts +30 -0
  324. package/src/util/index.ts +11 -0
  325. package/src/util/is-deep-equal-data.test.ts +119 -0
  326. package/src/util/is-deep-equal-data.ts +48 -0
  327. package/src/util/is-non-empty-object.ts +5 -0
  328. package/src/util/job.ts +1 -0
  329. package/src/util/log-v2-compatibility-warning.ts +21 -0
  330. package/src/util/merge-abort-signals.test.ts +155 -0
  331. package/src/util/merge-abort-signals.ts +43 -0
  332. package/src/util/merge-objects.test.ts +118 -0
  333. package/src/util/merge-objects.ts +79 -0
  334. package/src/util/now.ts +4 -0
  335. package/src/util/parse-partial-json.test.ts +80 -0
  336. package/src/util/parse-partial-json.ts +30 -0
  337. package/src/util/prepare-headers.test.ts +51 -0
  338. package/src/util/prepare-headers.ts +14 -0
  339. package/src/util/prepare-retries.test.ts +10 -0
  340. package/src/util/prepare-retries.ts +47 -0
  341. package/src/util/retry-error.ts +41 -0
  342. package/src/util/retry-with-exponential-backoff.test.ts +446 -0
  343. package/src/util/retry-with-exponential-backoff.ts +154 -0
  344. package/src/util/serial-job-executor.test.ts +162 -0
  345. package/src/util/serial-job-executor.ts +36 -0
  346. package/src/util/simulate-readable-stream.test.ts +98 -0
  347. package/src/util/simulate-readable-stream.ts +39 -0
  348. package/src/util/split-array.test.ts +60 -0
  349. package/src/util/split-array.ts +20 -0
  350. package/src/util/value-of.ts +65 -0
  351. package/src/util/write-to-server-response.test.ts +266 -0
  352. package/src/util/write-to-server-response.ts +49 -0
  353. package/src/version.ts +5 -0
@@ -0,0 +1,590 @@
1
+ import {
2
+ JSONValue,
3
+ LanguageModelV3CallOptions,
4
+ TypeValidationError,
5
+ } from '@ai-sdk/provider';
6
+ import {
7
+ asSchema,
8
+ FlexibleSchema,
9
+ resolve,
10
+ safeParseJSON,
11
+ safeValidateTypes,
12
+ } from '@ai-sdk/provider-utils';
13
+ import { NoObjectGeneratedError } from '../error/no-object-generated-error';
14
+ import { FinishReason } from '../types/language-model';
15
+ import { LanguageModelResponseMetadata } from '../types/language-model-response-metadata';
16
+ import { LanguageModelUsage } from '../types/usage';
17
+ import { DeepPartial } from '../util/deep-partial';
18
+ import { parsePartialJson } from '../util/parse-partial-json';
19
+ import { EnrichedStreamPart } from './stream-text';
20
+
21
+ export interface Output<OUTPUT = any, PARTIAL = any, ELEMENT = any> {
22
+ /**
23
+ * The name of the output mode.
24
+ */
25
+ name: string;
26
+
27
+ /**
28
+ * The response format to use for the model.
29
+ */
30
+ responseFormat: PromiseLike<LanguageModelV3CallOptions['responseFormat']>;
31
+
32
+ /**
33
+ * Parses the complete output of the model.
34
+ */
35
+ parseCompleteOutput(
36
+ options: { text: string },
37
+ context: {
38
+ response: LanguageModelResponseMetadata;
39
+ usage: LanguageModelUsage;
40
+ finishReason: FinishReason;
41
+ },
42
+ ): Promise<OUTPUT>;
43
+
44
+ /**
45
+ * Parses the partial output of the model.
46
+ */
47
+ parsePartialOutput(options: {
48
+ text: string;
49
+ }): Promise<{ partial: PARTIAL } | undefined>;
50
+
51
+ /**
52
+ * Creates a stream transform that emits individual elements as they complete.
53
+ */
54
+ createElementStreamTransform():
55
+ | TransformStream<EnrichedStreamPart<any, PARTIAL>, ELEMENT>
56
+ | undefined;
57
+ }
58
+
59
+ /**
60
+ * Output specification for text generation.
61
+ * This is the default output mode that generates plain text.
62
+ *
63
+ * @returns An output specification for generating text.
64
+ */
65
+ export const text = (): Output<string, string, never> => ({
66
+ name: 'text',
67
+ responseFormat: Promise.resolve({ type: 'text' }),
68
+
69
+ async parseCompleteOutput({ text }: { text: string }) {
70
+ return text;
71
+ },
72
+
73
+ async parsePartialOutput({ text }: { text: string }) {
74
+ return { partial: text };
75
+ },
76
+
77
+ createElementStreamTransform() {
78
+ return undefined;
79
+ },
80
+ });
81
+
82
+ /**
83
+ * Output specification for typed object generation using schemas.
84
+ * When the model generates a text response, it will return an object that matches the schema.
85
+ *
86
+ * @param schema - The schema of the object to generate.
87
+ * @param name - Optional name of the output that should be generated. Used by some providers for additional LLM guidance, e.g. via tool or schema name.
88
+ * @param description - Optional description of the output that should be generated. Used by some providers for additional LLM guidance, e.g. via tool or schema description.
89
+ *
90
+ * @returns An output specification for generating objects with the specified schema.
91
+ */
92
+ export const object = <OBJECT>({
93
+ schema: inputSchema,
94
+ name,
95
+ description,
96
+ }: {
97
+ schema: FlexibleSchema<OBJECT>;
98
+ /**
99
+ * Optional name of the output that should be generated.
100
+ * Used by some providers for additional LLM guidance, e.g. via tool or schema name.
101
+ */
102
+ name?: string;
103
+ /**
104
+ * Optional description of the output that should be generated.
105
+ * Used by some providers for additional LLM guidance, e.g. via tool or schema description.
106
+ */
107
+ description?: string;
108
+ }): Output<OBJECT, DeepPartial<OBJECT>, never> => {
109
+ const schema = asSchema(inputSchema);
110
+
111
+ return {
112
+ name: 'object',
113
+
114
+ responseFormat: resolve(schema.jsonSchema).then(jsonSchema => ({
115
+ type: 'json' as const,
116
+ schema: jsonSchema,
117
+ ...(name != null && { name }),
118
+ ...(description != null && { description }),
119
+ })),
120
+
121
+ async parseCompleteOutput(
122
+ { text }: { text: string },
123
+ context: {
124
+ response: LanguageModelResponseMetadata;
125
+ usage: LanguageModelUsage;
126
+ finishReason: FinishReason;
127
+ },
128
+ ) {
129
+ const parseResult = await safeParseJSON({ text });
130
+
131
+ if (!parseResult.success) {
132
+ throw new NoObjectGeneratedError({
133
+ message: 'No object generated: could not parse the response.',
134
+ cause: parseResult.error,
135
+ text,
136
+ response: context.response,
137
+ usage: context.usage,
138
+ finishReason: context.finishReason,
139
+ });
140
+ }
141
+
142
+ const validationResult = await safeValidateTypes({
143
+ value: parseResult.value,
144
+ schema,
145
+ });
146
+
147
+ if (!validationResult.success) {
148
+ throw new NoObjectGeneratedError({
149
+ message: 'No object generated: response did not match schema.',
150
+ cause: validationResult.error,
151
+ text,
152
+ response: context.response,
153
+ usage: context.usage,
154
+ finishReason: context.finishReason,
155
+ });
156
+ }
157
+
158
+ return validationResult.value;
159
+ },
160
+
161
+ async parsePartialOutput({ text }: { text: string }) {
162
+ const result = await parsePartialJson(text);
163
+
164
+ switch (result.state) {
165
+ case 'failed-parse':
166
+ case 'undefined-input': {
167
+ return undefined;
168
+ }
169
+
170
+ case 'repaired-parse':
171
+ case 'successful-parse': {
172
+ return {
173
+ // Note: currently no validation of partial results:
174
+ partial: result.value as DeepPartial<OBJECT>,
175
+ };
176
+ }
177
+ }
178
+ },
179
+
180
+ createElementStreamTransform() {
181
+ return undefined;
182
+ },
183
+ };
184
+ };
185
+
186
+ /**
187
+ * Output specification for array generation.
188
+ * When the model generates a text response, it will return an array of elements.
189
+ *
190
+ * @param element - The schema of the array elements to generate.
191
+ * @param name - Optional name of the output that should be generated. Used by some providers for additional LLM guidance, e.g. via tool or schema name.
192
+ * @param description - Optional description of the output that should be generated. Used by some providers for additional LLM guidance, e.g. via tool or schema description.
193
+ *
194
+ * @returns An output specification for generating an array of elements.
195
+ */
196
+ export const array = <ELEMENT>({
197
+ element: inputElementSchema,
198
+ name,
199
+ description,
200
+ }: {
201
+ element: FlexibleSchema<ELEMENT>;
202
+ /**
203
+ * Optional name of the output that should be generated.
204
+ * Used by some providers for additional LLM guidance, e.g. via tool or schema name.
205
+ */
206
+ name?: string;
207
+ /**
208
+ * Optional description of the output that should be generated.
209
+ * Used by some providers for additional LLM guidance, e.g. via tool or schema description.
210
+ */
211
+ description?: string;
212
+ }): Output<Array<ELEMENT>, Array<ELEMENT>, ELEMENT> => {
213
+ const elementSchema = asSchema(inputElementSchema);
214
+
215
+ return {
216
+ name: 'array',
217
+
218
+ // JSON schema that describes an array of elements:
219
+ responseFormat: resolve(elementSchema.jsonSchema).then(jsonSchema => {
220
+ // remove $schema from schema.jsonSchema:
221
+ const { $schema, ...itemSchema } = jsonSchema;
222
+
223
+ return {
224
+ type: 'json' as const,
225
+ schema: {
226
+ $schema: 'http://json-schema.org/draft-07/schema#',
227
+ type: 'object',
228
+ properties: {
229
+ elements: { type: 'array', items: itemSchema },
230
+ },
231
+ required: ['elements'],
232
+ additionalProperties: false,
233
+ },
234
+ ...(name != null && { name }),
235
+ ...(description != null && { description }),
236
+ };
237
+ }),
238
+
239
+ async parseCompleteOutput(
240
+ { text }: { text: string },
241
+ context: {
242
+ response: LanguageModelResponseMetadata;
243
+ usage: LanguageModelUsage;
244
+ finishReason: FinishReason;
245
+ },
246
+ ) {
247
+ const parseResult = await safeParseJSON({ text });
248
+
249
+ if (!parseResult.success) {
250
+ throw new NoObjectGeneratedError({
251
+ message: 'No object generated: could not parse the response.',
252
+ cause: parseResult.error,
253
+ text,
254
+ response: context.response,
255
+ usage: context.usage,
256
+ finishReason: context.finishReason,
257
+ });
258
+ }
259
+
260
+ const outerValue = parseResult.value;
261
+
262
+ if (
263
+ outerValue == null ||
264
+ typeof outerValue !== 'object' ||
265
+ !('elements' in outerValue) ||
266
+ !Array.isArray(outerValue.elements)
267
+ ) {
268
+ throw new NoObjectGeneratedError({
269
+ message: 'No object generated: response did not match schema.',
270
+ cause: new TypeValidationError({
271
+ value: outerValue,
272
+ cause: 'response must be an object with an elements array',
273
+ }),
274
+ text,
275
+ response: context.response,
276
+ usage: context.usage,
277
+ finishReason: context.finishReason,
278
+ });
279
+ }
280
+
281
+ for (const element of outerValue.elements) {
282
+ const validationResult = await safeValidateTypes({
283
+ value: element,
284
+ schema: elementSchema,
285
+ });
286
+
287
+ if (!validationResult.success) {
288
+ throw new NoObjectGeneratedError({
289
+ message: 'No object generated: response did not match schema.',
290
+ cause: validationResult.error,
291
+ text,
292
+ response: context.response,
293
+ usage: context.usage,
294
+ finishReason: context.finishReason,
295
+ });
296
+ }
297
+ }
298
+
299
+ return outerValue.elements as Array<ELEMENT>;
300
+ },
301
+
302
+ async parsePartialOutput({ text }: { text: string }) {
303
+ const result = await parsePartialJson(text);
304
+
305
+ switch (result.state) {
306
+ case 'failed-parse':
307
+ case 'undefined-input': {
308
+ return undefined;
309
+ }
310
+
311
+ case 'repaired-parse':
312
+ case 'successful-parse': {
313
+ const outerValue = result.value;
314
+
315
+ // no parsable elements array
316
+ if (
317
+ outerValue == null ||
318
+ typeof outerValue !== 'object' ||
319
+ !('elements' in outerValue) ||
320
+ !Array.isArray(outerValue.elements)
321
+ ) {
322
+ return undefined;
323
+ }
324
+
325
+ const rawElements =
326
+ result.state === 'repaired-parse' && outerValue.elements.length > 0
327
+ ? outerValue.elements.slice(0, -1)
328
+ : outerValue.elements;
329
+
330
+ const parsedElements: Array<ELEMENT> = [];
331
+ for (const rawElement of rawElements) {
332
+ const validationResult = await safeValidateTypes({
333
+ value: rawElement,
334
+ schema: elementSchema,
335
+ });
336
+
337
+ if (validationResult.success) {
338
+ parsedElements.push(validationResult.value);
339
+ }
340
+ }
341
+
342
+ return { partial: parsedElements };
343
+ }
344
+ }
345
+ },
346
+
347
+ createElementStreamTransform() {
348
+ let publishedElements = 0;
349
+
350
+ return new TransformStream<
351
+ EnrichedStreamPart<any, Array<ELEMENT>>,
352
+ ELEMENT
353
+ >({
354
+ transform({ partialOutput }, controller) {
355
+ if (partialOutput != null) {
356
+ // Only enqueue new elements that haven't been published yet
357
+ for (
358
+ ;
359
+ publishedElements < partialOutput.length;
360
+ publishedElements++
361
+ ) {
362
+ controller.enqueue(partialOutput[publishedElements]);
363
+ }
364
+ }
365
+ },
366
+ });
367
+ },
368
+ };
369
+ };
370
+
371
+ /**
372
+ * Output specification for choice generation.
373
+ * When the model generates a text response, it will return a one of the choice options.
374
+ *
375
+ * @param options - The available choices.
376
+ * @param name - Optional name of the output that should be generated. Used by some providers for additional LLM guidance, e.g. via tool or schema name.
377
+ * @param description - Optional description of the output that should be generated. Used by some providers for additional LLM guidance, e.g. via tool or schema description.
378
+ *
379
+ * @returns An output specification for generating a choice.
380
+ */
381
+ export const choice = <CHOICE extends string>({
382
+ options: choiceOptions,
383
+ name,
384
+ description,
385
+ }: {
386
+ options: Array<CHOICE>;
387
+ /**
388
+ * Optional name of the output that should be generated.
389
+ * Used by some providers for additional LLM guidance, e.g. via tool or schema name.
390
+ */
391
+ name?: string;
392
+ /**
393
+ * Optional description of the output that should be generated.
394
+ * Used by some providers for additional LLM guidance, e.g. via tool or schema description.
395
+ */
396
+ description?: string;
397
+ }): Output<CHOICE, CHOICE, never> => {
398
+ return {
399
+ name: 'choice',
400
+
401
+ // JSON schema that describes an enumeration:
402
+ responseFormat: Promise.resolve({
403
+ type: 'json',
404
+ schema: {
405
+ $schema: 'http://json-schema.org/draft-07/schema#',
406
+ type: 'object',
407
+ properties: {
408
+ result: { type: 'string', enum: choiceOptions },
409
+ },
410
+ required: ['result'],
411
+ additionalProperties: false,
412
+ },
413
+ ...(name != null && { name }),
414
+ ...(description != null && { description }),
415
+ } as const),
416
+
417
+ async parseCompleteOutput(
418
+ { text }: { text: string },
419
+ context: {
420
+ response: LanguageModelResponseMetadata;
421
+ usage: LanguageModelUsage;
422
+ finishReason: FinishReason;
423
+ },
424
+ ) {
425
+ const parseResult = await safeParseJSON({ text });
426
+
427
+ if (!parseResult.success) {
428
+ throw new NoObjectGeneratedError({
429
+ message: 'No object generated: could not parse the response.',
430
+ cause: parseResult.error,
431
+ text,
432
+ response: context.response,
433
+ usage: context.usage,
434
+ finishReason: context.finishReason,
435
+ });
436
+ }
437
+
438
+ const outerValue = parseResult.value;
439
+
440
+ if (
441
+ outerValue == null ||
442
+ typeof outerValue !== 'object' ||
443
+ !('result' in outerValue) ||
444
+ typeof outerValue.result !== 'string' ||
445
+ !choiceOptions.includes(outerValue.result as any)
446
+ ) {
447
+ throw new NoObjectGeneratedError({
448
+ message: 'No object generated: response did not match schema.',
449
+ cause: new TypeValidationError({
450
+ value: outerValue,
451
+ cause: 'response must be an object that contains a choice value.',
452
+ }),
453
+ text,
454
+ response: context.response,
455
+ usage: context.usage,
456
+ finishReason: context.finishReason,
457
+ });
458
+ }
459
+
460
+ return outerValue.result as CHOICE;
461
+ },
462
+
463
+ async parsePartialOutput({ text }: { text: string }) {
464
+ const result = await parsePartialJson(text);
465
+
466
+ switch (result.state) {
467
+ case 'failed-parse':
468
+ case 'undefined-input': {
469
+ return undefined;
470
+ }
471
+
472
+ case 'repaired-parse':
473
+ case 'successful-parse': {
474
+ const outerValue = result.value;
475
+
476
+ if (
477
+ outerValue == null ||
478
+ typeof outerValue !== 'object' ||
479
+ !('result' in outerValue) ||
480
+ typeof outerValue.result !== 'string'
481
+ ) {
482
+ return undefined;
483
+ }
484
+
485
+ // list of potential matches.
486
+ const potentialMatches = choiceOptions.filter(choiceOption =>
487
+ choiceOption.startsWith(outerValue.result as string),
488
+ );
489
+
490
+ if (result.state === 'successful-parse') {
491
+ // successful parse: exact choice value
492
+ return potentialMatches.includes(outerValue.result as any)
493
+ ? { partial: outerValue.result as CHOICE }
494
+ : undefined;
495
+ } else {
496
+ // repaired parse: only return if not ambiguous
497
+ return potentialMatches.length === 1
498
+ ? { partial: potentialMatches[0] as CHOICE }
499
+ : undefined;
500
+ }
501
+ }
502
+ }
503
+ },
504
+
505
+ createElementStreamTransform() {
506
+ return undefined;
507
+ },
508
+ };
509
+ };
510
+
511
+ /**
512
+ * Output specification for unstructured JSON generation.
513
+ * When the model generates a text response, it will return a JSON object.
514
+ *
515
+ * @param name - Optional name of the output that should be generated. Used by some providers for additional LLM guidance, e.g. via tool or schema name.
516
+ * @param description - Optional description of the output that should be generated. Used by some providers for additional LLM guidance, e.g. via tool or schema description.
517
+ *
518
+ * @returns An output specification for generating JSON.
519
+ */
520
+ export const json = ({
521
+ name,
522
+ description,
523
+ }: {
524
+ /**
525
+ * Optional name of the output that should be generated.
526
+ * Used by some providers for additional LLM guidance, e.g. via tool or schema name.
527
+ */
528
+ name?: string;
529
+ /**
530
+ * Optional description of the output that should be generated.
531
+ * Used by some providers for additional LLM guidance, e.g. via tool or schema description.
532
+ */
533
+ description?: string;
534
+ } = {}): Output<JSONValue, JSONValue, never> => {
535
+ return {
536
+ name: 'json',
537
+
538
+ responseFormat: Promise.resolve({
539
+ type: 'json' as const,
540
+ ...(name != null && { name }),
541
+ ...(description != null && { description }),
542
+ }),
543
+
544
+ async parseCompleteOutput(
545
+ { text }: { text: string },
546
+ context: {
547
+ response: LanguageModelResponseMetadata;
548
+ usage: LanguageModelUsage;
549
+ finishReason: FinishReason;
550
+ },
551
+ ) {
552
+ const parseResult = await safeParseJSON({ text });
553
+
554
+ if (!parseResult.success) {
555
+ throw new NoObjectGeneratedError({
556
+ message: 'No object generated: could not parse the response.',
557
+ cause: parseResult.error,
558
+ text,
559
+ response: context.response,
560
+ usage: context.usage,
561
+ finishReason: context.finishReason,
562
+ });
563
+ }
564
+
565
+ return parseResult.value;
566
+ },
567
+
568
+ async parsePartialOutput({ text }: { text: string }) {
569
+ const result = await parsePartialJson(text);
570
+
571
+ switch (result.state) {
572
+ case 'failed-parse':
573
+ case 'undefined-input': {
574
+ return undefined;
575
+ }
576
+
577
+ case 'repaired-parse':
578
+ case 'successful-parse': {
579
+ return result.value === undefined
580
+ ? undefined
581
+ : { partial: result.value };
582
+ }
583
+ }
584
+ },
585
+
586
+ createElementStreamTransform() {
587
+ return undefined;
588
+ },
589
+ };
590
+ };