promptfoo 0.93.3 → 0.94.1

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 (541) hide show
  1. package/dist/drizzle/0008_broad_boomer.sql +2 -0
  2. package/dist/drizzle/0009_strong_marten_broadcloak.sql +19 -0
  3. package/dist/drizzle/meta/0008_snapshot.json +732 -0
  4. package/dist/drizzle/meta/0009_snapshot.json +622 -0
  5. package/dist/drizzle/meta/_journal.json +14 -0
  6. package/dist/package.json +17 -20
  7. package/dist/src/app/assets/index-4JjOSsmx.js +769 -0
  8. package/dist/src/app/assets/{index.es-9tmWNumA.js → index.es-DOb6N_qo.js} +1 -1
  9. package/dist/src/app/assets/{sync-BdPRE9yh.js → sync-MiL88_Tb.js} +1 -1
  10. package/dist/src/app/index.html +1 -1
  11. package/dist/src/{assertions.d.ts → assertions/index.d.ts} +4 -5
  12. package/dist/src/assertions/index.d.ts.map +1 -0
  13. package/dist/src/{assertions.js → assertions/index.js} +24 -50
  14. package/dist/src/assertions/index.js.map +1 -0
  15. package/dist/src/assertions/utils.d.ts +4 -0
  16. package/dist/src/assertions/utils.d.ts.map +1 -0
  17. package/dist/src/assertions/utils.js +39 -0
  18. package/dist/src/assertions/utils.js.map +1 -0
  19. package/dist/src/cache.d.ts +2 -1
  20. package/dist/src/cache.d.ts.map +1 -1
  21. package/dist/src/cache.js +16 -3
  22. package/dist/src/cache.js.map +1 -1
  23. package/dist/src/commands/config.d.ts.map +1 -1
  24. package/dist/src/commands/config.js +41 -8
  25. package/dist/src/commands/config.js.map +1 -1
  26. package/dist/src/commands/eval.d.ts.map +1 -1
  27. package/dist/src/commands/eval.js +43 -19
  28. package/dist/src/commands/eval.js.map +1 -1
  29. package/dist/src/commands/init.d.ts.map +1 -1
  30. package/dist/src/commands/init.js +3 -4
  31. package/dist/src/commands/init.js.map +1 -1
  32. package/dist/src/database/index.d.ts.map +1 -1
  33. package/dist/src/database/index.js +4 -1
  34. package/dist/src/database/index.js.map +1 -1
  35. package/dist/src/database/tables.d.ts +171 -154
  36. package/dist/src/database/tables.d.ts.map +1 -1
  37. package/dist/src/database/tables.js +7 -34
  38. package/dist/src/database/tables.js.map +1 -1
  39. package/dist/src/envars.d.ts +5 -3
  40. package/dist/src/envars.d.ts.map +1 -1
  41. package/dist/src/envars.js.map +1 -1
  42. package/dist/src/evaluator.d.ts.map +1 -1
  43. package/dist/src/evaluator.js +0 -5
  44. package/dist/src/evaluator.js.map +1 -1
  45. package/dist/src/fetch.d.ts +0 -1
  46. package/dist/src/fetch.d.ts.map +1 -1
  47. package/dist/src/fetch.js +17 -6
  48. package/dist/src/fetch.js.map +1 -1
  49. package/dist/src/googleSheets.d.ts.map +1 -1
  50. package/dist/src/googleSheets.js +13 -2
  51. package/dist/src/googleSheets.js.map +1 -1
  52. package/dist/src/integrations/portkey.d.ts.map +1 -1
  53. package/dist/src/integrations/portkey.js +1 -2
  54. package/dist/src/integrations/portkey.js.map +1 -1
  55. package/dist/src/models/eval.d.ts +1 -3
  56. package/dist/src/models/eval.d.ts.map +1 -1
  57. package/dist/src/models/eval.js +5 -21
  58. package/dist/src/models/eval.js.map +1 -1
  59. package/dist/src/models/evalResult.d.ts +2 -0
  60. package/dist/src/models/evalResult.d.ts.map +1 -1
  61. package/dist/src/models/evalResult.js +4 -1
  62. package/dist/src/models/evalResult.js.map +1 -1
  63. package/dist/src/onboarding.d.ts +2 -2
  64. package/dist/src/onboarding.d.ts.map +1 -1
  65. package/dist/src/onboarding.js +2 -2
  66. package/dist/src/onboarding.js.map +1 -1
  67. package/dist/src/prompts/processors/javascript.d.ts +1 -0
  68. package/dist/src/prompts/processors/javascript.d.ts.map +1 -1
  69. package/dist/src/prompts/processors/javascript.js +6 -2
  70. package/dist/src/prompts/processors/javascript.js.map +1 -1
  71. package/dist/src/prompts/processors/python.d.ts +2 -0
  72. package/dist/src/prompts/processors/python.d.ts.map +1 -1
  73. package/dist/src/prompts/processors/python.js +4 -2
  74. package/dist/src/prompts/processors/python.js.map +1 -1
  75. package/dist/src/providers/anthropic.js +1 -1
  76. package/dist/src/providers/anthropic.js.map +1 -1
  77. package/dist/src/providers/bedrock.d.ts +4 -0
  78. package/dist/src/providers/bedrock.d.ts.map +1 -1
  79. package/dist/src/providers/bedrock.js +12 -0
  80. package/dist/src/providers/bedrock.js.map +1 -1
  81. package/dist/src/providers/fal.d.ts.map +1 -1
  82. package/dist/src/providers/fal.js +1 -2
  83. package/dist/src/providers/fal.js.map +1 -1
  84. package/dist/src/providers/http.d.ts +6 -2
  85. package/dist/src/providers/http.d.ts.map +1 -1
  86. package/dist/src/providers/http.js +70 -29
  87. package/dist/src/providers/http.js.map +1 -1
  88. package/dist/src/providers/openai.d.ts.map +1 -1
  89. package/dist/src/providers/openai.js +48 -33
  90. package/dist/src/providers/openai.js.map +1 -1
  91. package/dist/src/providers/palm.d.ts.map +1 -1
  92. package/dist/src/providers/palm.js +3 -1
  93. package/dist/src/providers/palm.js.map +1 -1
  94. package/dist/src/providers/promptfoo.d.ts.map +1 -1
  95. package/dist/src/providers/promptfoo.js +4 -2
  96. package/dist/src/providers/promptfoo.js.map +1 -1
  97. package/dist/src/providers/replicate.d.ts.map +1 -1
  98. package/dist/src/providers/replicate.js +2 -3
  99. package/dist/src/providers/replicate.js.map +1 -1
  100. package/dist/src/providers/togetherai.d.ts +7 -0
  101. package/dist/src/providers/togetherai.d.ts.map +1 -0
  102. package/dist/src/providers/togetherai.js +33 -0
  103. package/dist/src/providers/togetherai.js.map +1 -0
  104. package/dist/src/providers/vertex.d.ts.map +1 -1
  105. package/dist/src/providers/vertex.js +4 -4
  106. package/dist/src/providers/vertex.js.map +1 -1
  107. package/dist/src/providers/vertexUtil.d.ts +78 -1
  108. package/dist/src/providers/vertexUtil.d.ts.map +1 -1
  109. package/dist/src/providers/vertexUtil.js +57 -15
  110. package/dist/src/providers/vertexUtil.js.map +1 -1
  111. package/dist/src/providers/watsonx.d.ts +5 -4
  112. package/dist/src/providers/watsonx.d.ts.map +1 -1
  113. package/dist/src/providers/watsonx.js +48 -21
  114. package/dist/src/providers/watsonx.js.map +1 -1
  115. package/dist/src/providers/xai.d.ts +7 -0
  116. package/dist/src/providers/xai.d.ts.map +1 -0
  117. package/dist/src/providers/xai.js +23 -0
  118. package/dist/src/providers/xai.js.map +1 -0
  119. package/dist/src/providers.d.ts.map +1 -1
  120. package/dist/src/providers.js +26 -0
  121. package/dist/src/providers.js.map +1 -1
  122. package/dist/src/python/pythonUtils.js +2 -2
  123. package/dist/src/python/pythonUtils.js.map +1 -1
  124. package/dist/src/redteam/commands/init.d.ts.map +1 -1
  125. package/dist/src/redteam/commands/init.js +10 -4
  126. package/dist/src/redteam/commands/init.js.map +1 -1
  127. package/dist/src/redteam/constants.d.ts +25 -2
  128. package/dist/src/redteam/constants.d.ts.map +1 -1
  129. package/dist/src/redteam/constants.js +335 -3
  130. package/dist/src/redteam/constants.js.map +1 -1
  131. package/dist/src/redteam/extraction/util.d.ts.map +1 -1
  132. package/dist/src/redteam/extraction/util.js +4 -2
  133. package/dist/src/redteam/extraction/util.js.map +1 -1
  134. package/dist/src/redteam/plugins/index.d.ts.map +1 -1
  135. package/dist/src/redteam/plugins/index.js +9 -4
  136. package/dist/src/redteam/plugins/index.js.map +1 -1
  137. package/dist/src/redteam/providers/crescendo/index.d.ts.map +1 -1
  138. package/dist/src/redteam/providers/crescendo/index.js +14 -10
  139. package/dist/src/redteam/providers/crescendo/index.js.map +1 -1
  140. package/dist/src/redteam/providers/iterative.d.ts.map +1 -1
  141. package/dist/src/redteam/providers/iterative.js +10 -9
  142. package/dist/src/redteam/providers/iterative.js.map +1 -1
  143. package/dist/src/redteam/providers/iterativeImage.d.ts.map +1 -1
  144. package/dist/src/redteam/providers/iterativeImage.js +6 -0
  145. package/dist/src/redteam/providers/iterativeImage.js.map +1 -1
  146. package/dist/src/redteam/providers/iterativeTree.d.ts +0 -7
  147. package/dist/src/redteam/providers/iterativeTree.d.ts.map +1 -1
  148. package/dist/src/redteam/providers/iterativeTree.js +11 -16
  149. package/dist/src/redteam/providers/iterativeTree.js.map +1 -1
  150. package/dist/src/redteam/providers/shared.d.ts +9 -2
  151. package/dist/src/redteam/providers/shared.d.ts.map +1 -1
  152. package/dist/src/redteam/providers/shared.js +25 -0
  153. package/dist/src/redteam/providers/shared.js.map +1 -1
  154. package/dist/src/redteam/util.d.ts +1 -0
  155. package/dist/src/redteam/util.d.ts.map +1 -1
  156. package/dist/src/redteam/util.js +5 -3
  157. package/dist/src/redteam/util.js.map +1 -1
  158. package/dist/src/server/apiSchemas.d.ts +59 -0
  159. package/dist/src/server/apiSchemas.d.ts.map +1 -0
  160. package/dist/src/server/apiSchemas.js +37 -0
  161. package/dist/src/server/apiSchemas.js.map +1 -0
  162. package/dist/src/server/routes/eval.d.ts +2 -0
  163. package/dist/src/server/routes/eval.d.ts.map +1 -0
  164. package/dist/src/server/routes/eval.js +160 -0
  165. package/dist/src/server/routes/eval.js.map +1 -0
  166. package/dist/src/server/routes/providers.d.ts.map +1 -1
  167. package/dist/src/server/routes/providers.js.map +1 -1
  168. package/dist/src/server/routes/redteam.d.ts +2 -0
  169. package/dist/src/server/routes/redteam.d.ts.map +1 -0
  170. package/dist/src/server/routes/redteam.js +43 -0
  171. package/dist/src/server/routes/redteam.js.map +1 -0
  172. package/dist/src/server/routes/user.d.ts +2 -0
  173. package/dist/src/server/routes/user.d.ts.map +1 -0
  174. package/dist/src/server/routes/user.js +60 -0
  175. package/dist/src/server/routes/user.js.map +1 -0
  176. package/dist/src/server/server.d.ts.map +1 -1
  177. package/dist/src/server/server.js +25 -141
  178. package/dist/src/server/server.js.map +1 -1
  179. package/dist/src/share.d.ts.map +1 -1
  180. package/dist/src/share.js.map +1 -1
  181. package/dist/src/telemetry.d.ts +21 -6
  182. package/dist/src/telemetry.d.ts.map +1 -1
  183. package/dist/src/telemetry.js +28 -11
  184. package/dist/src/telemetry.js.map +1 -1
  185. package/dist/src/testCases.d.ts.map +1 -1
  186. package/dist/src/testCases.js +9 -0
  187. package/dist/src/testCases.js.map +1 -1
  188. package/dist/src/types/index.d.ts +4892 -56
  189. package/dist/src/types/index.d.ts.map +1 -1
  190. package/dist/src/types/index.js +17 -0
  191. package/dist/src/types/index.js.map +1 -1
  192. package/dist/src/types/prompts.d.ts +1 -0
  193. package/dist/src/types/prompts.d.ts.map +1 -1
  194. package/dist/src/types/providers.d.ts +1 -0
  195. package/dist/src/types/providers.d.ts.map +1 -1
  196. package/dist/src/types/providers.js.map +1 -1
  197. package/dist/src/util/config/default.d.ts +1 -0
  198. package/dist/src/util/config/default.d.ts.map +1 -1
  199. package/dist/src/util/config/default.js +4 -0
  200. package/dist/src/util/config/default.js.map +1 -1
  201. package/dist/src/util/config/load.d.ts.map +1 -1
  202. package/dist/src/util/config/load.js +7 -0
  203. package/dist/src/util/config/load.js.map +1 -1
  204. package/dist/src/util/config/manage.d.ts.map +1 -1
  205. package/dist/src/util/config/manage.js +12 -1
  206. package/dist/src/util/config/manage.js.map +1 -1
  207. package/dist/src/util/index.d.ts +0 -1
  208. package/dist/src/util/index.d.ts.map +1 -1
  209. package/dist/src/util/index.js +1 -10
  210. package/dist/src/util/index.js.map +1 -1
  211. package/dist/src/validators/redteam.d.ts +6 -3
  212. package/dist/src/validators/redteam.d.ts.map +1 -1
  213. package/dist/src/validators/redteam.js +15 -14
  214. package/dist/src/validators/redteam.js.map +1 -1
  215. package/dist/test/assertions/index.test.d.ts +2 -0
  216. package/dist/test/assertions/index.test.d.ts.map +1 -0
  217. package/dist/test/{assertions.test.js → assertions/index.test.js} +22 -23
  218. package/dist/test/assertions/index.test.js.map +1 -0
  219. package/dist/test/assertions/utils.test.d.ts +2 -0
  220. package/dist/test/assertions/utils.test.d.ts.map +1 -0
  221. package/dist/test/{assertions.utils.test.js → assertions/utils.test.js} +58 -8
  222. package/dist/test/assertions/utils.test.js.map +1 -0
  223. package/dist/test/cache.test.js +22 -23
  224. package/dist/test/cache.test.js.map +1 -1
  225. package/dist/test/commands/init.test.js +14 -11
  226. package/dist/test/commands/init.test.js.map +1 -1
  227. package/dist/test/evaluator.test.js +0 -1
  228. package/dist/test/evaluator.test.js.map +1 -1
  229. package/dist/test/evaluatorHelpers.test.js +0 -1
  230. package/dist/test/evaluatorHelpers.test.js.map +1 -1
  231. package/dist/test/factories/evalFactory.d.ts +171 -40
  232. package/dist/test/factories/evalFactory.d.ts.map +1 -1
  233. package/dist/test/matchers.test.js +1 -1
  234. package/dist/test/matchers.test.js.map +1 -1
  235. package/dist/test/models/eval.test.js +30 -1
  236. package/dist/test/models/eval.test.js.map +1 -1
  237. package/dist/test/onboarding.test.js +1 -1
  238. package/dist/test/prompts/index.test.d.ts +2 -0
  239. package/dist/test/prompts/index.test.d.ts.map +1 -0
  240. package/dist/test/{prompts.test.js → prompts/index.test.js} +12 -10
  241. package/dist/test/prompts/index.test.js.map +1 -0
  242. package/dist/test/prompts/processors/javascript.test.d.ts +2 -0
  243. package/dist/test/prompts/processors/javascript.test.d.ts.map +1 -0
  244. package/dist/test/{prompts.processors.javascript.test.js → prompts/processors/javascript.test.js} +58 -5
  245. package/dist/test/prompts/processors/javascript.test.js.map +1 -0
  246. package/dist/test/prompts/processors/json.test.d.ts +2 -0
  247. package/dist/test/prompts/processors/json.test.d.ts.map +1 -0
  248. package/dist/test/{prompts.processors.json.test.js → prompts/processors/json.test.js} +2 -2
  249. package/dist/test/prompts/processors/json.test.js.map +1 -0
  250. package/dist/test/prompts/processors/jsonl.test.d.ts +2 -0
  251. package/dist/test/prompts/processors/jsonl.test.d.ts.map +1 -0
  252. package/dist/test/{prompts.processors.jsonl.test.js → prompts/processors/jsonl.test.js} +2 -2
  253. package/dist/test/prompts/processors/jsonl.test.js.map +1 -0
  254. package/dist/test/prompts/processors/markdown.test.d.ts +2 -0
  255. package/dist/test/prompts/processors/markdown.test.d.ts.map +1 -0
  256. package/dist/test/{prompts.processors.markdown.test.js → prompts/processors/markdown.test.js} +2 -2
  257. package/dist/test/prompts/processors/markdown.test.js.map +1 -0
  258. package/dist/test/prompts/processors/python.test.d.ts +2 -0
  259. package/dist/test/prompts/processors/python.test.d.ts.map +1 -0
  260. package/dist/test/{prompts.processors.python.test.js → prompts/processors/python.test.js} +19 -4
  261. package/dist/test/prompts/processors/python.test.js.map +1 -0
  262. package/dist/test/prompts/processors/python.utils.test.d.ts +2 -0
  263. package/dist/test/prompts/processors/python.utils.test.d.ts.map +1 -0
  264. package/dist/test/{prompts.processors.python.utils.test.js → prompts/processors/python.utils.test.js} +8 -6
  265. package/dist/test/prompts/processors/python.utils.test.js.map +1 -0
  266. package/dist/test/prompts/processors/string.test.d.ts +2 -0
  267. package/dist/test/prompts/processors/string.test.d.ts.map +1 -0
  268. package/dist/test/{prompts.processors.string.test.js → prompts/processors/string.test.js} +2 -2
  269. package/dist/test/prompts/processors/string.test.js.map +1 -0
  270. package/dist/test/prompts/processors/text.test.d.ts +2 -0
  271. package/dist/test/prompts/processors/text.test.d.ts.map +1 -0
  272. package/dist/test/{prompts.processors.text.test.js → prompts/processors/text.test.js} +3 -3
  273. package/dist/test/prompts/processors/text.test.js.map +1 -0
  274. package/dist/test/prompts/processors/yaml.test.d.ts +2 -0
  275. package/dist/test/prompts/processors/yaml.test.d.ts.map +1 -0
  276. package/dist/test/{prompts.processors.yaml.test.js → prompts/processors/yaml.test.js} +2 -2
  277. package/dist/test/prompts/processors/yaml.test.js.map +1 -0
  278. package/dist/test/prompts/utils.test.d.ts +2 -0
  279. package/dist/test/prompts/utils.test.d.ts.map +1 -0
  280. package/dist/test/{prompts.utils.test.js → prompts/utils.test.js} +2 -2
  281. package/dist/test/prompts/utils.test.js.map +1 -0
  282. package/dist/test/providers/anthropic.test.d.ts +2 -0
  283. package/dist/test/providers/anthropic.test.d.ts.map +1 -0
  284. package/dist/test/{providers.anthropic.test.js → providers/anthropic.test.js} +4 -4
  285. package/dist/test/providers/anthropic.test.js.map +1 -0
  286. package/dist/test/providers/azure.test.d.ts +2 -0
  287. package/dist/test/providers/azure.test.d.ts.map +1 -0
  288. package/dist/test/{providers.azure.test.js → providers/azure.test.js} +7 -7
  289. package/dist/test/providers/azure.test.js.map +1 -0
  290. package/dist/test/providers/bedrock.test.d.ts +2 -0
  291. package/dist/test/providers/bedrock.test.d.ts.map +1 -0
  292. package/dist/test/{providers.bedrock.test.js → providers/bedrock.test.js} +62 -10
  293. package/dist/test/providers/bedrock.test.js.map +1 -0
  294. package/dist/test/providers/groq.test.d.ts +2 -0
  295. package/dist/test/providers/groq.test.d.ts.map +1 -0
  296. package/dist/test/{providers.groq.test.js → providers/groq.test.js} +6 -6
  297. package/dist/test/providers/groq.test.js.map +1 -0
  298. package/dist/test/providers/http.test.d.ts +2 -0
  299. package/dist/test/providers/http.test.d.ts.map +1 -0
  300. package/dist/test/{providers.http.test.js → providers/http.test.js} +195 -47
  301. package/dist/test/providers/http.test.js.map +1 -0
  302. package/dist/test/providers/index.test.d.ts +2 -0
  303. package/dist/test/providers/index.test.d.ts.map +1 -0
  304. package/dist/test/{providers.test.js → providers/index.test.js} +193 -100
  305. package/dist/test/providers/index.test.js.map +1 -0
  306. package/dist/test/providers/llama.test.d.ts +2 -0
  307. package/dist/test/providers/llama.test.d.ts.map +1 -0
  308. package/dist/test/{providers.llama.test.js → providers/llama.test.js} +15 -10
  309. package/dist/test/providers/llama.test.js.map +1 -0
  310. package/dist/test/providers/mistral.test.d.ts +2 -0
  311. package/dist/test/providers/mistral.test.d.ts.map +1 -0
  312. package/dist/test/{providers.mistral.test.js → providers/mistral.test.js} +32 -16
  313. package/dist/test/providers/mistral.test.js.map +1 -0
  314. package/dist/test/providers/packageParser.test.d.ts +2 -0
  315. package/dist/test/providers/packageParser.test.d.ts.map +1 -0
  316. package/dist/test/{providers.packageParser.test.js → providers/packageParser.test.js} +5 -5
  317. package/dist/test/providers/packageParser.test.js.map +1 -0
  318. package/dist/test/providers/palm.test.d.ts +2 -0
  319. package/dist/test/providers/palm.test.d.ts.map +1 -0
  320. package/dist/test/providers/palm.test.js +131 -0
  321. package/dist/test/providers/palm.test.js.map +1 -0
  322. package/dist/test/providers/pythonCompletion.test.d.ts +2 -0
  323. package/dist/test/providers/pythonCompletion.test.d.ts.map +1 -0
  324. package/dist/test/{providers.pythonCompletion.test.js → providers/pythonCompletion.test.js} +8 -8
  325. package/dist/test/providers/pythonCompletion.test.js.map +1 -0
  326. package/dist/test/providers/scriptCompletion.test.d.ts +2 -0
  327. package/dist/test/providers/scriptCompletion.test.d.ts.map +1 -0
  328. package/dist/test/{providers.scriptCompletion.test.js → providers/scriptCompletion.test.js} +5 -5
  329. package/dist/test/providers/scriptCompletion.test.js.map +1 -0
  330. package/dist/test/providers/shared.test.d.ts +2 -0
  331. package/dist/test/providers/shared.test.d.ts.map +1 -0
  332. package/dist/test/{providers.shared.test.js → providers/shared.test.js} +4 -4
  333. package/dist/test/providers/shared.test.js.map +1 -0
  334. package/dist/test/providers/togetherai.test.d.ts +2 -0
  335. package/dist/test/providers/togetherai.test.d.ts.map +1 -0
  336. package/dist/test/providers/togetherai.test.js +53 -0
  337. package/dist/test/providers/togetherai.test.js.map +1 -0
  338. package/dist/test/providers/vertex.test.d.ts +2 -0
  339. package/dist/test/providers/vertex.test.d.ts.map +1 -0
  340. package/dist/test/{providers.vertex.test.js → providers/vertex.test.js} +110 -9
  341. package/dist/test/providers/vertex.test.js.map +1 -0
  342. package/dist/test/providers/watsonx.test.d.ts +2 -0
  343. package/dist/test/providers/watsonx.test.d.ts.map +1 -0
  344. package/dist/test/{providers.watsonx.test.js → providers/watsonx.test.js} +23 -22
  345. package/dist/test/providers/watsonx.test.js.map +1 -0
  346. package/dist/test/providers/xai.test.d.ts +2 -0
  347. package/dist/test/providers/xai.test.d.ts.map +1 -0
  348. package/dist/test/providers/xai.test.js +47 -0
  349. package/dist/test/providers/xai.test.js.map +1 -0
  350. package/dist/test/rateLimit.test.js +18 -28
  351. package/dist/test/rateLimit.test.js.map +1 -1
  352. package/dist/test/redteam/extraction/entities.test.js +8 -1
  353. package/dist/test/redteam/extraction/entities.test.js.map +1 -1
  354. package/dist/test/redteam/extraction/purpose.test.js +8 -1
  355. package/dist/test/redteam/extraction/purpose.test.js.map +1 -1
  356. package/dist/test/redteam/extraction/util.test.js +17 -2
  357. package/dist/test/redteam/extraction/util.test.js.map +1 -1
  358. package/dist/test/redteam/providers/iterativeTree.test.js +3 -18
  359. package/dist/test/redteam/providers/iterativeTree.test.js.map +1 -1
  360. package/dist/test/redteam/util.test.js +55 -0
  361. package/dist/test/redteam/util.test.js.map +1 -1
  362. package/dist/test/redteam/validators.test.js +1 -0
  363. package/dist/test/redteam/validators.test.js.map +1 -1
  364. package/dist/test/server/providers.test.js +13 -1
  365. package/dist/test/server/providers.test.js.map +1 -1
  366. package/dist/test/testCases.test.js +12 -1
  367. package/dist/test/testCases.test.js.map +1 -1
  368. package/dist/test/types.test.js +1 -12
  369. package/dist/test/types.test.js.map +1 -1
  370. package/dist/test/util/config/default.test.d.ts +2 -0
  371. package/dist/test/util/config/default.test.d.ts.map +1 -0
  372. package/dist/test/{util.config.default.test.js → util/config/default.test.js} +4 -4
  373. package/dist/test/util/config/default.test.js.map +1 -0
  374. package/dist/test/util/config/load.test.d.ts +2 -0
  375. package/dist/test/util/config/load.test.d.ts.map +1 -0
  376. package/dist/test/{util.config.load.test.ts.js → util/config/load.test.js} +13 -38
  377. package/dist/test/util/config/load.test.js.map +1 -0
  378. package/dist/test/util/config/main.test.d.ts +2 -0
  379. package/dist/test/util/config/main.test.d.ts.map +1 -0
  380. package/dist/test/{util.config.main.test.js → util/config/main.test.js} +13 -5
  381. package/dist/test/util/config/main.test.js.map +1 -0
  382. package/dist/test/util/deleteAll.test.d.ts +2 -0
  383. package/dist/test/util/deleteAll.test.d.ts.map +1 -0
  384. package/dist/test/{util.deleteAll.test.js → util/deleteAll.test.js} +5 -5
  385. package/dist/test/util/deleteAll.test.js.map +1 -0
  386. package/dist/test/util/file.test.d.ts +2 -0
  387. package/dist/test/util/file.test.d.ts.map +1 -0
  388. package/dist/test/{util.file.test.js → util/file.test.js} +2 -2
  389. package/dist/test/util/file.test.js.map +1 -0
  390. package/dist/test/util/generation.test.d.ts +2 -0
  391. package/dist/test/util/generation.test.d.ts.map +1 -0
  392. package/dist/test/{util.generation.test.js → util/generation.test.js} +3 -3
  393. package/dist/test/{util.generation.test.js.map → util/generation.test.js.map} +1 -1
  394. package/dist/test/util/index.test.d.ts +2 -0
  395. package/dist/test/util/index.test.d.ts.map +1 -0
  396. package/dist/test/{util.test.js → util/index.test.js} +10 -10
  397. package/dist/test/util/index.test.js.map +1 -0
  398. package/dist/test/util/json.test.d.ts +2 -0
  399. package/dist/test/util/json.test.d.ts.map +1 -0
  400. package/dist/test/{util.json.test.js → util/json.test.js} +2 -2
  401. package/dist/test/util/json.test.js.map +1 -0
  402. package/dist/test/util/listPrevious.test.d.ts +2 -0
  403. package/dist/test/util/listPrevious.test.d.ts.map +1 -0
  404. package/dist/test/{util.listPrevious.test.js → util/listPrevious.test.js} +4 -4
  405. package/dist/test/util/listPrevious.test.js.map +1 -0
  406. package/dist/test/util/templates.test.d.ts +2 -0
  407. package/dist/test/util/templates.test.d.ts.map +1 -0
  408. package/dist/test/{util.templates.test.js → util/templates.test.js} +2 -2
  409. package/dist/test/util/templates.test.js.map +1 -0
  410. package/dist/test/util/transform.test.d.ts +2 -0
  411. package/dist/test/util/transform.test.d.ts.map +1 -0
  412. package/dist/test/{util.transform.test.js → util/transform.test.js} +6 -6
  413. package/dist/test/util/transform.test.js.map +1 -0
  414. package/dist/test/{utils.d.ts → util/utils.d.ts} +1 -1
  415. package/dist/test/util/utils.d.ts.map +1 -0
  416. package/dist/test/util/utils.js.map +1 -0
  417. package/dist/tsconfig.tsbuildinfo +1 -1
  418. package/package.json +17 -20
  419. package/dist/src/app/assets/index-x0TdnK0A.js +0 -767
  420. package/dist/src/assertions.d.ts.map +0 -1
  421. package/dist/src/assertions.js.map +0 -1
  422. package/dist/src/models/provider.d.ts +0 -11
  423. package/dist/src/models/provider.d.ts.map +0 -1
  424. package/dist/src/models/provider.js +0 -52
  425. package/dist/src/models/provider.js.map +0 -1
  426. package/dist/test/assertions.test.d.ts +0 -2
  427. package/dist/test/assertions.test.d.ts.map +0 -1
  428. package/dist/test/assertions.test.js.map +0 -1
  429. package/dist/test/assertions.utils.test.d.ts +0 -2
  430. package/dist/test/assertions.utils.test.d.ts.map +0 -1
  431. package/dist/test/assertions.utils.test.js.map +0 -1
  432. package/dist/test/prompts.processors.javascript.test.d.ts +0 -2
  433. package/dist/test/prompts.processors.javascript.test.d.ts.map +0 -1
  434. package/dist/test/prompts.processors.javascript.test.js.map +0 -1
  435. package/dist/test/prompts.processors.json.test.d.ts +0 -2
  436. package/dist/test/prompts.processors.json.test.d.ts.map +0 -1
  437. package/dist/test/prompts.processors.json.test.js.map +0 -1
  438. package/dist/test/prompts.processors.jsonl.test.d.ts +0 -2
  439. package/dist/test/prompts.processors.jsonl.test.d.ts.map +0 -1
  440. package/dist/test/prompts.processors.jsonl.test.js.map +0 -1
  441. package/dist/test/prompts.processors.markdown.test.d.ts +0 -2
  442. package/dist/test/prompts.processors.markdown.test.d.ts.map +0 -1
  443. package/dist/test/prompts.processors.markdown.test.js.map +0 -1
  444. package/dist/test/prompts.processors.python.test.d.ts +0 -2
  445. package/dist/test/prompts.processors.python.test.d.ts.map +0 -1
  446. package/dist/test/prompts.processors.python.test.js.map +0 -1
  447. package/dist/test/prompts.processors.python.utils.test.d.ts +0 -2
  448. package/dist/test/prompts.processors.python.utils.test.d.ts.map +0 -1
  449. package/dist/test/prompts.processors.python.utils.test.js.map +0 -1
  450. package/dist/test/prompts.processors.string.test.d.ts +0 -2
  451. package/dist/test/prompts.processors.string.test.d.ts.map +0 -1
  452. package/dist/test/prompts.processors.string.test.js.map +0 -1
  453. package/dist/test/prompts.processors.text.test.d.ts +0 -2
  454. package/dist/test/prompts.processors.text.test.d.ts.map +0 -1
  455. package/dist/test/prompts.processors.text.test.js.map +0 -1
  456. package/dist/test/prompts.processors.yaml.test.d.ts +0 -2
  457. package/dist/test/prompts.processors.yaml.test.d.ts.map +0 -1
  458. package/dist/test/prompts.processors.yaml.test.js.map +0 -1
  459. package/dist/test/prompts.test.d.ts +0 -2
  460. package/dist/test/prompts.test.d.ts.map +0 -1
  461. package/dist/test/prompts.test.js.map +0 -1
  462. package/dist/test/prompts.utils.test.d.ts +0 -2
  463. package/dist/test/prompts.utils.test.d.ts.map +0 -1
  464. package/dist/test/prompts.utils.test.js.map +0 -1
  465. package/dist/test/providers.anthropic.test.d.ts +0 -2
  466. package/dist/test/providers.anthropic.test.d.ts.map +0 -1
  467. package/dist/test/providers.anthropic.test.js.map +0 -1
  468. package/dist/test/providers.azure.test.d.ts +0 -2
  469. package/dist/test/providers.azure.test.d.ts.map +0 -1
  470. package/dist/test/providers.azure.test.js.map +0 -1
  471. package/dist/test/providers.bedrock.test.d.ts +0 -2
  472. package/dist/test/providers.bedrock.test.d.ts.map +0 -1
  473. package/dist/test/providers.bedrock.test.js.map +0 -1
  474. package/dist/test/providers.groq.test.d.ts +0 -2
  475. package/dist/test/providers.groq.test.d.ts.map +0 -1
  476. package/dist/test/providers.groq.test.js.map +0 -1
  477. package/dist/test/providers.http.test.d.ts +0 -2
  478. package/dist/test/providers.http.test.d.ts.map +0 -1
  479. package/dist/test/providers.http.test.js.map +0 -1
  480. package/dist/test/providers.llama.test.d.ts +0 -2
  481. package/dist/test/providers.llama.test.d.ts.map +0 -1
  482. package/dist/test/providers.llama.test.js.map +0 -1
  483. package/dist/test/providers.mistral.test.d.ts +0 -2
  484. package/dist/test/providers.mistral.test.d.ts.map +0 -1
  485. package/dist/test/providers.mistral.test.js.map +0 -1
  486. package/dist/test/providers.packageParser.test.d.ts +0 -2
  487. package/dist/test/providers.packageParser.test.d.ts.map +0 -1
  488. package/dist/test/providers.packageParser.test.js.map +0 -1
  489. package/dist/test/providers.pythonCompletion.test.d.ts +0 -2
  490. package/dist/test/providers.pythonCompletion.test.d.ts.map +0 -1
  491. package/dist/test/providers.pythonCompletion.test.js.map +0 -1
  492. package/dist/test/providers.scriptCompletion.test.d.ts +0 -2
  493. package/dist/test/providers.scriptCompletion.test.d.ts.map +0 -1
  494. package/dist/test/providers.scriptCompletion.test.js.map +0 -1
  495. package/dist/test/providers.shared.test.d.ts +0 -2
  496. package/dist/test/providers.shared.test.d.ts.map +0 -1
  497. package/dist/test/providers.shared.test.js.map +0 -1
  498. package/dist/test/providers.test.d.ts +0 -2
  499. package/dist/test/providers.test.d.ts.map +0 -1
  500. package/dist/test/providers.test.js.map +0 -1
  501. package/dist/test/providers.vertex.test.d.ts +0 -2
  502. package/dist/test/providers.vertex.test.d.ts.map +0 -1
  503. package/dist/test/providers.vertex.test.js.map +0 -1
  504. package/dist/test/providers.watsonx.test.d.ts +0 -2
  505. package/dist/test/providers.watsonx.test.d.ts.map +0 -1
  506. package/dist/test/providers.watsonx.test.js.map +0 -1
  507. package/dist/test/util.config.default.test.d.ts +0 -2
  508. package/dist/test/util.config.default.test.d.ts.map +0 -1
  509. package/dist/test/util.config.default.test.js.map +0 -1
  510. package/dist/test/util.config.load.test.ts.d.ts +0 -2
  511. package/dist/test/util.config.load.test.ts.d.ts.map +0 -1
  512. package/dist/test/util.config.load.test.ts.js.map +0 -1
  513. package/dist/test/util.config.main.test.d.ts +0 -2
  514. package/dist/test/util.config.main.test.d.ts.map +0 -1
  515. package/dist/test/util.config.main.test.js.map +0 -1
  516. package/dist/test/util.deleteAll.test.d.ts +0 -2
  517. package/dist/test/util.deleteAll.test.d.ts.map +0 -1
  518. package/dist/test/util.deleteAll.test.js.map +0 -1
  519. package/dist/test/util.file.test.d.ts +0 -2
  520. package/dist/test/util.file.test.d.ts.map +0 -1
  521. package/dist/test/util.file.test.js.map +0 -1
  522. package/dist/test/util.generation.test.d.ts +0 -2
  523. package/dist/test/util.generation.test.d.ts.map +0 -1
  524. package/dist/test/util.json.test.d.ts +0 -2
  525. package/dist/test/util.json.test.d.ts.map +0 -1
  526. package/dist/test/util.json.test.js.map +0 -1
  527. package/dist/test/util.listPrevious.test.d.ts +0 -2
  528. package/dist/test/util.listPrevious.test.d.ts.map +0 -1
  529. package/dist/test/util.listPrevious.test.js.map +0 -1
  530. package/dist/test/util.templates.test.d.ts +0 -2
  531. package/dist/test/util.templates.test.d.ts.map +0 -1
  532. package/dist/test/util.templates.test.js.map +0 -1
  533. package/dist/test/util.test.d.ts +0 -2
  534. package/dist/test/util.test.d.ts.map +0 -1
  535. package/dist/test/util.test.js.map +0 -1
  536. package/dist/test/util.transform.test.d.ts +0 -2
  537. package/dist/test/util.transform.test.d.ts.map +0 -1
  538. package/dist/test/util.transform.test.js.map +0 -1
  539. package/dist/test/utils.d.ts.map +0 -1
  540. package/dist/test/utils.js.map +0 -1
  541. /package/dist/test/{utils.js → util/utils.js} +0 -0
