@langwatch/mcp-server 2.1.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 (415) hide show
  1. package/.gitignore +7 -0
  2. package/.npmignore +41 -0
  3. package/CHANGELOG.md +192 -201
  4. package/CONTRIBUTING.md +10 -0
  5. package/README.md +70 -68
  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-W3IKI7UL.js → archive-project-SPVHXK6A.js} +4 -4
  10. package/dist/{archive-run-plan-474OKHHU.js → archive-run-plan-65QN3XRX.js} +4 -4
  11. package/dist/archive-run-plan-Z4SYE6BP.js +15 -0
  12. package/dist/{archive-scenario-V5UNYK26.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-O7FLDMXK.js → archive-test-suite-NKZDZY3D.js} +4 -4
  16. package/dist/assign-prompt-tag-5IUZXJ2T.js +23 -0
  17. package/dist/{assign-prompt-tag-Q46WRB6P.js → assign-prompt-tag-HBZLBIFD.js} +8 -4
  18. package/dist/{chunk-OJLYYJWI.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-UF6XIGYR.js → chunk-6YZUOD34.js} +2 -5
  22. package/dist/{chunk-WVI5CJ6S.js → chunk-7AQLPVFL.js} +2 -2
  23. package/dist/chunk-7VNSRCXO.js +129 -0
  24. package/dist/{chunk-G4ZAZTZW.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-EYXMLE5X.js → chunk-HGELNIVY.js} +56 -47
  30. package/dist/{chunk-UJPXFA26.js → chunk-HHMNZAPD.js} +101 -74
  31. package/dist/{chunk-RVAE2MEA.js → chunk-I7ATIZED.js} +7 -7
  32. package/dist/{chunk-S4GVX36W.js → chunk-ILZDO25L.js} +7 -10
  33. package/dist/{chunk-QRO35SOM.js → chunk-J7PQKBLD.js} +652 -528
  34. package/dist/{chunk-SR6QPRIE.js → chunk-JRJPH75H.js} +7 -13
  35. package/dist/chunk-K2I7Z3LZ.js +28 -0
  36. package/dist/{chunk-UFOYFYI7.js → chunk-NKMTIHIJ.js} +6 -9
  37. package/dist/{chunk-HV4DWKBI.js → chunk-O7EMWEVJ.js} +2 -4
  38. package/dist/{chunk-56OGTS24.js → chunk-PTDR56Z3.js} +4 -11
  39. package/dist/{chunk-JR6DJZOU.js → chunk-RABYBFX5.js} +4 -10
  40. package/dist/chunk-SUPUUC4W.js +64 -0
  41. package/dist/{chunk-JTQJRNFJ.js → chunk-SXFC3FNH.js} +4 -4
  42. package/dist/{chunk-CKNAH5TG.js → chunk-U24EACC4.js} +3 -10
  43. package/dist/chunk-UNJM3BIL.js +21 -0
  44. package/dist/{chunk-QAMP3CGR.js → chunk-UTJCWXPZ.js} +4 -4
  45. package/dist/chunk-UWLE5T2F.js +312 -0
  46. package/dist/{chunk-6DJDEXET.js → chunk-VMWJD732.js} +6 -12
  47. package/dist/{chunk-7E4FZIYJ.js → chunk-XUIJYNRJ.js} +1 -1
  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-JFJ2K6X3.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-EUXXQ6NS.js → create-annotation-VUSXULQK.js} +10 -5
  57. package/dist/{create-api-key-BGBB76JX.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-Z76AIPLS.js → create-dashboard-WTKKS5Z6.js} +4 -4
  61. package/dist/{create-dataset-FD5VAXU4.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-WQUXXOHI.js → create-dataset-records-W4GLN2FV.js} +5 -7
  65. package/dist/{create-evaluator-6NV33Z52.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 -10
  69. package/dist/create-project-6N7PIYRY.js +44 -0
  70. package/dist/{create-project-ZQ7TFIO2.js → create-project-KAIC46UY.js} +4 -4
  71. package/dist/{create-prompt-BS6QRCUU.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-FCQ5ELSQ.js → create-prompt-tag-OPQUEXWB.js} +3 -3
  75. package/dist/create-scenario-5PJBMAXO.js +33 -0
  76. package/dist/{create-scenario-DRPTPXU3.js → create-scenario-UEM77OE7.js} +5 -5
  77. package/dist/{create-test-suite-ZIZCCFJ4.js → create-test-suite-4IPXVSFQ.js} +6 -6
  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-SA4JMUZF.js → delete-agent-QMEK3XHK.js} +4 -4
  83. package/dist/delete-annotation-HY3O2OGR.js +17 -0
  84. package/dist/{delete-annotation-X3KKK7QY.js → delete-annotation-VKIQWUYW.js} +4 -4
  85. package/dist/delete-dashboard-76N66XXL.js +18 -0
  86. package/dist/{delete-dashboard-LYMRPF27.js → delete-dashboard-JVIVHNJM.js} +4 -4
  87. package/dist/delete-dataset-HQCR66MG.js +18 -0
  88. package/dist/{delete-dataset-W6EZ44HY.js → delete-dataset-WKRUW4FP.js} +5 -7
  89. package/dist/{delete-dataset-records-7CNOTALB.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-QB3OCZUV.js → delete-prompt-tag-YYQ4VMAD.js} +3 -3
  95. package/dist/{delete-workflow-NG2VXYYM.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-W7KBXA4J.js → discover-scenario-schema-OOFIQKOG.js} +37 -17
  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-7THF7HCU.js → get-agent-OTIYUFZA.js} +15 -11
  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-P4WWVHFU.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-RZ44UIN6.js → get-evaluator-ISMC4LLI.js} +4 -4
  112. package/dist/get-evaluator-XEUZGZCH.js +47 -0
  113. package/dist/{get-project-QSQEAB33.js → get-project-5VKROSDH.js} +4 -4
  114. package/dist/get-project-RM6FRCBK.js +26 -0
  115. package/dist/{get-prompt-GVKXF5NL.js → get-prompt-OWXJZHQQ.js} +53 -58
  116. package/dist/get-prompt-W52DY36E.js +94 -0
  117. package/dist/{get-run-plan-NY7J5GRE.js → get-run-plan-BE3M2AUX.js} +7 -9
  118. package/dist/get-run-plan-RUXQ6PAX.js +58 -0
  119. package/dist/get-scenario-RNM7BAX2.js +37 -0
  120. package/dist/{get-scenario-Q3LLQE4T.js → get-scenario-YM4ODWW6.js} +5 -5
  121. package/dist/get-simulation-run-6GIATQE5.js +69 -0
  122. package/dist/{get-simulation-run-WINEYDMK.js → get-simulation-run-LCFSMPGQ.js} +26 -22
  123. package/dist/{get-test-suite-4HKA7OKS.js → get-test-suite-GC2O7YH6.js} +5 -5
  124. package/dist/get-test-suite-P5LJ6VLF.js +48 -0
  125. package/dist/get-trace-KBRVV4NN.js +45 -0
  126. package/dist/{get-trace-RCUV7N4O.js → get-trace-SEF3FMR5.js} +11 -13
  127. package/dist/get-workflow-7PVED7JE.js +25 -0
  128. package/dist/{get-workflow-EEOC7Y45.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-WCDUARTH.js → http-server-IR4QOS43.js} +4071 -347
  131. package/dist/index.js +58671 -37983
  132. package/dist/langwatch-api-annotations-6SA4OB4C.js +17 -0
  133. package/dist/{langwatch-api-annotations-6DHVZWUK.js → langwatch-api-annotations-TBHLCQ5R.js} +4 -4
  134. package/dist/langwatch-api-dashboards-6EO2VVZW.js +17 -0
  135. package/dist/{langwatch-api-dashboards-2KJL2M42.js → langwatch-api-dashboards-NHU5BZD7.js} +4 -4
  136. package/dist/langwatch-api-monitors-CBF3FGIM.js +47 -0
  137. package/dist/{langwatch-api-monitors-6ISFJ7WX.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-6UJL5U4Z.js → langwatch-api-workflows-OKC4FXIF.js} +4 -4
  143. package/dist/langwatch-api-workflows-XGJE6SR5.js +15 -0
  144. package/dist/{list-agents-AMVDQPQL.js → list-agents-HVYWEQMI.js} +4 -4
  145. package/dist/list-agents-RBAOCF53.js +42 -0
  146. package/dist/list-annotations-HJH4NBLD.js +38 -0
  147. package/dist/{list-annotations-6PR5NLIC.js → list-annotations-J4UAHSUN.js} +10 -5
  148. package/dist/{list-api-keys-GVPNBIHQ.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-Z3BZKDGF.js → list-dashboards-ROSYFLDQ.js} +4 -4
  153. package/dist/list-dashboards-RQ635ZU7.js +32 -0
  154. package/dist/{list-dataset-records-O67HZ35Y.js → list-dataset-records-M5TKA6LK.js} +14 -10
  155. package/dist/list-dataset-records-WFM7F33C.js +43 -0
  156. package/dist/{list-datasets-WXZL6UMP.js → list-datasets-B5X4P7BQ.js} +9 -13
  157. package/dist/list-datasets-THUKQHPX.js +56 -0
  158. package/dist/{list-evaluators-PAX72WCN.js → list-evaluators-MYH2OVCI.js} +5 -7
  159. package/dist/list-evaluators-NLVWF6K7.js +32 -0
  160. package/dist/{list-model-providers-VVLZMLCX.js → list-model-providers-3JUGP4YI.js} +4 -4
  161. package/dist/list-model-providers-H3XKORFO.js +35 -0
  162. package/dist/{list-projects-AQVI6SUK.js → list-projects-6EJ5YYEW.js} +5 -7
  163. package/dist/list-projects-YNNSRMLC.js +40 -0
  164. package/dist/{list-prompt-tags-WZFBJOHG.js → list-prompt-tags-NVFQO6WX.js} +3 -3
  165. package/dist/list-prompt-tags-XUQTTAH4.js +23 -0
  166. package/dist/{list-prompts-BQOHRHYT.js → list-prompts-HSIMMHTF.js} +4 -6
  167. package/dist/list-prompts-IRI6AIXO.js +30 -0
  168. package/dist/{list-run-plans-UBAU2DGH.js → list-run-plans-PX2XI6EK.js} +5 -5
  169. package/dist/list-run-plans-QALLCN2K.js +45 -0
  170. package/dist/{list-scenarios-MS4IUIVM.js → list-scenarios-QZRPVHS4.js} +13 -11
  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-D6YF4ZOU.js → list-simulation-runs-OEADLLQR.js} +12 -8
  174. package/dist/list-test-suites-ANAQBLDG.js +34 -0
  175. package/dist/{list-test-suites-L7R2O6DR.js → list-test-suites-N4WVLBKK.js} +4 -4
  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-6MV4XJHF.js → list-workflows-IMSX7SXU.js} +5 -7
  181. package/dist/list-workflows-ZHTX5LCL.js +33 -0
  182. package/dist/{rename-prompt-tag-K5LQ4CY6.js → rename-prompt-tag-IQI7MHOI.js} +3 -3
  183. package/dist/rename-prompt-tag-PA2BRIE6.js +18 -0
  184. package/dist/{rename-test-suite-NTYHAO5X.js → rename-test-suite-4J7UX5S2.js} +4 -4
  185. package/dist/rename-test-suite-NNVLMLKY.js +20 -0
  186. package/dist/report-issue-AS34ZMJF.js +898 -0
  187. package/dist/{report-issue-RHZZ33IS.js → report-issue-DCZFLGDO.js} +81 -67
  188. package/dist/{rerun-run-plan-MUDWJBE4.js → rerun-run-plan-TG2V4WM4.js} +5 -5
  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-6LAZ3QZZ.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-T4ZYOZGA.js → run-plan-PAARQSI4.js} +7 -7
  196. package/dist/run-query-KJDH544C.js +47 -0
  197. package/dist/run-query-T4QW2Z5O.js +46 -0
  198. package/dist/{run-test-suite-L4MZ7G4D.js → run-test-suite-SQJELEZX.js} +6 -6
  199. package/dist/run-test-suite-STB6NUJM.js +25 -0
  200. package/dist/{run-workflow-DFIS23AP.js → run-workflow-D6PQNBI6.js} +4 -4
  201. package/dist/run-workflow-SP32SO5M.js +36 -0
  202. package/dist/search-traces-HCBGOG6R.js +170 -0
  203. package/dist/search-traces-HSTQ6WTQ.js +171 -0
  204. package/dist/{set-model-provider-XRNMFOVR.js → set-model-provider-GF7NXUJA.js} +4 -4
  205. package/dist/set-model-provider-KDQ7C4EZ.js +33 -0
  206. package/dist/{update-agent-DUWNYBNA.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-YSOMDCOB.js → update-dataset-SQZ6T4WX.js} +6 -6
  212. package/dist/{update-dataset-record-DEA2ITYR.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-NH7Q5GWV.js → update-evaluator-IGTX6PX4.js} +4 -4
  216. package/dist/{update-project-Q26FBSYH.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-ZQQ2C3KU.js → update-prompt-MY263DYF.js} +27 -29
  220. package/dist/update-scenario-7KA3JDXA.js +34 -0
  221. package/dist/{update-scenario-WUX34JAR.js → update-scenario-MOHRQKAQ.js} +5 -5
  222. package/package.json +35 -39
  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 +755 -609
  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 +18 -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 +12 -29
  244. package/src/langwatch-api-scenarios.ts +9 -11
  245. package/src/langwatch-api-secrets.ts +31 -24
  246. package/src/langwatch-api-simulation-runs.ts +6 -8
  247. package/src/langwatch-api-test-suites.ts +14 -33
  248. package/src/langwatch-api-triggers.ts +96 -34
  249. package/src/langwatch-api-workflows.ts +9 -9
  250. package/src/langwatch-api.ts +108 -124
  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 +13 -29
  255. package/src/schemas/suite-fields.ts +6 -23
  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 +2 -4
  260. package/src/tools/archive-scenario.ts +2 -4
  261. package/src/tools/archive-test-suite.ts +2 -4
  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 +5 -7
  274. package/src/tools/create-test-suite.ts +4 -9
  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 +41 -21
  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 +7 -21
  292. package/src/tools/format-scenario.ts +2 -4
  293. package/src/tools/format-suite-details.ts +6 -12
  294. package/src/tools/get-agent.ts +15 -6
  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 +63 -84
  302. package/src/tools/get-run-plan.ts +4 -6
  303. package/src/tools/get-scenario.ts +4 -6
  304. package/src/tools/get-simulation-run.ts +27 -24
  305. package/src/tools/get-test-suite.ts +2 -5
  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 +1 -1
  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 +2 -2
  323. package/src/tools/list-scenarios.ts +14 -15
  324. package/src/tools/list-simulation-runs.ts +8 -4
  325. package/src/tools/list-test-suites.ts +1 -1
  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 +2 -5
  331. package/src/tools/report-issue.ts +5 -9
  332. package/src/tools/rerun-run-plan.ts +2 -5
  333. package/src/tools/revoke-api-key.ts +2 -4
  334. package/src/tools/run-agent.ts +29 -26
  335. package/src/tools/run-experiment.ts +36 -37
  336. package/src/tools/run-plan.ts +4 -7
  337. package/src/tools/run-query.ts +47 -0
  338. package/src/tools/run-test-suite.ts +4 -7
  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 +2 -2
  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 +44 -59
  350. package/src/tools/update-scenario.ts +5 -7
  351. package/src/tools/update-test-suite.ts +6 -11
  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 +14 -12
  359. package/vitest.integration.config.js +10 -0
  360. package/vitest.scenario.config.js +9 -0
  361. package/.eslintrc.cjs +0 -36
  362. package/dist/chunk-AN4OUA4D.js +0 -86
  363. package/dist/chunk-GELJ2MQR.js +0 -226
  364. package/dist/chunk-K37ZNPXK.js +0 -24
  365. package/dist/config.d.ts +0 -17
  366. package/dist/create-mcp-server.d.ts +0 -10
  367. package/dist/delete-evaluator-RKYC4TNB.js +0 -16
  368. package/dist/discover-evaluator-schema-ESSHQGPY.js +0 -1912
  369. package/dist/get-analytics-R6AZD3AW.js +0 -73
  370. package/dist/get-dataset-AKTYSQDI.js +0 -49
  371. package/dist/index.d.ts +0 -2
  372. package/dist/langwatch-api-secrets-OEBD6GBU.js +0 -41
  373. package/dist/langwatch-api-triggers-5E6DDGX6.js +0 -31
  374. package/dist/run-agent-CAGWGTYT.js +0 -72
  375. package/dist/search-traces-4XTJYXIK.js +0 -79
  376. package/src/__tests__/agent-tools.unit.test.ts +0 -257
  377. package/src/__tests__/all-tools.integration.test.ts +0 -1872
  378. package/src/__tests__/config.unit.test.ts +0 -202
  379. package/src/__tests__/datasets.integration.test.ts +0 -620
  380. package/src/__tests__/datasets.unit.test.ts +0 -244
  381. package/src/__tests__/date-parsing.unit.test.ts +0 -78
  382. package/src/__tests__/discover-evaluator-schema.unit.test.ts +0 -89
  383. package/src/__tests__/discover-schema.unit.test.ts +0 -118
  384. package/src/__tests__/docker.integration.test.ts +0 -318
  385. package/src/__tests__/documentation-fetch-security.integration.test.ts +0 -182
  386. package/src/__tests__/evaluator-tools.unit.test.ts +0 -262
  387. package/src/__tests__/experiment-list-tools.unit.test.ts +0 -157
  388. package/src/__tests__/experiment-status.unit.test.ts +0 -194
  389. package/src/__tests__/feature-map-tool-drift.unit.test.ts +0 -93
  390. package/src/__tests__/get-experiment-results.unit.test.ts +0 -313
  391. package/src/__tests__/http-security-origin.unit.test.ts +0 -97
  392. package/src/__tests__/http-security-sessions.unit.test.ts +0 -209
  393. package/src/__tests__/http-security-verifier.unit.test.ts +0 -248
  394. package/src/__tests__/http-server-allocation.integration.test.ts +0 -279
  395. package/src/__tests__/http-server-origin.integration.test.ts +0 -169
  396. package/src/__tests__/http-server-session-auth.integration.test.ts +0 -341
  397. package/src/__tests__/http-transport.integration.test.ts +0 -395
  398. package/src/__tests__/integration.integration.test.ts +0 -284
  399. package/src/__tests__/langwatch-api.unit.test.ts +0 -661
  400. package/src/__tests__/model-provider-tools.unit.test.ts +0 -190
  401. package/src/__tests__/project-api-key-tools.unit.test.ts +0 -451
  402. package/src/__tests__/prompt-response-types.unit.test.ts +0 -51
  403. package/src/__tests__/prompts.integration.test.ts +0 -736
  404. package/src/__tests__/public-http-request-security.integration.test.ts +0 -118
  405. package/src/__tests__/report-issue.integration.test.ts +0 -147
  406. package/src/__tests__/run-plan-tools.unit.test.ts +0 -565
  407. package/src/__tests__/scenario-tools.integration.test.ts +0 -286
  408. package/src/__tests__/scenario-tools.unit.test.ts +0 -207
  409. package/src/__tests__/schemas.unit.test.ts +0 -85
  410. package/src/__tests__/simulation-run-tools.unit.test.ts +0 -116
  411. package/src/__tests__/support/http-server-harness.ts +0 -138
  412. package/src/__tests__/test-suite-tools.unit.test.ts +0 -615
  413. package/src/__tests__/tools.integration.test.ts +0 -896
  414. package/src/schemas/filter-fields.ts +0 -119
  415. package/src/schemas/index.ts +0 -9
