@langwatch/mcp-server 2.0.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (430) hide show
  1. package/.gitignore +7 -0
  2. package/.npmignore +41 -0
  3. package/CHANGELOG.md +280 -200
  4. package/CONTRIBUTING.md +10 -0
  5. package/README.md +82 -52
  6. package/dist/add-dashboard-widget-4ZC5UN73.js +50 -0
  7. package/dist/add-dashboard-widget-ACC6QYBG.js +49 -0
  8. package/dist/archive-project-KWFM3I5Z.js +19 -0
  9. package/dist/{archive-project-4EQGLBJJ.js → archive-project-SPVHXK6A.js} +4 -4
  10. package/dist/archive-run-plan-65QN3XRX.js +16 -0
  11. package/dist/archive-run-plan-Z4SYE6BP.js +15 -0
  12. package/dist/{archive-scenario-W6BXYDZ3.js → archive-scenario-A6QV5LOW.js} +4 -4
  13. package/dist/archive-scenario-FXEYQNEH.js +19 -0
  14. package/dist/archive-test-suite-5ADQ3KPQ.js +15 -0
  15. package/dist/archive-test-suite-NKZDZY3D.js +16 -0
  16. package/dist/assign-prompt-tag-5IUZXJ2T.js +23 -0
  17. package/dist/{assign-prompt-tag-VLXUWEKU.js → assign-prompt-tag-HBZLBIFD.js} +8 -4
  18. package/dist/{chunk-CDYQOY5U.js → chunk-3OCG3QPU.js} +7 -10
  19. package/dist/chunk-3YLN3ATJ.js +241 -0
  20. package/dist/chunk-5FNCQRCX.js +91 -0
  21. package/dist/chunk-6YZUOD34.js +55 -0
  22. package/dist/{chunk-WVI5CJ6S.js → chunk-7AQLPVFL.js} +2 -2
  23. package/dist/chunk-7VNSRCXO.js +129 -0
  24. package/dist/{chunk-7RHG56OH.js → chunk-B4J3PJLX.js} +11 -10
  25. package/dist/{chunk-ZXKLPC2E.js → chunk-BIIKE3EI.js} +1 -1
  26. package/dist/{chunk-37SMPMQS.js → chunk-DMM3JQ42.js} +7 -2
  27. package/dist/{chunk-NUFPTHKU.js → chunk-FOKVY3BK.js} +1 -1
  28. package/dist/{chunk-WT4PO4A3.js → chunk-H6WGMG2T.js} +10 -7
  29. package/dist/{chunk-TOXJQDIZ.js → chunk-HGELNIVY.js} +135 -51
  30. package/dist/{chunk-UJPXFA26.js → chunk-HHMNZAPD.js} +101 -74
  31. package/dist/{chunk-J42FWRJ2.js → chunk-I7ATIZED.js} +7 -7
  32. package/dist/{chunk-AQJO2EI5.js → chunk-ILZDO25L.js} +7 -10
  33. package/dist/{chunk-4QC7SA2L.js → chunk-J7PQKBLD.js} +884 -559
  34. package/dist/{chunk-YX3A3CFM.js → chunk-JRJPH75H.js} +7 -13
  35. package/dist/chunk-K2I7Z3LZ.js +28 -0
  36. package/dist/{chunk-5CCZFUXS.js → chunk-NKMTIHIJ.js} +6 -9
  37. package/dist/chunk-O7EMWEVJ.js +44 -0
  38. package/dist/chunk-PTDR56Z3.js +37 -0
  39. package/dist/chunk-RABYBFX5.js +43 -0
  40. package/dist/chunk-SUPUUC4W.js +64 -0
  41. package/dist/{chunk-SFB4MU6H.js → chunk-SXFC3FNH.js} +4 -4
  42. package/dist/chunk-U24EACC4.js +67 -0
  43. package/dist/chunk-UNJM3BIL.js +21 -0
  44. package/dist/{chunk-ZWIL4EFL.js → chunk-UTJCWXPZ.js} +4 -4
  45. package/dist/chunk-UWLE5T2F.js +312 -0
  46. package/dist/chunk-VMWJD732.js +57 -0
  47. package/dist/chunk-XUIJYNRJ.js +15 -0
  48. package/dist/chunk-Y34DHR5K.js +67 -0
  49. package/dist/chunk-YCARO42Z.js +516 -0
  50. package/dist/config-EAKW6F26.js +16 -0
  51. package/dist/config.cjs +109 -0
  52. package/dist/config.js +5 -4
  53. package/dist/{create-agent-7XHO6UIS.js → create-agent-AYZ3LB3V.js} +4 -4
  54. package/dist/create-agent-S5ZBCEFT.js +23 -0
  55. package/dist/create-annotation-LHNCLHYP.js +29 -0
  56. package/dist/{create-annotation-YQXRQC6A.js → create-annotation-VUSXULQK.js} +10 -5
  57. package/dist/{create-api-key-YUS36KBU.js → create-api-key-NNYKARMG.js} +5 -7
  58. package/dist/create-api-key-T4KSNPKB.js +24 -0
  59. package/dist/create-dashboard-DHVFMEU4.js +18 -0
  60. package/dist/{create-dashboard-4Z5JO5LB.js → create-dashboard-WTKKS5Z6.js} +4 -4
  61. package/dist/{create-dataset-E6NMSVX7.js → create-dataset-2MC4SD4O.js} +6 -6
  62. package/dist/create-dataset-LUP5PVDM.js +22 -0
  63. package/dist/create-dataset-records-NSKBZP3G.js +20 -0
  64. package/dist/{create-dataset-records-SKHPRD2K.js → create-dataset-records-W4GLN2FV.js} +5 -7
  65. package/dist/{create-evaluator-JXF5PF33.js → create-evaluator-643G6LXL.js} +4 -4
  66. package/dist/create-evaluator-HMTYO5SS.js +27 -0
  67. package/dist/create-mcp-server.cjs +9513 -0
  68. package/dist/create-mcp-server.js +2647 -5
  69. package/dist/create-project-6N7PIYRY.js +44 -0
  70. package/dist/{create-project-CS2CB57Y.js → create-project-KAIC46UY.js} +4 -4
  71. package/dist/{create-prompt-F5RMX3L3.js → create-prompt-E67LXIYT.js} +5 -7
  72. package/dist/create-prompt-PKJ7EDRR.js +37 -0
  73. package/dist/create-prompt-tag-4YO3FSJ3.js +17 -0
  74. package/dist/{create-prompt-tag-GMRWTEFR.js → create-prompt-tag-OPQUEXWB.js} +3 -3
  75. package/dist/create-scenario-5PJBMAXO.js +33 -0
  76. package/dist/{create-scenario-JDR2VB2H.js → create-scenario-UEM77OE7.js} +11 -4
  77. package/dist/create-test-suite-4IPXVSFQ.js +37 -0
  78. package/dist/create-test-suite-SZEPVXSE.js +36 -0
  79. package/dist/create-trigger-5HZSCRAN.js +49 -0
  80. package/dist/create-trigger-PRELMT6J.js +48 -0
  81. package/dist/delete-agent-JUIZWAXG.js +18 -0
  82. package/dist/{delete-agent-O3EEH4S5.js → delete-agent-QMEK3XHK.js} +4 -4
  83. package/dist/delete-annotation-HY3O2OGR.js +17 -0
  84. package/dist/{delete-annotation-XP6FQM7A.js → delete-annotation-VKIQWUYW.js} +4 -4
  85. package/dist/delete-dashboard-76N66XXL.js +18 -0
  86. package/dist/{delete-dashboard-RFUNYCNP.js → delete-dashboard-JVIVHNJM.js} +4 -4
  87. package/dist/delete-dataset-HQCR66MG.js +18 -0
  88. package/dist/{delete-dataset-3MJFRDLP.js → delete-dataset-WKRUW4FP.js} +5 -7
  89. package/dist/{delete-dataset-records-WPMU5GL5.js → delete-dataset-records-C2IQFFVQ.js} +5 -7
  90. package/dist/delete-dataset-records-SDUHQLLM.js +19 -0
  91. package/dist/delete-evaluator-4SNSCLEE.js +16 -0
  92. package/dist/delete-evaluator-QP3QHTLN.js +15 -0
  93. package/dist/delete-prompt-tag-NZ4JQMYG.js +17 -0
  94. package/dist/{delete-prompt-tag-KNMZVSPB.js → delete-prompt-tag-YYQ4VMAD.js} +3 -3
  95. package/dist/{delete-workflow-3NUXO46U.js → delete-workflow-5J46T73T.js} +4 -4
  96. package/dist/delete-workflow-JSWABL5F.js +17 -0
  97. package/dist/discover-evaluator-schema-UHWA5HVL.js +120 -0
  98. package/dist/discover-evaluator-schema-XKCLLCB3.js +118 -0
  99. package/dist/discover-scenario-schema-NOJY6S7E.js +137 -0
  100. package/dist/discover-scenario-schema-OOFIQKOG.js +139 -0
  101. package/dist/{discover-schema-L6QDPON3.js → discover-schema-55YJBFGQ.js} +181 -186
  102. package/dist/discover-schema-A33SLMXW.js +442 -0
  103. package/dist/get-agent-LJQX7OF4.js +69 -0
  104. package/dist/get-agent-OTIYUFZA.js +70 -0
  105. package/dist/get-analytics-DCS72353.js +80 -0
  106. package/dist/get-analytics-IQZKJHLW.js +79 -0
  107. package/dist/get-dashboard-5NYJEIX2.js +29 -0
  108. package/dist/{get-dashboard-KHBEGZGL.js → get-dashboard-QMTYDQAZ.js} +4 -4
  109. package/dist/get-dataset-ALSP7RTX.js +64 -0
  110. package/dist/get-dataset-X4B5JDG2.js +63 -0
  111. package/dist/{get-evaluator-ADMKVWYZ.js → get-evaluator-ISMC4LLI.js} +4 -4
  112. package/dist/get-evaluator-XEUZGZCH.js +47 -0
  113. package/dist/{get-project-RAK7URQJ.js → get-project-5VKROSDH.js} +4 -4
  114. package/dist/get-project-RM6FRCBK.js +26 -0
  115. package/dist/get-prompt-OWXJZHQQ.js +95 -0
  116. package/dist/get-prompt-W52DY36E.js +94 -0
  117. package/dist/get-run-plan-BE3M2AUX.js +59 -0
  118. package/dist/get-run-plan-RUXQ6PAX.js +58 -0
  119. package/dist/get-scenario-RNM7BAX2.js +37 -0
  120. package/dist/{get-scenario-ZTAJJL5T.js → get-scenario-YM4ODWW6.js} +8 -4
  121. package/dist/get-simulation-run-6GIATQE5.js +69 -0
  122. package/dist/{get-simulation-run-T2ZQWYH2.js → get-simulation-run-LCFSMPGQ.js} +33 -20
  123. package/dist/get-test-suite-GC2O7YH6.js +49 -0
  124. package/dist/get-test-suite-P5LJ6VLF.js +48 -0
  125. package/dist/get-trace-KBRVV4NN.js +45 -0
  126. package/dist/{get-trace-K7U234Q4.js → get-trace-SEF3FMR5.js} +11 -13
  127. package/dist/get-workflow-7PVED7JE.js +25 -0
  128. package/dist/{get-workflow-L5L2PSK3.js → get-workflow-YXULW4GC.js} +4 -4
  129. package/dist/{http-security-EU3CHTY7.js → http-security-DNLBNQZL.js} +2 -2
  130. package/dist/{http-server-YXHFPPGA.js → http-server-IR4QOS43.js} +4071 -342
  131. package/dist/index.js +60221 -38077
  132. package/dist/langwatch-api-annotations-6SA4OB4C.js +17 -0
  133. package/dist/{langwatch-api-annotations-FDAS6NQ7.js → langwatch-api-annotations-TBHLCQ5R.js} +4 -4
  134. package/dist/langwatch-api-dashboards-6EO2VVZW.js +17 -0
  135. package/dist/{langwatch-api-dashboards-JTVCS7ZJ.js → langwatch-api-dashboards-NHU5BZD7.js} +4 -4
  136. package/dist/langwatch-api-monitors-CBF3FGIM.js +47 -0
  137. package/dist/{langwatch-api-monitors-3J7UIQME.js → langwatch-api-monitors-YNWA2M5Y.js} +11 -16
  138. package/dist/langwatch-api-secrets-ADTOJELP.js +56 -0
  139. package/dist/langwatch-api-secrets-RNFO4LF2.js +55 -0
  140. package/dist/langwatch-api-triggers-KQDQC6L5.js +22 -0
  141. package/dist/langwatch-api-triggers-QS7HDIVW.js +23 -0
  142. package/dist/{langwatch-api-workflows-NBJX5KOG.js → langwatch-api-workflows-OKC4FXIF.js} +4 -4
  143. package/dist/langwatch-api-workflows-XGJE6SR5.js +15 -0
  144. package/dist/list-agents-HVYWEQMI.js +43 -0
  145. package/dist/list-agents-RBAOCF53.js +42 -0
  146. package/dist/list-annotations-HJH4NBLD.js +38 -0
  147. package/dist/{list-annotations-ZTVP4EEL.js → list-annotations-J4UAHSUN.js} +10 -5
  148. package/dist/{list-api-keys-CWD4UQT5.js → list-api-keys-7UTJRZDG.js} +10 -5
  149. package/dist/list-api-keys-A2PMV435.js +42 -0
  150. package/dist/list-dashboard-boards-OPWROHMG.js +33 -0
  151. package/dist/list-dashboard-boards-U2GJ7GC5.js +34 -0
  152. package/dist/{list-dashboards-PWG6P6KR.js → list-dashboards-ROSYFLDQ.js} +4 -4
  153. package/dist/list-dashboards-RQ635ZU7.js +32 -0
  154. package/dist/{list-dataset-records-IOE7LQXS.js → list-dataset-records-M5TKA6LK.js} +14 -10
  155. package/dist/list-dataset-records-WFM7F33C.js +43 -0
  156. package/dist/{list-datasets-ZT4JYUDT.js → list-datasets-B5X4P7BQ.js} +9 -13
  157. package/dist/list-datasets-THUKQHPX.js +56 -0
  158. package/dist/{list-evaluators-SJHC7VBH.js → list-evaluators-MYH2OVCI.js} +5 -7
  159. package/dist/list-evaluators-NLVWF6K7.js +32 -0
  160. package/dist/{list-model-providers-PPD2WPD2.js → list-model-providers-3JUGP4YI.js} +4 -4
  161. package/dist/list-model-providers-H3XKORFO.js +35 -0
  162. package/dist/{list-projects-K7QAIX2I.js → list-projects-6EJ5YYEW.js} +5 -7
  163. package/dist/list-projects-YNNSRMLC.js +40 -0
  164. package/dist/{list-prompt-tags-FOO6TNHB.js → list-prompt-tags-NVFQO6WX.js} +3 -3
  165. package/dist/list-prompt-tags-XUQTTAH4.js +23 -0
  166. package/dist/{list-prompts-SC2HAUFG.js → list-prompts-HSIMMHTF.js} +4 -6
  167. package/dist/list-prompts-IRI6AIXO.js +30 -0
  168. package/dist/list-run-plans-PX2XI6EK.js +46 -0
  169. package/dist/list-run-plans-QALLCN2K.js +45 -0
  170. package/dist/list-scenarios-QZRPVHS4.js +46 -0
  171. package/dist/list-scenarios-SSJQEMJP.js +45 -0
  172. package/dist/list-simulation-runs-KNOLGMDV.js +53 -0
  173. package/dist/{list-simulation-runs-KF5THG5H.js → list-simulation-runs-OEADLLQR.js} +19 -9
  174. package/dist/list-test-suites-ANAQBLDG.js +34 -0
  175. package/dist/list-test-suites-N4WVLBKK.js +35 -0
  176. package/dist/list-trigger-fires-JV3WFYYG.js +19 -0
  177. package/dist/list-trigger-fires-WTW4DVIW.js +20 -0
  178. package/dist/list-triggers-SQNIG35Q.js +45 -0
  179. package/dist/list-triggers-V4Y356AK.js +46 -0
  180. package/dist/{list-workflows-QSJWURCK.js → list-workflows-IMSX7SXU.js} +5 -7
  181. package/dist/list-workflows-ZHTX5LCL.js +33 -0
  182. package/dist/{rename-prompt-tag-EKWU5QF3.js → rename-prompt-tag-IQI7MHOI.js} +3 -3
  183. package/dist/rename-prompt-tag-PA2BRIE6.js +18 -0
  184. package/dist/rename-test-suite-4J7UX5S2.js +21 -0
  185. package/dist/rename-test-suite-NNVLMLKY.js +20 -0
  186. package/dist/report-issue-AS34ZMJF.js +898 -0
  187. package/dist/report-issue-DCZFLGDO.js +899 -0
  188. package/dist/rerun-run-plan-TG2V4WM4.js +22 -0
  189. package/dist/rerun-run-plan-ZI5OY3VA.js +21 -0
  190. package/dist/revoke-api-key-3J3ZA4UB.js +15 -0
  191. package/dist/{revoke-api-key-FTRTZMOF.js → revoke-api-key-SFMEFWJC.js} +4 -4
  192. package/dist/run-agent-W4VJP72Z.js +75 -0
  193. package/dist/run-agent-YNV6ZHW4.js +74 -0
  194. package/dist/run-plan-6C77GWG4.js +38 -0
  195. package/dist/run-plan-PAARQSI4.js +39 -0
  196. package/dist/run-query-KJDH544C.js +47 -0
  197. package/dist/run-query-T4QW2Z5O.js +46 -0
  198. package/dist/run-test-suite-SQJELEZX.js +26 -0
  199. package/dist/run-test-suite-STB6NUJM.js +25 -0
  200. package/dist/{run-workflow-QPXC627O.js → run-workflow-D6PQNBI6.js} +4 -4
  201. package/dist/{run-agent-6SM4XNA7.js → run-workflow-SP32SO5M.js} +10 -11
  202. package/dist/search-traces-HCBGOG6R.js +170 -0
  203. package/dist/search-traces-HSTQ6WTQ.js +171 -0
  204. package/dist/{set-model-provider-3WKT63ZN.js → set-model-provider-GF7NXUJA.js} +4 -4
  205. package/dist/set-model-provider-KDQ7C4EZ.js +33 -0
  206. package/dist/{update-agent-SMAEHLXH.js → update-agent-DWG43T2P.js} +4 -4
  207. package/dist/update-agent-MXNOBS4H.js +20 -0
  208. package/dist/update-dashboard-widget-CJKJLCDY.js +71 -0
  209. package/dist/update-dashboard-widget-CYQDS2NR.js +70 -0
  210. package/dist/update-dataset-DQH3OHOU.js +22 -0
  211. package/dist/{update-dataset-BDUK7TUO.js → update-dataset-SQZ6T4WX.js} +6 -6
  212. package/dist/{update-dataset-record-4ZSDRBSW.js → update-dataset-record-3AT4IPBC.js} +4 -4
  213. package/dist/update-dataset-record-7PLDGTMR.js +19 -0
  214. package/dist/update-evaluator-4LFTKFPT.js +24 -0
  215. package/dist/{update-evaluator-LS6TIBY7.js → update-evaluator-IGTX6PX4.js} +4 -4
  216. package/dist/{update-project-LKVYXENH.js → update-project-PLJIOZS6.js} +4 -4
  217. package/dist/update-project-QVHSJRUP.js +24 -0
  218. package/dist/update-prompt-GDKRYJI3.js +140 -0
  219. package/dist/update-prompt-MY263DYF.js +141 -0
  220. package/dist/update-scenario-7KA3JDXA.js +34 -0
  221. package/dist/{update-scenario-NEXCAQI7.js → update-scenario-MOHRQKAQ.js} +11 -4
  222. package/package.json +39 -44
  223. package/pyproject.toml +8 -8
  224. package/src/config.d.ts +4 -0
  225. package/src/config.ts +20 -29
  226. package/src/create-mcp-server.ts +1021 -596
  227. package/src/documentation-fetch.ts +21 -20
  228. package/src/http-security.ts +166 -135
  229. package/src/http-server.ts +189 -224
  230. package/src/index.ts +14 -16
  231. package/src/langwatch-api-agents.ts +202 -21
  232. package/src/langwatch-api-annotations.ts +11 -12
  233. package/src/langwatch-api-api-keys.ts +8 -9
  234. package/src/langwatch-api-boards.ts +46 -0
  235. package/src/langwatch-api-dashboard-widgets.ts +112 -0
  236. package/src/langwatch-api-dashboards.ts +13 -10
  237. package/src/langwatch-api-datasets.ts +98 -32
  238. package/src/langwatch-api-evaluators.ts +13 -19
  239. package/src/langwatch-api-model-providers.ts +4 -4
  240. package/src/langwatch-api-monitors.ts +14 -18
  241. package/src/langwatch-api-projects.ts +27 -9
  242. package/src/langwatch-api-query.ts +114 -0
  243. package/src/langwatch-api-run-plans.ts +140 -0
  244. package/src/langwatch-api-scenarios.ts +17 -10
  245. package/src/langwatch-api-secrets.ts +31 -24
  246. package/src/langwatch-api-simulation-runs.ts +10 -7
  247. package/src/langwatch-api-test-suites.ts +116 -0
  248. package/src/langwatch-api-triggers.ts +96 -34
  249. package/src/langwatch-api-workflows.ts +9 -9
  250. package/src/langwatch-api.ts +143 -109
  251. package/src/public-http-request.ts +21 -12
  252. package/src/schemas/analytics-metrics.ts +3 -15
  253. package/src/schemas/create-dataset.ts +3 -4
  254. package/src/schemas/run-plan.ts +76 -0
  255. package/src/schemas/suite-fields.ts +132 -0
  256. package/src/schemas/triggers.ts +365 -0
  257. package/src/tools/add-dashboard-widget.ts +63 -0
  258. package/src/tools/archive-project.ts +2 -4
  259. package/src/tools/archive-run-plan.ts +10 -0
  260. package/src/tools/archive-scenario.ts +2 -4
  261. package/src/tools/archive-test-suite.ts +10 -0
  262. package/src/tools/assign-prompt-tag.ts +6 -2
  263. package/src/tools/create-agent.ts +1 -1
  264. package/src/tools/create-annotation.ts +7 -2
  265. package/src/tools/create-api-key.ts +4 -6
  266. package/src/tools/create-dashboard.ts +1 -1
  267. package/src/tools/create-dataset-records.ts +4 -8
  268. package/src/tools/create-dataset.ts +5 -7
  269. package/src/tools/create-evaluator.ts +3 -5
  270. package/src/tools/create-project.ts +2 -2
  271. package/src/tools/create-prompt-tag.ts +2 -4
  272. package/src/tools/create-prompt.ts +9 -18
  273. package/src/tools/create-scenario.ts +11 -5
  274. package/src/tools/create-test-suite.ts +38 -0
  275. package/src/tools/create-trigger.ts +55 -0
  276. package/src/tools/dashboard-exists.ts +25 -0
  277. package/src/tools/dashboard-widget-queries.ts +32 -0
  278. package/src/tools/delete-agent.ts +1 -1
  279. package/src/tools/delete-annotation.ts +1 -1
  280. package/src/tools/delete-dashboard.ts +1 -1
  281. package/src/tools/delete-dataset-records.ts +4 -8
  282. package/src/tools/delete-dataset.ts +3 -7
  283. package/src/tools/delete-evaluator.ts +4 -6
  284. package/src/tools/delete-prompt-tag.ts +2 -4
  285. package/src/tools/delete-workflow.ts +1 -1
  286. package/src/tools/discover-evaluator-schema.ts +34 -25
  287. package/src/tools/discover-scenario-schema.ts +86 -12
  288. package/src/tools/discover-schema.ts +149 -27
  289. package/src/tools/experiment-run-status.ts +2 -8
  290. package/src/tools/format-dataset-mutation.ts +5 -10
  291. package/src/tools/format-run-plan.ts +54 -0
  292. package/src/tools/format-scenario.ts +12 -0
  293. package/src/tools/format-suite-details.ts +90 -0
  294. package/src/tools/get-agent.ts +54 -3
  295. package/src/tools/get-analytics.ts +52 -46
  296. package/src/tools/get-dashboard.ts +1 -1
  297. package/src/tools/get-dataset.ts +34 -16
  298. package/src/tools/get-evaluator.ts +4 -11
  299. package/src/tools/get-experiment-results.ts +219 -186
  300. package/src/tools/get-project.ts +2 -4
  301. package/src/tools/get-prompt.ts +100 -37
  302. package/src/tools/get-run-plan.ts +60 -0
  303. package/src/tools/get-scenario.ts +6 -5
  304. package/src/tools/get-simulation-run.ts +32 -20
  305. package/src/tools/get-test-suite.ts +46 -0
  306. package/src/tools/get-trace.ts +16 -17
  307. package/src/tools/get-workflow.ts +1 -1
  308. package/src/tools/list-agents.ts +20 -3
  309. package/src/tools/list-annotations.ts +8 -5
  310. package/src/tools/list-api-keys.ts +7 -2
  311. package/src/tools/list-dashboard-boards.ts +28 -0
  312. package/src/tools/list-dashboards.ts +1 -1
  313. package/src/tools/list-dataset-records.ts +8 -6
  314. package/src/tools/list-datasets.ts +12 -23
  315. package/src/tools/list-evaluators.ts +4 -8
  316. package/src/tools/list-experiment-runs.ts +5 -9
  317. package/src/tools/list-experiments.ts +5 -11
  318. package/src/tools/list-model-providers.ts +3 -5
  319. package/src/tools/list-projects.ts +2 -4
  320. package/src/tools/list-prompt-tags.ts +3 -3
  321. package/src/tools/list-prompts.ts +4 -8
  322. package/src/tools/list-run-plans.ts +47 -0
  323. package/src/tools/list-scenarios.ts +26 -17
  324. package/src/tools/list-simulation-runs.ts +13 -5
  325. package/src/tools/list-test-suites.ts +35 -0
  326. package/src/tools/list-trigger-fires.ts +17 -0
  327. package/src/tools/list-triggers.ts +39 -0
  328. package/src/tools/list-workflows.ts +2 -4
  329. package/src/tools/rename-prompt-tag.ts +1 -1
  330. package/src/tools/rename-test-suite.ts +15 -0
  331. package/src/tools/report-issue.ts +5 -9
  332. package/src/tools/rerun-run-plan.ts +18 -0
  333. package/src/tools/revoke-api-key.ts +2 -4
  334. package/src/tools/run-agent.ts +65 -14
  335. package/src/tools/run-experiment.ts +36 -37
  336. package/src/tools/run-plan.ts +46 -0
  337. package/src/tools/run-query.ts +47 -0
  338. package/src/tools/run-test-suite.ts +27 -0
  339. package/src/tools/run-workflow.ts +2 -5
  340. package/src/tools/search-traces.ts +161 -47
  341. package/src/tools/set-model-provider.ts +4 -6
  342. package/src/tools/test-agent.ts +18 -0
  343. package/src/tools/update-agent.ts +1 -1
  344. package/src/tools/update-dashboard-widget.ts +97 -0
  345. package/src/tools/update-dataset-record.ts +1 -1
  346. package/src/tools/update-dataset.ts +5 -7
  347. package/src/tools/update-evaluator.ts +3 -5
  348. package/src/tools/update-project.ts +1 -1
  349. package/src/tools/update-prompt.ts +185 -15
  350. package/src/tools/update-scenario.ts +11 -5
  351. package/src/tools/update-test-suite.ts +40 -0
  352. package/src/utils/date-parsing.ts +1 -1
  353. package/src/utils/escape-markdown.ts +3 -8
  354. package/src/utils/format-evaluations.ts +6 -6
  355. package/src/utils/markdown-table.ts +58 -0
  356. package/src/utils/trace-id-shape.ts +20 -0
  357. package/tsconfig.app.json +24 -0
  358. package/tsconfig.json +19 -12
  359. package/uv.lock +416 -296
  360. package/vitest.integration.config.js +10 -0
  361. package/vitest.scenario.config.js +9 -0
  362. package/.eslintrc.cjs +0 -36
  363. package/dist/archive-suite-4T6BSRS7.js +0 -16
  364. package/dist/chunk-77BNWQ3U.js +0 -86
  365. package/dist/chunk-A2LEVYQ5.js +0 -217
  366. package/dist/chunk-TJCXFNDT.js +0 -24
  367. package/dist/chunk-YZLYHLLI.js +0 -48
  368. package/dist/config.d.ts +0 -17
  369. package/dist/create-mcp-server.d.ts +0 -10
  370. package/dist/create-suite-LZS6QIAF.js +0 -39
  371. package/dist/delete-evaluator-33SP2JFX.js +0 -16
  372. package/dist/discover-evaluator-schema-XTAD4X7D.js +0 -2191
  373. package/dist/discover-scenario-schema-FE64QK2D.js +0 -67
  374. package/dist/get-agent-Y7MWZ65F.js +0 -29
  375. package/dist/get-analytics-TETCSOK6.js +0 -73
  376. package/dist/get-dataset-RCMU5VAH.js +0 -49
  377. package/dist/get-prompt-OY5B7TRI.js +0 -46
  378. package/dist/get-suite-J7JVWO6O.js +0 -45
  379. package/dist/index.d.ts +0 -2
  380. package/dist/langwatch-api-secrets-BUBSNCNO.js +0 -41
  381. package/dist/langwatch-api-triggers-EDFUCJN6.js +0 -31
  382. package/dist/list-agents-KFHKGPXV.js +0 -33
  383. package/dist/list-scenarios-F2WYNRIE.js +0 -41
  384. package/dist/list-suites-CRY4VWW6.js +0 -43
  385. package/dist/report-issue-XYVAPAYJ.js +0 -412
  386. package/dist/run-suite-NKZCJ2IN.js +0 -30
  387. package/dist/search-traces-A6HFKPLJ.js +0 -79
  388. package/dist/update-prompt-ODCRQRN6.js +0 -25
  389. package/dist/update-suite-SNO3GS7T.js +0 -40
  390. package/src/__tests__/all-tools.integration.test.ts +0 -1626
  391. package/src/__tests__/config.unit.test.ts +0 -202
  392. package/src/__tests__/datasets.integration.test.ts +0 -620
  393. package/src/__tests__/datasets.unit.test.ts +0 -244
  394. package/src/__tests__/date-parsing.unit.test.ts +0 -78
  395. package/src/__tests__/discover-evaluator-schema.unit.test.ts +0 -89
  396. package/src/__tests__/discover-schema.unit.test.ts +0 -118
  397. package/src/__tests__/docker.integration.test.ts +0 -318
  398. package/src/__tests__/documentation-fetch-security.integration.test.ts +0 -182
  399. package/src/__tests__/evaluator-tools.unit.test.ts +0 -262
  400. package/src/__tests__/experiment-list-tools.unit.test.ts +0 -157
  401. package/src/__tests__/experiment-status.unit.test.ts +0 -194
  402. package/src/__tests__/feature-map-tool-drift.unit.test.ts +0 -93
  403. package/src/__tests__/get-experiment-results.unit.test.ts +0 -313
  404. package/src/__tests__/http-security-origin.unit.test.ts +0 -97
  405. package/src/__tests__/http-security-sessions.unit.test.ts +0 -209
  406. package/src/__tests__/http-security-verifier.unit.test.ts +0 -248
  407. package/src/__tests__/http-server-allocation.integration.test.ts +0 -279
  408. package/src/__tests__/http-server-origin.integration.test.ts +0 -169
  409. package/src/__tests__/http-server-session-auth.integration.test.ts +0 -341
  410. package/src/__tests__/http-transport.integration.test.ts +0 -395
  411. package/src/__tests__/integration.integration.test.ts +0 -288
  412. package/src/__tests__/langwatch-api.unit.test.ts +0 -661
  413. package/src/__tests__/model-provider-tools.unit.test.ts +0 -190
  414. package/src/__tests__/project-api-key-tools.unit.test.ts +0 -451
  415. package/src/__tests__/public-http-request-security.integration.test.ts +0 -118
  416. package/src/__tests__/report-issue.integration.test.ts +0 -147
  417. package/src/__tests__/scenario-tools.integration.test.ts +0 -286
  418. package/src/__tests__/scenario-tools.unit.test.ts +0 -188
  419. package/src/__tests__/schemas.unit.test.ts +0 -85
  420. package/src/__tests__/support/http-server-harness.ts +0 -138
  421. package/src/__tests__/tools.unit.test.ts +0 -924
  422. package/src/langwatch-api-suites.ts +0 -118
  423. package/src/schemas/filter-fields.ts +0 -119
  424. package/src/schemas/index.ts +0 -4
  425. package/src/tools/archive-suite.ts +0 -12
  426. package/src/tools/create-suite.ts +0 -42
  427. package/src/tools/get-suite.ts +0 -47
  428. package/src/tools/list-suites.ts +0 -43
  429. package/src/tools/run-suite.ts +0 -28
  430. package/src/tools/update-suite.ts +0 -44
