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,298 @@
1
+ import { EmbeddingModelV3 } from '@ai-sdk/provider';
2
+ import assert from 'node:assert';
3
+ import { beforeEach, describe, expect, it, vi, vitest } from 'vitest';
4
+ import * as logWarningsModule from '../logger/log-warnings';
5
+ import { MockEmbeddingModelV3 } from '../test/mock-embedding-model-v3';
6
+ import { MockTracer } from '../test/mock-tracer';
7
+ import { Embedding, EmbeddingModelUsage, Warning } from '../types';
8
+ import { embed } from './embed';
9
+
10
+ const dummyEmbedding = [0.1, 0.2, 0.3];
11
+ const testValue = 'sunny day at the beach';
12
+
13
+ vi.mock('../version', () => {
14
+ return {
15
+ VERSION: '0.0.0-test',
16
+ };
17
+ });
18
+
19
+ describe('result.embedding', () => {
20
+ it('should generate embedding', async () => {
21
+ const result = await embed({
22
+ model: new MockEmbeddingModelV3({
23
+ doEmbed: mockEmbed([testValue], [dummyEmbedding]),
24
+ }),
25
+ value: testValue,
26
+ });
27
+
28
+ assert.deepStrictEqual(result.embedding, dummyEmbedding);
29
+ });
30
+ });
31
+
32
+ describe('result.response', () => {
33
+ it('should include response in the result', async () => {
34
+ const result = await embed({
35
+ model: new MockEmbeddingModelV3({
36
+ doEmbed: mockEmbed([testValue], [dummyEmbedding], undefined, {
37
+ body: { foo: 'bar' },
38
+ headers: { foo: 'bar' },
39
+ }),
40
+ }),
41
+ value: testValue,
42
+ });
43
+
44
+ expect(result.response?.body).toMatchInlineSnapshot(`
45
+ {
46
+ "foo": "bar",
47
+ }
48
+ `);
49
+ expect(result.response?.headers).toMatchInlineSnapshot(`
50
+ {
51
+ "foo": "bar",
52
+ }
53
+ `);
54
+ });
55
+ });
56
+
57
+ describe('result.value', () => {
58
+ it('should include value in the result', async () => {
59
+ const result = await embed({
60
+ model: new MockEmbeddingModelV3({
61
+ doEmbed: mockEmbed([testValue], [dummyEmbedding]),
62
+ }),
63
+ value: testValue,
64
+ });
65
+
66
+ assert.deepStrictEqual(result.value, testValue);
67
+ });
68
+ });
69
+
70
+ describe('result.usage', () => {
71
+ it('should include usage in the result', async () => {
72
+ const result = await embed({
73
+ model: new MockEmbeddingModelV3({
74
+ doEmbed: mockEmbed([testValue], [dummyEmbedding], { tokens: 10 }),
75
+ }),
76
+ value: testValue,
77
+ });
78
+
79
+ assert.deepStrictEqual(result.usage, { tokens: 10 });
80
+ });
81
+ });
82
+
83
+ describe('result.providerMetadata', () => {
84
+ it('should include provider metadata when returned by the model', async () => {
85
+ const providerMetadata = {
86
+ gateway: {
87
+ routing: {
88
+ resolvedProvider: 'test-provider',
89
+ },
90
+ },
91
+ };
92
+
93
+ const result = await embed({
94
+ model: new MockEmbeddingModelV3({
95
+ doEmbed: mockEmbed(
96
+ [testValue],
97
+ [dummyEmbedding],
98
+ undefined,
99
+ {
100
+ headers: {},
101
+ body: {},
102
+ },
103
+ providerMetadata,
104
+ ),
105
+ }),
106
+ value: testValue,
107
+ });
108
+
109
+ expect(result.providerMetadata).toStrictEqual(providerMetadata);
110
+ });
111
+ });
112
+
113
+ describe('options.headers', () => {
114
+ it('should set headers', async () => {
115
+ const result = await embed({
116
+ model: new MockEmbeddingModelV3({
117
+ doEmbed: async ({ headers }) => {
118
+ assert.deepStrictEqual(headers, {
119
+ 'custom-request-header': 'request-header-value',
120
+ 'user-agent': 'ai/0.0.0-test',
121
+ });
122
+
123
+ return { embeddings: [dummyEmbedding], warnings: [] };
124
+ },
125
+ }),
126
+ value: testValue,
127
+ headers: {
128
+ 'custom-request-header': 'request-header-value',
129
+ },
130
+ });
131
+
132
+ assert.deepStrictEqual(result.embedding, dummyEmbedding);
133
+ });
134
+ });
135
+
136
+ describe('options.providerOptions', () => {
137
+ it('should pass provider options to model', async () => {
138
+ const result = await embed({
139
+ model: new MockEmbeddingModelV3({
140
+ doEmbed: async ({ providerOptions }) => {
141
+ expect(providerOptions).toStrictEqual({
142
+ aProvider: { someKey: 'someValue' },
143
+ });
144
+
145
+ return { embeddings: [[1, 2, 3]], warnings: [] };
146
+ },
147
+ }),
148
+ value: 'test-input',
149
+ providerOptions: {
150
+ aProvider: { someKey: 'someValue' },
151
+ },
152
+ });
153
+
154
+ expect(result.embedding).toStrictEqual([1, 2, 3]);
155
+ });
156
+ });
157
+
158
+ describe('result.warnings', () => {
159
+ it('should include warnings in the result', async () => {
160
+ const expectedWarnings: Warning[] = [
161
+ {
162
+ type: 'other',
163
+ message: 'Setting is not supported',
164
+ },
165
+ {
166
+ type: 'unsupported',
167
+ feature: 'dimensions',
168
+ details: 'Dimensions parameter not supported',
169
+ },
170
+ ];
171
+
172
+ const result = await embed({
173
+ model: new MockEmbeddingModelV3({
174
+ doEmbed: async () => ({
175
+ embeddings: [dummyEmbedding],
176
+ warnings: expectedWarnings,
177
+ }),
178
+ }),
179
+ value: testValue,
180
+ });
181
+
182
+ expect(result.warnings).toStrictEqual(expectedWarnings);
183
+ });
184
+ });
185
+
186
+ describe('logWarnings', () => {
187
+ let logWarningsSpy: ReturnType<typeof vitest.spyOn>;
188
+
189
+ beforeEach(() => {
190
+ logWarningsSpy = vitest.spyOn(logWarningsModule, 'logWarnings');
191
+ });
192
+
193
+ it('should call logWarnings with the correct warnings', async () => {
194
+ const expectedWarnings: Warning[] = [
195
+ {
196
+ type: 'other',
197
+ message: 'Setting is not supported',
198
+ },
199
+ {
200
+ type: 'unsupported',
201
+ feature: 'dimensions',
202
+ details: 'Dimensions parameter not supported',
203
+ },
204
+ ];
205
+
206
+ await embed({
207
+ model: new MockEmbeddingModelV3({
208
+ doEmbed: async () => ({
209
+ embeddings: [dummyEmbedding],
210
+ warnings: expectedWarnings,
211
+ }),
212
+ }),
213
+ value: testValue,
214
+ });
215
+
216
+ expect(logWarningsSpy).toHaveBeenCalledOnce();
217
+ expect(logWarningsSpy).toHaveBeenCalledWith({
218
+ warnings: expectedWarnings,
219
+ provider: 'mock-provider',
220
+ model: 'mock-model-id',
221
+ });
222
+ });
223
+ });
224
+
225
+ describe('telemetry', () => {
226
+ let tracer: MockTracer;
227
+
228
+ beforeEach(() => {
229
+ tracer = new MockTracer();
230
+ });
231
+
232
+ it('should not record any telemetry data when not explicitly enabled', async () => {
233
+ await embed({
234
+ model: new MockEmbeddingModelV3({
235
+ doEmbed: mockEmbed([testValue], [dummyEmbedding]),
236
+ }),
237
+ value: testValue,
238
+ experimental_telemetry: { tracer },
239
+ });
240
+
241
+ expect(tracer.jsonSpans).toMatchSnapshot();
242
+ });
243
+
244
+ it('should record telemetry data when enabled', async () => {
245
+ await embed({
246
+ model: new MockEmbeddingModelV3({
247
+ doEmbed: mockEmbed([testValue], [dummyEmbedding], { tokens: 10 }),
248
+ }),
249
+ value: testValue,
250
+ experimental_telemetry: {
251
+ isEnabled: true,
252
+ functionId: 'test-function-id',
253
+ metadata: {
254
+ test1: 'value1',
255
+ test2: false,
256
+ },
257
+ tracer,
258
+ },
259
+ });
260
+
261
+ expect(tracer.jsonSpans).toMatchSnapshot();
262
+ });
263
+
264
+ it('should not record telemetry inputs / outputs when disabled', async () => {
265
+ await embed({
266
+ model: new MockEmbeddingModelV3({
267
+ doEmbed: mockEmbed([testValue], [dummyEmbedding], { tokens: 10 }),
268
+ }),
269
+ value: testValue,
270
+ experimental_telemetry: {
271
+ isEnabled: true,
272
+ recordInputs: false,
273
+ recordOutputs: false,
274
+ tracer,
275
+ },
276
+ });
277
+
278
+ expect(tracer.jsonSpans).toMatchSnapshot();
279
+ });
280
+ });
281
+
282
+ function mockEmbed(
283
+ expectedValues: Array<string>,
284
+ embeddings: Array<Embedding>,
285
+ usage?: EmbeddingModelUsage,
286
+ response: Awaited<ReturnType<EmbeddingModelV3['doEmbed']>>['response'] = {
287
+ headers: {},
288
+ body: {},
289
+ },
290
+ providerMetadata?: Awaited<
291
+ ReturnType<EmbeddingModelV3['doEmbed']>
292
+ >['providerMetadata'],
293
+ ): EmbeddingModelV3['doEmbed'] {
294
+ return async ({ values }) => {
295
+ assert.deepStrictEqual(expectedValues, values);
296
+ return { embeddings, usage, response, providerMetadata, warnings: [] };
297
+ };
298
+ }
@@ -0,0 +1,211 @@
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 { EmbeddingModel } from '../types';
11
+ import { prepareRetries } from '../util/prepare-retries';
12
+ import { EmbedResult } from './embed-result';
13
+ import { VERSION } from '../version';
14
+
15
+ /**
16
+ Embed a value using an embedding model. The type of the value is defined by the embedding model.
17
+
18
+ @param model - The embedding model to use.
19
+ @param value - The value that should be embedded.
20
+
21
+ @param maxRetries - Maximum number of retries. Set to 0 to disable retries. Default: 2.
22
+ @param abortSignal - An optional abort signal that can be used to cancel the call.
23
+ @param headers - Additional HTTP headers to be sent with the request. Only applicable for HTTP-based providers.
24
+
25
+ @returns A result object that contains the embedding, the value, and additional information.
26
+ */
27
+ export async function embed({
28
+ model: modelArg,
29
+ value,
30
+ providerOptions,
31
+ maxRetries: maxRetriesArg,
32
+ abortSignal,
33
+ headers,
34
+ experimental_telemetry: telemetry,
35
+ }: {
36
+ /**
37
+ The embedding model to use.
38
+ */
39
+ model: EmbeddingModel;
40
+
41
+ /**
42
+ The value that should be embedded.
43
+ */
44
+ value: string;
45
+
46
+ /**
47
+ Maximum number of retries per embedding model call. Set to 0 to disable retries.
48
+
49
+ @default 2
50
+ */
51
+ maxRetries?: number;
52
+
53
+ /**
54
+ Abort signal.
55
+ */
56
+ abortSignal?: AbortSignal;
57
+
58
+ /**
59
+ Additional headers to include in the request.
60
+ Only applicable for HTTP-based providers.
61
+ */
62
+ headers?: Record<string, string>;
63
+
64
+ /**
65
+ Additional provider-specific options. They are passed through
66
+ to the provider from the AI SDK and enable provider-specific
67
+ functionality that can be fully encapsulated in the provider.
68
+ */
69
+ providerOptions?: ProviderOptions;
70
+
71
+ /**
72
+ * Optional telemetry configuration (experimental).
73
+ */
74
+ experimental_telemetry?: TelemetrySettings;
75
+ }): Promise<EmbedResult> {
76
+ const model = resolveEmbeddingModel(modelArg);
77
+
78
+ const { maxRetries, retry } = prepareRetries({
79
+ maxRetries: maxRetriesArg,
80
+ abortSignal,
81
+ });
82
+
83
+ const headersWithUserAgent = withUserAgentSuffix(
84
+ headers ?? {},
85
+ `ai/${VERSION}`,
86
+ );
87
+
88
+ const baseTelemetryAttributes = getBaseTelemetryAttributes({
89
+ model: model,
90
+ telemetry,
91
+ headers: headersWithUserAgent,
92
+ settings: { maxRetries },
93
+ });
94
+
95
+ const tracer = getTracer(telemetry);
96
+
97
+ return recordSpan({
98
+ name: 'ai.embed',
99
+ attributes: selectTelemetryAttributes({
100
+ telemetry,
101
+ attributes: {
102
+ ...assembleOperationName({ operationId: 'ai.embed', telemetry }),
103
+ ...baseTelemetryAttributes,
104
+ 'ai.value': { input: () => JSON.stringify(value) },
105
+ },
106
+ }),
107
+ tracer,
108
+ fn: async span => {
109
+ const { embedding, usage, warnings, response, providerMetadata } =
110
+ await retry(() =>
111
+ // nested spans to align with the embedMany telemetry data:
112
+ recordSpan({
113
+ name: 'ai.embed.doEmbed',
114
+ attributes: selectTelemetryAttributes({
115
+ telemetry,
116
+ attributes: {
117
+ ...assembleOperationName({
118
+ operationId: 'ai.embed.doEmbed',
119
+ telemetry,
120
+ }),
121
+ ...baseTelemetryAttributes,
122
+ // specific settings that only make sense on the outer level:
123
+ 'ai.values': { input: () => [JSON.stringify(value)] },
124
+ },
125
+ }),
126
+ tracer,
127
+ fn: async doEmbedSpan => {
128
+ const modelResponse = await model.doEmbed({
129
+ values: [value],
130
+ abortSignal,
131
+ headers: headersWithUserAgent,
132
+ providerOptions,
133
+ });
134
+
135
+ const embedding = modelResponse.embeddings[0];
136
+ const usage = modelResponse.usage ?? { tokens: NaN };
137
+
138
+ doEmbedSpan.setAttributes(
139
+ await selectTelemetryAttributes({
140
+ telemetry,
141
+ attributes: {
142
+ 'ai.embeddings': {
143
+ output: () =>
144
+ modelResponse.embeddings.map(embedding =>
145
+ JSON.stringify(embedding),
146
+ ),
147
+ },
148
+ 'ai.usage.tokens': usage.tokens,
149
+ },
150
+ }),
151
+ );
152
+
153
+ return {
154
+ embedding,
155
+ usage,
156
+ warnings: modelResponse.warnings,
157
+ providerMetadata: modelResponse.providerMetadata,
158
+ response: modelResponse.response,
159
+ };
160
+ },
161
+ }),
162
+ );
163
+
164
+ span.setAttributes(
165
+ await selectTelemetryAttributes({
166
+ telemetry,
167
+ attributes: {
168
+ 'ai.embedding': { output: () => JSON.stringify(embedding) },
169
+ 'ai.usage.tokens': usage.tokens,
170
+ },
171
+ }),
172
+ );
173
+
174
+ logWarnings({ warnings, provider: model.provider, model: model.modelId });
175
+
176
+ return new DefaultEmbedResult({
177
+ value,
178
+ embedding,
179
+ usage,
180
+ warnings,
181
+ providerMetadata,
182
+ response,
183
+ });
184
+ },
185
+ });
186
+ }
187
+
188
+ class DefaultEmbedResult implements EmbedResult {
189
+ readonly value: EmbedResult['value'];
190
+ readonly embedding: EmbedResult['embedding'];
191
+ readonly usage: EmbedResult['usage'];
192
+ readonly warnings: EmbedResult['warnings'];
193
+ readonly providerMetadata: EmbedResult['providerMetadata'];
194
+ readonly response: EmbedResult['response'];
195
+
196
+ constructor(options: {
197
+ value: EmbedResult['value'];
198
+ embedding: EmbedResult['embedding'];
199
+ usage: EmbedResult['usage'];
200
+ warnings: EmbedResult['warnings'];
201
+ providerMetadata?: EmbedResult['providerMetadata'];
202
+ response?: EmbedResult['response'];
203
+ }) {
204
+ this.value = options.value;
205
+ this.embedding = options.embedding;
206
+ this.usage = options.usage;
207
+ this.warnings = options.warnings;
208
+ this.providerMetadata = options.providerMetadata;
209
+ this.response = options.response;
210
+ }
211
+ }
@@ -0,0 +1,4 @@
1
+ export * from './embed';
2
+ export * from './embed-many';
3
+ export * from './embed-many-result';
4
+ export * from './embed-result';
@@ -0,0 +1,34 @@
1
+ export {
2
+ AISDKError,
3
+ APICallError,
4
+ EmptyResponseBodyError,
5
+ InvalidPromptError,
6
+ InvalidResponseDataError,
7
+ JSONParseError,
8
+ LoadAPIKeyError,
9
+ LoadSettingError,
10
+ NoContentGeneratedError,
11
+ NoSuchModelError,
12
+ TooManyEmbeddingValuesForCallError,
13
+ TypeValidationError,
14
+ UnsupportedFunctionalityError,
15
+ } from '@ai-sdk/provider';
16
+
17
+ export { InvalidArgumentError } from './invalid-argument-error';
18
+ export { InvalidStreamPartError } from './invalid-stream-part-error';
19
+ export { InvalidToolApprovalError } from './invalid-tool-approval-error';
20
+ export { InvalidToolInputError } from './invalid-tool-input-error';
21
+ export { ToolCallNotFoundForApprovalError } from './tool-call-not-found-for-approval-error';
22
+ export { NoImageGeneratedError } from './no-image-generated-error';
23
+ export { NoObjectGeneratedError } from './no-object-generated-error';
24
+ export { NoOutputGeneratedError } from './no-output-generated-error';
25
+ export { NoSpeechGeneratedError } from './no-speech-generated-error';
26
+ export { NoSuchToolError } from './no-such-tool-error';
27
+ export { ToolCallRepairError } from './tool-call-repair-error';
28
+ export { UnsupportedModelVersionError } from './unsupported-model-version-error';
29
+
30
+ export { InvalidDataContentError } from '../prompt/invalid-data-content-error';
31
+ export { InvalidMessageRoleError } from '../prompt/invalid-message-role-error';
32
+ export { MessageConversionError } from '../prompt/message-conversion-error';
33
+ export { DownloadError } from '@ai-sdk/provider-utils';
34
+ export { RetryError } from '../util/retry-error';
@@ -0,0 +1,34 @@
1
+ import { AISDKError } from '@ai-sdk/provider';
2
+
3
+ const name = 'AI_InvalidArgumentError';
4
+ const marker = `vercel.ai.error.${name}`;
5
+ const symbol = Symbol.for(marker);
6
+
7
+ export class InvalidArgumentError extends AISDKError {
8
+ private readonly [symbol] = true; // used in isInstance
9
+
10
+ readonly parameter: string;
11
+ readonly value: unknown;
12
+
13
+ constructor({
14
+ parameter,
15
+ value,
16
+ message,
17
+ }: {
18
+ parameter: string;
19
+ value: unknown;
20
+ message: string;
21
+ }) {
22
+ super({
23
+ name,
24
+ message: `Invalid argument for parameter ${parameter}: ${message}`,
25
+ });
26
+
27
+ this.parameter = parameter;
28
+ this.value = value;
29
+ }
30
+
31
+ static isInstance(error: unknown): error is InvalidArgumentError {
32
+ return AISDKError.hasMarker(error, marker);
33
+ }
34
+ }
@@ -0,0 +1,28 @@
1
+ import { AISDKError } from '@ai-sdk/provider';
2
+ import { SingleRequestTextStreamPart } from '../generate-text/run-tools-transformation';
3
+
4
+ const name = 'AI_InvalidStreamPartError';
5
+ const marker = `vercel.ai.error.${name}`;
6
+ const symbol = Symbol.for(marker);
7
+
8
+ export class InvalidStreamPartError extends AISDKError {
9
+ private readonly [symbol] = true; // used in isInstance
10
+
11
+ readonly chunk: SingleRequestTextStreamPart<any>;
12
+
13
+ constructor({
14
+ chunk,
15
+ message,
16
+ }: {
17
+ chunk: SingleRequestTextStreamPart<any>;
18
+ message: string;
19
+ }) {
20
+ super({ name, message });
21
+
22
+ this.chunk = chunk;
23
+ }
24
+
25
+ static isInstance(error: unknown): error is InvalidStreamPartError {
26
+ return AISDKError.hasMarker(error, marker);
27
+ }
28
+ }
@@ -0,0 +1,26 @@
1
+ import { AISDKError } from '@ai-sdk/provider';
2
+
3
+ const name = 'AI_InvalidToolApprovalError';
4
+ const marker = `vercel.ai.error.${name}`;
5
+ const symbol = Symbol.for(marker);
6
+
7
+ export class InvalidToolApprovalError extends AISDKError {
8
+ private readonly [symbol] = true; // used in isInstance
9
+
10
+ readonly approvalId: string;
11
+
12
+ constructor({ approvalId }: { approvalId: string }) {
13
+ super({
14
+ name,
15
+ message:
16
+ `Tool approval response references unknown approvalId: "${approvalId}". ` +
17
+ `No matching tool-approval-request found in message history.`,
18
+ });
19
+
20
+ this.approvalId = approvalId;
21
+ }
22
+
23
+ static isInstance(error: unknown): error is InvalidToolApprovalError {
24
+ return AISDKError.hasMarker(error, marker);
25
+ }
26
+ }
@@ -0,0 +1,33 @@
1
+ import { AISDKError, getErrorMessage } from '@ai-sdk/provider';
2
+
3
+ const name = 'AI_InvalidToolInputError';
4
+ const marker = `vercel.ai.error.${name}`;
5
+ const symbol = Symbol.for(marker);
6
+
7
+ export class InvalidToolInputError extends AISDKError {
8
+ private readonly [symbol] = true; // used in isInstance
9
+
10
+ readonly toolName: string;
11
+ readonly toolInput: string;
12
+
13
+ constructor({
14
+ toolInput,
15
+ toolName,
16
+ cause,
17
+ message = `Invalid input for tool ${toolName}: ${getErrorMessage(cause)}`,
18
+ }: {
19
+ message?: string;
20
+ toolInput: string;
21
+ toolName: string;
22
+ cause: unknown;
23
+ }) {
24
+ super({ name, message, cause });
25
+
26
+ this.toolInput = toolInput;
27
+ this.toolName = toolName;
28
+ }
29
+
30
+ static isInstance(error: unknown): error is InvalidToolInputError {
31
+ return AISDKError.hasMarker(error, marker);
32
+ }
33
+ }