@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
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
import { assignPromptTag as apiAssignPromptTag } from "../langwatch-api.
|
|
1
|
+
import { assignPromptTag as apiAssignPromptTag } from "../langwatch-api.ts";
|
|
2
2
|
|
|
3
3
|
export async function handleAssignPromptTag(params: {
|
|
4
4
|
idOrHandle: string;
|
|
5
5
|
tag: string;
|
|
6
6
|
versionId: string;
|
|
7
7
|
}): Promise<string> {
|
|
8
|
-
await apiAssignPromptTag({
|
|
8
|
+
await apiAssignPromptTag({
|
|
9
|
+
idOrHandle: params.idOrHandle,
|
|
10
|
+
tag: params.tag,
|
|
11
|
+
versionId: params.versionId,
|
|
12
|
+
});
|
|
9
13
|
|
|
10
14
|
const lines: string[] = [];
|
|
11
15
|
lines.push("Tag assigned successfully!\n");
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createAnnotation as apiCreateAnnotation } from "../langwatch-api-annotations.
|
|
1
|
+
import { createAnnotation as apiCreateAnnotation } from "../langwatch-api-annotations.ts";
|
|
2
2
|
|
|
3
3
|
export async function handleCreateAnnotation(params: {
|
|
4
4
|
traceId: string;
|
|
@@ -12,7 +12,12 @@ export async function handleCreateAnnotation(params: {
|
|
|
12
12
|
email: params.email,
|
|
13
13
|
});
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
let rating = "";
|
|
16
|
+
if (params.isThumbsUp === true) {
|
|
17
|
+
rating = " 👍";
|
|
18
|
+
} else if (params.isThumbsUp === false) {
|
|
19
|
+
rating = " 👎";
|
|
20
|
+
}
|
|
16
21
|
|
|
17
22
|
return `Annotation created successfully!${rating}\n\n**ID**: ${annotation.id ?? "—"}\n**Trace ID**: ${params.traceId}${params.comment ? `\n**Comment**: ${params.comment}` : ""}`;
|
|
18
23
|
}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { createApiKey as apiCreateApiKey } from "../langwatch-api-api-keys.
|
|
1
|
+
import { createApiKey as apiCreateApiKey } from "../langwatch-api-api-keys.ts";
|
|
2
2
|
|
|
3
3
|
export async function handleCreateApiKey(params: {
|
|
4
4
|
keyType: "personal" | "service";
|
|
5
5
|
name: string;
|
|
6
6
|
description?: string;
|
|
7
7
|
expiresAt?: string;
|
|
8
|
-
bindings?:
|
|
8
|
+
bindings?: {
|
|
9
9
|
role: "ADMIN" | "MEMBER" | "VIEWER";
|
|
10
10
|
scopeType: "ORGANIZATION" | "TEAM" | "PROJECT";
|
|
11
11
|
scopeId: string;
|
|
12
|
-
}
|
|
12
|
+
}[];
|
|
13
13
|
projectIds?: string[];
|
|
14
14
|
}): Promise<string> {
|
|
15
15
|
const result = await apiCreateApiKey(params);
|
|
@@ -21,9 +21,7 @@ export async function handleCreateApiKey(params: {
|
|
|
21
21
|
lines.push(`**Token**: \`${result.token}\``);
|
|
22
22
|
lines.push(`**Created**: ${result.apiKey.createdAt}`);
|
|
23
23
|
lines.push("");
|
|
24
|
-
lines.push(
|
|
25
|
-
"> ⚠️ Save this token now — it will not be shown again.",
|
|
26
|
-
);
|
|
24
|
+
lines.push("> ⚠️ Save this token now — it will not be shown again.");
|
|
27
25
|
|
|
28
26
|
return lines.join("\n");
|
|
29
27
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createDashboard as apiCreateDashboard } from "../langwatch-api-dashboards.
|
|
1
|
+
import { createDashboard as apiCreateDashboard } from "../langwatch-api-dashboards.ts";
|
|
2
2
|
|
|
3
3
|
export async function handleCreateDashboard(params: { name: string }): Promise<string> {
|
|
4
4
|
const dashboard = await apiCreateDashboard({ name: params.name });
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import { createDatasetRecords as apiCreateDatasetRecords } from "../langwatch-api-datasets.
|
|
1
|
+
import { createDatasetRecords as apiCreateDatasetRecords } from "../langwatch-api-datasets.ts";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* Handles the platform_create_dataset_records MCP tool
|
|
5
|
-
*
|
|
6
|
-
* Creates records in a dataset in batch and returns a confirmation
|
|
7
|
-
* with the count of records created.
|
|
4
|
+
* Handles the platform_create_dataset_records MCP tool: creates records
|
|
5
|
+
* in batch and returns a confirmation with the count created.
|
|
8
6
|
*/
|
|
9
7
|
export async function handleCreateDatasetRecords(params: {
|
|
10
8
|
slugOrId: string;
|
|
@@ -15,9 +13,7 @@ export async function handleCreateDatasetRecords(params: {
|
|
|
15
13
|
|
|
16
14
|
const lines: string[] = [];
|
|
17
15
|
lines.push(`${count} record(s) created successfully!\n`);
|
|
18
|
-
lines.push(
|
|
19
|
-
"> Use `platform_get_dataset` to see the updated dataset with all records.",
|
|
20
|
-
);
|
|
16
|
+
lines.push("> Use `platform_get_dataset` to see the updated dataset with all records.");
|
|
21
17
|
|
|
22
18
|
return lines.join("\n");
|
|
23
19
|
}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import { createDataset as apiCreateDataset } from "../langwatch-api-datasets.
|
|
2
|
-
import type { DatasetColumnType } from "../langwatch-api-datasets.
|
|
3
|
-
import { formatDatasetMutationDetails } from "./format-dataset-mutation.
|
|
1
|
+
import { createDataset as apiCreateDataset } from "../langwatch-api-datasets.ts";
|
|
2
|
+
import type { DatasetColumnType } from "../langwatch-api-datasets.ts";
|
|
3
|
+
import { formatDatasetMutationDetails } from "./format-dataset-mutation.ts";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
|
-
* Handles the platform_create_dataset MCP tool
|
|
7
|
-
*
|
|
8
|
-
* Creates a new dataset in the LangWatch project and returns a
|
|
9
|
-
* confirmation with the created dataset's details.
|
|
6
|
+
* Handles the platform_create_dataset MCP tool: creates a dataset and
|
|
7
|
+
* returns a confirmation with its details.
|
|
10
8
|
*/
|
|
11
9
|
export async function handleCreateDataset(params: {
|
|
12
10
|
name: string;
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createEvaluator as apiCreateEvaluator,
|
|
3
3
|
getEvaluatorType,
|
|
4
|
-
} from "../langwatch-api-evaluators.
|
|
4
|
+
} from "../langwatch-api-evaluators.ts";
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
|
-
* Handles the platform_create_evaluator MCP tool
|
|
8
|
-
*
|
|
9
|
-
* Creates a new evaluator in the LangWatch project and returns a
|
|
10
|
-
* confirmation with the created evaluator's details.
|
|
7
|
+
* Handles the platform_create_evaluator MCP tool: creates an evaluator
|
|
8
|
+
* and returns a confirmation with its details.
|
|
11
9
|
*/
|
|
12
10
|
export async function handleCreateEvaluator(params: {
|
|
13
11
|
name: string;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createProject as apiCreateProject } from "../langwatch-api-projects.
|
|
1
|
+
import { createProject as apiCreateProject } from "../langwatch-api-projects.ts";
|
|
2
2
|
|
|
3
3
|
export async function handleCreateProject(params: {
|
|
4
4
|
name: string;
|
|
@@ -38,7 +38,7 @@ export async function handleCreateProject(params: {
|
|
|
38
38
|
lines.push("");
|
|
39
39
|
lines.push(
|
|
40
40
|
"> ⚠️ Save the service API key now — it will not be shown again. " +
|
|
41
|
-
|
|
41
|
+
"Use it as `LANGWATCH_API_KEY` to authenticate project-scoped operations.",
|
|
42
42
|
);
|
|
43
43
|
|
|
44
44
|
return lines.join("\n");
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import { createPromptTag as apiCreatePromptTag } from "../langwatch-api.
|
|
1
|
+
import { createPromptTag as apiCreatePromptTag } from "../langwatch-api.ts";
|
|
2
2
|
|
|
3
|
-
export async function handleCreatePromptTag(params: {
|
|
4
|
-
name: string;
|
|
5
|
-
}): Promise<string> {
|
|
3
|
+
export async function handleCreatePromptTag(params: { name: string }): Promise<string> {
|
|
6
4
|
await apiCreatePromptTag(params.name);
|
|
7
5
|
|
|
8
6
|
const lines: string[] = [];
|
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
import { createPrompt as apiCreatePrompt } from "../langwatch-api.
|
|
1
|
+
import { createPrompt as apiCreatePrompt } from "../langwatch-api.ts";
|
|
2
2
|
|
|
3
3
|
const HANDLE_PATTERN = /^[a-z0-9_-]+(?:\/[a-z0-9_-]+)?$/;
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
|
-
* Converts a human-readable name into a URL-friendly handle
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* and strips leading/trailing hyphens. May return an empty string
|
|
10
|
-
* for inputs with no alphanumeric characters — callers must validate.
|
|
6
|
+
* Converts a human-readable name into a URL-friendly handle: lowercased,
|
|
7
|
+
* non-alphanumeric runs replaced with hyphens, leading/trailing hyphens
|
|
8
|
+
* stripped. May return empty — callers must validate.
|
|
11
9
|
*/
|
|
12
10
|
function toHandle(name: string): string {
|
|
13
11
|
return name
|
|
@@ -16,23 +14,18 @@ function toHandle(name: string): string {
|
|
|
16
14
|
.replace(/^-|-$/g, "");
|
|
17
15
|
}
|
|
18
16
|
|
|
19
|
-
/**
|
|
20
|
-
* Handles the platform_create_prompt MCP tool invocation.
|
|
21
|
-
*
|
|
22
|
-
* Creates a new prompt in the LangWatch project and returns a
|
|
23
|
-
* confirmation with the created prompt's details.
|
|
24
|
-
*/
|
|
17
|
+
/** Handles the platform_create_prompt MCP tool: creates a prompt and returns its details. */
|
|
25
18
|
export async function handleCreatePrompt(params: {
|
|
26
19
|
name: string;
|
|
27
20
|
handle?: string;
|
|
28
|
-
messages:
|
|
21
|
+
messages: { role: string; content: string }[];
|
|
29
22
|
model: string;
|
|
30
23
|
tags?: string[];
|
|
31
24
|
}): Promise<string> {
|
|
32
25
|
const handle = params.handle?.trim() || toHandle(params.name);
|
|
33
26
|
if (!handle || !HANDLE_PATTERN.test(handle)) {
|
|
34
27
|
throw new Error(
|
|
35
|
-
`Invalid prompt handle "${handle || ""}". Handle must match ${HANDLE_PATTERN}. Provide a valid \`handle\` explicitly
|
|
28
|
+
`Invalid prompt handle "${handle || ""}". Handle must match ${HANDLE_PATTERN}. Provide a valid \`handle\` explicitly.`,
|
|
36
29
|
);
|
|
37
30
|
}
|
|
38
31
|
|
|
@@ -49,10 +42,8 @@ export async function handleCreatePrompt(params: {
|
|
|
49
42
|
if (result.handle) lines.push(`**Handle**: ${result.handle}`);
|
|
50
43
|
lines.push(`**Name**: ${result.name || params.name}`);
|
|
51
44
|
lines.push(`**Model**: ${params.model}`);
|
|
52
|
-
if (result.latestVersionNumber != null)
|
|
53
|
-
|
|
54
|
-
if (params.tags && params.tags.length > 0)
|
|
55
|
-
lines.push(`**Tags**: ${params.tags.join(", ")}`);
|
|
45
|
+
if (result.latestVersionNumber != null) lines.push(`**Version**: v${result.latestVersionNumber}`);
|
|
46
|
+
if (params.tags && params.tags.length > 0) lines.push(`**Tags**: ${params.tags.join(", ")}`);
|
|
56
47
|
|
|
57
48
|
return lines.join("\n");
|
|
58
49
|
}
|
|
@@ -1,16 +1,18 @@
|
|
|
1
|
-
import { createScenario as apiCreateScenario } from "../langwatch-api-scenarios.
|
|
1
|
+
import { createScenario as apiCreateScenario } from "../langwatch-api-scenarios.ts";
|
|
2
|
+
import type { ScenarioFieldValues } from "../schemas/suite-fields.ts";
|
|
3
|
+
import { formatScenarioFields } from "./format-scenario.ts";
|
|
2
4
|
|
|
3
5
|
/**
|
|
4
|
-
* Handles the platform_create_scenario MCP tool
|
|
5
|
-
*
|
|
6
|
-
* Creates a new scenario in the LangWatch project and returns a
|
|
7
|
-
* confirmation with the created scenario's details.
|
|
6
|
+
* Handles the platform_create_scenario MCP tool: creates a scenario and
|
|
7
|
+
* returns a confirmation with its details.
|
|
8
8
|
*/
|
|
9
9
|
export async function handleCreateScenario(params: {
|
|
10
10
|
name: string;
|
|
11
11
|
situation: string;
|
|
12
12
|
criteria?: string[];
|
|
13
13
|
labels?: string[];
|
|
14
|
+
testSuiteId?: string | null;
|
|
15
|
+
fields?: ScenarioFieldValues;
|
|
14
16
|
}): Promise<string> {
|
|
15
17
|
const result = await apiCreateScenario(params);
|
|
16
18
|
|
|
@@ -25,6 +27,10 @@ export async function handleCreateScenario(params: {
|
|
|
25
27
|
if (Array.isArray(result.labels) && result.labels.length > 0) {
|
|
26
28
|
lines.push(`**Labels**: ${result.labels.join(", ")}`);
|
|
27
29
|
}
|
|
30
|
+
if (result.testSuiteId) {
|
|
31
|
+
lines.push(`**Test suite**: ${result.testSuiteId}`);
|
|
32
|
+
}
|
|
33
|
+
lines.push(...formatScenarioFields(result.fields));
|
|
28
34
|
|
|
29
35
|
return lines.join("\n");
|
|
30
36
|
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { createTestSuite as apiCreateTestSuite } from "../langwatch-api-test-suites.ts";
|
|
2
|
+
import {
|
|
3
|
+
type EvaluatorAttachmentInput,
|
|
4
|
+
type SuiteField,
|
|
5
|
+
toWireAttachments,
|
|
6
|
+
} from "../schemas/suite-fields.ts";
|
|
7
|
+
import { formatEvaluatorAttachments, formatSuiteFields } from "./format-suite-details.ts";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Handles the platform_create_test_suite MCP tool invocation.
|
|
11
|
+
*/
|
|
12
|
+
export async function handleCreateTestSuite(params: {
|
|
13
|
+
name: string;
|
|
14
|
+
fields?: SuiteField[];
|
|
15
|
+
evaluators?: EvaluatorAttachmentInput[];
|
|
16
|
+
}): Promise<string> {
|
|
17
|
+
const suite = await apiCreateTestSuite({
|
|
18
|
+
name: params.name,
|
|
19
|
+
...(params.fields !== undefined ? { fields: params.fields } : {}),
|
|
20
|
+
...(params.evaluators !== undefined
|
|
21
|
+
? { evaluators: toWireAttachments(params.evaluators) }
|
|
22
|
+
: {}),
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
return [
|
|
26
|
+
`Test suite "${suite.name}" created.`,
|
|
27
|
+
"",
|
|
28
|
+
`**ID**: ${suite.id}`,
|
|
29
|
+
`**Slug**: ${suite.slug}`,
|
|
30
|
+
`**View**: ${suite.platformUrl}`,
|
|
31
|
+
...formatSuiteFields(suite.fields),
|
|
32
|
+
...formatEvaluatorAttachments(suite.evaluators),
|
|
33
|
+
"",
|
|
34
|
+
`> File scenarios in it with \`platform_create_scenario\` or \`platform_update_scenario\`, passing testSuiteId \`${suite.id}\`${
|
|
35
|
+
suite.fields && suite.fields.length > 0 ? ` and a value per field under \`fields\`` : ""
|
|
36
|
+
}.`,
|
|
37
|
+
].join("\n");
|
|
38
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createTrigger as apiCreateTrigger,
|
|
3
|
+
type CreateTriggerInput,
|
|
4
|
+
} from "../langwatch-api-triggers.ts";
|
|
5
|
+
import { validateActionParamsForAction } from "../schemas/triggers.ts";
|
|
6
|
+
|
|
7
|
+
/** An MCP tool result; `isError` tells the client the call was refused. */
|
|
8
|
+
export type TriggerToolResult = {
|
|
9
|
+
content: { type: "text"; text: string }[];
|
|
10
|
+
isError?: boolean;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
/** A refusal the client must read as a failed call, not a success. */
|
|
14
|
+
export function toolError(message: string): TriggerToolResult {
|
|
15
|
+
return { content: [{ type: "text", text: `Error: ${message}` }], isError: true };
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Handles the platform_create_trigger MCP tool invocation. `actionParams` is
|
|
20
|
+
* optional, as it was before it was stated per channel: omitted sends `{}` and
|
|
21
|
+
* the server decides; stated, it is checked against the channel first.
|
|
22
|
+
*/
|
|
23
|
+
export async function handleCreateTrigger(
|
|
24
|
+
params: Omit<CreateTriggerInput, "filters"> & { filters?: string },
|
|
25
|
+
): Promise<TriggerToolResult> {
|
|
26
|
+
if (params.actionParams !== undefined) {
|
|
27
|
+
const verdict = validateActionParamsForAction({
|
|
28
|
+
action: params.action,
|
|
29
|
+
actionParams: params.actionParams,
|
|
30
|
+
});
|
|
31
|
+
if (!verdict.ok) return toolError(verdict.message);
|
|
32
|
+
}
|
|
33
|
+
let filters: Record<string, unknown> | undefined;
|
|
34
|
+
if (params.filters) {
|
|
35
|
+
const parsed = parseJsonObject(params.filters);
|
|
36
|
+
if (!parsed) return toolError("filters must be a JSON object");
|
|
37
|
+
filters = parsed;
|
|
38
|
+
}
|
|
39
|
+
const trigger = await apiCreateTrigger({ ...params, filters });
|
|
40
|
+
const text = `Trigger "${trigger.name}" created (ID: ${trigger.id}, Kind: ${trigger.kind ?? "AUTOMATION"}, Action: ${trigger.action}).`;
|
|
41
|
+
return { content: [{ type: "text", text }] };
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** A flag value that must be a JSON object; undefined for anything else. */
|
|
45
|
+
export function parseJsonObject(raw: string): Record<string, unknown> | undefined {
|
|
46
|
+
try {
|
|
47
|
+
const parsed: unknown = JSON.parse(raw);
|
|
48
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
return Object.fromEntries(Object.entries(parsed));
|
|
52
|
+
} catch {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { getBoard } from "../langwatch-api-boards.js";
|
|
2
|
+
import { LangWatchApiError } from "../langwatch-api.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Refuses a dashboard id that names no Dashboards board in this project, naming the id, so an
|
|
6
|
+
* agent's typo, or the id of an Analytics Reports board, fails before any widget is written.
|
|
7
|
+
*/
|
|
8
|
+
export async function assertDashboardExists({
|
|
9
|
+
projectId,
|
|
10
|
+
dashboardId,
|
|
11
|
+
}: {
|
|
12
|
+
projectId: string;
|
|
13
|
+
dashboardId: string;
|
|
14
|
+
}): Promise<void> {
|
|
15
|
+
try {
|
|
16
|
+
await getBoard({ projectId, boardId: dashboardId });
|
|
17
|
+
} catch (error) {
|
|
18
|
+
if (error instanceof LangWatchApiError && error.status === 404) {
|
|
19
|
+
throw new Error(
|
|
20
|
+
`No dashboard with ID "${dashboardId}" was found in this project. Use list_dashboard_boards to find a valid dashboard ID.`,
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { DashboardWidgetQueryInput } from "../langwatch-api-dashboard-widgets.js";
|
|
2
|
+
|
|
3
|
+
/** A widget file rarely needs more than a couple of named queries (server bound). */
|
|
4
|
+
export const MAX_DASHBOARD_WIDGET_QUERIES = 8;
|
|
5
|
+
|
|
6
|
+
/** The `{ name: sql }` shorthand or the array form the REST endpoint takes. */
|
|
7
|
+
export type DashboardWidgetQueriesInput = DashboardWidgetQueryInput[] | Record<string, string>;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Turns the `{ name: sql }` shorthand into the array shape the REST endpoint validates,
|
|
11
|
+
* refusing an empty or oversized set before any request is made.
|
|
12
|
+
*/
|
|
13
|
+
export function normalizeDashboardWidgetQueries({
|
|
14
|
+
queries,
|
|
15
|
+
}: {
|
|
16
|
+
queries: DashboardWidgetQueriesInput;
|
|
17
|
+
}): DashboardWidgetQueryInput[] {
|
|
18
|
+
const normalized = Array.isArray(queries)
|
|
19
|
+
? queries
|
|
20
|
+
: Object.entries(queries).map(([name, sql]) => ({ name, sql }));
|
|
21
|
+
if (normalized.length === 0) {
|
|
22
|
+
throw new Error(
|
|
23
|
+
"Provide at least one named LWQL query in `queries`. Validate each query's SQL first with run_query.",
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
if (normalized.length > MAX_DASHBOARD_WIDGET_QUERIES) {
|
|
27
|
+
throw new Error(
|
|
28
|
+
`A widget may declare at most ${MAX_DASHBOARD_WIDGET_QUERIES} queries, got ${normalized.length}.`,
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
return normalized;
|
|
32
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { deleteAgent as apiDeleteAgent } from "../langwatch-api-agents.
|
|
1
|
+
import { deleteAgent as apiDeleteAgent } from "../langwatch-api-agents.ts";
|
|
2
2
|
|
|
3
3
|
export async function handleDeleteAgent(params: { id: string }): Promise<string> {
|
|
4
4
|
const result = await apiDeleteAgent(params.id);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { deleteAnnotation as apiDeleteAnnotation } from "../langwatch-api-annotations.
|
|
1
|
+
import { deleteAnnotation as apiDeleteAnnotation } from "../langwatch-api-annotations.ts";
|
|
2
2
|
|
|
3
3
|
export async function handleDeleteAnnotation(params: { id: string }): Promise<string> {
|
|
4
4
|
await apiDeleteAnnotation(params.id);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { deleteDashboard as apiDeleteDashboard } from "../langwatch-api-dashboards.
|
|
1
|
+
import { deleteDashboard as apiDeleteDashboard } from "../langwatch-api-dashboards.ts";
|
|
2
2
|
|
|
3
3
|
export async function handleDeleteDashboard(params: { id: string }): Promise<string> {
|
|
4
4
|
const result = await apiDeleteDashboard(params.id);
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import { deleteDatasetRecords as apiDeleteDatasetRecords } from "../langwatch-api-datasets.
|
|
1
|
+
import { deleteDatasetRecords as apiDeleteDatasetRecords } from "../langwatch-api-datasets.ts";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* Handles the platform_delete_dataset_records MCP tool
|
|
5
|
-
*
|
|
6
|
-
* Deletes records from a dataset by IDs and returns confirmation
|
|
7
|
-
* with the count of records deleted.
|
|
4
|
+
* Handles the platform_delete_dataset_records MCP tool: deletes records
|
|
5
|
+
* by ID and returns a confirmation with the count deleted.
|
|
8
6
|
*/
|
|
9
7
|
export async function handleDeleteDatasetRecords(params: {
|
|
10
8
|
slugOrId: string;
|
|
@@ -14,9 +12,7 @@ export async function handleDeleteDatasetRecords(params: {
|
|
|
14
12
|
|
|
15
13
|
const lines: string[] = [];
|
|
16
14
|
lines.push(`${result.deletedCount} record(s) deleted successfully!\n`);
|
|
17
|
-
lines.push(
|
|
18
|
-
"> Use `platform_get_dataset` to see the updated dataset.",
|
|
19
|
-
);
|
|
15
|
+
lines.push("> Use `platform_get_dataset` to see the updated dataset.");
|
|
20
16
|
|
|
21
17
|
return lines.join("\n");
|
|
22
18
|
}
|
|
@@ -1,20 +1,16 @@
|
|
|
1
|
-
import { deleteDataset as apiDeleteDataset } from "../langwatch-api-datasets.
|
|
1
|
+
import { deleteDataset as apiDeleteDataset } from "../langwatch-api-datasets.ts";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Handles the platform_delete_dataset MCP tool invocation.
|
|
5
5
|
*
|
|
6
6
|
* Archives (soft-deletes) a dataset and returns confirmation.
|
|
7
7
|
*/
|
|
8
|
-
export async function handleDeleteDataset(params: {
|
|
9
|
-
slugOrId: string;
|
|
10
|
-
}): Promise<string> {
|
|
8
|
+
export async function handleDeleteDataset(params: { slugOrId: string }): Promise<string> {
|
|
11
9
|
await apiDeleteDataset(params.slugOrId);
|
|
12
10
|
|
|
13
11
|
const lines: string[] = [];
|
|
14
12
|
lines.push("Dataset deleted successfully!\n");
|
|
15
|
-
lines.push(
|
|
16
|
-
"> The dataset has been archived and will no longer appear in listings.",
|
|
17
|
-
);
|
|
13
|
+
lines.push("> The dataset has been archived and will no longer appear in listings.");
|
|
18
14
|
|
|
19
15
|
return lines.join("\n");
|
|
20
16
|
}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import { deleteEvaluator as apiDeleteEvaluator } from "../langwatch-api-evaluators.
|
|
1
|
+
import { deleteEvaluator as apiDeleteEvaluator } from "../langwatch-api-evaluators.ts";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Handles the platform_delete_evaluator MCP tool invocation.
|
|
5
5
|
*/
|
|
6
|
-
export async function handleDeleteEvaluator(params: {
|
|
7
|
-
idOrSlug
|
|
8
|
-
}): Promise<string> {
|
|
9
|
-
const result = await apiDeleteEvaluator(params.idOrSlug);
|
|
6
|
+
export async function handleDeleteEvaluator(params: { idOrSlug: string }): Promise<string> {
|
|
7
|
+
await apiDeleteEvaluator(params.idOrSlug);
|
|
10
8
|
|
|
11
|
-
return `Evaluator ${
|
|
9
|
+
return `Evaluator ${params.idOrSlug} has been archived (soft-deleted).`;
|
|
12
10
|
}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import { deletePromptTag as apiDeletePromptTag } from "../langwatch-api.
|
|
1
|
+
import { deletePromptTag as apiDeletePromptTag } from "../langwatch-api.ts";
|
|
2
2
|
|
|
3
|
-
export async function handleDeletePromptTag(params: {
|
|
4
|
-
tag: string;
|
|
5
|
-
}): Promise<string> {
|
|
3
|
+
export async function handleDeletePromptTag(params: { tag: string }): Promise<string> {
|
|
6
4
|
await apiDeletePromptTag(params.tag);
|
|
7
5
|
|
|
8
6
|
const lines: string[] = [];
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { deleteWorkflow as apiDeleteWorkflow } from "../langwatch-api-workflows.
|
|
1
|
+
import { deleteWorkflow as apiDeleteWorkflow } from "../langwatch-api-workflows.ts";
|
|
2
2
|
|
|
3
3
|
export async function handleDeleteWorkflow(params: { id: string }): Promise<string> {
|
|
4
4
|
const result = await apiDeleteWorkflow(params.id);
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import {
|
|
2
|
+
AVAILABLE_EVALUATORS,
|
|
3
|
+
type EvaluatorDefinition,
|
|
4
|
+
type EvaluatorTypes,
|
|
5
|
+
} from "@langwatch/evaluator-contract";
|
|
3
6
|
|
|
4
7
|
/**
|
|
5
|
-
* Formats evaluator schema
|
|
6
|
-
*
|
|
7
|
-
* Two levels of detail:
|
|
8
|
-
* - Overview (no evaluatorType): compact list of all evaluator types
|
|
9
|
-
* - Detail (with evaluatorType): full schema for one evaluator type
|
|
8
|
+
* Formats evaluator schema for discover_schema: an overview (all types,
|
|
9
|
+
* compact) when no evaluatorType is given, else the full schema for one.
|
|
10
10
|
*/
|
|
11
11
|
export function formatEvaluatorSchema(evaluatorType?: string): string {
|
|
12
12
|
if (evaluatorType) {
|
|
@@ -50,9 +50,22 @@ function formatEvaluatorOverview(): string {
|
|
|
50
50
|
return lines.join("\n");
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
+
function settingsSection(settingsEntries: [string, unknown][]): string[] {
|
|
54
|
+
if (settingsEntries.length === 0) return [];
|
|
55
|
+
const lines = ["\n## Settings\n"];
|
|
56
|
+
for (const [key, setting] of settingsEntries) {
|
|
57
|
+
const s = setting as { description?: string; default: unknown };
|
|
58
|
+
const defaultStr = JSON.stringify(s.default);
|
|
59
|
+
const desc = s.description ? ` - ${s.description}` : "";
|
|
60
|
+
lines.push(`- **${key}**${desc}`);
|
|
61
|
+
lines.push(` Default: \`${defaultStr}\``);
|
|
62
|
+
}
|
|
63
|
+
return lines;
|
|
64
|
+
}
|
|
65
|
+
|
|
53
66
|
/**
|
|
54
|
-
* Returns the full schema for a specific evaluator type
|
|
55
|
-
*
|
|
67
|
+
* Returns the full schema for a specific evaluator type: settings, required/optional
|
|
68
|
+
* fields, env vars, and result fields.
|
|
56
69
|
*/
|
|
57
70
|
function formatEvaluatorDetail(evaluatorType: string): string {
|
|
58
71
|
const def = AVAILABLE_EVALUATORS[evaluatorType as EvaluatorTypes] as
|
|
@@ -85,18 +98,8 @@ function formatEvaluatorDetail(evaluatorType: string): string {
|
|
|
85
98
|
lines.push(`**Optional**: ${def.optionalFields.join(", ")}`);
|
|
86
99
|
}
|
|
87
100
|
|
|
88
|
-
// Settings
|
|
89
101
|
const settingsEntries = Object.entries(def.settings);
|
|
90
|
-
|
|
91
|
-
lines.push("\n## Settings\n");
|
|
92
|
-
for (const [key, setting] of settingsEntries) {
|
|
93
|
-
const s = setting as { description?: string; default: unknown };
|
|
94
|
-
const defaultStr = JSON.stringify(s.default);
|
|
95
|
-
const desc = s.description ? ` - ${s.description}` : "";
|
|
96
|
-
lines.push(`- **${key}**${desc}`);
|
|
97
|
-
lines.push(` Default: \`${defaultStr}\``);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
102
|
+
lines.push(...settingsSection(settingsEntries));
|
|
100
103
|
|
|
101
104
|
// Env vars
|
|
102
105
|
if (def.envVars.length > 0) {
|
|
@@ -118,12 +121,18 @@ function formatEvaluatorDetail(evaluatorType: string): string {
|
|
|
118
121
|
|
|
119
122
|
lines.push("\n## Usage Example\n");
|
|
120
123
|
lines.push("```json");
|
|
121
|
-
lines.push(
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
124
|
+
lines.push(
|
|
125
|
+
JSON.stringify(
|
|
126
|
+
{
|
|
127
|
+
evaluatorType: evaluatorType,
|
|
128
|
+
settings: Object.fromEntries(
|
|
129
|
+
settingsEntries.map(([key, setting]) => [key, (setting as { default: unknown }).default]),
|
|
130
|
+
),
|
|
131
|
+
},
|
|
132
|
+
null,
|
|
133
|
+
2,
|
|
125
134
|
),
|
|
126
|
-
|
|
135
|
+
);
|
|
127
136
|
lines.push("```");
|
|
128
137
|
|
|
129
138
|
return lines.join("\n");
|