@langwatch/mcp-server 2.1.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/.gitignore +7 -0
- package/.npmignore +41 -0
- package/CHANGELOG.md +218 -201
- package/CONTRIBUTING.md +10 -0
- package/README.md +70 -68
- package/dist/add-dashboard-widget-55UI6H22.js +44 -0
- package/dist/add-dashboard-widget-MJHIC3CC.js +45 -0
- package/dist/{archive-project-W3IKI7UL.js → archive-project-K5UD7A6X.js} +4 -4
- package/dist/archive-project-L4PAKT34.js +19 -0
- package/dist/{archive-run-plan-474OKHHU.js → archive-run-plan-5HSQG2HX.js} +4 -4
- package/dist/archive-run-plan-AOKNYQIO.js +15 -0
- package/dist/archive-scenario-2CWJW2VD.js +19 -0
- package/dist/{archive-scenario-V5UNYK26.js → archive-scenario-5IJQESHH.js} +4 -4
- package/dist/{archive-test-suite-O7FLDMXK.js → archive-test-suite-OPB7NFI7.js} +4 -4
- package/dist/archive-test-suite-ZC3TN6VH.js +15 -0
- package/dist/assign-prompt-tag-6DDE6ZZ5.js +23 -0
- package/dist/{assign-prompt-tag-Q46WRB6P.js → assign-prompt-tag-D7O23MJM.js} +8 -4
- package/dist/chunk-3YLN3ATJ.js +241 -0
- package/dist/{chunk-EYXMLE5X.js → chunk-4RX3G62A.js} +56 -47
- package/dist/{chunk-UF6XIGYR.js → chunk-6YZUOD34.js} +2 -5
- package/dist/{chunk-WVI5CJ6S.js → chunk-7AQLPVFL.js} +2 -2
- package/dist/chunk-7CZQDZ2K.js +319 -0
- package/dist/{chunk-RVAE2MEA.js → chunk-7GETGE6B.js} +7 -7
- package/dist/{chunk-OJLYYJWI.js → chunk-AASW2TO2.js} +7 -10
- package/dist/{chunk-QAMP3CGR.js → chunk-B4RFWIUP.js} +4 -4
- package/dist/{chunk-ZXKLPC2E.js → chunk-BIIKE3EI.js} +1 -1
- package/dist/{chunk-G4ZAZTZW.js → chunk-D2HS73VI.js} +7 -10
- package/dist/{chunk-37SMPMQS.js → chunk-DMM3JQ42.js} +7 -2
- package/dist/{chunk-WT4PO4A3.js → chunk-DULFP3MK.js} +10 -7
- package/dist/chunk-EYPJBL7P.js +516 -0
- package/dist/{chunk-NUFPTHKU.js → chunk-FOKVY3BK.js} +1 -1
- package/dist/chunk-GA5JUSPT.js +64 -0
- package/dist/{chunk-UJPXFA26.js → chunk-HHMNZAPD.js} +101 -74
- package/dist/chunk-HLQJXUR6.js +67 -0
- package/dist/{chunk-JTQJRNFJ.js → chunk-KILVK3FS.js} +4 -4
- package/dist/chunk-MOCU5XWF.js +79 -0
- package/dist/chunk-O2WGVCED.js +41 -0
- package/dist/{chunk-HV4DWKBI.js → chunk-O7EMWEVJ.js} +2 -4
- package/dist/{chunk-UFOYFYI7.js → chunk-QXLMHLRC.js} +6 -9
- package/dist/{chunk-QRO35SOM.js → chunk-R5YJIYPF.js} +981 -747
- package/dist/{chunk-JR6DJZOU.js → chunk-RABYBFX5.js} +4 -10
- package/dist/{chunk-SR6QPRIE.js → chunk-RFC2SBEX.js} +7 -13
- package/dist/chunk-SHSVN3SE.js +21 -0
- package/dist/{chunk-CKNAH5TG.js → chunk-U24EACC4.js} +3 -10
- package/dist/{chunk-56OGTS24.js → chunk-VOUGDY2O.js} +4 -11
- package/dist/chunk-WCKZDOGF.js +31 -0
- package/dist/chunk-XQYH52SI.js +129 -0
- package/dist/{chunk-7E4FZIYJ.js → chunk-XUIJYNRJ.js} +1 -1
- package/dist/{chunk-6DJDEXET.js → chunk-YCIUEZVK.js} +6 -12
- package/dist/config-2WQGMAEN.js +16 -0
- package/dist/config.cjs +109 -0
- package/dist/config.js +5 -4
- package/dist/{create-agent-JFJ2K6X3.js → create-agent-6JNLMYQD.js} +4 -4
- package/dist/create-agent-IRZOU4R5.js +23 -0
- package/dist/create-analytics-report-N4L4V5QL.js +19 -0
- package/dist/create-analytics-report-QEHXG7FU.js +18 -0
- package/dist/{create-annotation-EUXXQ6NS.js → create-annotation-CCEGIZ67.js} +10 -5
- package/dist/create-annotation-DTHCMWHB.js +29 -0
- package/dist/{create-api-key-BGBB76JX.js → create-api-key-JKM2DSZO.js} +5 -7
- package/dist/create-api-key-JPEUIXGM.js +24 -0
- package/dist/create-dataset-DJNXYJ5B.js +22 -0
- package/dist/{create-dataset-FD5VAXU4.js → create-dataset-WON4SOTC.js} +6 -6
- package/dist/create-dataset-records-TMEOTLTO.js +20 -0
- package/dist/{create-dataset-records-WQUXXOHI.js → create-dataset-records-UJBW3C7C.js} +5 -7
- package/dist/create-evaluator-N5AEHI4K.js +27 -0
- package/dist/{create-evaluator-6NV33Z52.js → create-evaluator-XYNY2YFY.js} +4 -4
- package/dist/create-mcp-server.cjs +9712 -0
- package/dist/create-mcp-server.js +2757 -10
- package/dist/{create-project-ZQ7TFIO2.js → create-project-EY4XZ7TH.js} +4 -4
- package/dist/create-project-YL345T5L.js +44 -0
- package/dist/{create-prompt-BS6QRCUU.js → create-prompt-JZQNQ7I3.js} +5 -7
- package/dist/create-prompt-ZUMQHHX7.js +37 -0
- package/dist/create-prompt-tag-CJ5FZ436.js +17 -0
- package/dist/{create-prompt-tag-FCQ5ELSQ.js → create-prompt-tag-JFP2Q3PO.js} +3 -3
- package/dist/create-scenario-CQU2SSFB.js +33 -0
- package/dist/{create-scenario-DRPTPXU3.js → create-scenario-S6OWWKJO.js} +5 -5
- package/dist/create-test-suite-OLGCAGJA.js +36 -0
- package/dist/{create-test-suite-ZIZCCFJ4.js → create-test-suite-Y7P2RI4L.js} +6 -6
- package/dist/create-trigger-4CNBTISJ.js +48 -0
- package/dist/create-trigger-RQ653WYF.js +49 -0
- package/dist/dashboards-BA7M6CMO.js +90 -0
- package/dist/dashboards-U663GUIB.js +91 -0
- package/dist/{delete-agent-SA4JMUZF.js → delete-agent-J2Q4DRZ2.js} +4 -4
- package/dist/delete-agent-ZAU4LTXB.js +18 -0
- package/dist/delete-analytics-report-QK6X7P4S.js +19 -0
- package/dist/delete-analytics-report-YUYLDHLL.js +18 -0
- package/dist/delete-annotation-7X4NYXXM.js +17 -0
- package/dist/{delete-annotation-X3KKK7QY.js → delete-annotation-KJOCDLV3.js} +4 -4
- package/dist/{delete-dataset-W6EZ44HY.js → delete-dataset-NXP7ZPPV.js} +5 -7
- package/dist/delete-dataset-RUTZBBVD.js +18 -0
- package/dist/{delete-dataset-records-7CNOTALB.js → delete-dataset-records-4Z7DZCDW.js} +5 -7
- package/dist/delete-dataset-records-75UAR5IS.js +19 -0
- package/dist/delete-evaluator-E3CUNGTQ.js +16 -0
- package/dist/delete-evaluator-RI4GALGX.js +15 -0
- package/dist/delete-prompt-tag-LE3WJPKS.js +17 -0
- package/dist/{delete-prompt-tag-QB3OCZUV.js → delete-prompt-tag-S4KBZTNG.js} +3 -3
- package/dist/delete-workflow-4CZFIQCQ.js +17 -0
- package/dist/{delete-workflow-NG2VXYYM.js → delete-workflow-PWQPDW6H.js} +4 -4
- 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-W7KBXA4J.js → discover-scenario-schema-OOFIQKOG.js} +37 -17
- package/dist/discover-schema-7WHIIATI.js +442 -0
- package/dist/{discover-schema-L6QDPON3.js → discover-schema-J2ANOBKO.js} +181 -186
- package/dist/get-agent-5T3CXQOR.js +69 -0
- package/dist/{get-agent-7THF7HCU.js → get-agent-ZKYQJUQ7.js} +15 -11
- package/dist/get-analytics-4MPEK4KV.js +79 -0
- package/dist/get-analytics-ZLI3A4F5.js +80 -0
- package/dist/get-analytics-report-JCKYMA2S.js +29 -0
- package/dist/get-analytics-report-SKIP2JWH.js +30 -0
- package/dist/get-dataset-APGZBYMH.js +64 -0
- package/dist/get-dataset-LWXDVMVE.js +63 -0
- package/dist/get-evaluator-3A7BJBAB.js +47 -0
- package/dist/{get-evaluator-RZ44UIN6.js → get-evaluator-IWNJINRY.js} +4 -4
- package/dist/get-project-EQVB4LEL.js +26 -0
- package/dist/{get-project-QSQEAB33.js → get-project-RK6AJTEP.js} +4 -4
- package/dist/{get-prompt-GVKXF5NL.js → get-prompt-TLG2T2DS.js} +53 -58
- package/dist/get-prompt-ZER557X3.js +94 -0
- package/dist/get-run-plan-5X7DDJRN.js +58 -0
- package/dist/{get-run-plan-NY7J5GRE.js → get-run-plan-PEHRO5M3.js} +7 -9
- package/dist/{get-scenario-Q3LLQE4T.js → get-scenario-375W5D6I.js} +5 -5
- package/dist/get-scenario-UQX45ZZO.js +37 -0
- package/dist/{get-simulation-run-WINEYDMK.js → get-simulation-run-2NBXJADG.js} +26 -22
- package/dist/get-simulation-run-QZTLGL7W.js +69 -0
- package/dist/{get-test-suite-4HKA7OKS.js → get-test-suite-GVIBDG7K.js} +5 -5
- package/dist/get-test-suite-OODIR3RI.js +48 -0
- package/dist/{get-trace-RCUV7N4O.js → get-trace-AGCHVPJK.js} +11 -13
- package/dist/get-trace-KJLYAZRC.js +45 -0
- package/dist/get-workflow-3TV2YYC5.js +25 -0
- package/dist/{get-workflow-EEOC7Y45.js → get-workflow-7LZSVPP2.js} +4 -4
- package/dist/{http-security-EU3CHTY7.js → http-security-DNLBNQZL.js} +2 -2
- package/dist/{http-server-WCDUARTH.js → http-server-7CCN3EHJ.js} +4249 -325
- package/dist/index.js +59595 -38027
- 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-6DHVZWUK.js → langwatch-api-annotations-H4AI4TKG.js} +4 -4
- package/dist/langwatch-api-annotations-QSJNUQQS.js +17 -0
- package/dist/langwatch-api-monitors-ENHLOL3S.js +47 -0
- package/dist/{langwatch-api-monitors-6ISFJ7WX.js → langwatch-api-monitors-OHSGADTH.js} +11 -16
- package/dist/langwatch-api-secrets-AGW6UUMD.js +55 -0
- package/dist/langwatch-api-secrets-CLTS766Q.js +56 -0
- package/dist/langwatch-api-triggers-G5UWFNN2.js +22 -0
- package/dist/langwatch-api-triggers-QMR7KEXW.js +23 -0
- package/dist/langwatch-api-workflows-HKTBIKKY.js +15 -0
- package/dist/{langwatch-api-workflows-6UJL5U4Z.js → langwatch-api-workflows-OMROZH2O.js} +4 -4
- package/dist/{list-agents-AMVDQPQL.js → list-agents-BYWDNAHT.js} +4 -4
- package/dist/list-agents-MG24MHZE.js +42 -0
- package/dist/list-analytics-reports-G3EPWGSQ.js +32 -0
- package/dist/list-analytics-reports-PPWIFRES.js +33 -0
- package/dist/list-annotations-QCLGEK5A.js +38 -0
- package/dist/{list-annotations-6PR5NLIC.js → list-annotations-Y4EUBJHG.js} +10 -5
- package/dist/list-api-keys-DAVOBPFK.js +42 -0
- package/dist/{list-api-keys-GVPNBIHQ.js → list-api-keys-JMW5WRXX.js} +10 -5
- package/dist/list-dashboards-2P3VJFRS.js +29 -0
- package/dist/list-dashboards-MW5O3MKH.js +30 -0
- package/dist/list-dataset-records-KEHT7G6Q.js +43 -0
- package/dist/{list-dataset-records-O67HZ35Y.js → list-dataset-records-KMLLMZAZ.js} +14 -10
- package/dist/{list-datasets-WXZL6UMP.js → list-datasets-P3JK2ZHS.js} +9 -13
- package/dist/list-datasets-Z7OOE4KI.js +56 -0
- package/dist/{list-evaluators-PAX72WCN.js → list-evaluators-7RRESBOU.js} +5 -7
- package/dist/list-evaluators-VATJVOHR.js +32 -0
- package/dist/{list-model-providers-VVLZMLCX.js → list-model-providers-OXDRPUCJ.js} +4 -4
- package/dist/list-model-providers-VXQJWDXU.js +35 -0
- package/dist/{list-projects-AQVI6SUK.js → list-projects-HUVK7L3W.js} +5 -7
- package/dist/list-projects-X72ZXVY5.js +40 -0
- package/dist/{list-prompt-tags-WZFBJOHG.js → list-prompt-tags-3I3LWFIR.js} +3 -3
- package/dist/list-prompt-tags-DRHUH2ND.js +23 -0
- package/dist/list-prompts-6DX3QECJ.js +30 -0
- package/dist/{list-prompts-BQOHRHYT.js → list-prompts-PS423RU3.js} +4 -6
- package/dist/list-run-plans-5SXPOV3X.js +45 -0
- package/dist/{list-run-plans-UBAU2DGH.js → list-run-plans-6VNHINPY.js} +5 -5
- package/dist/list-scenarios-EQWCW7Q4.js +45 -0
- package/dist/{list-scenarios-MS4IUIVM.js → list-scenarios-GKNH3YND.js} +13 -11
- package/dist/{list-simulation-runs-D6YF4ZOU.js → list-simulation-runs-KHY7KALI.js} +12 -8
- package/dist/list-simulation-runs-PUDK32C2.js +53 -0
- package/dist/list-test-suites-7H2DRILK.js +34 -0
- package/dist/{list-test-suites-L7R2O6DR.js → list-test-suites-GY56LGLY.js} +4 -4
- package/dist/list-trigger-fires-7RZUP54Y.js +19 -0
- package/dist/list-trigger-fires-OZUF65LI.js +20 -0
- package/dist/list-triggers-BGUCUXTJ.js +45 -0
- package/dist/list-triggers-XC5KMX4C.js +46 -0
- package/dist/list-workflows-55NYC3PC.js +33 -0
- package/dist/{list-workflows-6MV4XJHF.js → list-workflows-HV7FUWZA.js} +5 -7
- package/dist/{rename-prompt-tag-K5LQ4CY6.js → rename-prompt-tag-2I7Z5FCY.js} +3 -3
- package/dist/rename-prompt-tag-SZYTOWDX.js +18 -0
- package/dist/{rename-test-suite-NTYHAO5X.js → rename-test-suite-27AYY33K.js} +4 -4
- package/dist/rename-test-suite-CLIEPZDO.js +20 -0
- package/dist/report-issue-5HSL7CNB.js +924 -0
- package/dist/{report-issue-RHZZ33IS.js → report-issue-N7ND5TM6.js} +107 -67
- package/dist/{rerun-run-plan-MUDWJBE4.js → rerun-run-plan-O3VUZ6CG.js} +5 -5
- package/dist/rerun-run-plan-OJTVVGJI.js +21 -0
- package/dist/{revoke-api-key-6LAZ3QZZ.js → revoke-api-key-BU6BKGCG.js} +4 -4
- package/dist/revoke-api-key-NZNCFOIR.js +15 -0
- package/dist/run-agent-244O4Y5M.js +75 -0
- package/dist/run-agent-HPCGZGYW.js +74 -0
- package/dist/run-plan-2ZPGGZ4H.js +38 -0
- package/dist/{run-plan-T4ZYOZGA.js → run-plan-KSXUYQT3.js} +7 -7
- package/dist/run-query-4LMOQ5UW.js +47 -0
- package/dist/run-query-BQUHIUC2.js +46 -0
- package/dist/{run-test-suite-L4MZ7G4D.js → run-test-suite-P3WLVPXC.js} +6 -6
- package/dist/run-test-suite-UEOMCON6.js +25 -0
- package/dist/run-workflow-EFZ6HG5B.js +36 -0
- package/dist/{run-workflow-DFIS23AP.js → run-workflow-I4IHEN54.js} +4 -4
- package/dist/search-traces-6IR7PR4L.js +170 -0
- package/dist/search-traces-BYML2NQ4.js +171 -0
- package/dist/set-model-provider-RBNGWFVI.js +33 -0
- package/dist/{set-model-provider-XRNMFOVR.js → set-model-provider-SHEVKWRC.js} +4 -4
- package/dist/{update-agent-DUWNYBNA.js → update-agent-PTKTM2B5.js} +4 -4
- package/dist/update-agent-ZPXWRMS2.js +20 -0
- package/dist/update-dashboard-widget-HKCBXH7X.js +62 -0
- package/dist/update-dashboard-widget-IP2TTQ5G.js +63 -0
- package/dist/update-dataset-GHIN6JR3.js +22 -0
- package/dist/{update-dataset-YSOMDCOB.js → update-dataset-IRVMY5PF.js} +6 -6
- package/dist/update-dataset-record-6VI7K2CL.js +19 -0
- package/dist/{update-dataset-record-DEA2ITYR.js → update-dataset-record-Z3L7ACNF.js} +4 -4
- package/dist/update-evaluator-5NLNE6VY.js +24 -0
- package/dist/{update-evaluator-NH7Q5GWV.js → update-evaluator-FEH7H6NS.js} +4 -4
- package/dist/update-project-75H3LDQT.js +24 -0
- package/dist/{update-project-Q26FBSYH.js → update-project-QPR3QX55.js} +4 -4
- package/dist/update-prompt-BCDFTNLK.js +140 -0
- package/dist/{update-prompt-ZQQ2C3KU.js → update-prompt-NPRXYSWA.js} +27 -29
- package/dist/update-scenario-BNOMDCMV.js +34 -0
- package/dist/{update-scenario-WUX34JAR.js → update-scenario-EM5XGMB7.js} +5 -5
- package/package.json +35 -39
- package/pyproject.toml +23 -8
- package/src/config.d.ts +6 -0
- package/src/config.ts +22 -29
- package/src/create-mcp-server.ts +887 -634
- 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 +18 -21
- package/src/langwatch-api-analytics-reports.ts +62 -0
- package/src/langwatch-api-annotations.ts +11 -12
- package/src/langwatch-api-api-keys.ts +8 -9
- package/src/langwatch-api-dashboard-widgets.ts +47 -0
- package/src/langwatch-api-dashboards.ts +109 -24
- 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 +10 -9
- package/src/langwatch-api-query.ts +114 -0
- package/src/langwatch-api-run-plans.ts +12 -29
- package/src/langwatch-api-scenarios.ts +9 -11
- package/src/langwatch-api-secrets.ts +31 -24
- package/src/langwatch-api-simulation-runs.ts +6 -8
- package/src/langwatch-api-test-suites.ts +14 -33
- package/src/langwatch-api-triggers.ts +96 -34
- package/src/langwatch-api-workflows.ts +9 -9
- package/src/langwatch-api.ts +118 -124
- 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 +13 -29
- package/src/schemas/suite-fields.ts +6 -23
- package/src/schemas/triggers.ts +365 -0
- package/src/schemas/widget-sources.ts +33 -0
- package/src/tools/add-dashboard-widget.ts +51 -0
- package/src/tools/archive-project.ts +2 -4
- package/src/tools/archive-run-plan.ts +2 -4
- package/src/tools/archive-scenario.ts +2 -4
- package/src/tools/archive-test-suite.ts +2 -4
- package/src/tools/assign-prompt-tag.ts +6 -2
- package/src/tools/create-agent.ts +1 -1
- package/src/tools/create-analytics-report.ts +7 -0
- package/src/tools/create-annotation.ts +7 -2
- package/src/tools/create-api-key.ts +4 -6
- 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 +5 -7
- package/src/tools/create-test-suite.ts +4 -9
- package/src/tools/create-trigger.ts +55 -0
- package/src/tools/dashboard-widget-queries.ts +45 -0
- package/src/tools/dashboards.ts +104 -0
- package/src/tools/delete-agent.ts +1 -1
- package/src/tools/delete-analytics-report.ts +7 -0
- package/src/tools/delete-annotation.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 +41 -21
- 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 +7 -21
- package/src/tools/format-scenario.ts +2 -4
- package/src/tools/format-suite-details.ts +6 -12
- package/src/tools/get-agent.ts +15 -6
- package/src/tools/get-analytics-report.ts +23 -0
- package/src/tools/get-analytics.ts +52 -46
- 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 +63 -84
- package/src/tools/get-run-plan.ts +4 -6
- package/src/tools/get-scenario.ts +4 -6
- package/src/tools/get-simulation-run.ts +27 -24
- package/src/tools/get-test-suite.ts +2 -5
- package/src/tools/get-trace.ts +16 -17
- package/src/tools/get-workflow.ts +1 -1
- package/src/tools/list-agents.ts +1 -1
- package/src/tools/list-analytics-reports.ts +27 -0
- package/src/tools/list-annotations.ts +8 -5
- package/src/tools/list-api-keys.ts +7 -2
- package/src/tools/list-dashboards.ts +20 -21
- 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 +2 -2
- package/src/tools/list-scenarios.ts +14 -15
- package/src/tools/list-simulation-runs.ts +8 -4
- package/src/tools/list-test-suites.ts +1 -1
- 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 +2 -5
- package/src/tools/report-issue.ts +7 -9
- package/src/tools/rerun-run-plan.ts +2 -5
- package/src/tools/revoke-api-key.ts +2 -4
- package/src/tools/run-agent.ts +29 -26
- package/src/tools/run-experiment.ts +37 -34
- package/src/tools/run-plan.ts +4 -7
- package/src/tools/run-query.ts +47 -0
- package/src/tools/run-test-suite.ts +4 -7
- 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 +2 -2
- package/src/tools/update-agent.ts +1 -1
- package/src/tools/update-dashboard-widget.ts +86 -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 +44 -59
- package/src/tools/update-scenario.ts +5 -7
- package/src/tools/update-test-suite.ts +6 -11
- 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 +14 -12
- package/uv.lock +667 -341
- package/vitest.integration.config.js +10 -0
- package/vitest.scenario.config.js +9 -0
- package/.eslintrc.cjs +0 -36
- package/dist/chunk-AN4OUA4D.js +0 -86
- package/dist/chunk-GELJ2MQR.js +0 -226
- package/dist/chunk-K37ZNPXK.js +0 -24
- package/dist/chunk-S4GVX36W.js +0 -39
- package/dist/config.d.ts +0 -17
- package/dist/create-dashboard-Z76AIPLS.js +0 -19
- package/dist/create-mcp-server.d.ts +0 -10
- package/dist/delete-dashboard-LYMRPF27.js +0 -19
- package/dist/delete-evaluator-RKYC4TNB.js +0 -16
- package/dist/discover-evaluator-schema-ESSHQGPY.js +0 -1912
- package/dist/get-analytics-R6AZD3AW.js +0 -73
- package/dist/get-dashboard-P4WWVHFU.js +0 -30
- package/dist/get-dataset-AKTYSQDI.js +0 -49
- package/dist/index.d.ts +0 -2
- package/dist/langwatch-api-dashboards-2KJL2M42.js +0 -18
- package/dist/langwatch-api-secrets-OEBD6GBU.js +0 -41
- package/dist/langwatch-api-triggers-5E6DDGX6.js +0 -31
- package/dist/list-dashboards-Z3BZKDGF.js +0 -33
- package/dist/run-agent-CAGWGTYT.js +0 -72
- package/dist/search-traces-4XTJYXIK.js +0 -79
- package/src/__tests__/agent-tools.unit.test.ts +0 -257
- package/src/__tests__/all-tools.integration.test.ts +0 -1872
- 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 -284
- 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__/prompt-response-types.unit.test.ts +0 -51
- package/src/__tests__/prompts.integration.test.ts +0 -736
- 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__/run-plan-tools.unit.test.ts +0 -565
- package/src/__tests__/scenario-tools.integration.test.ts +0 -286
- package/src/__tests__/scenario-tools.unit.test.ts +0 -207
- package/src/__tests__/schemas.unit.test.ts +0 -85
- package/src/__tests__/simulation-run-tools.unit.test.ts +0 -116
- package/src/__tests__/support/http-server-harness.ts +0 -138
- package/src/__tests__/test-suite-tools.unit.test.ts +0 -615
- package/src/__tests__/tools.integration.test.ts +0 -896
- package/src/schemas/filter-fields.ts +0 -119
- package/src/schemas/index.ts +0 -9
- package/src/tools/create-dashboard.ts +0 -7
- package/src/tools/delete-dashboard.ts +0 -7
- package/src/tools/get-dashboard.ts +0 -22
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
|
|
3
|
-
import { makeRequest } from "./langwatch-api.
|
|
4
|
-
import { requestPublicJson } from "./public-http-request.
|
|
3
|
+
import { makeRequest } from "./langwatch-api.ts";
|
|
4
|
+
import { requestPublicJson } from "./public-http-request.ts";
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* The run parameters a call carries: a flat record of scalars. The platform
|
|
@@ -106,10 +106,7 @@ export async function listAgents(params?: {
|
|
|
106
106
|
}
|
|
107
107
|
|
|
108
108
|
export async function getAgent(id: string): Promise<AgentSummary> {
|
|
109
|
-
return makeRequest(
|
|
110
|
-
"GET",
|
|
111
|
-
`/api/v1/agents/${encodeURIComponent(id)}`,
|
|
112
|
-
) as Promise<AgentSummary>;
|
|
109
|
+
return makeRequest("GET", `/api/v1/agents/${encodeURIComponent(id)}`) as Promise<AgentSummary>;
|
|
113
110
|
}
|
|
114
111
|
|
|
115
112
|
export async function createAgent(data: {
|
|
@@ -160,10 +157,9 @@ export interface AgentTestRunResponse {
|
|
|
160
157
|
}
|
|
161
158
|
|
|
162
159
|
/**
|
|
163
|
-
* Runs one scripted scenario against an agent
|
|
164
|
-
*
|
|
165
|
-
*
|
|
166
|
-
* ids to follow.
|
|
160
|
+
* Runs one scripted "ping" scenario against an agent and succeeds when
|
|
161
|
+
* the answer arrives. Creates no scenario, run plan or test suite; the
|
|
162
|
+
* response carries the run ids to follow.
|
|
167
163
|
*/
|
|
168
164
|
export async function testAgent(id: string): Promise<AgentTestRunResponse> {
|
|
169
165
|
return makeRequest(
|
|
@@ -177,14 +173,15 @@ const isMessageList = (value: unknown): value is AgentCallMessage[] =>
|
|
|
177
173
|
Array.isArray(value) &&
|
|
178
174
|
value.every(
|
|
179
175
|
(item) =>
|
|
180
|
-
typeof item === "object" &&
|
|
176
|
+
typeof item === "object" &&
|
|
177
|
+
item !== null &&
|
|
178
|
+
typeof (item as AgentCallMessage).role === "string",
|
|
181
179
|
);
|
|
182
180
|
|
|
183
181
|
/**
|
|
184
|
-
* The relay body for a connected agent: `message` is one user turn,
|
|
185
|
-
* is the body
|
|
186
|
-
* parameters
|
|
187
|
-
* refusal, so the tool can answer it.
|
|
182
|
+
* The relay body for a connected agent: `message` is one user turn,
|
|
183
|
+
* `input` is the raw body (must carry `messages`), `parameters` are run
|
|
184
|
+
* parameters, `threadId` continues a conversation. A string is a refusal.
|
|
188
185
|
*/
|
|
189
186
|
export function buildRelayBody({
|
|
190
187
|
input,
|
|
@@ -218,7 +215,7 @@ export function buildRelayBody({
|
|
|
218
215
|
}
|
|
219
216
|
inputParams = parsed.data;
|
|
220
217
|
}
|
|
221
|
-
if (inputParams || parameters) body.params = { ...
|
|
218
|
+
if (inputParams || parameters) body.params = { ...inputParams, ...parameters };
|
|
222
219
|
return body;
|
|
223
220
|
}
|
|
224
221
|
|
|
@@ -279,14 +276,14 @@ export async function runAgent({
|
|
|
279
276
|
);
|
|
280
277
|
}
|
|
281
278
|
|
|
282
|
-
const { runWorkflow } = await import("./langwatch-api-workflows.
|
|
279
|
+
const { runWorkflow } = await import("./langwatch-api-workflows.ts");
|
|
283
280
|
const result = await runWorkflow(workflowId, input);
|
|
284
281
|
return { agentType: agent.type, result };
|
|
285
282
|
}
|
|
286
283
|
|
|
287
284
|
export async function deleteAgent(id: string): Promise<{ id: string; name: string }> {
|
|
288
|
-
return makeRequest(
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
285
|
+
return makeRequest("DELETE", `/api/v1/agents/${encodeURIComponent(id)}`) as Promise<{
|
|
286
|
+
id: string;
|
|
287
|
+
name: string;
|
|
288
|
+
}>;
|
|
292
289
|
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { makeRequest } from "./langwatch-api.ts";
|
|
2
|
+
|
|
3
|
+
/** An Analytics Report, at `/api/v1/analytics/reports`. Dashboards live at `/api/v1/dashboards`. */
|
|
4
|
+
export interface AnalyticsReportSummary {
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
order: number;
|
|
8
|
+
graphCount: number;
|
|
9
|
+
createdAt: string;
|
|
10
|
+
updatedAt: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface AnalyticsReportDetail extends AnalyticsReportSummary {
|
|
14
|
+
graphs: unknown[];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface AnalyticsReportListResponse {
|
|
18
|
+
data: AnalyticsReportSummary[];
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const reportPath = (reportId: string) =>
|
|
22
|
+
`/api/v1/analytics/reports/${encodeURIComponent(reportId)}`;
|
|
23
|
+
|
|
24
|
+
export async function listAnalyticsReports(): Promise<AnalyticsReportListResponse> {
|
|
25
|
+
return makeRequest("GET", "/api/v1/analytics/reports") as Promise<AnalyticsReportListResponse>;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export async function getAnalyticsReport({
|
|
29
|
+
reportId,
|
|
30
|
+
}: {
|
|
31
|
+
reportId: string;
|
|
32
|
+
}): Promise<AnalyticsReportDetail> {
|
|
33
|
+
return makeRequest("GET", reportPath(reportId)) as Promise<AnalyticsReportDetail>;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export async function createAnalyticsReport({
|
|
37
|
+
name,
|
|
38
|
+
}: {
|
|
39
|
+
name: string;
|
|
40
|
+
}): Promise<AnalyticsReportDetail> {
|
|
41
|
+
return makeRequest("POST", "/api/v1/analytics/reports", {
|
|
42
|
+
name,
|
|
43
|
+
}) as Promise<AnalyticsReportDetail>;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export async function renameAnalyticsReport({
|
|
47
|
+
reportId,
|
|
48
|
+
name,
|
|
49
|
+
}: {
|
|
50
|
+
reportId: string;
|
|
51
|
+
name: string;
|
|
52
|
+
}): Promise<AnalyticsReportDetail> {
|
|
53
|
+
return makeRequest("PATCH", reportPath(reportId), { name }) as Promise<AnalyticsReportDetail>;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export async function deleteAnalyticsReport({
|
|
57
|
+
reportId,
|
|
58
|
+
}: {
|
|
59
|
+
reportId: string;
|
|
60
|
+
}): Promise<{ id: string; name: string }> {
|
|
61
|
+
return makeRequest("DELETE", reportPath(reportId)) as Promise<{ id: string; name: string }>;
|
|
62
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { makeRequest } from "./langwatch-api.
|
|
1
|
+
import { makeRequest } from "./langwatch-api.ts";
|
|
2
2
|
|
|
3
3
|
export interface AnnotationResponse {
|
|
4
4
|
id?: string;
|
|
@@ -13,21 +13,20 @@ export interface AnnotationResponse {
|
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
export async function listAnnotations(): Promise<AnnotationResponse[]> {
|
|
16
|
-
return makeRequest("GET", "/api/annotations") as Promise<AnnotationResponse[]>;
|
|
16
|
+
return makeRequest("GET", "/api/v1/annotations") as Promise<AnnotationResponse[]>;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
export async function getAnnotation(id: string): Promise<AnnotationResponse> {
|
|
20
20
|
return makeRequest(
|
|
21
21
|
"GET",
|
|
22
|
-
`/api/annotations/${encodeURIComponent(id)}`,
|
|
22
|
+
`/api/v1/annotations/${encodeURIComponent(id)}`,
|
|
23
23
|
) as Promise<AnnotationResponse>;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
export async function getAnnotationsByTrace(traceId: string): Promise<AnnotationResponse[]> {
|
|
27
|
-
return makeRequest(
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
) as Promise<AnnotationResponse[]>;
|
|
27
|
+
return makeRequest("GET", `/api/v1/annotations/trace/${encodeURIComponent(traceId)}`) as Promise<
|
|
28
|
+
AnnotationResponse[]
|
|
29
|
+
>;
|
|
31
30
|
}
|
|
32
31
|
|
|
33
32
|
export async function createAnnotation(
|
|
@@ -36,14 +35,14 @@ export async function createAnnotation(
|
|
|
36
35
|
): Promise<AnnotationResponse> {
|
|
37
36
|
return makeRequest(
|
|
38
37
|
"POST",
|
|
39
|
-
`/api/annotations/trace/${encodeURIComponent(traceId)}`,
|
|
38
|
+
`/api/v1/annotations/trace/${encodeURIComponent(traceId)}`,
|
|
40
39
|
data,
|
|
41
40
|
) as Promise<AnnotationResponse>;
|
|
42
41
|
}
|
|
43
42
|
|
|
44
43
|
export async function deleteAnnotation(id: string): Promise<{ status?: string; message?: string }> {
|
|
45
|
-
return makeRequest(
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
44
|
+
return makeRequest("DELETE", `/api/v1/annotations/${encodeURIComponent(id)}`) as Promise<{
|
|
45
|
+
status?: string;
|
|
46
|
+
message?: string;
|
|
47
|
+
}>;
|
|
49
48
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { makeRequest } from "./langwatch-api.
|
|
1
|
+
import { makeRequest } from "./langwatch-api.ts";
|
|
2
2
|
|
|
3
3
|
export interface RoleBinding {
|
|
4
4
|
id: string;
|
|
@@ -28,7 +28,7 @@ export interface ApiKeyCreateResponse {
|
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
export async function listApiKeys(): Promise<{ data: ApiKeySummary[] }> {
|
|
31
|
-
return makeRequest("GET", "/api/api-keys") as Promise<{ data: ApiKeySummary[] }>;
|
|
31
|
+
return makeRequest("GET", "/api/v1/api-keys") as Promise<{ data: ApiKeySummary[] }>;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
export async function createApiKey(data: {
|
|
@@ -36,19 +36,18 @@ export async function createApiKey(data: {
|
|
|
36
36
|
name: string;
|
|
37
37
|
description?: string;
|
|
38
38
|
expiresAt?: string;
|
|
39
|
-
bindings?:
|
|
39
|
+
bindings?: {
|
|
40
40
|
role: "ADMIN" | "MEMBER" | "VIEWER";
|
|
41
41
|
scopeType: "ORGANIZATION" | "TEAM" | "PROJECT";
|
|
42
42
|
scopeId: string;
|
|
43
|
-
}
|
|
43
|
+
}[];
|
|
44
44
|
projectIds?: string[];
|
|
45
45
|
}): Promise<ApiKeyCreateResponse> {
|
|
46
|
-
return makeRequest("POST", "/api/api-keys", data) as Promise<ApiKeyCreateResponse>;
|
|
46
|
+
return makeRequest("POST", "/api/v1/api-keys", data) as Promise<ApiKeyCreateResponse>;
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
export async function revokeApiKey(id: string): Promise<{ success: boolean }> {
|
|
50
|
-
return makeRequest(
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
) as Promise<{ success: boolean }>;
|
|
50
|
+
return makeRequest("DELETE", `/api/v1/api-keys/${encodeURIComponent(id)}`) as Promise<{
|
|
51
|
+
success: boolean;
|
|
52
|
+
}>;
|
|
54
53
|
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { WidgetSource } from "./schemas/widget-sources.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* One named LangWatchQL statement a widget may run, as the REST endpoint validates it
|
|
5
|
+
* (`modules/dashboard/contract/src/dashboard-widget-rest.schemas.ts`).
|
|
6
|
+
*/
|
|
7
|
+
export interface DashboardWidgetQueryInput {
|
|
8
|
+
name: string;
|
|
9
|
+
sql: string;
|
|
10
|
+
parameters?: {
|
|
11
|
+
name: string;
|
|
12
|
+
type: "string" | "number" | "boolean";
|
|
13
|
+
default?: string | number | boolean;
|
|
14
|
+
}[];
|
|
15
|
+
/** The trace origins the query counts; `null` makes it unset, counting application. */
|
|
16
|
+
sources?: WidgetSource[] | null;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** Where a widget came from, as the platform records it. */
|
|
20
|
+
export type DashboardWidgetSource =
|
|
21
|
+
| { kind: "catalogue"; catalogueId: string }
|
|
22
|
+
| { kind: "langy" }
|
|
23
|
+
| { kind: "code" }
|
|
24
|
+
| { kind: "api" };
|
|
25
|
+
|
|
26
|
+
export interface DashboardWidgetDefinition {
|
|
27
|
+
version: number;
|
|
28
|
+
code: string;
|
|
29
|
+
queries: DashboardWidgetQueryInput[];
|
|
30
|
+
description?: string;
|
|
31
|
+
prompt?: string;
|
|
32
|
+
source?: DashboardWidgetSource;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface DashboardWidget {
|
|
36
|
+
id: string;
|
|
37
|
+
name: string;
|
|
38
|
+
definition: DashboardWidgetDefinition;
|
|
39
|
+
createdAt: string;
|
|
40
|
+
updatedAt: string;
|
|
41
|
+
platformUrl: string;
|
|
42
|
+
dashboardId: string | null;
|
|
43
|
+
gridColumn: number;
|
|
44
|
+
gridRow: number;
|
|
45
|
+
colSpan: number;
|
|
46
|
+
rowSpan: number;
|
|
47
|
+
}
|
|
@@ -1,48 +1,133 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
DashboardWidget,
|
|
3
|
+
DashboardWidgetQueryInput,
|
|
4
|
+
} from "./langwatch-api-dashboard-widgets.js";
|
|
1
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[] }>;
|
|
18
35
|
}
|
|
19
36
|
|
|
20
|
-
|
|
21
|
-
|
|
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>;
|
|
22
40
|
}
|
|
23
41
|
|
|
24
|
-
export async function
|
|
25
|
-
return makeRequest(
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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>;
|
|
29
56
|
}
|
|
30
57
|
|
|
31
|
-
|
|
32
|
-
|
|
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 }>;
|
|
33
65
|
}
|
|
34
66
|
|
|
35
|
-
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> {
|
|
36
88
|
return makeRequest(
|
|
37
|
-
"
|
|
38
|
-
|
|
89
|
+
"POST",
|
|
90
|
+
`${dashboardPath(dashboardId)}/widgets`,
|
|
39
91
|
data,
|
|
40
|
-
) as Promise<
|
|
92
|
+
) as Promise<DashboardWidget>;
|
|
93
|
+
}
|
|
94
|
+
|
|
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>;
|
|
41
104
|
}
|
|
42
105
|
|
|
43
|
-
export async function
|
|
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> {
|
|
44
118
|
return makeRequest(
|
|
45
|
-
"
|
|
46
|
-
|
|
47
|
-
|
|
119
|
+
"PATCH",
|
|
120
|
+
widgetPath(dashboardId, widgetId),
|
|
121
|
+
changes,
|
|
122
|
+
) as Promise<DashboardWidget>;
|
|
123
|
+
}
|
|
124
|
+
|
|
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));
|
|
48
133
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { makeRequest } from "./langwatch-api.
|
|
1
|
+
import { LangWatchApiError, makeRequest } from "./langwatch-api.ts";
|
|
2
2
|
|
|
3
3
|
// --- Dataset types ---
|
|
4
4
|
|
|
@@ -40,6 +40,10 @@ export interface DatasetDetailResponse {
|
|
|
40
40
|
createdAt: string;
|
|
41
41
|
updatedAt: string;
|
|
42
42
|
data: DatasetRecord[];
|
|
43
|
+
/** Records in the dataset, when `data` is a preview of them. */
|
|
44
|
+
totalRecords?: number;
|
|
45
|
+
/** Records of the dataset left out of `data`. */
|
|
46
|
+
omittedRecords?: number;
|
|
43
47
|
}
|
|
44
48
|
|
|
45
49
|
export interface DatasetMutationResponse {
|
|
@@ -72,8 +76,16 @@ export interface DatasetRecordListResponse {
|
|
|
72
76
|
limit: number;
|
|
73
77
|
totalPages: number;
|
|
74
78
|
};
|
|
79
|
+
/** The dataset the page belongs to. Absent on servers that do not send it. */
|
|
80
|
+
dataset?: DatasetMutationResponse;
|
|
75
81
|
}
|
|
76
82
|
|
|
83
|
+
/** The most records a dataset preview holds. */
|
|
84
|
+
export const DATASET_PREVIEW_MAX_RECORDS = 100;
|
|
85
|
+
|
|
86
|
+
/** The most bytes of records a dataset preview holds. */
|
|
87
|
+
export const DATASET_PREVIEW_MAX_BYTES = 1024 * 1024;
|
|
88
|
+
|
|
77
89
|
// --- Dataset API functions ---
|
|
78
90
|
|
|
79
91
|
/** Lists all datasets in the project (paginated). */
|
|
@@ -85,18 +97,82 @@ export async function listDatasets(params?: {
|
|
|
85
97
|
if (params?.page != null) query.set("page", String(params.page));
|
|
86
98
|
if (params?.limit != null) query.set("limit", String(params.limit));
|
|
87
99
|
const qs = query.toString();
|
|
88
|
-
const path = qs ? `/api/dataset?${qs}` : "/api/dataset";
|
|
100
|
+
const path = qs ? `/api/v1/dataset?${qs}` : "/api/v1/dataset";
|
|
89
101
|
return makeRequest("GET", path) as Promise<DatasetListResponse>;
|
|
90
102
|
}
|
|
91
103
|
|
|
92
|
-
/**
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
104
|
+
/**
|
|
105
|
+
* Retrieves a dataset by slug or ID with a preview of its records: the first page, cut at
|
|
106
|
+
* `DATASET_PREVIEW_MAX_RECORDS` records and `DATASET_PREVIEW_MAX_BYTES` bytes. A dataset of
|
|
107
|
+
* any size can be read this way. `omittedRecords` counts what the preview leaves out.
|
|
108
|
+
*/
|
|
109
|
+
export async function getDataset(slugOrId: string): Promise<DatasetDetailResponse> {
|
|
110
|
+
const page = await readPreviewPage(slugOrId);
|
|
111
|
+
// A server without the records endpoint, or one that sends no dataset with a page, is
|
|
112
|
+
// asked for the whole dataset in one response.
|
|
113
|
+
if (!page?.dataset) {
|
|
114
|
+
return makeRequest(
|
|
115
|
+
"GET",
|
|
116
|
+
`/api/v1/dataset/${encodeURIComponent(slugOrId)}`,
|
|
117
|
+
) as Promise<DatasetDetailResponse>;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const data: DatasetRecord[] = [];
|
|
121
|
+
let bytes = 0;
|
|
122
|
+
for (const record of page.data) {
|
|
123
|
+
bytes += JSON.stringify(record).length;
|
|
124
|
+
if (bytes > DATASET_PREVIEW_MAX_BYTES) break;
|
|
125
|
+
data.push(record);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const { id, name, slug, columnTypes, createdAt, updatedAt } = page.dataset;
|
|
129
|
+
const totalRecords = page.pagination.total;
|
|
130
|
+
return {
|
|
131
|
+
id,
|
|
132
|
+
name,
|
|
133
|
+
slug,
|
|
134
|
+
columnTypes,
|
|
135
|
+
createdAt,
|
|
136
|
+
updatedAt,
|
|
137
|
+
data,
|
|
138
|
+
totalRecords,
|
|
139
|
+
omittedRecords: Math.max(0, totalRecords - data.length),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* The first page of a dataset's records, or `null` when the records endpoint answers 404. A
|
|
145
|
+
* page refused as too large is asked for again with the size the refusal suggests, or half.
|
|
146
|
+
*/
|
|
147
|
+
async function readPreviewPage(slugOrId: string): Promise<DatasetRecordListResponse | null> {
|
|
148
|
+
let limit = DATASET_PREVIEW_MAX_RECORDS;
|
|
149
|
+
for (;;) {
|
|
150
|
+
try {
|
|
151
|
+
return await listDatasetRecords({ slugOrId, page: 1, limit });
|
|
152
|
+
} catch (error) {
|
|
153
|
+
if (!(error instanceof LangWatchApiError)) throw error;
|
|
154
|
+
if (error.status === 404) return null;
|
|
155
|
+
if (error.status !== 413 || limit <= 1) throw error;
|
|
156
|
+
limit = smallerLimit(limit, error.responseBody);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/** The page size a `dataset_page_too_large` refusal suggests, or half the refused one. */
|
|
162
|
+
function smallerLimit(limit: number, responseBody: string): number {
|
|
163
|
+
const half = Math.max(1, Math.floor(limit / 2));
|
|
164
|
+
try {
|
|
165
|
+
const suggested: unknown = (JSON.parse(responseBody) as { meta?: { suggestedLimit?: unknown } })
|
|
166
|
+
.meta?.suggestedLimit;
|
|
167
|
+
const usable =
|
|
168
|
+
typeof suggested === "number" &&
|
|
169
|
+
Number.isInteger(suggested) &&
|
|
170
|
+
suggested >= 1 &&
|
|
171
|
+
suggested < limit;
|
|
172
|
+
return usable ? suggested : half;
|
|
173
|
+
} catch {
|
|
174
|
+
return half;
|
|
175
|
+
}
|
|
100
176
|
}
|
|
101
177
|
|
|
102
178
|
/** Creates a new dataset. */
|
|
@@ -104,11 +180,7 @@ export async function createDataset(data: {
|
|
|
104
180
|
name: string;
|
|
105
181
|
columnTypes?: DatasetColumnType[];
|
|
106
182
|
}): Promise<DatasetMutationResponse> {
|
|
107
|
-
return makeRequest(
|
|
108
|
-
"POST",
|
|
109
|
-
"/api/dataset",
|
|
110
|
-
data,
|
|
111
|
-
) as Promise<DatasetMutationResponse>;
|
|
183
|
+
return makeRequest("POST", "/api/v1/dataset", data) as Promise<DatasetMutationResponse>;
|
|
112
184
|
}
|
|
113
185
|
|
|
114
186
|
/** Updates an existing dataset by slug or ID. */
|
|
@@ -120,18 +192,16 @@ export async function updateDataset(params: {
|
|
|
120
192
|
const { slugOrId, ...data } = params;
|
|
121
193
|
return makeRequest(
|
|
122
194
|
"PATCH",
|
|
123
|
-
`/api/dataset/${encodeURIComponent(slugOrId)}`,
|
|
195
|
+
`/api/v1/dataset/${encodeURIComponent(slugOrId)}`,
|
|
124
196
|
data,
|
|
125
197
|
) as Promise<DatasetMutationResponse>;
|
|
126
198
|
}
|
|
127
199
|
|
|
128
200
|
/** Archives (soft-deletes) a dataset by slug or ID. */
|
|
129
|
-
export async function deleteDataset(
|
|
130
|
-
slugOrId: string,
|
|
131
|
-
): Promise<DatasetArchiveResponse> {
|
|
201
|
+
export async function deleteDataset(slugOrId: string): Promise<DatasetArchiveResponse> {
|
|
132
202
|
return makeRequest(
|
|
133
203
|
"DELETE",
|
|
134
|
-
`/api/dataset/${encodeURIComponent(slugOrId)}`,
|
|
204
|
+
`/api/v1/dataset/${encodeURIComponent(slugOrId)}`,
|
|
135
205
|
) as Promise<DatasetArchiveResponse>;
|
|
136
206
|
}
|
|
137
207
|
|
|
@@ -141,11 +211,9 @@ export async function createDatasetRecords(params: {
|
|
|
141
211
|
entries: Record<string, unknown>[];
|
|
142
212
|
}): Promise<BatchCreateRecordsResponse> {
|
|
143
213
|
const { slugOrId, entries } = params;
|
|
144
|
-
return makeRequest(
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
{ entries },
|
|
148
|
-
) as Promise<BatchCreateRecordsResponse>;
|
|
214
|
+
return makeRequest("POST", `/api/v1/dataset/${encodeURIComponent(slugOrId)}/records`, {
|
|
215
|
+
entries,
|
|
216
|
+
}) as Promise<BatchCreateRecordsResponse>;
|
|
149
217
|
}
|
|
150
218
|
|
|
151
219
|
/** Updates or creates a single record in a dataset. */
|
|
@@ -157,7 +225,7 @@ export async function updateDatasetRecord(params: {
|
|
|
157
225
|
const { slugOrId, recordId, entry } = params;
|
|
158
226
|
return makeRequest(
|
|
159
227
|
"PATCH",
|
|
160
|
-
`/api/dataset/${encodeURIComponent(slugOrId)}/records/${encodeURIComponent(recordId)}`,
|
|
228
|
+
`/api/v1/dataset/${encodeURIComponent(slugOrId)}/records/${encodeURIComponent(recordId)}`,
|
|
161
229
|
{ entry },
|
|
162
230
|
) as Promise<DatasetRecord>;
|
|
163
231
|
}
|
|
@@ -168,11 +236,9 @@ export async function deleteDatasetRecords(params: {
|
|
|
168
236
|
recordIds: string[];
|
|
169
237
|
}): Promise<DeleteRecordsResponse> {
|
|
170
238
|
const { slugOrId, recordIds } = params;
|
|
171
|
-
return makeRequest(
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
{ recordIds },
|
|
175
|
-
) as Promise<DeleteRecordsResponse>;
|
|
239
|
+
return makeRequest("DELETE", `/api/v1/dataset/${encodeURIComponent(slugOrId)}/records`, {
|
|
240
|
+
recordIds,
|
|
241
|
+
}) as Promise<DeleteRecordsResponse>;
|
|
176
242
|
}
|
|
177
243
|
|
|
178
244
|
/** Lists records in a dataset (paginated). */
|
|
@@ -186,6 +252,6 @@ export async function listDatasetRecords(params: {
|
|
|
186
252
|
if (params.page != null) query.set("page", String(params.page));
|
|
187
253
|
if (params.limit != null) query.set("limit", String(params.limit));
|
|
188
254
|
const qs = query.toString();
|
|
189
|
-
const path = `/api/dataset/${encodeURIComponent(slugOrId)}/records${qs ? `?${qs}` : ""}`;
|
|
255
|
+
const path = `/api/v1/dataset/${encodeURIComponent(slugOrId)}/records${qs ? `?${qs}` : ""}`;
|
|
190
256
|
return makeRequest("GET", path) as Promise<DatasetRecordListResponse>;
|
|
191
257
|
}
|