@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
package/src/groq/index.ts CHANGED
@@ -1,21 +1,68 @@
1
- import { AbstractDriver, AIModel, Completion, CompletionChunkObject, DriverOptions, EmbeddingsOptions, EmbeddingsResult, ExecutionOptions, PromptSegment, TextFallbackOptions, ToolDefinition, ToolUse } from "@llumiverse/core";
2
- import { transformAsyncIterator } from "@llumiverse/core/async";
3
- import Groq from "groq-sdk";
4
- import type { ChatCompletionMessageParam, ChatCompletionTool } from "groq-sdk/resources/chat/completions";
5
- import type { FunctionParameters } from "groq-sdk/resources/shared";
6
- import type OpenAI from "openai";
7
- import { formatOpenAILikeMultimodalPrompt } from "../openai/openai_format.js";
1
+ import type {
2
+ AIModel,
3
+ Completion,
4
+ CompletionChunkObject,
5
+ DriverOptions,
6
+ EmbeddingsOptions,
7
+ EmbeddingsResult,
8
+ ExecutionOptions,
9
+ PromptSegment,
10
+ TextFallbackOptions,
11
+ ToolDefinition,
12
+ ToolUse,
13
+ } from '@llumiverse/core';
14
+ import { transformAsyncIterator } from '@llumiverse/core/async';
15
+ import { AbstractDriver } from '@llumiverse/core/driver';
16
+ import Groq from 'groq-sdk';
17
+ import type { ChatCompletionMessageParam, ChatCompletionTool } from 'groq-sdk/resources/chat/completions';
18
+ import type { FunctionParameters } from 'groq-sdk/resources/shared';
19
+ import type OpenAI from 'openai';
20
+ import { formatOpenAILikeMultimodalPrompt } from '../openai/openai_format.js';
21
+ import { truncateDataUrlForDebug } from '../shared/debug-prompt.js';
8
22
 
9
23
  type ResponseInputItem = OpenAI.Responses.ResponseInputItem;
10
24
  type EasyInputMessage = OpenAI.Responses.EasyInputMessage;
25
+ type GroqToolCallMessage = {
26
+ tool_calls?: Array<{
27
+ id: string;
28
+ function: {
29
+ name: string;
30
+ arguments?: string;
31
+ };
32
+ }>;
33
+ };
11
34
 
12
35
  interface GroqDriverOptions extends DriverOptions {
13
36
  apiKey: string;
14
37
  endpoint_url?: string;
15
38
  }
16
39
 
40
+ type GroqTextContentPart = { type: 'text'; text: string };
41
+ type GroqImageContentPart = { type: 'image_url'; image_url: { url: string; detail?: 'auto' | 'low' | 'high' } };
42
+ type GroqContentPart = GroqTextContentPart | GroqImageContentPart;
43
+ type GroqUserMessageWithArrayContent = Extract<ChatCompletionMessageParam, { role: 'user' }> & {
44
+ content: GroqContentPart[];
45
+ };
46
+
47
+ function hasGroqArrayContent(message: ChatCompletionMessageParam): message is GroqUserMessageWithArrayContent {
48
+ return message.role === 'user' && Array.isArray(message.content);
49
+ }
50
+
51
+ function formatGroqContentPartForDebug(part: GroqContentPart): GroqContentPart {
52
+ if (part.type !== 'image_url') {
53
+ return part;
54
+ }
55
+ return {
56
+ ...part,
57
+ image_url: {
58
+ ...part.image_url,
59
+ url: truncateDataUrlForDebug(part.image_url.url),
60
+ },
61
+ };
62
+ }
63
+
17
64
  export class GroqDriver extends AbstractDriver<GroqDriverOptions, ChatCompletionMessageParam[]> {
18
- static PROVIDER = "groq";
65
+ static PROVIDER = 'groq';
19
66
  provider = GroqDriver.PROVIDER;
20
67
  apiKey: string;
21
68
  client: Groq;
@@ -26,7 +73,8 @@ export class GroqDriver extends AbstractDriver<GroqDriverOptions, ChatCompletion
26
73
  this.apiKey = options.apiKey;
27
74
  this.client = new Groq({
28
75
  apiKey: options.apiKey,
29
- baseURL: options.endpoint_url
76
+ baseURL: options.endpoint_url,
77
+ fetch: this.getDriverFetch(),
30
78
  });
31
79
  }