@@ -30,30 +30,29 @@ const chalk_1 = __importDefault(require("chalk"));
30
30
  const child_process_1 = __importDefault(require("child_process"));
31
31
  const dedent_1 = __importDefault(require("dedent"));
32
32
  const fs = __importStar(require("fs"));
33
- const node_fetch_1 = __importDefault(require("node-fetch"));
34
33
  const path = __importStar(require("path"));
35
34
  const stream_1 = __importDefault(require("stream"));
36
- const cache_1 = require("../src/cache");
37
- const esm_1 = require("../src/esm");
38
- const logger_1 = __importDefault(require("../src/logger"));
39
- const providers_1 = require("../src/providers");
40
- const anthropic_1 = require("../src/providers/anthropic");
41
- const azureopenai_1 = require("../src/providers/azureopenai");
42
- const bedrock_1 = require("../src/providers/bedrock");
43
- const cloudflare_ai_1 = require("../src/providers/cloudflare-ai");
44
- const huggingface_1 = require("../src/providers/huggingface");
45
- const llama_1 = require("../src/providers/llama");
46
- const ollama_1 = require("../src/providers/ollama");
47
- const openai_1 = require("../src/providers/openai");
48
- const pythonCompletion_1 = require("../src/providers/pythonCompletion");
49
- const replicate_1 = require("../src/providers/replicate");
50
- const scriptCompletion_1 = require("../src/providers/scriptCompletion");
51
- const vertex_1 = require("../src/providers/vertex");
52
- const voyage_1 = require("../src/providers/voyage");
53
- const webhook_1 = require("../src/providers/webhook");
54
- const iterative_1 = __importDefault(require("../src/redteam/providers/iterative"));
55
- const iterativeImage_1 = __importDefault(require("../src/redteam/providers/iterativeImage"));
56
- const iterativeTree_1 = __importDefault(require("../src/redteam/providers/iterativeTree"));
35
+ const cache_1 = require("../../src/cache");
36
+ const esm_1 = require("../../src/esm");
37
+ const logger_1 = __importDefault(require("../../src/logger"));
38
+ const providers_1 = require("../../src/providers");
39
+ const anthropic_1 = require("../../src/providers/anthropic");
40
+ const azureopenai_1 = require("../../src/providers/azureopenai");
41
+ const bedrock_1 = require("../../src/providers/bedrock");
42
+ const cloudflare_ai_1 = require("../../src/providers/cloudflare-ai");
43
+ const huggingface_1 = require("../../src/providers/huggingface");
44
+ const llama_1 = require("../../src/providers/llama");
45
+ const ollama_1 = require("../../src/providers/ollama");
46
+ const openai_1 = require("../../src/providers/openai");
47
+ const pythonCompletion_1 = require("../../src/providers/pythonCompletion");
48
+ const replicate_1 = require("../../src/providers/replicate");
49
+ const scriptCompletion_1 = require("../../src/providers/scriptCompletion");
50
+ const vertex_1 = require("../../src/providers/vertex");
51
+ const voyage_1 = require("../../src/providers/voyage");
52
+ const webhook_1 = require("../../src/providers/webhook");
53
+ const iterative_1 = __importDefault(require("../../src/redteam/providers/iterative"));
54
+ const iterativeImage_1 = __importDefault(require("../../src/redteam/providers/iterativeImage"));
55
+ const iterativeTree_1 = __importDefault(require("../../src/redteam/providers/iterativeTree"));
57
56
  jest.mock('fs', () => ({
58
57
  readFileSync: jest.fn(),
59
58
  writeFileSync: jest.fn(),
@@ -68,12 +67,11 @@ jest.mock('fs', () => ({
68
67
  jest.mock('glob', () => ({
69
68
  globSync: jest.fn(),
70
69
  }));
71
- jest.mock('node-fetch', () => jest.fn());
72
70
  jest.mock('proxy-agent', () => ({
73
71
  ProxyAgent: jest.fn().mockImplementation(() => ({})),
74
72
  }));
75
- jest.mock('../src/esm', () => ({
76
- ...jest.requireActual('../src/esm'),
73
+ jest.mock('../../src/esm', () => ({
74
+ ...jest.requireActual('../../src/esm'),
77
75
  importModule: jest.fn(),
78
76
  }));
79
77
  jest.mock('fs', () => ({
@@ -84,15 +82,17 @@ jest.mock('fs', () => ({
84
82
  jest.mock('glob', () => ({
85
83
  globSync: jest.fn(),
86
84
  }));
87
- jest.mock('../src/database', () => ({
85
+ jest.mock('../../src/database', () => ({
88
86
  getDb: jest.fn(),
89
87
  }));
90
- jest.mock('../src/logger', () => ({
88
+ jest.mock('../../src/logger', () => ({
91
89
  error: jest.fn(),
92
90
  debug: jest.fn(),
93
91
  info: jest.fn(),
94
92
  warn: jest.fn(),
95
93
  }));
94
+ const mockFetch = jest.mocked(jest.fn());
95
+ global.fetch = mockFetch;
96
96
  const defaultMockResponse = {
97
97
  status: 200,
98
98
  statusText: 'OK',
@@ -113,10 +113,10 @@ describe('call provider apis', () => {
113
113
  usage: { total_tokens: 10, prompt_tokens: 5, completion_tokens: 5 },
114
114
  })),
115
115
  };
116
- jest.mocked(node_fetch_1.default).mockResolvedValue(mockResponse);
116
+ mockFetch.mockResolvedValue(mockResponse);
117
117
  const provider = new openai_1.OpenAiCompletionProvider('text-davinci-003');
118
118
  const result = await provider.callApi('Test prompt');
119
- expect(node_fetch_1.default).toHaveBeenCalledTimes(1);
119
+ expect(mockFetch).toHaveBeenCalledTimes(1);
120
120
  expect(result.output).toBe('Test output');
121
121
  expect(result.tokenUsage).toEqual({ total: 10, prompt: 5, completion: 5 });
122
122
  });
@@ -129,10 +129,10 @@ describe('call provider apis', () => {
129
129
  })),
130
130
  ok: true,
131
131
  };
132
- jest.mocked(node_fetch_1.default).mockResolvedValue(mockResponse);
132
+ mockFetch.mockResolvedValue(mockResponse);
133
133
  const provider = new openai_1.OpenAiChatCompletionProvider('gpt-4o-mini');
134
134
  const result = await provider.callApi(JSON.stringify([{ role: 'user', content: 'Test prompt' }]));
135
- expect(node_fetch_1.default).toHaveBeenCalledTimes(1);
135
+ expect(mockFetch).toHaveBeenCalledTimes(1);
136
136
  expect(result.output).toBe('Test output');
137
137
  expect(result.tokenUsage).toEqual({ total: 10, prompt: 5, completion: 5 });
138
138
  });
@@ -145,14 +145,14 @@ describe('call provider apis', () => {
145
145
  })),
146
146
  ok: true,
147
147
  };
148
- jest.mocked(node_fetch_1.default).mockResolvedValue(mockResponse);
148
+ mockFetch.mockResolvedValue(mockResponse);
149
149
  const provider = new openai_1.OpenAiChatCompletionProvider('gpt-4o-mini');
150
150
  const result = await provider.callApi(JSON.stringify([{ role: 'user', content: 'Test prompt 2' }]));
151
- expect(node_fetch_1.default).toHaveBeenCalledTimes(1);
151
+ expect(mockFetch).toHaveBeenCalledTimes(1);
152
152
  expect(result.output).toBe('Test output 2');
153
153
  expect(result.tokenUsage).toEqual({ total: 10, prompt: 5, completion: 5 });
154
154
  const result2 = await provider.callApi(JSON.stringify([{ role: 'user', content: 'Test prompt 2' }]));
155
- expect(node_fetch_1.default).toHaveBeenCalledTimes(1);
155
+ expect(mockFetch).toHaveBeenCalledTimes(1);
156
156
  expect(result2.output).toBe('Test output 2');
157
157
  expect(result2.tokenUsage).toEqual({ total: 10, cached: 10 });
158
158
  });
@@ -165,15 +165,15 @@ describe('call provider apis', () => {
165
165
  })),
166
166
  ok: true,
167
167
  };
168
- jest.mocked(node_fetch_1.default).mockResolvedValue(mockResponse);
168
+ mockFetch.mockResolvedValue(mockResponse);
169
169
  const provider = new openai_1.OpenAiChatCompletionProvider('gpt-4o-mini');
170
170
  const result = await provider.callApi(JSON.stringify([{ role: 'user', content: 'Test prompt' }]));
171
- expect(node_fetch_1.default).toHaveBeenCalledTimes(1);
171
+ expect(mockFetch).toHaveBeenCalledTimes(1);
172
172
  expect(result.output).toBe('Test output');
173
173
  expect(result.tokenUsage).toEqual({ total: 10, prompt: 5, completion: 5 });
174
174
  (0, cache_1.disableCache)();
175
175
  const result2 = await provider.callApi(JSON.stringify([{ role: 'user', content: 'Test prompt' }]));
176
- expect(node_fetch_1.default).toHaveBeenCalledTimes(2);
176
+ expect(mockFetch).toHaveBeenCalledTimes(2);
177
177
  expect(result2.output).toBe('Test output');
178
178
  expect(result2.tokenUsage).toEqual({ total: 10, prompt: 5, completion: 5 });
179
179
  (0, cache_1.enableCache)();
@@ -186,7 +186,7 @@ describe('call provider apis', () => {
186
186
  const provider = new openai_1.OpenAiChatCompletionProvider('gpt-4o-mini', { config });
187
187
  const prompt = 'Test prompt';
188
188
  await provider.callApi(prompt);
189
- expect(node_fetch_1.default).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
189
+ expect(mockFetch).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
190
190
  body: expect.stringMatching(`temperature\":3.1415926`),
191
191
  }));
192
192
  expect(provider.config.temperature).toBe(config.temperature);
@@ -201,7 +201,7 @@ describe('call provider apis', () => {
201
201
  })),
202
202
  ok: true,
203
203
  };
204
- jest.mocked(node_fetch_1.default).mockResolvedValue(mockResponse);
204
+ mockFetch.mockResolvedValue(mockResponse);
205
205
  const provider = new openai_1.OpenAiChatCompletionProvider('gpt-4o-mini', {
206
206
  config: {
207
207
  response_format: {
@@ -223,7 +223,7 @@ describe('call provider apis', () => {
223
223
  },
224
224
  });
225
225
  const result = await provider.callApi(JSON.stringify([{ role: 'user', content: 'Get me a person' }]));
226
- expect(node_fetch_1.default).toHaveBeenCalledTimes(1);
226
+ expect(mockFetch).toHaveBeenCalledTimes(1);
227
227
  expect(result.output).toEqual({ name: 'John', age: 30 });
228
228
  expect(result.tokenUsage).toEqual({ total: 10, prompt: 5, completion: 5 });
229
229
  });
@@ -236,12 +236,13 @@ describe('call provider apis', () => {
236
236
  })),
237
237
  ok: true,
238
238
  };
239
- jest.mocked(node_fetch_1.default).mockResolvedValue(mockResponse);
239
+ mockFetch.mockResolvedValue(mockResponse);
240
240
  const provider = new openai_1.OpenAiChatCompletionProvider('gpt-4o-mini');
241
241
  const result = await provider.callApi(JSON.stringify([{ role: 'user', content: 'Generate inappropriate content' }]));
242
- expect(node_fetch_1.default).toHaveBeenCalledTimes(1);
243
- expect(result.error).toBe('Model refused to generate a response: Content policy violation');
242
+ expect(mockFetch).toHaveBeenCalledTimes(1);
243
+ expect(result.output).toBe('Content policy violation');
244
244
  expect(result.tokenUsage).toEqual({ total: 5, prompt: 5, completion: 0 });
245
+ expect(result.isRefusal).toBe(true);
245
246
  });
246
247
  it('OpenAiChatCompletionProvider callApi with function tool callbacks', async () => {
247
248
  const mockResponse = {
@@ -266,7 +267,7 @@ describe('call provider apis', () => {
266
267
  })),
267
268
  ok: true,
268
269
  };
269
- jest.mocked(node_fetch_1.default).mockResolvedValue(mockResponse);
270
+ mockFetch.mockResolvedValue(mockResponse);
270
271
  const mockWeatherFunction = jest.fn().mockResolvedValue('Sunny, 25°C');
271
272
  const provider = new openai_1.OpenAiChatCompletionProvider('gpt-4o-mini', {
272
273
  config: {
@@ -292,7 +293,7 @@ describe('call provider apis', () => {
292
293
  },
293
294
  });
294
295
  const result = await provider.callApi(JSON.stringify([{ role: 'user', content: "What's the weather in New York?" }]));
295
- expect(node_fetch_1.default).toHaveBeenCalledTimes(1);
296
+ expect(mockFetch).toHaveBeenCalledTimes(1);
296
297
  expect(mockWeatherFunction).toHaveBeenCalledWith('{"location":"New York"}');
297
298
  expect(result.output).toBe('Sunny, 25°C');
298
299
  expect(result.tokenUsage).toEqual({ total: 15, prompt: 10, completion: 5 });
@@ -305,10 +306,10 @@ describe('call provider apis', () => {
305
306
  usage: { total_tokens: 10, prompt_tokens: 5, completion_tokens: 5 },
306
307
  })),
307
308
  };
308
- jest.mocked(node_fetch_1.default).mockResolvedValue(mockResponse);
309
+ mockFetch.mockResolvedValue(mockResponse);
309
310
  const provider = new azureopenai_1.AzureOpenAiCompletionProvider('text-davinci-003');
310
311
  const result = await provider.callApi('Test prompt');
311
- expect(node_fetch_1.default).toHaveBeenCalledTimes(1);
312
+ expect(mockFetch).toHaveBeenCalledTimes(1);
312
313
  expect(result.output).toBe('Test output');
313
314
  expect(result.tokenUsage).toEqual({ total: 10, prompt: 5, completion: 5 });
314
315
  });
@@ -320,10 +321,10 @@ describe('call provider apis', () => {
320
321
  usage: { total_tokens: 10, prompt_tokens: 5, completion_tokens: 5 },
321
322
  })),
