@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
@@ -1,5 +1,41 @@
1
- import { makeRequest } from "./langwatch-api.js";
2
- import { requestPublicJson } from "./public-http-request.js";
1
+ import { z } from "zod";
2
+
3
+ import { makeRequest } from "./langwatch-api.ts";
4
+ import { requestPublicJson } from "./public-http-request.ts";
5
+
6
+ /**
7
+ * The run parameters a call carries: a flat record of scalars. The platform
8
+ * declares run parameters as `string`, `number` or `boolean`, so a nested
9
+ * object or an array is outside the contract and is refused here.
10
+ */
11
+ export const agentCallParamsSchema = z.record(
12
+ z.string(),
13
+ z.union([z.string(), z.number(), z.boolean()]),
14
+ );
15
+
16
+ export type AgentCallParams = z.infer<typeof agentCallParamsSchema>;
17
+
18
+ /**
19
+ * One run parameter an agent declares, as the platform lists it. An agent
20
+ * never declares a secret parameter: a secret belongs to the scenario and is
21
+ * supplied per run.
22
+ */
23
+ export interface AgentParameterSpec {
24
+ name: string;
25
+ type: "string" | "number" | "boolean";
26
+ options?: string[];
27
+ default?: string | number | boolean;
28
+ description?: string;
29
+ required?: boolean;
30
+ }
31
+
32
+ /** One process connected as an instance of a connected agent. */
33
+ export interface AgentInstance {
34
+ id: string;
35
+ hostname: string;
36
+ label?: string | null;
37
+ connectedAt: string;
38
+ }
3
39
 
