@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,244 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
|
-
|
|
3
|
-
vi.mock("../langwatch-api-datasets.js", () => ({
|
|
4
|
-
listDatasets: vi.fn(),
|
|
5
|
-
getDataset: vi.fn(),
|
|
6
|
-
}));
|
|
7
|
-
|
|
8
|
-
import { listDatasets, getDataset } from "../langwatch-api-datasets.js";
|
|
9
|
-
|
|
10
|
-
import { handleListDatasets } from "../tools/list-datasets.js";
|
|
11
|
-
import { handleGetDataset } from "../tools/get-dataset.js";
|
|
12
|
-
import { formatDatasetResponse } from "../tools/get-dataset.js";
|
|
13
|
-
import { createDatasetSchema } from "../schemas/create-dataset.js";
|
|
14
|
-
|
|
15
|
-
const mockListDatasets = vi.mocked(listDatasets);
|
|
16
|
-
const mockGetDataset = vi.mocked(getDataset);
|
|
17
|
-
|
|
18
|
-
beforeEach(() => {
|
|
19
|
-
vi.clearAllMocks();
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
// ── formatDatasetResponse ────────────────────────────────────────
|
|
23
|
-
|
|
24
|
-
describe("formatDatasetResponse()", () => {
|
|
25
|
-
const sampleDataset = {
|
|
26
|
-
id: "ds_abc123",
|
|
27
|
-
name: "My Dataset",
|
|
28
|
-
slug: "my-dataset",
|
|
29
|
-
columnTypes: [
|
|
30
|
-
{ name: "input", type: "string" },
|
|
31
|
-
{ name: "output", type: "string" },
|
|
32
|
-
],
|
|
33
|
-
createdAt: "2025-01-01T00:00:00.000Z",
|
|
34
|
-
updatedAt: "2025-01-02T00:00:00.000Z",
|
|
35
|
-
data: [
|
|
36
|
-
{ id: "rec-1", entry: { input: "hello", output: "world" } },
|
|
37
|
-
{ id: "rec-2", entry: { input: "foo", output: "bar" } },
|
|
38
|
-
],
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
describe("when given a dataset with columns and records", () => {
|
|
42
|
-
let result: string;
|
|
43
|
-
|
|
44
|
-
beforeEach(() => {
|
|
45
|
-
result = formatDatasetResponse(sampleDataset);
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
it("includes the dataset name in the heading", () => {
|
|
49
|
-
expect(result).toContain("# Dataset: My Dataset");
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
it("includes the slug", () => {
|
|
53
|
-
expect(result).toContain("my-dataset");
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
/** @scenario "formatDatasetResponse renders column table and record entries as markdown" */
|
|
57
|
-
it("includes a column table", () => {
|
|
58
|
-
expect(result).toContain("input");
|
|
59
|
-
expect(result).toContain("output");
|
|
60
|
-
expect(result).toContain("string");
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
it("includes record entries", () => {
|
|
64
|
-
expect(result).toContain("hello");
|
|
65
|
-
expect(result).toContain("world");
|
|
66
|
-
expect(result).toContain("foo");
|
|
67
|
-
expect(result).toContain("bar");
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
it("includes record IDs", () => {
|
|
71
|
-
expect(result).toContain("rec-1");
|
|
72
|
-
expect(result).toContain("rec-2");
|
|
73
|
-
});
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
describe("when given a dataset with no records", () => {
|
|
77
|
-
it("indicates no records", () => {
|
|
78
|
-
const result = formatDatasetResponse({
|
|
79
|
-
...sampleDataset,
|
|
80
|
-
data: [],
|
|
81
|
-
});
|
|
82
|
-
expect(result).toContain("No records");
|
|
83
|
-
});
|
|
84
|
-
});
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
// ── handleListDatasets ──────────────────────────────────────────
|
|
88
|
-
|
|
89
|
-
describe("handleListDatasets()", () => {
|
|
90
|
-
const sampleListResponse = {
|
|
91
|
-
data: [
|
|
92
|
-
{
|
|
93
|
-
id: "ds_abc123",
|
|
94
|
-
name: "User Feedback",
|
|
95
|
-
slug: "user-feedback",
|
|
96
|
-
columnTypes: [
|
|
97
|
-
{ name: "input", type: "string" },
|
|
98
|
-
{ name: "output", type: "string" },
|
|
99
|
-
],
|
|
100
|
-
recordCount: 25,
|
|
101
|
-
createdAt: "2025-01-01T00:00:00.000Z",
|
|
102
|
-
updatedAt: "2025-01-02T00:00:00.000Z",
|
|
103
|
-
},
|
|
104
|
-
],
|
|
105
|
-
pagination: { total: 1, page: 1, limit: 50, totalPages: 1 },
|
|
106
|
-
};
|
|
107
|
-
|
|
108
|
-
describe("when format is digest (default)", () => {
|
|
109
|
-
it("returns markdown containing dataset names", async () => {
|
|
110
|
-
mockListDatasets.mockResolvedValue(sampleListResponse);
|
|
111
|
-
const result = await handleListDatasets();
|
|
112
|
-
expect(result).toContain("User Feedback");
|
|
113
|
-
expect(result).toContain("user-feedback");
|
|
114
|
-
});
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
describe("when format is json", () => {
|
|
118
|
-
it("returns valid parseable JSON containing all datasets and total", async () => {
|
|
119
|
-
mockListDatasets.mockResolvedValue(sampleListResponse);
|
|
120
|
-
const result = await handleListDatasets({ format: "json" });
|
|
121
|
-
const parsed = JSON.parse(result);
|
|
122
|
-
expect(parsed.data).toEqual(sampleListResponse.data);
|
|
123
|
-
expect(parsed.total).toBe(sampleListResponse.pagination.total);
|
|
124
|
-
});
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
describe("when no datasets exist", () => {
|
|
128
|
-
it("returns a no-datasets message in digest mode", async () => {
|
|
129
|
-
mockListDatasets.mockResolvedValue({ data: [], pagination: { total: 0, page: 1, limit: 50, totalPages: 0 } });
|
|
130
|
-
const result = await handleListDatasets();
|
|
131
|
-
expect(result).toContain("No datasets found");
|
|
132
|
-
});
|
|
133
|
-
});
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
// ── handleGetDataset ────────────────────────────────────────────
|
|
137
|
-
|
|
138
|
-
describe("handleGetDataset()", () => {
|
|
139
|
-
const sampleDataset = {
|
|
140
|
-
id: "ds_abc123",
|
|
141
|
-
name: "My Dataset",
|
|
142
|
-
slug: "my-dataset",
|
|
143
|
-
columnTypes: [
|
|
144
|
-
{ name: "input", type: "string" },
|
|
145
|
-
{ name: "output", type: "string" },
|
|
146
|
-
],
|
|
147
|
-
createdAt: "2025-01-01T00:00:00.000Z",
|
|
148
|
-
updatedAt: "2025-01-02T00:00:00.000Z",
|
|
149
|
-
data: [
|
|
150
|
-
{ id: "rec-1", entry: { input: "hello", output: "world" } },
|
|
151
|
-
],
|
|
152
|
-
};
|
|
153
|
-
|
|
154
|
-
describe("when format is digest (default)", () => {
|
|
155
|
-
it("returns markdown containing dataset name", async () => {
|
|
156
|
-
mockGetDataset.mockResolvedValue(sampleDataset);
|
|
157
|
-
const result = await handleGetDataset({ slugOrId: "my-dataset" });
|
|
158
|
-
expect(result).toContain("# Dataset: My Dataset");
|
|
159
|
-
});
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
describe("when format is json", () => {
|
|
163
|
-
it("returns valid parseable JSON matching the dataset structure", async () => {
|
|
164
|
-
mockGetDataset.mockResolvedValue(sampleDataset);
|
|
165
|
-
const result = await handleGetDataset({ slugOrId: "my-dataset", format: "json" });
|
|
166
|
-
expect(JSON.parse(result)).toEqual(sampleDataset);
|
|
167
|
-
});
|
|
168
|
-
});
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
// ── platform_create_dataset schema validation ────────────────────
|
|
172
|
-
|
|
173
|
-
describe("platform_create_dataset schema", () => {
|
|
174
|
-
describe("when input has no name", () => {
|
|
175
|
-
/** @scenario "platform_create_dataset schema rejects input without a name" */
|
|
176
|
-
it("rejects the input with a validation error", () => {
|
|
177
|
-
const result = createDatasetSchema.safeParse({});
|
|
178
|
-
expect(result.success).toBe(false);
|
|
179
|
-
});
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
describe("when input has an empty name", () => {
|
|
183
|
-
it("rejects the input with a validation error", () => {
|
|
184
|
-
const result = createDatasetSchema.safeParse({ name: "" });
|
|
185
|
-
expect(result.success).toBe(false);
|
|
186
|
-
});
|
|
187
|
-
});
|
|
188
|
-
|
|
189
|
-
describe("when input has a valid name", () => {
|
|
190
|
-
it("accepts the input", () => {
|
|
191
|
-
const result = createDatasetSchema.safeParse({ name: "Test" });
|
|
192
|
-
expect(result.success).toBe(true);
|
|
193
|
-
});
|
|
194
|
-
});
|
|
195
|
-
});
|
|
196
|
-
|
|
197
|
-
// ── Tool Registration ────────────────────────────────────────────
|
|
198
|
-
|
|
199
|
-
describe("MCP server dataset tool registration", () => {
|
|
200
|
-
describe("when the MCP server is created", () => {
|
|
201
|
-
/** @scenario "All dataset tools are registered in the MCP server" */
|
|
202
|
-
it("registers all 8 dataset tools", async () => {
|
|
203
|
-
const { createMcpServer } = await import("../create-mcp-server.js");
|
|
204
|
-
const server = createMcpServer();
|
|
205
|
-
// Access registered tools via the internal _registeredTools object
|
|
206
|
-
const registeredTools = (server as unknown as { _registeredTools: Record<string, unknown> })._registeredTools;
|
|
207
|
-
const toolNames = Object.keys(registeredTools);
|
|
208
|
-
|
|
209
|
-
expect(toolNames).toContain("platform_list_datasets");
|
|
210
|
-
expect(toolNames).toContain("platform_get_dataset");
|
|
211
|
-
expect(toolNames).toContain("platform_create_dataset");
|
|
212
|
-
expect(toolNames).toContain("platform_update_dataset");
|
|
213
|
-
expect(toolNames).toContain("platform_delete_dataset");
|
|
214
|
-
expect(toolNames).toContain("platform_create_dataset_records");
|
|
215
|
-
expect(toolNames).toContain("platform_update_dataset_record");
|
|
216
|
-
expect(toolNames).toContain("platform_delete_dataset_records");
|
|
217
|
-
});
|
|
218
|
-
});
|
|
219
|
-
});
|
|
220
|
-
|
|
221
|
-
// ── API Key Requirement ──────────────────────────────────────────
|
|
222
|
-
|
|
223
|
-
describe("dataset tools API key requirement", () => {
|
|
224
|
-
describe("when no API key is configured", () => {
|
|
225
|
-
/** @scenario "Dataset tools require an API key" */
|
|
226
|
-
it("requireApiKey throws when apiKey is empty", async () => {
|
|
227
|
-
const savedKey = process.env.LANGWATCH_API_KEY;
|
|
228
|
-
delete process.env.LANGWATCH_API_KEY;
|
|
229
|
-
|
|
230
|
-
try {
|
|
231
|
-
const { initConfig, requireApiKey } = await import("../config.js");
|
|
232
|
-
initConfig({ apiKey: "", endpoint: "http://localhost:0" });
|
|
233
|
-
|
|
234
|
-
expect(() => requireApiKey()).toThrow(
|
|
235
|
-
"LANGWATCH_API_KEY is required",
|
|
236
|
-
);
|
|
237
|
-
} finally {
|
|
238
|
-
if (savedKey !== undefined) {
|
|
239
|
-
process.env.LANGWATCH_API_KEY = savedKey;
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
});
|
|
243
|
-
});
|
|
244
|
-
});
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, afterEach } from "vitest";
|
|
2
|
-
import { parseRelativeDate } from "../utils/date-parsing.js";
|
|
3
|
-
|
|
4
|
-
describe("parseRelativeDate()", () => {
|
|
5
|
-
afterEach(() => {
|
|
6
|
-
vi.restoreAllMocks();
|
|
7
|
-
});
|
|
8
|
-
|
|
9
|
-
describe("when given a relative duration", () => {
|
|
10
|
-
it("parses hours", () => {
|
|
11
|
-
const now = Date.now();
|
|
12
|
-
vi.spyOn(Date, "now").mockReturnValue(now);
|
|
13
|
-
|
|
14
|
-
const result = parseRelativeDate("24h");
|
|
15
|
-
|
|
16
|
-
expect(result).toBe(now - 24 * 3600000);
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
it("parses days", () => {
|
|
20
|
-
const now = Date.now();
|
|
21
|
-
vi.spyOn(Date, "now").mockReturnValue(now);
|
|
22
|
-
|
|
23
|
-
const result = parseRelativeDate("7d");
|
|
24
|
-
|
|
25
|
-
expect(result).toBe(now - 7 * 86400000);
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
it("parses weeks", () => {
|
|
29
|
-
const now = Date.now();
|
|
30
|
-
vi.spyOn(Date, "now").mockReturnValue(now);
|
|
31
|
-
|
|
32
|
-
const result = parseRelativeDate("2w");
|
|
33
|
-
|
|
34
|
-
expect(result).toBe(now - 2 * 604800000);
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
it("parses months", () => {
|
|
38
|
-
const now = Date.now();
|
|
39
|
-
vi.spyOn(Date, "now").mockReturnValue(now);
|
|
40
|
-
|
|
41
|
-
const result = parseRelativeDate("3m");
|
|
42
|
-
|
|
43
|
-
expect(result).toBe(now - 3 * 2592000000);
|
|
44
|
-
});
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
describe("when given an ISO date string", () => {
|
|
48
|
-
it("parses a valid ISO date", () => {
|
|
49
|
-
const result = parseRelativeDate("2024-06-15T12:00:00Z");
|
|
50
|
-
|
|
51
|
-
expect(result).toBe(Date.parse("2024-06-15T12:00:00Z"));
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
it("parses a date-only string", () => {
|
|
55
|
-
const result = parseRelativeDate("2024-06-15");
|
|
56
|
-
|
|
57
|
-
expect(result).toBe(Date.parse("2024-06-15"));
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
describe("when given an invalid string", () => {
|
|
62
|
-
it("throws an error for garbage input", () => {
|
|
63
|
-
expect(() => parseRelativeDate("banana")).toThrow(
|
|
64
|
-
'Invalid date: "banana"'
|
|
65
|
-
);
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it("throws an error for empty string", () => {
|
|
69
|
-
expect(() => parseRelativeDate("")).toThrow('Invalid date: ""');
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
it("includes usage hint in error message", () => {
|
|
73
|
-
expect(() => parseRelativeDate("xyz")).toThrow(
|
|
74
|
-
"relative duration"
|
|
75
|
-
);
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
});
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from "vitest";
|
|
2
|
-
import { formatEvaluatorSchema } from "../tools/discover-evaluator-schema.js";
|
|
3
|
-
|
|
4
|
-
describe("formatEvaluatorSchema()", () => {
|
|
5
|
-
describe("when called without evaluatorType (overview)", () => {
|
|
6
|
-
it("includes the overview header", () => {
|
|
7
|
-
const result = formatEvaluatorSchema();
|
|
8
|
-
expect(result).toContain("# Available Evaluator Types");
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
it("includes category sections", () => {
|
|
12
|
-
const result = formatEvaluatorSchema();
|
|
13
|
-
expect(result).toContain("## safety");
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
it("includes evaluator type identifiers", () => {
|
|
17
|
-
const result = formatEvaluatorSchema();
|
|
18
|
-
expect(result).toContain("openai/moderation");
|
|
19
|
-
expect(result).toContain("langevals/exact_match");
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
it("includes evaluator display names", () => {
|
|
23
|
-
const result = formatEvaluatorSchema();
|
|
24
|
-
expect(result).toContain("OpenAI Moderation");
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it("instructs the agent to use evaluatorType parameter for full details", () => {
|
|
28
|
-
const result = formatEvaluatorSchema();
|
|
29
|
-
expect(result).toContain(
|
|
30
|
-
"discover_schema({ category: 'evaluators', evaluatorType: '<type>' })",
|
|
31
|
-
);
|
|
32
|
-
});
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
describe("when called with a valid evaluatorType (detail)", () => {
|
|
36
|
-
it("includes the evaluator name in the heading", () => {
|
|
37
|
-
const result = formatEvaluatorSchema("openai/moderation");
|
|
38
|
-
expect(result).toContain("# OpenAI Moderation");
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
it("includes the evaluator type in backticks", () => {
|
|
42
|
-
const result = formatEvaluatorSchema("openai/moderation");
|
|
43
|
-
expect(result).toContain("`openai/moderation`");
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it("includes the category", () => {
|
|
47
|
-
const result = formatEvaluatorSchema("openai/moderation");
|
|
48
|
-
expect(result).toContain("**Category**: safety");
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
it("includes settings with descriptions and defaults", () => {
|
|
52
|
-
const result = formatEvaluatorSchema("openai/moderation");
|
|
53
|
-
expect(result).toContain("## Settings");
|
|
54
|
-
expect(result).toContain("**model**");
|
|
55
|
-
expect(result).toContain("Default:");
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
it("includes required/optional fields section", () => {
|
|
59
|
-
const result = formatEvaluatorSchema("openai/moderation");
|
|
60
|
-
expect(result).toContain("## Fields");
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
it("includes result fields", () => {
|
|
64
|
-
const result = formatEvaluatorSchema("openai/moderation");
|
|
65
|
-
expect(result).toContain("## Result Fields");
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it("includes a usage example with evaluatorType", () => {
|
|
69
|
-
const result = formatEvaluatorSchema("openai/moderation");
|
|
70
|
-
expect(result).toContain("## Usage Example");
|
|
71
|
-
expect(result).toContain('"evaluatorType"');
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
it("includes env vars when the evaluator requires them", () => {
|
|
75
|
-
const result = formatEvaluatorSchema("azure/content_safety");
|
|
76
|
-
expect(result).toContain("## Required Environment Variables");
|
|
77
|
-
expect(result).toContain("AZURE_CONTENT_SAFETY_ENDPOINT");
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
describe("when called with an unknown evaluatorType", () => {
|
|
82
|
-
it("returns an error message with guidance", () => {
|
|
83
|
-
const result = formatEvaluatorSchema("nonexistent/type");
|
|
84
|
-
expect(result).toContain("Unknown evaluator type");
|
|
85
|
-
expect(result).toContain("nonexistent/type");
|
|
86
|
-
expect(result).toContain("discover_schema");
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
});
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from "vitest";
|
|
2
|
-
import { formatSchema } from "../tools/discover-schema.js";
|
|
3
|
-
|
|
4
|
-
describe("formatSchema()", () => {
|
|
5
|
-
describe("when category is 'filters'", () => {
|
|
6
|
-
it("includes metadata.user_id", () => {
|
|
7
|
-
const result = formatSchema("filters");
|
|
8
|
-
expect(result).toContain("metadata.user_id");
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
it("includes spans.model", () => {
|
|
12
|
-
const result = formatSchema("filters");
|
|
13
|
-
expect(result).toContain("spans.model");
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
it("includes the section header", () => {
|
|
17
|
-
const result = formatSchema("filters");
|
|
18
|
-
expect(result).toContain("## Available Filter Fields");
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
it("includes usage instructions", () => {
|
|
22
|
-
const result = formatSchema("filters");
|
|
23
|
-
expect(result).toContain("filters");
|
|
24
|
-
expect(result).toContain("search_traces");
|
|
25
|
-
});
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
describe("when category is 'metrics'", () => {
|
|
29
|
-
it("includes performance.completion_time", () => {
|
|
30
|
-
const result = formatSchema("metrics");
|
|
31
|
-
expect(result).toContain("performance.completion_time");
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
it("includes allowed aggregations for metrics", () => {
|
|
35
|
-
const result = formatSchema("metrics");
|
|
36
|
-
expect(result).toContain("Aggregations:");
|
|
37
|
-
expect(result).toContain("avg");
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
it("includes the section header", () => {
|
|
41
|
-
const result = formatSchema("metrics");
|
|
42
|
-
expect(result).toContain("## Available Metrics");
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it("groups metrics by category", () => {
|
|
46
|
-
const result = formatSchema("metrics");
|
|
47
|
-
expect(result).toContain("### metadata");
|
|
48
|
-
expect(result).toContain("### performance");
|
|
49
|
-
expect(result).toContain("### evaluations");
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
describe("when category is 'groups'", () => {
|
|
54
|
-
it("includes model group", () => {
|
|
55
|
-
const result = formatSchema("groups");
|
|
56
|
-
expect(result).toContain("metadata.model");
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
it("includes topics group", () => {
|
|
60
|
-
const result = formatSchema("groups");
|
|
61
|
-
expect(result).toContain("topics.topics");
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
it("includes the section header", () => {
|
|
65
|
-
const result = formatSchema("groups");
|
|
66
|
-
expect(result).toContain("## Available Group-By Options");
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
describe("when category is 'aggregations'", () => {
|
|
71
|
-
const allAggregations = [
|
|
72
|
-
"cardinality",
|
|
73
|
-
"terms",
|
|
74
|
-
"avg",
|
|
75
|
-
"sum",
|
|
76
|
-
"min",
|
|
77
|
-
"max",
|
|
78
|
-
"median",
|
|
79
|
-
"p90",
|
|
80
|
-
"p95",
|
|
81
|
-
"p99",
|
|
82
|
-
];
|
|
83
|
-
|
|
84
|
-
it("includes all 10 aggregation types", () => {
|
|
85
|
-
const result = formatSchema("aggregations");
|
|
86
|
-
for (const agg of allAggregations) {
|
|
87
|
-
expect(result).toContain(`**${agg}**`);
|
|
88
|
-
}
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
it("includes the section header", () => {
|
|
92
|
-
const result = formatSchema("aggregations");
|
|
93
|
-
expect(result).toContain("## Available Aggregation Types");
|
|
94
|
-
});
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
describe("when category is 'all'", () => {
|
|
98
|
-
it("includes the filters section", () => {
|
|
99
|
-
const result = formatSchema("all");
|
|
100
|
-
expect(result).toContain("## Available Filter Fields");
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
it("includes the metrics section", () => {
|
|
104
|
-
const result = formatSchema("all");
|
|
105
|
-
expect(result).toContain("## Available Metrics");
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
it("includes the aggregations section", () => {
|
|
109
|
-
const result = formatSchema("all");
|
|
110
|
-
expect(result).toContain("## Available Aggregation Types");
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
it("includes the groups section", () => {
|
|
114
|
-
const result = formatSchema("all");
|
|
115
|
-
expect(result).toContain("## Available Group-By Options");
|
|
116
|
-
});
|
|
117
|
-
});
|
|
118
|
-
});
|