322
323
  };
323
- jest.mocked(node_fetch_1.default).mockResolvedValue(mockResponse);
324
+ mockFetch.mockResolvedValue(mockResponse);
324
325
  const provider = new azureopenai_1.AzureOpenAiChatCompletionProvider('gpt-4o-mini');
325
326
  const result = await provider.callApi(JSON.stringify([{ role: 'user', content: 'Test prompt' }]));
326
- expect(node_fetch_1.default).toHaveBeenCalledTimes(1);
327
+ expect(mockFetch).toHaveBeenCalledTimes(1);
327
328
  expect(result.output).toBe('Test output');
328
329
  expect(result.tokenUsage).toEqual({ total: 10, prompt: 5, completion: 5 });
329
330
  });
@@ -348,7 +349,7 @@ describe('call provider apis', () => {
348
349
  usage: { total_tokens: 10, prompt_tokens: 5, completion_tokens: 5 },
349
350
  })),
350
351
  };
351
- jest.mocked(node_fetch_1.default).mockResolvedValue(mockResponse);
352
+ mockFetch.mockResolvedValue(mockResponse);
352
353
  const provider = new azureopenai_1.AzureOpenAiChatCompletionProvider('gpt-4o-mini', {
353
354
  config: { dataSources },
354
355
  });