@@ -0,0 +1,140 @@
1
+ import type { z } from "zod";
2
+
3
+ import { makeRequest } from "./langwatch-api.ts";
4
+ import type {
5
+ runParametersSchema,
6
+ runPlanScopeSchema,
7
+ runPlanTargetSchema,
8
+ RunPlanTargetWire,
9
+ } from "./schemas/run-plan.ts";
10
+ import type { EvaluatorAttachmentWire } from "./schemas/suite-fields.ts";
11
+
12
+ // Client for /api/v1/run-plans. A run plan is identified by name; re-using the
13
+ // name replaces its config while parameters/notes belong to one run only.
14
+
15
+ /**
16
+ * The shapes the run plan tools accept, taken from the zod that validates
17
+ * them. They are inferred rather than written twice, so the schema stays the
18
+ * one place the shape is stated.
19
+ */
20
+
21
+ /** What a run plan covers. Mirrors `suiteScopeSchema` on the platform. */
22
+ export type RunPlanScope = z.infer<typeof runPlanScopeSchema>;
23
+
24
+ /** One thing a plan runs its scenarios against, as a tool caller writes it. */
25
+ export type RunPlanTarget = z.infer<typeof runPlanTargetSchema>;
26
+
27
+ /** The values a run supplies for the parameters its scenarios declare. */
28
+ export type RunParameters = z.infer<typeof runParametersSchema>;
29
+
30
+ export interface RunPlan {
31
+ id: string;
32
+ name: string;
33
+ slug: string;
34
+ scope: RunPlanScope | null;
35
+ scenarioIds: string[];
36
+ targets: RunPlanTargetWire[];
37
+ repeatCount: number;
38
+ simulatorModel: string | null;
39
+ judgeModel: string | null;
40
+ labels: string[];
41
+ archivedAt: string | null;
42
+ createdAt: string;
43
+ updatedAt: string;
44
+ platformUrl: string;
45
+ /** The plan's own evaluators. Absent on servers that predate them. */
46
+ evaluators?: EvaluatorAttachmentWire[];
47
+ }
48
+
49
+ /** The configuration a run either writes onto a plan or creates it with. */
50
+ export interface RunPlanConfig {
51
+ scope: RunPlanScope;
52
+ targets: RunPlanTargetWire[];
53
+ repeatCount?: number;
54
+ simulatorModel?: string | null;
55
+ judgeModel?: string | null;
56
+ scenarioIds?: string[];
57
+ /**
58
+ * The plan's own evaluators, run beside the ones its test suites attach. A
59
+ * plan evaluator reads the conversation and the trace, never a scenario
60
+ * field. Left out, the plan keeps what it already holds.
61
+ */
62
+ evaluators?: EvaluatorAttachmentWire[];
63
+ }
64
+
65
+ export interface RunPlanRunResult {
66
+ scheduled: boolean;
67
+ batchRunId: string;
68
+ setId: string;
69
+ jobCount: number;
70
+ skippedArchived: {
71
+ scenarios: string[];
72
+ targets: string[];
73
+ };
74
+ items: {
75
+ scenarioRunId: string;
76
+ scenarioId: string;
77
+ target: RunPlanTargetWire;
78
+ name: string | null;
79
+ }[];
80
+ runPlanId: string;
81
+ planName: string;
82
+ /** True when this run created the plan, false when it joined an existing one. */
83
+ created: boolean;
84
+ platformUrl: string;
85
+ }
86
+
87
+ export interface RunPlanArchiveResponse {
88
+ id: string;
89
+ archived: boolean;
90
+ }
91
+
92
+ /** Lists the run plans of the project. */
93
+ export async function listRunPlans(params?: { includeArchived?: boolean }): Promise<RunPlan[]> {
94
+ const query = params?.includeArchived ? "?includeArchived=true" : "";
95
+ return makeRequest("GET", `/api/v1/run-plans${query}`) as Promise<RunPlan[]>;
96
+ }
97
+
98
+ /** Retrieves a single run plan by id. */
99
+ export async function getRunPlan(id: string): Promise<RunPlan> {
100
+ return makeRequest("GET", `/api/v1/run-plans/${encodeURIComponent(id)}`) as Promise<RunPlan>;
101
+ }
102
+
103
+ /**
104
+ * Runs a configuration by plan name. A name that exists is replaced with this
105
+ * configuration, a name that does not is created. Sending no name lets the
106
+ * server derive one.
107
+ */
108
+ export async function runRunPlan(data: {
109
+ name?: string;
110
+ config: RunPlanConfig;
111
+ idempotencyKey?: string;
112
+ parameters?: RunParameters;
113
+ note?: string;
114
+ }): Promise<RunPlanRunResult> {
115
+ return makeRequest("POST", "/api/v1/run-plans/run", data) as Promise<RunPlanRunResult>;
116
+ }
117
+
118
+ /** Runs a plan again with the configuration it already holds. */
119
+ export async function rerunRunPlan(
120
+ id: string,
121
+ data?: {
122
+ idempotencyKey?: string;
123
+ parameters?: RunParameters;
124
+ note?: string;
125
+ },
126
+ ): Promise<RunPlanRunResult> {
127
+ return makeRequest(
128
+ "POST",
129
+ `/api/v1/run-plans/${encodeURIComponent(id)}/run`,
130
+ data ?? {},
131
+ ) as Promise<RunPlanRunResult>;
132
+ }
133
+
134
+ /** Archives a run plan. */
135
+ export async function archiveRunPlan(id: string): Promise<RunPlanArchiveResponse> {
136
+ return makeRequest(
137
+ "DELETE",
138
+ `/api/v1/run-plans/${encodeURIComponent(id)}`,
139
+ ) as Promise<RunPlanArchiveResponse>;
140
+ }
@@ -1,4 +1,5 @@
1
- import { makeRequest } from "./langwatch-api.js";
1
+ import { makeRequest } from "./langwatch-api.ts";
2
+ import type { ScenarioFieldValues } from "./schemas/suite-fields.ts";
2
3
 