@@ -1,7 +1,7 @@
1
1
  import { z } from "zod";
2
2
 
3
- import { makeRequest } from "./langwatch-api.js";
4
- import { requestPublicJson } from "./public-http-request.js";
3
+ import { makeRequest } from "./langwatch-api.ts";
4
+ import { requestPublicJson } from "./public-http-request.ts";
5
5
 
6
6
  /**
7
7
  * The run parameters a call carries: a flat record of scalars. The platform
@@ -106,10 +106,7 @@ export async function listAgents(params?: {
106
106
  }
107
107
 
108
108
  export async function getAgent(id: string): Promise<AgentSummary> {
109
- return makeRequest(
110
- "GET",
111
- `/api/v1/agents/${encodeURIComponent(id)}`,
112
- ) as Promise<AgentSummary>;
109
+ return makeRequest("GET", `/api/v1/agents/${encodeURIComponent(id)}`) as Promise<AgentSummary>;
113
110
  }
114
111
 
115
112
  export async function createAgent(data: {
@@ -160,10 +157,9 @@ export interface AgentTestRunResponse {
160
157
  }
161
158
 
162
159
  /**
163
- * Runs one scripted scenario against an agent: the user sends "ping", the
164
- * agent answers, and the run succeeds when the answer arrives. The project
165
- * gains no scenario, run plan or test suite, and the answer carries the run
166
- * ids to follow.
160
+ * Runs one scripted "ping" scenario against an agent and succeeds when
161
+ * the answer arrives. Creates no scenario, run plan or test suite; the
162
+ * response carries the run ids to follow.
167
163
  */