@@ -356,7 +357,7 @@ describe('call provider apis', () => {
356
357
  { role: 'system', content: 'System prompt' },
357
358
  { role: 'user', content: 'Test prompt' },
358
359
  ]));
359
- expect(node_fetch_1.default).toHaveBeenCalledTimes(1);
360
+ expect(mockFetch).toHaveBeenCalledTimes(1);
360
361
  expect(result.output).toBe('Test response');
361
362
  expect(result.tokenUsage).toEqual({ total: 10, prompt: 5, completion: 5 });
362
363
  });
@@ -369,10 +370,10 @@ describe('call provider apis', () => {
369
370
  usage: { total_tokens: 10, prompt_tokens: 5, completion_tokens: 5 },
370
371
  })),
371
372
  };
372
- jest.mocked(node_fetch_1.default).mockResolvedValue(mockResponse);
373
+ mockFetch.mockResolvedValue(mockResponse);
373
374
  const provider = new azureopenai_1.AzureOpenAiChatCompletionProvider('gpt-4o-mini');
374
375
  const result = await provider.callApi(JSON.stringify([{ role: 'user', content: 'Test prompt' }]));
375
- expect(node_fetch_1.default).toHaveBeenCalledTimes(1);
376
+ expect(mockFetch).toHaveBeenCalledTimes(1);
376
377
  expect(result.output).toBe('Test output');
