@llumiverse/drivers 1.3.0 → 1.4.0

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 (409) hide show
  1. package/lib/{types/adobe → adobe}/firefly.d.ts +2 -1
  2. package/lib/adobe/firefly.d.ts.map +1 -0
  3. package/lib/adobe/firefly.js +120 -0
  4. package/lib/adobe/firefly.js.map +1 -0
  5. package/lib/{types/anthropic → anthropic}/index.d.ts +4 -2
  6. package/lib/anthropic/index.d.ts.map +1 -0
  7. package/lib/{esm/anthropic → anthropic}/index.js +19 -8
  8. package/lib/anthropic/index.js.map +1 -0
  9. package/lib/{types/azure → azure}/azure_foundry.d.ts +9 -7
  10. package/lib/azure/azure_foundry.d.ts.map +1 -0
  11. package/lib/{esm/azure → azure}/azure_foundry.js +138 -124
  12. package/lib/azure/azure_foundry.js.map +1 -0
  13. package/lib/{types/bedrock → bedrock}/converse.d.ts +2 -2
  14. package/lib/bedrock/converse.d.ts.map +1 -0
  15. package/lib/{esm/bedrock → bedrock}/converse.js +86 -79
  16. package/lib/bedrock/converse.js.map +1 -0
  17. package/lib/bedrock/embeddings.d.ts +4 -0
  18. package/lib/bedrock/embeddings.d.ts.map +1 -0
  19. package/lib/bedrock/embeddings.js +359 -0
  20. package/lib/bedrock/embeddings.js.map +1 -0
  21. package/lib/{types/bedrock → bedrock}/index.d.ts +33 -9
  22. package/lib/bedrock/index.d.ts.map +1 -0
  23. package/lib/{esm/bedrock → bedrock}/index.js +599 -324
  24. package/lib/bedrock/index.js.map +1 -0
  25. package/lib/{types/bedrock → bedrock}/nova-image-payload.d.ts +5 -5
  26. package/lib/bedrock/nova-image-payload.d.ts.map +1 -0
  27. package/lib/{esm/bedrock → bedrock}/nova-image-payload.js +31 -36
  28. package/lib/bedrock/nova-image-payload.js.map +1 -0
  29. package/lib/{types/bedrock → bedrock}/payloads.d.ts +1 -1
  30. package/lib/bedrock/payloads.d.ts.map +1 -0
  31. package/lib/{cjs/bedrock → bedrock}/payloads.js.map +1 -1
  32. package/lib/{types/bedrock → bedrock}/s3.d.ts +3 -2
  33. package/lib/bedrock/s3.d.ts.map +1 -0
  34. package/lib/{esm/bedrock → bedrock}/s3.js +27 -23
  35. package/lib/bedrock/s3.js.map +1 -0
  36. package/lib/{types/bedrock → bedrock}/twelvelabs.d.ts +8 -9
  37. package/lib/bedrock/twelvelabs.d.ts.map +1 -0
  38. package/lib/{esm/bedrock → bedrock}/twelvelabs.js +17 -21
  39. package/lib/bedrock/twelvelabs.js.map +1 -0
  40. package/lib/{types/groq → groq}/index.d.ts +6 -4
  41. package/lib/groq/index.d.ts.map +1 -0
  42. package/lib/{esm/groq → groq}/index.js +72 -39
  43. package/lib/groq/index.js.map +1 -0
  44. package/lib/{types/huggingface_ie.d.ts → huggingface_ie.d.ts} +4 -3
  45. package/lib/huggingface_ie.d.ts.map +1 -0
  46. package/lib/{esm/huggingface_ie.js → huggingface_ie.js} +32 -31
  47. package/lib/huggingface_ie.js.map +1 -0
  48. package/lib/index.d.ts +16 -0
  49. package/lib/index.d.ts.map +1 -0
  50. package/lib/index.js +16 -0
  51. package/lib/index.js.map +1 -0
  52. package/lib/{types/mistral → mistral}/index.d.ts +6 -5
  53. package/lib/mistral/index.d.ts.map +1 -0
  54. package/lib/{esm/mistral → mistral}/index.js +66 -38
  55. package/lib/mistral/index.js.map +1 -0
  56. package/lib/{types/mistral → mistral}/types.d.ts +1 -0
  57. package/lib/mistral/types.d.ts.map +1 -0
  58. package/lib/mistral/types.js.map +1 -0
  59. package/lib/{types/openai → openai}/azure_openai.d.ts +5 -4
  60. package/lib/openai/azure_openai.d.ts.map +1 -0
  61. package/lib/{esm/openai → openai}/azure_openai.js +17 -14
  62. package/lib/openai/azure_openai.js.map +1 -0
  63. package/lib/openai/drivers.d.ts +4 -0
  64. package/lib/openai/drivers.d.ts.map +1 -0
  65. package/lib/openai/drivers.js +9 -0
  66. package/lib/openai/drivers.js.map +1 -0
  67. package/lib/{types/openai → openai}/index.d.ts +16 -5
  68. package/lib/openai/index.d.ts.map +1 -0
  69. package/lib/{esm/openai → openai}/index.js +242 -141
  70. package/lib/openai/index.js.map +1 -0
  71. package/lib/{types/openai → openai}/openai.d.ts +3 -3
  72. package/lib/openai/openai.d.ts.map +1 -0
  73. package/lib/openai/openai.js +15 -0
  74. package/lib/openai/openai.js.map +1 -0
  75. package/lib/{types/openai → openai}/openai_compatible.d.ts +3 -3
  76. package/lib/openai/openai_compatible.d.ts.map +1 -0
  77. package/lib/{esm/openai → openai}/openai_compatible.js +14 -11
  78. package/lib/openai/openai_compatible.js.map +1 -0
  79. package/lib/{types/openai → openai}/openai_format.d.ts +3 -2
  80. package/lib/openai/openai_format.d.ts.map +1 -0
  81. package/lib/{esm/openai → openai}/openai_format.js +66 -24
  82. package/lib/openai/openai_format.js.map +1 -0
  83. package/lib/{types/replicate.d.ts → replicate.d.ts} +3 -2
  84. package/lib/replicate.d.ts.map +1 -0
  85. package/lib/{esm/replicate.js → replicate.js} +59 -49
  86. package/lib/replicate.js.map +1 -0
  87. package/lib/{types/shared → shared}/claude-messages.d.ts +25 -1
  88. package/lib/shared/claude-messages.d.ts.map +1 -0
  89. package/lib/{esm/shared → shared}/claude-messages.js +212 -59
  90. package/lib/shared/claude-messages.js.map +1 -0
  91. package/lib/{types/shared → shared}/claude-thinking.d.ts +1 -1
  92. package/lib/shared/claude-thinking.d.ts.map +1 -0
  93. package/lib/{esm/shared → shared}/claude-thinking.js +5 -7
  94. package/lib/shared/claude-thinking.js.map +1 -0
  95. package/lib/shared/debug-prompt.d.ts +5 -0
  96. package/lib/shared/debug-prompt.d.ts.map +1 -0
  97. package/lib/shared/debug-prompt.js +25 -0
  98. package/lib/shared/debug-prompt.js.map +1 -0
  99. package/lib/{types/test-driver → test-driver}/TestErrorCompletionStream.d.ts +1 -1
  100. package/lib/test-driver/TestErrorCompletionStream.d.ts.map +1 -0
  101. package/lib/test-driver/TestErrorCompletionStream.js +16 -0
  102. package/lib/test-driver/TestErrorCompletionStream.js.map +1 -0
  103. package/lib/{types/test-driver → test-driver}/TestValidationErrorCompletionStream.d.ts +1 -1
  104. package/lib/test-driver/TestValidationErrorCompletionStream.d.ts.map +1 -0
  105. package/lib/{esm/test-driver → test-driver}/TestValidationErrorCompletionStream.js +4 -4
  106. package/lib/test-driver/TestValidationErrorCompletionStream.js.map +1 -0
  107. package/lib/{types/test-driver → test-driver}/index.d.ts +3 -3
  108. package/lib/test-driver/index.d.ts.map +1 -0
  109. package/lib/{esm/test-driver → test-driver}/index.js +20 -20
  110. package/lib/test-driver/index.js.map +1 -0
  111. package/lib/{types/test-driver → test-driver}/utils.d.ts +1 -1
  112. package/lib/test-driver/utils.d.ts.map +1 -0
  113. package/lib/{esm/test-driver → test-driver}/utils.js +4 -4
  114. package/lib/test-driver/utils.js.map +1 -0
  115. package/lib/togetherai/index.d.ts +15 -0
  116. package/lib/togetherai/index.d.ts.map +1 -0
  117. package/lib/togetherai/index.js +54 -0
  118. package/lib/togetherai/index.js.map +1 -0
  119. package/lib/{types/togetherai → togetherai}/interfaces.d.ts +1 -1
  120. package/lib/togetherai/interfaces.d.ts.map +1 -0
  121. package/lib/{cjs/watsonx → togetherai}/interfaces.js.map +1 -1
  122. package/lib/vertexai/debug.d.ts +2 -0
  123. package/lib/vertexai/debug.d.ts.map +1 -0
  124. package/lib/{esm/vertexai → vertexai}/debug.js +1 -1
  125. package/lib/vertexai/debug.js.map +1 -0
  126. package/lib/vertexai/embeddings/embed-legacy-multimodal.d.ts +9 -0
  127. package/lib/vertexai/embeddings/embed-legacy-multimodal.d.ts.map +1 -0
  128. package/lib/vertexai/embeddings/embed-legacy-multimodal.js +141 -0
  129. package/lib/vertexai/embeddings/embed-legacy-multimodal.js.map +1 -0
  130. package/lib/vertexai/embeddings/embed.d.ts +13 -0
  131. package/lib/vertexai/embeddings/embed.d.ts.map +1 -0
  132. package/lib/vertexai/embeddings/embed.js +162 -0
  133. package/lib/vertexai/embeddings/embed.js.map +1 -0
  134. package/lib/vertexai/embeddings/source-utils.d.ts +9 -0
  135. package/lib/vertexai/embeddings/source-utils.d.ts.map +1 -0
  136. package/lib/vertexai/embeddings/source-utils.js +18 -0
  137. package/lib/vertexai/embeddings/source-utils.js.map +1 -0
  138. package/lib/{types/vertexai → vertexai}/index.d.ts +31 -19
  139. package/lib/vertexai/index.d.ts.map +1 -0
  140. package/lib/{esm/vertexai → vertexai}/index.js +221 -159
  141. package/lib/vertexai/index.js.map +1 -0
  142. package/lib/{types/vertexai → vertexai}/models/claude.d.ts +4 -4
  143. package/lib/vertexai/models/claude.d.ts.map +1 -0
  144. package/lib/{esm/vertexai → vertexai}/models/claude.js +17 -20
  145. package/lib/vertexai/models/claude.js.map +1 -0
  146. package/lib/{types/vertexai → vertexai}/models/gemini.d.ts +28 -4
  147. package/lib/vertexai/models/gemini.d.ts.map +1 -0
  148. package/lib/{esm/vertexai → vertexai}/models/gemini.js +238 -116
  149. package/lib/vertexai/models/gemini.js.map +1 -0
  150. package/lib/{types/vertexai → vertexai}/models/imagen.d.ts +12 -11
  151. package/lib/vertexai/models/imagen.d.ts.map +1 -0
  152. package/lib/{esm/vertexai → vertexai}/models/imagen.js +74 -47
  153. package/lib/vertexai/models/imagen.js.map +1 -0
  154. package/lib/{types/vertexai → vertexai}/models/llama.d.ts +4 -4
  155. package/lib/vertexai/models/llama.d.ts.map +1 -0
  156. package/lib/{esm/vertexai → vertexai}/models/llama.js +37 -33
  157. package/lib/vertexai/models/llama.js.map +1 -0
  158. package/lib/vertexai/models.d.ts +21 -0
  159. package/lib/vertexai/models.d.ts.map +1 -0
  160. package/lib/{esm/vertexai → vertexai}/models.js +12 -9
  161. package/lib/vertexai/models.js.map +1 -0
  162. package/lib/{types/watsonx → watsonx}/index.d.ts +4 -3
  163. package/lib/watsonx/index.d.ts.map +1 -0
  164. package/lib/{esm/watsonx → watsonx}/index.js +69 -41
  165. package/lib/watsonx/index.js.map +1 -0
  166. package/lib/watsonx/interfaces.d.ts.map +1 -0
  167. package/lib/{esm/watsonx → watsonx}/interfaces.js.map +1 -1
  168. package/lib/{types/xai → xai}/index.d.ts +4 -4
  169. package/lib/xai/index.d.ts.map +1 -0
  170. package/lib/{esm/xai → xai}/index.js +22 -18
  171. package/lib/xai/index.js.map +1 -0
  172. package/package.json +87 -36
  173. package/src/adobe/firefly.ts +60 -43
  174. package/src/anthropic/index.ts +37 -20
  175. package/src/azure/azure_foundry.ts +210 -165
  176. package/src/bedrock/converse.ts +124 -101
  177. package/src/bedrock/embeddings.test.ts +508 -0
  178. package/src/bedrock/embeddings.ts +517 -0
  179. package/src/bedrock/error-handling.test.ts +62 -14
  180. package/src/bedrock/index.ts +832 -466
  181. package/src/bedrock/nova-image-payload.ts +98 -91
  182. package/src/bedrock/payloads.ts +9 -9
  183. package/src/bedrock/s3.test.ts +39 -0
  184. package/src/bedrock/s3.ts +57 -38
  185. package/src/bedrock/streaming-tool-use.test.ts +86 -69
  186. package/src/bedrock/twelvelabs.ts +35 -32
  187. package/src/groq/index.ts +143 -60
  188. package/src/http-timeout-wiring.test.ts +263 -0
  189. package/src/huggingface_ie.ts +45 -61
  190. package/src/index.ts +15 -16
  191. package/src/mistral/index.ts +97 -48
  192. package/src/mistral/types.ts +13 -12
  193. package/src/openai/azure_openai.ts +35 -27
  194. package/src/openai/drivers.ts +9 -0
  195. package/src/openai/error-handling.test.ts +308 -113
  196. package/src/openai/index.ts +378 -248
  197. package/src/openai/openai.ts +6 -13
  198. package/src/openai/openai_compatible.ts +35 -25
  199. package/src/openai/openai_format.ts +90 -40
  200. package/src/replicate.ts +108 -86
  201. package/src/shared/claude-messages.test.ts +37 -0
  202. package/src/shared/claude-messages.ts +303 -97
  203. package/src/shared/claude-thinking.ts +6 -12
  204. package/src/shared/debug-prompt.ts +28 -0
  205. package/src/test-driver/TestErrorCompletionStream.ts +9 -10
  206. package/src/test-driver/TestValidationErrorCompletionStream.ts +9 -10
  207. package/src/test-driver/index.ts +43 -27
  208. package/src/test-driver/utils.ts +8 -8
  209. package/src/togetherai/index.test.ts +32 -0
  210. package/src/togetherai/index.ts +64 -128
  211. package/src/togetherai/interfaces.ts +5 -5
  212. package/src/vertexai/debug.ts +3 -3
  213. package/src/vertexai/embeddings/embed-legacy-multimodal.ts +211 -0
  214. package/src/vertexai/embeddings/embed.ts +206 -0
  215. package/src/vertexai/embeddings/embeddings.test.ts +497 -0
  216. package/src/vertexai/embeddings/source-utils.test.ts +54 -0
  217. package/src/vertexai/embeddings/source-utils.ts +29 -0
  218. package/src/vertexai/index.ts +331 -244
  219. package/src/vertexai/models/claude-error-handling.test.ts +83 -36
  220. package/src/vertexai/models/claude-streaming-spacing.test.ts +82 -75
  221. package/src/vertexai/models/claude.ts +55 -40
  222. package/src/vertexai/models/gemini-conversation-mutation.test.ts +65 -23
  223. package/src/vertexai/models/gemini-error-handling.test.ts +126 -10
  224. package/src/vertexai/models/gemini-orphaned-tool-result.test.ts +118 -0
  225. package/src/vertexai/models/gemini.ts +349 -172
  226. package/src/vertexai/models/imagen.ts +164 -100
  227. package/src/vertexai/models/llama.ts +70 -48
  228. package/src/vertexai/models.ts +36 -16
  229. package/src/watsonx/index.ts +101 -65
  230. package/src/watsonx/interfaces.ts +10 -15
  231. package/src/xai/index.ts +30 -30
  232. package/lib/cjs/adobe/firefly.js +0 -120
  233. package/lib/cjs/adobe/firefly.js.map +0 -1
  234. package/lib/cjs/anthropic/index.js +0 -64
  235. package/lib/cjs/anthropic/index.js.map +0 -1
  236. package/lib/cjs/azure/azure_foundry.js +0 -432
  237. package/lib/cjs/azure/azure_foundry.js.map +0 -1
  238. package/lib/cjs/bedrock/converse.js +0 -359
  239. package/lib/cjs/bedrock/converse.js.map +0 -1
  240. package/lib/cjs/bedrock/index.js +0 -1508
  241. package/lib/cjs/bedrock/index.js.map +0 -1
  242. package/lib/cjs/bedrock/nova-image-payload.js +0 -207
  243. package/lib/cjs/bedrock/nova-image-payload.js.map +0 -1
  244. package/lib/cjs/bedrock/payloads.js +0 -3
  245. package/lib/cjs/bedrock/s3.js +0 -107
  246. package/lib/cjs/bedrock/s3.js.map +0 -1
  247. package/lib/cjs/bedrock/twelvelabs.js +0 -87
  248. package/lib/cjs/bedrock/twelvelabs.js.map +0 -1
  249. package/lib/cjs/groq/index.js +0 -328
  250. package/lib/cjs/groq/index.js.map +0 -1
  251. package/lib/cjs/huggingface_ie.js +0 -201
  252. package/lib/cjs/huggingface_ie.js.map +0 -1
  253. package/lib/cjs/index.js +0 -32
  254. package/lib/cjs/index.js.map +0 -1
  255. package/lib/cjs/mistral/index.js +0 -176
  256. package/lib/cjs/mistral/index.js.map +0 -1
  257. package/lib/cjs/mistral/types.js +0 -83
  258. package/lib/cjs/mistral/types.js.map +0 -1
  259. package/lib/cjs/openai/azure_openai.js +0 -72
  260. package/lib/cjs/openai/azure_openai.js.map +0 -1
  261. package/lib/cjs/openai/index.js +0 -1135
  262. package/lib/cjs/openai/index.js.map +0 -1
  263. package/lib/cjs/openai/openai.js +0 -21
  264. package/lib/cjs/openai/openai.js.map +0 -1
  265. package/lib/cjs/openai/openai_compatible.js +0 -63
  266. package/lib/cjs/openai/openai_compatible.js.map +0 -1
  267. package/lib/cjs/openai/openai_format.js +0 -131
  268. package/lib/cjs/openai/openai_format.js.map +0 -1
  269. package/lib/cjs/package.json +0 -3
  270. package/lib/cjs/replicate.js +0 -275
  271. package/lib/cjs/replicate.js.map +0 -1
  272. package/lib/cjs/shared/claude-messages.js +0 -737
  273. package/lib/cjs/shared/claude-messages.js.map +0 -1
  274. package/lib/cjs/shared/claude-thinking.js +0 -60
  275. package/lib/cjs/shared/claude-thinking.js.map +0 -1
  276. package/lib/cjs/test-driver/TestErrorCompletionStream.js +0 -20
  277. package/lib/cjs/test-driver/TestErrorCompletionStream.js.map +0 -1
  278. package/lib/cjs/test-driver/TestValidationErrorCompletionStream.js +0 -24
  279. package/lib/cjs/test-driver/TestValidationErrorCompletionStream.js.map +0 -1
  280. package/lib/cjs/test-driver/index.js +0 -109
  281. package/lib/cjs/test-driver/index.js.map +0 -1
  282. package/lib/cjs/test-driver/utils.js +0 -30
  283. package/lib/cjs/test-driver/utils.js.map +0 -1
  284. package/lib/cjs/togetherai/index.js +0 -126
  285. package/lib/cjs/togetherai/index.js.map +0 -1
  286. package/lib/cjs/togetherai/interfaces.js +0 -3
  287. package/lib/cjs/togetherai/interfaces.js.map +0 -1
  288. package/lib/cjs/vertexai/debug.js +0 -12
  289. package/lib/cjs/vertexai/debug.js.map +0 -1
  290. package/lib/cjs/vertexai/embeddings/embeddings-image.js +0 -27
  291. package/lib/cjs/vertexai/embeddings/embeddings-image.js.map +0 -1
  292. package/lib/cjs/vertexai/embeddings/embeddings-text.js +0 -23
  293. package/lib/cjs/vertexai/embeddings/embeddings-text.js.map +0 -1
  294. package/lib/cjs/vertexai/index.js +0 -644
  295. package/lib/cjs/vertexai/index.js.map +0 -1
  296. package/lib/cjs/vertexai/models/claude.js +0 -72
  297. package/lib/cjs/vertexai/models/claude.js.map +0 -1
  298. package/lib/cjs/vertexai/models/gemini.js +0 -864
  299. package/lib/cjs/vertexai/models/gemini.js.map +0 -1
  300. package/lib/cjs/vertexai/models/imagen.js +0 -303
  301. package/lib/cjs/vertexai/models/imagen.js.map +0 -1
  302. package/lib/cjs/vertexai/models/llama.js +0 -183
  303. package/lib/cjs/vertexai/models/llama.js.map +0 -1
  304. package/lib/cjs/vertexai/models.js +0 -35
  305. package/lib/cjs/vertexai/models.js.map +0 -1
  306. package/lib/cjs/watsonx/index.js +0 -161
  307. package/lib/cjs/watsonx/index.js.map +0 -1
  308. package/lib/cjs/watsonx/interfaces.js +0 -3
  309. package/lib/cjs/xai/index.js +0 -65
  310. package/lib/cjs/xai/index.js.map +0 -1
  311. package/lib/esm/adobe/firefly.js +0 -116
  312. package/lib/esm/adobe/firefly.js.map +0 -1
  313. package/lib/esm/anthropic/index.js.map +0 -1
  314. package/lib/esm/azure/azure_foundry.js.map +0 -1
  315. package/lib/esm/bedrock/converse.js.map +0 -1
  316. package/lib/esm/bedrock/index.js.map +0 -1
  317. package/lib/esm/bedrock/nova-image-payload.js.map +0 -1
  318. package/lib/esm/bedrock/payloads.js.map +0 -1
  319. package/lib/esm/bedrock/s3.js.map +0 -1
  320. package/lib/esm/bedrock/twelvelabs.js.map +0 -1
  321. package/lib/esm/groq/index.js.map +0 -1
  322. package/lib/esm/huggingface_ie.js.map +0 -1
  323. package/lib/esm/index.js +0 -16
  324. package/lib/esm/index.js.map +0 -1
  325. package/lib/esm/mistral/index.js.map +0 -1
  326. package/lib/esm/mistral/types.js.map +0 -1
  327. package/lib/esm/openai/azure_openai.js.map +0 -1
  328. package/lib/esm/openai/index.js.map +0 -1
  329. package/lib/esm/openai/openai.js +0 -14
  330. package/lib/esm/openai/openai.js.map +0 -1
  331. package/lib/esm/openai/openai_compatible.js.map +0 -1
  332. package/lib/esm/openai/openai_format.js.map +0 -1
  333. package/lib/esm/replicate.js.map +0 -1
  334. package/lib/esm/shared/claude-messages.js.map +0 -1
  335. package/lib/esm/shared/claude-thinking.js.map +0 -1
  336. package/lib/esm/test-driver/TestErrorCompletionStream.js +0 -16
  337. package/lib/esm/test-driver/TestErrorCompletionStream.js.map +0 -1
  338. package/lib/esm/test-driver/TestValidationErrorCompletionStream.js.map +0 -1
  339. package/lib/esm/test-driver/index.js.map +0 -1
  340. package/lib/esm/test-driver/utils.js.map +0 -1
  341. package/lib/esm/togetherai/index.js +0 -122
  342. package/lib/esm/togetherai/index.js.map +0 -1
  343. package/lib/esm/togetherai/interfaces.js.map +0 -1
  344. package/lib/esm/vertexai/debug.js.map +0 -1
  345. package/lib/esm/vertexai/embeddings/embeddings-image.js +0 -24
  346. package/lib/esm/vertexai/embeddings/embeddings-image.js.map +0 -1
  347. package/lib/esm/vertexai/embeddings/embeddings-text.js +0 -20
  348. package/lib/esm/vertexai/embeddings/embeddings-text.js.map +0 -1
  349. package/lib/esm/vertexai/index.js.map +0 -1
  350. package/lib/esm/vertexai/models/claude.js.map +0 -1
  351. package/lib/esm/vertexai/models/gemini.js.map +0 -1
  352. package/lib/esm/vertexai/models/imagen.js.map +0 -1
  353. package/lib/esm/vertexai/models/llama.js.map +0 -1
  354. package/lib/esm/vertexai/models.js.map +0 -1
  355. package/lib/esm/watsonx/index.js.map +0 -1
  356. package/lib/esm/xai/index.js.map +0 -1
  357. package/lib/types/adobe/firefly.d.ts.map +0 -1
  358. package/lib/types/anthropic/index.d.ts.map +0 -1
  359. package/lib/types/azure/azure_foundry.d.ts.map +0 -1
  360. package/lib/types/bedrock/converse.d.ts.map +0 -1
  361. package/lib/types/bedrock/index.d.ts.map +0 -1
  362. package/lib/types/bedrock/nova-image-payload.d.ts.map +0 -1
  363. package/lib/types/bedrock/payloads.d.ts.map +0 -1
  364. package/lib/types/bedrock/s3.d.ts.map +0 -1
  365. package/lib/types/bedrock/twelvelabs.d.ts.map +0 -1
  366. package/lib/types/groq/index.d.ts.map +0 -1
  367. package/lib/types/huggingface_ie.d.ts.map +0 -1
  368. package/lib/types/index.d.ts +0 -16
  369. package/lib/types/index.d.ts.map +0 -1
  370. package/lib/types/mistral/index.d.ts.map +0 -1
  371. package/lib/types/mistral/types.d.ts.map +0 -1
  372. package/lib/types/openai/azure_openai.d.ts.map +0 -1
  373. package/lib/types/openai/index.d.ts.map +0 -1
  374. package/lib/types/openai/openai.d.ts.map +0 -1
  375. package/lib/types/openai/openai_compatible.d.ts.map +0 -1
  376. package/lib/types/openai/openai_format.d.ts.map +0 -1
  377. package/lib/types/replicate.d.ts.map +0 -1
  378. package/lib/types/shared/claude-messages.d.ts.map +0 -1
  379. package/lib/types/shared/claude-thinking.d.ts.map +0 -1
  380. package/lib/types/test-driver/TestErrorCompletionStream.d.ts.map +0 -1
  381. package/lib/types/test-driver/TestValidationErrorCompletionStream.d.ts.map +0 -1
  382. package/lib/types/test-driver/index.d.ts.map +0 -1
  383. package/lib/types/test-driver/utils.d.ts.map +0 -1
  384. package/lib/types/togetherai/index.d.ts +0 -23
  385. package/lib/types/togetherai/index.d.ts.map +0 -1
  386. package/lib/types/togetherai/interfaces.d.ts.map +0 -1
  387. package/lib/types/vertexai/debug.d.ts +0 -2
  388. package/lib/types/vertexai/debug.d.ts.map +0 -1
  389. package/lib/types/vertexai/embeddings/embeddings-image.d.ts +0 -11
  390. package/lib/types/vertexai/embeddings/embeddings-image.d.ts.map +0 -1
  391. package/lib/types/vertexai/embeddings/embeddings-text.d.ts +0 -10
  392. package/lib/types/vertexai/embeddings/embeddings-text.d.ts.map +0 -1
  393. package/lib/types/vertexai/index.d.ts.map +0 -1
  394. package/lib/types/vertexai/models/claude.d.ts.map +0 -1
  395. package/lib/types/vertexai/models/gemini.d.ts.map +0 -1
  396. package/lib/types/vertexai/models/imagen.d.ts.map +0 -1
  397. package/lib/types/vertexai/models/llama.d.ts.map +0 -1
  398. package/lib/types/vertexai/models.d.ts +0 -20
  399. package/lib/types/vertexai/models.d.ts.map +0 -1
  400. package/lib/types/watsonx/index.d.ts.map +0 -1
  401. package/lib/types/watsonx/interfaces.d.ts.map +0 -1
  402. package/lib/types/xai/index.d.ts.map +0 -1
  403. package/src/vertexai/embeddings/embeddings-image.ts +0 -52
  404. package/src/vertexai/embeddings/embeddings-text.ts +0 -54
  405. /package/lib/{esm/bedrock → bedrock}/payloads.js +0 -0
  406. /package/lib/{esm/mistral → mistral}/types.js +0 -0
  407. /package/lib/{esm/togetherai → togetherai}/interfaces.js +0 -0
  408. /package/lib/{types/watsonx → watsonx}/interfaces.d.ts +0 -0
  409. /package/lib/{esm/watsonx → watsonx}/interfaces.js +0 -0