32
80
 
@@ -50,7 +98,10 @@ export class GroqDriver extends AbstractDriver<GroqDriverOptions, ChatCompletion
50
98
  return undefined;
51
99
  }
52
100
 
53
- protected async formatPrompt(segments: PromptSegment[], opts: ExecutionOptions): Promise<ChatCompletionMessageParam[]> {
101
+ protected async formatPrompt(
102
+ segments: PromptSegment[],
103
+ opts: ExecutionOptions,
104
+ ): Promise<ChatCompletionMessageParam[]> {
54
105
  // Use OpenAI's multimodal formatter as base then convert to Groq types
55
106
  const responseItems = await formatOpenAILikeMultimodalPrompt(segments, {
56
107
  ...opts,
@@ -61,27 +112,39 @@ export class GroqDriver extends AbstractDriver<GroqDriverOptions, ChatCompletion
61
112
  return convertResponseItemsToGroqMessages(responseItems);
62
113
  }
63
114
 
115
+ public formatDebugPrompt(messages: ChatCompletionMessageParam[]): ChatCompletionMessageParam[] {
116
+ return messages.map((message) => {
117
+ if (!hasGroqArrayContent(message)) {
118
+ return message;
119
+ }
120
+ return {
121
+ ...message,
122
+ content: message.content.map(formatGroqContentPartForDebug),
123
+ };
124
+ });
125
+ }
126
+
64
127
  private getToolDefinitions(tools: ToolDefinition[] | undefined): ChatCompletionTool[] | undefined {
65
128
  if (!tools || tools.length === 0) {
66
129
  return undefined;
67
130
  }
68
131
 
69
- return tools.map(tool => ({
132
+ return tools.map((tool) => ({
70
133
  type: 'function' as const,
71
134
  function: {
72
135
  name: tool.name,
73
136
  description: tool.description,
74
137
  parameters: tool.input_schema satisfies FunctionParameters,
75
- }
138
+ },
76
139
  }));
77
140
  }
78
141
 
79
- private extractToolUse(message: any): ToolUse[] | undefined {
142
+ private extractToolUse(message: GroqToolCallMessage): ToolUse<unknown>[] | undefined {
80
143
  if (!message.tool_calls || message.tool_calls.length === 0) {
81
144
  return undefined;
82
145
  }
83
146
 
84
- return message.tool_calls.map((toolCall: any) => ({
147
+ return message.tool_calls.map((toolCall) => ({
85
148
  id: toolCall.id,
86
149
  tool_name: toolCall.function.name,
87
150
  tool_input: JSON.parse(toolCall.function.arguments || '{}'),
@@ -89,27 +152,35 @@ export class GroqDriver extends AbstractDriver<GroqDriverOptions, ChatCompletion
89
152
  }
90
153
 
91
154
  private sanitizeMessagesForGroq(messages: ChatCompletionMessageParam[]): ChatCompletionMessageParam[] {
92
- return messages.map(message => {
155
+ return messages.map((message) => {
93
156
  // Remove any reasoning field from message objects
94
- const { reasoning, ...sanitizedMessage } = message as any;
157
+ const sanitizedMessage = { ...(message as unknown as Record<string, unknown>) };
158
+ delete sanitizedMessage.reasoning;
95
159
 
96
160
  // If message has content array, filter out reasoning content types
97
- if (Array.isArray(sanitizedMessage.content)) {
98
- sanitizedMessage.content = sanitizedMessage.content.filter((part: any) => {
161
+ const content = sanitizedMessage.content;
162
+ if (Array.isArray(content)) {
163
+ sanitizedMessage.content = content.filter((part) => {
99
164
  // Filter out any reasoning-related content parts
100
- return part.type !== 'reasoning' && !('reasoning' in part);
165
+ const typedPart = part as { type?: string; reasoning?: unknown };
166
+ return typedPart.type !== 'reasoning' && !('reasoning' in typedPart);
101
167
  });
102
168
  }
103
169
 
104
- return sanitizedMessage as ChatCompletionMessageParam;
170
+ return sanitizedMessage as unknown as ChatCompletionMessageParam;
105
171
  });
106
172
  }
107
173
 
108
- async requestTextCompletion(messages: ChatCompletionMessageParam[], options: ExecutionOptions): Promise<Completion> {
109
- if (options.model_options?._option_id !== undefined &&
110
- options.model_options?._option_id !== "text-fallback" &&
111
- options.model_options?._option_id !== "groq-deepseek-thinking") {
112
- this.logger.debug({ options: options.model_options }, "Unexpected option id");
174
+ async requestTextCompletion(
175
+ messages: ChatCompletionMessageParam[],
176
+ options: ExecutionOptions,
177
+ ): Promise<Completion> {
178
+ if (
179
+ options.model_options?._option_id !== undefined &&
180
+ options.model_options?._option_id !== 'text-fallback' &&
181
+ options.model_options?._option_id !== 'groq-deepseek-thinking'
182
+ ) {
183
+ this.logger.debug({ options: options.model_options }, 'Unexpected option id');
113
184
  }
114
185
  options.model_options = options.model_options as TextFallbackOptions;
115
186
 
@@ -146,11 +217,11 @@ export class GroqDriver extends AbstractDriver<GroqDriverOptions, ChatCompletion
146
217
 
147
218
  let finish_reason = choice.finish_reason;
148
219
  if (tool_use && tool_use.length > 0) {
149
- finish_reason = "tool_calls";
220
+ finish_reason = 'tool_calls';
150
221
  }
151
222
 
152
223
  return {
153
- result: result ? [{ type: "text", value: result }] : [],
224
+ result: result ? [{ type: 'text', value: result }] : [],
154
225
  token_usage: {
155
226
  prompt: res.usage?.prompt_tokens,
156
227
  result: res.usage?.completion_tokens,
@@ -163,9 +234,12 @@ export class GroqDriver extends AbstractDriver<GroqDriverOptions, ChatCompletion
163
234
  };
164
235
  }
165
236
 
166
- async requestTextCompletionStream(messages: ChatCompletionMessageParam[], options: ExecutionOptions): Promise<AsyncIterable<CompletionChunkObject>> {
167
- if (options.model_options?._option_id !== undefined && options.model_options?._option_id !== "text-fallback") {
168
- this.logger.debug({ options: options.model_options }, "Unexpected option id");
237
+ async requestTextCompletionStream(
238
+ messages: ChatCompletionMessageParam[],
239
+ options: ExecutionOptions,
240
+ ): Promise<AsyncIterable<CompletionChunkObject>> {
241
+ if (options.model_options?._option_id !== undefined && options.model_options?._option_id !== 'text-fallback') {
242
+ this.logger.debug({ options: options.model_options }, 'Unexpected option id');
169
243
  }
170
244
  options.model_options = options.model_options as TextFallbackOptions;
171
245
 
@@ -197,11 +271,11 @@ export class GroqDriver extends AbstractDriver<GroqDriverOptions, ChatCompletion
197
271
 
198
272
  // Check for tool calls in the delta
199
273
  if (choice.delta.tool_calls && choice.delta.tool_calls.length > 0) {
200
- finish_reason = "tool_calls";
274
+ finish_reason = 'tool_calls';
201
275
  }
202
276
 
203
277
  return {
204
- result: choice.delta.content ? [{ type: "text", value: choice.delta.content }] : [],
278
+ result: choice.delta.content ? [{ type: 'text', value: choice.delta.content }] : [],
205
279
  finish_reason: finish_reason ?? undefined,
206
280
  token_usage: {
207
281
  prompt: chunk.x_groq?.usage?.prompt_tokens,
@@ -216,12 +290,12 @@ export class GroqDriver extends AbstractDriver<GroqDriverOptions, ChatCompletion
216
290
  const models = await this.client.models.list();
217
291
 
218
292
  if (!models.data) {
219
- throw new Error("No models found");
293
+ throw new Error('No models found');
220
294
  }
221
295
 
222
- const aiModels = models.data?.map(m => {
296
+ const aiModels = models.data?.map((m) => {
223
297
  if (!m.id) {
224
- throw new Error("Model id is missing");
298
+ throw new Error('Model id is missing');
225
299
  }
226
300
  return {
227
301
  id: m.id,
@@ -229,20 +303,19 @@ export class GroqDriver extends AbstractDriver<GroqDriverOptions, ChatCompletion
229
303
  description: undefined,
230
304
  provider: this.provider,
231
305
  owner: m.owned_by || '',
232
- }
306
+ };
233
307
  });
234
308
 
235
309
  return aiModels;
236
310
  }
237
311
 
238
312
  validateConnection(): Promise<boolean> {
239
- throw new Error("Method not implemented.");
313
+ throw new Error('Method not implemented.');
240
314
  }
241
315
 
242
- async generateEmbeddings({ }: EmbeddingsOptions): Promise<EmbeddingsResult> {
243
- throw new Error("Method not implemented.");
316
+ async generateEmbeddings(_options: EmbeddingsOptions): Promise<EmbeddingsResult> {
317
+ throw new Error('Method not implemented.');
244
318
  }
245
-
246
319
  }
247
320
 
248
321
  /**
@@ -253,7 +326,7 @@ export class GroqDriver extends AbstractDriver<GroqDriverOptions, ChatCompletion
253
326
  */
254
327
  function updateConversation(
255
328
  conversation: ChatCompletionMessageParam[] | undefined,
256
- messages: ChatCompletionMessageParam[]
329
+ messages: ChatCompletionMessageParam[],
257
330
  ): ChatCompletionMessageParam[] {
258
331
  return (conversation || []).concat(messages);
259
332
  }
@@ -278,7 +351,7 @@ function convertResponseItemsToGroqMessages(items: ResponseInputItem[]): ChatCom
278
351
  } else if (Array.isArray(msg.content)) {
279
352
  content = msg.content
280
353
  .filter((part): part is OpenAI.Responses.ResponseInputText => part.type === 'input_text')
281
- .map(part => part.text)
354
+ .map((part) => part.text)
282
355
  .join('\n');
283
356
  } else {
284
357
  content = '';
@@ -289,11 +362,19 @@ function convertResponseItemsToGroqMessages(items: ResponseInputItem[]): ChatCom
289
362
 
290
363
  // Handle user messages
291
364
  if (role === 'user') {
292
- let content: string | Array<{ type: 'text', text: string } | { type: 'image_url', image_url: { url: string, detail?: 'auto' | 'low' | 'high' } }>;
365
+ let content:
366
+ | string
367
+ | Array<
368
+ | { type: 'text'; text: string }
369
+ | { type: 'image_url'; image_url: { url: string; detail?: 'auto' | 'low' | 'high' } }
370
+ >;
293
371
  if (typeof msg.content === 'string') {
294
372
  content = msg.content;
295
373
  } else if (Array.isArray(msg.content)) {
296
- const parts: Array<{ type: 'text', text: string } | { type: 'image_url', image_url: { url: string, detail?: 'auto' | 'low' | 'high' } }> = [];
374
+ const parts: Array<
375
+ | { type: 'text'; text: string }
376
+ | { type: 'image_url'; image_url: { url: string; detail?: 'auto' | 'low' | 'high' } }
377
+ > = [];
297
378
  for (const part of msg.content) {
298
379
  if (part.type === 'input_text') {
299
380
  parts.push({ type: 'text', text: part.text });
@@ -301,7 +382,7 @@ function convertResponseItemsToGroqMessages(items: ResponseInputItem[]): ChatCom
301
382
  const imgPart = part as OpenAI.Responses.ResponseInputImage;
302
383
  if (imgPart.image_url) {
303
384
  const image_url: { url: string; detail?: 'auto' | 'low' | 'high' } = {
304
- url: imgPart.image_url
385
+ url: imgPart.image_url,
305
386
  };
306
387
 
307
388
  if (imgPart.detail) {
@@ -310,7 +391,7 @@ function convertResponseItemsToGroqMessages(items: ResponseInputItem[]): ChatCom
310
391
 
311
392
  parts.push({
312
393
  type: 'image_url',
313
- image_url
394
+ image_url,
314
395
  });
315
396
  }
316
397
  }
@@ -329,10 +410,11 @@ function convertResponseItemsToGroqMessages(items: ResponseInputItem[]): ChatCom
329
410
  if (typeof msg.content === 'string') {
330
411
  content = msg.content;
331
412
  } else if (Array.isArray(msg.content)) {
332
- content = msg.content
333
- .filter((part): part is OpenAI.Responses.ResponseInputText => part.type === 'input_text')
334
- .map(part => part.text)
335
- .join('\n') || null;
413
+ content =
414
+ msg.content
415
+ .filter((part): part is OpenAI.Responses.ResponseInputText => part.type === 'input_text')
416
+ .map((part) => part.text)
417
+ .join('\n') || null;
336
418
  } else {
337
419
  content = null;
338
420
  }
@@ -360,18 +442,19 @@ function convertResponseItemsToGroqMessages(items: ResponseInputItem[]): ChatCom
360
442
  messages.push({
361
443
  role: 'assistant',
362
444
  content: null,
363
- tool_calls: [{
364
- id: call.call_id,
365
- type: 'function',
366
- function: {
367
- name: call.name,
368
- arguments: call.arguments,
369
- }
370
- }]
445
+ tool_calls: [
446
+ {
447
+ id: call.call_id,
448
+ type: 'function',
449
+ function: {
450
+ name: call.name,
451
+ arguments: call.arguments,
452
+ },
453
+ },
454
+ ],
371
455
  });
372
- continue;
373
456
  }
374
457
  }
375
458
 
376
459
  return messages;
377
- }
460
+ }
@@ -0,0 +1,263 @@
1
+ import type { HttpTimeoutOptions } from '@llumiverse/core';
2
+ import { describe, expect, it } from 'vitest';
3
+ import { exposePrivate } from '../test/__helpers__/test-utils.js';
4
+ import { AnthropicDriver } from './anthropic/index.js';
5
+ import { BedrockDriver } from './bedrock/index.js';
6
+ import { GroqDriver } from './groq/index.js';
7
+ import { HuggingFaceIEDriver } from './huggingface_ie.js';
8
+ import { MistralAIDriver } from './mistral/index.js';
9
+ import { AzureOpenAIDriver } from './openai/azure_openai.js';
10
+ import { OpenAIDriver } from './openai/openai.js';
11
+ import { OpenAICompatibleDriver } from './openai/openai_compatible.js';
12
+ import { ReplicateDriver } from './replicate.js';
13
+ import { TogetherAIDriver } from './togetherai/index.js';
14
+ import { VertexAIDriver } from './vertexai/index.js';
15
+ import { WatsonxDriver } from './watsonx/index.js';
16
+ import { xAIDriver } from './xai/index.js';
17
+
18
+ type DriverFetchInternals = {
19
+ _driverFetch?: typeof fetch;
20
+ };
21
+
22
+ type SdkFetchHolder = {
23
+ fetch?: typeof fetch;
24
+ _options?: {
25
+ fetch?: typeof fetch;
26
+ };
27
+ };
28
+
29
+ type FetchClientInternals = {
30
+ _fetch: Promise<typeof fetch>;
31
+ };
32
+
33
+ type BedrockRequestHandlerConfig = {
34
+ requestTimeout: number;
35
+ throwOnRequestTimeout: boolean;
36
+ connectionTimeout: number;
37
+ socketTimeout: number;
38
+ };
39
+
40
+ function driverFetch(driver: object): typeof fetch {
41
+ const fetchImpl = exposePrivate<DriverFetchInternals>(driver)._driverFetch;
42
+ if (!fetchImpl) {
43
+ throw new Error('Driver fetch was not initialized');
44
+ }
45
+ return fetchImpl;
46
+ }
47
+
48
+ function expectSdkUsesDriverFetch(driver: object, client: object): void {
49
+ const expectedFetch = driverFetch(driver);
50
+ const sdkClient = exposePrivate<SdkFetchHolder>(client);
51
+ expect(sdkClient.fetch ?? sdkClient._options?.fetch).toBe(expectedFetch);
52
+ }
53
+
54
+ async function expectFetchClientUsesDriverFetch(driver: object, client: object): Promise<void> {
55
+ await expect(exposePrivate<FetchClientInternals>(client)._fetch).resolves.toBe(driverFetch(driver));
56
+ }
57
+
58
+ describe('driver HTTP timeout wiring', () => {
59
+ it('configures Bedrock request handlers to throw on request timeout', () => {
60
+ const driver = new BedrockDriver({
61
+ region: 'us-east-1',
62
+ httpTimeout: {
63
+ headersTimeout: 1_234,
64
+ bodyTimeout: 2_345,
65
+ connectTimeout: 345,
66
+ },
67
+ });
68
+
69
+ const config = exposePrivate<{
70
+ getBedrockRequestHandlerConfig: (httpTimeout?: HttpTimeoutOptions) => BedrockRequestHandlerConfig;
71
+ }>(driver).getBedrockRequestHandlerConfig();
72
+
73
+ expect(config).toEqual({
74
+ requestTimeout: 1_234,
75
+ throwOnRequestTimeout: true,
76
+ connectionTimeout: 345,
77
+ socketTimeout: 2_345,
78
+ });
79
+
80
+ const overrideConfig = exposePrivate<{
81
+ getBedrockRequestHandlerConfig: (httpTimeout?: HttpTimeoutOptions) => BedrockRequestHandlerConfig;
82
+ }>(driver).getBedrockRequestHandlerConfig({
83
+ headersTimeout: 456,
84
+ bodyTimeout: 567,
85
+ });
86
+
87
+ expect(overrideConfig).toEqual({
88
+ requestTimeout: 456,
89
+ throwOnRequestTimeout: true,
90
+ connectionTimeout: 345,
91
+ socketTimeout: 567,
92
+ });
93
+
94
+ const defaultExecutor = driver.getExecutor();
95
+ const scopedExecutor = driver.getExecutor({ headersTimeout: 456 });
96
+ expect(scopedExecutor).not.toBe(defaultExecutor);
97
+ expect(driver.getExecutor()).toBe(defaultExecutor);
98
+ scopedExecutor.destroy();
99
+ driver.destroy();
100
+ });
101
+
102
+ it('passes the driver fetch to SDK clients that accept a custom fetch implementation', () => {
103
+ const openai = new OpenAIDriver({ apiKey: 'test-key' });
104
+ expectSdkUsesDriverFetch(openai, openai.service);
105
+ openai.destroy();
106
+
107
+ const azure = new AzureOpenAIDriver({
108
+ apiKey: 'test-key',
109
+ endpoint: 'https://example.openai.azure.com',
110
+ deployment: 'deployment',
111
+ });
112
+ expectSdkUsesDriverFetch(azure, azure.service);
113
+ azure.destroy();
114
+
115
+ const compatible = new OpenAICompatibleDriver({
116
+ apiKey: 'test-key',
117
+ endpoint: 'https://example.test/v1',
118
+ });
119
+ expectSdkUsesDriverFetch(compatible, compatible.service);
120
+ compatible.destroy();
121
+
122
+ const together = new TogetherAIDriver({ apiKey: 'test-key' });
123
+ expectSdkUsesDriverFetch(together, together.service);
124
+ together.destroy();
125
+
126
+ const anthropic = new AnthropicDriver({ apiKey: 'test-key' });
127
+ expectSdkUsesDriverFetch(anthropic, anthropic.client);
128
+ anthropic.destroy();
129
+
130
+ const groq = new GroqDriver({ apiKey: 'test-key' });
131
+ expectSdkUsesDriverFetch(groq, groq.client);
132
+ groq.destroy();
133
+
134
+ const replicate = new ReplicateDriver({ apiKey: 'test-key' });
135
+ expectSdkUsesDriverFetch(replicate, replicate.service);
136
+ replicate.destroy();
137
+
138
+ const xai = new xAIDriver({ apiKey: 'test-key' });
139
+ expectSdkUsesDriverFetch(xai, xai.service);
140
+ xai.destroy();
141
+ });
142
+
143
+ it('passes the driver fetch to FetchClient-backed drivers', async () => {
144
+ const mistral = new MistralAIDriver({ apiKey: 'test-key' });
145
+ await expectFetchClientUsesDriverFetch(mistral, mistral.client);
146
+ mistral.destroy();
147
+
148
+ const watsonx = new WatsonxDriver({
149
+ apiKey: 'test-key',
150
+ projectId: 'project',
151
+ endpointUrl: 'https://example.test',
152
+ });
153
+ await expectFetchClientUsesDriverFetch(watsonx, watsonx.fetchClient);
154
+ watsonx.destroy();
155
+
156
+ const huggingFace = new HuggingFaceIEDriver({
157
+ apiKey: 'test-key',
158
+ endpoint_url: 'https://example.test',
159
+ });
160
+ await expectFetchClientUsesDriverFetch(huggingFace, huggingFace.service);
161
+ huggingFace.destroy();
162
+
163
+ const xai = new xAIDriver({ apiKey: 'test-key' });
164
+ await expectFetchClientUsesDriverFetch(xai, xai.xai_service);
165
+ xai.destroy();
166
+ });
167
+
168
+ it('passes the driver fetch to Vertex AI FetchClient paths', async () => {
169
+ const driver = new VertexAIDriver({
170
+ project: 'project',
171
+ region: 'us-central1',
172
+ });
173
+
174
+ await expectFetchClientUsesDriverFetch(driver, driver.getFetchClient());
175
+ await expectFetchClientUsesDriverFetch(driver, driver.getLLamaClient());
176
+
177
+ driver.destroy();
178
+ });
179
+
180
+ it('maps Vertex AI single-timeout SDK clients from DriverOptions.httpTimeout', () => {
181
+ const driver = new VertexAIDriver({
182
+ project: 'project',
183
+ region: 'us-central1',
184
+ httpTimeout: {
185
+ headersTimeout: 1_000,
186
+ bodyTimeout: 3_000,
187
+ },
188
+ });
189
+
190
+ const internals = exposePrivate<{
191
+ getGoogleGenAIHttpOptions: (
192
+ flex: boolean,
193
+ httpTimeout?: HttpTimeoutOptions,
194
+ ) => {
195
+ timeout: number;
196
+ headers?: Record<string, string>;
197
+ };
198
+ getAnthropicVertexClientOptions: (
199
+ region: string,
200
+ authClient: unknown,
201
+ httpTimeout?: HttpTimeoutOptions,
202
+ ) => {
203
+ timeout: number;
204
+ region: string;
205
+ projectId: string;
206
+ fetch: typeof fetch;
207
+ };
208
+ }>(driver);
209
+
210
+ expect(internals.getGoogleGenAIHttpOptions(false)).toEqual({
211
+ timeout: 3_000,
212
+ });
213
+ expect(internals.getGoogleGenAIHttpOptions(true)).toEqual({
214
+ timeout: 3_000,
215
+ headers: {
216
+ 'X-Vertex-AI-LLM-Request-Type': 'shared',
217
+ 'X-Vertex-AI-LLM-Shared-Request-Type': 'flex',
218
+ },
219
+ });
220
+ expect(
221
+ internals.getGoogleGenAIHttpOptions(false, {
222
+ headersTimeout: 10_000,
223
+ bodyTimeout: 20_000,
224
+ }),
225
+ ).toEqual({
226
+ timeout: 20_000,
227
+ });
228
+
229
+ const anthropicOptions = internals.getAnthropicVertexClientOptions('global', {});
230
+ expect(anthropicOptions).toEqual({
231
+ timeout: 3_000,
232
+ region: 'global',
233
+ projectId: 'project',
234
+ authClient: {},
235
+ fetch: driverFetch(driver),
236
+ });
237
+ expect(
238
+ internals.getAnthropicVertexClientOptions(
239
+ 'global',
240
+ {},
241
+ {
242
+ headersTimeout: 10_000,
243
+ bodyTimeout: 20_000,
244
+ },
245
+ ),
246
+ ).toEqual({
247
+ timeout: 20_000,
248
+ region: 'global',
249
+ projectId: 'project',
250
+ authClient: {},
251
+ fetch: driverFetch(driver),
252
+ });
253
+
254
+ const defaultGoogleClient = driver.getGoogleGenAIClient();
255
+ const overrideGoogleClient = driver.getGoogleGenAIClient('us-central1', false, {
256
+ headersTimeout: 10_000,
257
+ });
258
+ expect(overrideGoogleClient).not.toBe(defaultGoogleClient);
259
+ expect(driver.getGoogleGenAIClient()).toBe(defaultGoogleClient);
260
+
261
+ driver.destroy();
262
+ });
263
+ });