377
378
  expect(result.tokenUsage).toEqual({ total: 10, prompt: 5, completion: 5 });
378
379
  (0, cache_1.enableCache)();
@@ -384,10 +385,10 @@ describe('call provider apis', () => {
384
385
  content: 'Test output',
385
386
  })),
386
387
  };
387
- jest.mocked(node_fetch_1.default).mockResolvedValue(mockResponse);
388
+ mockFetch.mockResolvedValue(mockResponse);
388
389
  const provider = new llama_1.LlamaProvider('llama.cpp');
389
390
  const result = await provider.callApi('Test prompt');
390
- expect(node_fetch_1.default).toHaveBeenCalledTimes(1);
391
+ expect(mockFetch).toHaveBeenCalledTimes(1);
391
392
  expect(result.output).toBe('Test output');
392
393
  });
393
394
  it('OllamaCompletionProvider callApi', async () => {
@@ -404,10 +405,10 @@ describe('call provider apis', () => {
404
405
  {"model":"llama2:13b","created_at":"2023-08-08T21:50:35.117166Z","response":" blue","done":false}
405
406
  {"model":"llama2:13b","created_at":"2023-08-08T21:50:41.695299Z","done":true,"context":[1,29871,1,13,9314],"total_duration":10411943458,"load_duration":458333,"sample_count":217,"sample_duration":154566000,"prompt_eval_count":11,"prompt_eval_duration":3334582000,"eval_count":216,"eval_duration":6905134000}`),
406
407
  };
407
- jest.mocked(node_fetch_1.default).mockResolvedValue(mockResponse);
408
+ mockFetch.mockResolvedValue(mockResponse);
408
409
  const provider = new ollama_1.OllamaCompletionProvider('llama');
409
410
  const result = await provider.callApi('Test prompt');
410
- expect(node_fetch_1.default).toHaveBeenCalledTimes(1);
411
+ expect(mockFetch).toHaveBeenCalledTimes(1);
411
412
  expect(result.output).toBe('Great question! The sky appears blue');
412
413
  });
413
414
  it('OllamaChatProvider callApi', async () => {
@@ -422,10 +423,10 @@ describe('call provider apis', () => {
422
423
  {"model":"orca-mini","created_at":"2023-12-16T01:46:19.324309782Z","message":{"role":"assistant","content":".","images":null},"done":false}
423
424
  {"model":"orca-mini","created_at":"2023-12-16T01:46:19.337165395Z","done":true,"total_duration":1486443841,"load_duration":1280794143,"prompt_eval_count":35,"prompt_eval_duration":142384000,"eval_count":6,"eval_duration":61912000}`),
424
425
  };
425
- jest.mocked(node_fetch_1.default).mockResolvedValue(mockResponse);
426
+ mockFetch.mockResolvedValue(mockResponse);
426
427
  const provider = new ollama_1.OllamaChatProvider('llama');
427
428
  const result = await provider.callApi('Test prompt');
428
- expect(node_fetch_1.default).toHaveBeenCalledTimes(1);
429
+ expect(mockFetch).toHaveBeenCalledTimes(1);
429
430
  expect(result.output).toBe(' Because of Rayleigh scattering.');
430
431
  });
