@langwatch/mcp-server 0.4.0 → 0.6.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.
Files changed (91) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/dist/archive-scenario-YFD5THOR.js +19 -0
  3. package/dist/archive-scenario-YFD5THOR.js.map +1 -0
  4. package/dist/chunk-5UOPNRXW.js +37 -0
  5. package/dist/chunk-5UOPNRXW.js.map +1 -0
  6. package/dist/chunk-6U4TCGFC.js +40 -0
  7. package/dist/chunk-6U4TCGFC.js.map +1 -0
  8. package/dist/chunk-IX6QJKAD.js +22 -0
  9. package/dist/chunk-IX6QJKAD.js.map +1 -0
  10. package/dist/{chunk-HOPTUDCZ.js → chunk-LLRQIF52.js} +5 -12
  11. package/dist/chunk-LLRQIF52.js.map +1 -0
  12. package/dist/create-evaluator-E5X5ZP3B.js +27 -0
  13. package/dist/create-evaluator-E5X5ZP3B.js.map +1 -0
  14. package/dist/create-prompt-7Z35MIL6.js +36 -0
  15. package/dist/create-prompt-7Z35MIL6.js.map +1 -0
  16. package/dist/create-scenario-DIMPJRPY.js +26 -0
  17. package/dist/create-scenario-DIMPJRPY.js.map +1 -0
  18. package/dist/discover-evaluator-schema-H23XCLNE.js +1402 -0
  19. package/dist/discover-evaluator-schema-H23XCLNE.js.map +1 -0
  20. package/dist/discover-scenario-schema-MEEEVND7.js +65 -0
  21. package/dist/discover-scenario-schema-MEEEVND7.js.map +1 -0
  22. package/dist/{get-analytics-3IFTN6MY.js → get-analytics-4YJW4S5L.js} +2 -2
  23. package/dist/get-evaluator-WDEH2F7M.js +47 -0
  24. package/dist/get-evaluator-WDEH2F7M.js.map +1 -0
  25. package/dist/{get-prompt-2ZB5B3QC.js → get-prompt-F6PDVC76.js} +2 -5
  26. package/dist/get-prompt-F6PDVC76.js.map +1 -0
  27. package/dist/get-scenario-H24ZYNT5.js +33 -0
  28. package/dist/get-scenario-H24ZYNT5.js.map +1 -0
  29. package/dist/{get-trace-7IXKKCJJ.js → get-trace-27USKGO7.js} +2 -2
  30. package/dist/index.js +27066 -8845
  31. package/dist/index.js.map +1 -1
  32. package/dist/list-evaluators-KRGI72EH.js +34 -0
  33. package/dist/list-evaluators-KRGI72EH.js.map +1 -0
  34. package/dist/list-model-providers-A5YCFTPI.js +35 -0
  35. package/dist/list-model-providers-A5YCFTPI.js.map +1 -0
  36. package/dist/{list-prompts-J72LTP7Z.js → list-prompts-LKJSE7XN.js} +6 -7
  37. package/dist/list-prompts-LKJSE7XN.js.map +1 -0
  38. package/dist/list-scenarios-ZK5CMGC4.js +40 -0
  39. package/dist/list-scenarios-ZK5CMGC4.js.map +1 -0
  40. package/dist/{search-traces-RW2NDHN5.js → search-traces-SOKAAMAR.js} +2 -2
  41. package/dist/set-model-provider-7MGULZDH.js +33 -0
  42. package/dist/set-model-provider-7MGULZDH.js.map +1 -0
  43. package/dist/update-evaluator-A3XINFLJ.js +24 -0
  44. package/dist/update-evaluator-A3XINFLJ.js.map +1 -0
  45. package/dist/update-prompt-IW7X2UQM.js +22 -0
  46. package/dist/update-prompt-IW7X2UQM.js.map +1 -0
  47. package/dist/update-scenario-ZT7TOBFR.js +27 -0
  48. package/dist/update-scenario-ZT7TOBFR.js.map +1 -0
  49. package/package.json +11 -11
  50. package/src/__tests__/all-tools.integration.test.ts +1337 -0
  51. package/src/__tests__/discover-evaluator-schema.unit.test.ts +89 -0
  52. package/src/__tests__/evaluator-tools.unit.test.ts +262 -0
  53. package/src/__tests__/integration.integration.test.ts +9 -34
  54. package/src/__tests__/langwatch-api.unit.test.ts +4 -32
  55. package/src/__tests__/model-provider-tools.unit.test.ts +190 -0
  56. package/src/__tests__/scenario-tools.integration.test.ts +286 -0
  57. package/src/__tests__/scenario-tools.unit.test.ts +185 -0
  58. package/src/__tests__/tools.unit.test.ts +59 -65
  59. package/src/index.ts +338 -48
  60. package/src/langwatch-api-evaluators.ts +70 -0
  61. package/src/langwatch-api-model-providers.ts +41 -0
  62. package/src/langwatch-api-scenarios.ts +67 -0
  63. package/src/langwatch-api.ts +6 -30
  64. package/src/tools/archive-scenario.ts +19 -0
  65. package/src/tools/create-evaluator.ts +33 -0
  66. package/src/tools/create-prompt.ts +30 -5
  67. package/src/tools/create-scenario.ts +30 -0
  68. package/src/tools/discover-evaluator-schema.ts +143 -0
  69. package/src/tools/discover-scenario-schema.ts +71 -0
  70. package/src/tools/get-evaluator.ts +53 -0
  71. package/src/tools/get-prompt.ts +1 -4
  72. package/src/tools/get-scenario.ts +36 -0
  73. package/src/tools/list-evaluators.ts +37 -0
  74. package/src/tools/list-model-providers.ts +40 -0
  75. package/src/tools/list-prompts.ts +5 -6
  76. package/src/tools/list-scenarios.ts +47 -0
  77. package/src/tools/set-model-provider.ts +46 -0
  78. package/src/tools/update-evaluator.ts +30 -0
  79. package/src/tools/update-prompt.ts +9 -25
  80. package/src/tools/update-scenario.ts +32 -0
  81. package/uv.lock +1788 -1322
  82. package/dist/chunk-HOPTUDCZ.js.map +0 -1
  83. package/dist/create-prompt-UBC537BJ.js +0 -22
  84. package/dist/create-prompt-UBC537BJ.js.map +0 -1
  85. package/dist/get-prompt-2ZB5B3QC.js.map +0 -1
  86. package/dist/list-prompts-J72LTP7Z.js.map +0 -1
  87. package/dist/update-prompt-G6HHZSUM.js +0 -31
  88. package/dist/update-prompt-G6HHZSUM.js.map +0 -1
  89. /package/dist/{get-analytics-3IFTN6MY.js.map → get-analytics-4YJW4S5L.js.map} +0 -0
  90. /package/dist/{get-trace-7IXKKCJJ.js.map → get-trace-27USKGO7.js.map} +0 -0
  91. /package/dist/{search-traces-RW2NDHN5.js.map → search-traces-SOKAAMAR.js.map} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,49 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.6.0](https://github.com/langwatch/langwatch/compare/mcp-server@v0.5.0...mcp-server@v0.6.0) (2026-03-13)
4
+
5
+
6
+ ### Features
7
+
8
+ * add platform MCP tools for evaluators and model providers ([#1762](https://github.com/langwatch/langwatch/issues/1762)) ([6339001](https://github.com/langwatch/langwatch/commit/6339001ffae3c83f7c3ea0cdadf480f4ec47f3cc))
9
+ * prefix platform MCP tools with `platform_` and add disambiguation notes ([#1760](https://github.com/langwatch/langwatch/issues/1760)) ([91851ee](https://github.com/langwatch/langwatch/commit/91851ee28aff1b3b75d92ce46aec6ae5072ff625))
10
+
11
+
12
+ ### Bug Fixes
13
+
14
+ * **deps:** pin transitive npm deps for Dependabot high-severity alerts ([#2220](https://github.com/langwatch/langwatch/issues/2220)) ([a179da1](https://github.com/langwatch/langwatch/commit/a179da1d55859b8c9a476a6443dbfaf6bf632af3))
15
+ * **mcp:** align prompt tool schemas with backend API ([#2326](https://github.com/langwatch/langwatch/issues/2326)) ([65279f3](https://github.com/langwatch/langwatch/commit/65279f38687bae5c7dc7a13db33dcb2f7d135397))
16
+ * **mcp:** resolve get_trace 404 and search_traces metadata filter bugs ([#2214](https://github.com/langwatch/langwatch/issues/2214)) ([a0362e6](https://github.com/langwatch/langwatch/commit/a0362e60aa54e7c6e5dac9f241b206f4f4cd0b5f))
17
+ * normalize defaultModel with provider prefix for litellm routing ([cc7798e](https://github.com/langwatch/langwatch/commit/cc7798ecb229654f371912e7863ca20364ceb7fa))
18
+
19
+
20
+ ### Miscellaneous
21
+
22
+ * **deps:** batch safe JS dependency bumps (Tier 1a) ([#2169](https://github.com/langwatch/langwatch/issues/2169)) ([8b5b891](https://github.com/langwatch/langwatch/commit/8b5b8915941f19ca07019b330e276f01ae3bface))
23
+ * **deps:** bump mcp-server zod to v4 ([#1977](https://github.com/langwatch/langwatch/issues/1977)) ([eb89188](https://github.com/langwatch/langwatch/commit/eb891883eb47db01bfee4d184b1c9b19e3cc60d7))
24
+ * **deps:** bump Node.js dependencies - batch 2 ([#1947](https://github.com/langwatch/langwatch/issues/1947)) ([98d9f5c](https://github.com/langwatch/langwatch/commit/98d9f5cb53dc13051c500359def11b35762fd5e5))
25
+ * **deps:** bump safe npm dependencies (19 dependabot PRs) ([#1931](https://github.com/langwatch/langwatch/issues/1931)) ([4d7607e](https://github.com/langwatch/langwatch/commit/4d7607e5d467749e2e47fc3b0b2b58c212bc8721))
26
+ * **deps:** bump the npm_and_yarn group across 1 directory with 5 updates ([#1948](https://github.com/langwatch/langwatch/issues/1948)) ([9227fb4](https://github.com/langwatch/langwatch/commit/9227fb4b96184a82c87ab95f00fb985491df7224))
27
+
28
+ ## [0.5.0](https://github.com/langwatch/langwatch/compare/mcp-server@v0.4.0...mcp-server@v0.5.0) (2026-02-20)
29
+
30
+
31
+ ### Features
32
+
33
+ * add scenario management tools to MCP server ([#1705](https://github.com/langwatch/langwatch/issues/1705)) ([0376fde](https://github.com/langwatch/langwatch/commit/0376fde0abff7b110b4ec5996a399c4b2ceafde0))
34
+
35
+
36
+ ### Miscellaneous
37
+
38
+ * **deps-dev:** bump @eslint/js from 9.35.0 to 9.39.2 in /mcp-server ([#1465](https://github.com/langwatch/langwatch/issues/1465)) ([fbee07d](https://github.com/langwatch/langwatch/commit/fbee07d8b964d0a059eaa32c7685c8bf667898e7))
39
+ * **deps:** bump hono ([f7e8f05](https://github.com/langwatch/langwatch/commit/f7e8f056843958cac4504ae02f37a351457f77ee))
40
+ * **deps:** bump hono from 4.11.9 to 4.12.0 in /mcp-server in the npm_and_yarn group across 1 directory ([#1736](https://github.com/langwatch/langwatch/issues/1736)) ([f7e8f05](https://github.com/langwatch/langwatch/commit/f7e8f056843958cac4504ae02f37a351457f77ee))
41
+ * **deps:** bump node-pty from 1.0.0 to 1.1.0 in /mcp-server ([#1447](https://github.com/langwatch/langwatch/issues/1447)) ([12ad02c](https://github.com/langwatch/langwatch/commit/12ad02c19dcc0ba90ad32f77659816b768188a53))
42
+ * **deps:** bump qs ([f0e9747](https://github.com/langwatch/langwatch/commit/f0e97475becd58dfa523a944fbb3fa0657dfc1dc))
43
+ * **deps:** bump qs from 6.14.1 to 6.14.2 in /mcp-server in the npm_and_yarn group across 1 directory ([#1568](https://github.com/langwatch/langwatch/issues/1568)) ([f0e9747](https://github.com/langwatch/langwatch/commit/f0e97475becd58dfa523a944fbb3fa0657dfc1dc))
44
+ * **deps:** bump the npm_and_yarn group across 1 directory with 8 updates ([#1519](https://github.com/langwatch/langwatch/issues/1519)) ([487e563](https://github.com/langwatch/langwatch/commit/487e5637a941fa9335ec8e951efdf38bb0a02a8c))
45
+ * **deps:** bump the uv group across 1 directory with 7 updates ([#1516](https://github.com/langwatch/langwatch/issues/1516)) ([7f2f178](https://github.com/langwatch/langwatch/commit/7f2f178588d89a63f3b38510844b87de7b528b3b))
46
+
3
47
  ## [0.4.0](https://github.com/langwatch/langwatch/compare/mcp-server@v0.3.3...mcp-server@v0.4.0) (2026-02-08)
4
48
 
5
49
 
@@ -0,0 +1,19 @@
1
+ import {
2
+ archiveScenario
3
+ } from "./chunk-6U4TCGFC.js";
4
+ import "./chunk-LLRQIF52.js";
5
+ import "./chunk-AAQNA53E.js";
6
+
7
+ // src/tools/archive-scenario.ts
8
+ async function handleArchiveScenario(params) {
9
+ const result = await archiveScenario(params.scenarioId);
10
+ const lines = [];
11
+ lines.push("Scenario archived successfully!\n");
12
+ lines.push(`**ID**: ${result.id}`);
13
+ lines.push(`**Status**: ${result.archived ? "archived" : "active"}`);
14
+ return lines.join("\n");
15
+ }
16
+ export {
17
+ handleArchiveScenario
18
+ };
19
+ //# sourceMappingURL=archive-scenario-YFD5THOR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools/archive-scenario.ts"],"sourcesContent":["import { archiveScenario as apiArchiveScenario } from \"../langwatch-api-scenarios.js\";\n\n/**\n * Handles the platform_archive_scenario MCP tool invocation.\n *\n * Archives (soft-deletes) a scenario and returns confirmation.\n */\nexport async function handleArchiveScenario(params: {\n scenarioId: string;\n}): Promise<string> {\n const result = await apiArchiveScenario(params.scenarioId);\n\n const lines: string[] = [];\n lines.push(\"Scenario archived successfully!\\n\");\n lines.push(`**ID**: ${result.id}`);\n lines.push(`**Status**: ${result.archived ? \"archived\" : \"active\"}`);\n\n return lines.join(\"\\n\");\n}\n"],"mappings":";;;;;;;AAOA,eAAsB,sBAAsB,QAExB;AAClB,QAAM,SAAS,MAAM,gBAAmB,OAAO,UAAU;AAEzD,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,mCAAmC;AAC9C,QAAM,KAAK,WAAW,OAAO,EAAE,EAAE;AACjC,QAAM,KAAK,eAAe,OAAO,WAAW,aAAa,QAAQ,EAAE;AAEnE,SAAO,MAAM,KAAK,IAAI;AACxB;","names":[]}
@@ -0,0 +1,37 @@
1
+ import {
2
+ makeRequest
3
+ } from "./chunk-LLRQIF52.js";
4
+
5
+ // src/langwatch-api-evaluators.ts
6
+ function getEvaluatorType(evaluator) {
7
+ return evaluator.config?.evaluatorType;
8
+ }
9
+ async function listEvaluators() {
10
+ return makeRequest("GET", "/api/evaluators");
11
+ }
12
+ async function getEvaluator(idOrSlug) {
13
+ return makeRequest(
14
+ "GET",
15
+ `/api/evaluators/${encodeURIComponent(idOrSlug)}`
16
+ );
17
+ }
18
+ async function createEvaluator(data) {
19
+ return makeRequest("POST", "/api/evaluators", data);
20
+ }
21
+ async function updateEvaluator(params) {
22
+ const { id, ...data } = params;
23
+ return makeRequest(
24
+ "PUT",
25
+ `/api/evaluators/${encodeURIComponent(id)}`,
26
+ data
27
+ );
28
+ }
29
+
30
+ export {
31
+ getEvaluatorType,
32
+ listEvaluators,
33
+ getEvaluator,
34
+ createEvaluator,
35
+ updateEvaluator
36
+ };
37
+ //# sourceMappingURL=chunk-5UOPNRXW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/langwatch-api-evaluators.ts"],"sourcesContent":["import { makeRequest } from \"./langwatch-api.js\";\n\n// --- Evaluator types ---\n\nexport interface EvaluatorSummary {\n id: string;\n projectId: string;\n name: string;\n slug: string | null;\n type: string;\n config: Record<string, unknown> | null;\n workflowId: string | null;\n copiedFromEvaluatorId: string | null;\n createdAt: string;\n updatedAt: string;\n fields: Array<{ identifier: string; type: string; optional?: boolean }>;\n outputFields: Array<{ identifier: string; type: string; optional?: boolean }>;\n workflowName?: string;\n workflowIcon?: string;\n}\n\n// --- Helpers ---\n\n/**\n * Extracts the evaluatorType from an evaluator's config.\n * Centralises the cast so callers don't repeat it.\n */\nexport function getEvaluatorType(\n evaluator: Pick<EvaluatorSummary, \"config\">,\n): string | undefined {\n return (evaluator.config as Record<string, unknown> | null)\n ?.evaluatorType as string | undefined;\n}\n\n// --- Evaluator API functions ---\n\n/** Lists all evaluators in the project. */\nexport async function listEvaluators(): Promise<EvaluatorSummary[]> {\n return makeRequest(\"GET\", \"/api/evaluators\") as Promise<EvaluatorSummary[]>;\n}\n\n/** Retrieves a single evaluator by ID or slug. */\nexport async function getEvaluator(idOrSlug: string): Promise<EvaluatorSummary> {\n return makeRequest(\n \"GET\",\n `/api/evaluators/${encodeURIComponent(idOrSlug)}`,\n ) as Promise<EvaluatorSummary>;\n}\n\n/** Creates a new evaluator. */\nexport async function createEvaluator(data: {\n name: string;\n config: Record<string, unknown>;\n}): Promise<EvaluatorSummary> {\n return makeRequest(\"POST\", \"/api/evaluators\", data) as Promise<EvaluatorSummary>;\n}\n\n/** Updates an existing evaluator. */\nexport async function updateEvaluator(params: {\n id: string;\n name?: string;\n config?: Record<string, unknown>;\n}): Promise<EvaluatorSummary> {\n const { id, ...data } = params;\n return makeRequest(\n \"PUT\",\n `/api/evaluators/${encodeURIComponent(id)}`,\n data,\n ) as Promise<EvaluatorSummary>;\n}\n"],"mappings":";;;;;AA2BO,SAAS,iBACd,WACoB;AACpB,SAAQ,UAAU,QACd;AACN;AAKA,eAAsB,iBAA8C;AAClE,SAAO,YAAY,OAAO,iBAAiB;AAC7C;AAGA,eAAsB,aAAa,UAA6C;AAC9E,SAAO;AAAA,IACL;AAAA,IACA,mBAAmB,mBAAmB,QAAQ,CAAC;AAAA,EACjD;AACF;AAGA,eAAsB,gBAAgB,MAGR;AAC5B,SAAO,YAAY,QAAQ,mBAAmB,IAAI;AACpD;AAGA,eAAsB,gBAAgB,QAIR;AAC5B,QAAM,EAAE,IAAI,GAAG,KAAK,IAAI;AACxB,SAAO;AAAA,IACL;AAAA,IACA,mBAAmB,mBAAmB,EAAE,CAAC;AAAA,IACzC;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,40 @@
1
+ import {
2
+ makeRequest
3
+ } from "./chunk-LLRQIF52.js";
4
+
5
+ // src/langwatch-api-scenarios.ts
6
+ async function listScenarios() {
7
+ return makeRequest("GET", "/api/scenarios");
8
+ }
9
+ async function getScenario(id) {
10
+ return makeRequest(
11
+ "GET",
12
+ `/api/scenarios/${encodeURIComponent(id)}`
13
+ );
14
+ }
15
+ async function createScenario(data) {
16
+ return makeRequest("POST", "/api/scenarios", data);
17
+ }
18
+ async function updateScenario(params) {
19
+ const { id, ...data } = params;
20
+ return makeRequest(
21
+ "PUT",
22
+ `/api/scenarios/${encodeURIComponent(id)}`,
23
+ data
24
+ );
25
+ }
26
+ async function archiveScenario(id) {
27
+ return makeRequest(
28
+ "DELETE",
29
+ `/api/scenarios/${encodeURIComponent(id)}`
30
+ );
31
+ }
32
+
33
+ export {
34
+ listScenarios,
35
+ getScenario,
36
+ createScenario,
37
+ updateScenario,
38
+ archiveScenario
39
+ };
40
+ //# sourceMappingURL=chunk-6U4TCGFC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/langwatch-api-scenarios.ts"],"sourcesContent":["import { makeRequest } from \"./langwatch-api.js\";\n\n// --- Scenario types ---\n\nexport interface ScenarioSummary {\n id: string;\n name: string;\n situation: string;\n criteria: string[];\n labels: string[];\n}\n\nexport interface ScenarioArchiveResponse {\n id: string;\n archived: boolean;\n}\n\n// --- Scenario API functions ---\n\n/** Lists all scenarios in the project. */\nexport async function listScenarios(): Promise<ScenarioSummary[]> {\n return makeRequest(\"GET\", \"/api/scenarios\") as Promise<ScenarioSummary[]>;\n}\n\n/** Retrieves a single scenario by ID. */\nexport async function getScenario(id: string): Promise<ScenarioSummary> {\n return makeRequest(\n \"GET\",\n `/api/scenarios/${encodeURIComponent(id)}`\n ) as Promise<ScenarioSummary>;\n}\n\n/** Creates a new scenario. */\nexport async function createScenario(data: {\n name: string;\n situation: string;\n criteria?: string[];\n labels?: string[];\n}): Promise<ScenarioSummary> {\n return makeRequest(\"POST\", \"/api/scenarios\", data) as Promise<ScenarioSummary>;\n}\n\n/** Updates an existing scenario. */\nexport async function updateScenario(params: {\n id: string;\n name?: string;\n situation?: string;\n criteria?: string[];\n labels?: string[];\n}): Promise<ScenarioSummary> {\n const { id, ...data } = params;\n return makeRequest(\n \"PUT\",\n `/api/scenarios/${encodeURIComponent(id)}`,\n data\n ) as Promise<ScenarioSummary>;\n}\n\n/** Archives (soft-deletes) a scenario. */\nexport async function archiveScenario(\n id: string\n): Promise<ScenarioArchiveResponse> {\n return makeRequest(\n \"DELETE\",\n `/api/scenarios/${encodeURIComponent(id)}`\n ) as Promise<ScenarioArchiveResponse>;\n}\n"],"mappings":";;;;;AAoBA,eAAsB,gBAA4C;AAChE,SAAO,YAAY,OAAO,gBAAgB;AAC5C;AAGA,eAAsB,YAAY,IAAsC;AACtE,SAAO;AAAA,IACL;AAAA,IACA,kBAAkB,mBAAmB,EAAE,CAAC;AAAA,EAC1C;AACF;AAGA,eAAsB,eAAe,MAKR;AAC3B,SAAO,YAAY,QAAQ,kBAAkB,IAAI;AACnD;AAGA,eAAsB,eAAe,QAMR;AAC3B,QAAM,EAAE,IAAI,GAAG,KAAK,IAAI;AACxB,SAAO;AAAA,IACL;AAAA,IACA,kBAAkB,mBAAmB,EAAE,CAAC;AAAA,IACxC;AAAA,EACF;AACF;AAGA,eAAsB,gBACpB,IACkC;AAClC,SAAO;AAAA,IACL;AAAA,IACA,kBAAkB,mBAAmB,EAAE,CAAC;AAAA,EAC1C;AACF;","names":[]}
@@ -0,0 +1,22 @@
1
+ import {
2
+ makeRequest
3
+ } from "./chunk-LLRQIF52.js";
4
+
5
+ // src/langwatch-api-model-providers.ts
6
+ async function listModelProviders() {
7
+ return makeRequest("GET", "/api/model-providers");
8
+ }
9
+ async function setModelProvider(params) {
10
+ const { provider, ...data } = params;
11
+ return makeRequest(
12
+ "PUT",
13
+ `/api/model-providers/${encodeURIComponent(provider)}`,
14
+ data
15
+ );
16
+ }
17
+
18
+ export {
19
+ listModelProviders,
20
+ setModelProvider
21
+ };
22
+ //# sourceMappingURL=chunk-IX6QJKAD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/langwatch-api-model-providers.ts"],"sourcesContent":["import { makeRequest } from \"./langwatch-api.js\";\n\n// --- Model Provider types ---\n\nexport interface ModelProviderEntry {\n id?: string;\n provider: string;\n enabled: boolean;\n customKeys: Record<string, unknown> | null;\n models?: string[] | null;\n embeddingsModels?: string[] | null;\n customModels?: unknown[] | null;\n customEmbeddingsModels?: unknown[] | null;\n disabledByDefault?: boolean;\n deploymentMapping?: unknown;\n extraHeaders?: Array<{ key: string; value: string }> | null;\n}\n\n// --- Model Provider API functions ---\n\n/** Lists all model providers for the project, with masked API keys. */\nexport async function listModelProviders(): Promise<Record<string, ModelProviderEntry>> {\n return makeRequest(\"GET\", \"/api/model-providers\") as Promise<\n Record<string, ModelProviderEntry>\n >;\n}\n\n/** Creates or updates a model provider. */\nexport async function setModelProvider(params: {\n provider: string;\n enabled: boolean;\n customKeys?: Record<string, unknown>;\n defaultModel?: string;\n}): Promise<Record<string, ModelProviderEntry>> {\n const { provider, ...data } = params;\n return makeRequest(\n \"PUT\",\n `/api/model-providers/${encodeURIComponent(provider)}`,\n data,\n ) as Promise<Record<string, ModelProviderEntry>>;\n}\n"],"mappings":";;;;;AAqBA,eAAsB,qBAAkE;AACtF,SAAO,YAAY,OAAO,sBAAsB;AAGlD;AAGA,eAAsB,iBAAiB,QAKS;AAC9C,QAAM,EAAE,UAAU,GAAG,KAAK,IAAI;AAC9B,SAAO;AAAA,IACL;AAAA,IACA,wBAAwB,mBAAmB,QAAQ,CAAC;AAAA,IACpD;AAAA,EACF;AACF;","names":[]}
@@ -9,7 +9,7 @@ async function makeRequest(method, path, body) {
9
9
  const headers = {
10
10
  "X-Auth-Token": requireApiKey()
11
11
  };
12
- if (method === "POST") {
12
+ if (body !== void 0) {
13
13
  headers["Content-Type"] = "application/json";
14
14
  }
15
15
  const response = await fetch(url, {
@@ -64,27 +64,20 @@ async function createPrompt(data) {
64
64
  }
65
65
  async function updatePrompt(idOrHandle, data) {
66
66
  return makeRequest(
67
- "POST",
67
+ "PUT",
68
68
  `/api/prompts/${encodeURIComponent(idOrHandle)}`,
69
69
  data
70
70
  );
71
71
  }
72
- async function createPromptVersion(idOrHandle, data) {
73
- return makeRequest(
74
- "POST",
75
- `/api/prompts/${encodeURIComponent(idOrHandle)}/versions`,
76
- data
77
- );
78
- }
79
72
 
80
73
  export {
74
+ makeRequest,
81
75
  searchTraces,
82
76
  getTraceById,
83
77
  getAnalyticsTimeseries,
84
78
  listPrompts,
85
79
  getPrompt,
86
80
  createPrompt,
87
- updatePrompt,
88
- createPromptVersion
81
+ updatePrompt
89
82
  };
90
- //# sourceMappingURL=chunk-HOPTUDCZ.js.map
83
+ //# sourceMappingURL=chunk-LLRQIF52.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/langwatch-api.ts"],"sourcesContent":["import { getConfig, requireApiKey } from \"./config.js\";\n\n// --- Response types ---\n\nexport interface TraceSearchResult {\n trace_id: string;\n formatted_trace?: string;\n input?: { value: string };\n output?: { value: string };\n timestamps?: { started_at?: string | number };\n metadata?: Record<string, unknown>;\n error?: Record<string, unknown>;\n}\n\nexport interface SearchTracesResponse {\n traces: TraceSearchResult[];\n pagination?: {\n totalHits?: number;\n scrollId?: string;\n };\n}\n\nexport interface TraceDetailResponse {\n trace_id: string;\n formatted_trace?: string;\n input?: { value: string };\n output?: { value: string };\n timestamps?: {\n started_at?: string | number;\n updated_at?: string | number;\n inserted_at?: string | number;\n };\n metadata?: {\n user_id?: string;\n thread_id?: string;\n customer_id?: string;\n labels?: string[];\n [key: string]: unknown;\n };\n error?: Record<string, unknown>;\n ascii_tree?: string;\n evaluations?: Array<{\n evaluator_id?: string;\n name?: string;\n score?: number;\n passed?: boolean;\n label?: string;\n }>;\n spans?: Array<{\n span_id: string;\n name?: string;\n type?: string;\n model?: string;\n input?: { value: string };\n output?: { value: string };\n timestamps?: { started_at?: number; finished_at?: number };\n metrics?: {\n completion_time_ms?: number;\n prompt_tokens?: number;\n completion_tokens?: number;\n tokens_estimated?: boolean;\n cost?: number;\n };\n }>;\n}\n\nexport interface AnalyticsBucket {\n date: string;\n [key: string]: unknown;\n}\n\nexport interface AnalyticsTimeseriesResponse {\n currentPeriod: AnalyticsBucket[];\n previousPeriod: AnalyticsBucket[];\n}\n\nexport interface PromptSummary {\n id?: string;\n handle?: string;\n name?: string;\n latestVersionNumber?: number;\n version?: number;\n}\n\nexport interface PromptVersion {\n version?: number;\n commitMessage?: string;\n model?: string;\n messages?: Array<{ role: string; content: string }>;\n}\n\nexport interface PromptDetailResponse extends PromptSummary {\n versions?: PromptVersion[];\n model?: string;\n messages?: Array<{ role: string; content: string }>;\n prompt?: Array<{ role: string; content: string }>;\n}\n\nexport interface PromptMutationResponse {\n id?: string;\n handle?: string;\n name?: string;\n latestVersionNumber?: number;\n}\n\n// --- HTTP client ---\n\n/**\n * Sends an HTTP request to the LangWatch API.\n *\n * Builds the full URL from the configured endpoint, adds authentication,\n * and handles JSON serialization/deserialization.\n *\n * @throws Error with status code and response body when the response is not OK\n */\nexport async function makeRequest(\n method: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\",\n path: string,\n body?: unknown\n): Promise<unknown> {\n const url = getConfig().endpoint + path;\n const headers: Record<string, string> = {\n \"X-Auth-Token\": requireApiKey(),\n };\n\n if (body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n\n const response = await fetch(url, {\n method,\n headers,\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n });\n\n if (!response.ok) {\n const responseBody = await response.text();\n throw new Error(\n `LangWatch API error ${response.status}: ${responseBody}`\n );\n }\n\n return response.json();\n}\n\n/** Searches traces with optional filters and pagination. */\nexport async function searchTraces(params: {\n query?: string;\n filters?: Record<string, string[]>;\n startDate: number;\n endDate: number;\n pageSize?: number;\n pageOffset?: number;\n scrollId?: string;\n format?: \"digest\" | \"json\";\n}): Promise<SearchTracesResponse> {\n const { format = \"digest\", ...rest } = params;\n return makeRequest(\"POST\", \"/api/traces/search\", {\n ...rest,\n format,\n }) as Promise<SearchTracesResponse>;\n}\n\n/** Retrieves a single trace by its ID. */\nexport async function getTraceById(\n traceId: string,\n format: \"digest\" | \"json\" = \"digest\"\n): Promise<TraceDetailResponse> {\n return makeRequest(\n \"GET\",\n `/api/traces/${encodeURIComponent(traceId)}?format=${format}`\n ) as Promise<TraceDetailResponse>;\n}\n\n/** Fetches analytics timeseries data for the given metrics and date range. */\nexport async function getAnalyticsTimeseries(params: {\n series: Array<{\n metric: string;\n aggregation: string;\n key?: string;\n subkey?: string;\n }>;\n startDate: number;\n endDate: number;\n timeZone?: string;\n groupBy?: string;\n groupByKey?: string;\n filters?: Record<string, string[]>;\n}): Promise<AnalyticsTimeseriesResponse> {\n return makeRequest(\n \"POST\",\n \"/api/analytics/timeseries\",\n params\n ) as Promise<AnalyticsTimeseriesResponse>;\n}\n\n/** Lists all prompts in the project. */\nexport async function listPrompts(): Promise<PromptSummary[]> {\n return makeRequest(\"GET\", \"/api/prompts\") as Promise<PromptSummary[]>;\n}\n\n/** Retrieves a single prompt by ID or handle. */\nexport async function getPrompt(\n idOrHandle: string,\n version?: number\n): Promise<PromptDetailResponse> {\n const query = version != null ? `?version=${version}` : \"\";\n return makeRequest(\n \"GET\",\n `/api/prompts/${encodeURIComponent(idOrHandle)}${query}`\n ) as Promise<PromptDetailResponse>;\n}\n\n/** Creates a new prompt. */\nexport async function createPrompt(data: {\n handle: string;\n messages: Array<{ role: string; content: string }>;\n model: string;\n}): Promise<PromptMutationResponse> {\n return makeRequest(\n \"POST\",\n \"/api/prompts\",\n data\n ) as Promise<PromptMutationResponse>;\n}\n\n/** Updates an existing prompt by ID or handle. */\nexport async function updatePrompt(\n idOrHandle: string,\n data: {\n messages?: Array<{ role: string; content: string }>;\n model?: string;\n commitMessage: string;\n }\n): Promise<PromptMutationResponse> {\n return makeRequest(\n \"PUT\",\n `/api/prompts/${encodeURIComponent(idOrHandle)}`,\n data\n ) as Promise<PromptMutationResponse>;\n}\n"],"mappings":";;;;;;AAmHA,eAAsB,YACpB,QACA,MACA,MACkB;AAClB,QAAM,MAAM,UAAU,EAAE,WAAW;AACnC,QAAM,UAAkC;AAAA,IACtC,gBAAgB,cAAc;AAAA,EAChC;AAEA,MAAI,SAAS,QAAW;AACtB,YAAQ,cAAc,IAAI;AAAA,EAC5B;AAEA,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC;AAAA,IACA;AAAA,IACA,GAAI,SAAS,SAAY,EAAE,MAAM,KAAK,UAAU,IAAI,EAAE,IAAI,CAAC;AAAA,EAC7D,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,eAAe,MAAM,SAAS,KAAK;AACzC,UAAM,IAAI;AAAA,MACR,uBAAuB,SAAS,MAAM,KAAK,YAAY;AAAA,IACzD;AAAA,EACF;AAEA,SAAO,SAAS,KAAK;AACvB;AAGA,eAAsB,aAAa,QASD;AAChC,QAAM,EAAE,SAAS,UAAU,GAAG,KAAK,IAAI;AACvC,SAAO,YAAY,QAAQ,sBAAsB;AAAA,IAC/C,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAGA,eAAsB,aACpB,SACA,SAA4B,UACE;AAC9B,SAAO;AAAA,IACL;AAAA,IACA,eAAe,mBAAmB,OAAO,CAAC,WAAW,MAAM;AAAA,EAC7D;AACF;AAGA,eAAsB,uBAAuB,QAaJ;AACvC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAGA,eAAsB,cAAwC;AAC5D,SAAO,YAAY,OAAO,cAAc;AAC1C;AAGA,eAAsB,UACpB,YACA,SAC+B;AAC/B,QAAM,QAAQ,WAAW,OAAO,YAAY,OAAO,KAAK;AACxD,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB,mBAAmB,UAAU,CAAC,GAAG,KAAK;AAAA,EACxD;AACF;AAGA,eAAsB,aAAa,MAIC;AAClC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAGA,eAAsB,aACpB,YACA,MAKiC;AACjC,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB,mBAAmB,UAAU,CAAC;AAAA,IAC9C;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,27 @@
1
+ import {
2
+ createEvaluator,
3
+ getEvaluatorType
4
+ } from "./chunk-5UOPNRXW.js";
5
+ import "./chunk-LLRQIF52.js";
6
+ import "./chunk-AAQNA53E.js";
7
+
8
+ // src/tools/create-evaluator.ts
9
+ async function handleCreateEvaluator(params) {
10
+ const result = await createEvaluator(params);
11
+ const evaluatorType = getEvaluatorType(result);
12
+ const lines = [];
13
+ lines.push("Evaluator created successfully!\n");
14
+ lines.push(`**ID**: ${result.id}`);
15
+ if (result.slug) lines.push(`**Slug**: ${result.slug}`);
16
+ lines.push(`**Name**: ${result.name}`);
17
+ if (evaluatorType) lines.push(`**Evaluator Type**: ${evaluatorType}`);
18
+ lines.push(`**Kind**: ${result.type}`);
19
+ if (Array.isArray(result.fields) && result.fields.length > 0) {
20
+ lines.push(`**Input Fields**: ${result.fields.map((f) => f.identifier).join(", ")}`);
21
+ }
22
+ return lines.join("\n");
23
+ }
24
+ export {
25
+ handleCreateEvaluator
26
+ };
27
+ //# sourceMappingURL=create-evaluator-E5X5ZP3B.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools/create-evaluator.ts"],"sourcesContent":["import {\n createEvaluator as apiCreateEvaluator,\n getEvaluatorType,\n} from \"../langwatch-api-evaluators.js\";\n\n/**\n * Handles the platform_create_evaluator MCP tool invocation.\n *\n * Creates a new evaluator in the LangWatch project and returns a\n * confirmation with the created evaluator's details.\n */\nexport async function handleCreateEvaluator(params: {\n name: string;\n config: Record<string, unknown>;\n}): Promise<string> {\n const result = await apiCreateEvaluator(params);\n\n const evaluatorType = getEvaluatorType(result);\n\n const lines: string[] = [];\n lines.push(\"Evaluator created successfully!\\n\");\n lines.push(`**ID**: ${result.id}`);\n if (result.slug) lines.push(`**Slug**: ${result.slug}`);\n lines.push(`**Name**: ${result.name}`);\n if (evaluatorType) lines.push(`**Evaluator Type**: ${evaluatorType}`);\n lines.push(`**Kind**: ${result.type}`);\n\n if (Array.isArray(result.fields) && result.fields.length > 0) {\n lines.push(`**Input Fields**: ${result.fields.map((f) => f.identifier).join(\", \")}`);\n }\n\n return lines.join(\"\\n\");\n}\n"],"mappings":";;;;;;;;AAWA,eAAsB,sBAAsB,QAGxB;AAClB,QAAM,SAAS,MAAM,gBAAmB,MAAM;AAE9C,QAAM,gBAAgB,iBAAiB,MAAM;AAE7C,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,mCAAmC;AAC9C,QAAM,KAAK,WAAW,OAAO,EAAE,EAAE;AACjC,MAAI,OAAO,KAAM,OAAM,KAAK,aAAa,OAAO,IAAI,EAAE;AACtD,QAAM,KAAK,aAAa,OAAO,IAAI,EAAE;AACrC,MAAI,cAAe,OAAM,KAAK,uBAAuB,aAAa,EAAE;AACpE,QAAM,KAAK,aAAa,OAAO,IAAI,EAAE;AAErC,MAAI,MAAM,QAAQ,OAAO,MAAM,KAAK,OAAO,OAAO,SAAS,GAAG;AAC5D,UAAM,KAAK,qBAAqB,OAAO,OAAO,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,EACrF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;","names":[]}
@@ -0,0 +1,36 @@
1
+ import {
2
+ createPrompt
3
+ } from "./chunk-LLRQIF52.js";
4
+ import "./chunk-AAQNA53E.js";
5
+
6
+ // src/tools/create-prompt.ts
7
+ var HANDLE_PATTERN = /^[a-z0-9_-]+(?:\/[a-z0-9_-]+)?$/;
8
+ function toHandle(name) {
9
+ return name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
10
+ }
11
+ async function handleCreatePrompt(params) {
12
+ const handle = params.handle?.trim() || toHandle(params.name);
13
+ if (!handle || !HANDLE_PATTERN.test(handle)) {
14
+ throw new Error(
15
+ `Invalid prompt handle "${handle || ""}". Handle must match ${HANDLE_PATTERN}. Provide a valid \`handle\` explicitly.`
16
+ );
17
+ }
18
+ const result = await createPrompt({
19
+ handle,
20
+ messages: params.messages,
21
+ model: params.model
22
+ });
23
+ const lines = [];
24
+ lines.push("Prompt created successfully!\n");
25
+ if (result.id) lines.push(`**ID**: ${result.id}`);
26
+ if (result.handle) lines.push(`**Handle**: ${result.handle}`);
27
+ lines.push(`**Name**: ${result.name || params.name}`);
28
+ lines.push(`**Model**: ${params.model}`);
29
+ if (result.latestVersionNumber != null)
30
+ lines.push(`**Version**: v${result.latestVersionNumber}`);
31
+ return lines.join("\n");
32
+ }
33
+ export {
34
+ handleCreatePrompt
35
+ };
36
+ //# sourceMappingURL=create-prompt-7Z35MIL6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools/create-prompt.ts"],"sourcesContent":["import { createPrompt as apiCreatePrompt } from \"../langwatch-api.js\";\n\nconst HANDLE_PATTERN = /^[a-z0-9_-]+(?:\\/[a-z0-9_-]+)?$/;\n\n/**\n * Converts a human-readable name into a URL-friendly handle.\n *\n * Lowercases the input, replaces non-alphanumeric runs with hyphens,\n * and strips leading/trailing hyphens. May return an empty string\n * for inputs with no alphanumeric characters — callers must validate.\n */\nfunction toHandle(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n}\n\n/**\n * Handles the platform_create_prompt MCP tool invocation.\n *\n * Creates a new prompt in the LangWatch project and returns a\n * confirmation with the created prompt's details.\n */\nexport async function handleCreatePrompt(params: {\n name: string;\n handle?: string;\n messages: Array<{ role: string; content: string }>;\n model: string;\n}): Promise<string> {\n const handle = params.handle?.trim() || toHandle(params.name);\n if (!handle || !HANDLE_PATTERN.test(handle)) {\n throw new Error(\n `Invalid prompt handle \"${handle || \"\"}\". Handle must match ${HANDLE_PATTERN}. Provide a valid \\`handle\\` explicitly.`\n );\n }\n\n const result = await apiCreatePrompt({\n handle,\n messages: params.messages,\n model: params.model,\n });\n\n const lines: string[] = [];\n lines.push(\"Prompt created successfully!\\n\");\n if (result.id) lines.push(`**ID**: ${result.id}`);\n if (result.handle) lines.push(`**Handle**: ${result.handle}`);\n lines.push(`**Name**: ${result.name || params.name}`);\n lines.push(`**Model**: ${params.model}`);\n if (result.latestVersionNumber != null)\n lines.push(`**Version**: v${result.latestVersionNumber}`);\n\n return lines.join(\"\\n\");\n}\n"],"mappings":";;;;;;AAEA,IAAM,iBAAiB;AASvB,SAAS,SAAS,MAAsB;AACtC,SAAO,KACJ,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,UAAU,EAAE;AACzB;AAQA,eAAsB,mBAAmB,QAKrB;AAClB,QAAM,SAAS,OAAO,QAAQ,KAAK,KAAK,SAAS,OAAO,IAAI;AAC5D,MAAI,CAAC,UAAU,CAAC,eAAe,KAAK,MAAM,GAAG;AAC3C,UAAM,IAAI;AAAA,MACR,0BAA0B,UAAU,EAAE,wBAAwB,cAAc;AAAA,IAC9E;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,aAAgB;AAAA,IACnC;AAAA,IACA,UAAU,OAAO;AAAA,IACjB,OAAO,OAAO;AAAA,EAChB,CAAC;AAED,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,gCAAgC;AAC3C,MAAI,OAAO,GAAI,OAAM,KAAK,WAAW,OAAO,EAAE,EAAE;AAChD,MAAI,OAAO,OAAQ,OAAM,KAAK,eAAe,OAAO,MAAM,EAAE;AAC5D,QAAM,KAAK,aAAa,OAAO,QAAQ,OAAO,IAAI,EAAE;AACpD,QAAM,KAAK,cAAc,OAAO,KAAK,EAAE;AACvC,MAAI,OAAO,uBAAuB;AAChC,UAAM,KAAK,iBAAiB,OAAO,mBAAmB,EAAE;AAE1D,SAAO,MAAM,KAAK,IAAI;AACxB;","names":[]}
@@ -0,0 +1,26 @@
1
+ import {
2
+ createScenario
3
+ } from "./chunk-6U4TCGFC.js";
4
+ import "./chunk-LLRQIF52.js";
5
+ import "./chunk-AAQNA53E.js";
6
+
7
+ // src/tools/create-scenario.ts
8
+ async function handleCreateScenario(params) {
9
+ const result = await createScenario(params);
10
+ const lines = [];
11
+ lines.push("Scenario created successfully!\n");
12
+ lines.push(`**ID**: ${result.id}`);
13
+ lines.push(`**Name**: ${result.name}`);
14
+ lines.push(`**Situation**: ${result.situation}`);
15
+ if (Array.isArray(result.criteria) && result.criteria.length > 0) {
16
+ lines.push(`**Criteria**: ${result.criteria.length} criteria`);
17
+ }
18
+ if (Array.isArray(result.labels) && result.labels.length > 0) {
19
+ lines.push(`**Labels**: ${result.labels.join(", ")}`);
20
+ }
21
+ return lines.join("\n");
22
+ }
23
+ export {
24
+ handleCreateScenario
25
+ };
26
+ //# sourceMappingURL=create-scenario-DIMPJRPY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools/create-scenario.ts"],"sourcesContent":["import { createScenario as apiCreateScenario } from \"../langwatch-api-scenarios.js\";\n\n/**\n * Handles the platform_create_scenario MCP tool invocation.\n *\n * Creates a new scenario in the LangWatch project and returns a\n * confirmation with the created scenario's details.\n */\nexport async function handleCreateScenario(params: {\n name: string;\n situation: string;\n criteria?: string[];\n labels?: string[];\n}): Promise<string> {\n const result = await apiCreateScenario(params);\n\n const lines: string[] = [];\n lines.push(\"Scenario created successfully!\\n\");\n lines.push(`**ID**: ${result.id}`);\n lines.push(`**Name**: ${result.name}`);\n lines.push(`**Situation**: ${result.situation}`);\n if (Array.isArray(result.criteria) && result.criteria.length > 0) {\n lines.push(`**Criteria**: ${result.criteria.length} criteria`);\n }\n if (Array.isArray(result.labels) && result.labels.length > 0) {\n lines.push(`**Labels**: ${result.labels.join(\", \")}`);\n }\n\n return lines.join(\"\\n\");\n}\n"],"mappings":";;;;;;;AAQA,eAAsB,qBAAqB,QAKvB;AAClB,QAAM,SAAS,MAAM,eAAkB,MAAM;AAE7C,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,kCAAkC;AAC7C,QAAM,KAAK,WAAW,OAAO,EAAE,EAAE;AACjC,QAAM,KAAK,aAAa,OAAO,IAAI,EAAE;AACrC,QAAM,KAAK,kBAAkB,OAAO,SAAS,EAAE;AAC/C,MAAI,MAAM,QAAQ,OAAO,QAAQ,KAAK,OAAO,SAAS,SAAS,GAAG;AAChE,UAAM,KAAK,iBAAiB,OAAO,SAAS,MAAM,WAAW;AAAA,EAC/D;AACA,MAAI,MAAM,QAAQ,OAAO,MAAM,KAAK,OAAO,OAAO,SAAS,GAAG;AAC5D,UAAM,KAAK,eAAe,OAAO,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,EACtD;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;","names":[]}