@langwatch/mcp-server 2.2.0 → 3.0.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/CHANGELOG.md +26 -0
- package/dist/add-dashboard-widget-55UI6H22.js +44 -0
- package/dist/add-dashboard-widget-MJHIC3CC.js +45 -0
- package/dist/{archive-project-SPVHXK6A.js → archive-project-K5UD7A6X.js} +4 -4
- package/dist/{archive-project-KWFM3I5Z.js → archive-project-L4PAKT34.js} +4 -4
- package/dist/{archive-run-plan-65QN3XRX.js → archive-run-plan-5HSQG2HX.js} +4 -4
- package/dist/{archive-run-plan-Z4SYE6BP.js → archive-run-plan-AOKNYQIO.js} +4 -4
- package/dist/{archive-scenario-FXEYQNEH.js → archive-scenario-2CWJW2VD.js} +4 -4
- package/dist/{archive-scenario-A6QV5LOW.js → archive-scenario-5IJQESHH.js} +4 -4
- package/dist/{archive-test-suite-NKZDZY3D.js → archive-test-suite-OPB7NFI7.js} +4 -4
- package/dist/{archive-test-suite-5ADQ3KPQ.js → archive-test-suite-ZC3TN6VH.js} +4 -4
- package/dist/{assign-prompt-tag-5IUZXJ2T.js → assign-prompt-tag-6DDE6ZZ5.js} +3 -3
- package/dist/{assign-prompt-tag-HBZLBIFD.js → assign-prompt-tag-D7O23MJM.js} +3 -3
- package/dist/{chunk-HGELNIVY.js → chunk-4RX3G62A.js} +3 -3
- package/dist/{chunk-UWLE5T2F.js → chunk-7CZQDZ2K.js} +10 -3
- package/dist/{chunk-I7ATIZED.js → chunk-7GETGE6B.js} +2 -2
- package/dist/{chunk-3OCG3QPU.js → chunk-AASW2TO2.js} +2 -2
- package/dist/{chunk-UTJCWXPZ.js → chunk-B4RFWIUP.js} +2 -2
- package/dist/{chunk-B4J3PJLX.js → chunk-D2HS73VI.js} +2 -6
- package/dist/{chunk-H6WGMG2T.js → chunk-DULFP3MK.js} +1 -1
- package/dist/{chunk-YCARO42Z.js → chunk-EYPJBL7P.js} +3 -3
- package/dist/{chunk-SUPUUC4W.js → chunk-GA5JUSPT.js} +2 -2
- package/dist/{chunk-Y34DHR5K.js → chunk-HLQJXUR6.js} +2 -2
- package/dist/{chunk-SXFC3FNH.js → chunk-KILVK3FS.js} +2 -2
- package/dist/chunk-MOCU5XWF.js +79 -0
- package/dist/chunk-O2WGVCED.js +41 -0
- package/dist/{chunk-NKMTIHIJ.js → chunk-QXLMHLRC.js} +2 -2
- package/dist/{chunk-J7PQKBLD.js → chunk-R5YJIYPF.js} +512 -402
- package/dist/{chunk-JRJPH75H.js → chunk-RFC2SBEX.js} +2 -2
- package/dist/{chunk-UNJM3BIL.js → chunk-SHSVN3SE.js} +2 -2
- package/dist/{chunk-PTDR56Z3.js → chunk-VOUGDY2O.js} +2 -2
- package/dist/chunk-WCKZDOGF.js +31 -0
- package/dist/{chunk-7VNSRCXO.js → chunk-XQYH52SI.js} +2 -2
- package/dist/{chunk-VMWJD732.js → chunk-YCIUEZVK.js} +2 -2
- package/dist/{config-EAKW6F26.js → config-2WQGMAEN.js} +2 -2
- package/dist/config.js +1 -1
- package/dist/{create-agent-AYZ3LB3V.js → create-agent-6JNLMYQD.js} +4 -4
- package/dist/{create-agent-S5ZBCEFT.js → create-agent-IRZOU4R5.js} +4 -4
- package/dist/create-analytics-report-N4L4V5QL.js +19 -0
- package/dist/create-analytics-report-QEHXG7FU.js +18 -0
- package/dist/{create-annotation-VUSXULQK.js → create-annotation-CCEGIZ67.js} +4 -4
- package/dist/{create-annotation-LHNCLHYP.js → create-annotation-DTHCMWHB.js} +4 -4
- package/dist/{create-api-key-NNYKARMG.js → create-api-key-JKM2DSZO.js} +4 -4
- package/dist/{create-api-key-T4KSNPKB.js → create-api-key-JPEUIXGM.js} +4 -4
- package/dist/{create-dataset-LUP5PVDM.js → create-dataset-DJNXYJ5B.js} +4 -4
- package/dist/{create-dataset-2MC4SD4O.js → create-dataset-WON4SOTC.js} +4 -4
- package/dist/{create-dataset-records-NSKBZP3G.js → create-dataset-records-TMEOTLTO.js} +4 -4
- package/dist/{create-dataset-records-W4GLN2FV.js → create-dataset-records-UJBW3C7C.js} +4 -4
- package/dist/{create-evaluator-HMTYO5SS.js → create-evaluator-N5AEHI4K.js} +4 -4
- package/dist/{create-evaluator-643G6LXL.js → create-evaluator-XYNY2YFY.js} +4 -4
- package/dist/create-mcp-server.cjs +769 -570
- package/dist/create-mcp-server.js +502 -392
- package/dist/{create-project-KAIC46UY.js → create-project-EY4XZ7TH.js} +4 -4
- package/dist/{create-project-6N7PIYRY.js → create-project-YL345T5L.js} +4 -4
- package/dist/{create-prompt-E67LXIYT.js → create-prompt-JZQNQ7I3.js} +3 -3
- package/dist/{create-prompt-PKJ7EDRR.js → create-prompt-ZUMQHHX7.js} +3 -3
- package/dist/{create-prompt-tag-4YO3FSJ3.js → create-prompt-tag-CJ5FZ436.js} +3 -3
- package/dist/{create-prompt-tag-OPQUEXWB.js → create-prompt-tag-JFP2Q3PO.js} +3 -3
- package/dist/{create-scenario-5PJBMAXO.js → create-scenario-CQU2SSFB.js} +4 -4
- package/dist/{create-scenario-UEM77OE7.js → create-scenario-S6OWWKJO.js} +4 -4
- package/dist/{create-test-suite-SZEPVXSE.js → create-test-suite-OLGCAGJA.js} +4 -4
- package/dist/{create-test-suite-4IPXVSFQ.js → create-test-suite-Y7P2RI4L.js} +4 -4
- package/dist/{create-trigger-PRELMT6J.js → create-trigger-4CNBTISJ.js} +4 -4
- package/dist/{create-trigger-5HZSCRAN.js → create-trigger-RQ653WYF.js} +4 -4
- package/dist/dashboards-BA7M6CMO.js +90 -0
- package/dist/dashboards-U663GUIB.js +91 -0
- package/dist/{delete-agent-QMEK3XHK.js → delete-agent-J2Q4DRZ2.js} +4 -4
- package/dist/{delete-agent-JUIZWAXG.js → delete-agent-ZAU4LTXB.js} +4 -4
- package/dist/delete-analytics-report-QK6X7P4S.js +19 -0
- package/dist/delete-analytics-report-YUYLDHLL.js +18 -0
- package/dist/{delete-annotation-HY3O2OGR.js → delete-annotation-7X4NYXXM.js} +4 -4
- package/dist/{delete-annotation-VKIQWUYW.js → delete-annotation-KJOCDLV3.js} +4 -4
- package/dist/{delete-dataset-WKRUW4FP.js → delete-dataset-NXP7ZPPV.js} +4 -4
- package/dist/{delete-dataset-HQCR66MG.js → delete-dataset-RUTZBBVD.js} +4 -4
- package/dist/{delete-dataset-records-C2IQFFVQ.js → delete-dataset-records-4Z7DZCDW.js} +4 -4
- package/dist/{delete-dataset-records-SDUHQLLM.js → delete-dataset-records-75UAR5IS.js} +4 -4
- package/dist/{delete-evaluator-4SNSCLEE.js → delete-evaluator-E3CUNGTQ.js} +4 -4
- package/dist/{delete-evaluator-QP3QHTLN.js → delete-evaluator-RI4GALGX.js} +4 -4
- package/dist/{delete-prompt-tag-NZ4JQMYG.js → delete-prompt-tag-LE3WJPKS.js} +3 -3
- package/dist/{delete-prompt-tag-YYQ4VMAD.js → delete-prompt-tag-S4KBZTNG.js} +3 -3
- package/dist/{delete-workflow-JSWABL5F.js → delete-workflow-4CZFIQCQ.js} +4 -4
- package/dist/{delete-workflow-5J46T73T.js → delete-workflow-PWQPDW6H.js} +4 -4
- package/dist/{discover-schema-A33SLMXW.js → discover-schema-7WHIIATI.js} +4 -4
- package/dist/{discover-schema-55YJBFGQ.js → discover-schema-J2ANOBKO.js} +4 -4
- package/dist/{get-agent-LJQX7OF4.js → get-agent-5T3CXQOR.js} +4 -4
- package/dist/{get-agent-OTIYUFZA.js → get-agent-ZKYQJUQ7.js} +4 -4
- package/dist/{get-analytics-IQZKJHLW.js → get-analytics-4MPEK4KV.js} +3 -3
- package/dist/{get-analytics-DCS72353.js → get-analytics-ZLI3A4F5.js} +3 -3
- package/dist/get-analytics-report-JCKYMA2S.js +29 -0
- package/dist/get-analytics-report-SKIP2JWH.js +30 -0
- package/dist/{get-dataset-ALSP7RTX.js → get-dataset-APGZBYMH.js} +4 -4
- package/dist/{get-dataset-X4B5JDG2.js → get-dataset-LWXDVMVE.js} +4 -4
- package/dist/{get-evaluator-XEUZGZCH.js → get-evaluator-3A7BJBAB.js} +4 -4
- package/dist/{get-evaluator-ISMC4LLI.js → get-evaluator-IWNJINRY.js} +4 -4
- package/dist/{get-project-RM6FRCBK.js → get-project-EQVB4LEL.js} +4 -4
- package/dist/{get-project-5VKROSDH.js → get-project-RK6AJTEP.js} +4 -4
- package/dist/{get-prompt-OWXJZHQQ.js → get-prompt-TLG2T2DS.js} +3 -3
- package/dist/{get-prompt-W52DY36E.js → get-prompt-ZER557X3.js} +3 -3
- package/dist/{get-run-plan-RUXQ6PAX.js → get-run-plan-5X7DDJRN.js} +4 -4
- package/dist/{get-run-plan-BE3M2AUX.js → get-run-plan-PEHRO5M3.js} +4 -4
- package/dist/{get-scenario-YM4ODWW6.js → get-scenario-375W5D6I.js} +4 -4
- package/dist/{get-scenario-RNM7BAX2.js → get-scenario-UQX45ZZO.js} +4 -4
- package/dist/{get-simulation-run-LCFSMPGQ.js → get-simulation-run-2NBXJADG.js} +4 -4
- package/dist/{get-simulation-run-6GIATQE5.js → get-simulation-run-QZTLGL7W.js} +4 -4
- package/dist/{get-test-suite-GC2O7YH6.js → get-test-suite-GVIBDG7K.js} +4 -4
- package/dist/{get-test-suite-P5LJ6VLF.js → get-test-suite-OODIR3RI.js} +4 -4
- package/dist/{get-trace-SEF3FMR5.js → get-trace-AGCHVPJK.js} +3 -3
- package/dist/{get-trace-KBRVV4NN.js → get-trace-KJLYAZRC.js} +3 -3
- package/dist/{get-workflow-7PVED7JE.js → get-workflow-3TV2YYC5.js} +4 -4
- package/dist/{get-workflow-YXULW4GC.js → get-workflow-7LZSVPP2.js} +4 -4
- package/dist/{http-server-IR4QOS43.js → http-server-7CCN3EHJ.js} +245 -45
- package/dist/index.js +1750 -870
- package/dist/langwatch-api-analytics-reports-6CF6KUET.js +17 -0
- package/dist/langwatch-api-analytics-reports-RPFB5AO5.js +18 -0
- package/dist/{langwatch-api-annotations-TBHLCQ5R.js → langwatch-api-annotations-H4AI4TKG.js} +4 -4
- package/dist/{langwatch-api-annotations-6SA4OB4C.js → langwatch-api-annotations-QSJNUQQS.js} +4 -4
- package/dist/{langwatch-api-monitors-CBF3FGIM.js → langwatch-api-monitors-ENHLOL3S.js} +3 -3
- package/dist/{langwatch-api-monitors-YNWA2M5Y.js → langwatch-api-monitors-OHSGADTH.js} +3 -3
- package/dist/{langwatch-api-secrets-RNFO4LF2.js → langwatch-api-secrets-AGW6UUMD.js} +3 -3
- package/dist/{langwatch-api-secrets-ADTOJELP.js → langwatch-api-secrets-CLTS766Q.js} +3 -3
- package/dist/{langwatch-api-triggers-KQDQC6L5.js → langwatch-api-triggers-G5UWFNN2.js} +4 -4
- package/dist/{langwatch-api-triggers-QS7HDIVW.js → langwatch-api-triggers-QMR7KEXW.js} +4 -4
- package/dist/langwatch-api-workflows-HKTBIKKY.js +15 -0
- package/dist/{langwatch-api-workflows-OKC4FXIF.js → langwatch-api-workflows-OMROZH2O.js} +4 -4
- package/dist/{list-agents-HVYWEQMI.js → list-agents-BYWDNAHT.js} +4 -4
- package/dist/{list-agents-RBAOCF53.js → list-agents-MG24MHZE.js} +4 -4
- package/dist/list-analytics-reports-G3EPWGSQ.js +32 -0
- package/dist/list-analytics-reports-PPWIFRES.js +33 -0
- package/dist/{list-annotations-HJH4NBLD.js → list-annotations-QCLGEK5A.js} +4 -4
- package/dist/{list-annotations-J4UAHSUN.js → list-annotations-Y4EUBJHG.js} +4 -4
- package/dist/{list-api-keys-A2PMV435.js → list-api-keys-DAVOBPFK.js} +4 -4
- package/dist/{list-api-keys-7UTJRZDG.js → list-api-keys-JMW5WRXX.js} +4 -4
- package/dist/list-dashboards-2P3VJFRS.js +29 -0
- package/dist/list-dashboards-MW5O3MKH.js +30 -0
- package/dist/{list-dataset-records-WFM7F33C.js → list-dataset-records-KEHT7G6Q.js} +4 -4
- package/dist/{list-dataset-records-M5TKA6LK.js → list-dataset-records-KMLLMZAZ.js} +4 -4
- package/dist/{list-datasets-B5X4P7BQ.js → list-datasets-P3JK2ZHS.js} +4 -4
- package/dist/{list-datasets-THUKQHPX.js → list-datasets-Z7OOE4KI.js} +4 -4
- package/dist/{list-evaluators-MYH2OVCI.js → list-evaluators-7RRESBOU.js} +4 -4
- package/dist/{list-evaluators-NLVWF6K7.js → list-evaluators-VATJVOHR.js} +4 -4
- package/dist/{list-model-providers-3JUGP4YI.js → list-model-providers-OXDRPUCJ.js} +4 -4
- package/dist/{list-model-providers-H3XKORFO.js → list-model-providers-VXQJWDXU.js} +4 -4
- package/dist/{list-projects-6EJ5YYEW.js → list-projects-HUVK7L3W.js} +4 -4
- package/dist/{list-projects-YNNSRMLC.js → list-projects-X72ZXVY5.js} +4 -4
- package/dist/{list-prompt-tags-NVFQO6WX.js → list-prompt-tags-3I3LWFIR.js} +3 -3
- package/dist/{list-prompt-tags-XUQTTAH4.js → list-prompt-tags-DRHUH2ND.js} +3 -3
- package/dist/{list-prompts-IRI6AIXO.js → list-prompts-6DX3QECJ.js} +3 -3
- package/dist/{list-prompts-HSIMMHTF.js → list-prompts-PS423RU3.js} +3 -3
- package/dist/{list-run-plans-QALLCN2K.js → list-run-plans-5SXPOV3X.js} +4 -4
- package/dist/{list-run-plans-PX2XI6EK.js → list-run-plans-6VNHINPY.js} +4 -4
- package/dist/{list-scenarios-SSJQEMJP.js → list-scenarios-EQWCW7Q4.js} +4 -4
- package/dist/{list-scenarios-QZRPVHS4.js → list-scenarios-GKNH3YND.js} +4 -4
- package/dist/{list-simulation-runs-OEADLLQR.js → list-simulation-runs-KHY7KALI.js} +4 -4
- package/dist/{list-simulation-runs-KNOLGMDV.js → list-simulation-runs-PUDK32C2.js} +4 -4
- package/dist/{list-test-suites-ANAQBLDG.js → list-test-suites-7H2DRILK.js} +4 -4
- package/dist/{list-test-suites-N4WVLBKK.js → list-test-suites-GY56LGLY.js} +4 -4
- package/dist/{list-trigger-fires-JV3WFYYG.js → list-trigger-fires-7RZUP54Y.js} +4 -4
- package/dist/{list-trigger-fires-WTW4DVIW.js → list-trigger-fires-OZUF65LI.js} +4 -4
- package/dist/{list-triggers-SQNIG35Q.js → list-triggers-BGUCUXTJ.js} +4 -4
- package/dist/{list-triggers-V4Y356AK.js → list-triggers-XC5KMX4C.js} +4 -4
- package/dist/{list-workflows-ZHTX5LCL.js → list-workflows-55NYC3PC.js} +4 -4
- package/dist/{list-workflows-IMSX7SXU.js → list-workflows-HV7FUWZA.js} +4 -4
- package/dist/{rename-prompt-tag-IQI7MHOI.js → rename-prompt-tag-2I7Z5FCY.js} +3 -3
- package/dist/{rename-prompt-tag-PA2BRIE6.js → rename-prompt-tag-SZYTOWDX.js} +3 -3
- package/dist/{rename-test-suite-4J7UX5S2.js → rename-test-suite-27AYY33K.js} +4 -4
- package/dist/{rename-test-suite-NNVLMLKY.js → rename-test-suite-CLIEPZDO.js} +4 -4
- package/dist/{report-issue-AS34ZMJF.js → report-issue-5HSL7CNB.js} +28 -2
- package/dist/{report-issue-DCZFLGDO.js → report-issue-N7ND5TM6.js} +28 -2
- package/dist/{rerun-run-plan-TG2V4WM4.js → rerun-run-plan-O3VUZ6CG.js} +4 -4
- package/dist/{rerun-run-plan-ZI5OY3VA.js → rerun-run-plan-OJTVVGJI.js} +4 -4
- package/dist/{revoke-api-key-SFMEFWJC.js → revoke-api-key-BU6BKGCG.js} +4 -4
- package/dist/{revoke-api-key-3J3ZA4UB.js → revoke-api-key-NZNCFOIR.js} +4 -4
- package/dist/{run-agent-W4VJP72Z.js → run-agent-244O4Y5M.js} +4 -4
- package/dist/{run-agent-YNV6ZHW4.js → run-agent-HPCGZGYW.js} +4 -4
- package/dist/{run-plan-6C77GWG4.js → run-plan-2ZPGGZ4H.js} +4 -4
- package/dist/{run-plan-PAARQSI4.js → run-plan-KSXUYQT3.js} +4 -4
- package/dist/{run-query-KJDH544C.js → run-query-4LMOQ5UW.js} +4 -4
- package/dist/{run-query-T4QW2Z5O.js → run-query-BQUHIUC2.js} +4 -4
- package/dist/{run-test-suite-SQJELEZX.js → run-test-suite-P3WLVPXC.js} +4 -4
- package/dist/{run-test-suite-STB6NUJM.js → run-test-suite-UEOMCON6.js} +4 -4
- package/dist/{run-workflow-SP32SO5M.js → run-workflow-EFZ6HG5B.js} +4 -4
- package/dist/{run-workflow-D6PQNBI6.js → run-workflow-I4IHEN54.js} +4 -4
- package/dist/{search-traces-HCBGOG6R.js → search-traces-6IR7PR4L.js} +3 -3
- package/dist/{search-traces-HSTQ6WTQ.js → search-traces-BYML2NQ4.js} +3 -3
- package/dist/{set-model-provider-KDQ7C4EZ.js → set-model-provider-RBNGWFVI.js} +4 -4
- package/dist/{set-model-provider-GF7NXUJA.js → set-model-provider-SHEVKWRC.js} +4 -4
- package/dist/{update-agent-DWG43T2P.js → update-agent-PTKTM2B5.js} +4 -4
- package/dist/{update-agent-MXNOBS4H.js → update-agent-ZPXWRMS2.js} +4 -4
- package/dist/update-dashboard-widget-HKCBXH7X.js +62 -0
- package/dist/update-dashboard-widget-IP2TTQ5G.js +63 -0
- package/dist/{update-dataset-DQH3OHOU.js → update-dataset-GHIN6JR3.js} +4 -4
- package/dist/{update-dataset-SQZ6T4WX.js → update-dataset-IRVMY5PF.js} +4 -4
- package/dist/{update-dataset-record-7PLDGTMR.js → update-dataset-record-6VI7K2CL.js} +4 -4
- package/dist/{update-dataset-record-3AT4IPBC.js → update-dataset-record-Z3L7ACNF.js} +4 -4
- package/dist/{update-evaluator-4LFTKFPT.js → update-evaluator-5NLNE6VY.js} +4 -4
- package/dist/{update-evaluator-IGTX6PX4.js → update-evaluator-FEH7H6NS.js} +4 -4
- package/dist/{update-project-QVHSJRUP.js → update-project-75H3LDQT.js} +4 -4
- package/dist/{update-project-PLJIOZS6.js → update-project-QPR3QX55.js} +4 -4
- package/dist/{update-prompt-GDKRYJI3.js → update-prompt-BCDFTNLK.js} +3 -3
- package/dist/{update-prompt-MY263DYF.js → update-prompt-NPRXYSWA.js} +3 -3
- package/dist/{update-scenario-7KA3JDXA.js → update-scenario-BNOMDCMV.js} +4 -4
- package/dist/{update-scenario-MOHRQKAQ.js → update-scenario-EM5XGMB7.js} +4 -4
- package/package.json +2 -2
- package/pyproject.toml +17 -2
- package/src/config.d.ts +2 -0
- package/src/config.ts +2 -0
- package/src/create-mcp-server.ts +148 -41
- package/src/langwatch-api-analytics-reports.ts +62 -0
- package/src/langwatch-api-dashboard-widgets.ts +3 -68
- package/src/langwatch-api-dashboards.ts +110 -28
- package/src/langwatch-api-projects.ts +0 -17
- package/src/langwatch-api.ts +10 -0
- package/src/schemas/widget-sources.ts +33 -0
- package/src/tools/add-dashboard-widget.ts +20 -32
- package/src/tools/create-analytics-report.ts +7 -0
- package/src/tools/dashboard-widget-queries.ts +13 -0
- package/src/tools/dashboards.ts +104 -0
- package/src/tools/delete-analytics-report.ts +7 -0
- package/src/tools/get-analytics-report.ts +23 -0
- package/src/tools/list-analytics-reports.ts +27 -0
- package/src/tools/list-dashboards.ts +20 -21
- package/src/tools/report-issue.ts +2 -0
- package/src/tools/run-experiment.ts +5 -1
- package/src/tools/update-dashboard-widget.ts +29 -40
- package/uv.lock +667 -341
- package/dist/add-dashboard-widget-4ZC5UN73.js +0 -50
- package/dist/add-dashboard-widget-ACC6QYBG.js +0 -49
- package/dist/chunk-5FNCQRCX.js +0 -91
- package/dist/chunk-ILZDO25L.js +0 -36
- package/dist/chunk-K2I7Z3LZ.js +0 -28
- package/dist/create-dashboard-DHVFMEU4.js +0 -18
- package/dist/create-dashboard-WTKKS5Z6.js +0 -19
- package/dist/delete-dashboard-76N66XXL.js +0 -18
- package/dist/delete-dashboard-JVIVHNJM.js +0 -19
- package/dist/get-dashboard-5NYJEIX2.js +0 -29
- package/dist/get-dashboard-QMTYDQAZ.js +0 -30
- package/dist/langwatch-api-dashboards-6EO2VVZW.js +0 -17
- package/dist/langwatch-api-dashboards-NHU5BZD7.js +0 -18
- package/dist/langwatch-api-workflows-XGJE6SR5.js +0 -15
- package/dist/list-dashboard-boards-OPWROHMG.js +0 -33
- package/dist/list-dashboard-boards-U2GJ7GC5.js +0 -34
- package/dist/list-dashboards-ROSYFLDQ.js +0 -33
- package/dist/list-dashboards-RQ635ZU7.js +0 -32
- package/dist/update-dashboard-widget-CJKJLCDY.js +0 -71
- package/dist/update-dashboard-widget-CYQDS2NR.js +0 -70
- package/src/langwatch-api-boards.ts +0 -46
- package/src/tools/create-dashboard.ts +0 -7
- package/src/tools/dashboard-exists.ts +0 -25
- package/src/tools/delete-dashboard.ts +0 -7
- package/src/tools/get-dashboard.ts +0 -22
- package/src/tools/list-dashboard-boards.ts +0 -28
|
@@ -1,51 +1,133 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type {
|
|
2
|
+
DashboardWidget,
|
|
3
|
+
DashboardWidgetQueryInput,
|
|
4
|
+
} from "./langwatch-api-dashboard-widgets.js";
|
|
5
|
+
import { makeRequest } from "./langwatch-api.js";
|
|
2
6
|
|
|
3
|
-
|
|
7
|
+
/**
|
|
8
|
+
* A dashboard in the Dashboards area, at `/api/v1/dashboards`; the project comes from the API key
|
|
9
|
+
* (`modules/dashboard/contract/src/board-rest.schemas.ts`). Every route answers 404 while
|
|
10
|
+
* Dashboards is off for the key's project. Analytics Reports live at `/api/v1/analytics/reports`.
|
|
11
|
+
*/
|
|
12
|
+
export interface Dashboard {
|
|
4
13
|
id: string;
|
|
5
14
|
name: string;
|
|
6
|
-
|
|
7
|
-
|
|
15
|
+
description: string | null;
|
|
16
|
+
scope: "PRIVATE" | "PROJECT" | "ORGANIZATION";
|
|
17
|
+
createdById: string | null;
|
|
8
18
|
createdAt: string;
|
|
9
19
|
updatedAt: string;
|
|
20
|
+
platformUrl: string;
|
|
10
21
|
}
|
|
11
22
|
|
|
12
|
-
export interface
|
|
13
|
-
|
|
23
|
+
export interface DashboardListItem extends Dashboard {
|
|
24
|
+
widgetCount: number;
|
|
14
25
|
}
|
|
15
26
|
|
|
16
|
-
|
|
17
|
-
|
|
27
|
+
const dashboardPath = (dashboardId: string) =>
|
|
28
|
+
`/api/v1/dashboards/${encodeURIComponent(dashboardId)}`;
|
|
29
|
+
const widgetPath = (dashboardId: string, widgetId: string) =>
|
|
30
|
+
`${dashboardPath(dashboardId)}/widgets/${encodeURIComponent(widgetId)}`;
|
|
31
|
+
|
|
32
|
+
/** The key's project's dashboards, each with how many widgets it holds. */
|
|
33
|
+
export async function listDashboards(): Promise<{ data: DashboardListItem[] }> {
|
|
34
|
+
return makeRequest("GET", "/api/v1/dashboards") as Promise<{ data: DashboardListItem[] }>;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Reads one dashboard; a dashboard in another project, or an Analytics Report, answers 404. */
|
|
38
|
+
export async function getDashboard({ dashboardId }: { dashboardId: string }): Promise<Dashboard> {
|
|
39
|
+
return makeRequest("GET", dashboardPath(dashboardId)) as Promise<Dashboard>;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export async function createDashboard({ name }: { name: string }): Promise<Dashboard> {
|
|
43
|
+
return makeRequest("POST", "/api/v1/dashboards", { name }) as Promise<Dashboard>;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** A field left out keeps its value; a `null` description clears it. */
|
|
47
|
+
export async function updateDashboard({
|
|
48
|
+
dashboardId,
|
|
49
|
+
...changes
|
|
50
|
+
}: {
|
|
51
|
+
dashboardId: string;
|
|
52
|
+
name?: string;
|
|
53
|
+
description?: string | null;
|
|
54
|
+
}): Promise<Dashboard> {
|
|
55
|
+
return makeRequest("PATCH", dashboardPath(dashboardId), changes) as Promise<Dashboard>;
|
|
18
56
|
}
|
|
19
57
|
|
|
20
|
-
|
|
21
|
-
|
|
58
|
+
/** Deletes the dashboard with the widgets on it. */
|
|
59
|
+
export async function deleteDashboard({
|
|
60
|
+
dashboardId,
|
|
61
|
+
}: {
|
|
62
|
+
dashboardId: string;
|
|
63
|
+
}): Promise<{ id: string; name: string }> {
|
|
64
|
+
return makeRequest("DELETE", dashboardPath(dashboardId)) as Promise<{ id: string; name: string }>;
|
|
22
65
|
}
|
|
23
66
|
|
|
24
|
-
export async function
|
|
67
|
+
export async function listWidgetsOnDashboard({
|
|
68
|
+
dashboardId,
|
|
69
|
+
}: {
|
|
70
|
+
dashboardId: string;
|
|
71
|
+
}): Promise<{ data: DashboardWidget[] }> {
|
|
72
|
+
return makeRequest("GET", `${dashboardPath(dashboardId)}/widgets`) as Promise<{
|
|
73
|
+
data: DashboardWidget[];
|
|
74
|
+
}>;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** Saves a widget placed on this dashboard at the next free row. */
|
|
78
|
+
export async function createWidgetOnDashboard({
|
|
79
|
+
dashboardId,
|
|
80
|
+
...data
|
|
81
|
+
}: {
|
|
82
|
+
dashboardId: string;
|
|
83
|
+
name: string;
|
|
84
|
+
code: string;
|
|
85
|
+
queries: DashboardWidgetQueryInput[];
|
|
86
|
+
description?: string;
|
|
87
|
+
}): Promise<DashboardWidget> {
|
|
25
88
|
return makeRequest(
|
|
26
|
-
"
|
|
27
|
-
|
|
28
|
-
|
|
89
|
+
"POST",
|
|
90
|
+
`${dashboardPath(dashboardId)}/widgets`,
|
|
91
|
+
data,
|
|
92
|
+
) as Promise<DashboardWidget>;
|
|
29
93
|
}
|
|
30
94
|
|
|
31
|
-
|
|
32
|
-
|
|
95
|
+
/** A widget on any other dashboard answers 404. */
|
|
96
|
+
export async function getWidgetOnDashboard({
|
|
97
|
+
dashboardId,
|
|
98
|
+
widgetId,
|
|
99
|
+
}: {
|
|
100
|
+
dashboardId: string;
|
|
101
|
+
widgetId: string;
|
|
102
|
+
}): Promise<DashboardWidget> {
|
|
103
|
+
return makeRequest("GET", widgetPath(dashboardId, widgetId)) as Promise<DashboardWidget>;
|
|
33
104
|
}
|
|
34
105
|
|
|
35
|
-
export async function
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
106
|
+
export async function updateWidgetOnDashboard({
|
|
107
|
+
dashboardId,
|
|
108
|
+
widgetId,
|
|
109
|
+
...changes
|
|
110
|
+
}: {
|
|
111
|
+
dashboardId: string;
|
|
112
|
+
widgetId: string;
|
|
113
|
+
name?: string;
|
|
114
|
+
code?: string;
|
|
115
|
+
queries?: DashboardWidgetQueryInput[];
|
|
116
|
+
description?: string;
|
|
117
|
+
}): Promise<DashboardWidget> {
|
|
39
118
|
return makeRequest(
|
|
40
119
|
"PATCH",
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
) as Promise<
|
|
120
|
+
widgetPath(dashboardId, widgetId),
|
|
121
|
+
changes,
|
|
122
|
+
) as Promise<DashboardWidget>;
|
|
44
123
|
}
|
|
45
124
|
|
|
46
|
-
export async function
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
125
|
+
export async function deleteWidgetOnDashboard({
|
|
126
|
+
dashboardId,
|
|
127
|
+
widgetId,
|
|
128
|
+
}: {
|
|
129
|
+
dashboardId: string;
|
|
130
|
+
widgetId: string;
|
|
131
|
+
}): Promise<void> {
|
|
132
|
+
await makeRequest("DELETE", widgetPath(dashboardId, widgetId));
|
|
51
133
|
}
|
|
@@ -45,23 +45,6 @@ export async function getProject(id: string): Promise<ProjectSummary> {
|
|
|
45
45
|
) as Promise<ProjectSummary>;
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
/** Identity of the project the calling API key belongs to. */
|
|
49
|
-
export interface CurrentProjectIdentity {
|
|
50
|
-
id: string;
|
|
51
|
-
name: string;
|
|
52
|
-
slug: string;
|
|
53
|
-
isPersonal: boolean;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Resolves the project behind the configured API key. Needed for the
|
|
58
|
-
* `/api/v1/projects/:projectId/...` route family, whose path must name the
|
|
59
|
-
* caller's own project — there is no "current project" shorthand there.
|
|
60
|
-
*/
|
|
61
|
-
export async function getCurrentProject(): Promise<CurrentProjectIdentity> {
|
|
62
|
-
return makeRequest("GET", "/api/v1/me/project") as Promise<CurrentProjectIdentity>;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
48
|
export async function createProject(data: {
|
|
66
49
|
name: string;
|
|
67
50
|
language: string;
|
package/src/langwatch-api.ts
CHANGED
|
@@ -13,6 +13,12 @@ export const MCP_IDENTITY_HEADERS: Record<string, string> = {
|
|
|
13
13
|
"X-LangWatch-SDK-Version": packageJson.version,
|
|
14
14
|
};
|
|
15
15
|
|
|
16
|
+
/** The dated API version every request names (specs/api-reference/client-api-version.feature). */
|
|
17
|
+
export const LANGWATCH_API_VERSION = "2026-10-26";
|
|
18
|
+
|
|
19
|
+
/** Names the hosted MCP server's calls apart from a local server's. */
|
|
20
|
+
export const HOSTED_MCP_HEADER = "X-LangWatch-MCP-Host";
|
|
21
|
+
|
|
16
22
|
// --- Response types ---
|
|
17
23
|
|
|
18
24
|
export interface TraceSearchResult {
|
|
@@ -275,11 +281,15 @@ export async function makeRequest(
|
|
|
275
281
|
const url = config.endpoint + path;
|
|
276
282
|
const headers: Record<string, string> = {
|
|
277
283
|
...MCP_IDENTITY_HEADERS,
|
|
284
|
+
"X-API-Version": LANGWATCH_API_VERSION,
|
|
278
285
|
"X-Auth-Token": requireApiKey(),
|
|
279
286
|
};
|
|
280
287
|
if (config.projectId) {
|
|
281
288
|
headers["X-Project-Id"] = config.projectId;
|
|
282
289
|
}
|
|
290
|
+
if (config.hosted) {
|
|
291
|
+
headers[HOSTED_MCP_HEADER] = "hosted";
|
|
292
|
+
}
|
|
283
293
|
|
|
284
294
|
if (body !== undefined) {
|
|
285
295
|
headers["Content-Type"] = "application/json";
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `sources` input of the widget tools: the trace origins a widget's queries count, checked
|
|
3
|
+
* here so an unknown one never reaches the platform. Spec: dashboards-v2.feature AC200j, AC200n.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
|
|
7
|
+
/** The sources the platform takes, "other" being every origin not listed before it. */
|
|
8
|
+
export const WIDGET_SOURCES = [
|
|
9
|
+
"application",
|
|
10
|
+
"simulation",
|
|
11
|
+
"evaluation",
|
|
12
|
+
"sample",
|
|
13
|
+
"coding_agent",
|
|
14
|
+
"ai_tool",
|
|
15
|
+
"gateway",
|
|
16
|
+
"workflow",
|
|
17
|
+
"playground",
|
|
18
|
+
"langy",
|
|
19
|
+
"other",
|
|
20
|
+
] as const;
|
|
21
|
+
|
|
22
|
+
/** A trace origin a widget query can count. */
|
|
23
|
+
export type WidgetSource = (typeof WIDGET_SOURCES)[number];
|
|
24
|
+
|
|
25
|
+
/** The tools' `sources` input: refused at the tool when it names anything else. */
|
|
26
|
+
export const widgetSourcesInput = z
|
|
27
|
+
.array(z.enum(WIDGET_SOURCES))
|
|
28
|
+
.max(WIDGET_SOURCES.length)
|
|
29
|
+
.nullable()
|
|
30
|
+
.optional()
|
|
31
|
+
.describe(
|
|
32
|
+
`The trace origins every query of the widget counts: any of ${WIDGET_SOURCES.join(", ")} (other = any origin not listed). A new widget counts ["application"]; add "langy" to count your own conversations, as a widget about Langy's requests needs. null makes it unset again, counting the default.`,
|
|
33
|
+
);
|
|
@@ -1,19 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* does. The dashboard is checked first so a typo leaves no unplaced widget behind, and a
|
|
4
|
-
* failed placement deletes the widget it just created.
|
|
2
|
+
* `add_dashboard_widget`: one create under the dashboard's path, which also places the widget.
|
|
5
3
|
*/
|
|
6
4
|
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
deleteDashboardWidget,
|
|
11
|
-
} from "../langwatch-api-dashboard-widgets.js";
|
|
12
|
-
import { getCurrentProject } from "../langwatch-api-projects.js";
|
|
13
|
-
import { assertDashboardExists } from "./dashboard-exists.js";
|
|
5
|
+
import { createWidgetOnDashboard } from "../langwatch-api-dashboards.js";
|
|
6
|
+
import { LangWatchApiError } from "../langwatch-api.js";
|
|
7
|
+
import type { WidgetSource } from "../schemas/widget-sources.js";
|
|
14
8
|
import {
|
|
15
9
|
type DashboardWidgetQueriesInput,
|
|
16
10
|
normalizeDashboardWidgetQueries,
|
|
11
|
+
withSources,
|
|
17
12
|
} from "./dashboard-widget-queries.js";
|
|
18
13
|
|
|
19
14
|
export interface AddDashboardWidgetParams {
|
|
@@ -21,37 +16,30 @@ export interface AddDashboardWidgetParams {
|
|
|
21
16
|
name: string;
|
|
22
17
|
code: string;
|
|
23
18
|
queries: DashboardWidgetQueriesInput;
|
|
19
|
+
/** Set on every query; absent, the platform stores application on each. */
|
|
20
|
+
sources?: WidgetSource[] | null;
|
|
24
21
|
}
|
|
25
22
|
|
|
26
23
|
export async function handleAddDashboardWidget(params: AddDashboardWidgetParams): Promise<string> {
|
|
27
|
-
const queries =
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
await assertDashboardExists({ projectId: project.id, dashboardId: params.dashboardId });
|
|
31
|
-
|
|
32
|
-
const widget = await createDashboardWidget({
|
|
33
|
-
projectId: project.id,
|
|
34
|
-
name: params.name,
|
|
35
|
-
code: params.code,
|
|
36
|
-
queries,
|
|
24
|
+
const queries = withSources({
|
|
25
|
+
queries: normalizeDashboardWidgetQueries({ queries: params.queries }),
|
|
26
|
+
sources: params.sources,
|
|
37
27
|
});
|
|
38
28
|
|
|
29
|
+
let widget;
|
|
39
30
|
try {
|
|
40
|
-
await
|
|
41
|
-
projectId: project.id,
|
|
42
|
-
widgetId: widget.id,
|
|
31
|
+
widget = await createWidgetOnDashboard({
|
|
43
32
|
dashboardId: params.dashboardId,
|
|
33
|
+
name: params.name,
|
|
34
|
+
code: params.code,
|
|
35
|
+
queries,
|
|
44
36
|
});
|
|
45
37
|
} catch (error) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
widgetId: widget.id,
|
|
52
|
-
}).catch(() => {
|
|
53
|
-
// Best-effort cleanup; the assign error below is what the caller needs.
|
|
54
|
-
});
|
|
38
|
+
if (error instanceof LangWatchApiError && error.status === 404) {
|
|
39
|
+
throw new Error(
|
|
40
|
+
`No dashboard with ID "${params.dashboardId}" was found in this project. Use list_dashboards to find a valid dashboard ID.`,
|
|
41
|
+
);
|
|
42
|
+
}
|
|
55
43
|
throw error;
|
|
56
44
|
}
|
|
57
45
|
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { createAnalyticsReport } from "../langwatch-api-analytics-reports.ts";
|
|
2
|
+
|
|
3
|
+
export async function handleCreateAnalyticsReport(params: { name: string }): Promise<string> {
|
|
4
|
+
const report = await createAnalyticsReport({ name: params.name });
|
|
5
|
+
|
|
6
|
+
return `Analytics Report created successfully!\n\n**Name**: ${report.name}\n**ID**: ${report.id}`;
|
|
7
|
+
}
|
|
@@ -1,4 +1,17 @@
|
|
|
1
1
|
import type { DashboardWidgetQueryInput } from "../langwatch-api-dashboard-widgets.js";
|
|
2
|
+
import type { WidgetSource } from "../schemas/widget-sources.js";
|
|
3
|
+
|
|
4
|
+
/** Every query with `sources` set to the list given; as given when no list was named. */
|
|
5
|
+
export function withSources({
|
|
6
|
+
queries,
|
|
7
|
+
sources,
|
|
8
|
+
}: {
|
|
9
|
+
queries: readonly DashboardWidgetQueryInput[];
|
|
10
|
+
sources: WidgetSource[] | null | undefined;
|
|
11
|
+
}): DashboardWidgetQueryInput[] {
|
|
12
|
+
if (sources === undefined) return [...queries];
|
|
13
|
+
return queries.map((query) => ({ ...query, sources }));
|
|
14
|
+
}
|
|
2
15
|
|
|
3
16
|
/** A widget file rarely needs more than a couple of named queries (server bound). */
|
|
4
17
|
export const MAX_DASHBOARD_WIDGET_QUERIES = 8;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The dashboard tools over `/api/v1/dashboards`: read, create, rename and delete a dashboard,
|
|
3
|
+
* list a dashboard's widgets and delete one. Spec: modules/dashboard/specs/dashboards-v2.feature
|
|
4
|
+
* AC199s.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
type Dashboard,
|
|
9
|
+
createDashboard,
|
|
10
|
+
deleteDashboard,
|
|
11
|
+
deleteWidgetOnDashboard,
|
|
12
|
+
getDashboard,
|
|
13
|
+
listWidgetsOnDashboard,
|
|
14
|
+
updateDashboard,
|
|
15
|
+
} from "../langwatch-api-dashboards.js";
|
|
16
|
+
|
|
17
|
+
function describeDashboard(dashboard: Dashboard): string[] {
|
|
18
|
+
return [
|
|
19
|
+
`**Name**: ${dashboard.name}`,
|
|
20
|
+
`**ID**: ${dashboard.id}`,
|
|
21
|
+
`**Scope**: ${dashboard.scope}`,
|
|
22
|
+
...(dashboard.description ? [`**Description**: ${dashboard.description}`] : []),
|
|
23
|
+
`**URL**: ${dashboard.platformUrl}`,
|
|
24
|
+
];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Reads only `/api/v1/dashboards`; an Analytics Report's id is not found there. */
|
|
28
|
+
export async function handleGetDashboard({
|
|
29
|
+
dashboardId,
|
|
30
|
+
}: {
|
|
31
|
+
dashboardId: string;
|
|
32
|
+
}): Promise<string> {
|
|
33
|
+
const dashboard = await getDashboard({ dashboardId });
|
|
34
|
+
return [`# ${dashboard.name}\n`, ...describeDashboard(dashboard)].join("\n");
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export async function handleCreateDashboard({ name }: { name: string }): Promise<string> {
|
|
38
|
+
const dashboard = await createDashboard({ name });
|
|
39
|
+
return [
|
|
40
|
+
"Dashboard created.\n",
|
|
41
|
+
...describeDashboard(dashboard),
|
|
42
|
+
"",
|
|
43
|
+
"> Pass the ID to `add_dashboard_widget` to add a widget to it.",
|
|
44
|
+
].join("\n");
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export async function handleRenameDashboard({
|
|
48
|
+
dashboardId,
|
|
49
|
+
name,
|
|
50
|
+
description,
|
|
51
|
+
}: {
|
|
52
|
+
dashboardId: string;
|
|
53
|
+
name?: string;
|
|
54
|
+
description?: string;
|
|
55
|
+
}): Promise<string> {
|
|
56
|
+
if (name === undefined && description === undefined) {
|
|
57
|
+
throw new Error("Provide at least one of name or description to change.");
|
|
58
|
+
}
|
|
59
|
+
const dashboard = await updateDashboard({
|
|
60
|
+
dashboardId,
|
|
61
|
+
...(name === undefined ? {} : { name }),
|
|
62
|
+
...(description === undefined ? {} : { description }),
|
|
63
|
+
});
|
|
64
|
+
return ["Dashboard updated.\n", ...describeDashboard(dashboard)].join("\n");
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export async function handleDeleteDashboard({
|
|
68
|
+
dashboardId,
|
|
69
|
+
}: {
|
|
70
|
+
dashboardId: string;
|
|
71
|
+
}): Promise<string> {
|
|
72
|
+
const deleted = await deleteDashboard({ dashboardId });
|
|
73
|
+
return `Dashboard "${deleted.name}" deleted with its widgets (ID: ${deleted.id}).`;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export async function handleListDashboardWidgets({
|
|
77
|
+
dashboardId,
|
|
78
|
+
}: {
|
|
79
|
+
dashboardId: string;
|
|
80
|
+
}): Promise<string> {
|
|
81
|
+
const { data: widgets } = await listWidgetsOnDashboard({ dashboardId });
|
|
82
|
+
if (widgets.length === 0) return `Dashboard "${dashboardId}" has no widgets.`;
|
|
83
|
+
|
|
84
|
+
return [
|
|
85
|
+
`# Widgets on dashboard ${dashboardId} (${widgets.length} total)\n`,
|
|
86
|
+
...widgets.flatMap((widget) => [
|
|
87
|
+
`## ${widget.name}`,
|
|
88
|
+
`**ID**: ${widget.id}`,
|
|
89
|
+
`**Queries**: ${widget.definition.queries.map((query) => query.name).join(", ") || "(none)"}`,
|
|
90
|
+
"",
|
|
91
|
+
]),
|
|
92
|
+
].join("\n");
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export async function handleDeleteDashboardWidget({
|
|
96
|
+
dashboardId,
|
|
97
|
+
widgetId,
|
|
98
|
+
}: {
|
|
99
|
+
dashboardId: string;
|
|
100
|
+
widgetId: string;
|
|
101
|
+
}): Promise<string> {
|
|
102
|
+
await deleteWidgetOnDashboard({ dashboardId, widgetId });
|
|
103
|
+
return `Widget "${widgetId}" deleted from dashboard "${dashboardId}".`;
|
|
104
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { deleteAnalyticsReport } from "../langwatch-api-analytics-reports.ts";
|
|
2
|
+
|
|
3
|
+
export async function handleDeleteAnalyticsReport(params: { reportId: string }): Promise<string> {
|
|
4
|
+
const result = await deleteAnalyticsReport({ reportId: params.reportId });
|
|
5
|
+
|
|
6
|
+
return `Analytics Report deleted successfully!\n\n**Name**: ${result.name}\n**ID**: ${result.id}`;
|
|
7
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { getAnalyticsReport } from "../langwatch-api-analytics-reports.ts";
|
|
2
|
+
|
|
3
|
+
/** Reads only `/api/v1/analytics/reports`; a Dashboards dashboard's id is not found there. */
|
|
4
|
+
export async function handleGetAnalyticsReport(params: { reportId: string }): Promise<string> {
|
|
5
|
+
const report = await getAnalyticsReport({ reportId: params.reportId });
|
|
6
|
+
|
|
7
|
+
const lines: string[] = [];
|
|
8
|
+
lines.push(`# ${report.name}\n`);
|
|
9
|
+
lines.push(`**ID**: ${report.id}`);
|
|
10
|
+
lines.push(`**Order**: ${report.order}`);
|
|
11
|
+
lines.push(`**Graphs**: ${Array.isArray(report.graphs) ? report.graphs.length : 0}`);
|
|
12
|
+
lines.push(`**Created**: ${report.createdAt}`);
|
|
13
|
+
lines.push(`**Updated**: ${report.updatedAt}`);
|
|
14
|
+
|
|
15
|
+
if (Array.isArray(report.graphs) && report.graphs.length > 0) {
|
|
16
|
+
lines.push("\n## Graphs\n");
|
|
17
|
+
lines.push("```json");
|
|
18
|
+
lines.push(JSON.stringify(report.graphs, null, 2));
|
|
19
|
+
lines.push("```");
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return lines.join("\n");
|
|
23
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { listAnalyticsReports } from "../langwatch-api-analytics-reports.ts";
|
|
2
|
+
|
|
3
|
+
export async function handleListAnalyticsReports(): Promise<string> {
|
|
4
|
+
const result = await listAnalyticsReports();
|
|
5
|
+
const reports = result.data;
|
|
6
|
+
|
|
7
|
+
if (!Array.isArray(reports) || reports.length === 0) {
|
|
8
|
+
return "No Analytics Reports found in this project.\n\n> Tip: Use `platform_create_analytics_report` to create a new Analytics Report.";
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const lines: string[] = [];
|
|
12
|
+
lines.push(`# Analytics Reports (${reports.length} total)\n`);
|
|
13
|
+
|
|
14
|
+
for (const report of reports) {
|
|
15
|
+
lines.push(`## ${report.name}`);
|
|
16
|
+
lines.push(`**ID**: ${report.id}`);
|
|
17
|
+
lines.push(`**Graphs**: ${report.graphCount}`);
|
|
18
|
+
lines.push(`**Updated**: ${report.updatedAt}`);
|
|
19
|
+
lines.push("");
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
lines.push(
|
|
23
|
+
"> Use `platform_get_analytics_report` with the ID to see the Analytics Report's details including graphs.",
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
return lines.join("\n");
|
|
27
|
+
}
|
|
@@ -1,27 +1,26 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* The `list_dashboards` MCP tool: the dashboards a widget can be added to, with
|
|
3
|
+
* the id `add_dashboard_widget` and `update_dashboard_widget` take.
|
|
4
|
+
*/
|
|
2
5
|
|
|
3
|
-
|
|
4
|
-
const result = await apiListDashboards();
|
|
5
|
-
const dashboards = result.data;
|
|
6
|
-
|
|
7
|
-
if (!Array.isArray(dashboards) || dashboards.length === 0) {
|
|
8
|
-
return "No dashboards found in this project.\n\n> Tip: Use `platform_create_dashboard` to create a new dashboard.";
|
|
9
|
-
}
|
|
6
|
+
import { listDashboards } from "../langwatch-api-dashboards.js";
|
|
10
7
|
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
export async function handleListDashboards(): Promise<string> {
|
|
9
|
+
const { data: dashboards } = await listDashboards();
|
|
13
10
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
lines.push(`**ID**: ${d.id}`);
|
|
17
|
-
lines.push(`**Graphs**: ${d.graphCount}`);
|
|
18
|
-
lines.push(`**Updated**: ${d.updatedAt}`);
|
|
19
|
-
lines.push("");
|
|
11
|
+
if (dashboards.length === 0) {
|
|
12
|
+
return "No dashboards found in this project. Create one in the Dashboards area first.";
|
|
20
13
|
}
|
|
21
14
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
15
|
+
return [
|
|
16
|
+
`# Dashboards (${dashboards.length} total)\n`,
|
|
17
|
+
...dashboards.flatMap((dashboard) => [
|
|
18
|
+
`## ${dashboard.name}`,
|
|
19
|
+
`**ID**: ${dashboard.id}`,
|
|
20
|
+
`**Widgets**: ${dashboard.widgetCount}`,
|
|
21
|
+
`**URL**: ${dashboard.platformUrl}`,
|
|
22
|
+
"",
|
|
23
|
+
]),
|
|
24
|
+
"> Pass the ID to `add_dashboard_widget` to add a widget to that dashboard.",
|
|
25
|
+
].join("\n");
|
|
27
26
|
}
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
} from "@langwatch/redaction";
|
|
8
8
|
|
|
9
9
|
import { getConfig } from "../config.ts";
|
|
10
|
+
import { LANGWATCH_API_VERSION } from "../langwatch-api.ts";
|
|
10
11
|
|
|
11
12
|
/** Transcripts are capped after redaction; oldest lines are dropped first. */
|
|
12
13
|
const MAX_SESSION_BYTES = 8 * 1024 * 1024;
|
|
@@ -77,6 +78,7 @@ async function deliverReport(report: RedactedReport, params: ReportIssueParams):
|
|
|
77
78
|
method: "POST",
|
|
78
79
|
headers: {
|
|
79
80
|
"content-type": "application/json",
|
|
81
|
+
"x-api-version": LANGWATCH_API_VERSION,
|
|
80
82
|
...(config.apiKey ? { authorization: `Bearer ${config.apiKey}` } : {}),
|
|
81
83
|
},
|
|
82
84
|
body: JSON.stringify({
|
|
@@ -24,10 +24,14 @@ interface EvaluationStatusResponse {
|
|
|
24
24
|
};
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
export async function handleRunExperiment(params: {
|
|
27
|
+
export async function handleRunExperiment(params: {
|
|
28
|
+
slug: string;
|
|
29
|
+
concurrency?: number;
|
|
30
|
+
}): Promise<string> {
|
|
28
31
|
const result = (await makeRequest(
|
|
29
32
|
"POST",
|
|
30
33
|
`/api/v1/experiments/${encodeURIComponent(params.slug)}/run`,
|
|
34
|
+
params.concurrency !== undefined ? { concurrency: params.concurrency } : undefined,
|
|
31
35
|
)) as EvaluationRunResponse;
|
|
32
36
|
|
|
33
37
|
const lines: string[] = [];
|