431
432
  it('WebhookProvider callApi', async () => {
@@ -435,10 +436,10 @@ describe('call provider apis', () => {
435
436
  output: 'Test output',
436
437
  })),
437
438
  };
438
- jest.mocked(node_fetch_1.default).mockResolvedValue(mockResponse);
439
+ mockFetch.mockResolvedValue(mockResponse);
439
440
  const provider = new webhook_1.WebhookProvider('http://example.com/webhook');
440
441
  const result = await provider.callApi('Test prompt');
441
- expect(node_fetch_1.default).toHaveBeenCalledTimes(1);
442
+ expect(mockFetch).toHaveBeenCalledTimes(1);
442
443
  expect(result.output).toBe('Test output');
443
444
  });
444
445
  describe.each([
@@ -450,10 +451,10 @@ describe('call provider apis', () => {
450
451
  ...defaultMockResponse,
451
452
  text: jest.fn().mockResolvedValue(JSON.stringify(mockedData)),
452
453
  };
453
- jest.mocked(node_fetch_1.default).mockResolvedValue(mockResponse);
454
+ mockFetch.mockResolvedValue(mockResponse);
454
455
  const provider = new huggingface_1.HuggingfaceTextGenerationProvider('gpt2');
455
456
  const result = await provider.callApi('Test prompt');
456
- expect(node_fetch_1.default).toHaveBeenCalledTimes(1);
457
+ expect(mockFetch).toHaveBeenCalledTimes(1);
457
458
  expect(result.output).toBe('Test output');
458
459
  });
459
460
  });
