@llumiverse/drivers 1.2.0 → 1.4.0-dev.20260629.090753Z

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 (403) 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/anthropic/index.d.ts +23 -0
  6. package/lib/anthropic/index.d.ts.map +1 -0
  7. package/lib/anthropic/index.js +68 -0
  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 +17 -5
  68. package/lib/openai/index.d.ts.map +1 -0
  69. package/lib/{esm/openai → openai}/index.js +254 -148
  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/shared/claude-messages.d.ts +99 -0
  88. package/lib/shared/claude-messages.d.ts.map +1 -0
  89. package/lib/shared/claude-messages.js +869 -0
  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/vertexai/models/claude.d.ts +16 -0
  143. package/lib/vertexai/models/claude.d.ts.map +1 -0
  144. package/lib/vertexai/models/claude.js +65 -0
  145. package/lib/vertexai/models/claude.js.map +1 -0
  146. package/lib/{types/vertexai → vertexai}/models/gemini.d.ts +29 -5
  147. package/lib/vertexai/models/gemini.d.ts.map +1 -0
  148. package/lib/{esm/vertexai → vertexai}/models/gemini.js +255 -127
  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 +88 -36
  173. package/src/adobe/firefly.ts +60 -43
  174. package/src/anthropic/index.ts +121 -0
  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 -15
  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 +389 -254
  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 +1085 -0
  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 +339 -253
  219. package/src/vertexai/models/claude-error-handling.test.ts +86 -39
  220. package/src/vertexai/models/claude-streaming-spacing.test.ts +82 -75
  221. package/src/vertexai/models/claude.ts +84 -1041
  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 +372 -182
  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/azure/azure_foundry.js +0 -432
  235. package/lib/cjs/azure/azure_foundry.js.map +0 -1
  236. package/lib/cjs/bedrock/converse.js +0 -359
  237. package/lib/cjs/bedrock/converse.js.map +0 -1
  238. package/lib/cjs/bedrock/index.js +0 -1508
  239. package/lib/cjs/bedrock/index.js.map +0 -1
  240. package/lib/cjs/bedrock/nova-image-payload.js +0 -207
  241. package/lib/cjs/bedrock/nova-image-payload.js.map +0 -1
  242. package/lib/cjs/bedrock/payloads.js +0 -3
  243. package/lib/cjs/bedrock/s3.js +0 -107
  244. package/lib/cjs/bedrock/s3.js.map +0 -1
  245. package/lib/cjs/bedrock/twelvelabs.js +0 -87
  246. package/lib/cjs/bedrock/twelvelabs.js.map +0 -1
  247. package/lib/cjs/groq/index.js +0 -328
  248. package/lib/cjs/groq/index.js.map +0 -1
  249. package/lib/cjs/huggingface_ie.js +0 -201
  250. package/lib/cjs/huggingface_ie.js.map +0 -1
  251. package/lib/cjs/index.js +0 -31
  252. package/lib/cjs/index.js.map +0 -1
  253. package/lib/cjs/mistral/index.js +0 -176
  254. package/lib/cjs/mistral/index.js.map +0 -1
  255. package/lib/cjs/mistral/types.js +0 -83
  256. package/lib/cjs/mistral/types.js.map +0 -1
  257. package/lib/cjs/openai/azure_openai.js +0 -72
  258. package/lib/cjs/openai/azure_openai.js.map +0 -1
  259. package/lib/cjs/openai/index.js +0 -1129
  260. package/lib/cjs/openai/index.js.map +0 -1
  261. package/lib/cjs/openai/openai.js +0 -21
  262. package/lib/cjs/openai/openai.js.map +0 -1
  263. package/lib/cjs/openai/openai_compatible.js +0 -63
  264. package/lib/cjs/openai/openai_compatible.js.map +0 -1
  265. package/lib/cjs/openai/openai_format.js +0 -131
  266. package/lib/cjs/openai/openai_format.js.map +0 -1
  267. package/lib/cjs/package.json +0 -3
  268. package/lib/cjs/replicate.js +0 -275
  269. package/lib/cjs/replicate.js.map +0 -1
  270. package/lib/cjs/shared/claude-thinking.js +0 -60
  271. package/lib/cjs/shared/claude-thinking.js.map +0 -1
  272. package/lib/cjs/test-driver/TestErrorCompletionStream.js +0 -20
  273. package/lib/cjs/test-driver/TestErrorCompletionStream.js.map +0 -1
  274. package/lib/cjs/test-driver/TestValidationErrorCompletionStream.js +0 -24
  275. package/lib/cjs/test-driver/TestValidationErrorCompletionStream.js.map +0 -1
  276. package/lib/cjs/test-driver/index.js +0 -109
  277. package/lib/cjs/test-driver/index.js.map +0 -1
  278. package/lib/cjs/test-driver/utils.js +0 -30
  279. package/lib/cjs/test-driver/utils.js.map +0 -1
  280. package/lib/cjs/togetherai/index.js +0 -126
  281. package/lib/cjs/togetherai/index.js.map +0 -1
  282. package/lib/cjs/togetherai/interfaces.js +0 -3
  283. package/lib/cjs/togetherai/interfaces.js.map +0 -1
  284. package/lib/cjs/vertexai/debug.js +0 -12
  285. package/lib/cjs/vertexai/debug.js.map +0 -1
  286. package/lib/cjs/vertexai/embeddings/embeddings-image.js +0 -27
  287. package/lib/cjs/vertexai/embeddings/embeddings-image.js.map +0 -1
  288. package/lib/cjs/vertexai/embeddings/embeddings-text.js +0 -23
  289. package/lib/cjs/vertexai/embeddings/embeddings-text.js.map +0 -1
  290. package/lib/cjs/vertexai/index.js +0 -644
  291. package/lib/cjs/vertexai/index.js.map +0 -1
  292. package/lib/cjs/vertexai/models/claude.js +0 -917
  293. package/lib/cjs/vertexai/models/claude.js.map +0 -1
  294. package/lib/cjs/vertexai/models/gemini.js +0 -858
  295. package/lib/cjs/vertexai/models/gemini.js.map +0 -1
  296. package/lib/cjs/vertexai/models/imagen.js +0 -303
  297. package/lib/cjs/vertexai/models/imagen.js.map +0 -1
  298. package/lib/cjs/vertexai/models/llama.js +0 -183
  299. package/lib/cjs/vertexai/models/llama.js.map +0 -1
  300. package/lib/cjs/vertexai/models.js +0 -35
  301. package/lib/cjs/vertexai/models.js.map +0 -1
  302. package/lib/cjs/watsonx/index.js +0 -161
  303. package/lib/cjs/watsonx/index.js.map +0 -1
  304. package/lib/cjs/watsonx/interfaces.js +0 -3
  305. package/lib/cjs/xai/index.js +0 -65
  306. package/lib/cjs/xai/index.js.map +0 -1
  307. package/lib/esm/adobe/firefly.js +0 -116
  308. package/lib/esm/adobe/firefly.js.map +0 -1
  309. package/lib/esm/azure/azure_foundry.js.map +0 -1
  310. package/lib/esm/bedrock/converse.js.map +0 -1
  311. package/lib/esm/bedrock/index.js.map +0 -1
  312. package/lib/esm/bedrock/nova-image-payload.js.map +0 -1
  313. package/lib/esm/bedrock/payloads.js.map +0 -1
  314. package/lib/esm/bedrock/s3.js.map +0 -1
  315. package/lib/esm/bedrock/twelvelabs.js.map +0 -1
  316. package/lib/esm/groq/index.js.map +0 -1
  317. package/lib/esm/huggingface_ie.js.map +0 -1
  318. package/lib/esm/index.js +0 -15
  319. package/lib/esm/index.js.map +0 -1
  320. package/lib/esm/mistral/index.js.map +0 -1
  321. package/lib/esm/mistral/types.js.map +0 -1
  322. package/lib/esm/openai/azure_openai.js.map +0 -1
  323. package/lib/esm/openai/index.js.map +0 -1
  324. package/lib/esm/openai/openai.js +0 -14
  325. package/lib/esm/openai/openai.js.map +0 -1
  326. package/lib/esm/openai/openai_compatible.js.map +0 -1
  327. package/lib/esm/openai/openai_format.js.map +0 -1
  328. package/lib/esm/replicate.js.map +0 -1
  329. package/lib/esm/shared/claude-thinking.js.map +0 -1
  330. package/lib/esm/test-driver/TestErrorCompletionStream.js +0 -16
  331. package/lib/esm/test-driver/TestErrorCompletionStream.js.map +0 -1
  332. package/lib/esm/test-driver/TestValidationErrorCompletionStream.js.map +0 -1
  333. package/lib/esm/test-driver/index.js.map +0 -1
  334. package/lib/esm/test-driver/utils.js.map +0 -1
  335. package/lib/esm/togetherai/index.js +0 -122
  336. package/lib/esm/togetherai/index.js.map +0 -1
  337. package/lib/esm/togetherai/interfaces.js.map +0 -1
  338. package/lib/esm/vertexai/debug.js.map +0 -1
  339. package/lib/esm/vertexai/embeddings/embeddings-image.js +0 -24
  340. package/lib/esm/vertexai/embeddings/embeddings-image.js.map +0 -1
  341. package/lib/esm/vertexai/embeddings/embeddings-text.js +0 -20
  342. package/lib/esm/vertexai/embeddings/embeddings-text.js.map +0 -1
  343. package/lib/esm/vertexai/index.js.map +0 -1
  344. package/lib/esm/vertexai/models/claude.js +0 -906
  345. package/lib/esm/vertexai/models/claude.js.map +0 -1
  346. package/lib/esm/vertexai/models/gemini.js.map +0 -1
  347. package/lib/esm/vertexai/models/imagen.js.map +0 -1
  348. package/lib/esm/vertexai/models/llama.js.map +0 -1
  349. package/lib/esm/vertexai/models.js.map +0 -1
  350. package/lib/esm/watsonx/index.js.map +0 -1
  351. package/lib/esm/xai/index.js.map +0 -1
  352. package/lib/types/adobe/firefly.d.ts.map +0 -1
  353. package/lib/types/azure/azure_foundry.d.ts.map +0 -1
  354. package/lib/types/bedrock/converse.d.ts.map +0 -1
  355. package/lib/types/bedrock/index.d.ts.map +0 -1
  356. package/lib/types/bedrock/nova-image-payload.d.ts.map +0 -1
  357. package/lib/types/bedrock/payloads.d.ts.map +0 -1
  358. package/lib/types/bedrock/s3.d.ts.map +0 -1
  359. package/lib/types/bedrock/twelvelabs.d.ts.map +0 -1
  360. package/lib/types/groq/index.d.ts.map +0 -1
  361. package/lib/types/huggingface_ie.d.ts.map +0 -1
  362. package/lib/types/index.d.ts +0 -15
  363. package/lib/types/index.d.ts.map +0 -1
  364. package/lib/types/mistral/index.d.ts.map +0 -1
  365. package/lib/types/mistral/types.d.ts.map +0 -1
  366. package/lib/types/openai/azure_openai.d.ts.map +0 -1
  367. package/lib/types/openai/index.d.ts.map +0 -1
  368. package/lib/types/openai/openai.d.ts.map +0 -1
  369. package/lib/types/openai/openai_compatible.d.ts.map +0 -1
  370. package/lib/types/openai/openai_format.d.ts.map +0 -1
  371. package/lib/types/replicate.d.ts.map +0 -1
  372. package/lib/types/shared/claude-thinking.d.ts.map +0 -1
  373. package/lib/types/test-driver/TestErrorCompletionStream.d.ts.map +0 -1
  374. package/lib/types/test-driver/TestValidationErrorCompletionStream.d.ts.map +0 -1
  375. package/lib/types/test-driver/index.d.ts.map +0 -1
  376. package/lib/types/test-driver/utils.d.ts.map +0 -1
  377. package/lib/types/togetherai/index.d.ts +0 -23
  378. package/lib/types/togetherai/index.d.ts.map +0 -1
  379. package/lib/types/togetherai/interfaces.d.ts.map +0 -1
  380. package/lib/types/vertexai/debug.d.ts +0 -2
  381. package/lib/types/vertexai/debug.d.ts.map +0 -1
  382. package/lib/types/vertexai/embeddings/embeddings-image.d.ts +0 -11
  383. package/lib/types/vertexai/embeddings/embeddings-image.d.ts.map +0 -1
  384. package/lib/types/vertexai/embeddings/embeddings-text.d.ts +0 -10
  385. package/lib/types/vertexai/embeddings/embeddings-text.d.ts.map +0 -1
  386. package/lib/types/vertexai/index.d.ts.map +0 -1
  387. package/lib/types/vertexai/models/claude.d.ts +0 -119
  388. package/lib/types/vertexai/models/claude.d.ts.map +0 -1
  389. package/lib/types/vertexai/models/gemini.d.ts.map +0 -1
  390. package/lib/types/vertexai/models/imagen.d.ts.map +0 -1
  391. package/lib/types/vertexai/models/llama.d.ts.map +0 -1
  392. package/lib/types/vertexai/models.d.ts +0 -20
  393. package/lib/types/vertexai/models.d.ts.map +0 -1
  394. package/lib/types/watsonx/index.d.ts.map +0 -1
  395. package/lib/types/watsonx/interfaces.d.ts.map +0 -1
  396. package/lib/types/xai/index.d.ts.map +0 -1
  397. package/src/vertexai/embeddings/embeddings-image.ts +0 -52
  398. package/src/vertexai/embeddings/embeddings-text.ts +0 -54
  399. /package/lib/{esm/bedrock → bedrock}/payloads.js +0 -0
  400. /package/lib/{esm/mistral → mistral}/types.js +0 -0
  401. /package/lib/{esm/togetherai → togetherai}/interfaces.js +0 -0
  402. /package/lib/{types/watsonx → watsonx}/interfaces.d.ts +0 -0
  403. /package/lib/{esm/watsonx → watsonx}/interfaces.js +0 -0