4
40
  export interface AgentSummary {
5
41
  id: string;
@@ -8,6 +44,19 @@ export interface AgentSummary {
8
44
  config: Record<string, unknown> | null;
9
45
  createdAt: string;
10
46
  updatedAt: string;
47
+ /** Connected agents: the environment the SDK registered under. */
48
+ environment?: string | null;
49
+ /** Connected agents: online while at least one instance is connected. */
50
+ status?: "online" | "offline" | null;
51
+ instances?: AgentInstance[];
52
+ lastSeenAt?: string | null;
53
+ owner?: { userId: string; name: string } | null;
54
+ hostLabel?: string | null;
55
+ /** Whether this key can run the agent. */
56
+ selectable?: boolean;
57
+ /** Why the agent cannot be run with this key; null when it can. */
58
+ notSelectableReason?: "owned_by_another_person" | null;
59
+ parameters?: AgentParameterSpec[];
11
60
  }
12
61
 
13
62
  export interface AgentListResponse {
@@ -20,6 +69,31 @@ export interface AgentListResponse {
20
69
  };
21
70
  }
22
71
 
72
+ /** One conversation message as the relay carries it, OpenAI style. */
73
+ export interface AgentCallMessage {
74
+ role: string;
75
+ content?: unknown;
76
+ [key: string]: unknown;
77
+ }
78
+
79
+ /** The body `POST /api/v1/agents/:id/call` takes. */
80
+ export interface AgentCallBody {
81
+ messages: AgentCallMessage[];
82
+ newMessages?: AgentCallMessage[];
83
+ threadId?: string;
84
+ params?: AgentCallParams;
85
+ session?: unknown;
86
+ traceparent?: string;
87
+ }
88
+
89
+ /** The reply of the relay: the function's output and the instance that ran it. */
90
+ export interface AgentCallResponse {
91
+ output: unknown;
92
+ session?: unknown;
93
+ instance: { hostname: string; label?: string | null };
94
+ durationMs: number;
95
+ }
96
+
23
97
  export async function listAgents(params?: {
24
98
  page?: number;
25
99
  limit?: number;
@@ -28,14 +102,11 @@ export async function listAgents(params?: {
28
102
  if (params?.page) query.set("page", String(params.page));
29
103
  if (params?.limit) query.set("limit", String(params.limit));
30
104
  const qs = query.toString() ? `?${query}` : "";
31
- return makeRequest("GET", `/api/agents${qs}`) as Promise<AgentListResponse>;
105
+ return makeRequest("GET", `/api/v1/agents${qs}`) as Promise<AgentListResponse>;
32
106
  }
33
107
 
34
108
  export async function getAgent(id: string): Promise<AgentSummary> {
35
- return makeRequest(
36
- "GET",
37
- `/api/agents/${encodeURIComponent(id)}`,
38
- ) as Promise<AgentSummary>;
109
+ return makeRequest("GET", `/api/v1/agents/${encodeURIComponent(id)}`) as Promise<AgentSummary>;
39
110
  }
40
111
 
41
112
  export async function createAgent(data: {
@@ -43,7 +114,7 @@ export async function createAgent(data: {
43
114
  type: string;
44
115
  config: Record<string, unknown>;
45
116
  }): Promise<AgentSummary> {
46
- return makeRequest("POST", "/api/agents", data) as Promise<AgentSummary>;
117
+ return makeRequest("POST", "/api/v1/agents", data) as Promise<AgentSummary>;
47
118
  }
48
119
 
49
120
  export async function updateAgent(params: {
@@ -55,22 +126,132 @@ export async function updateAgent(params: {
55
126
  const { id, ...data } = params;
56
127
  return makeRequest(
57
128
  "PATCH",
58
- `/api/agents/${encodeURIComponent(id)}`,
129
+ `/api/v1/agents/${encodeURIComponent(id)}`,
59
130
  data,
60
131
  ) as Promise<AgentSummary>;
61
132
  }
62
133
 
63
134
  /**
64
- * Run an agent. For HTTP agents, calls the configured URL directly.
65
- * For workflow-linked agents, calls the workflow run endpoint.
135
+ * Runs one turn of a connected agent through the relay: the platform
136
+ * dispatches it to a live instance and answers with the function's output.
66
137
  */
67
- export async function runAgent(
68
- id: string,
69
- input?: Record<string, unknown>,
70
- ): Promise<{ agentType: string; result: Record<string, unknown> }> {
138
+ export async function callAgent({
139
+ id,
140
+ body,
141
+ }: {
142
+ id: string;
143
+ body: AgentCallBody;
144
+ }): Promise<AgentCallResponse> {
145
+ return makeRequest(
146
+ "POST",
147
+ `/api/v1/agents/${encodeURIComponent(id)}/call`,
148
+ body,
149
+ ) as Promise<AgentCallResponse>;
150
+ }
151
+
152
+ /** The ids `POST /api/v1/agents/:id/test` answers with. */
153
+ export interface AgentTestRunResponse {
154
+ scenarioRunId: string;
155
+ batchRunId: string;
156
+ setId: string;
157
+ }
158
+
159
+ /**
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.
163
+ */
164
+ export async function testAgent(id: string): Promise<AgentTestRunResponse> {
165
+ return makeRequest(
166
+ "POST",
167
+ `/api/v1/agents/${encodeURIComponent(id)}/test`,
168
+ {},
169
+ ) as Promise<AgentTestRunResponse>;
170
+ }
171
+
172
+ const isMessageList = (value: unknown): value is AgentCallMessage[] =>
173
+ Array.isArray(value) &&
174
+ value.every(
175
+ (item) =>
176
+ typeof item === "object" &&
177
+ item !== null &&
178
+ typeof (item as AgentCallMessage).role === "string",
179
+ );
180
+
181
+ /**
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.
185
+ */
186
+ export function buildRelayBody({
187
+ input,
188
+ message,
189
+ parameters,
190
+ threadId,
191
+ }: {
192
+ input: Record<string, unknown>;
193
+ message?: string;
194
+ parameters?: AgentCallParams;
195
+ threadId?: string;
196
+ }): AgentCallBody | string {
197
+ let messages: AgentCallMessage[];
198
+ if (message !== undefined) {
199
+ messages = [{ role: "user", content: message }];
200
+ } else if (isMessageList(input.messages)) {
201
+ messages = input.messages;
202
+ } else {
203
+ return "a connected agent takes a conversation: give `message`, or `input` with a `messages` list.";
204
+ }
205
+ const body: AgentCallBody = { messages };
206
+ const thread = threadId ?? (typeof input.threadId === "string" ? input.threadId : undefined);
207
+ if (thread) body.threadId = thread;
208
+ if (isMessageList(input.newMessages)) body.newMessages = input.newMessages;
209
+ if (input.session !== undefined) body.session = input.session;
210
+ let inputParams: AgentCallParams | undefined;
211
+ if (input.params !== undefined) {
212
+ const parsed = agentCallParamsSchema.safeParse(input.params);
213
+ if (!parsed.success) {
214
+ return "`params` takes one flat object of string, number or boolean values. Nested objects and arrays are not run parameters.";
215
+ }
216
+ inputParams = parsed.data;
217
+ }
218
+ if (inputParams || parameters) body.params = { ...inputParams, ...parameters };
219
+ return body;
220
+ }
221
+
222
+ /**
223
+ * Run an agent. A connected agent runs one turn through the relay; an HTTP
224
+ * agent is called at its URL; a workflow-linked agent runs on the workflow
225
+ * engine.
226
+ */
227
+ export async function runAgent({
228
+ id,
229
+ input,
230
+ message,
231
+ parameters,
232
+ threadId,
233
+ }: {
234
+ id: string;
235
+ input?: Record<string, unknown>;
236
+ message?: string;
237
+ parameters?: AgentCallParams;
238
+ threadId?: string;
239
+ }): Promise<{ agentType: string; result: Record<string, unknown> }> {
71
240
  const agent = await getAgent(id);
72
241
  const config = agent.config ?? {};
73
242
 
243
+ if (agent.type === "connected") {
244
+ const body = buildRelayBody({ input: input ?? {}, message, parameters, threadId });
245
+ if (typeof body === "string") throw new Error(body);
246
+ if (agent.status === "offline") {
247
+ throw new Error(
248
+ `Agent "${agent.name}" is offline. Start the process that calls connectAgent (or connect_agent) and try again.`,
249
+ );
250
+ }
251
+ const result = await callAgent({ id: agent.id, body });
252
+ return { agentType: "connected", result: result as unknown as Record<string, unknown> };
253
+ }
254
+
74
255
  if (agent.type === "http") {
75
256
  const url = (config as Record<string, unknown>).url as string | undefined;
76
257
  if (!url) {
@@ -91,18 +272,18 @@ export async function runAgent(
91
272
  if (!workflowId) {
92
273
  throw new Error(
93
274
  `Agent "${agent.name}" (type: ${agent.type}) cannot be executed directly. ` +
94
- `Only HTTP agents and workflow-linked agents can be run.`,
275
+ `Only connected agents, HTTP agents and workflow-linked agents can be run.`,
95
276
  );
96
277
  }
97
278
 
98
- const { runWorkflow } = await import("./langwatch-api-workflows.js");
279
+ const { runWorkflow } = await import("./langwatch-api-workflows.ts");
99
280
  const result = await runWorkflow(workflowId, input);
100
281
  return { agentType: agent.type, result };
101
282
  }
102
283
 
103
284
  export async function deleteAgent(id: string): Promise<{ id: string; name: string }> {
104
- return makeRequest(
105
- "DELETE",
106
- `/api/agents/${encodeURIComponent(id)}`,
107
- ) as Promise<{ id: string; name: string }>;
285
+ return makeRequest("DELETE", `/api/v1/agents/${encodeURIComponent(id)}`) as Promise<{
286
+ id: string;
287
+ name: string;
288
+ }>;
108
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
  }