@@ -462,10 +463,10 @@ describe('call provider apis', () => {
462
463
  ...defaultMockResponse,
463
464
  text: jest.fn().mockResolvedValue(JSON.stringify([0.1, 0.2, 0.3, 0.4, 0.5])),
464
465
  };
465
- jest.mocked(node_fetch_1.default).mockResolvedValue(mockResponse);
466
+ mockFetch.mockResolvedValue(mockResponse);
466
467
  const provider = new huggingface_1.HuggingfaceFeatureExtractionProvider('distilbert-base-uncased');
467
468
  const result = await provider.callEmbeddingApi('Test text');
468
- expect(node_fetch_1.default).toHaveBeenCalledTimes(1);
469
+ expect(mockFetch).toHaveBeenCalledTimes(1);
469
470
  expect(result.embedding).toEqual([0.1, 0.2, 0.3, 0.4, 0.5]);
470
471
  });
471
472
  it('HuggingfaceTextClassificationProvider callClassificationApi', async () => {
@@ -485,10 +486,10 @@ describe('call provider apis', () => {
485
486
  ...defaultMockResponse,
486
487
  text: jest.fn().mockResolvedValue(JSON.stringify(mockClassification)),
487
488
  };
488
- jest.mocked(node_fetch_1.default).mockResolvedValue(mockResponse);
489
+ mockFetch.mockResolvedValue(mockResponse);
489
490
  const provider = new huggingface_1.HuggingfaceTextClassificationProvider('foo');
490
491
  const result = await provider.callClassificationApi('Test text');
491
- expect(node_fetch_1.default).toHaveBeenCalledTimes(1);
492
+ expect(mockFetch).toHaveBeenCalledTimes(1);
492
493
  expect(result.classification).toEqual({
493
494
  nothate: 0.9,
494
495
  hate: 0.1,
@@ -498,7 +499,6 @@ describe('call provider apis', () => {
498
499
  beforeAll(() => {
499
500
  (0, cache_1.enableCache)();
500
501
  });
501
- const fetchMock = jest.mocked(node_fetch_1.default);
502
502
  const cloudflareMinimumConfig = {
503
503
  accountId: 'testAccountId',
504
504
  apiKey: 'testApiKey',
@@ -530,13 +530,13 @@ describe('call provider apis', () => {
530
530
  text: jest.fn().mockResolvedValue(JSON.stringify(responsePayload)),
531
531
  ok: true,
532
532
  };
533
- fetchMock.mockResolvedValue(mockResponse);
533
+ mockFetch.mockResolvedValue(mockResponse);
534
534
  const result = await provider.callApi(PROMPT);
535
- expect(node_fetch_1.default).toHaveBeenCalledTimes(1);
535
+ expect(mockFetch).toHaveBeenCalledTimes(1);
536
536
  expect(result.output).toBe(responsePayload.result.response);
537
537
  expect(result.tokenUsage).toEqual(tokenUsageDefaultResponse);
538
538
  const resultFromCache = await provider.callApi(PROMPT);
539
- expect(node_fetch_1.default).toHaveBeenCalledTimes(1);
539
+ expect(mockFetch).toHaveBeenCalledTimes(1);
540
540
  expect(resultFromCache.output).toBe(responsePayload.result.response);
541
541
  expect(resultFromCache.tokenUsage).toEqual(tokenUsageDefaultResponse);
542
542
  });
@@ -560,13 +560,13 @@ describe('call provider apis', () => {
560
560
  text: jest.fn().mockResolvedValue(JSON.stringify(responsePayload)),
561
561
  ok: true,
562
562
  };
563
- fetchMock.mockResolvedValue(mockResponse);
563
+ mockFetch.mockResolvedValue(mockResponse);
564
564
  const result = await provider.callApi(PROMPT);
565
- expect(node_fetch_1.default).toHaveBeenCalledTimes(1);
565
+ expect(mockFetch).toHaveBeenCalledTimes(1);
566
566
  expect(result.output).toBe(responsePayload.result.response);
567
567
  expect(result.tokenUsage).toEqual(tokenUsageDefaultResponse);
568
568
  const resultFromCache = await provider.callApi(PROMPT);
569
- expect(node_fetch_1.default).toHaveBeenCalledTimes(2);
569
+ expect(mockFetch).toHaveBeenCalledTimes(2);
570
570
  expect(resultFromCache.output).toBe(responsePayload.result.response);
571
571
  expect(resultFromCache.tokenUsage).toEqual(tokenUsageDefaultResponse);
572
572
  }
@@ -589,7 +589,7 @@ describe('call provider apis', () => {
589
589
  text: jest.fn().mockResolvedValue(JSON.stringify(responsePayload)),
590
590
  ok: true,
591
591
  };
592
- fetchMock.mockResolvedValue(mockResponse);
592
+ mockFetch.mockResolvedValue(mockResponse);
593
593
  const result = await provider.callApi(PROMPT);
594
594
  expect(result.error).toContain(JSON.stringify(responsePayload.errors));
595
595
  });
@@ -625,19 +625,14 @@ describe('call provider apis', () => {
625
625
  text: jest.fn().mockResolvedValue(JSON.stringify(responsePayload)),
626
626
  ok: true,
627
627
  };
628
- fetchMock.mockResolvedValue(mockResponse);
628
+ mockFetch.mockResolvedValue(mockResponse);
629
629
  await cfProvider.callApi(PROMPT);
630
- expect(fetchMock).toHaveBeenCalledTimes(1);
631
- expect(fetchMock.mock.calls).toHaveLength(1);
632
- const [url, options] = fetchMock.mock.calls[0] ?? [undefined, {}];
633
- const { body, headers, method } = options;
634
- expect(url).toContain(cloudflareChatConfig.accountId);
635
- expect(method).toBe('POST');
636
- expect(headers && 'Authorization' in headers ? headers['Authorization'] : '').toContain(cloudflareChatConfig.apiKey);
637
- const hydratedBody = typeof body === 'string' ? JSON.parse(body) : body;
638
- expect(hydratedBody.prompt).toBe(PROMPT);
630
+ expect(mockFetch).toHaveBeenCalledTimes(1);
631
+ expect(mockFetch).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
632
+ body: expect.stringMatching(`"prompt":"${PROMPT}"`),
633
+ }));
639
634
  const { accountId: _accountId, apiKey: _apiKey, ...passThroughConfig } = cloudflareChatConfig;
640
- const { prompt: _prompt, ...bodyWithoutPrompt } = hydratedBody;
635
+ const { prompt: _prompt, ...bodyWithoutPrompt } = JSON.parse(jest.mocked(mockFetch).mock.calls[0][1].body);
641
636
  expect(bodyWithoutPrompt).toEqual(passThroughConfig);
642
637
  });
643
638
  });
@@ -659,9 +654,9 @@ describe('call provider apis', () => {
659
654
  text: jest.fn().mockResolvedValue(JSON.stringify(responsePayload)),
660
655
  ok: true,
661
656
  };
662
- fetchMock.mockResolvedValue(mockResponse);
657
+ mockFetch.mockResolvedValue(mockResponse);
663
658
  const result = await provider.callApi('Test chat prompt');
664
- expect(node_fetch_1.default).toHaveBeenCalledTimes(1);
659
+ expect(mockFetch).toHaveBeenCalledTimes(1);
665
660
  expect(result.output).toBe(responsePayload.result.response);
666
661
  expect(result.tokenUsage).toEqual(tokenUsageDefaultResponse);
667
662
  });
@@ -685,9 +680,9 @@ describe('call provider apis', () => {
685
680
  text: jest.fn().mockResolvedValue(JSON.stringify(responsePayload)),
686
681
  ok: true,
687
682
  };
688
- fetchMock.mockResolvedValue(mockResponse);
683
+ mockFetch.mockResolvedValue(mockResponse);
689
684
  const result = await provider.callEmbeddingApi('Create embeddings from this');
690
- expect(node_fetch_1.default).toHaveBeenCalledTimes(1);
685
+ expect(mockFetch).toHaveBeenCalledTimes(1);
691
686
  expect(result.embedding).toEqual(responsePayload.result.data[0]);
692
687
  expect(result.tokenUsage).toEqual(tokenUsageDefaultResponse);
693
688
  });