@@ -1,19 +1,60 @@
1
- import { DefaultAzureCredential, getBearerTokenProvider, TokenCredential } from "@azure/identity";
2
- import { AbstractDriver, AIModel, Completion, CompletionChunkObject, DriverOptions, EmbeddingsOptions, EmbeddingsResult, ExecutionOptions, getModelCapabilities, modelModalitiesToArray, Providers } from "@llumiverse/core";
3
- import { AIProjectClient, DeploymentUnion, ModelDeployment } from '@azure/ai-projects';
4
- import { isUnexpected } from "@azure-rest/ai-inference";
5
- import type OpenAI from "openai";
1
+ import { AIProjectClient, type DeploymentUnion, type ModelDeployment } from '@azure/ai-projects';
2
+ import { createSseStream, type NodeJSReadableStream } from '@azure/core-sse';
3
+ import { DefaultAzureCredential, getBearerTokenProvider, type TokenCredential } from '@azure/identity';
6
4
  import type {
5
+ ModelClient as AzureInferenceClient,
7
6
  ChatCompletionsOutput,
8
7
  ChatCompletionsToolCall,
9
8
  ChatRequestMessage,
10
- } from "@azure-rest/ai-inference";
11
- import { AzureOpenAIDriver } from "../openai/azure_openai.js";
12
- import { createSseStream, NodeJSReadableStream } from "@azure/core-sse";
13
- import { formatOpenAILikeMultimodalPrompt } from "../openai/openai_format.js";
9
+ } from '@azure-rest/ai-inference';
10
+ import ModelClient, { isUnexpected } from '@azure-rest/ai-inference';
11
+ import {
12
+ type AIModel,
13
+ type Completion,
14
+ type CompletionChunkObject,
15
+ type DriverOptions,
16
+ dataSourceToBase64,
17
+ type EmbeddingResultItem,
18
+ type EmbeddingsOptions,
19
+ type EmbeddingsResult,
20
+ type ExecutionOptions,
21
+ getModelCapabilities,
22
+ type ImageEmbeddingInput,
23
+ LlumiverseError,
24
+ modelModalitiesToArray,
25
+ normalizeEmbeddingsOptions,
26
+ Providers,
27
+ type TextEmbeddingInput,
28
+ type TextFallbackOptions,
29
+ } from '@llumiverse/core';
30
+ import { AbstractDriver } from '@llumiverse/core/driver';
31
+ import type OpenAI from 'openai';
32
+ import { BaseOpenAIDriver } from '../openai/index.js';
33
+ import { formatOpenAIDebugPrompt, formatOpenAILikeMultimodalPrompt } from '../openai/openai_format.js';
14
34
 
