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,378 @@
1
+ import { ProviderOptions, withUserAgentSuffix } from '@ai-sdk/provider-utils';
2
+ import { logWarnings } from '../logger/log-warnings';
3
+ import { resolveEmbeddingModel } from '../model/resolve-model';
4
+ import { assembleOperationName } from '../telemetry/assemble-operation-name';
5
+ import { getBaseTelemetryAttributes } from '../telemetry/get-base-telemetry-attributes';
6
+ import { getTracer } from '../telemetry/get-tracer';
7
+ import { recordSpan } from '../telemetry/record-span';
8
+ import { selectTelemetryAttributes } from '../telemetry/select-telemetry-attributes';
9
+ import { TelemetrySettings } from '../telemetry/telemetry-settings';
10
+ import { Embedding, EmbeddingModel, ProviderMetadata } from '../types';
11
+ import { Warning } from '../types/warning';
12
+ import { prepareRetries } from '../util/prepare-retries';
13
+ import { splitArray } from '../util/split-array';
14
+ import { EmbedManyResult } from './embed-many-result';
15
+ import { VERSION } from '../version';
16
+
17
+ /**
18
+ Embed several values using an embedding model. The type of the value is defined
19
+ by the embedding model.
20
+
21
+ `embedMany` automatically splits large requests into smaller chunks if the model
22
+ has a limit on how many embeddings can be generated in a single call.
23
+
24
+ @param model - The embedding model to use.
25
+ @param values - The values that should be embedded.
26
+
27
+ @param maxRetries - Maximum number of retries. Set to 0 to disable retries. Default: 2.
28
+ @param abortSignal - An optional abort signal that can be used to cancel the call.
29
+ @param headers - Additional HTTP headers to be sent with the request. Only applicable for HTTP-based providers.
30
+
31
+ @returns A result object that contains the embeddings, the value, and additional information.
32
+ */
33
+ export async function embedMany({
34
+ model: modelArg,
35
+ values,
36
+ maxParallelCalls = Infinity,
37
+ maxRetries: maxRetriesArg,
38
+ abortSignal,
39
+ headers,
40
+ providerOptions,
41
+ experimental_telemetry: telemetry,
42
+ }: {
43
+ /**
44
+ The embedding model to use.
45
+ */
46
+ model: EmbeddingModel;
47
+
48
+ /**
49
+ The values that should be embedded.
50
+ */
51
+ values: Array<string>;
52
+
53
+ /**
54
+ Maximum number of retries per embedding model call. Set to 0 to disable retries.
55
+
56
+ @default 2
57
+ */
58
+ maxRetries?: number;
59
+
60
+ /**
61
+ Abort signal.
62
+ */
63
+ abortSignal?: AbortSignal;
64
+
65
+ /**
66
+ Additional headers to include in the request.
67
+ Only applicable for HTTP-based providers.
68
+ */
69
+ headers?: Record<string, string>;
70
+
71
+ /**
72
+ * Optional telemetry configuration (experimental).
73
+ */
74
+ experimental_telemetry?: TelemetrySettings;
75
+
76
+ /**
77
+ Additional provider-specific options. They are passed through
78
+ to the provider from the AI SDK and enable provider-specific
79
+ functionality that can be fully encapsulated in the provider.
80
+ */
81
+ providerOptions?: ProviderOptions;
82
+
83
+ /**
84
+ * Maximum number of concurrent requests.
85
+ *
86
+ * @default Infinity
87
+ */
88
+ maxParallelCalls?: number;
89
+ }): Promise<EmbedManyResult> {
90
+ const model = resolveEmbeddingModel(modelArg);
91
+
92
+ const { maxRetries, retry } = prepareRetries({
93
+ maxRetries: maxRetriesArg,
94
+ abortSignal,
95
+ });
96
+
97
+ const headersWithUserAgent = withUserAgentSuffix(
98
+ headers ?? {},
99
+ `ai/${VERSION}`,
100
+ );
101
+
102
+ const baseTelemetryAttributes = getBaseTelemetryAttributes({
103
+ model,
104
+ telemetry,
105
+ headers: headersWithUserAgent,
106
+ settings: { maxRetries },
107
+ });
108
+
109
+ const tracer = getTracer(telemetry);
110
+
111
+ return recordSpan({
112
+ name: 'ai.embedMany',
113
+ attributes: selectTelemetryAttributes({
114
+ telemetry,
115
+ attributes: {
116
+ ...assembleOperationName({ operationId: 'ai.embedMany', telemetry }),
117
+ ...baseTelemetryAttributes,
118
+ // specific settings that only make sense on the outer level:
119
+ 'ai.values': {
120
+ input: () => values.map(value => JSON.stringify(value)),
121
+ },
122
+ },
123
+ }),
124
+ tracer,
125
+ fn: async span => {
126
+ const [maxEmbeddingsPerCall, supportsParallelCalls] = await Promise.all([
127
+ model.maxEmbeddingsPerCall,
128
+ model.supportsParallelCalls,
129
+ ]);
130
+
131
+ // the model has not specified limits on
132
+ // how many embeddings can be generated in a single call
133
+ if (maxEmbeddingsPerCall == null || maxEmbeddingsPerCall === Infinity) {
134
+ const { embeddings, usage, warnings, response, providerMetadata } =
135
+ await retry(() => {
136
+ // nested spans to align with the embedMany telemetry data:
137
+ return recordSpan({
138
+ name: 'ai.embedMany.doEmbed',
139
+ attributes: selectTelemetryAttributes({
140
+ telemetry,
141
+ attributes: {
142
+ ...assembleOperationName({
143
+ operationId: 'ai.embedMany.doEmbed',
144
+ telemetry,
145
+ }),
146
+ ...baseTelemetryAttributes,
147
+ // specific settings that only make sense on the outer level:
148
+ 'ai.values': {
149
+ input: () => values.map(value => JSON.stringify(value)),
150
+ },
151
+ },
152
+ }),
153
+ tracer,
154
+ fn: async doEmbedSpan => {
155
+ const modelResponse = await model.doEmbed({
156
+ values,
157
+ abortSignal,
158
+ headers: headersWithUserAgent,
159
+ providerOptions,
160
+ });
161
+
162
+ const embeddings = modelResponse.embeddings;
163
+ const usage = modelResponse.usage ?? { tokens: NaN };
164
+
165
+ doEmbedSpan.setAttributes(
166
+ await selectTelemetryAttributes({
167
+ telemetry,
168
+ attributes: {
169
+ 'ai.embeddings': {
170
+ output: () =>
171
+ embeddings.map(embedding =>
172
+ JSON.stringify(embedding),
173
+ ),
174
+ },
175
+ 'ai.usage.tokens': usage.tokens,
176
+ },
177
+ }),
178
+ );
179
+
180
+ return {
181
+ embeddings,
182
+ usage,
183
+ warnings: modelResponse.warnings,
184
+ providerMetadata: modelResponse.providerMetadata,
185
+ response: modelResponse.response,
186
+ };
187
+ },
188
+ });
189
+ });
190
+
191
+ span.setAttributes(
192
+ await selectTelemetryAttributes({
193
+ telemetry,
194
+ attributes: {
195
+ 'ai.embeddings': {
196
+ output: () =>
197
+ embeddings.map(embedding => JSON.stringify(embedding)),
198
+ },
199
+ 'ai.usage.tokens': usage.tokens,
200
+ },
201
+ }),
202
+ );
203
+
204
+ logWarnings({
205
+ warnings,
206
+ provider: model.provider,
207
+ model: model.modelId,
208
+ });
209
+
210
+ return new DefaultEmbedManyResult({
211
+ values,
212
+ embeddings,
213
+ usage,
214
+ warnings,
215
+ providerMetadata,
216
+ responses: [response],
217
+ });
218
+ }
219
+
220
+ // split the values into chunks that are small enough for the model:
221
+ const valueChunks = splitArray(values, maxEmbeddingsPerCall);
222
+
223
+ // serially embed the chunks:
224
+ const embeddings: Array<Embedding> = [];
225
+ const warnings: Array<Warning> = [];
226
+ const responses: Array<
227
+ | {
228
+ headers?: Record<string, string>;
229
+ body?: unknown;
230
+ }
231
+ | undefined
232
+ > = [];
233
+ let tokens = 0;
234
+ let providerMetadata: ProviderMetadata | undefined;
235
+
236
+ const parallelChunks = splitArray(
237
+ valueChunks,
238
+ supportsParallelCalls ? maxParallelCalls : 1,
239
+ );
240
+
241
+ for (const parallelChunk of parallelChunks) {
242
+ const results = await Promise.all(
243
+ parallelChunk.map(chunk => {
244
+ return retry(() => {
245
+ // nested spans to align with the embedMany telemetry data:
246
+ return recordSpan({
247
+ name: 'ai.embedMany.doEmbed',
248
+ attributes: selectTelemetryAttributes({
249
+ telemetry,
250
+ attributes: {
251
+ ...assembleOperationName({
252
+ operationId: 'ai.embedMany.doEmbed',
253
+ telemetry,
254
+ }),
255
+ ...baseTelemetryAttributes,
256
+ // specific settings that only make sense on the outer level:
257
+ 'ai.values': {
258
+ input: () => chunk.map(value => JSON.stringify(value)),
259
+ },
260
+ },
261
+ }),
262
+ tracer,
263
+ fn: async doEmbedSpan => {
264
+ const modelResponse = await model.doEmbed({
265
+ values: chunk,
266
+ abortSignal,
267
+ headers: headersWithUserAgent,
268
+ providerOptions,
269
+ });
270
+
271
+ const embeddings = modelResponse.embeddings;
272
+ const usage = modelResponse.usage ?? { tokens: NaN };
273
+
274
+ doEmbedSpan.setAttributes(
275
+ await selectTelemetryAttributes({
276
+ telemetry,
277
+ attributes: {
278
+ 'ai.embeddings': {
279
+ output: () =>
280
+ embeddings.map(embedding =>
281
+ JSON.stringify(embedding),
282
+ ),
283
+ },
284
+ 'ai.usage.tokens': usage.tokens,
285
+ },
286
+ }),
287
+ );
288
+
289
+ return {
290
+ embeddings,
291
+ usage,
292
+ warnings: modelResponse.warnings,
293
+ providerMetadata: modelResponse.providerMetadata,
294
+ response: modelResponse.response,
295
+ };
296
+ },
297
+ });
298
+ });
299
+ }),
300
+ );
301
+
302
+ for (const result of results) {
303
+ embeddings.push(...result.embeddings);
304
+ warnings.push(...result.warnings);
305
+ responses.push(result.response);
306
+ tokens += result.usage.tokens;
307
+ if (result.providerMetadata) {
308
+ if (!providerMetadata) {
309
+ providerMetadata = { ...result.providerMetadata };
310
+ } else {
311
+ for (const [providerName, metadata] of Object.entries(
312
+ result.providerMetadata,
313
+ )) {
314
+ providerMetadata[providerName] = {
315
+ ...(providerMetadata[providerName] ?? {}),
316
+ ...metadata,
317
+ };
318
+ }
319
+ }
320
+ }
321
+ }
322
+ }
323
+
324
+ span.setAttributes(
325
+ await selectTelemetryAttributes({
326
+ telemetry,
327
+ attributes: {
328
+ 'ai.embeddings': {
329
+ output: () =>
330
+ embeddings.map(embedding => JSON.stringify(embedding)),
331
+ },
332
+ 'ai.usage.tokens': tokens,
333
+ },
334
+ }),
335
+ );
336
+
337
+ logWarnings({
338
+ warnings,
339
+ provider: model.provider,
340
+ model: model.modelId,
341
+ });
342
+
343
+ return new DefaultEmbedManyResult({
344
+ values,
345
+ embeddings,
346
+ usage: { tokens },
347
+ warnings,
348
+ providerMetadata: providerMetadata,
349
+ responses,
350
+ });
351
+ },
352
+ });
353
+ }
354
+
355
+ class DefaultEmbedManyResult implements EmbedManyResult {
356
+ readonly values: EmbedManyResult['values'];
357
+ readonly embeddings: EmbedManyResult['embeddings'];
358
+ readonly usage: EmbedManyResult['usage'];
359
+ readonly warnings: EmbedManyResult['warnings'];
360
+ readonly providerMetadata: EmbedManyResult['providerMetadata'];
361
+ readonly responses: EmbedManyResult['responses'];
362
+
363
+ constructor(options: {
364
+ values: EmbedManyResult['values'];
365
+ embeddings: EmbedManyResult['embeddings'];
366
+ usage: EmbedManyResult['usage'];
367
+ warnings: EmbedManyResult['warnings'];
368
+ providerMetadata?: EmbedManyResult['providerMetadata'];
369
+ responses?: EmbedManyResult['responses'];
370
+ }) {
371
+ this.values = options.values;
372
+ this.embeddings = options.embeddings;
373
+ this.usage = options.usage;
374
+ this.warnings = options.warnings;
375
+ this.providerMetadata = options.providerMetadata;
376
+ this.responses = options.responses;
377
+ }
378
+ }
@@ -0,0 +1,50 @@
1
+ import { Embedding } from '../types';
2
+ import { EmbeddingModelUsage } from '../types/usage';
3
+ import { ProviderMetadata } from '../types';
4
+ import { Warning } from '../types/warning';
5
+
6
+ /**
7
+ The result of an `embed` call.
8
+ It contains the embedding, the value, and additional information.
9
+ */
10
+ export interface EmbedResult {
11
+ /**
12
+ The value that was embedded.
13
+ */
14
+ readonly value: string;
15
+
16
+ /**
17
+ The embedding of the value.
18
+ */
19
+ readonly embedding: Embedding;
20
+
21
+ /**
22
+ The embedding token usage.
23
+ */
24
+ readonly usage: EmbeddingModelUsage;
25
+
26
+ /**
27
+ Warnings for the call, e.g. unsupported settings.
28
+ */
29
+ readonly warnings: Array<Warning>;
30
+
31
+ /**
32
+ Optional provider-specific metadata.
33
+ */
34
+ readonly providerMetadata?: ProviderMetadata;
35
+
36
+ /**
37
+ Optional response data.
38
+ */
39
+ readonly response?: {
40
+ /**
41
+ Response headers.
42
+ */
43
+ headers?: Record<string, string>;
44
+
45
+ /**
46
+ The response body.
47
+ */
48
+ body?: unknown;
49
+ };
50
+ }