@@ -756,7 +751,7 @@ describe('call provider apis', () => {
756
751
  })),
757
752
  ok: true,
758
753
  };
759
- jest.mocked(node_fetch_1.default).mockResolvedValue(mockResponse);
754
+ mockFetch.mockResolvedValue(mockResponse);
760
755
  const provider = new openai_1.OpenAiChatCompletionProvider('gpt-4o-mini', {
761
756
  config: {
762
757
  tools: [
@@ -785,7 +780,7 @@ describe('call provider apis', () => {
785
780
  },
786
781
  });
787
782
  const result = await provider.callApi('Add 5 and 6');
788
- expect(node_fetch_1.default).toHaveBeenCalledTimes(1);
783
+ expect(mockFetch).toHaveBeenCalledTimes(1);
789
784
  expect(result.output).toBe('11');
790
785
  expect(result.tokenUsage).toEqual({ total: 10, prompt: 5, completion: 5 });
791
786
  });
@@ -818,7 +813,7 @@ describe('call provider apis', () => {
818
813
  })),
819
814
  ok: true,
820
815
  };
821
- jest.mocked(node_fetch_1.default).mockResolvedValue(mockResponse);
816
+ mockFetch.mockResolvedValue(mockResponse);
822
817
  const provider = new openai_1.OpenAiChatCompletionProvider('gpt-4o-mini', {
823
818
  config: {
824
819
  tools: [
@@ -866,7 +861,7 @@ describe('call provider apis', () => {
866
861
  },
867
862
  });
868
863
  const result = await provider.callApi('Add 5 and 6, then multiply 2 and 3');
869
- expect(node_fetch_1.default).toHaveBeenCalledTimes(1);
864
+ expect(mockFetch).toHaveBeenCalledTimes(1);
870
865
  expect(result.output).toBe('11\n6');
871
866
  expect(result.tokenUsage).toEqual({ total: 15, prompt: 7, completion: 8 });
872
867
  });
@@ -889,7 +884,7 @@ describe('call provider apis', () => {
889
884
  })),
890
885
  ok: true,
891
886
  };
892
- jest.mocked(node_fetch_1.default).mockResolvedValue(mockResponse);
887
+ mockFetch.mockResolvedValue(mockResponse);
893
888
  const provider = new openai_1.OpenAiChatCompletionProvider('gpt-4o-mini', {
894
889
  config: {
895
890
  tools: [
@@ -913,17 +908,97 @@ describe('call provider apis', () => {
913
908
  },
914
909
  });
915
910
  const result = await provider.callApi('Call the error function');
916
- expect(node_fetch_1.default).toHaveBeenCalledTimes(1);
911
+ expect(mockFetch).toHaveBeenCalledTimes(1);
917
912
  expect(result.output).toEqual({ arguments: '{}', name: 'errorFunction' });
918
913
  expect(result.tokenUsage).toEqual({ total: 5, prompt: 2, completion: 3 });
919
914
  });
920
915
  });
916
+ describe('OpenAiChatCompletionProvider response_format', () => {
917
+ it('should prioritize response_format from prompt config over provider config', async () => {
918
+ const providerResponseFormat = {
919
+ type: 'json_object',
920
+ };
921
+ const promptResponseFormat = {
922
+ type: 'json_schema',
923
+ json_schema: {
924
+ name: 'test_schema',
925
+ strict: true,
926
+ schema: {
927
+ type: 'object',
928
+ properties: { key2: { type: 'string' } },
929
+ additionalProperties: false,
930
+ },
931
+ },
932
+ };
933
+ const provider = new openai_1.OpenAiChatCompletionProvider('gpt-4o-mini', {
934
+ config: {
935
+ response_format: providerResponseFormat,
936
+ },
937
+ });
938
+ const mockResponse = {
939
+ ...defaultMockResponse,
940
+ text: jest.fn().mockResolvedValue(JSON.stringify({
941
+ choices: [{ message: { content: '{"key2": "value2"}' } }],
942
+ usage: { total_tokens: 10, prompt_tokens: 5, completion_tokens: 5 },
943
+ })),
944
+ };
945
+ jest.mocked(fetch).mockResolvedValue(mockResponse);
946
+ const result = await provider.callApi('Test prompt', {
947
+ vars: {},
948
+ prompt: {
949
+ raw: 'Test prompt',
950
+ label: 'Test prompt',
951
+ config: {
952
+ response_format: promptResponseFormat,
953
+ },
954
+ },
955
+ });
956
+ expect(fetch).toHaveBeenCalledTimes(1);
957
+ const fetchArgs = jest.mocked(fetch).mock.calls[0];
958
+ const requestBody = JSON.parse(fetchArgs[1]?.body);
959
+ expect(requestBody.response_format).toEqual(promptResponseFormat);
960
+ expect(result.output).toEqual({ key2: 'value2' });
961
+ expect(result.tokenUsage).toEqual({ total: 10, prompt: 5, completion: 5 });
962
+ });
963
+ it('should use provider config response_format when prompt config is not provided', async () => {
964
+ const providerResponseFormat = {
965
+ type: 'json_object',
966
+ };
967
+ const provider = new openai_1.OpenAiChatCompletionProvider('gpt-4o-mini', {
968
+ config: {
969
+ response_format: providerResponseFormat,
970
+ },
971
+ });
972
+ const mockResponse = {
973
+ ...defaultMockResponse,
974
+ text: jest.fn().mockResolvedValue(JSON.stringify({
975
+ choices: [{ message: { content: '{"key1": "value1"}' } }],
976
+ usage: { total_tokens: 10, prompt_tokens: 5, completion_tokens: 5 },
977
+ })),
978
+ };
979
+ jest.mocked(fetch).mockResolvedValue(mockResponse);
980
+ const result = await provider.callApi('Test prompt', {
981
+ vars: {},
982
+ prompt: {
983
+ raw: 'Test prompt',
984
+ label: 'Test prompt',
985
+ },
986
+ });
987
+ expect(fetch).toHaveBeenCalledTimes(1);
988
+ const fetchArgs = jest.mocked(fetch).mock.calls[0];
989
+ const requestBody = JSON.parse(fetchArgs[1]?.body);
990
+ expect(requestBody.response_format).toEqual(providerResponseFormat);
991
+ expect(result.output).toBe('{"key1": "value1"}');
992
+ expect(result.tokenUsage).toEqual({ total: 10, prompt: 5, completion: 5 });
993
+ });
994
+ });
921
995
  });
922
996
  describe('loadApiProvider', () => {
923
997
  it('loadApiProvider with yaml filepath', async () => {
924
- const mockYamlContent = `id: 'openai:gpt-4'
925
- config:
926
- key: 'value'`;
998
+ const mockYamlContent = (0, dedent_1.default) `
999
+ id: 'openai:gpt-4'
1000
+ config:
1001
+ key: 'value'`;
927
1002
  jest.mocked(fs.readFileSync).mockReturnValueOnce(mockYamlContent);
928
1003
  const provider = await (0, providers_1.loadApiProvider)('file://path/to/mock-provider-file.yaml');
929
1004
  expect(provider.id()).toBe('openai:gpt-4');
@@ -1040,6 +1115,17 @@ config:
1040
1115
  // Intentionally openai, because it's just a wrapper around openai
1041
1116
  expect(provider.id()).toBe('mistralai/mistral-medium');
1042
1117
  });
1118
+ it('loadApiProvider with github', async () => {
1119
+ const provider = await (0, providers_1.loadApiProvider)('github:gpt-4o-mini');
1120
+ expect(provider).toBeInstanceOf(openai_1.OpenAiChatCompletionProvider);
1121
+ // Intentionally openai, because it's just a wrapper around openai
1122
+ expect(provider.id()).toBe('gpt-4o-mini');
1123
+ });
1124
+ it('loadApiProvider with togetherai', async () => {
1125
+ const provider = await (0, providers_1.loadApiProvider)('togetherai:chat:meta/meta-llama/Meta-Llama-3-8B-Instruct');
1126
+ expect(provider).toBeInstanceOf(openai_1.OpenAiChatCompletionProvider);
1127
+ expect(provider.id()).toBe('meta/meta-llama/Meta-Llama-3-8B-Instruct');
1128
+ });
1043
1129
  it('loadApiProvider with voyage', async () => {
1044
1130
  const provider = await (0, providers_1.loadApiProvider)('voyage:voyage-2');
1045
1131
  expect(provider).toBeInstanceOf(voyage_1.VoyageEmbeddingProvider);
@@ -1287,5 +1373,12 @@ config:
1287
1373
  const provider = await (0, providers_1.loadApiProvider)('openai:chat:gpt-4o', { options: providerOptions });
1288
1374
  expect(provider.label).toBe('foo');
1289
1375
  });
1376
+ it('loadApiProvider with xai', async () => {
1377
+ const provider = await (0, providers_1.loadApiProvider)('xai:grok-2');
1378
+ expect(provider).toBeInstanceOf(openai_1.OpenAiChatCompletionProvider);
1379
+ expect(provider.id()).toBe('grok-2');
1380
+ expect(provider.config.apiBaseUrl).toBe('https://api.x.ai/v1');
1381
+ expect(provider.config.apiKeyEnvar).toBe('XAI_API_KEY');
1382
+ });
1290
1383
  });
1291
- //# sourceMappingURL=providers.test.js.map
1384
+ //# sourceMappingURL=index.test.js.map