3
4
  // --- Scenario types ---
4
5
 
@@ -8,6 +9,10 @@ export interface ScenarioSummary {
8
9
  situation: string;
9
10
  criteria: string[];
10
11
  labels: string[];
12
+ /** The test suite this scenario is filed in, null when it is unfiled. */
13
+ testSuiteId?: string | null;
14
+ /** The scenario's value for each field its test suite declares. */
15
+ fields?: ScenarioFieldValues;
11
16
  }
12
17
 
13
18
  export interface ScenarioArchiveResponse {
@@ -19,14 +24,14 @@ export interface ScenarioArchiveResponse {
19
24
 
20
25
  /** Lists all scenarios in the project. */
21
26
  export async function listScenarios(): Promise<ScenarioSummary[]> {
22
- return makeRequest("GET", "/api/scenarios") as Promise<ScenarioSummary[]>;
27
+ return makeRequest("GET", "/api/v1/scenarios") as Promise<ScenarioSummary[]>;
23
28
  }
24
29
 
25
30
  /** Retrieves a single scenario by ID. */
26
31
  export async function getScenario(id: string): Promise<ScenarioSummary> {
27
32
  return makeRequest(
28
33
  "GET",
29
- `/api/scenarios/${encodeURIComponent(id)}`
34
+ `/api/v1/scenarios/${encodeURIComponent(id)}`,
30
35
  ) as Promise<ScenarioSummary>;
31
36
  }
32
37
 
@@ -36,8 +41,10 @@ export async function createScenario(data: {
36
41
  situation: string;
37
42
  criteria?: string[];
38
43
  labels?: string[];
44
+ testSuiteId?: string | null;
45
+ fields?: ScenarioFieldValues;
39
46
  }): Promise<ScenarioSummary> {
40
- return makeRequest("POST", "/api/scenarios", data) as Promise<ScenarioSummary>;
47
+ return makeRequest("POST", "/api/v1/scenarios", data) as Promise<ScenarioSummary>;
41
48
  }
42
49
 
43
50
  /** Updates an existing scenario. */
@@ -47,21 +54,21 @@ export async function updateScenario(params: {
47
54
  situation?: string;
48
55
  criteria?: string[];
49
56
  labels?: string[];
57
+ testSuiteId?: string | null;
58
+ fields?: ScenarioFieldValues;
50
59
  }): Promise<ScenarioSummary> {
51
60
  const { id, ...data } = params;
52
61
  return makeRequest(
53
62
  "PUT",
54
- `/api/scenarios/${encodeURIComponent(id)}`,
55
- data
63
+ `/api/v1/scenarios/${encodeURIComponent(id)}`,
64
+ data,
56
65
  ) as Promise<ScenarioSummary>;
57
66
  }
58
67
 
59
68
  /** Archives (soft-deletes) a scenario. */
60
- export async function archiveScenario(
61
- id: string
62
- ): Promise<ScenarioArchiveResponse> {
69
+ export async function archiveScenario(id: string): Promise<ScenarioArchiveResponse> {
63
70
  return makeRequest(
64
71
  "DELETE",
65
- `/api/scenarios/${encodeURIComponent(id)}`
72
+ `/api/v1/scenarios/${encodeURIComponent(id)}`,
66
73
  ) as Promise<ScenarioArchiveResponse>;
67
74
  }
@@ -1,4 +1,5 @@
1
- import { makeRequest } from "./langwatch-api.js";
1
+ import { getConfig } from "./config.ts";
2
+ import { makeRequest } from "./langwatch-api.ts";
2
3
 
3
4
  export interface SecretSummary {
4
5
  id: string;
@@ -8,41 +9,47 @@ export interface SecretSummary {
8
9
  updatedAt: string;
9
10
  }
10
11
 
12
+ function projectId(): string {
13
+ const projectId = getConfig().projectId;
14
+ if (!projectId) {
15
+ throw new Error("LANGWATCH_PROJECT_ID is required for secret operations");
16
+ }
17
+ return projectId;
18
+ }
19
+
11
20
  export async function listSecrets(): Promise<SecretSummary[]> {
12
- return makeRequest("GET", "/api/secrets") as Promise<SecretSummary[]>;
21
+ const targetProjectId = projectId();
22
+ return makeRequest(
23
+ "GET",
24
+ `/api/v1/secrets?projectId=${encodeURIComponent(targetProjectId)}`,
25
+ ) as Promise<SecretSummary[]>;
13
26
  }
14
27
 
15
28
  export async function getSecret(id: string): Promise<SecretSummary> {
29
+ const targetProjectId = projectId();
16
30
  return makeRequest(
17
31
  "GET",
18
- `/api/secrets/${encodeURIComponent(id)}`
32
+ `/api/v1/secrets/${encodeURIComponent(id)}?projectId=${encodeURIComponent(targetProjectId)}`,
19
33
  ) as Promise<SecretSummary>;
20
34
  }
21
35
 
22
- export async function createSecret(data: {
23
- name: string;
24
- value: string;
25
- }): Promise<SecretSummary> {
26
- return makeRequest("POST", "/api/secrets", data) as Promise<SecretSummary>;
36
+ export async function createSecret(data: { name: string; value: string }): Promise<SecretSummary> {
37
+ return makeRequest("POST", "/api/v1/secrets", {
38
+ projectId: projectId(),
39
+ ...data,
40
+ }) as Promise<SecretSummary>;
27
41
  }
28
42
 
29
- export async function updateSecret(params: {
30
- id: string;
31
- value: string;
32
- }): Promise<SecretSummary> {
43
+ export async function updateSecret(params: { id: string; value: string }): Promise<SecretSummary> {
33
44
  const { id, value } = params;
34
- return makeRequest(
35
- "PUT",
36
- `/api/secrets/${encodeURIComponent(id)}`,
37
- { value }
38
- ) as Promise<SecretSummary>;
45
+ return makeRequest("PUT", `/api/v1/secrets/${encodeURIComponent(id)}`, {
46
+ projectId: projectId(),
47
+ value,
48
+ }) as Promise<SecretSummary>;
39
49
  }
40
50
 
41
- export async function deleteSecret(
42
- id: string
43
- ): Promise<{ id: string; deleted: boolean }> {
44
- return makeRequest(
45
- "DELETE",
46
- `/api/secrets/${encodeURIComponent(id)}`
47
- ) as Promise<{ id: string; deleted: boolean }>;
51
+ export async function deleteSecret(id: string): Promise<{ id: string; deleted: boolean }> {
52
+ return makeRequest("DELETE", `/api/v1/secrets/${encodeURIComponent(id)}`, {
53
+ projectId: projectId(),
54
+ }) as Promise<{ id: string; deleted: boolean }>;
48
55
  }
@@ -1,4 +1,5 @@
1
- import { makeRequest } from "./langwatch-api.js";
1
+ import { makeRequest } from "./langwatch-api.ts";
2
+ import type { SimulationRunEvaluation } from "./tools/format-suite-details.ts";
2
3
 
3
4
  export interface SimulationRunSummary {
4
5
  scenarioRunId: string;
@@ -14,8 +15,12 @@ export interface SimulationRunSummary {
14
15
  metCriteria?: string[];
15
16
  unmetCriteria?: string[];
16
17
  error?: string | null;
18
+ /** One result per evaluator that ran after the conversation. */
19
+ evaluations?: SimulationRunEvaluation[];
17
20
  } | null;
18
- messages?: Array<{ role: string; content: string }>;
21
+ messages?: { role: string; content: string }[];
22
+ /** Why the run was started, as given when it was queued. Null without one. */
23
+ note?: string | null;
19
24
  timestamp: number;
20
25
  updatedAt: number;
21
26
  }
@@ -37,15 +42,13 @@ export async function listSimulationRuns(params?: {
37
42
  if (params?.batchRunId) query.set("batchRunId", params.batchRunId);
38
43
  if (params?.limit) query.set("limit", String(params.limit));
39
44
  const qs = query.toString() ? `?${query}` : "";
40
- return makeRequest("GET", `/api/simulation-runs${qs}`) as Promise<SimulationRunListResponse>;
45
+ return makeRequest("GET", `/api/v1/simulation-runs${qs}`) as Promise<SimulationRunListResponse>;
41
46
  }
42
47
 
43
48
  /** Gets a single simulation run by its ID. */
44
- export async function getSimulationRun(
45
- scenarioRunId: string,
46
- ): Promise<SimulationRunSummary> {
49
+ export async function getSimulationRun(scenarioRunId: string): Promise<SimulationRunSummary> {
47
50
  return makeRequest(
48
51
  "GET",
49
- `/api/simulation-runs/${encodeURIComponent(scenarioRunId)}`,
52
+ `/api/v1/simulation-runs/${encodeURIComponent(scenarioRunId)}`,
50
53
  ) as Promise<SimulationRunSummary>;
51
54
  }
@@ -0,0 +1,116 @@
1
+ import type { RunParameters, RunPlanRunResult } from "./langwatch-api-run-plans.ts";
2
+ import { makeRequest } from "./langwatch-api.ts";
3
+ import type { RunPlanTargetWire } from "./schemas/run-plan.ts";
4
+ import type { EvaluatorAttachmentWire, SuiteField } from "./schemas/suite-fields.ts";
5
+
6
+ /**
7
+ * Client for `/api/v1/test-suites`. A test suite groups scenarios by
8
+ * name; running one is sugar over a run plan, returning the same
9
+ * result shape.
10
+ */
11
+
12
+ export interface TestSuite {
13
+ id: string;
14
+ name: string;
15
+ slug: string;
16
+ scenarioIds: string[];
17
+ scenarioCount: number;
18
+ archivedAt: string | null;
19
+ createdAt: string;
20
+ updatedAt: string;
21
+ platformUrl: string;
22
+ /** The fields the suite declares. Absent on servers that predate them. */
23
+ fields?: SuiteField[];
24
+ /** The evaluators attached to the suite. Absent on servers that predate them. */
25
+ evaluators?: EvaluatorAttachmentWire[];
26
+ }
27
+
28
+ export interface TestSuiteDetail extends TestSuite {
29
+ scenarios: { id: string; name: string }[];
30
+ }
31
+
32
+ export interface TestSuiteArchiveResponse {
33
+ id: string;
34
+ archived: boolean;
35
+ }
36
+
37
+ /** Lists the test suites of the project. */
38
+ export async function listTestSuites(): Promise<TestSuite[]> {
39
+ return makeRequest("GET", "/api/v1/test-suites") as Promise<TestSuite[]>;
40
+ }
41
+
42
+ /** Creates a test suite, with the fields and the evaluators it declares. */
43
+ export async function createTestSuite(data: {
44
+ name: string;
45
+ fields?: SuiteField[];
46
+ evaluators?: EvaluatorAttachmentWire[];
47
+ }): Promise<TestSuite> {
48
+ return makeRequest("POST", "/api/v1/test-suites", data) as Promise<TestSuite>;
49
+ }
50
+
51
+ /** Retrieves a test suite with the scenarios filed in it. */
52
+ export async function getTestSuite(id: string): Promise<TestSuiteDetail> {
53
+ return makeRequest(
54
+ "GET",
55
+ `/api/v1/test-suites/${encodeURIComponent(id)}`,
56
+ ) as Promise<TestSuiteDetail>;
57
+ }
58
+
59
+ /**
60
+ * Edits a test suite: any of its name, its fields and its evaluators. A list
61
+ * given here replaces the one the suite holds.
62
+ */
63
+ export async function updateTestSuite(params: {
64
+ id: string;
65
+ name?: string;
66
+ fields?: SuiteField[];
67
+ evaluators?: EvaluatorAttachmentWire[];
68
+ }): Promise<TestSuite> {
69
+ const { id, ...data } = params;
70
+ return makeRequest(
71
+ "PATCH",
72
+ `/api/v1/test-suites/${encodeURIComponent(id)}`,
73
+ data,
74
+ ) as Promise<TestSuite>;
75
+ }
76
+
77
+ /** Renames a test suite. */
78
+ export async function renameTestSuite(params: { id: string; name: string }): Promise<TestSuite> {
79
+ return makeRequest("PATCH", `/api/v1/test-suites/${encodeURIComponent(params.id)}`, {
80
+ name: params.name,
81
+ }) as Promise<TestSuite>;
82
+ }
83
+
84
+ /** Archives a test suite and the scenarios filed in it. */
85
+ export async function archiveTestSuite(id: string): Promise<TestSuiteArchiveResponse> {
86
+ return makeRequest(
87
+ "DELETE",
88
+ `/api/v1/test-suites/${encodeURIComponent(id)}`,
89
+ ) as Promise<TestSuiteArchiveResponse>;
90
+ }
91
+
92
+ /**
93
+ * Runs every scenario of a test suite against the given targets. The server
94
+ * creates or joins the run plan named "<suite name> <target name>" when no
95
+ * name is sent.
96
+ */
97
+ export async function runTestSuite({
98
+ id,
99
+ ...data
100
+ }: {
101
+ id: string;
102
+ targets: RunPlanTargetWire[];
103
+ name?: string;
104
+ repeatCount?: number;
105
+ simulatorModel?: string | null;
106
+ judgeModel?: string | null;
107
+ parameters?: RunParameters;
108
+ note?: string;
109
+ idempotencyKey?: string;
110
+ }): Promise<RunPlanRunResult> {
111
+ return makeRequest(
112
+ "POST",
113
+ `/api/v1/test-suites/${encodeURIComponent(id)}/run`,
114
+ data,
115
+ ) as Promise<RunPlanRunResult>;
116
+ }
@@ -1,48 +1,110 @@
1
- import { makeRequest } from "./langwatch-api.js";
1
+ import { z } from "zod";
2
2
 
3
- export interface TriggerSummary {
4
- id: string;
5
- name: string;
6
- action: string;
7
- actionParams: Record<string, unknown>;
8
- filters: Record<string, unknown>;
9
- active: boolean;
10
- message: string | null;
11
- alertType: string | null;
12
- createdAt: string;
13
- updatedAt: string;
14
- }
3
+ import { makeRequest } from "./langwatch-api.ts";
4
+ import {
5
+ deletedTriggerSchema,
6
+ type GraphAlertRule,
7
+ type NotificationCadence,
8
+ type ReportRule,
9
+ type TestFireResult,
10
+ type Trigger,
11
+ type TriggerAction,
12
+ type TriggerActionParams,
13
+ type TriggerAlertType,
14
+ type TriggerFirePage,
15
+ type TriggerTemplates,
16
+ testFireResultSchema,
17
+ triggerFirePageSchema,
18
+ triggerSchema,
19
+ } from "./schemas/triggers.ts";
15
20
 
16
- export async function listTriggers(): Promise<TriggerSummary[]> {
17
- return makeRequest("GET", "/api/triggers") as Promise<TriggerSummary[]>;
18
- }
21
+ /**
22
+ * The `/api/v1/triggers` calls, each answering with the shape `schemas/triggers` declares.
23
+ * Responses are read through that schema, not cast, so a deployment that stops sending something
24
+ * a tool renders fails loudly instead of leaving an `undefined` in an agent's message.
25
+ */
19
26
 
20
- export async function getTrigger(id: string): Promise<TriggerSummary> {
21
- return makeRequest("GET", `/api/triggers/${encodeURIComponent(id)}`) as Promise<TriggerSummary>;
22
- }
23
-
24
- export async function createTrigger(data: {
27
+ export interface CreateTriggerInput {
25
28
  name: string;
26
- action: string;
27
- actionParams?: Record<string, unknown>;
29
+ action: TriggerAction;
30
+ /** Omitted sends `{}`, as before `actionParams` was stated per channel. */
31
+ actionParams?: TriggerActionParams;
28
32
  filters?: Record<string, unknown>;
33
+ filterQuery?: string | null;
29
34
  message?: string;
30
- alertType?: string;
31
- }): Promise<TriggerSummary> {
32
- return makeRequest("POST", "/api/triggers", data) as Promise<TriggerSummary>;
35
+ alertType?: TriggerAlertType;
36
+ customGraphId?: string;
37
+ graphAlert?: GraphAlertRule;
38
+ report?: ReportRule;
39
+ templates?: TriggerTemplates;
40
+ notificationCadence?: NotificationCadence;
33
41
  }
34
42
 
35
- export async function updateTrigger(params: {
43
+ /** `actionParams` replaces the delivery configuration as a whole; a credential
44
+ * sent back as `[redacted]` keeps the stored one. The channel cannot change. */
45
+ type UpdateTriggerInput = Partial<
46
+ Omit<CreateTriggerInput, "action" | "customGraphId" | "message" | "alertType">
47
+ > & {
36
48
  id: string;
37
- name?: string;
38
49
  active?: boolean;
39
50
  message?: string | null;
40
- alertType?: string | null;
41
- }): Promise<TriggerSummary> {
42
- const { id, ...data } = params;
43
- return makeRequest("PATCH", `/api/triggers/${encodeURIComponent(id)}`, data) as Promise<TriggerSummary>;
51
+ alertType?: TriggerAlertType | null;
52
+ };
53
+
54
+ export async function listTriggers(): Promise<Trigger[]> {
55
+ return z.array(triggerSchema).parse(await makeRequest("GET", "/api/v1/triggers"));
56
+ }
57
+
58
+ export async function getTrigger(id: string): Promise<Trigger> {
59
+ return triggerSchema.parse(
60
+ await makeRequest("GET", `/api/v1/triggers/${encodeURIComponent(id)}`),
61
+ );
62
+ }
63
+
64
+ export async function createTrigger(input: CreateTriggerInput): Promise<Trigger> {
65
+ return triggerSchema.parse(
66
+ await makeRequest("POST", "/api/v1/triggers", {
67
+ ...input,
68
+ actionParams: input.actionParams ?? {},
69
+ }),
70
+ );
71
+ }
72
+
73
+ export async function updateTrigger({ id, ...data }: UpdateTriggerInput): Promise<Trigger> {
74
+ return triggerSchema.parse(
75
+ await makeRequest("PATCH", `/api/v1/triggers/${encodeURIComponent(id)}`, data),
76
+ );
77
+ }
78
+
79
+ /** Send the automation's message to the destination it is saved with. */
80
+ export async function testFireTrigger(id: string): Promise<TestFireResult> {
81
+ return testFireResultSchema.parse(
82
+ await makeRequest("POST", `/api/v1/triggers/${encodeURIComponent(id)}/test-fire`),
83
+ );
84
+ }
85
+
86
+ /** What the automation has done, newest first. Metadata only. `cursor` reads
87
+ * the page after the one that answered with it as `nextCursor`. */
88
+ export async function listTriggerFires({
89
+ id,
90
+ limit,
91
+ cursor,
92
+ }: {
93
+ id: string;
94
+ limit?: number;
95
+ cursor?: string;
96
+ }): Promise<TriggerFirePage> {
97
+ const query = new URLSearchParams();
98
+ if (limit !== undefined) query.set("limit", String(limit));
99
+ if (cursor) query.set("cursor", cursor);
100
+ const search = query.toString() ? `?${query.toString()}` : "";
101
+ return triggerFirePageSchema.parse(
102
+ await makeRequest("GET", `/api/v1/triggers/${encodeURIComponent(id)}/fires${search}`),
103
+ );
44
104
  }
45
105
 
46
- export async function deleteTrigger(id: string): Promise<{ id: string; deleted: boolean }> {
47
- return makeRequest("DELETE", `/api/triggers/${encodeURIComponent(id)}`) as Promise<{ id: string; deleted: boolean }>;
106
+ export async function deleteTrigger(id: string): Promise<z.infer<typeof deletedTriggerSchema>> {
107
+ return deletedTriggerSchema.parse(
108
+ await makeRequest("DELETE", `/api/v1/triggers/${encodeURIComponent(id)}`),
109
+ );
48
110
  }
@@ -1,4 +1,4 @@
1
- import { makeRequest } from "./langwatch-api.js";
1
+ import { makeRequest } from "./langwatch-api.ts";
2
2
 
3
3
  export interface WorkflowSummary {
4
4
  id: string;
@@ -12,30 +12,30 @@ export interface WorkflowSummary {
12
12
  }
13
13
 
14
14
  export async function listWorkflows(): Promise<WorkflowSummary[]> {
15
- return makeRequest("GET", "/api/workflows") as Promise<WorkflowSummary[]>;
15
+ return makeRequest("GET", "/api/v1/workflows") as Promise<WorkflowSummary[]>;
16
16
  }
17
17
 
18
18
  export async function getWorkflow(id: string): Promise<WorkflowSummary> {
19
19
  return makeRequest(
20
20
  "GET",
21
- `/api/workflows/${encodeURIComponent(id)}`,
21
+ `/api/v1/workflows/${encodeURIComponent(id)}`,
22
22
  ) as Promise<WorkflowSummary>;
23
23
  }
24
24
 
25
25
  export async function runWorkflow(
26
26
  id: string,
27
- input?: Record<string, unknown>
27
+ input?: Record<string, unknown>,
28
28
  ): Promise<Record<string, unknown>> {
29
29
  return makeRequest(
30
30
  "POST",
31
- `/api/workflows/${encodeURIComponent(id)}/run`,
31
+ `/api/v1/workflows/${encodeURIComponent(id)}/run`,
32
32
  input ?? {},
33
33
  ) as Promise<Record<string, unknown>>;
34
34
  }
35
35
 
36
36
  export async function deleteWorkflow(id: string): Promise<{ id: string; archived: boolean }> {
37
- return makeRequest(
38
- "DELETE",
39
- `/api/workflows/${encodeURIComponent(id)}`,
40
- ) as Promise<{ id: string; archived: boolean }>;
37
+ return makeRequest("DELETE", `/api/v1/workflows/${encodeURIComponent(id)}`) as Promise<{
38
+ id: string;
39
+ archived: boolean;
40
+ }>;
41
41
  }