ai 6.0.33 → 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 (351) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/index.js +1 -1
  3. package/dist/index.mjs +1 -1
  4. package/dist/internal/index.js +1 -1
  5. package/dist/internal/index.mjs +1 -1
  6. package/docs/02-foundations/03-prompts.mdx +2 -2
  7. package/docs/03-ai-sdk-core/15-tools-and-tool-calling.mdx +1 -1
  8. package/docs/07-reference/01-ai-sdk-core/28-output.mdx +1 -1
  9. package/package.json +6 -4
  10. package/src/agent/agent.ts +116 -0
  11. package/src/agent/create-agent-ui-stream-response.test.ts +258 -0
  12. package/src/agent/create-agent-ui-stream-response.ts +50 -0
  13. package/src/agent/create-agent-ui-stream.ts +73 -0
  14. package/src/agent/index.ts +33 -0
  15. package/src/agent/infer-agent-tools.ts +7 -0
  16. package/src/agent/infer-agent-ui-message.test-d.ts +54 -0
  17. package/src/agent/infer-agent-ui-message.ts +11 -0
  18. package/src/agent/pipe-agent-ui-stream-to-response.ts +52 -0
  19. package/src/agent/tool-loop-agent-on-finish-callback.ts +31 -0
  20. package/src/agent/tool-loop-agent-on-step-finish-callback.ts +11 -0
  21. package/src/agent/tool-loop-agent-settings.ts +182 -0
  22. package/src/agent/tool-loop-agent.test-d.ts +114 -0
  23. package/src/agent/tool-loop-agent.test.ts +442 -0
  24. package/src/agent/tool-loop-agent.ts +114 -0
  25. package/src/embed/__snapshots__/embed-many.test.ts.snap +191 -0
  26. package/src/embed/__snapshots__/embed.test.ts.snap +81 -0
  27. package/src/embed/embed-many-result.ts +53 -0
  28. package/src/embed/embed-many.test.ts +653 -0
  29. package/src/embed/embed-many.ts +378 -0
  30. package/src/embed/embed-result.ts +50 -0
  31. package/src/embed/embed.test.ts +298 -0
  32. package/src/embed/embed.ts +211 -0
  33. package/src/embed/index.ts +4 -0
  34. package/src/error/index.ts +34 -0
  35. package/src/error/invalid-argument-error.ts +34 -0
  36. package/src/error/invalid-stream-part-error.ts +28 -0
  37. package/src/error/invalid-tool-approval-error.ts +26 -0
  38. package/src/error/invalid-tool-input-error.ts +33 -0
  39. package/src/error/no-image-generated-error.ts +39 -0
  40. package/src/error/no-object-generated-error.ts +70 -0
  41. package/src/error/no-output-generated-error.ts +26 -0
  42. package/src/error/no-speech-generated-error.ts +18 -0
  43. package/src/error/no-such-tool-error.ts +35 -0
  44. package/src/error/no-transcript-generated-error.ts +20 -0
  45. package/src/error/tool-call-not-found-for-approval-error.ts +32 -0
  46. package/src/error/tool-call-repair-error.ts +30 -0
  47. package/src/error/unsupported-model-version-error.ts +23 -0
  48. package/src/error/verify-no-object-generated-error.ts +27 -0
  49. package/src/generate-image/generate-image-result.ts +42 -0
  50. package/src/generate-image/generate-image.test.ts +1420 -0
  51. package/src/generate-image/generate-image.ts +360 -0
  52. package/src/generate-image/index.ts +18 -0
  53. package/src/generate-object/__snapshots__/generate-object.test.ts.snap +133 -0
  54. package/src/generate-object/__snapshots__/stream-object.test.ts.snap +297 -0
  55. package/src/generate-object/generate-object-result.ts +67 -0
  56. package/src/generate-object/generate-object.test-d.ts +49 -0
  57. package/src/generate-object/generate-object.test.ts +1191 -0
  58. package/src/generate-object/generate-object.ts +518 -0
  59. package/src/generate-object/index.ts +9 -0
  60. package/src/generate-object/inject-json-instruction.test.ts +181 -0
  61. package/src/generate-object/inject-json-instruction.ts +30 -0
  62. package/src/generate-object/output-strategy.ts +415 -0
  63. package/src/generate-object/parse-and-validate-object-result.ts +111 -0
  64. package/src/generate-object/repair-text.ts +12 -0
  65. package/src/generate-object/stream-object-result.ts +120 -0
  66. package/src/generate-object/stream-object.test-d.ts +74 -0
  67. package/src/generate-object/stream-object.test.ts +1950 -0
  68. package/src/generate-object/stream-object.ts +986 -0
  69. package/src/generate-object/validate-object-generation-input.ts +144 -0
  70. package/src/generate-speech/generate-speech-result.ts +30 -0
  71. package/src/generate-speech/generate-speech.test.ts +300 -0
  72. package/src/generate-speech/generate-speech.ts +190 -0
  73. package/src/generate-speech/generated-audio-file.ts +65 -0
  74. package/src/generate-speech/index.ts +3 -0
  75. package/src/generate-text/__snapshots__/generate-text.test.ts.snap +1872 -0
  76. package/src/generate-text/__snapshots__/stream-text.test.ts.snap +1255 -0
  77. package/src/generate-text/collect-tool-approvals.test.ts +553 -0
  78. package/src/generate-text/collect-tool-approvals.ts +116 -0
  79. package/src/generate-text/content-part.ts +25 -0
  80. package/src/generate-text/execute-tool-call.ts +129 -0
  81. package/src/generate-text/extract-reasoning-content.ts +17 -0
  82. package/src/generate-text/extract-text-content.ts +15 -0
  83. package/src/generate-text/generate-text-result.ts +168 -0
  84. package/src/generate-text/generate-text.test-d.ts +68 -0
  85. package/src/generate-text/generate-text.test.ts +7011 -0
  86. package/src/generate-text/generate-text.ts +1223 -0
  87. package/src/generate-text/generated-file.ts +70 -0
  88. package/src/generate-text/index.ts +57 -0
  89. package/src/generate-text/is-approval-needed.ts +29 -0
  90. package/src/generate-text/output-utils.ts +23 -0
  91. package/src/generate-text/output.test.ts +698 -0
  92. package/src/generate-text/output.ts +590 -0
  93. package/src/generate-text/parse-tool-call.test.ts +570 -0
  94. package/src/generate-text/parse-tool-call.ts +188 -0
  95. package/src/generate-text/prepare-step.ts +103 -0
  96. package/src/generate-text/prune-messages.test.ts +720 -0
  97. package/src/generate-text/prune-messages.ts +167 -0
  98. package/src/generate-text/reasoning-output.ts +20 -0
  99. package/src/generate-text/reasoning.ts +8 -0
  100. package/src/generate-text/response-message.ts +10 -0
  101. package/src/generate-text/run-tools-transformation.test.ts +1143 -0
  102. package/src/generate-text/run-tools-transformation.ts +420 -0
  103. package/src/generate-text/smooth-stream.test.ts +2101 -0
  104. package/src/generate-text/smooth-stream.ts +162 -0
  105. package/src/generate-text/step-result.ts +238 -0
  106. package/src/generate-text/stop-condition.ts +29 -0
  107. package/src/generate-text/stream-text-result.ts +463 -0
  108. package/src/generate-text/stream-text.test-d.ts +200 -0
  109. package/src/generate-text/stream-text.test.ts +19979 -0
  110. package/src/generate-text/stream-text.ts +2505 -0
  111. package/src/generate-text/to-response-messages.test.ts +922 -0
  112. package/src/generate-text/to-response-messages.ts +163 -0
  113. package/src/generate-text/tool-approval-request-output.ts +21 -0
  114. package/src/generate-text/tool-call-repair-function.ts +27 -0
  115. package/src/generate-text/tool-call.ts +47 -0
  116. package/src/generate-text/tool-error.ts +34 -0
  117. package/src/generate-text/tool-output-denied.ts +21 -0
  118. package/src/generate-text/tool-output.ts +7 -0
  119. package/src/generate-text/tool-result.ts +36 -0
  120. package/src/generate-text/tool-set.ts +14 -0
  121. package/src/global.ts +24 -0
  122. package/src/index.ts +50 -0
  123. package/src/logger/index.ts +6 -0
  124. package/src/logger/log-warnings.test.ts +351 -0
  125. package/src/logger/log-warnings.ts +119 -0
  126. package/src/middleware/__snapshots__/simulate-streaming-middleware.test.ts.snap +64 -0
  127. package/src/middleware/add-tool-input-examples-middleware.test.ts +476 -0
  128. package/src/middleware/add-tool-input-examples-middleware.ts +90 -0
  129. package/src/middleware/default-embedding-settings-middleware.test.ts +126 -0
  130. package/src/middleware/default-embedding-settings-middleware.ts +22 -0
  131. package/src/middleware/default-settings-middleware.test.ts +388 -0
  132. package/src/middleware/default-settings-middleware.ts +33 -0
  133. package/src/middleware/extract-json-middleware.test.ts +827 -0
  134. package/src/middleware/extract-json-middleware.ts +197 -0
  135. package/src/middleware/extract-reasoning-middleware.test.ts +1028 -0
  136. package/src/middleware/extract-reasoning-middleware.ts +238 -0
  137. package/src/middleware/index.ts +10 -0
  138. package/src/middleware/simulate-streaming-middleware.test.ts +911 -0
  139. package/src/middleware/simulate-streaming-middleware.ts +79 -0
  140. package/src/middleware/wrap-embedding-model.test.ts +358 -0
  141. package/src/middleware/wrap-embedding-model.ts +86 -0
  142. package/src/middleware/wrap-image-model.test.ts +423 -0
  143. package/src/middleware/wrap-image-model.ts +85 -0
  144. package/src/middleware/wrap-language-model.test.ts +518 -0
  145. package/src/middleware/wrap-language-model.ts +104 -0
  146. package/src/middleware/wrap-provider.test.ts +120 -0
  147. package/src/middleware/wrap-provider.ts +51 -0
  148. package/src/model/as-embedding-model-v3.test.ts +319 -0
  149. package/src/model/as-embedding-model-v3.ts +24 -0
  150. package/src/model/as-image-model-v3.test.ts +409 -0
  151. package/src/model/as-image-model-v3.ts +24 -0
  152. package/src/model/as-language-model-v3.test.ts +508 -0
  153. package/src/model/as-language-model-v3.ts +103 -0
  154. package/src/model/as-provider-v3.ts +36 -0
  155. package/src/model/as-speech-model-v3.test.ts +356 -0
  156. package/src/model/as-speech-model-v3.ts +24 -0
  157. package/src/model/as-transcription-model-v3.test.ts +529 -0
  158. package/src/model/as-transcription-model-v3.ts +24 -0
  159. package/src/model/resolve-model.test.ts +244 -0
  160. package/src/model/resolve-model.ts +126 -0
  161. package/src/prompt/call-settings.ts +148 -0
  162. package/src/prompt/content-part.ts +209 -0
  163. package/src/prompt/convert-to-language-model-prompt.test.ts +2018 -0
  164. package/src/prompt/convert-to-language-model-prompt.ts +442 -0
  165. package/src/prompt/create-tool-model-output.test.ts +508 -0
  166. package/src/prompt/create-tool-model-output.ts +34 -0
  167. package/src/prompt/data-content.test.ts +15 -0
  168. package/src/prompt/data-content.ts +134 -0
  169. package/src/prompt/index.ts +27 -0
  170. package/src/prompt/invalid-data-content-error.ts +29 -0
  171. package/src/prompt/invalid-message-role-error.ts +27 -0
  172. package/src/prompt/message-conversion-error.ts +28 -0
  173. package/src/prompt/message.ts +68 -0
  174. package/src/prompt/prepare-call-settings.test.ts +159 -0
  175. package/src/prompt/prepare-call-settings.ts +108 -0
  176. package/src/prompt/prepare-tools-and-tool-choice.test.ts +461 -0
  177. package/src/prompt/prepare-tools-and-tool-choice.ts +86 -0
  178. package/src/prompt/prompt.ts +43 -0
  179. package/src/prompt/split-data-url.ts +17 -0
  180. package/src/prompt/standardize-prompt.test.ts +82 -0
  181. package/src/prompt/standardize-prompt.ts +99 -0
  182. package/src/prompt/wrap-gateway-error.ts +29 -0
  183. package/src/registry/custom-provider.test.ts +211 -0
  184. package/src/registry/custom-provider.ts +155 -0
  185. package/src/registry/index.ts +7 -0
  186. package/src/registry/no-such-provider-error.ts +41 -0
  187. package/src/registry/provider-registry.test.ts +691 -0
  188. package/src/registry/provider-registry.ts +328 -0
  189. package/src/rerank/index.ts +2 -0
  190. package/src/rerank/rerank-result.ts +70 -0
  191. package/src/rerank/rerank.test.ts +516 -0
  192. package/src/rerank/rerank.ts +237 -0
  193. package/src/telemetry/assemble-operation-name.ts +21 -0
  194. package/src/telemetry/get-base-telemetry-attributes.ts +53 -0
  195. package/src/telemetry/get-tracer.ts +20 -0
  196. package/src/telemetry/noop-tracer.ts +69 -0
  197. package/src/telemetry/record-span.ts +63 -0
  198. package/src/telemetry/select-telemetry-attributes.ts +78 -0
  199. package/src/telemetry/select-temetry-attributes.test.ts +114 -0
  200. package/src/telemetry/stringify-for-telemetry.test.ts +114 -0
  201. package/src/telemetry/stringify-for-telemetry.ts +33 -0
  202. package/src/telemetry/telemetry-settings.ts +44 -0
  203. package/src/test/mock-embedding-model-v2.ts +35 -0
  204. package/src/test/mock-embedding-model-v3.ts +48 -0
  205. package/src/test/mock-image-model-v2.ts +28 -0
  206. package/src/test/mock-image-model-v3.ts +28 -0
  207. package/src/test/mock-language-model-v2.ts +72 -0
  208. package/src/test/mock-language-model-v3.ts +77 -0
  209. package/src/test/mock-provider-v2.ts +68 -0
  210. package/src/test/mock-provider-v3.ts +80 -0
  211. package/src/test/mock-reranking-model-v3.ts +25 -0
  212. package/src/test/mock-server-response.ts +69 -0
  213. package/src/test/mock-speech-model-v2.ts +24 -0
  214. package/src/test/mock-speech-model-v3.ts +24 -0
  215. package/src/test/mock-tracer.ts +156 -0
  216. package/src/test/mock-transcription-model-v2.ts +24 -0
  217. package/src/test/mock-transcription-model-v3.ts +24 -0
  218. package/src/test/mock-values.ts +4 -0
  219. package/src/test/not-implemented.ts +3 -0
  220. package/src/text-stream/create-text-stream-response.test.ts +38 -0
  221. package/src/text-stream/create-text-stream-response.ts +18 -0
  222. package/src/text-stream/index.ts +2 -0
  223. package/src/text-stream/pipe-text-stream-to-response.test.ts +38 -0
  224. package/src/text-stream/pipe-text-stream-to-response.ts +26 -0
  225. package/src/transcribe/index.ts +2 -0
  226. package/src/transcribe/transcribe-result.ts +60 -0
  227. package/src/transcribe/transcribe.test.ts +313 -0
  228. package/src/transcribe/transcribe.ts +173 -0
  229. package/src/types/embedding-model-middleware.ts +3 -0
  230. package/src/types/embedding-model.ts +18 -0
  231. package/src/types/image-model-middleware.ts +3 -0
  232. package/src/types/image-model-response-metadata.ts +16 -0
  233. package/src/types/image-model.ts +19 -0
  234. package/src/types/index.ts +29 -0
  235. package/src/types/json-value.ts +15 -0
  236. package/src/types/language-model-middleware.ts +3 -0
  237. package/src/types/language-model-request-metadata.ts +6 -0
  238. package/src/types/language-model-response-metadata.ts +21 -0
  239. package/src/types/language-model.ts +104 -0
  240. package/src/types/provider-metadata.ts +16 -0
  241. package/src/types/provider.ts +55 -0
  242. package/src/types/reranking-model.ts +6 -0
  243. package/src/types/speech-model-response-metadata.ts +21 -0
  244. package/src/types/speech-model.ts +6 -0
  245. package/src/types/transcription-model-response-metadata.ts +16 -0
  246. package/src/types/transcription-model.ts +9 -0
  247. package/src/types/usage.ts +200 -0
  248. package/src/types/warning.ts +7 -0
  249. package/src/ui/__snapshots__/append-response-messages.test.ts.snap +416 -0
  250. package/src/ui/__snapshots__/convert-to-model-messages.test.ts.snap +419 -0
  251. package/src/ui/__snapshots__/process-chat-text-response.test.ts.snap +142 -0
  252. package/src/ui/call-completion-api.ts +157 -0
  253. package/src/ui/chat-transport.ts +83 -0
  254. package/src/ui/chat.test-d.ts +233 -0
  255. package/src/ui/chat.test.ts +2695 -0
  256. package/src/ui/chat.ts +716 -0
  257. package/src/ui/convert-file-list-to-file-ui-parts.ts +36 -0
  258. package/src/ui/convert-to-model-messages.test.ts +2775 -0
  259. package/src/ui/convert-to-model-messages.ts +373 -0
  260. package/src/ui/default-chat-transport.ts +36 -0
  261. package/src/ui/direct-chat-transport.test.ts +446 -0
  262. package/src/ui/direct-chat-transport.ts +118 -0
  263. package/src/ui/http-chat-transport.test.ts +185 -0
  264. package/src/ui/http-chat-transport.ts +292 -0
  265. package/src/ui/index.ts +71 -0
  266. package/src/ui/last-assistant-message-is-complete-with-approval-responses.ts +44 -0
  267. package/src/ui/last-assistant-message-is-complete-with-tool-calls.test.ts +371 -0
  268. package/src/ui/last-assistant-message-is-complete-with-tool-calls.ts +39 -0
  269. package/src/ui/process-text-stream.test.ts +38 -0
  270. package/src/ui/process-text-stream.ts +16 -0
  271. package/src/ui/process-ui-message-stream.test.ts +8052 -0
  272. package/src/ui/process-ui-message-stream.ts +713 -0
  273. package/src/ui/text-stream-chat-transport.ts +23 -0
  274. package/src/ui/transform-text-to-ui-message-stream.test.ts +124 -0
  275. package/src/ui/transform-text-to-ui-message-stream.ts +27 -0
  276. package/src/ui/ui-messages.test.ts +48 -0
  277. package/src/ui/ui-messages.ts +534 -0
  278. package/src/ui/use-completion.ts +84 -0
  279. package/src/ui/validate-ui-messages.test.ts +1428 -0
  280. package/src/ui/validate-ui-messages.ts +476 -0
  281. package/src/ui-message-stream/create-ui-message-stream-response.test.ts +266 -0
  282. package/src/ui-message-stream/create-ui-message-stream-response.ts +32 -0
  283. package/src/ui-message-stream/create-ui-message-stream.test.ts +639 -0
  284. package/src/ui-message-stream/create-ui-message-stream.ts +124 -0
  285. package/src/ui-message-stream/get-response-ui-message-id.test.ts +55 -0
  286. package/src/ui-message-stream/get-response-ui-message-id.ts +24 -0
  287. package/src/ui-message-stream/handle-ui-message-stream-finish.test.ts +429 -0
  288. package/src/ui-message-stream/handle-ui-message-stream-finish.ts +135 -0
  289. package/src/ui-message-stream/index.ts +13 -0
  290. package/src/ui-message-stream/json-to-sse-transform-stream.ts +12 -0
  291. package/src/ui-message-stream/pipe-ui-message-stream-to-response.test.ts +90 -0
  292. package/src/ui-message-stream/pipe-ui-message-stream-to-response.ts +40 -0
  293. package/src/ui-message-stream/read-ui-message-stream.test.ts +122 -0
  294. package/src/ui-message-stream/read-ui-message-stream.ts +87 -0
  295. package/src/ui-message-stream/ui-message-chunks.test-d.ts +18 -0
  296. package/src/ui-message-stream/ui-message-chunks.ts +344 -0
  297. package/src/ui-message-stream/ui-message-stream-headers.ts +7 -0
  298. package/src/ui-message-stream/ui-message-stream-on-finish-callback.ts +32 -0
  299. package/src/ui-message-stream/ui-message-stream-response-init.ts +5 -0
  300. package/src/ui-message-stream/ui-message-stream-writer.ts +24 -0
  301. package/src/util/as-array.ts +3 -0
  302. package/src/util/async-iterable-stream.test.ts +241 -0
  303. package/src/util/async-iterable-stream.ts +94 -0
  304. package/src/util/consume-stream.ts +29 -0
  305. package/src/util/cosine-similarity.test.ts +57 -0
  306. package/src/util/cosine-similarity.ts +47 -0
  307. package/src/util/create-resolvable-promise.ts +30 -0
  308. package/src/util/create-stitchable-stream.test.ts +239 -0
  309. package/src/util/create-stitchable-stream.ts +112 -0
  310. package/src/util/data-url.ts +17 -0
  311. package/src/util/deep-partial.ts +84 -0
  312. package/src/util/detect-media-type.test.ts +670 -0
  313. package/src/util/detect-media-type.ts +184 -0
  314. package/src/util/download/download-function.ts +45 -0
  315. package/src/util/download/download.test.ts +69 -0
  316. package/src/util/download/download.ts +46 -0
  317. package/src/util/error-handler.ts +1 -0
  318. package/src/util/fix-json.test.ts +279 -0
  319. package/src/util/fix-json.ts +401 -0
  320. package/src/util/get-potential-start-index.test.ts +34 -0
  321. package/src/util/get-potential-start-index.ts +30 -0
  322. package/src/util/index.ts +11 -0
  323. package/src/util/is-deep-equal-data.test.ts +119 -0
  324. package/src/util/is-deep-equal-data.ts +48 -0
  325. package/src/util/is-non-empty-object.ts +5 -0
  326. package/src/util/job.ts +1 -0
  327. package/src/util/log-v2-compatibility-warning.ts +21 -0
  328. package/src/util/merge-abort-signals.test.ts +155 -0
  329. package/src/util/merge-abort-signals.ts +43 -0
  330. package/src/util/merge-objects.test.ts +118 -0
  331. package/src/util/merge-objects.ts +79 -0
  332. package/src/util/now.ts +4 -0
  333. package/src/util/parse-partial-json.test.ts +80 -0
  334. package/src/util/parse-partial-json.ts +30 -0
  335. package/src/util/prepare-headers.test.ts +51 -0
  336. package/src/util/prepare-headers.ts +14 -0
  337. package/src/util/prepare-retries.test.ts +10 -0
  338. package/src/util/prepare-retries.ts +47 -0
  339. package/src/util/retry-error.ts +41 -0
  340. package/src/util/retry-with-exponential-backoff.test.ts +446 -0
  341. package/src/util/retry-with-exponential-backoff.ts +154 -0
  342. package/src/util/serial-job-executor.test.ts +162 -0
  343. package/src/util/serial-job-executor.ts +36 -0
  344. package/src/util/simulate-readable-stream.test.ts +98 -0
  345. package/src/util/simulate-readable-stream.ts +39 -0
  346. package/src/util/split-array.test.ts +60 -0
  347. package/src/util/split-array.ts +20 -0
  348. package/src/util/value-of.ts +65 -0
  349. package/src/util/write-to-server-response.test.ts +266 -0
  350. package/src/util/write-to-server-response.ts +49 -0
  351. package/src/version.ts +5 -0
