@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.
- package/.gitignore +7 -0
- package/.npmignore +41 -0
- package/CHANGELOG.md +280 -200
- package/CONTRIBUTING.md +10 -0
- package/README.md +82 -52
- package/dist/add-dashboard-widget-4ZC5UN73.js +50 -0
- package/dist/add-dashboard-widget-ACC6QYBG.js +49 -0
- package/dist/archive-project-KWFM3I5Z.js +19 -0
- package/dist/{archive-project-4EQGLBJJ.js → archive-project-SPVHXK6A.js} +4 -4
- package/dist/archive-run-plan-65QN3XRX.js +16 -0
- package/dist/archive-run-plan-Z4SYE6BP.js +15 -0
- package/dist/{archive-scenario-W6BXYDZ3.js → archive-scenario-A6QV5LOW.js} +4 -4
- package/dist/archive-scenario-FXEYQNEH.js +19 -0
- package/dist/archive-test-suite-5ADQ3KPQ.js +15 -0
- package/dist/archive-test-suite-NKZDZY3D.js +16 -0
- package/dist/assign-prompt-tag-5IUZXJ2T.js +23 -0
- package/dist/{assign-prompt-tag-VLXUWEKU.js → assign-prompt-tag-HBZLBIFD.js} +8 -4
- package/dist/{chunk-CDYQOY5U.js → chunk-3OCG3QPU.js} +7 -10
- package/dist/chunk-3YLN3ATJ.js +241 -0
- package/dist/chunk-5FNCQRCX.js +91 -0
- package/dist/chunk-6YZUOD34.js +55 -0
- package/dist/{chunk-WVI5CJ6S.js → chunk-7AQLPVFL.js} +2 -2
- package/dist/chunk-7VNSRCXO.js +129 -0
- package/dist/{chunk-7RHG56OH.js → chunk-B4J3PJLX.js} +11 -10
- package/dist/{chunk-ZXKLPC2E.js → chunk-BIIKE3EI.js} +1 -1
- package/dist/{chunk-37SMPMQS.js → chunk-DMM3JQ42.js} +7 -2
- package/dist/{chunk-NUFPTHKU.js → chunk-FOKVY3BK.js} +1 -1
- package/dist/{chunk-WT4PO4A3.js → chunk-H6WGMG2T.js} +10 -7
- package/dist/{chunk-TOXJQDIZ.js → chunk-HGELNIVY.js} +135 -51
- package/dist/{chunk-UJPXFA26.js → chunk-HHMNZAPD.js} +101 -74
- package/dist/{chunk-J42FWRJ2.js → chunk-I7ATIZED.js} +7 -7
- package/dist/{chunk-AQJO2EI5.js → chunk-ILZDO25L.js} +7 -10
- package/dist/{chunk-4QC7SA2L.js → chunk-J7PQKBLD.js} +884 -559
- package/dist/{chunk-YX3A3CFM.js → chunk-JRJPH75H.js} +7 -13
- package/dist/chunk-K2I7Z3LZ.js +28 -0
- package/dist/{chunk-5CCZFUXS.js → chunk-NKMTIHIJ.js} +6 -9
- package/dist/chunk-O7EMWEVJ.js +44 -0
- package/dist/chunk-PTDR56Z3.js +37 -0
- package/dist/chunk-RABYBFX5.js +43 -0
- package/dist/chunk-SUPUUC4W.js +64 -0
- package/dist/{chunk-SFB4MU6H.js → chunk-SXFC3FNH.js} +4 -4
- package/dist/chunk-U24EACC4.js +67 -0
- package/dist/chunk-UNJM3BIL.js +21 -0
- package/dist/{chunk-ZWIL4EFL.js → chunk-UTJCWXPZ.js} +4 -4
- package/dist/chunk-UWLE5T2F.js +312 -0
- package/dist/chunk-VMWJD732.js +57 -0
- package/dist/chunk-XUIJYNRJ.js +15 -0
- package/dist/chunk-Y34DHR5K.js +67 -0
- package/dist/chunk-YCARO42Z.js +516 -0
- package/dist/config-EAKW6F26.js +16 -0
- package/dist/config.cjs +109 -0
- package/dist/config.js +5 -4
- package/dist/{create-agent-7XHO6UIS.js → create-agent-AYZ3LB3V.js} +4 -4
- package/dist/create-agent-S5ZBCEFT.js +23 -0
- package/dist/create-annotation-LHNCLHYP.js +29 -0
- package/dist/{create-annotation-YQXRQC6A.js → create-annotation-VUSXULQK.js} +10 -5
- package/dist/{create-api-key-YUS36KBU.js → create-api-key-NNYKARMG.js} +5 -7
- package/dist/create-api-key-T4KSNPKB.js +24 -0
- package/dist/create-dashboard-DHVFMEU4.js +18 -0
- package/dist/{create-dashboard-4Z5JO5LB.js → create-dashboard-WTKKS5Z6.js} +4 -4
- package/dist/{create-dataset-E6NMSVX7.js → create-dataset-2MC4SD4O.js} +6 -6
- package/dist/create-dataset-LUP5PVDM.js +22 -0
- package/dist/create-dataset-records-NSKBZP3G.js +20 -0
- package/dist/{create-dataset-records-SKHPRD2K.js → create-dataset-records-W4GLN2FV.js} +5 -7
- package/dist/{create-evaluator-JXF5PF33.js → create-evaluator-643G6LXL.js} +4 -4
- package/dist/create-evaluator-HMTYO5SS.js +27 -0
- package/dist/create-mcp-server.cjs +9513 -0
- package/dist/create-mcp-server.js +2647 -5
- package/dist/create-project-6N7PIYRY.js +44 -0
- package/dist/{create-project-CS2CB57Y.js → create-project-KAIC46UY.js} +4 -4
- package/dist/{create-prompt-F5RMX3L3.js → create-prompt-E67LXIYT.js} +5 -7
- package/dist/create-prompt-PKJ7EDRR.js +37 -0
- package/dist/create-prompt-tag-4YO3FSJ3.js +17 -0
- package/dist/{create-prompt-tag-GMRWTEFR.js → create-prompt-tag-OPQUEXWB.js} +3 -3
- package/dist/create-scenario-5PJBMAXO.js +33 -0
- package/dist/{create-scenario-JDR2VB2H.js → create-scenario-UEM77OE7.js} +11 -4
- package/dist/create-test-suite-4IPXVSFQ.js +37 -0
- package/dist/create-test-suite-SZEPVXSE.js +36 -0
- package/dist/create-trigger-5HZSCRAN.js +49 -0
- package/dist/create-trigger-PRELMT6J.js +48 -0
- package/dist/delete-agent-JUIZWAXG.js +18 -0
- package/dist/{delete-agent-O3EEH4S5.js → delete-agent-QMEK3XHK.js} +4 -4
- package/dist/delete-annotation-HY3O2OGR.js +17 -0
- package/dist/{delete-annotation-XP6FQM7A.js → delete-annotation-VKIQWUYW.js} +4 -4
- package/dist/delete-dashboard-76N66XXL.js +18 -0
- package/dist/{delete-dashboard-RFUNYCNP.js → delete-dashboard-JVIVHNJM.js} +4 -4
- package/dist/delete-dataset-HQCR66MG.js +18 -0
- package/dist/{delete-dataset-3MJFRDLP.js → delete-dataset-WKRUW4FP.js} +5 -7
- package/dist/{delete-dataset-records-WPMU5GL5.js → delete-dataset-records-C2IQFFVQ.js} +5 -7
- package/dist/delete-dataset-records-SDUHQLLM.js +19 -0
- package/dist/delete-evaluator-4SNSCLEE.js +16 -0
- package/dist/delete-evaluator-QP3QHTLN.js +15 -0
- package/dist/delete-prompt-tag-NZ4JQMYG.js +17 -0
- package/dist/{delete-prompt-tag-KNMZVSPB.js → delete-prompt-tag-YYQ4VMAD.js} +3 -3
- package/dist/{delete-workflow-3NUXO46U.js → delete-workflow-5J46T73T.js} +4 -4
- package/dist/delete-workflow-JSWABL5F.js +17 -0
- package/dist/discover-evaluator-schema-UHWA5HVL.js +120 -0
- package/dist/discover-evaluator-schema-XKCLLCB3.js +118 -0
- package/dist/discover-scenario-schema-NOJY6S7E.js +137 -0
- package/dist/discover-scenario-schema-OOFIQKOG.js +139 -0
- package/dist/{discover-schema-L6QDPON3.js → discover-schema-55YJBFGQ.js} +181 -186
- package/dist/discover-schema-A33SLMXW.js +442 -0
- package/dist/get-agent-LJQX7OF4.js +69 -0
- package/dist/get-agent-OTIYUFZA.js +70 -0
- package/dist/get-analytics-DCS72353.js +80 -0
- package/dist/get-analytics-IQZKJHLW.js +79 -0
- package/dist/get-dashboard-5NYJEIX2.js +29 -0
- package/dist/{get-dashboard-KHBEGZGL.js → get-dashboard-QMTYDQAZ.js} +4 -4
- package/dist/get-dataset-ALSP7RTX.js +64 -0
- package/dist/get-dataset-X4B5JDG2.js +63 -0
- package/dist/{get-evaluator-ADMKVWYZ.js → get-evaluator-ISMC4LLI.js} +4 -4
- package/dist/get-evaluator-XEUZGZCH.js +47 -0
- package/dist/{get-project-RAK7URQJ.js → get-project-5VKROSDH.js} +4 -4
- package/dist/get-project-RM6FRCBK.js +26 -0
- package/dist/get-prompt-OWXJZHQQ.js +95 -0
- package/dist/get-prompt-W52DY36E.js +94 -0
- package/dist/get-run-plan-BE3M2AUX.js +59 -0
- package/dist/get-run-plan-RUXQ6PAX.js +58 -0
- package/dist/get-scenario-RNM7BAX2.js +37 -0
- package/dist/{get-scenario-ZTAJJL5T.js → get-scenario-YM4ODWW6.js} +8 -4
- package/dist/get-simulation-run-6GIATQE5.js +69 -0
- package/dist/{get-simulation-run-T2ZQWYH2.js → get-simulation-run-LCFSMPGQ.js} +33 -20
- package/dist/get-test-suite-GC2O7YH6.js +49 -0
- package/dist/get-test-suite-P5LJ6VLF.js +48 -0
- package/dist/get-trace-KBRVV4NN.js +45 -0
- package/dist/{get-trace-K7U234Q4.js → get-trace-SEF3FMR5.js} +11 -13
- package/dist/get-workflow-7PVED7JE.js +25 -0
- package/dist/{get-workflow-L5L2PSK3.js → get-workflow-YXULW4GC.js} +4 -4
- package/dist/{http-security-EU3CHTY7.js → http-security-DNLBNQZL.js} +2 -2
- package/dist/{http-server-YXHFPPGA.js → http-server-IR4QOS43.js} +4071 -342
- package/dist/index.js +60221 -38077
- package/dist/langwatch-api-annotations-6SA4OB4C.js +17 -0
- package/dist/{langwatch-api-annotations-FDAS6NQ7.js → langwatch-api-annotations-TBHLCQ5R.js} +4 -4
- package/dist/langwatch-api-dashboards-6EO2VVZW.js +17 -0
- package/dist/{langwatch-api-dashboards-JTVCS7ZJ.js → langwatch-api-dashboards-NHU5BZD7.js} +4 -4
- package/dist/langwatch-api-monitors-CBF3FGIM.js +47 -0
- package/dist/{langwatch-api-monitors-3J7UIQME.js → langwatch-api-monitors-YNWA2M5Y.js} +11 -16
- package/dist/langwatch-api-secrets-ADTOJELP.js +56 -0
- package/dist/langwatch-api-secrets-RNFO4LF2.js +55 -0
- package/dist/langwatch-api-triggers-KQDQC6L5.js +22 -0
- package/dist/langwatch-api-triggers-QS7HDIVW.js +23 -0
- package/dist/{langwatch-api-workflows-NBJX5KOG.js → langwatch-api-workflows-OKC4FXIF.js} +4 -4
- package/dist/langwatch-api-workflows-XGJE6SR5.js +15 -0
- package/dist/list-agents-HVYWEQMI.js +43 -0
- package/dist/list-agents-RBAOCF53.js +42 -0
- package/dist/list-annotations-HJH4NBLD.js +38 -0
- package/dist/{list-annotations-ZTVP4EEL.js → list-annotations-J4UAHSUN.js} +10 -5
- package/dist/{list-api-keys-CWD4UQT5.js → list-api-keys-7UTJRZDG.js} +10 -5
- package/dist/list-api-keys-A2PMV435.js +42 -0
- package/dist/list-dashboard-boards-OPWROHMG.js +33 -0
- package/dist/list-dashboard-boards-U2GJ7GC5.js +34 -0
- package/dist/{list-dashboards-PWG6P6KR.js → list-dashboards-ROSYFLDQ.js} +4 -4
- package/dist/list-dashboards-RQ635ZU7.js +32 -0
- package/dist/{list-dataset-records-IOE7LQXS.js → list-dataset-records-M5TKA6LK.js} +14 -10
- package/dist/list-dataset-records-WFM7F33C.js +43 -0
- package/dist/{list-datasets-ZT4JYUDT.js → list-datasets-B5X4P7BQ.js} +9 -13
- package/dist/list-datasets-THUKQHPX.js +56 -0
- package/dist/{list-evaluators-SJHC7VBH.js → list-evaluators-MYH2OVCI.js} +5 -7
- package/dist/list-evaluators-NLVWF6K7.js +32 -0
- package/dist/{list-model-providers-PPD2WPD2.js → list-model-providers-3JUGP4YI.js} +4 -4
- package/dist/list-model-providers-H3XKORFO.js +35 -0
- package/dist/{list-projects-K7QAIX2I.js → list-projects-6EJ5YYEW.js} +5 -7
- package/dist/list-projects-YNNSRMLC.js +40 -0
- package/dist/{list-prompt-tags-FOO6TNHB.js → list-prompt-tags-NVFQO6WX.js} +3 -3
- package/dist/list-prompt-tags-XUQTTAH4.js +23 -0
- package/dist/{list-prompts-SC2HAUFG.js → list-prompts-HSIMMHTF.js} +4 -6
- package/dist/list-prompts-IRI6AIXO.js +30 -0
- package/dist/list-run-plans-PX2XI6EK.js +46 -0
- package/dist/list-run-plans-QALLCN2K.js +45 -0
- package/dist/list-scenarios-QZRPVHS4.js +46 -0
- package/dist/list-scenarios-SSJQEMJP.js +45 -0
- package/dist/list-simulation-runs-KNOLGMDV.js +53 -0
- package/dist/{list-simulation-runs-KF5THG5H.js → list-simulation-runs-OEADLLQR.js} +19 -9
- package/dist/list-test-suites-ANAQBLDG.js +34 -0
- package/dist/list-test-suites-N4WVLBKK.js +35 -0
- package/dist/list-trigger-fires-JV3WFYYG.js +19 -0
- package/dist/list-trigger-fires-WTW4DVIW.js +20 -0
- package/dist/list-triggers-SQNIG35Q.js +45 -0
- package/dist/list-triggers-V4Y356AK.js +46 -0
- package/dist/{list-workflows-QSJWURCK.js → list-workflows-IMSX7SXU.js} +5 -7
- package/dist/list-workflows-ZHTX5LCL.js +33 -0
- package/dist/{rename-prompt-tag-EKWU5QF3.js → rename-prompt-tag-IQI7MHOI.js} +3 -3
- package/dist/rename-prompt-tag-PA2BRIE6.js +18 -0
- package/dist/rename-test-suite-4J7UX5S2.js +21 -0
- package/dist/rename-test-suite-NNVLMLKY.js +20 -0
- package/dist/report-issue-AS34ZMJF.js +898 -0
- package/dist/report-issue-DCZFLGDO.js +899 -0
- package/dist/rerun-run-plan-TG2V4WM4.js +22 -0
- package/dist/rerun-run-plan-ZI5OY3VA.js +21 -0
- package/dist/revoke-api-key-3J3ZA4UB.js +15 -0
- package/dist/{revoke-api-key-FTRTZMOF.js → revoke-api-key-SFMEFWJC.js} +4 -4
- package/dist/run-agent-W4VJP72Z.js +75 -0
- package/dist/run-agent-YNV6ZHW4.js +74 -0
- package/dist/run-plan-6C77GWG4.js +38 -0
- package/dist/run-plan-PAARQSI4.js +39 -0
- package/dist/run-query-KJDH544C.js +47 -0
- package/dist/run-query-T4QW2Z5O.js +46 -0
- package/dist/run-test-suite-SQJELEZX.js +26 -0
- package/dist/run-test-suite-STB6NUJM.js +25 -0
- package/dist/{run-workflow-QPXC627O.js → run-workflow-D6PQNBI6.js} +4 -4
- package/dist/{run-agent-6SM4XNA7.js → run-workflow-SP32SO5M.js} +10 -11
- package/dist/search-traces-HCBGOG6R.js +170 -0
- package/dist/search-traces-HSTQ6WTQ.js +171 -0
- package/dist/{set-model-provider-3WKT63ZN.js → set-model-provider-GF7NXUJA.js} +4 -4
- package/dist/set-model-provider-KDQ7C4EZ.js +33 -0
- package/dist/{update-agent-SMAEHLXH.js → update-agent-DWG43T2P.js} +4 -4
- package/dist/update-agent-MXNOBS4H.js +20 -0
- package/dist/update-dashboard-widget-CJKJLCDY.js +71 -0
- package/dist/update-dashboard-widget-CYQDS2NR.js +70 -0
- package/dist/update-dataset-DQH3OHOU.js +22 -0
- package/dist/{update-dataset-BDUK7TUO.js → update-dataset-SQZ6T4WX.js} +6 -6
- package/dist/{update-dataset-record-4ZSDRBSW.js → update-dataset-record-3AT4IPBC.js} +4 -4
- package/dist/update-dataset-record-7PLDGTMR.js +19 -0
- package/dist/update-evaluator-4LFTKFPT.js +24 -0
- package/dist/{update-evaluator-LS6TIBY7.js → update-evaluator-IGTX6PX4.js} +4 -4
- package/dist/{update-project-LKVYXENH.js → update-project-PLJIOZS6.js} +4 -4
- package/dist/update-project-QVHSJRUP.js +24 -0
- package/dist/update-prompt-GDKRYJI3.js +140 -0
- package/dist/update-prompt-MY263DYF.js +141 -0
- package/dist/update-scenario-7KA3JDXA.js +34 -0
- package/dist/{update-scenario-NEXCAQI7.js → update-scenario-MOHRQKAQ.js} +11 -4
- package/package.json +39 -44
- package/pyproject.toml +8 -8
- package/src/config.d.ts +4 -0
- package/src/config.ts +20 -29
- package/src/create-mcp-server.ts +1021 -596
- package/src/documentation-fetch.ts +21 -20
- package/src/http-security.ts +166 -135
- package/src/http-server.ts +189 -224
- package/src/index.ts +14 -16
- package/src/langwatch-api-agents.ts +202 -21
- package/src/langwatch-api-annotations.ts +11 -12
- package/src/langwatch-api-api-keys.ts +8 -9
- package/src/langwatch-api-boards.ts +46 -0
- package/src/langwatch-api-dashboard-widgets.ts +112 -0
- package/src/langwatch-api-dashboards.ts +13 -10
- package/src/langwatch-api-datasets.ts +98 -32
- package/src/langwatch-api-evaluators.ts +13 -19
- package/src/langwatch-api-model-providers.ts +4 -4
- package/src/langwatch-api-monitors.ts +14 -18
- package/src/langwatch-api-projects.ts +27 -9
- package/src/langwatch-api-query.ts +114 -0
- package/src/langwatch-api-run-plans.ts +140 -0
- package/src/langwatch-api-scenarios.ts +17 -10
- package/src/langwatch-api-secrets.ts +31 -24
- package/src/langwatch-api-simulation-runs.ts +10 -7
- package/src/langwatch-api-test-suites.ts +116 -0
- package/src/langwatch-api-triggers.ts +96 -34
- package/src/langwatch-api-workflows.ts +9 -9
- package/src/langwatch-api.ts +143 -109
- package/src/public-http-request.ts +21 -12
- package/src/schemas/analytics-metrics.ts +3 -15
- package/src/schemas/create-dataset.ts +3 -4
- package/src/schemas/run-plan.ts +76 -0
- package/src/schemas/suite-fields.ts +132 -0
- package/src/schemas/triggers.ts +365 -0
- package/src/tools/add-dashboard-widget.ts +63 -0
- package/src/tools/archive-project.ts +2 -4
- package/src/tools/archive-run-plan.ts +10 -0
- package/src/tools/archive-scenario.ts +2 -4
- package/src/tools/archive-test-suite.ts +10 -0
- package/src/tools/assign-prompt-tag.ts +6 -2
- package/src/tools/create-agent.ts +1 -1
- package/src/tools/create-annotation.ts +7 -2
- package/src/tools/create-api-key.ts +4 -6
- package/src/tools/create-dashboard.ts +1 -1
- package/src/tools/create-dataset-records.ts +4 -8
- package/src/tools/create-dataset.ts +5 -7
- package/src/tools/create-evaluator.ts +3 -5
- package/src/tools/create-project.ts +2 -2
- package/src/tools/create-prompt-tag.ts +2 -4
- package/src/tools/create-prompt.ts +9 -18
- package/src/tools/create-scenario.ts +11 -5
- package/src/tools/create-test-suite.ts +38 -0
- package/src/tools/create-trigger.ts +55 -0
- package/src/tools/dashboard-exists.ts +25 -0
- package/src/tools/dashboard-widget-queries.ts +32 -0
- package/src/tools/delete-agent.ts +1 -1
- package/src/tools/delete-annotation.ts +1 -1
- package/src/tools/delete-dashboard.ts +1 -1
- package/src/tools/delete-dataset-records.ts +4 -8
- package/src/tools/delete-dataset.ts +3 -7
- package/src/tools/delete-evaluator.ts +4 -6
- package/src/tools/delete-prompt-tag.ts +2 -4
- package/src/tools/delete-workflow.ts +1 -1
- package/src/tools/discover-evaluator-schema.ts +34 -25
- package/src/tools/discover-scenario-schema.ts +86 -12
- package/src/tools/discover-schema.ts +149 -27
- package/src/tools/experiment-run-status.ts +2 -8
- package/src/tools/format-dataset-mutation.ts +5 -10
- package/src/tools/format-run-plan.ts +54 -0
- package/src/tools/format-scenario.ts +12 -0
- package/src/tools/format-suite-details.ts +90 -0
- package/src/tools/get-agent.ts +54 -3
- package/src/tools/get-analytics.ts +52 -46
- package/src/tools/get-dashboard.ts +1 -1
- package/src/tools/get-dataset.ts +34 -16
- package/src/tools/get-evaluator.ts +4 -11
- package/src/tools/get-experiment-results.ts +219 -186
- package/src/tools/get-project.ts +2 -4
- package/src/tools/get-prompt.ts +100 -37
- package/src/tools/get-run-plan.ts +60 -0
- package/src/tools/get-scenario.ts +6 -5
- package/src/tools/get-simulation-run.ts +32 -20
- package/src/tools/get-test-suite.ts +46 -0
- package/src/tools/get-trace.ts +16 -17
- package/src/tools/get-workflow.ts +1 -1
- package/src/tools/list-agents.ts +20 -3
- package/src/tools/list-annotations.ts +8 -5
- package/src/tools/list-api-keys.ts +7 -2
- package/src/tools/list-dashboard-boards.ts +28 -0
- package/src/tools/list-dashboards.ts +1 -1
- package/src/tools/list-dataset-records.ts +8 -6
- package/src/tools/list-datasets.ts +12 -23
- package/src/tools/list-evaluators.ts +4 -8
- package/src/tools/list-experiment-runs.ts +5 -9
- package/src/tools/list-experiments.ts +5 -11
- package/src/tools/list-model-providers.ts +3 -5
- package/src/tools/list-projects.ts +2 -4
- package/src/tools/list-prompt-tags.ts +3 -3
- package/src/tools/list-prompts.ts +4 -8
- package/src/tools/list-run-plans.ts +47 -0
- package/src/tools/list-scenarios.ts +26 -17
- package/src/tools/list-simulation-runs.ts +13 -5
- package/src/tools/list-test-suites.ts +35 -0
- package/src/tools/list-trigger-fires.ts +17 -0
- package/src/tools/list-triggers.ts +39 -0
- package/src/tools/list-workflows.ts +2 -4
- package/src/tools/rename-prompt-tag.ts +1 -1
- package/src/tools/rename-test-suite.ts +15 -0
- package/src/tools/report-issue.ts +5 -9
- package/src/tools/rerun-run-plan.ts +18 -0
- package/src/tools/revoke-api-key.ts +2 -4
- package/src/tools/run-agent.ts +65 -14
- package/src/tools/run-experiment.ts +36 -37
- package/src/tools/run-plan.ts +46 -0
- package/src/tools/run-query.ts +47 -0
- package/src/tools/run-test-suite.ts +27 -0
- package/src/tools/run-workflow.ts +2 -5
- package/src/tools/search-traces.ts +161 -47
- package/src/tools/set-model-provider.ts +4 -6
- package/src/tools/test-agent.ts +18 -0
- package/src/tools/update-agent.ts +1 -1
- package/src/tools/update-dashboard-widget.ts +97 -0
- package/src/tools/update-dataset-record.ts +1 -1
- package/src/tools/update-dataset.ts +5 -7
- package/src/tools/update-evaluator.ts +3 -5
- package/src/tools/update-project.ts +1 -1
- package/src/tools/update-prompt.ts +185 -15
- package/src/tools/update-scenario.ts +11 -5
- package/src/tools/update-test-suite.ts +40 -0
- package/src/utils/date-parsing.ts +1 -1
- package/src/utils/escape-markdown.ts +3 -8
- package/src/utils/format-evaluations.ts +6 -6
- package/src/utils/markdown-table.ts +58 -0
- package/src/utils/trace-id-shape.ts +20 -0
- package/tsconfig.app.json +24 -0
- package/tsconfig.json +19 -12
- package/uv.lock +416 -296
- package/vitest.integration.config.js +10 -0
- package/vitest.scenario.config.js +9 -0
- package/.eslintrc.cjs +0 -36
- package/dist/archive-suite-4T6BSRS7.js +0 -16
- package/dist/chunk-77BNWQ3U.js +0 -86
- package/dist/chunk-A2LEVYQ5.js +0 -217
- package/dist/chunk-TJCXFNDT.js +0 -24
- package/dist/chunk-YZLYHLLI.js +0 -48
- package/dist/config.d.ts +0 -17
- package/dist/create-mcp-server.d.ts +0 -10
- package/dist/create-suite-LZS6QIAF.js +0 -39
- package/dist/delete-evaluator-33SP2JFX.js +0 -16
- package/dist/discover-evaluator-schema-XTAD4X7D.js +0 -2191
- package/dist/discover-scenario-schema-FE64QK2D.js +0 -67
- package/dist/get-agent-Y7MWZ65F.js +0 -29
- package/dist/get-analytics-TETCSOK6.js +0 -73
- package/dist/get-dataset-RCMU5VAH.js +0 -49
- package/dist/get-prompt-OY5B7TRI.js +0 -46
- package/dist/get-suite-J7JVWO6O.js +0 -45
- package/dist/index.d.ts +0 -2
- package/dist/langwatch-api-secrets-BUBSNCNO.js +0 -41
- package/dist/langwatch-api-triggers-EDFUCJN6.js +0 -31
- package/dist/list-agents-KFHKGPXV.js +0 -33
- package/dist/list-scenarios-F2WYNRIE.js +0 -41
- package/dist/list-suites-CRY4VWW6.js +0 -43
- package/dist/report-issue-XYVAPAYJ.js +0 -412
- package/dist/run-suite-NKZCJ2IN.js +0 -30
- package/dist/search-traces-A6HFKPLJ.js +0 -79
- package/dist/update-prompt-ODCRQRN6.js +0 -25
- package/dist/update-suite-SNO3GS7T.js +0 -40
- package/src/__tests__/all-tools.integration.test.ts +0 -1626
- package/src/__tests__/config.unit.test.ts +0 -202
- package/src/__tests__/datasets.integration.test.ts +0 -620
- package/src/__tests__/datasets.unit.test.ts +0 -244
- package/src/__tests__/date-parsing.unit.test.ts +0 -78
- package/src/__tests__/discover-evaluator-schema.unit.test.ts +0 -89
- package/src/__tests__/discover-schema.unit.test.ts +0 -118
- package/src/__tests__/docker.integration.test.ts +0 -318
- package/src/__tests__/documentation-fetch-security.integration.test.ts +0 -182
- package/src/__tests__/evaluator-tools.unit.test.ts +0 -262
- package/src/__tests__/experiment-list-tools.unit.test.ts +0 -157
- package/src/__tests__/experiment-status.unit.test.ts +0 -194
- package/src/__tests__/feature-map-tool-drift.unit.test.ts +0 -93
- package/src/__tests__/get-experiment-results.unit.test.ts +0 -313
- package/src/__tests__/http-security-origin.unit.test.ts +0 -97
- package/src/__tests__/http-security-sessions.unit.test.ts +0 -209
- package/src/__tests__/http-security-verifier.unit.test.ts +0 -248
- package/src/__tests__/http-server-allocation.integration.test.ts +0 -279
- package/src/__tests__/http-server-origin.integration.test.ts +0 -169
- package/src/__tests__/http-server-session-auth.integration.test.ts +0 -341
- package/src/__tests__/http-transport.integration.test.ts +0 -395
- package/src/__tests__/integration.integration.test.ts +0 -288
- package/src/__tests__/langwatch-api.unit.test.ts +0 -661
- package/src/__tests__/model-provider-tools.unit.test.ts +0 -190
- package/src/__tests__/project-api-key-tools.unit.test.ts +0 -451
- package/src/__tests__/public-http-request-security.integration.test.ts +0 -118
- package/src/__tests__/report-issue.integration.test.ts +0 -147
- package/src/__tests__/scenario-tools.integration.test.ts +0 -286
- package/src/__tests__/scenario-tools.unit.test.ts +0 -188
- package/src/__tests__/schemas.unit.test.ts +0 -85
- package/src/__tests__/support/http-server-harness.ts +0 -138
- package/src/__tests__/tools.unit.test.ts +0 -924
- package/src/langwatch-api-suites.ts +0 -118
- package/src/schemas/filter-fields.ts +0 -119
- package/src/schemas/index.ts +0 -4
- package/src/tools/archive-suite.ts +0 -12
- package/src/tools/create-suite.ts +0 -42
- package/src/tools/get-suite.ts +0 -47
- package/src/tools/list-suites.ts +0 -43
- package/src/tools/run-suite.ts +0 -28
- package/src/tools/update-suite.ts +0 -44
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
|
|
3
|
+
import { makeRequest } from "./langwatch-api.ts";
|
|
4
|
+
import type {
|
|
5
|
+
runParametersSchema,
|
|
6
|
+
runPlanScopeSchema,
|
|
7
|
+
runPlanTargetSchema,
|
|
8
|
+
RunPlanTargetWire,
|
|
9
|
+
} from "./schemas/run-plan.ts";
|
|
10
|
+
import type { EvaluatorAttachmentWire } from "./schemas/suite-fields.ts";
|
|
11
|
+
|
|
12
|
+
// Client for /api/v1/run-plans. A run plan is identified by name; re-using the
|
|
13
|
+
// name replaces its config while parameters/notes belong to one run only.
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* The shapes the run plan tools accept, taken from the zod that validates
|
|
17
|
+
* them. They are inferred rather than written twice, so the schema stays the
|
|
18
|
+
* one place the shape is stated.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/** What a run plan covers. Mirrors `suiteScopeSchema` on the platform. */
|
|
22
|
+
export type RunPlanScope = z.infer<typeof runPlanScopeSchema>;
|
|
23
|
+
|
|
24
|
+
/** One thing a plan runs its scenarios against, as a tool caller writes it. */
|
|
25
|
+
export type RunPlanTarget = z.infer<typeof runPlanTargetSchema>;
|
|
26
|
+
|
|
27
|
+
/** The values a run supplies for the parameters its scenarios declare. */
|
|
28
|
+
export type RunParameters = z.infer<typeof runParametersSchema>;
|
|
29
|
+
|
|
30
|
+
export interface RunPlan {
|
|
31
|
+
id: string;
|
|
32
|
+
name: string;
|
|
33
|
+
slug: string;
|
|
34
|
+
scope: RunPlanScope | null;
|
|
35
|
+
scenarioIds: string[];
|
|
36
|
+
targets: RunPlanTargetWire[];
|
|
37
|
+
repeatCount: number;
|
|
38
|
+
simulatorModel: string | null;
|
|
39
|
+
judgeModel: string | null;
|
|
40
|
+
labels: string[];
|
|
41
|
+
archivedAt: string | null;
|
|
42
|
+
createdAt: string;
|
|
43
|
+
updatedAt: string;
|
|
44
|
+
platformUrl: string;
|
|
45
|
+
/** The plan's own evaluators. Absent on servers that predate them. */
|
|
46
|
+
evaluators?: EvaluatorAttachmentWire[];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** The configuration a run either writes onto a plan or creates it with. */
|
|
50
|
+
export interface RunPlanConfig {
|
|
51
|
+
scope: RunPlanScope;
|
|
52
|
+
targets: RunPlanTargetWire[];
|
|
53
|
+
repeatCount?: number;
|
|
54
|
+
simulatorModel?: string | null;
|
|
55
|
+
judgeModel?: string | null;
|
|
56
|
+
scenarioIds?: string[];
|
|
57
|
+
/**
|
|
58
|
+
* The plan's own evaluators, run beside the ones its test suites attach. A
|
|
59
|
+
* plan evaluator reads the conversation and the trace, never a scenario
|
|
60
|
+
* field. Left out, the plan keeps what it already holds.
|
|
61
|
+
*/
|
|
62
|
+
evaluators?: EvaluatorAttachmentWire[];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export interface RunPlanRunResult {
|
|
66
|
+
scheduled: boolean;
|
|
67
|
+
batchRunId: string;
|
|
68
|
+
setId: string;
|
|
69
|
+
jobCount: number;
|
|
70
|
+
skippedArchived: {
|
|
71
|
+
scenarios: string[];
|
|
72
|
+
targets: string[];
|
|
73
|
+
};
|
|
74
|
+
items: {
|
|
75
|
+
scenarioRunId: string;
|
|
76
|
+
scenarioId: string;
|
|
77
|
+
target: RunPlanTargetWire;
|
|
78
|
+
name: string | null;
|
|
79
|
+
}[];
|
|
80
|
+
runPlanId: string;
|
|
81
|
+
planName: string;
|
|
82
|
+
/** True when this run created the plan, false when it joined an existing one. */
|
|
83
|
+
created: boolean;
|
|
84
|
+
platformUrl: string;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export interface RunPlanArchiveResponse {
|
|
88
|
+
id: string;
|
|
89
|
+
archived: boolean;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** Lists the run plans of the project. */
|
|
93
|
+
export async function listRunPlans(params?: { includeArchived?: boolean }): Promise<RunPlan[]> {
|
|
94
|
+
const query = params?.includeArchived ? "?includeArchived=true" : "";
|
|
95
|
+
return makeRequest("GET", `/api/v1/run-plans${query}`) as Promise<RunPlan[]>;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** Retrieves a single run plan by id. */
|
|
99
|
+
export async function getRunPlan(id: string): Promise<RunPlan> {
|
|
100
|
+
return makeRequest("GET", `/api/v1/run-plans/${encodeURIComponent(id)}`) as Promise<RunPlan>;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Runs a configuration by plan name. A name that exists is replaced with this
|
|
105
|
+
* configuration, a name that does not is created. Sending no name lets the
|
|
106
|
+
* server derive one.
|
|
107
|
+
*/
|
|
108
|
+
export async function runRunPlan(data: {
|
|
109
|
+
name?: string;
|
|
110
|
+
config: RunPlanConfig;
|
|
111
|
+
idempotencyKey?: string;
|
|
112
|
+
parameters?: RunParameters;
|
|
113
|
+
note?: string;
|
|
114
|
+
}): Promise<RunPlanRunResult> {
|
|
115
|
+
return makeRequest("POST", "/api/v1/run-plans/run", data) as Promise<RunPlanRunResult>;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** Runs a plan again with the configuration it already holds. */
|
|
119
|
+
export async function rerunRunPlan(
|
|
120
|
+
id: string,
|
|
121
|
+
data?: {
|
|
122
|
+
idempotencyKey?: string;
|
|
123
|
+
parameters?: RunParameters;
|
|
124
|
+
note?: string;
|
|
125
|
+
},
|
|
126
|
+
): Promise<RunPlanRunResult> {
|
|
127
|
+
return makeRequest(
|
|
128
|
+
"POST",
|
|
129
|
+
`/api/v1/run-plans/${encodeURIComponent(id)}/run`,
|
|
130
|
+
data ?? {},
|
|
131
|
+
) as Promise<RunPlanRunResult>;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/** Archives a run plan. */
|
|
135
|
+
export async function archiveRunPlan(id: string): Promise<RunPlanArchiveResponse> {
|
|
136
|
+
return makeRequest(
|
|
137
|
+
"DELETE",
|
|
138
|
+
`/api/v1/run-plans/${encodeURIComponent(id)}`,
|
|
139
|
+
) as Promise<RunPlanArchiveResponse>;
|
|
140
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { makeRequest } from "./langwatch-api.
|
|
1
|
+
import { makeRequest } from "./langwatch-api.ts";
|
|
2
|
+
import type { ScenarioFieldValues } from "./schemas/suite-fields.ts";
|
|
2
3
|
|
|
3
4
|
// --- Scenario types ---
|
|
4
5
|
|
|
@@ -8,6 +9,10 @@ export interface ScenarioSummary {
|
|
|
8
9
|
situation: string;
|
|
9
10
|
criteria: string[];
|
|
10
11
|
labels: string[];
|
|
12
|
+
/** The test suite this scenario is filed in, null when it is unfiled. */
|
|
13
|
+
testSuiteId?: string | null;
|
|
14
|
+
/** The scenario's value for each field its test suite declares. */
|
|
15
|
+
fields?: ScenarioFieldValues;
|
|
11
16
|
}
|
|
12
17
|
|
|
13
18
|
export interface ScenarioArchiveResponse {
|
|
@@ -19,14 +24,14 @@ export interface ScenarioArchiveResponse {
|
|
|
19
24
|
|
|
20
25
|
/** Lists all scenarios in the project. */
|
|
21
26
|
export async function listScenarios(): Promise<ScenarioSummary[]> {
|
|
22
|
-
return makeRequest("GET", "/api/scenarios") as Promise<ScenarioSummary[]>;
|
|
27
|
+
return makeRequest("GET", "/api/v1/scenarios") as Promise<ScenarioSummary[]>;
|
|
23
28
|
}
|
|
24
29
|
|
|
25
30
|
/** Retrieves a single scenario by ID. */
|
|
26
31
|
export async function getScenario(id: string): Promise<ScenarioSummary> {
|
|
27
32
|
return makeRequest(
|
|
28
33
|
"GET",
|
|
29
|
-
`/api/scenarios/${encodeURIComponent(id)}
|
|
34
|
+
`/api/v1/scenarios/${encodeURIComponent(id)}`,
|
|
30
35
|
) as Promise<ScenarioSummary>;
|
|
31
36
|
}
|
|
32
37
|
|
|
@@ -36,8 +41,10 @@ export async function createScenario(data: {
|
|
|
36
41
|
situation: string;
|
|
37
42
|
criteria?: string[];
|
|
38
43
|
labels?: string[];
|
|
44
|
+
testSuiteId?: string | null;
|
|
45
|
+
fields?: ScenarioFieldValues;
|
|
39
46
|
}): Promise<ScenarioSummary> {
|
|
40
|
-
return makeRequest("POST", "/api/scenarios", data) as Promise<ScenarioSummary>;
|
|
47
|
+
return makeRequest("POST", "/api/v1/scenarios", data) as Promise<ScenarioSummary>;
|
|
41
48
|
}
|
|
42
49
|
|
|
43
50
|
/** Updates an existing scenario. */
|
|
@@ -47,21 +54,21 @@ export async function updateScenario(params: {
|
|
|
47
54
|
situation?: string;
|
|
48
55
|
criteria?: string[];
|
|
49
56
|
labels?: string[];
|
|
57
|
+
testSuiteId?: string | null;
|
|
58
|
+
fields?: ScenarioFieldValues;
|
|
50
59
|
}): Promise<ScenarioSummary> {
|
|
51
60
|
const { id, ...data } = params;
|
|
52
61
|
return makeRequest(
|
|
53
62
|
"PUT",
|
|
54
|
-
`/api/scenarios/${encodeURIComponent(id)}`,
|
|
55
|
-
data
|
|
63
|
+
`/api/v1/scenarios/${encodeURIComponent(id)}`,
|
|
64
|
+
data,
|
|
56
65
|
) as Promise<ScenarioSummary>;
|
|
57
66
|
}
|
|
58
67
|
|
|
59
68
|
/** Archives (soft-deletes) a scenario. */
|
|
60
|
-
export async function archiveScenario(
|
|
61
|
-
id: string
|
|
62
|
-
): Promise<ScenarioArchiveResponse> {
|
|
69
|
+
export async function archiveScenario(id: string): Promise<ScenarioArchiveResponse> {
|
|
63
70
|
return makeRequest(
|
|
64
71
|
"DELETE",
|
|
65
|
-
`/api/scenarios/${encodeURIComponent(id)}
|
|
72
|
+
`/api/v1/scenarios/${encodeURIComponent(id)}`,
|
|
66
73
|
) as Promise<ScenarioArchiveResponse>;
|
|
67
74
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getConfig } from "./config.ts";
|
|
2
|
+
import { makeRequest } from "./langwatch-api.ts";
|
|
2
3
|
|
|
3
4
|
export interface SecretSummary {
|
|
4
5
|
id: string;
|
|
@@ -8,41 +9,47 @@ export interface SecretSummary {
|
|
|
8
9
|
updatedAt: string;
|
|
9
10
|
}
|
|
10
11
|
|
|
12
|
+
function projectId(): string {
|
|
13
|
+
const projectId = getConfig().projectId;
|
|
14
|
+
if (!projectId) {
|
|
15
|
+
throw new Error("LANGWATCH_PROJECT_ID is required for secret operations");
|
|
16
|
+
}
|
|
17
|
+
return projectId;
|
|
18
|
+
}
|
|
19
|
+
|
|
11
20
|
export async function listSecrets(): Promise<SecretSummary[]> {
|
|
12
|
-
|
|
21
|
+
const targetProjectId = projectId();
|
|
22
|
+
return makeRequest(
|
|
23
|
+
"GET",
|
|
24
|
+
`/api/v1/secrets?projectId=${encodeURIComponent(targetProjectId)}`,
|
|
25
|
+
) as Promise<SecretSummary[]>;
|
|
13
26
|
}
|
|
14
27
|
|
|
15
28
|
export async function getSecret(id: string): Promise<SecretSummary> {
|
|
29
|
+
const targetProjectId = projectId();
|
|
16
30
|
return makeRequest(
|
|
17
31
|
"GET",
|
|
18
|
-
`/api/secrets/${encodeURIComponent(id)}
|
|
32
|
+
`/api/v1/secrets/${encodeURIComponent(id)}?projectId=${encodeURIComponent(targetProjectId)}`,
|
|
19
33
|
) as Promise<SecretSummary>;
|
|
20
34
|
}
|
|
21
35
|
|
|
22
|
-
export async function createSecret(data: {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
36
|
+
export async function createSecret(data: { name: string; value: string }): Promise<SecretSummary> {
|
|
37
|
+
return makeRequest("POST", "/api/v1/secrets", {
|
|
38
|
+
projectId: projectId(),
|
|
39
|
+
...data,
|
|
40
|
+
}) as Promise<SecretSummary>;
|
|
27
41
|
}
|
|
28
42
|
|
|
29
|
-
export async function updateSecret(params: {
|
|
30
|
-
id: string;
|
|
31
|
-
value: string;
|
|
32
|
-
}): Promise<SecretSummary> {
|
|
43
|
+
export async function updateSecret(params: { id: string; value: string }): Promise<SecretSummary> {
|
|
33
44
|
const { id, value } = params;
|
|
34
|
-
return makeRequest(
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
) as Promise<SecretSummary>;
|
|
45
|
+
return makeRequest("PUT", `/api/v1/secrets/${encodeURIComponent(id)}`, {
|
|
46
|
+
projectId: projectId(),
|
|
47
|
+
value,
|
|
48
|
+
}) as Promise<SecretSummary>;
|
|
39
49
|
}
|
|
40
50
|
|
|
41
|
-
export async function deleteSecret(
|
|
42
|
-
id
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
"DELETE",
|
|
46
|
-
`/api/secrets/${encodeURIComponent(id)}`
|
|
47
|
-
) as Promise<{ id: string; deleted: boolean }>;
|
|
51
|
+
export async function deleteSecret(id: string): Promise<{ id: string; deleted: boolean }> {
|
|
52
|
+
return makeRequest("DELETE", `/api/v1/secrets/${encodeURIComponent(id)}`, {
|
|
53
|
+
projectId: projectId(),
|
|
54
|
+
}) as Promise<{ id: string; deleted: boolean }>;
|
|
48
55
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { makeRequest } from "./langwatch-api.
|
|
1
|
+
import { makeRequest } from "./langwatch-api.ts";
|
|
2
|
+
import type { SimulationRunEvaluation } from "./tools/format-suite-details.ts";
|
|
2
3
|
|
|
3
4
|
export interface SimulationRunSummary {
|
|
4
5
|
scenarioRunId: string;
|
|
@@ -14,8 +15,12 @@ export interface SimulationRunSummary {
|
|
|
14
15
|
metCriteria?: string[];
|
|
15
16
|
unmetCriteria?: string[];
|
|
16
17
|
error?: string | null;
|
|
18
|
+
/** One result per evaluator that ran after the conversation. */
|
|
19
|
+
evaluations?: SimulationRunEvaluation[];
|
|
17
20
|
} | null;
|
|
18
|
-
messages?:
|
|
21
|
+
messages?: { role: string; content: string }[];
|
|
22
|
+
/** Why the run was started, as given when it was queued. Null without one. */
|
|
23
|
+
note?: string | null;
|
|
19
24
|
timestamp: number;
|
|
20
25
|
updatedAt: number;
|
|
21
26
|
}
|
|
@@ -37,15 +42,13 @@ export async function listSimulationRuns(params?: {
|
|
|
37
42
|
if (params?.batchRunId) query.set("batchRunId", params.batchRunId);
|
|
38
43
|
if (params?.limit) query.set("limit", String(params.limit));
|
|
39
44
|
const qs = query.toString() ? `?${query}` : "";
|
|
40
|
-
return makeRequest("GET", `/api/simulation-runs${qs}`) as Promise<SimulationRunListResponse>;
|
|
45
|
+
return makeRequest("GET", `/api/v1/simulation-runs${qs}`) as Promise<SimulationRunListResponse>;
|
|
41
46
|
}
|
|
42
47
|
|
|
43
48
|
/** Gets a single simulation run by its ID. */
|
|
44
|
-
export async function getSimulationRun(
|
|
45
|
-
scenarioRunId: string,
|
|
46
|
-
): Promise<SimulationRunSummary> {
|
|
49
|
+
export async function getSimulationRun(scenarioRunId: string): Promise<SimulationRunSummary> {
|
|
47
50
|
return makeRequest(
|
|
48
51
|
"GET",
|
|
49
|
-
`/api/simulation-runs/${encodeURIComponent(scenarioRunId)}`,
|
|
52
|
+
`/api/v1/simulation-runs/${encodeURIComponent(scenarioRunId)}`,
|
|
50
53
|
) as Promise<SimulationRunSummary>;
|
|
51
54
|
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import type { RunParameters, RunPlanRunResult } from "./langwatch-api-run-plans.ts";
|
|
2
|
+
import { makeRequest } from "./langwatch-api.ts";
|
|
3
|
+
import type { RunPlanTargetWire } from "./schemas/run-plan.ts";
|
|
4
|
+
import type { EvaluatorAttachmentWire, SuiteField } from "./schemas/suite-fields.ts";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Client for `/api/v1/test-suites`. A test suite groups scenarios by
|
|
8
|
+
* name; running one is sugar over a run plan, returning the same
|
|
9
|
+
* result shape.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export interface TestSuite {
|
|
13
|
+
id: string;
|
|
14
|
+
name: string;
|
|
15
|
+
slug: string;
|
|
16
|
+
scenarioIds: string[];
|
|
17
|
+
scenarioCount: number;
|
|
18
|
+
archivedAt: string | null;
|
|
19
|
+
createdAt: string;
|
|
20
|
+
updatedAt: string;
|
|
21
|
+
platformUrl: string;
|
|
22
|
+
/** The fields the suite declares. Absent on servers that predate them. */
|
|
23
|
+
fields?: SuiteField[];
|
|
24
|
+
/** The evaluators attached to the suite. Absent on servers that predate them. */
|
|
25
|
+
evaluators?: EvaluatorAttachmentWire[];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface TestSuiteDetail extends TestSuite {
|
|
29
|
+
scenarios: { id: string; name: string }[];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface TestSuiteArchiveResponse {
|
|
33
|
+
id: string;
|
|
34
|
+
archived: boolean;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Lists the test suites of the project. */
|
|
38
|
+
export async function listTestSuites(): Promise<TestSuite[]> {
|
|
39
|
+
return makeRequest("GET", "/api/v1/test-suites") as Promise<TestSuite[]>;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** Creates a test suite, with the fields and the evaluators it declares. */
|
|
43
|
+
export async function createTestSuite(data: {
|
|
44
|
+
name: string;
|
|
45
|
+
fields?: SuiteField[];
|
|
46
|
+
evaluators?: EvaluatorAttachmentWire[];
|
|
47
|
+
}): Promise<TestSuite> {
|
|
48
|
+
return makeRequest("POST", "/api/v1/test-suites", data) as Promise<TestSuite>;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Retrieves a test suite with the scenarios filed in it. */
|
|
52
|
+
export async function getTestSuite(id: string): Promise<TestSuiteDetail> {
|
|
53
|
+
return makeRequest(
|
|
54
|
+
"GET",
|
|
55
|
+
`/api/v1/test-suites/${encodeURIComponent(id)}`,
|
|
56
|
+
) as Promise<TestSuiteDetail>;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Edits a test suite: any of its name, its fields and its evaluators. A list
|
|
61
|
+
* given here replaces the one the suite holds.
|
|
62
|
+
*/
|
|
63
|
+
export async function updateTestSuite(params: {
|
|
64
|
+
id: string;
|
|
65
|
+
name?: string;
|
|
66
|
+
fields?: SuiteField[];
|
|
67
|
+
evaluators?: EvaluatorAttachmentWire[];
|
|
68
|
+
}): Promise<TestSuite> {
|
|
69
|
+
const { id, ...data } = params;
|
|
70
|
+
return makeRequest(
|
|
71
|
+
"PATCH",
|
|
72
|
+
`/api/v1/test-suites/${encodeURIComponent(id)}`,
|
|
73
|
+
data,
|
|
74
|
+
) as Promise<TestSuite>;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** Renames a test suite. */
|
|
78
|
+
export async function renameTestSuite(params: { id: string; name: string }): Promise<TestSuite> {
|
|
79
|
+
return makeRequest("PATCH", `/api/v1/test-suites/${encodeURIComponent(params.id)}`, {
|
|
80
|
+
name: params.name,
|
|
81
|
+
}) as Promise<TestSuite>;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** Archives a test suite and the scenarios filed in it. */
|
|
85
|
+
export async function archiveTestSuite(id: string): Promise<TestSuiteArchiveResponse> {
|
|
86
|
+
return makeRequest(
|
|
87
|
+
"DELETE",
|
|
88
|
+
`/api/v1/test-suites/${encodeURIComponent(id)}`,
|
|
89
|
+
) as Promise<TestSuiteArchiveResponse>;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Runs every scenario of a test suite against the given targets. The server
|
|
94
|
+
* creates or joins the run plan named "<suite name> <target name>" when no
|
|
95
|
+
* name is sent.
|
|
96
|
+
*/
|
|
97
|
+
export async function runTestSuite({
|
|
98
|
+
id,
|
|
99
|
+
...data
|
|
100
|
+
}: {
|
|
101
|
+
id: string;
|
|
102
|
+
targets: RunPlanTargetWire[];
|
|
103
|
+
name?: string;
|
|
104
|
+
repeatCount?: number;
|
|
105
|
+
simulatorModel?: string | null;
|
|
106
|
+
judgeModel?: string | null;
|
|
107
|
+
parameters?: RunParameters;
|
|
108
|
+
note?: string;
|
|
109
|
+
idempotencyKey?: string;
|
|
110
|
+
}): Promise<RunPlanRunResult> {
|
|
111
|
+
return makeRequest(
|
|
112
|
+
"POST",
|
|
113
|
+
`/api/v1/test-suites/${encodeURIComponent(id)}/run`,
|
|
114
|
+
data,
|
|
115
|
+
) as Promise<RunPlanRunResult>;
|
|
116
|
+
}
|
|
@@ -1,48 +1,110 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { z } from "zod";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
3
|
+
import { makeRequest } from "./langwatch-api.ts";
|
|
4
|
+
import {
|
|
5
|
+
deletedTriggerSchema,
|
|
6
|
+
type GraphAlertRule,
|
|
7
|
+
type NotificationCadence,
|
|
8
|
+
type ReportRule,
|
|
9
|
+
type TestFireResult,
|
|
10
|
+
type Trigger,
|
|
11
|
+
type TriggerAction,
|
|
12
|
+
type TriggerActionParams,
|
|
13
|
+
type TriggerAlertType,
|
|
14
|
+
type TriggerFirePage,
|
|
15
|
+
type TriggerTemplates,
|
|
16
|
+
testFireResultSchema,
|
|
17
|
+
triggerFirePageSchema,
|
|
18
|
+
triggerSchema,
|
|
19
|
+
} from "./schemas/triggers.ts";
|
|
15
20
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
21
|
+
/**
|
|
22
|
+
* The `/api/v1/triggers` calls, each answering with the shape `schemas/triggers` declares.
|
|
23
|
+
* Responses are read through that schema, not cast, so a deployment that stops sending something
|
|
24
|
+
* a tool renders fails loudly instead of leaving an `undefined` in an agent's message.
|
|
25
|
+
*/
|
|
19
26
|
|
|
20
|
-
export
|
|
21
|
-
return makeRequest("GET", `/api/triggers/${encodeURIComponent(id)}`) as Promise<TriggerSummary>;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export async function createTrigger(data: {
|
|
27
|
+
export interface CreateTriggerInput {
|
|
25
28
|
name: string;
|
|
26
|
-
action:
|
|
27
|
-
actionParams
|
|
29
|
+
action: TriggerAction;
|
|
30
|
+
/** Omitted sends `{}`, as before `actionParams` was stated per channel. */
|
|
31
|
+
actionParams?: TriggerActionParams;
|
|
28
32
|
filters?: Record<string, unknown>;
|
|
33
|
+
filterQuery?: string | null;
|
|
29
34
|
message?: string;
|
|
30
|
-
alertType?:
|
|
31
|
-
|
|
32
|
-
|
|
35
|
+
alertType?: TriggerAlertType;
|
|
36
|
+
customGraphId?: string;
|
|
37
|
+
graphAlert?: GraphAlertRule;
|
|
38
|
+
report?: ReportRule;
|
|
39
|
+
templates?: TriggerTemplates;
|
|
40
|
+
notificationCadence?: NotificationCadence;
|
|
33
41
|
}
|
|
34
42
|
|
|
35
|
-
|
|
43
|
+
/** `actionParams` replaces the delivery configuration as a whole; a credential
|
|
44
|
+
* sent back as `[redacted]` keeps the stored one. The channel cannot change. */
|
|
45
|
+
type UpdateTriggerInput = Partial<
|
|
46
|
+
Omit<CreateTriggerInput, "action" | "customGraphId" | "message" | "alertType">
|
|
47
|
+
> & {
|
|
36
48
|
id: string;
|
|
37
|
-
name?: string;
|
|
38
49
|
active?: boolean;
|
|
39
50
|
message?: string | null;
|
|
40
|
-
alertType?:
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
|
|
51
|
+
alertType?: TriggerAlertType | null;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export async function listTriggers(): Promise<Trigger[]> {
|
|
55
|
+
return z.array(triggerSchema).parse(await makeRequest("GET", "/api/v1/triggers"));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export async function getTrigger(id: string): Promise<Trigger> {
|
|
59
|
+
return triggerSchema.parse(
|
|
60
|
+
await makeRequest("GET", `/api/v1/triggers/${encodeURIComponent(id)}`),
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export async function createTrigger(input: CreateTriggerInput): Promise<Trigger> {
|
|
65
|
+
return triggerSchema.parse(
|
|
66
|
+
await makeRequest("POST", "/api/v1/triggers", {
|
|
67
|
+
...input,
|
|
68
|
+
actionParams: input.actionParams ?? {},
|
|
69
|
+
}),
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export async function updateTrigger({ id, ...data }: UpdateTriggerInput): Promise<Trigger> {
|
|
74
|
+
return triggerSchema.parse(
|
|
75
|
+
await makeRequest("PATCH", `/api/v1/triggers/${encodeURIComponent(id)}`, data),
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** Send the automation's message to the destination it is saved with. */
|
|
80
|
+
export async function testFireTrigger(id: string): Promise<TestFireResult> {
|
|
81
|
+
return testFireResultSchema.parse(
|
|
82
|
+
await makeRequest("POST", `/api/v1/triggers/${encodeURIComponent(id)}/test-fire`),
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** What the automation has done, newest first. Metadata only. `cursor` reads
|
|
87
|
+
* the page after the one that answered with it as `nextCursor`. */
|
|
88
|
+
export async function listTriggerFires({
|
|
89
|
+
id,
|
|
90
|
+
limit,
|
|
91
|
+
cursor,
|
|
92
|
+
}: {
|
|
93
|
+
id: string;
|
|
94
|
+
limit?: number;
|
|
95
|
+
cursor?: string;
|
|
96
|
+
}): Promise<TriggerFirePage> {
|
|
97
|
+
const query = new URLSearchParams();
|
|
98
|
+
if (limit !== undefined) query.set("limit", String(limit));
|
|
99
|
+
if (cursor) query.set("cursor", cursor);
|
|
100
|
+
const search = query.toString() ? `?${query.toString()}` : "";
|
|
101
|
+
return triggerFirePageSchema.parse(
|
|
102
|
+
await makeRequest("GET", `/api/v1/triggers/${encodeURIComponent(id)}/fires${search}`),
|
|
103
|
+
);
|
|
44
104
|
}
|
|
45
105
|
|
|
46
|
-
export async function deleteTrigger(id: string): Promise<
|
|
47
|
-
return
|
|
106
|
+
export async function deleteTrigger(id: string): Promise<z.infer<typeof deletedTriggerSchema>> {
|
|
107
|
+
return deletedTriggerSchema.parse(
|
|
108
|
+
await makeRequest("DELETE", `/api/v1/triggers/${encodeURIComponent(id)}`),
|
|
109
|
+
);
|
|
48
110
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { makeRequest } from "./langwatch-api.
|
|
1
|
+
import { makeRequest } from "./langwatch-api.ts";
|
|
2
2
|
|
|
3
3
|
export interface WorkflowSummary {
|
|
4
4
|
id: string;
|
|
@@ -12,30 +12,30 @@ export interface WorkflowSummary {
|
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
export async function listWorkflows(): Promise<WorkflowSummary[]> {
|
|
15
|
-
return makeRequest("GET", "/api/workflows") as Promise<WorkflowSummary[]>;
|
|
15
|
+
return makeRequest("GET", "/api/v1/workflows") as Promise<WorkflowSummary[]>;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
export async function getWorkflow(id: string): Promise<WorkflowSummary> {
|
|
19
19
|
return makeRequest(
|
|
20
20
|
"GET",
|
|
21
|
-
`/api/workflows/${encodeURIComponent(id)}`,
|
|
21
|
+
`/api/v1/workflows/${encodeURIComponent(id)}`,
|
|
22
22
|
) as Promise<WorkflowSummary>;
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
export async function runWorkflow(
|
|
26
26
|
id: string,
|
|
27
|
-
input?: Record<string, unknown
|
|
27
|
+
input?: Record<string, unknown>,
|
|
28
28
|
): Promise<Record<string, unknown>> {
|
|
29
29
|
return makeRequest(
|
|
30
30
|
"POST",
|
|
31
|
-
`/api/workflows/${encodeURIComponent(id)}/run`,
|
|
31
|
+
`/api/v1/workflows/${encodeURIComponent(id)}/run`,
|
|
32
32
|
input ?? {},
|
|
33
33
|
) as Promise<Record<string, unknown>>;
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
export async function deleteWorkflow(id: string): Promise<{ id: string; archived: boolean }> {
|
|
37
|
-
return makeRequest(
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
37
|
+
return makeRequest("DELETE", `/api/v1/workflows/${encodeURIComponent(id)}`) as Promise<{
|
|
38
|
+
id: string;
|
|
39
|
+
archived: boolean;
|
|
40
|
+
}>;
|
|
41
41
|
}
|