@@ -0,0 +1,508 @@
1
+ /**
2
+ * Bedrock embedding sub-driver tests.
3
+ *
4
+ * Default (USE_REAL_API = false): all calls are mocked — no credentials required.
5
+ * Live mode (USE_REAL_API = true): a real BedrockDriver is used for the live
6
+ * describe block. Requires standard AWS credential resolution in the environment
7
+ * (e.g. AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY, an assumed role, or an
8
+ * instance / ECS task profile). The models must be enabled in your Bedrock console.
9
+ */
10
+ import { Base64DataSource, URLDataSource } from '@llumiverse/core';
11
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
12
+ import { generateBedrockEmbeddings } from './embeddings.js';
13
+ import { BedrockDriver } from './index.js';
14
+
15
+ // ── Live-mode toggle ──────────────────────────────────────────────────────────
16
+ /** Set to true to run tests against the real Bedrock API instead of the mock. */
17
+ const USE_REAL_API = false;
18
+ /** AWS region used for live tests. Override with AWS_REGION env var if desired. */
19
+ const LIVE_REGION = process.env.AWS_REGION ?? 'us-east-1';
20
+
21
+ /**
22
+ * Minimal 8×8 white PNG (base64) used as inline image fixture in live tests.
23
+ * Small enough to be well inside Bedrock's inline-bytes limits.
24
+ */
25
+ const TINY_PNG_B64 =
26
+ 'iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAADklEQVQI12P4' + 'z8BQDwADhQGAWjR9awAAAABJRU5ErkJggg==';
27
+
28
+ // Minimal fake BedrockRuntime executor
29
+ function makeExecutor(responseBody: unknown) {
30
+ return {
31
+ invokeModel: vi.fn().mockResolvedValue({
32
+ body: Buffer.from(JSON.stringify(responseBody)),
33
+ }),
34
+ };
35
+ }
36
+
37
+ function makeDriver(responseBody: unknown) {
38
+ const driver = new BedrockDriver({ region: 'us-east-1' });
39
+ const executor = makeExecutor(responseBody);
40
+ vi.spyOn(driver, 'getExecutor').mockReturnValue(executor as never);
41
+ return { driver, executor };
42
+ }
43
+
44
+ const FAKE_VECTOR = [0.1, 0.2, 0.3];
45
+
46
+ // =================== Routing ===================
47
+
48
+ describe('generateBedrockEmbeddings — routing', () => {
49
+ it('routes to Nova for default (no model)', async () => {
50
+ const { driver, executor } = makeDriver({ embeddings: [{ embeddingType: 'TEXT', embedding: FAKE_VECTOR }] });
51
+ await generateBedrockEmbeddings(driver, { inputs: [{ type: 'text', text: 'hi' }] });
52
+ const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
53
+ expect(executor.invokeModel.mock.calls[0][0].modelId).toBe('amazon.nova-2-multimodal-embeddings-v1:0');
54
+ expect(body.taskType).toBe('SINGLE_EMBEDDING');
55
+ });
56
+
57
+ it('routes to Titan for titan-embed-text model', async () => {
58
+ const { driver, executor } = makeDriver({ embedding: FAKE_VECTOR });
59
+ await generateBedrockEmbeddings(driver, {
60
+ inputs: [{ type: 'text', text: 'hi' }],
61
+ model: 'amazon.titan-embed-text-v2:0',
62
+ });
63
+ expect(executor.invokeModel.mock.calls[0][0].modelId).toBe('amazon.titan-embed-text-v2:0');
64
+ const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
65
+ expect(body.inputText).toBe('hi');
66
+ });
67
+
68
+ it('routes to Cohere for cohere.embed model', async () => {
69
+ const { driver, executor } = makeDriver({ embeddings: [FAKE_VECTOR] });
70
+ await generateBedrockEmbeddings(driver, {
71
+ inputs: [{ type: 'text', text: 'hi' }],
72
+ model: 'cohere.embed-english-v3',
73
+ });
74
+ expect(executor.invokeModel.mock.calls[0][0].modelId).toBe('cohere.embed-english-v3');
75
+ const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
76
+ expect(body.texts).toEqual(['hi']);
77
+ });
78
+ });
79
+
80
+ // =================== Nova ===================
81
+
82
+ describe('generateBedrockEmbeddings — Nova', () => {
83
+ it('builds correct text request and maps result', async () => {
84
+ const { driver, executor } = makeDriver({ embeddings: [{ embeddingType: 'TEXT', embedding: FAKE_VECTOR }] });
85
+ const result = await generateBedrockEmbeddings(driver, {
86
+ inputs: [{ type: 'text', text: 'hello' }],
87
+ });
88
+
89
+ const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
90
+ expect(body.taskType).toBe('SINGLE_EMBEDDING');
91
+ expect(body.singleEmbeddingParams.text.value).toBe('hello');
92
+ expect(body.singleEmbeddingParams.text.truncationMode).toBe('END');
93
+ expect(body.singleEmbeddingParams.embeddingPurpose).toBe('GENERIC_INDEX');
94
+
95
+ expect(result.results).toHaveLength(1);
96
+ expect(result.results[0].outputs[0].values).toEqual(FAKE_VECTOR);
97
+ expect(result.results[0].outputs[0].modality).toBe('text');
98
+ });
99
+
100
+ it('sets embeddingPurpose GENERIC_RETRIEVAL for task_type query', async () => {
101
+ const { driver, executor } = makeDriver({ embeddings: [{ embeddingType: 'TEXT', embedding: FAKE_VECTOR }] });
102
+ await generateBedrockEmbeddings(driver, {
103
+ inputs: [{ type: 'text', text: 'find me' }],
104
+ task_type: 'query',
105
+ });
106
+ const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
107
+ expect(body.singleEmbeddingParams.embeddingPurpose).toBe('GENERIC_RETRIEVAL');
108
+ });
109
+
110
+ it('builds correct image request (base64 bytes)', async () => {
111
+ const { driver, executor } = makeDriver({ embeddings: [{ embeddingType: 'IMAGE', embedding: FAKE_VECTOR }] });
112
+ const b64 = Buffer.from('img-bytes').toString('base64');
113
+ const ds = new Base64DataSource('img.jpg', 'image/jpeg', b64);
114
+
115
+ await generateBedrockEmbeddings(driver, {
116
+ inputs: [{ type: 'image', source: ds }],
117
+ });
118
+
119
+ const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
120
+ expect(body.taskType).toBe('SINGLE_EMBEDDING');
121
+ expect(body.singleEmbeddingParams.image.source.bytes).toBe(b64);
122
+ expect(body.singleEmbeddingParams.image.format).toBe('jpeg');
123
+ });
124
+
125
+ it('passes embeddingDimension when dimensions is set', async () => {
126
+ const { driver, executor } = makeDriver({ embeddings: [{ embeddingType: 'TEXT', embedding: FAKE_VECTOR }] });
127
+ await generateBedrockEmbeddings(driver, {
128
+ inputs: [{ type: 'text', text: 'x' }],
129
+ dimensions: 256,
130
+ });
131
+ const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
132
+ expect(body.singleEmbeddingParams.embeddingDimension).toBe(256);
133
+ });
134
+
135
+ it('throws when response has no embeddings array', async () => {
136
+ const { driver } = makeDriver({ someOtherField: [] });
137
+ await expect(generateBedrockEmbeddings(driver, { inputs: [{ type: 'text', text: 'x' }] })).rejects.toThrow(
138
+ "Nova embeddings response missing 'embeddings[0].embedding'",
139
+ );
140
+ });
141
+ });
142
+
143
+ // =================== Nova S3 URL passthrough ===================
144
+
145
+ describe('generateBedrockEmbeddings — Nova S3 URL passthrough', () => {
146
+ it('passes s3Location for s3:// URLs (video)', async () => {
147
+ const { driver, executor } = makeDriver({ embeddings: [{ embeddingType: 'VIDEO', embedding: FAKE_VECTOR }] });
148
+ const ds = new URLDataSource('video.mp4', 'video/mp4', 's3://my-bucket/video.mp4');
149
+
150
+ await generateBedrockEmbeddings(driver, {
151
+ inputs: [{ type: 'video', source: ds }],
152
+ });
153
+
154
+ const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
155
+ expect(body.taskType).toBe('SINGLE_EMBEDDING');
156
+ expect(body.singleEmbeddingParams.video.source.s3Location.uri).toBe('s3://my-bucket/video.mp4');
157
+ expect(body.singleEmbeddingParams.video.source.bytes).toBeUndefined();
158
+ expect(body.singleEmbeddingParams.video.embeddingMode).toBe('AUDIO_VIDEO_COMBINED');
159
+ });
160
+
161
+ it('passes s3Location for amazonaws.com URLs (audio)', async () => {
162
+ const { driver, executor } = makeDriver({ embeddings: [{ embeddingType: 'AUDIO', embedding: FAKE_VECTOR }] });
163
+ const s3HttpsUrl = 'https://s3.us-east-1.amazonaws.com/my-bucket/audio.mp3';
164
+ const ds = new URLDataSource('audio.mp3', 'audio/mpeg', s3HttpsUrl);
165
+
166
+ await generateBedrockEmbeddings(driver, {
167
+ inputs: [{ type: 'audio', source: ds }],
168
+ });
169
+
170
+ const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
171
+ expect(body.taskType).toBe('SINGLE_EMBEDDING');
172
+ expect(body.singleEmbeddingParams.audio.source.s3Location).toBeDefined();
173
+ expect(body.singleEmbeddingParams.audio.source.bytes).toBeUndefined();
174
+ });
175
+
176
+ it('converts path-style HTTPS S3 URL to correct s3:// URI (Nova audio)', async () => {
177
+ // Regression: path-style https://s3.region.amazonaws.com/bucket/key was previously
178
+ // mis-converted to s3://s3/bucket/key instead of s3://bucket/key.
179
+ const { driver, executor } = makeDriver({ embeddings: [{ embeddingType: 'AUDIO', embedding: FAKE_VECTOR }] });
180
+ const ds = new URLDataSource(
181
+ 'audio.mp3',
182
+ 'audio/mpeg',
183
+ 'https://s3.us-east-1.amazonaws.com/my-bucket/audio.mp3',
184
+ );
185
+ await generateBedrockEmbeddings(driver, { inputs: [{ type: 'audio', source: ds }] });
186
+ const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
187
+ expect(body.singleEmbeddingParams.audio.source.s3Location.uri).toBe('s3://my-bucket/audio.mp3');
188
+ });
189
+
190
+ it('converts virtual-hosted HTTPS S3 URL to correct s3:// URI (Nova video)', async () => {
191
+ const { driver, executor } = makeDriver({ embeddings: [{ embeddingType: 'VIDEO', embedding: FAKE_VECTOR }] });
192
+ const ds = new URLDataSource(
193
+ 'vid.mp4',
194
+ 'video/mp4',
195
+ 'https://my-bucket.s3.us-east-1.amazonaws.com/folder/vid.mp4',
196
+ );
197
+ await generateBedrockEmbeddings(driver, { inputs: [{ type: 'video', source: ds }] });
198
+ const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
199
+ expect(body.singleEmbeddingParams.video.source.s3Location.uri).toBe('s3://my-bucket/folder/vid.mp4');
200
+ });
201
+ });
202
+
203
+ // =================== Titan ===================
204
+
205
+ describe('generateBedrockEmbeddings — Titan', () => {
206
+ beforeEach(() => {
207
+ vi.restoreAllMocks();
208
+ });
209
+
210
+ it('sends text to titan text model', async () => {
211
+ const { driver, executor } = makeDriver({ embedding: FAKE_VECTOR, inputTextTokenCount: 1 });
212
+ const result = await generateBedrockEmbeddings(driver, {
213
+ inputs: [{ type: 'text', text: 'test' }],
214
+ model: 'amazon.titan-embed-text-v2:0',
215
+ });
216
+
217
+ const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
218
+ expect(body.inputText).toBe('test');
219
+ expect(result.results[0].outputs[0].values).toEqual(FAKE_VECTOR);
220
+ });
221
+
222
+ it('sends image base64 to titan image model', async () => {
223
+ const { driver, executor } = makeDriver({ embedding: FAKE_VECTOR });
224
+ const b64 = Buffer.from('img').toString('base64');
225
+ const ds = new Base64DataSource('img.jpg', 'image/jpeg', b64);
226
+
227
+ await generateBedrockEmbeddings(driver, {
228
+ inputs: [{ type: 'image', source: ds }],
229
+ model: 'amazon.titan-embed-image-v1',
230
+ });
231
+
232
+ const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
233
+ expect(body.inputImage).toBe(b64);
234
+ expect(body.inputText).toBeUndefined();
235
+ });
236
+
237
+ it('throws for video/audio input on titan', async () => {
238
+ const { driver } = makeDriver({});
239
+ const ds = new URLDataSource('v.mp4', 'video/mp4', 's3://b/v.mp4');
240
+ await expect(
241
+ generateBedrockEmbeddings(driver, {
242
+ inputs: [{ type: 'video', source: ds }],
243
+ model: 'amazon.titan-embed-text-v2:0',
244
+ }),
245
+ ).rejects.toThrow("do not support 'video' input");
246
+ });
247
+
248
+ it('throws when titan text embedding response has no embedding field', async () => {
249
+ // Regression: a malformed response (missing 'embedding') should throw, not push undefined.
250
+ const { driver } = makeDriver({ inputTextTokenCount: 1 }); // no embedding field
251
+ await expect(
252
+ generateBedrockEmbeddings(driver, {
253
+ inputs: [{ type: 'text', text: 'test' }],
254
+ model: 'amazon.titan-embed-text-v2:0',
255
+ }),
256
+ ).rejects.toThrow("missing 'embedding'");
257
+ });
258
+ });
259
+
260
+ // =================== Cohere ===================
261
+
262
+ describe('generateBedrockEmbeddings — Cohere task_type mapping', () => {
263
+ it("maps task_type 'query' to input_type 'search_query'", async () => {
264
+ const { driver, executor } = makeDriver({ embeddings: [FAKE_VECTOR] });
265
+ await generateBedrockEmbeddings(driver, {
266
+ inputs: [{ type: 'text', text: 'find me' }],
267
+ model: 'cohere.embed-english-v3',
268
+ task_type: 'query',
269
+ });
270
+
271
+ const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
272
+ expect(body.input_type).toBe('search_query');
273
+ });
274
+
275
+ it("maps task_type 'document' to input_type 'search_document'", async () => {
276
+ const { driver, executor } = makeDriver({ embeddings: [FAKE_VECTOR] });
277
+ await generateBedrockEmbeddings(driver, {
278
+ inputs: [{ type: 'text', text: 'content' }],
279
+ model: 'cohere.embed-english-v3',
280
+ task_type: 'document',
281
+ });
282
+
283
+ const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
284
+ expect(body.input_type).toBe('search_document');
285
+ });
286
+
287
+ it('omits input_type when task_type is undefined', async () => {
288
+ const { driver, executor } = makeDriver({ embeddings: [FAKE_VECTOR] });
289
+ await generateBedrockEmbeddings(driver, {
290
+ inputs: [{ type: 'text', text: 'content' }],
291
+ model: 'cohere.embed-english-v3',
292
+ });
293
+
294
+ const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
295
+ expect(body.input_type).toBeUndefined();
296
+ });
297
+
298
+ it('batches multiple text inputs in a single call', async () => {
299
+ const { driver, executor } = makeDriver({ embeddings: [FAKE_VECTOR, [0.4, 0.5]] });
300
+ const result = await generateBedrockEmbeddings(driver, {
301
+ inputs: [
302
+ { type: 'text', text: 'first' },
303
+ { type: 'text', text: 'second' },
304
+ ],
305
+ model: 'cohere.embed-english-v3',
306
+ });
307
+
308
+ expect(executor.invokeModel).toHaveBeenCalledTimes(1);
309
+ const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
310
+ expect(body.texts).toEqual(['first', 'second']);
311
+ expect(result.results).toHaveLength(2);
312
+ expect(result.results[0].outputs[0].values).toEqual(FAKE_VECTOR);
313
+ expect(result.results[1].outputs[0].values).toEqual([0.4, 0.5]);
314
+ });
315
+
316
+ it('does not send embedding_types field', async () => {
317
+ const { driver, executor } = makeDriver({ embeddings: [FAKE_VECTOR] });
318
+ await generateBedrockEmbeddings(driver, {
319
+ inputs: [{ type: 'text', text: 'hi' }],
320
+ model: 'cohere.embed-english-v3',
321
+ });
322
+
323
+ const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
324
+ expect(body.embedding_types).toBeUndefined();
325
+ expect(body.truncate).toBeUndefined();
326
+ });
327
+
328
+ it('per-input task_type overrides the global default for Cohere text', async () => {
329
+ // One "query" input overrides the global "document" task_type.
330
+ const { driver, executor } = makeDriver({ embeddings: [FAKE_VECTOR] });
331
+ await generateBedrockEmbeddings(driver, {
332
+ inputs: [{ type: 'text', text: 'find me', task_type: 'query' }],
333
+ model: 'cohere.embed-english-v3',
334
+ task_type: 'document',
335
+ });
336
+ const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
337
+ expect(body.input_type).toBe('search_query');
338
+ });
339
+
340
+ it('splits texts into separate Cohere batches when task_types differ', async () => {
341
+ // Two texts with different effective task_types must go in separate invocations.
342
+ const { driver, executor } = makeDriver({ embeddings: [FAKE_VECTOR] });
343
+ await generateBedrockEmbeddings(driver, {
344
+ inputs: [
345
+ { type: 'text', text: 'query text', task_type: 'query' },
346
+ { type: 'text', text: 'doc text', task_type: 'document' },
347
+ ],
348
+ model: 'cohere.embed-english-v3',
349
+ });
350
+ expect(executor.invokeModel).toHaveBeenCalledTimes(2);
351
+ const bodies = executor.invokeModel.mock.calls.map((c: { body: string }[]) => JSON.parse(c[0].body));
352
+ const inputTypes = bodies.map((b: { input_type: string }) => b.input_type).sort();
353
+ expect(inputTypes).toEqual(['search_document', 'search_query']);
354
+ });
355
+
356
+ it('throws when Cohere returns fewer embeddings than inputs', async () => {
357
+ // Cohere returned 0 embeddings for a batch of 1 text — should throw, not silently store undefined.
358
+ const { driver } = makeDriver({ embeddings: [] });
359
+ await expect(
360
+ generateBedrockEmbeddings(driver, {
361
+ inputs: [{ type: 'text', text: 'test' }],
362
+ model: 'cohere.embed-english-v3',
363
+ }),
364
+ ).rejects.toThrow('Cohere returned 0 embeddings for 1 texts');
365
+ });
366
+
367
+ it('throws when Cohere returns no embedding for image input', async () => {
368
+ const { driver } = makeDriver({ embeddings: [] });
369
+ const b64 = Buffer.from('img').toString('base64');
370
+ const ds = new Base64DataSource('img.jpg', 'image/jpeg', b64);
371
+ await expect(
372
+ generateBedrockEmbeddings(driver, {
373
+ inputs: [{ type: 'image', source: ds }],
374
+ model: 'cohere.embed-english-v3',
375
+ }),
376
+ ).rejects.toThrow('Cohere returned no embedding for image input');
377
+ });
378
+ });
379
+
380
+ // =================== Nova per-input task_type ===================
381
+
382
+ describe('generateBedrockEmbeddings — Nova per-input task_type', () => {
383
+ it('per-input task_type overrides the global default for Nova text', async () => {
384
+ const { driver, executor } = makeDriver({ embeddings: [{ embeddingType: 'TEXT', embedding: FAKE_VECTOR }] });
385
+ await generateBedrockEmbeddings(driver, {
386
+ inputs: [{ type: 'text', text: 'find me', task_type: 'query' }],
387
+ task_type: 'document',
388
+ });
389
+ const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
390
+ expect(body.singleEmbeddingParams.embeddingPurpose).toBe('GENERIC_RETRIEVAL');
391
+ });
392
+
393
+ it('non-text inputs fall back to global task_type for Nova purpose', async () => {
394
+ const { driver, executor } = makeDriver({ embeddings: [{ embeddingType: 'IMAGE', embedding: FAKE_VECTOR }] });
395
+ const b64 = Buffer.from('img').toString('base64');
396
+ const ds = new Base64DataSource('img.jpg', 'image/jpeg', b64);
397
+ await generateBedrockEmbeddings(driver, {
398
+ inputs: [{ type: 'image', source: ds }],
399
+ task_type: 'query',
400
+ });
401
+ const body = JSON.parse(executor.invokeModel.mock.calls[0][0].body);
402
+ expect(body.singleEmbeddingParams.embeddingPurpose).toBe('GENERIC_RETRIEVAL');
403
+ });
404
+ });
405
+
406
+ // =================== Live API tests ===================
407
+ // Skipped unless USE_REAL_API = true.
408
+ // Each test has a 30 s timeout to accommodate cold-start latency.
409
+
410
+ function makeLiveDriver() {
411
+ return new BedrockDriver({ region: LIVE_REGION });
412
+ }
413
+
414
+ function assertVector(values: number[]) {
415
+ expect(Array.isArray(values)).toBe(true);
416
+ expect(values.length).toBeGreaterThan(0);
417
+ expect(values.every((v) => typeof v === 'number' && Number.isFinite(v))).toBe(true);
418
+ }
419
+
420
+ describe.skipIf(!USE_REAL_API)('generateBedrockEmbeddings — live API', () => {
421
+ it('Nova: text embedding (GENERIC_INDEX)', async () => {
422
+ const result = await generateBedrockEmbeddings(makeLiveDriver(), {
423
+ inputs: [{ type: 'text', text: 'The quick brown fox jumps over the lazy dog' }],
424
+ });
425
+ expect(result.results).toHaveLength(1);
426
+ assertVector(result.results[0].outputs[0].values);
427
+ expect(result.results[0].outputs[0].modality).toBe('text');
428
+ }, 30_000);
429
+
430
+ it('Nova: text embedding — query purpose (GENERIC_RETRIEVAL)', async () => {
431
+ const result = await generateBedrockEmbeddings(makeLiveDriver(), {
432
+ inputs: [{ type: 'text', text: 'what is the capital of France?' }],
433
+ task_type: 'query',
434
+ });
435
+ assertVector(result.results[0].outputs[0].values);
436
+ }, 30_000);
437
+
438
+ it('Nova: image embedding (inline base64)', async () => {
439
+ const ds = new Base64DataSource('pixel.png', 'image/png', TINY_PNG_B64);
440
+ const result = await generateBedrockEmbeddings(makeLiveDriver(), {
441
+ inputs: [{ type: 'image', source: ds }],
442
+ });
443
+ expect(result.results).toHaveLength(1);
444
+ assertVector(result.results[0].outputs[0].values);
445
+ }, 30_000);
446
+
447
+ it('Nova: dimensions param is respected', async () => {
448
+ const result = await generateBedrockEmbeddings(makeLiveDriver(), {
449
+ inputs: [{ type: 'text', text: 'dimension test' }],
450
+ dimensions: 256,
451
+ });
452
+ assertVector(result.results[0].outputs[0].values);
453
+ expect(result.results[0].outputs[0].values.length).toBe(256);
454
+ }, 30_000);
455
+
456
+ it('Titan text (titan-embed-text-v2): returns an embedding', async () => {
457
+ const result = await generateBedrockEmbeddings(makeLiveDriver(), {
458
+ inputs: [{ type: 'text', text: 'The quick brown fox' }],
459
+ model: 'amazon.titan-embed-text-v2:0',
460
+ });
461
+ expect(result.results).toHaveLength(1);
462
+ assertVector(result.results[0].outputs[0].values);
463
+ }, 30_000);
464
+
465
+ it('Titan image (titan-embed-image-v1): returns an embedding', async () => {
466
+ const ds = new Base64DataSource('pixel.png', 'image/png', TINY_PNG_B64);
467
+ const result = await generateBedrockEmbeddings(makeLiveDriver(), {
468
+ inputs: [{ type: 'image', source: ds }],
469
+ model: 'amazon.titan-embed-image-v1',
470
+ });
471
+ expect(result.results).toHaveLength(1);
472
+ assertVector(result.results[0].outputs[0].values);
473
+ }, 30_000);
474
+
475
+ it('Cohere English (cohere.embed-english-v3): returns a text embedding', async () => {
476
+ const result = await generateBedrockEmbeddings(makeLiveDriver(), {
477
+ inputs: [{ type: 'text', text: 'The quick brown fox' }],
478
+ model: 'cohere.embed-english-v3',
479
+ task_type: 'document',
480
+ });
481
+ expect(result.results).toHaveLength(1);
482
+ assertVector(result.results[0].outputs[0].values);
483
+ }, 30_000);
484
+
485
+ it('Cohere English: batches multiple texts in one call', async () => {
486
+ const result = await generateBedrockEmbeddings(makeLiveDriver(), {
487
+ inputs: [
488
+ { type: 'text', text: 'first document' },
489
+ { type: 'text', text: 'second document' },
490
+ ],
491
+ model: 'cohere.embed-english-v3',
492
+ task_type: 'document',
493
+ });
494
+ expect(result.results).toHaveLength(2);
495
+ assertVector(result.results[0].outputs[0].values);
496
+ assertVector(result.results[1].outputs[0].values);
497
+ }, 30_000);
498
+
499
+ it('Cohere Multilingual (cohere.embed-multilingual-v3): returns a text embedding', async () => {
500
+ const result = await generateBedrockEmbeddings(makeLiveDriver(), {
501
+ inputs: [{ type: 'text', text: 'Le renard brun rapide' }],
502
+ model: 'cohere.embed-multilingual-v3',
503
+ task_type: 'document',
504
+ });
505
+ expect(result.results).toHaveLength(1);
506
+ assertVector(result.results[0].outputs[0].values);
507
+ }, 30_000);
508
+ });