@@ -0,0 +1,69 @@
1
+ import { EventEmitter } from 'node:events';
2
+ import { ServerResponse } from 'node:http';
3
+
4
+ class MockServerResponse extends EventEmitter {
5
+ writtenChunks: any[] = [];
6
+ headers: Record<string, string> = {};
7
+ statusCode = 0;
8
+ statusMessage = '';
9
+ ended = false;
10
+
11
+ write(chunk: any): boolean {
12
+ this.writtenChunks.push(chunk);
13
+ return true;
14
+ }
15
+
16
+ end(): void {
17
+ this.ended = true;
18
+ }
19
+
20
+ writeHead(
21
+ statusCode: number,
22
+ arg2: string | Record<string, string>,
23
+ arg3?: Record<string, string>,
24
+ ): void {
25
+ this.statusCode = statusCode;
26
+
27
+ if (typeof arg2 === 'string') {
28
+ this.statusMessage = arg2;
29
+ this.headers = arg3 ?? {};
30
+ } else {
31
+ this.statusMessage = '';
32
+ this.headers = arg2;
33
+ }
34
+ }
35
+
36
+ get body() {
37
+ // Combine all written chunks into a single string
38
+ return this.writtenChunks.join('');
39
+ }
40
+
41
+ /**
42
+ * Get the decoded chunks as strings.
43
+ */
44
+ getDecodedChunks() {
45
+ const decoder = new TextDecoder();
46
+ return this.writtenChunks.map(chunk => decoder.decode(chunk));
47
+ }
48
+
49
+ /**
50
+ * Wait for the stream to finish writing to the mock response.
51
+ */
52
+ async waitForEnd() {
53
+ await new Promise(resolve => {
54
+ const checkIfEnded = () => {
55
+ if (this.ended) {
56
+ resolve(undefined);
57
+ } else {
58
+ setImmediate(checkIfEnded);
59
+ }
60
+ };
61
+ checkIfEnded();
62
+ });
63
+ }
64
+ }
65
+
66
+ export function createMockServerResponse(): ServerResponse &
67
+ MockServerResponse {
68
+ return new MockServerResponse() as ServerResponse & MockServerResponse;
69
+ }
@@ -0,0 +1,24 @@
1
+ import { SpeechModelV2 } from '@ai-sdk/provider';
2
+ import { notImplemented } from './not-implemented';
3
+
4
+ export class MockSpeechModelV2 implements SpeechModelV2 {
5
+ readonly specificationVersion = 'v2';
6
+ readonly provider: SpeechModelV2['provider'];
7
+ readonly modelId: SpeechModelV2['modelId'];
8
+
9
+ doGenerate: SpeechModelV2['doGenerate'];
10
+
11
+ constructor({
12
+ provider = 'mock-provider',
13
+ modelId = 'mock-model-id',
14
+ doGenerate = notImplemented,
15
+ }: {
16
+ provider?: SpeechModelV2['provider'];
17
+ modelId?: SpeechModelV2['modelId'];
18
+ doGenerate?: SpeechModelV2['doGenerate'];
19
+ } = {}) {
20
+ this.provider = provider;
21
+ this.modelId = modelId;
22
+ this.doGenerate = doGenerate;
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ import { SpeechModelV3 } from '@ai-sdk/provider';
2
+ import { notImplemented } from './not-implemented';
3
+
4
+ export class MockSpeechModelV3 implements SpeechModelV3 {
5
+ readonly specificationVersion = 'v3';
6
+ readonly provider: SpeechModelV3['provider'];
7
+ readonly modelId: SpeechModelV3['modelId'];
8
+
9
+ doGenerate: SpeechModelV3['doGenerate'];
10
+
11
+ constructor({
12
+ provider = 'mock-provider',
13
+ modelId = 'mock-model-id',
14
+ doGenerate = notImplemented,
15
+ }: {
16
+ provider?: SpeechModelV3['provider'];
17
+ modelId?: SpeechModelV3['modelId'];
18
+ doGenerate?: SpeechModelV3['doGenerate'];
19
+ } = {}) {
20
+ this.provider = provider;
21
+ this.modelId = modelId;
22
+ this.doGenerate = doGenerate;
23
+ }
24
+ }
@@ -0,0 +1,156 @@
1
+ import {
2
+ AttributeValue,
3
+ Attributes,
4
+ Context,
5
+ Exception,
6
+ Span,
7
+ SpanContext,
8
+ SpanOptions,
9
+ SpanStatus,
10
+ TimeInput,
11
+ Tracer,
12
+ } from '@opentelemetry/api';
13
+
14
+ export class MockTracer implements Tracer {
15
+ spans: MockSpan[] = [];
16
+
17
+ get jsonSpans() {
18
+ return this.spans.map(span => ({
19
+ name: span.name,
20
+ attributes: span.attributes,
21
+ events: span.events,
22
+ ...(span.status && { status: span.status }),
23
+ }));
24
+ }
25
+
26
+ startSpan(name: string, options?: SpanOptions, context?: Context): Span {
27
+ const span = new MockSpan({
28
+ name,
29
+ options,
30
+ context,
31
+ });
32
+ this.spans.push(span);
33
+ return span;
34
+ }
35
+
36
+ startActiveSpan<F extends (span: Span) => unknown>(
37
+ name: string,
38
+ arg1: unknown,
39
+ arg2?: unknown,
40
+ arg3?: F,
41
+ ): ReturnType<any> {
42
+ if (typeof arg1 === 'function') {
43
+ const span = new MockSpan({
44
+ name,
45
+ });
46
+ this.spans.push(span);
47
+ return arg1(span);
48
+ }
49
+ if (typeof arg2 === 'function') {
50
+ const span = new MockSpan({
51
+ name,
52
+ options: arg1 as SpanOptions,
53
+ });
54
+ this.spans.push(span);
55
+ return arg2(span);
56
+ }
57
+ if (typeof arg3 === 'function') {
58
+ const span = new MockSpan({
59
+ name,
60
+ options: arg1 as SpanOptions,
61
+ context: arg2 as Context,
62
+ });
63
+ this.spans.push(span);
64
+ return arg3(span);
65
+ }
66
+ }
67
+ }
68
+
69
+ class MockSpan implements Span {
70
+ name: string;
71
+ context?: Context;
72
+ options?: SpanOptions;
73
+ attributes: Attributes;
74
+ events: Array<{
75
+ name: string;
76
+ attributes: Attributes | undefined;
77
+ time?: [number, number];
78
+ }> = [];
79
+ status?: SpanStatus;
80
+
81
+ readonly _spanContext: SpanContext = new MockSpanContext();
82
+
83
+ constructor({
84
+ name,
85
+ options,
86
+ context,
87
+ }: {
88
+ name: string;
89
+ options?: SpanOptions;
90
+ context?: Context;
91
+ }) {
92
+ this.name = name;
93
+ this.context = context;
94
+ this.options = options;
95
+ this.attributes = options?.attributes ?? {};
96
+ }
97
+
98
+ spanContext(): SpanContext {
99
+ return this._spanContext;
100
+ }
101
+
102
+ setAttribute(key: string, value: AttributeValue): this {
103
+ this.attributes = { ...this.attributes, [key]: value };
104
+ return this;
105
+ }
106
+
107
+ setAttributes(attributes: Attributes): this {
108
+ this.attributes = { ...this.attributes, ...attributes };
109
+ return this;
110
+ }
111
+
112
+ addEvent(name: string, attributes?: Attributes): this {
113
+ this.events.push({ name, attributes });
114
+ return this;
115
+ }
116
+
117
+ addLink() {
118
+ return this;
119
+ }
120
+ addLinks() {
121
+ return this;
122
+ }
123
+ setStatus(status: SpanStatus) {
124
+ this.status = status;
125
+ return this;
126
+ }
127
+ updateName() {
128
+ return this;
129
+ }
130
+ end() {
131
+ return this;
132
+ }
133
+ isRecording() {
134
+ return false;
135
+ }
136
+ recordException(exception: Exception, time?: TimeInput) {
137
+ const error =
138
+ typeof exception === 'string' ? new Error(exception) : exception;
139
+ this.events.push({
140
+ name: 'exception',
141
+ attributes: {
142
+ 'exception.type': error.constructor?.name || 'Error',
143
+ 'exception.name': error.name || 'Error',
144
+ 'exception.message': error.message || '',
145
+ 'exception.stack': error.stack || '',
146
+ },
147
+ time: Array.isArray(time) ? time : [0, 0],
148
+ });
149
+ }
150
+ }
151
+
152
+ class MockSpanContext implements SpanContext {
153
+ traceId = 'test-trace-id';
154
+ spanId = 'test-span-id';
155
+ traceFlags = 0;
156
+ }
@@ -0,0 +1,24 @@
1
+ import { TranscriptionModelV2 } from '@ai-sdk/provider';
2
+ import { notImplemented } from './not-implemented';
3
+
4
+ export class MockTranscriptionModelV2 implements TranscriptionModelV2 {
5
+ readonly specificationVersion = 'v2';
6
+ readonly provider: TranscriptionModelV2['provider'];
7
+ readonly modelId: TranscriptionModelV2['modelId'];
8
+
9
+ doGenerate: TranscriptionModelV2['doGenerate'];
10
+
11
+ constructor({
12
+ provider = 'mock-provider',
13
+ modelId = 'mock-model-id',
14
+ doGenerate = notImplemented,
15
+ }: {
16
+ provider?: TranscriptionModelV2['provider'];
17
+ modelId?: TranscriptionModelV2['modelId'];
18
+ doGenerate?: TranscriptionModelV2['doGenerate'];
19
+ } = {}) {
20
+ this.provider = provider;
21
+ this.modelId = modelId;
22
+ this.doGenerate = doGenerate;
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ import { TranscriptionModelV3 } from '@ai-sdk/provider';
2
+ import { notImplemented } from './not-implemented';
3
+
4
+ export class MockTranscriptionModelV3 implements TranscriptionModelV3 {
5
+ readonly specificationVersion = 'v3';
6
+ readonly provider: TranscriptionModelV3['provider'];
7
+ readonly modelId: TranscriptionModelV3['modelId'];
8
+
9
+ doGenerate: TranscriptionModelV3['doGenerate'];
10
+
11
+ constructor({
12
+ provider = 'mock-provider',
13
+ modelId = 'mock-model-id',
14
+ doGenerate = notImplemented,
15
+ }: {
16
+ provider?: TranscriptionModelV3['provider'];
17
+ modelId?: TranscriptionModelV3['modelId'];
18
+ doGenerate?: TranscriptionModelV3['doGenerate'];
19
+ } = {}) {
20
+ this.provider = provider;
21
+ this.modelId = modelId;
22
+ this.doGenerate = doGenerate;
23
+ }
24
+ }
@@ -0,0 +1,4 @@
1
+ export function mockValues<T>(...values: T[]): () => T {
2
+ let counter = 0;
3
+ return () => values[counter++] ?? values[values.length - 1];
4
+ }
@@ -0,0 +1,3 @@
1
+ export function notImplemented(): never {
2
+ throw new Error('Not implemented');
3
+ }
@@ -0,0 +1,38 @@
1
+ import {
2
+ convertArrayToReadableStream,
3
+ convertReadableStreamToArray,
4
+ } from '@ai-sdk/provider-utils/test';
5
+ import { createTextStreamResponse } from './create-text-stream-response';
6
+ import { describe, it, expect } from 'vitest';
7
+
8
+ describe('createTextStreamResponse', () => {
9
+ it('should create a Response with correct headers and encoded stream', async () => {
10
+ const response = createTextStreamResponse({
11
+ status: 200,
12
+ statusText: 'OK',
13
+ headers: {
14
+ 'Custom-Header': 'test',
15
+ },
16
+ textStream: convertArrayToReadableStream(['test-data']),
17
+ });
18
+
19
+ // Verify response properties
20
+ expect(response).toBeInstanceOf(Response);
21
+ expect(response.status).toBe(200);
22
+ expect(response.statusText).toBe('OK');
23
+
24
+ // Verify headers
25
+ expect(response.headers.get('Content-Type')).toBe(
26
+ 'text/plain; charset=utf-8',
27
+ );
28
+ expect(response.headers.get('Custom-Header')).toBe('test');
29
+
30
+ // Verify encoded stream content
31
+ const decoder = new TextDecoder();
32
+ const encodedStream = response.body!;
33
+ const chunks = await convertReadableStreamToArray(encodedStream);
34
+ const decodedChunks = chunks.map(chunk => decoder.decode(chunk));
35
+
36
+ expect(decodedChunks).toEqual(['test-data']);
37
+ });
38
+ });
@@ -0,0 +1,18 @@
1
+ import { prepareHeaders } from '../util/prepare-headers';
2
+
3
+ export function createTextStreamResponse({
4
+ status,
5
+ statusText,
6
+ headers,
7
+ textStream,
8
+ }: ResponseInit & {
9
+ textStream: ReadableStream<string>;
10
+ }): Response {
11
+ return new Response(textStream.pipeThrough(new TextEncoderStream()), {
12
+ status: status ?? 200,
13
+ statusText,
14
+ headers: prepareHeaders(headers, {
15
+ 'content-type': 'text/plain; charset=utf-8',
16
+ }),
17
+ });
18
+ }
@@ -0,0 +1,2 @@
1
+ export { createTextStreamResponse } from './create-text-stream-response';
2
+ export { pipeTextStreamToResponse } from './pipe-text-stream-to-response';
@@ -0,0 +1,38 @@
1
+ import { convertArrayToReadableStream } from '@ai-sdk/provider-utils/test';
2
+ import { createMockServerResponse } from '../test/mock-server-response';
3
+ import { pipeTextStreamToResponse } from './pipe-text-stream-to-response';
4
+ import { describe, it, expect } from 'vitest';
5
+
6
+ describe('pipeTextStreamToResponse', () => {
7
+ it('should write to ServerResponse with correct headers and encoded stream', async () => {
8
+ const mockResponse = createMockServerResponse();
9
+
10
+ pipeTextStreamToResponse({
11
+ response: mockResponse,
12
+ status: 200,
13
+ statusText: 'OK',
14
+ headers: {
15
+ 'Custom-Header': 'test',
16
+ },
17
+ textStream: convertArrayToReadableStream(['test-data']),
18
+ });
19
+
20
+ // Wait for the stream to finish writing
21
+ await mockResponse.waitForEnd();
22
+
23
+ // Verify response properties
24
+ expect(mockResponse.statusCode).toBe(200);
25
+ expect(mockResponse.statusMessage).toBe('OK');
26
+
27
+ // Verify headers
28
+ expect(mockResponse.headers).toMatchInlineSnapshot(`
29
+ {
30
+ "content-type": "text/plain; charset=utf-8",
31
+ "custom-header": "test",
32
+ }
33
+ `);
34
+
35
+ // Verify written data using decoded chunks
36
+ expect(mockResponse.getDecodedChunks()).toStrictEqual(['test-data']);
37
+ });
38
+ });
@@ -0,0 +1,26 @@
1
+ import { ServerResponse } from 'node:http';
2
+ import { prepareHeaders } from '../util/prepare-headers';
3
+ import { writeToServerResponse } from '../util/write-to-server-response';
4
+
5
+ export function pipeTextStreamToResponse({
6
+ response,
7
+ status,
8
+ statusText,
9
+ headers,
10
+ textStream,
11
+ }: {
12
+ response: ServerResponse;
13
+ textStream: ReadableStream<string>;
14
+ } & ResponseInit): void {
15
+ writeToServerResponse({
16
+ response,
17
+ status,
18
+ statusText,
19
+ headers: Object.fromEntries(
20
+ prepareHeaders(headers, {
21
+ 'content-type': 'text/plain; charset=utf-8',
22
+ }).entries(),
23
+ ),
24
+ stream: textStream.pipeThrough(new TextEncoderStream()),
25
+ });
26
+ }
@@ -0,0 +1,2 @@
1
+ export { transcribe as experimental_transcribe } from './transcribe';
2
+ export type { TranscriptionResult as Experimental_TranscriptionResult } from './transcribe-result';
@@ -0,0 +1,60 @@
1
+ import { JSONObject } from '@ai-sdk/provider';
2
+ import { TranscriptionModelResponseMetadata } from '../types/transcription-model-response-metadata';
3
+ import { Warning } from '../types/warning';
4
+
5
+ /**
6
+ The result of a `transcribe` call.
7
+ It contains the transcript and additional information.
8
+ */
9
+ export interface TranscriptionResult {
10
+ /**
11
+ * The complete transcribed text from the audio.
12
+ */
13
+ readonly text: string;
14
+
15
+ /**
16
+ * Array of transcript segments with timing information.
17
+ * Each segment represents a portion of the transcribed text with start and end times.
18
+ */
19
+ readonly segments: Array<{
20
+ /**
21
+ * The text content of this segment.
22
+ */
23
+ readonly text: string;
24
+ /**
25
+ * The start time of this segment in seconds.
26
+ */
27
+ readonly startSecond: number;
28
+ /**
29
+ * The end time of this segment in seconds.
30
+ */
31
+ readonly endSecond: number;
32
+ }>;
33
+
34
+ /**
35
+ * The detected language of the audio content, as an ISO-639-1 code (e.g., 'en' for English).
36
+ * May be undefined if the language couldn't be detected.
37
+ */
38
+ readonly language: string | undefined;
39
+
40
+ /**
41
+ * The total duration of the audio file in seconds.
42
+ * May be undefined if the duration couldn't be determined.
43
+ */
44
+ readonly durationInSeconds: number | undefined;
45
+
46
+ /**
47
+ Warnings for the call, e.g. unsupported settings.
48
+ */
49
+ readonly warnings: Array<Warning>;
50
+
51
+ /**
52
+ Response metadata from the provider. There may be multiple responses if we made multiple calls to the model.
53
+ */
54
+ readonly responses: Array<TranscriptionModelResponseMetadata>;
55
+
56
+ /**
57
+ Provider metadata from the provider.
58
+ */
59
+ readonly providerMetadata: Record<string, JSONObject>;
60
+ }