15
35
  type ResponseInputItem = OpenAI.Responses.ResponseInputItem;
16
36
  type EasyInputMessage = OpenAI.Responses.EasyInputMessage;
37
+ type SSEMessage = { data?: string };
38
+ type ErrorWithStatus = Error & { status?: unknown };
39
+
40
+ class AzureFoundryOpenAIProtocolDriver extends BaseOpenAIDriver {
41
+ service: OpenAI;
42
+ readonly provider = Providers.azure_foundry;
43
+
44
+ constructor(service: OpenAI) {
45
+ super({});
46
+ this.service = service;
47
+ }
48
+
49
+ async listModels(): Promise<AIModel[]> {
50
+ return [];
51
+ }
52
+ }
53
+
54
+ function hasNumericStatus(error: unknown): boolean {
55
+ return error instanceof Error && typeof (error as ErrorWithStatus).status === 'number';
56
+ }
57
+
17
58
  export interface AzureFoundryDriverOptions extends DriverOptions {
18
59
  /**
19
60
  * The credentials to use to access Azure AI Foundry
@@ -30,17 +71,18 @@ export interface AzureFoundryInferencePrompt {
30
71
  }
31
72
 
32
73
  export interface AzureFoundryOpenAIPrompt {
33
- messages: ResponseInputItem[]
74
+ messages: ResponseInputItem[];
34
75
  }
35
76
 
36
- export type AzureFoundryPrompt = AzureFoundryInferencePrompt | AzureFoundryOpenAIPrompt
77
+ export type AzureFoundryPrompt = AzureFoundryInferencePrompt | AzureFoundryOpenAIPrompt;
37
78
 
38
79
  export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions, ResponseInputItem[]> {
39
80
  service: AIProjectClient;
81
+ private readonly inferenceClient: AzureInferenceClient;
40
82
  readonly provider = Providers.azure_foundry;
41
83
 
42
- OPENAI_API_VERSION = "2025-01-01-preview";
43
- INFERENCE_API_VERSION = "2024-05-01-preview";
84
+ OPENAI_API_VERSION = '2025-01-01-preview';
85
+ INFERENCE_API_VERSION = '2024-05-01-preview';
44
86
 
45
87
  constructor(opts: AzureFoundryDriverOptions) {
46
88
  super(opts);
@@ -48,7 +90,7 @@ export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions
48
90
  this.formatPrompt = formatOpenAILikeMultimodalPrompt;
49
91
 
50
92
  if (!opts.endpoint) {
51
- throw new Error("Azure AI Foundry endpoint is required");
93
+ throw new Error('Azure AI Foundry endpoint is required');
52
94
  }
53
95
 
54
96
  try {
@@ -57,28 +99,27 @@ export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions
57
99
  opts.azureADTokenProvider = new DefaultAzureCredential();
58
100
  }
59
101
  } catch (error) {
60
- this.logger.error({ error }, "Failed to initialize Azure AD token provider:");
61
- throw new Error("Failed to initialize Azure AD token provider");
102
+ this.logger.error({ error }, 'Failed to initialize Azure AD token provider:');
103
+ throw new Error('Failed to initialize Azure AD token provider');
62
104
  }
63
105
 
64
- // Initialize AI Projects client which provides access to inference operations
65
- this.service = new AIProjectClient(
66
- opts.endpoint,
67
- opts.azureADTokenProvider
68
- );
69
-
70
106
  if (opts.apiVersion) {
71
107
  this.OPENAI_API_VERSION = opts.apiVersion;
72
108
  this.INFERENCE_API_VERSION = opts.apiVersion;
73
109
  this.logger.info(`[Azure Foundry] Overriding default API version, using API version: ${opts.apiVersion}`);
74
110
  }
111
+
112
+ this.service = new AIProjectClient(opts.endpoint, opts.azureADTokenProvider);
113
+ this.inferenceClient = ModelClient(opts.endpoint, opts.azureADTokenProvider, {
114
+ apiVersion: this.INFERENCE_API_VERSION,
115
+ });
75
116
  }
76
117
 
77
118
  /**
78
119
  * Get default authentication for Azure AI Foundry API
79
120
  */
80
121
  getDefaultAIFoundryAuth() {
81
- const scope = "https://ai.azure.com/.default";
122
+ const scope = 'https://ai.azure.com/.default';
82
123
  const azureADTokenProvider = getBearerTokenProvider(new DefaultAzureCredential(), scope);
83
124
  return azureADTokenProvider;
84
125
  }
@@ -86,43 +127,44 @@ export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions
86
127
  async isOpenAIDeployment(model: string): Promise<boolean> {
87
128
  const { deploymentName } = parseAzureFoundryModelId(model);
88
129
 
89
- let deployment = undefined;
130
+ let deployment: ModelDeployment | undefined;
90
131
  // First, verify the deployment exists
91
132
  try {
92
- deployment = await this.service.deployments.get(deploymentName);
133
+ deployment = (await this.service.deployments.get(deploymentName)) as ModelDeployment;
93
134
  this.logger.debug(`[Azure Foundry] Deployment ${deploymentName} found`);
94
135
  } catch (deploymentError) {
95
136
  this.logger.error({ deploymentError }, `[Azure Foundry] Deployment ${deploymentName} not found:`);
96
137
  }
97
138
 
98
- return (deployment as ModelDeployment).modelPublisher == "OpenAI";
139
+ return deployment?.modelPublisher === 'OpenAI';
99
140
  }
100
141
 
101
142
  protected canStream(_options: ExecutionOptions): Promise<boolean> {
102
143
  return Promise.resolve(true);
103
144
  }
104
145
 
146
+ public formatDebugPrompt(prompt: ResponseInputItem[]): ResponseInputItem[] {
147
+ return formatOpenAIDebugPrompt(prompt);
148
+ }
149
+
105
150
  async requestTextCompletion(prompt: ResponseInputItem[], options: ExecutionOptions): Promise<Completion> {
106
151
  const { deploymentName } = parseAzureFoundryModelId(options.model);
107
- const model_options = options.model_options as any;
152
+ const model_options = options.model_options as TextFallbackOptions | undefined;
108
153
  const isOpenAI = await this.isOpenAIDeployment(options.model);
109
154
 
110
- let response;
111
155
  if (isOpenAI) {
112
156
  // Use the Azure OpenAI client for OpenAI models
113
- const azureOpenAI = await this.service.inference.azureOpenAI({ apiVersion: this.OPENAI_API_VERSION });
114
- const subDriver = new AzureOpenAIDriver(azureOpenAI);
157
+ const openAI = this.service.getOpenAIClient();
158
+ const subDriver = new AzureFoundryOpenAIProtocolDriver(openAI);
115
159
  // Use deployment name for API calls
116
160
  const modifiedOptions = { ...options, model: deploymentName };
117
- const response = await subDriver.requestTextCompletion(prompt, modifiedOptions);
118
- return response;
119
-
161
+ return subDriver.requestTextCompletion(prompt, modifiedOptions);
120
162
  } else {
121
163
  // Use the chat completions client from the inference operations
122
164
  // Convert ResponseInputItem[] to ChatRequestMessage[] for non-OpenAI inference
123
165
  const messages = convertToInferenceMessages(prompt);
124
- const chatClient = this.service.inference.chatCompletions({ apiVersion: this.INFERENCE_API_VERSION });
125
- response = await chatClient.post({
166
+ const chatClient = this.inferenceClient.path('/chat/completions');
167
+ const response = await chatClient.post({
126
168
  body: {
127
169
  messages,
128
170
  max_tokens: model_options?.max_tokens,
@@ -133,9 +175,9 @@ export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions
133
175
  frequency_penalty: model_options?.frequency_penalty,
134
176
  presence_penalty: model_options?.presence_penalty,
135
177
  stop: model_options?.stop_sequence,
136
- }
178
+ },
137
179
  });
138
- if (response.status !== "200") {
180
+ if (response.status !== '200') {
139
181
  this.logger.error({ response }, `[Azure Foundry] Chat completion request failed:`);
140
182
  throw new Error(`Chat completion request failed with status ${response.status}: ${response.body}`);
141
183
  }
@@ -144,43 +186,48 @@ export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions
144
186
  }
145
187
  }
146
188
 
147
- async requestTextCompletionStream(prompt: ResponseInputItem[], options: ExecutionOptions): Promise<AsyncIterable<CompletionChunkObject>> {
189
+ async requestTextCompletionStream(
190
+ prompt: ResponseInputItem[],
191
+ options: ExecutionOptions,
192
+ ): Promise<AsyncIterable<CompletionChunkObject>> {
148
193
  const { deploymentName } = parseAzureFoundryModelId(options.model);
149
- const model_options = options.model_options as any;
194
+ const model_options = options.model_options as TextFallbackOptions | undefined;
150
195
  const isOpenAI = await this.isOpenAIDeployment(options.model);
151
196
 
152
197
  if (isOpenAI) {
153
- const azureOpenAI = await this.service.inference.azureOpenAI({ apiVersion: this.OPENAI_API_VERSION });
154
- const subDriver = new AzureOpenAIDriver(azureOpenAI);
198
+ const openAI = this.service.getOpenAIClient();
199
+ const subDriver = new AzureFoundryOpenAIProtocolDriver(openAI);
155
200
  const modifiedOptions = { ...options, model: deploymentName };
156
201
  const stream = await subDriver.requestTextCompletionStream(prompt, modifiedOptions);
157
202
  return stream;
158
203
  } else {
159
204
  // Convert ResponseInputItem[] to ChatRequestMessage[] for non-OpenAI inference
160
205
  const messages = convertToInferenceMessages(prompt);
161
- const chatClient = this.service.inference.chatCompletions({ apiVersion: this.INFERENCE_API_VERSION });
162
- const response = await chatClient.post({
163
- body: {
164
- messages,
165
- max_tokens: model_options?.max_tokens,
166
- model: deploymentName,
167
- stream: true,
168
- temperature: model_options?.temperature,
169
- top_p: model_options?.top_p,
170
- frequency_penalty: model_options?.frequency_penalty,
171
- presence_penalty: model_options?.presence_penalty,
172
- stop: model_options?.stop_sequence,
173
- }
174
- }).asNodeStream();
206
+ const chatClient = this.inferenceClient.path('/chat/completions');
207
+ const response = await chatClient
208
+ .post({
209
+ body: {
210
+ messages,
211
+ max_tokens: model_options?.max_tokens,
212
+ model: deploymentName,
213
+ stream: true,
214
+ temperature: model_options?.temperature,
215
+ top_p: model_options?.top_p,
216
+ frequency_penalty: model_options?.frequency_penalty,
217
+ presence_penalty: model_options?.presence_penalty,
218
+ stop: model_options?.stop_sequence,
219
+ },
220
+ })
221
+ .asNodeStream();
175
222
 
176
223
  // We type assert from NodeJS.ReadableStream to NodeJSReadableStream
177
224
  // The Azure Examples, expect a .destroy() method on the stream
178
225
  const stream = response.body as NodeJSReadableStream;
179
226
  if (!stream) {
180
- throw new Error("The response stream is undefined");
227
+ throw new Error('The response stream is undefined');
181
228
  }
182
229
 
183
- if (response.status !== "200") {
230
+ if (response.status !== '200') {
184
231
  stream.destroy();
185
232
  throw new Error(`Failed to get chat completions, http operation failed with ${response.status} code`);
186
233
  }
@@ -191,10 +238,10 @@ export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions
191
238
  }
192
239
  }
193
240
 
194
- private async *processStreamResponse(sseStream: any): AsyncIterable<CompletionChunkObject> {
241
+ private async *processStreamResponse(sseStream: AsyncIterable<SSEMessage>): AsyncIterable<CompletionChunkObject> {
195
242
  try {
196
243
  for await (const event of sseStream) {
197
- if (event.data === "[DONE]") {
244
+ if (!event.data || event.data === '[DONE]') {
198
245
  break;
199
246
  }
200
247
 
@@ -209,7 +256,7 @@ export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions
209
256
  continue;
210
257
  }
211
258
  const chunk: CompletionChunkObject = {
212
- result: choice.delta?.content || "",
259
+ result: choice.delta?.content || '',
213
260
  finish_reason: this.convertFinishReason(choice.finish_reason),
214
261
  token_usage: {
215
262
  prompt: data.usage?.prompt_tokens,
@@ -221,7 +268,6 @@ export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions
221
268
  yield chunk;
222
269
  } catch (parseError) {
223
270
  this.logger.warn({ parseError }, `[Azure Foundry] Failed to parse streaming response:`);
224
- continue;
225
271
  }
226
272
  }
227
273
  } catch (error) {
@@ -230,7 +276,6 @@ export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions
230
276
  }
231
277
  }
232
278
 
233
-
234
279
  private extractDataFromResponse(result: ChatCompletionsOutput): Completion {
235
280
  const tokenInfo = {
236
281
  prompt: result.usage?.prompt_tokens,
@@ -240,20 +285,20 @@ export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions
240
285
 
241
286
  const choice = result.choices?.[0];
242
287
  if (!choice) {
243
- this.logger.error({ result }, "[Azure Foundry] No choices in response");
244
- throw new Error("No choices in response");
288
+ this.logger.error({ result }, '[Azure Foundry] No choices in response');
289
+ throw new Error('No choices in response');
245
290
  }
246
291
 
247
292
  const data = choice.message?.content;
248
293
  const toolCalls = choice.message?.tool_calls;
249
294
 
250
295
  if (!data && !toolCalls) {
251
- this.logger.error({ result }, "[Azure Foundry] Response is not valid");
252
- throw new Error("Response is not valid: no content or tool calls");
296
+ this.logger.error({ result }, '[Azure Foundry] Response is not valid');
297
+ throw new Error('Response is not valid: no content or tool calls');
253
298
  }
254
299
 
255
300
  const completion: Completion = {
256
- result: data ? [{ type: "text", value: data }] : [],
301
+ result: data ? [{ type: 'text', value: data }] : [],
257
302
  token_usage: tokenInfo,
258
303
  finish_reason: this.convertFinishReason(choice.finish_reason),
259
304
  };
@@ -262,7 +307,7 @@ export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions
262
307
  completion.tool_use = toolCalls.map((call: ChatCompletionsToolCall) => ({
263
308
  id: call.id,
264
309
  tool_name: call.function?.name,
265
- tool_input: call.function?.arguments ? JSON.parse(call.function.arguments) : {}
310
+ tool_input: call.function?.arguments ? JSON.parse(call.function.arguments) : {},
266
311
  }));
267
312
  }
268
313
 
@@ -273,10 +318,14 @@ export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions
273
318
  if (!reason) return undefined;
274
319
  // Map Azure AI finish reasons to standard format
275
320
  switch (reason) {
276
- case 'stop': return 'stop';
277
- case 'length': return 'length';
278
- case 'tool_calls': return 'tool_use';
279
- default: return reason;
321
+ case 'stop':
322
+ return 'stop';
323
+ case 'length':
324
+ return 'length';
325
+ case 'tool_calls':
326
+ return 'tool_use';
327
+ default:
328
+ return reason;
280
329
  }
281
330
  }
282
331
 
@@ -293,99 +342,93 @@ export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions
293
342
  }
294
343
 
295
344
  if (!hasDeployments) {
296
- this.logger.warn("[Azure Foundry] No deployments found in the project");
345
+ this.logger.warn('[Azure Foundry] No deployments found in the project');
297
346
  }
298
347
 
299
348
  return true;
300
349
  } catch (error) {
301
- this.logger.error({ error }, "Azure Foundry connection validation failed:");
350
+ this.logger.error({ error }, 'Azure Foundry connection validation failed:');
302
351
  return false;
303
352
  }
304
353
  }
305
354
 
306
355
  async generateEmbeddings(options: EmbeddingsOptions): Promise<EmbeddingsResult> {
307
- if (!options.model) {
308
- throw new Error("Default embedding model selection not supported for Azure Foundry. Please specify a model.");
309
- }
310
-
311
- if (options.text) {
312
- return this.generateTextEmbeddings(options);
313
- } else if (options.image) {
314
- return this.generateImageEmbeddings(options);
315
- } else {
316
- throw new Error("No text or images provided for embeddings");
356
+ const normalized = normalizeEmbeddingsOptions(options);
357
+ if (!normalized.model) {
358
+ throw new Error(
359
+ 'Default embedding model selection not supported for Azure Foundry. Please specify a model.',
360
+ );
317
361
  }
318
- }
319
362
 
320
- async generateTextEmbeddings(options: EmbeddingsOptions): Promise<EmbeddingsResult> {
321
- if (!options.text) {
322
- throw new Error("No text provided for text embeddings");
323
- }
363
+ const textInputs: { index: number; input: TextEmbeddingInput }[] = [];
364
+ const imageInputs: { index: number; input: ImageEmbeddingInput }[] = [];
365
+ normalized.inputs.forEach((input, index) => {
366
+ if (input.type === 'text') textInputs.push({ index, input });
367
+ else if (input.type === 'image') imageInputs.push({ index, input });
368
+ else {
369
+ throw new Error(`Provider 'azure_foundry' does not support '${input.type}' embeddings.`);
370
+ }
371
+ });
324
372
 
325
- const { deploymentName } = parseAzureFoundryModelId(options.model || "");
373
+ const items = new Array<EmbeddingResultItem>(normalized.inputs.length);
326
374
 
327
- let response;
328
- try {
329
- // Use the embeddings client from the inference operations
330
- const embeddingsClient = this.service.inference.embeddings({ apiVersion: this.INFERENCE_API_VERSION });
331
- response = await embeddingsClient.post({
332
- body: {
333
- input: Array.isArray(options.text) ? options.text : [options.text],
334
- model: deploymentName
335
- }
375
+ if (textInputs.length > 0) {
376
+ const vectors = await this.callAzureEmbeddings(
377
+ textInputs.map((t) => t.input.text),
378
+ normalized.model,
379
+ 'text',
380
+ );
381
+ textInputs.forEach((entry, i) => {
382
+ items[entry.index] = { outputs: [{ values: vectors[i], modality: 'text' }] };
336
383
  });
337
- } catch (error) {
338
- this.logger.error({ error }, "Azure Foundry text embeddings error:");
339
- throw error;
340
- }
341
-
342
- if (isUnexpected(response)) {
343
- throw new Error(`Text embeddings request failed: ${response.status} ${response.body?.error?.message || 'Unknown error'}`);
344
384
  }
345
385
 
346
- const embeddings = response.body.data?.[0]?.embedding;
347
- if (!embeddings || !Array.isArray(embeddings) || embeddings.length === 0) {
348
- throw new Error("No valid embedding array found in response");
386
+ if (imageInputs.length > 0) {
387
+ const base64Images = await Promise.all(imageInputs.map((entry) => dataSourceToBase64(entry.input.source)));
388
+ const vectors = await this.callAzureEmbeddings(base64Images, normalized.model, 'image');
389
+ imageInputs.forEach((entry, i) => {
390
+ items[entry.index] = { outputs: [{ values: vectors[i], modality: 'image' }] };
391
+ });
349
392
  }
350
393
 
351
- return {
352
- values: embeddings,
353
- model: options.model ?? ""
354
- };
394
+ return { model: normalized.model, results: items };
355
395
  }
356
396
 
357
- async generateImageEmbeddings(options: EmbeddingsOptions): Promise<EmbeddingsResult> {
358
- if (!options.image) {
359
- throw new Error("No images provided for image embeddings");
360
- }
361
-
362
- const { deploymentName } = parseAzureFoundryModelId(options.model || "");
363
-
364
- let response;
397
+ private async callAzureEmbeddings(input: string[], model: string, kind: 'text' | 'image'): Promise<number[][]> {
398
+ const { deploymentName } = parseAzureFoundryModelId(model);
365
399
  try {
366
- // Use the embeddings client from the inference operations
367
- const embeddingsClient = this.service.inference.embeddings({ apiVersion: this.INFERENCE_API_VERSION });
368
- response = await embeddingsClient.post({
369
- body: {
370
- input: Array.isArray(options.image) ? options.image : [options.image],
371
- model: deploymentName
400
+ const embeddingsClient = this.inferenceClient.path('/embeddings');
401
+ const response = await embeddingsClient.post({ body: { input, model: deploymentName } });
402
+ if (isUnexpected(response)) {
403
+ throw new Error(
404
+ `${kind} embeddings request failed: ${response.status} ${response.body?.error?.message || 'Unknown error'}`,
405
+ );
406
+ }
407
+
408
+ const data = response.body.data;
409
+ if (!Array.isArray(data) || data.length === 0) {
410
+ throw new Error(`No embeddings found in Azure Foundry ${kind} response`);
411
+ }
412
+ const ordered = [...data].sort((a, b) => (a.index ?? 0) - (b.index ?? 0));
413
+ return ordered.map((entry) => {
414
+ const embedding = entry.embedding;
415
+ if (!Array.isArray(embedding) || embedding.length === 0) {
416
+ throw new Error(
417
+ `Empty or non-array embedding in Azure Foundry ${kind} response (got ${typeof embedding})`,
418
+ );
372
419
  }
420
+ return embedding;
373
421
  });
374
422
  } catch (error) {
375
- this.logger.error({ error }, "Azure Foundry image embeddings error:");
376
- throw error;
377
- }
378
- if (isUnexpected(response)) {
379
- throw new Error(`Image embeddings request failed: ${response.status} ${response.body?.error?.message || 'Unknown error'}`);
380
- }
381
- const embeddings = response.body.data?.[0]?.embedding;
382
- if (!embeddings || !Array.isArray(embeddings) || embeddings.length === 0) {
383
- throw new Error("No valid embedding array found in response");
423
+ if (LlumiverseError.isLlumiverseError(error)) throw error;
424
+ if (error instanceof Error && !hasNumericStatus(error)) throw error;
425
+ this.logger.error({ error }, `Azure Foundry ${kind} embeddings error:`);
426
+ throw this.formatLlumiverseError(error, {
427
+ provider: this.provider,
428
+ model,
429
+ operation: 'execute',
430
+ });
384
431
  }
385
- return {
386
- values: embeddings,
387
- model: options.model ?? ""
388
- };
389
432
  }
390
433
 
391
434
  async listModels(): Promise<AIModel[]> {
@@ -397,13 +440,13 @@ export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions
397
440
  }
398
441
 
399
442
  async _listModels(filter?: (m: ModelDeployment) => boolean): Promise<AIModel[]> {
400
- let deploymentsIterable;
443
+ let deploymentsIterable: ReturnType<typeof this.service.deployments.list>;
401
444
  try {
402
445
  // List all deployments in the Azure AI Foundry project
403
446
  deploymentsIterable = this.service.deployments.list();
404
447
  } catch (error) {
405
- this.logger.error({ error }, "Failed to list deployments:");
406
- throw new Error("Failed to list deployments in Azure AI Foundry project");
448
+ this.logger.error({ error }, 'Failed to list deployments:');
449
+ throw new Error('Failed to list deployments in Azure AI Foundry project');
407
450
  }
408
451
  const deployments: DeploymentUnion[] = [];
409
452
 
@@ -414,30 +457,32 @@ export class AzureFoundryDriver extends AbstractDriver<AzureFoundryDriverOptions
414
457
  }
415
458
 
416
459
  let modelDeployments: ModelDeployment[] = deployments.filter((d): d is ModelDeployment => {
417
- return d.type === "ModelDeployment";
460
+ return d.type === 'ModelDeployment';
418
461
  });
419
462
 
420
463
  if (filter) {
421
464
  modelDeployments = modelDeployments.filter(filter);
422
465
  }
423
466
 
424
- const aiModels = modelDeployments.map((model) => {
425
- // Create composite ID: deployment_name::base_model
426
- const compositeId = `${model.name}::${model.modelName}`;
427
-
428
- const modelCapability = getModelCapabilities(model.modelName, Providers.azure_foundry);
429
- return {
430
- id: compositeId,
431
- name: model.name,
432
- description: `${model.modelName} - ${model.modelVersion}`,
433
- version: model.modelVersion,
434
- provider: this.provider,
435
- owner: model.modelPublisher,
436
- input_modalities: modelModalitiesToArray(modelCapability.input),
437
- output_modalities: modelModalitiesToArray(modelCapability.output),
438
- tool_support: modelCapability.tool_support,
439
- } satisfies AIModel<string>;
440
- }).sort((modelA, modelB) => modelA.id.localeCompare(modelB.id));
467
+ const aiModels = modelDeployments
468
+ .map((model) => {
469
+ // Create composite ID: deployment_name::base_model
470
+ const compositeId = `${model.name}::${model.modelName}`;
471
+
472
+ const modelCapability = getModelCapabilities(model.modelName, Providers.azure_foundry);
473
+ return {
474
+ id: compositeId,
475
+ name: model.name,
476
+ description: `${model.modelName} - ${model.modelVersion}`,
477
+ version: model.modelVersion,
478
+ provider: this.provider,
479
+ owner: model.modelPublisher,
480
+ input_modalities: modelModalitiesToArray(modelCapability.input),
481
+ output_modalities: modelModalitiesToArray(modelCapability.output),
482
+ tool_support: modelCapability.tool_support,
483
+ } satisfies AIModel<string>;
484
+ })
485
+ .sort((modelA, modelB) => modelA.id.localeCompare(modelB.id));
441
486
 
442
487
  return aiModels;
443
488
  }
@@ -449,14 +494,14 @@ export function parseAzureFoundryModelId(compositeId: string): { deploymentName:
449
494
  if (parts.length === 2) {
450
495
  return {
451
496
  deploymentName: parts[0],
452
- baseModel: parts[1]
497
+ baseModel: parts[1],
453
498
  };
454
499
  }
455
500
 
456
501
  // Backwards compatibility: if no delimiter found, treat as deployment name
457
502
  return {
458
503
  deploymentName: compositeId,
459
- baseModel: compositeId
504
+ baseModel: compositeId,
460
505
  };
461
506
  }
462
507
 
@@ -481,7 +526,7 @@ function convertToInferenceMessages(items: ResponseInputItem[]): ChatRequestMess
481
526
  // Extract text from content array
482
527
  content = msg.content
483
528
  .filter((part): part is OpenAI.Responses.ResponseInputText => part.type === 'input_text')
484
- .map(part => part.text)
529
+ .map((part) => part.text)
485
530
  .join('\n');
486
531
  } else {
487
532
  content = '';
@@ -489,7 +534,7 @@ function convertToInferenceMessages(items: ResponseInputItem[]): ChatRequestMess
489
534
 
490
535
  messages.push({
491
536
  role: msg.role as 'system' | 'user' | 'assistant',
492
- content
537
+ content,
493
538
  });
494
539
  }
495
540
  // Handle function_call_output