168
164
  export async function testAgent(id: string): Promise<AgentTestRunResponse> {
169
165
  return makeRequest(
@@ -177,14 +173,15 @@ const isMessageList = (value: unknown): value is AgentCallMessage[] =>
177
173
  Array.isArray(value) &&
178
174
  value.every(
179
175
  (item) =>
180
- typeof item === "object" && item !== null && typeof (item as AgentCallMessage).role === "string",
176
+ typeof item === "object" &&
177
+ item !== null &&
178
+ typeof (item as AgentCallMessage).role === "string",
181
179
  );
182
180
 
183
181
  /**
184
- * The relay body for a connected agent: `message` is one user turn, `input`
185
- * is the body itself (it must carry `messages`), `parameters` are the run
186
- * parameters and `threadId` continues a conversation. A string is the
187
- * refusal, so the tool can answer it.
182
+ * The relay body for a connected agent: `message` is one user turn,
183
+ * `input` is the raw body (must carry `messages`), `parameters` are run
184
+ * parameters, `threadId` continues a conversation. A string is a refusal.
188
185
  */
189
186
  export function buildRelayBody({
190
187
  input,
@@ -218,7 +215,7 @@ export function buildRelayBody({
218
215
  }
219
216
  inputParams = parsed.data;
220
217
  }
221
- if (inputParams || parameters) body.params = { ...(inputParams ?? {}), ...(parameters ?? {}) };
218
+ if (inputParams || parameters) body.params = { ...inputParams, ...parameters };
222
219
  return body;
223
220
  }
224
221
 
@@ -279,14 +276,14 @@ export async function runAgent({
279
276
  );
280
277
  }
281
278
 
282
- const { runWorkflow } = await import("./langwatch-api-workflows.js");
279
+ const { runWorkflow } = await import("./langwatch-api-workflows.ts");
283
280
  const result = await runWorkflow(workflowId, input);
284
281
  return { agentType: agent.type, result };
285
282
  }
286
283
 
287
284
  export async function deleteAgent(id: string): Promise<{ id: string; name: string }> {
288
- return makeRequest(
289
- "DELETE",
290
- `/api/v1/agents/${encodeURIComponent(id)}`,
291
- ) as Promise<{ id: string; name: string }>;
285
+ return makeRequest("DELETE", `/api/v1/agents/${encodeURIComponent(id)}`) as Promise<{
286
+ id: string;
287
+ name: string;
288
+ }>;
292
289
  }
@@ -1,4 +1,4 @@
1
- import { makeRequest } from "./langwatch-api.js";
1
+ import { makeRequest } from "./langwatch-api.ts";
2
2
 
3
3
  export interface AnnotationResponse {
4
4
  id?: string;
@@ -13,21 +13,20 @@ export interface AnnotationResponse {
13
13
  }
14
14
 
15
15
  export async function listAnnotations(): Promise<AnnotationResponse[]> {
16
- return makeRequest("GET", "/api/annotations") as Promise<AnnotationResponse[]>;
16
+ return makeRequest("GET", "/api/v1/annotations") as Promise<AnnotationResponse[]>;
17
17
  }
18
18
 
19
19
  export async function getAnnotation(id: string): Promise<AnnotationResponse> {
20
20
  return makeRequest(
21
21
  "GET",
22
- `/api/annotations/${encodeURIComponent(id)}`,
22
+ `/api/v1/annotations/${encodeURIComponent(id)}`,
23
23
  ) as Promise<AnnotationResponse>;
24
24
  }
25
25
 
26
26
  export async function getAnnotationsByTrace(traceId: string): Promise<AnnotationResponse[]> {
27
- return makeRequest(
28
- "GET",
29
- `/api/annotations/trace/${encodeURIComponent(traceId)}`,
30
- ) as Promise<AnnotationResponse[]>;
27
+ return makeRequest("GET", `/api/v1/annotations/trace/${encodeURIComponent(traceId)}`) as Promise<
28
+ AnnotationResponse[]
29
+ >;
31
30
  }
32
31
 
33
32
  export async function createAnnotation(
@@ -36,14 +35,14 @@ export async function createAnnotation(
36
35
  ): Promise<AnnotationResponse> {
37
36
  return makeRequest(
38
37
  "POST",
39
- `/api/annotations/trace/${encodeURIComponent(traceId)}`,
38
+ `/api/v1/annotations/trace/${encodeURIComponent(traceId)}`,
40
39
  data,
41
40
  ) as Promise<AnnotationResponse>;
42
41
  }
43
42
 
44
43
  export async function deleteAnnotation(id: string): Promise<{ status?: string; message?: string }> {
45
- return makeRequest(
46
- "DELETE",
47
- `/api/annotations/${encodeURIComponent(id)}`,
48
- ) as Promise<{ status?: string; message?: string }>;
44
+ return makeRequest("DELETE", `/api/v1/annotations/${encodeURIComponent(id)}`) as Promise<{
45
+ status?: string;
46
+ message?: string;
47
+ }>;
49
48
  }
@@ -1,4 +1,4 @@
1
- import { makeRequest } from "./langwatch-api.js";
1
+ import { makeRequest } from "./langwatch-api.ts";
2
2
 
3
3
  export interface RoleBinding {
4
4
  id: string;
@@ -28,7 +28,7 @@ export interface ApiKeyCreateResponse {
28
28
  }
29
29
 
30
30
  export async function listApiKeys(): Promise<{ data: ApiKeySummary[] }> {
31
- return makeRequest("GET", "/api/api-keys") as Promise<{ data: ApiKeySummary[] }>;
31
+ return makeRequest("GET", "/api/v1/api-keys") as Promise<{ data: ApiKeySummary[] }>;
32
32
  }
33
33
 
34
34
  export async function createApiKey(data: {
@@ -36,19 +36,18 @@ export async function createApiKey(data: {
36
36
  name: string;
37
37
  description?: string;
38
38
  expiresAt?: string;
39
- bindings?: Array<{
39
+ bindings?: {
40
40
  role: "ADMIN" | "MEMBER" | "VIEWER";
41
41
  scopeType: "ORGANIZATION" | "TEAM" | "PROJECT";
42
42
  scopeId: string;
43
- }>;
43
+ }[];
44
44
  projectIds?: string[];
45
45
  }): Promise<ApiKeyCreateResponse> {
46
- return makeRequest("POST", "/api/api-keys", data) as Promise<ApiKeyCreateResponse>;
46
+ return makeRequest("POST", "/api/v1/api-keys", data) as Promise<ApiKeyCreateResponse>;
47
47
  }
48
48
 
49
49
  export async function revokeApiKey(id: string): Promise<{ success: boolean }> {
50
- return makeRequest(
51
- "DELETE",
52
- `/api/api-keys/${encodeURIComponent(id)}`,
53
- ) as Promise<{ success: boolean }>;
50
+ return makeRequest("DELETE", `/api/v1/api-keys/${encodeURIComponent(id)}`) as Promise<{
51
+ success: boolean;
52
+ }>;
54
53
  }
@@ -0,0 +1,46 @@
1
+ import { makeRequest } from "./langwatch-api.js";
2
+
3
+ /**
4
+ * A board in the Dashboards area, the place a widget is added to
5
+ * (`modules/dashboard/contract/src/board-rest.schemas.ts`). Analytics Reports boards are
6
+ * `/api/v1/dashboards`, and hold no widget.
7
+ */
8
+ export interface Board {
9
+ id: string;
10
+ name: string;
11
+ description: string | null;
12
+ scope: "PRIVATE" | "PROJECT" | "ORGANIZATION";
13
+ createdAt: string;
14
+ updatedAt: string;
15
+ platformUrl: string;
16
+ }
17
+
18
+ export interface BoardListItem extends Board {
19
+ widgetCount: number;
20
+ }
21
+
22
+ /** The project's Dashboards boards, each with how many widgets it holds. */
23
+ export async function listBoards({
24
+ projectId,
25
+ }: {
26
+ projectId: string;
27
+ }): Promise<{ data: BoardListItem[] }> {
28
+ return makeRequest(
29
+ "GET",
30
+ `/api/v1/projects/${encodeURIComponent(projectId)}/analytics/boards`,
31
+ ) as Promise<{ data: BoardListItem[] }>;
32
+ }
33
+
34
+ /** Reads one Dashboards board; a board in another project, or only in Reports, answers 404. */
35
+ export async function getBoard({
36
+ projectId,
37
+ boardId,
38
+ }: {
39
+ projectId: string;
40
+ boardId: string;
41
+ }): Promise<Board> {
42
+ return makeRequest(
43
+ "GET",
44
+ `/api/v1/projects/${encodeURIComponent(projectId)}/analytics/boards/${encodeURIComponent(boardId)}`,
45
+ ) as Promise<Board>;
46
+ }
@@ -0,0 +1,112 @@
1
+ import { makeRequest } from "./langwatch-api.js";
2
+
3
+ /**
4
+ * One named LangWatchQL statement a widget may run, as the REST endpoint validates it
5
+ * (`modules/dashboard/contract/src/dashboard-widget-rest.schemas.ts`).
6
+ */
7
+ export interface DashboardWidgetQueryInput {
8
+ name: string;
9
+ sql: string;
10
+ parameters?: {
11
+ name: string;
12
+ type: "string" | "number" | "boolean";
13
+ default?: string | number | boolean;
14
+ }[];
15
+ }
16
+
17
+ /** Where a widget came from, as the platform records it. */
18
+ export type DashboardWidgetSource =
19
+ | { kind: "catalogue"; catalogueId: string }
20
+ | { kind: "langy" }
21
+ | { kind: "code" }
22
+ | { kind: "api" };
23
+
24
+ export interface DashboardWidgetDefinition {
25
+ version: number;
26
+ code: string;
27
+ queries: DashboardWidgetQueryInput[];
28
+ description?: string;
29
+ prompt?: string;
30
+ source?: DashboardWidgetSource;
31
+ }
32
+
33
+ export interface DashboardWidget {
34
+ id: string;
35
+ name: string;
36
+ definition: DashboardWidgetDefinition;
37
+ createdAt: string;
38
+ updatedAt: string;
39
+ platformUrl: string;
40
+ dashboardId: string | null;
41
+ gridColumn: number;
42
+ gridRow: number;
43
+ colSpan: number;
44
+ rowSpan: number;
45
+ }
46
+
47
+ /** Saves a new widget, unplaced (not yet on any dashboard). */
48
+ export async function createDashboardWidget(params: {
49
+ projectId: string;
50
+ name: string;
51
+ code: string;
52
+ queries: DashboardWidgetQueryInput[];
53
+ }): Promise<DashboardWidget> {
54
+ const { projectId, ...data } = params;
55
+ return makeRequest(
56
+ "POST",
57
+ `/api/v1/projects/${encodeURIComponent(projectId)}/analytics/dashboard-widgets`,
58
+ data,
59
+ ) as Promise<DashboardWidget>;
60
+ }
61
+
62
+ /** Reads one widget; a widget in another project answers 404. */
63
+ export async function getDashboardWidget(params: {
64
+ projectId: string;
65
+ widgetId: string;
66
+ }): Promise<DashboardWidget> {
67
+ return makeRequest(
68
+ "GET",
69
+ `/api/v1/projects/${encodeURIComponent(params.projectId)}/analytics/dashboard-widgets/${encodeURIComponent(params.widgetId)}`,
70
+ ) as Promise<DashboardWidget>;
71
+ }
72
+
73
+ /** Changes the fields given; every field left out keeps its stored value. */
74
+ export async function updateDashboardWidget(params: {
75
+ projectId: string;
76
+ widgetId: string;
77
+ name?: string;
78
+ code?: string;
79
+ queries?: DashboardWidgetQueryInput[];
80
+ description?: string;
81
+ }): Promise<DashboardWidget> {
82
+ const { projectId, widgetId, ...data } = params;
83
+ return makeRequest(
84
+ "PATCH",
85
+ `/api/v1/projects/${encodeURIComponent(projectId)}/analytics/dashboard-widgets/${encodeURIComponent(widgetId)}`,
86
+ data,
87
+ ) as Promise<DashboardWidget>;
88
+ }
89
+
90
+ /** Places an existing widget on a dashboard, at the next free row. */
91
+ export async function assignDashboardWidgetToDashboard(params: {
92
+ projectId: string;
93
+ widgetId: string;
94
+ dashboardId: string;
95
+ }): Promise<DashboardWidget> {
96
+ return makeRequest(
97
+ "POST",
98
+ `/api/v1/projects/${encodeURIComponent(params.projectId)}/analytics/dashboard-widgets/${encodeURIComponent(params.widgetId)}/dashboard`,
99
+ { dashboardId: params.dashboardId },
100
+ ) as Promise<DashboardWidget>;
101
+ }
102
+
103
+ /** Deletes a widget. Used to undo a create when placing it fails. */
104
+ export async function deleteDashboardWidget(params: {
105
+ projectId: string;
106
+ widgetId: string;
107
+ }): Promise<void> {
108
+ await makeRequest(
109
+ "DELETE",
110
+ `/api/v1/projects/${encodeURIComponent(params.projectId)}/analytics/dashboard-widgets/${encodeURIComponent(params.widgetId)}`,
111
+ );
112
+ }
@@ -1,4 +1,4 @@
1
- import { makeRequest } from "./langwatch-api.js";
1
+ import { makeRequest } from "./langwatch-api.ts";
2
2
 
3
3
  export interface DashboardSummary {
4
4
  id: string;
@@ -18,31 +18,34 @@ export interface DashboardListResponse {
18
18
  }
19
19
 
20
20
  export async function listDashboards(): Promise<DashboardListResponse> {
21
- return makeRequest("GET", "/api/dashboards") as Promise<DashboardListResponse>;
21
+ return makeRequest("GET", "/api/v1/dashboards") as Promise<DashboardListResponse>;
22
22
  }
23
23
 
24
24
  export async function getDashboard(id: string): Promise<DashboardDetail> {
25
25
  return makeRequest(
26
26
  "GET",
27
- `/api/dashboards/${encodeURIComponent(id)}`,
27
+ `/api/v1/dashboards/${encodeURIComponent(id)}`,
28
28
  ) as Promise<DashboardDetail>;
29
29
  }
30
30
 
31
31
  export async function createDashboard(data: { name: string }): Promise<DashboardDetail> {
32
- return makeRequest("POST", "/api/dashboards", data) as Promise<DashboardDetail>;
32
+ return makeRequest("POST", "/api/v1/dashboards", data) as Promise<DashboardDetail>;
33
33
  }
34
34
 
35
- export async function renameDashboard(id: string, data: { name: string }): Promise<DashboardDetail> {
35
+ export async function renameDashboard(
36
+ id: string,
37
+ data: { name: string },
38
+ ): Promise<DashboardDetail> {
36
39
  return makeRequest(
37
40
  "PATCH",
38
- `/api/dashboards/${encodeURIComponent(id)}`,
41
+ `/api/v1/dashboards/${encodeURIComponent(id)}`,
39
42
  data,
40
43
  ) as Promise<DashboardDetail>;
41
44
  }
42
45
 
43
46
  export async function deleteDashboard(id: string): Promise<{ id: string; name: string }> {
44
- return makeRequest(
45
- "DELETE",
46
- `/api/dashboards/${encodeURIComponent(id)}`,
47
- ) as Promise<{ id: string; name: string }>;
47
+ return makeRequest("DELETE", `/api/v1/dashboards/${encodeURIComponent(id)}`) as Promise<{
48
+ id: string;
49
+ name: string;
50
+ }>;
48
51
  }
@@ -1,4 +1,4 @@
1
- import { makeRequest } from "./langwatch-api.js";
1
+ import { LangWatchApiError, makeRequest } from "./langwatch-api.ts";
2
2
 
3
3
  // --- Dataset types ---
4
4
 
@@ -40,6 +40,10 @@ export interface DatasetDetailResponse {
40
40
  createdAt: string;
41
41
  updatedAt: string;
42
42
  data: DatasetRecord[];
43
+ /** Records in the dataset, when `data` is a preview of them. */
44
+ totalRecords?: number;
45
+ /** Records of the dataset left out of `data`. */
46
+ omittedRecords?: number;
43
47
  }
44
48
 
45
49
  export interface DatasetMutationResponse {
@@ -72,8 +76,16 @@ export interface DatasetRecordListResponse {
72
76
  limit: number;
73
77
  totalPages: number;
74
78
  };
79
+ /** The dataset the page belongs to. Absent on servers that do not send it. */
80
+ dataset?: DatasetMutationResponse;
75
81
  }
76
82
 
83
+ /** The most records a dataset preview holds. */
84
+ export const DATASET_PREVIEW_MAX_RECORDS = 100;
85
+
86
+ /** The most bytes of records a dataset preview holds. */
87
+ export const DATASET_PREVIEW_MAX_BYTES = 1024 * 1024;
88
+
77
89
  // --- Dataset API functions ---
78
90
 
79
91
  /** Lists all datasets in the project (paginated). */
@@ -85,18 +97,82 @@ export async function listDatasets(params?: {
85
97
  if (params?.page != null) query.set("page", String(params.page));
86
98
  if (params?.limit != null) query.set("limit", String(params.limit));
87
99
  const qs = query.toString();
88
- const path = qs ? `/api/dataset?${qs}` : "/api/dataset";
100
+ const path = qs ? `/api/v1/dataset?${qs}` : "/api/v1/dataset";
89
101
  return makeRequest("GET", path) as Promise<DatasetListResponse>;
90
102
  }
91
103
 
92
- /** Retrieves a single dataset by slug or ID, including records. */
93
- export async function getDataset(
94
- slugOrId: string,
95
- ): Promise<DatasetDetailResponse> {
96
- return makeRequest(
97
- "GET",
98
- `/api/dataset/${encodeURIComponent(slugOrId)}`,
99
- ) as Promise<DatasetDetailResponse>;
104
+ /**
105
+ * Retrieves a dataset by slug or ID with a preview of its records: the first page, cut at
106
+ * `DATASET_PREVIEW_MAX_RECORDS` records and `DATASET_PREVIEW_MAX_BYTES` bytes. A dataset of
107
+ * any size can be read this way. `omittedRecords` counts what the preview leaves out.
108
+ */
109
+ export async function getDataset(slugOrId: string): Promise<DatasetDetailResponse> {
110
+ const page = await readPreviewPage(slugOrId);
111
+ // A server without the records endpoint, or one that sends no dataset with a page, is
112
+ // asked for the whole dataset in one response.
113
+ if (!page?.dataset) {
114
+ return makeRequest(
115
+ "GET",
116
+ `/api/v1/dataset/${encodeURIComponent(slugOrId)}`,
117
+ ) as Promise<DatasetDetailResponse>;
118
+ }
119
+
120
+ const data: DatasetRecord[] = [];
121
+ let bytes = 0;
122
+ for (const record of page.data) {
123
+ bytes += JSON.stringify(record).length;
124
+ if (bytes > DATASET_PREVIEW_MAX_BYTES) break;
125
+ data.push(record);
126
+ }
127
+
128
+ const { id, name, slug, columnTypes, createdAt, updatedAt } = page.dataset;
129
+ const totalRecords = page.pagination.total;
130
+ return {
131
+ id,
132
+ name,
133
+ slug,
134
+ columnTypes,
135
+ createdAt,
136
+ updatedAt,
137
+ data,
138
+ totalRecords,
139
+ omittedRecords: Math.max(0, totalRecords - data.length),
140
+ };
141
+ }
142
+
143
+ /**
144
+ * The first page of a dataset's records, or `null` when the records endpoint answers 404. A
145
+ * page refused as too large is asked for again with the size the refusal suggests, or half.
146
+ */
147
+ async function readPreviewPage(slugOrId: string): Promise<DatasetRecordListResponse | null> {
148
+ let limit = DATASET_PREVIEW_MAX_RECORDS;
149
+ for (;;) {
150
+ try {
151
+ return await listDatasetRecords({ slugOrId, page: 1, limit });
152
+ } catch (error) {
153
+ if (!(error instanceof LangWatchApiError)) throw error;
154
+ if (error.status === 404) return null;
155
+ if (error.status !== 413 || limit <= 1) throw error;
156
+ limit = smallerLimit(limit, error.responseBody);
157
+ }
158
+ }
159
+ }
160
+
161
+ /** The page size a `dataset_page_too_large` refusal suggests, or half the refused one. */
162
+ function smallerLimit(limit: number, responseBody: string): number {
163
+ const half = Math.max(1, Math.floor(limit / 2));
164
+ try {
165
+ const suggested: unknown = (JSON.parse(responseBody) as { meta?: { suggestedLimit?: unknown } })
166
+ .meta?.suggestedLimit;
167
+ const usable =
168
+ typeof suggested === "number" &&
169
+ Number.isInteger(suggested) &&
170
+ suggested >= 1 &&
171
+ suggested < limit;
172
+ return usable ? suggested : half;
173
+ } catch {
174
+ return half;
175
+ }
100
176
  }
101
177
 
102
178
  /** Creates a new dataset. */
@@ -104,11 +180,7 @@ export async function createDataset(data: {
104
180
  name: string;
105
181
  columnTypes?: DatasetColumnType[];
106
182
  }): Promise<DatasetMutationResponse> {
107
- return makeRequest(
108
- "POST",
109
- "/api/dataset",
110
- data,
111
- ) as Promise<DatasetMutationResponse>;
183
+ return makeRequest("POST", "/api/v1/dataset", data) as Promise<DatasetMutationResponse>;
112
184
  }
113
185
 
114
186
  /** Updates an existing dataset by slug or ID. */
@@ -120,18 +192,16 @@ export async function updateDataset(params: {
120
192
  const { slugOrId, ...data } = params;
121
193
  return makeRequest(
122
194
  "PATCH",
123
- `/api/dataset/${encodeURIComponent(slugOrId)}`,
195
+ `/api/v1/dataset/${encodeURIComponent(slugOrId)}`,
124
196
  data,
125
197
  ) as Promise<DatasetMutationResponse>;
126
198
  }
127
199
 
128
200
  /** Archives (soft-deletes) a dataset by slug or ID. */
129
- export async function deleteDataset(
130
- slugOrId: string,
131
- ): Promise<DatasetArchiveResponse> {
201
+ export async function deleteDataset(slugOrId: string): Promise<DatasetArchiveResponse> {
132
202
  return makeRequest(
133
203
  "DELETE",
134
- `/api/dataset/${encodeURIComponent(slugOrId)}`,
204
+ `/api/v1/dataset/${encodeURIComponent(slugOrId)}`,
135
205
  ) as Promise<DatasetArchiveResponse>;
136
206
  }
137
207
 
@@ -141,11 +211,9 @@ export async function createDatasetRecords(params: {
141
211
  entries: Record<string, unknown>[];
142
212
  }): Promise<BatchCreateRecordsResponse> {
143
213
  const { slugOrId, entries } = params;
144
- return makeRequest(
145
- "POST",
146
- `/api/dataset/${encodeURIComponent(slugOrId)}/records`,
147
- { entries },
148
- ) as Promise<BatchCreateRecordsResponse>;
214
+ return makeRequest("POST", `/api/v1/dataset/${encodeURIComponent(slugOrId)}/records`, {
215
+ entries,
216
+ }) as Promise<BatchCreateRecordsResponse>;
149
217
  }
150
218
 
151
219
  /** Updates or creates a single record in a dataset. */
@@ -157,7 +225,7 @@ export async function updateDatasetRecord(params: {
157
225
  const { slugOrId, recordId, entry } = params;
158
226
  return makeRequest(
159
227
  "PATCH",
160
- `/api/dataset/${encodeURIComponent(slugOrId)}/records/${encodeURIComponent(recordId)}`,
228
+ `/api/v1/dataset/${encodeURIComponent(slugOrId)}/records/${encodeURIComponent(recordId)}`,
161
229
  { entry },
162
230
  ) as Promise<DatasetRecord>;
163
231
  }
@@ -168,11 +236,9 @@ export async function deleteDatasetRecords(params: {
168
236
  recordIds: string[];
169
237
  }): Promise<DeleteRecordsResponse> {
170
238
  const { slugOrId, recordIds } = params;
171
- return makeRequest(
172
- "DELETE",
173
- `/api/dataset/${encodeURIComponent(slugOrId)}/records`,
174
- { recordIds },
175
- ) as Promise<DeleteRecordsResponse>;
239
+ return makeRequest("DELETE", `/api/v1/dataset/${encodeURIComponent(slugOrId)}/records`, {
240
+ recordIds,
241
+ }) as Promise<DeleteRecordsResponse>;
176
242
  }
177
243
 
178
244
  /** Lists records in a dataset (paginated). */
@@ -186,6 +252,6 @@ export async function listDatasetRecords(params: {
186
252
  if (params.page != null) query.set("page", String(params.page));
187
253
  if (params.limit != null) query.set("limit", String(params.limit));
188
254
  const qs = query.toString();
189
- const path = `/api/dataset/${encodeURIComponent(slugOrId)}/records${qs ? `?${qs}` : ""}`;
255
+ const path = `/api/v1/dataset/${encodeURIComponent(slugOrId)}/records${qs ? `?${qs}` : ""}`;
190
256
  return makeRequest("GET", path) as Promise<DatasetRecordListResponse>;
191
257
  }
@@ -1,4 +1,4 @@
1
- import { makeRequest } from "./langwatch-api.js";
1
+ import { makeRequest } from "./langwatch-api.ts";
2
2
 
3
3
  // --- Evaluator types ---
4
4
 
@@ -13,8 +13,8 @@ export interface EvaluatorSummary {
13
13
  copiedFromEvaluatorId: string | null;
14
14
  createdAt: string;
15
15
  updatedAt: string;
16
- fields: Array<{ identifier: string; type: string; optional?: boolean }>;
17
- outputFields: Array<{ identifier: string; type: string; optional?: boolean }>;
16
+ fields: { identifier: string; type: string; optional?: boolean }[];
17
+ outputFields: { identifier: string; type: string; optional?: boolean }[];
18
18
  workflowName?: string;
19
19
  workflowIcon?: string;
20
20
  }
@@ -25,25 +25,22 @@ export interface EvaluatorSummary {
25
25
  * Extracts the evaluatorType from an evaluator's config.
26
26
  * Centralises the cast so callers don't repeat it.
27
27
  */
28
- export function getEvaluatorType(
29
- evaluator: Pick<EvaluatorSummary, "config">,
30
- ): string | undefined {
31
- return (evaluator.config as Record<string, unknown> | null)
32
- ?.evaluatorType as string | undefined;
28
+ export function getEvaluatorType(evaluator: Pick<EvaluatorSummary, "config">): string | undefined {
29
+ return (evaluator.config as Record<string, unknown> | null)?.evaluatorType as string | undefined;
33
30
  }
34
31
 
35
32
  // --- Evaluator API functions ---
36
33
 
37
34
  /** Lists all evaluators in the project. */
38
35
  export async function listEvaluators(): Promise<EvaluatorSummary[]> {
39
- return makeRequest("GET", "/api/evaluators") as Promise<EvaluatorSummary[]>;
36
+ return makeRequest("GET", "/api/v1/evaluators") as Promise<EvaluatorSummary[]>;
40
37
  }
41
38
 
42
39
  /** Retrieves a single evaluator by ID or slug. */
43
40
  export async function getEvaluator(idOrSlug: string): Promise<EvaluatorSummary> {
44
41
  return makeRequest(
45
42
  "GET",
46
- `/api/evaluators/${encodeURIComponent(idOrSlug)}`,
43
+ `/api/v1/evaluators/${encodeURIComponent(idOrSlug)}`,
47
44
  ) as Promise<EvaluatorSummary>;
48
45
  }
49
46
 
@@ -52,7 +49,7 @@ export async function createEvaluator(data: {
52
49
  name: string;
53
50
  config: Record<string, unknown>;
54
51
  }): Promise<EvaluatorSummary> {
55
- return makeRequest("POST", "/api/evaluators", data) as Promise<EvaluatorSummary>;
52
+ return makeRequest("POST", "/api/v1/evaluators", data) as Promise<EvaluatorSummary>;
56
53
  }
57
54
 
58
55
  /** Updates an existing evaluator. */
@@ -64,17 +61,14 @@ export async function updateEvaluator(params: {
64
61
  const { id, ...data } = params;
65
62
  return makeRequest(
66
63
  "PUT",
67
- `/api/evaluators/${encodeURIComponent(id)}`,
64
+ `/api/v1/evaluators/${encodeURIComponent(id)}`,
68
65
  data,
69
66
  ) as Promise<EvaluatorSummary>;
70
67
  }
71
68
 
72
69
  /** Archives (soft-deletes) an evaluator. */
73
- export async function deleteEvaluator(
74
- idOrSlug: string,
75
- ): Promise<{ id: string; archived: boolean }> {
76
- return makeRequest(
77
- "DELETE",
78
- `/api/evaluators/${encodeURIComponent(idOrSlug)}`,
79
- ) as Promise<{ id: string; archived: boolean }>;
70
+ export async function deleteEvaluator(idOrSlug: string): Promise<{ success: boolean }> {
71
+ return makeRequest("DELETE", `/api/v1/evaluators/${encodeURIComponent(idOrSlug)}`) as Promise<{
72
+ success: boolean;
73
+ }>;
80
74
  }