@langwatch/mcp-server 0.3.3 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +32 -0
- package/README.md +97 -25
- package/dist/archive-scenario-GAE4XVFM.js +19 -0
- package/dist/archive-scenario-GAE4XVFM.js.map +1 -0
- package/dist/chunk-AAQNA53E.js +28 -0
- package/dist/chunk-AAQNA53E.js.map +1 -0
- package/dist/chunk-JVWDWL3J.js +91 -0
- package/dist/chunk-JVWDWL3J.js.map +1 -0
- package/dist/chunk-K2YFPOSD.js +40 -0
- package/dist/chunk-K2YFPOSD.js.map +1 -0
- package/dist/chunk-ZXKLPC2E.js +27 -0
- package/dist/chunk-ZXKLPC2E.js.map +1 -0
- package/dist/config-FIQWQRUB.js +11 -0
- package/dist/config-FIQWQRUB.js.map +1 -0
- package/dist/create-prompt-P35POKBW.js +22 -0
- package/dist/create-prompt-P35POKBW.js.map +1 -0
- package/dist/create-scenario-3YRZVDYF.js +26 -0
- package/dist/create-scenario-3YRZVDYF.js.map +1 -0
- package/dist/discover-scenario-schema-MEEEVND7.js +65 -0
- package/dist/discover-scenario-schema-MEEEVND7.js.map +1 -0
- package/dist/discover-schema-3T52ORPB.js +446 -0
- package/dist/discover-schema-3T52ORPB.js.map +1 -0
- package/dist/get-analytics-BAVXTAPB.js +55 -0
- package/dist/get-analytics-BAVXTAPB.js.map +1 -0
- package/dist/get-prompt-LKCPT26O.js +48 -0
- package/dist/get-prompt-LKCPT26O.js.map +1 -0
- package/dist/get-scenario-3SCDW4Z6.js +33 -0
- package/dist/get-scenario-3SCDW4Z6.js.map +1 -0
- package/dist/get-trace-QFDWJ5D4.js +50 -0
- package/dist/get-trace-QFDWJ5D4.js.map +1 -0
- package/dist/index.js +22114 -8786
- package/dist/index.js.map +1 -1
- package/dist/list-prompts-UQPBCUYA.js +33 -0
- package/dist/list-prompts-UQPBCUYA.js.map +1 -0
- package/dist/list-scenarios-573YOUKC.js +40 -0
- package/dist/list-scenarios-573YOUKC.js.map +1 -0
- package/dist/search-traces-RSMYCAN7.js +72 -0
- package/dist/search-traces-RSMYCAN7.js.map +1 -0
- package/dist/update-prompt-G2Y5EBQY.js +31 -0
- package/dist/update-prompt-G2Y5EBQY.js.map +1 -0
- package/dist/update-scenario-SSGVOBJO.js +27 -0
- package/dist/update-scenario-SSGVOBJO.js.map +1 -0
- package/package.json +3 -3
- package/src/__tests__/config.unit.test.ts +89 -0
- package/src/__tests__/date-parsing.unit.test.ts +78 -0
- package/src/__tests__/discover-schema.unit.test.ts +118 -0
- package/src/__tests__/integration.integration.test.ts +313 -0
- package/src/__tests__/langwatch-api.unit.test.ts +309 -0
- package/src/__tests__/scenario-tools.integration.test.ts +286 -0
- package/src/__tests__/scenario-tools.unit.test.ts +185 -0
- package/src/__tests__/schemas.unit.test.ts +85 -0
- package/src/__tests__/tools.unit.test.ts +729 -0
- package/src/config.ts +31 -0
- package/src/index.ts +383 -0
- package/src/langwatch-api-scenarios.ts +67 -0
- package/src/langwatch-api.ts +266 -0
- package/src/schemas/analytics-groups.ts +78 -0
- package/src/schemas/analytics-metrics.ts +179 -0
- package/src/schemas/filter-fields.ts +119 -0
- package/src/schemas/index.ts +3 -0
- package/src/tools/archive-scenario.ts +19 -0
- package/src/tools/create-prompt.ts +29 -0
- package/src/tools/create-scenario.ts +30 -0
- package/src/tools/discover-scenario-schema.ts +71 -0
- package/src/tools/discover-schema.ts +106 -0
- package/src/tools/get-analytics.ts +71 -0
- package/src/tools/get-prompt.ts +56 -0
- package/src/tools/get-scenario.ts +36 -0
- package/src/tools/get-trace.ts +61 -0
- package/src/tools/list-prompts.ts +35 -0
- package/src/tools/list-scenarios.ts +47 -0
- package/src/tools/search-traces.ts +91 -0
- package/src/tools/update-prompt.ts +44 -0
- package/src/tools/update-scenario.ts +32 -0
- package/src/utils/date-parsing.ts +31 -0
- package/tests/evaluations.ipynb +634 -634
- package/tests/scenario-openai.test.ts +3 -1
- package/uv.lock +1788 -1322
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
// src/schemas/filter-fields.ts
|
|
2
|
+
var filterFields = [
|
|
3
|
+
{
|
|
4
|
+
field: "topics.topics",
|
|
5
|
+
description: "Main topic classification of the trace",
|
|
6
|
+
example: "billing"
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
field: "topics.subtopics",
|
|
10
|
+
description: "Subtopic classification",
|
|
11
|
+
example: "refund-request"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
field: "metadata.user_id",
|
|
15
|
+
description: "User ID from trace metadata",
|
|
16
|
+
example: "user-123"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
field: "metadata.thread_id",
|
|
20
|
+
description: "Conversation thread ID",
|
|
21
|
+
example: "thread-456"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
field: "metadata.customer_id",
|
|
25
|
+
description: "Customer/organization ID",
|
|
26
|
+
example: "customer-789"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
field: "metadata.labels",
|
|
30
|
+
description: "Custom labels attached to traces",
|
|
31
|
+
example: "production"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
field: "metadata.key",
|
|
35
|
+
description: "Custom metadata key",
|
|
36
|
+
example: "environment"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
field: "metadata.value",
|
|
40
|
+
description: "Custom metadata value (used with metadata.key)",
|
|
41
|
+
example: "staging"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
field: "metadata.prompt_ids",
|
|
45
|
+
description: "Prompt IDs used in the trace"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
field: "traces.error",
|
|
49
|
+
description: "Whether the trace has errors",
|
|
50
|
+
example: "true"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
field: "spans.type",
|
|
54
|
+
description: "Span type (llm, tool, agent, chain, rag)",
|
|
55
|
+
example: "llm"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
field: "spans.model",
|
|
59
|
+
description: "LLM model name used in spans",
|
|
60
|
+
example: "gpt-4o"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
field: "evaluations.evaluator_id",
|
|
64
|
+
description: "Evaluator that ran on the trace"
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
field: "evaluations.evaluator_id.guardrails_only",
|
|
68
|
+
description: "Evaluator ID filtered to guardrails only"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
field: "evaluations.passed",
|
|
72
|
+
description: "Whether evaluations passed",
|
|
73
|
+
example: "true"
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
field: "evaluations.score",
|
|
77
|
+
description: "Evaluation score (numeric)"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
field: "evaluations.state",
|
|
81
|
+
description: "Evaluation state (processed, error, skipped)"
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
field: "evaluations.label",
|
|
85
|
+
description: "Evaluation label result"
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
field: "events.event_type",
|
|
89
|
+
description: "Type of event (thumbs_up_down, custom)",
|
|
90
|
+
example: "thumbs_up_down"
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
field: "events.metrics.key",
|
|
94
|
+
description: "Event metric key"
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
field: "events.metrics.value",
|
|
98
|
+
description: "Event metric value (numeric)"
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
field: "events.event_details.key",
|
|
102
|
+
description: "Event detail key"
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
field: "annotations.hasAnnotation",
|
|
106
|
+
description: "Whether trace has human annotations",
|
|
107
|
+
example: "true"
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
field: "sentiment.input_sentiment",
|
|
111
|
+
description: "Detected sentiment of input",
|
|
112
|
+
example: "positive"
|
|
113
|
+
}
|
|
114
|
+
];
|
|
115
|
+
|
|
116
|
+
// src/schemas/analytics-metrics.ts
|
|
117
|
+
var analyticsMetrics = [
|
|
118
|
+
// metadata
|
|
119
|
+
{
|
|
120
|
+
category: "metadata",
|
|
121
|
+
name: "trace_id",
|
|
122
|
+
label: "Traces",
|
|
123
|
+
allowedAggregations: ["cardinality"],
|
|
124
|
+
description: "Count of unique traces"
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
category: "metadata",
|
|
128
|
+
name: "user_id",
|
|
129
|
+
label: "Users",
|
|
130
|
+
allowedAggregations: ["cardinality"],
|
|
131
|
+
description: "Count of unique users"
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
category: "metadata",
|
|
135
|
+
name: "thread_id",
|
|
136
|
+
label: "Threads",
|
|
137
|
+
allowedAggregations: ["cardinality"],
|
|
138
|
+
description: "Count of unique conversation threads"
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
category: "metadata",
|
|
142
|
+
name: "span_type",
|
|
143
|
+
label: "Span Type",
|
|
144
|
+
allowedAggregations: ["cardinality"],
|
|
145
|
+
description: "Count of spans, optionally filtered by span type"
|
|
146
|
+
},
|
|
147
|
+
// sentiment
|
|
148
|
+
{
|
|
149
|
+
category: "sentiment",
|
|
150
|
+
name: "input_sentiment",
|
|
151
|
+
label: "Input Sentiment Score",
|
|
152
|
+
allowedAggregations: ["avg", "sum", "min", "max", "median", "p99", "p95", "p90"],
|
|
153
|
+
description: "Sentiment analysis score of inputs"
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
category: "sentiment",
|
|
157
|
+
name: "thumbs_up_down",
|
|
158
|
+
label: "Thumbs Up/Down Score",
|
|
159
|
+
allowedAggregations: [
|
|
160
|
+
"terms",
|
|
161
|
+
"cardinality",
|
|
162
|
+
"avg",
|
|
163
|
+
"sum",
|
|
164
|
+
"min",
|
|
165
|
+
"max",
|
|
166
|
+
"median",
|
|
167
|
+
"p99",
|
|
168
|
+
"p95",
|
|
169
|
+
"p90"
|
|
170
|
+
],
|
|
171
|
+
description: "User feedback score (-1 to 1)"
|
|
172
|
+
},
|
|
173
|
+
// performance
|
|
174
|
+
{
|
|
175
|
+
category: "performance",
|
|
176
|
+
name: "completion_time",
|
|
177
|
+
label: "Completion Time",
|
|
178
|
+
allowedAggregations: ["avg", "sum", "min", "max", "median", "p99", "p95", "p90"],
|
|
179
|
+
description: "Time to complete the trace (ms)"
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
category: "performance",
|
|
183
|
+
name: "first_token",
|
|
184
|
+
label: "Time to First Token",
|
|
185
|
+
allowedAggregations: ["avg", "sum", "min", "max", "median", "p99", "p95", "p90"],
|
|
186
|
+
description: "Time to first token (ms)"
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
category: "performance",
|
|
190
|
+
name: "total_cost",
|
|
191
|
+
label: "Total Cost",
|
|
192
|
+
allowedAggregations: ["avg", "sum", "min", "max", "median", "p99", "p95", "p90"],
|
|
193
|
+
description: "Cost per trace in USD"
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
category: "performance",
|
|
197
|
+
name: "prompt_tokens",
|
|
198
|
+
label: "Prompt Tokens",
|
|
199
|
+
allowedAggregations: ["avg", "sum", "min", "max", "median", "p99", "p95", "p90"],
|
|
200
|
+
description: "Input token count"
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
category: "performance",
|
|
204
|
+
name: "completion_tokens",
|
|
205
|
+
label: "Completion Tokens",
|
|
206
|
+
allowedAggregations: ["avg", "sum", "min", "max", "median", "p99", "p95", "p90"],
|
|
207
|
+
description: "Output token count"
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
category: "performance",
|
|
211
|
+
name: "total_tokens",
|
|
212
|
+
label: "Total Tokens",
|
|
213
|
+
allowedAggregations: ["avg", "sum", "min", "max", "median", "p99", "p95", "p90"],
|
|
214
|
+
description: "Total token count (input + output)"
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
category: "performance",
|
|
218
|
+
name: "tokens_per_second",
|
|
219
|
+
label: "Tokens per Second",
|
|
220
|
+
allowedAggregations: ["avg", "sum", "min", "max", "median", "p99", "p95", "p90"],
|
|
221
|
+
description: "Token generation speed"
|
|
222
|
+
},
|
|
223
|
+
// events
|
|
224
|
+
{
|
|
225
|
+
category: "events",
|
|
226
|
+
name: "event_type",
|
|
227
|
+
label: "Event Type",
|
|
228
|
+
allowedAggregations: ["cardinality"],
|
|
229
|
+
description: "Count of events, optionally filtered by event type"
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
category: "events",
|
|
233
|
+
name: "event_score",
|
|
234
|
+
label: "Event Score",
|
|
235
|
+
allowedAggregations: [
|
|
236
|
+
"terms",
|
|
237
|
+
"avg",
|
|
238
|
+
"sum",
|
|
239
|
+
"min",
|
|
240
|
+
"max",
|
|
241
|
+
"median",
|
|
242
|
+
"p99",
|
|
243
|
+
"p95",
|
|
244
|
+
"p90"
|
|
245
|
+
],
|
|
246
|
+
description: "Numeric score from events (requires event_type key and metrics key)"
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
category: "events",
|
|
250
|
+
name: "event_details",
|
|
251
|
+
label: "Event Details",
|
|
252
|
+
allowedAggregations: ["cardinality"],
|
|
253
|
+
description: "Event detail key/value distribution (requires event_type key and details key)"
|
|
254
|
+
},
|
|
255
|
+
// evaluations
|
|
256
|
+
{
|
|
257
|
+
category: "evaluations",
|
|
258
|
+
name: "evaluation_score",
|
|
259
|
+
label: "Evaluation Score",
|
|
260
|
+
allowedAggregations: ["avg", "sum", "min", "max", "median", "p99", "p95", "p90"],
|
|
261
|
+
description: "Numeric evaluation score (requires evaluator_id key)"
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
category: "evaluations",
|
|
265
|
+
name: "evaluation_pass_rate",
|
|
266
|
+
label: "Evaluation Pass Rate",
|
|
267
|
+
allowedAggregations: ["avg", "sum", "min", "max", "median", "p99", "p95", "p90"],
|
|
268
|
+
description: "Percentage of traces passing evaluation (requires evaluator_id key)"
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
category: "evaluations",
|
|
272
|
+
name: "evaluation_runs",
|
|
273
|
+
label: "Evaluation Runs",
|
|
274
|
+
allowedAggregations: ["cardinality"],
|
|
275
|
+
description: "Count of evaluation executions"
|
|
276
|
+
},
|
|
277
|
+
// threads
|
|
278
|
+
{
|
|
279
|
+
category: "threads",
|
|
280
|
+
name: "average_duration_per_thread",
|
|
281
|
+
label: "Thread Duration",
|
|
282
|
+
allowedAggregations: ["avg"],
|
|
283
|
+
description: "Average duration of conversation threads (ms)"
|
|
284
|
+
}
|
|
285
|
+
];
|
|
286
|
+
|
|
287
|
+
// src/schemas/analytics-groups.ts
|
|
288
|
+
var analyticsGroups = [
|
|
289
|
+
{
|
|
290
|
+
name: "topics.topics",
|
|
291
|
+
label: "Topic",
|
|
292
|
+
description: "Group by topic classification"
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
name: "metadata.user_id",
|
|
296
|
+
label: "User",
|
|
297
|
+
description: "Group by user ID"
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
name: "metadata.thread_id",
|
|
301
|
+
label: "Thread",
|
|
302
|
+
description: "Group by conversation thread"
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
name: "metadata.customer_id",
|
|
306
|
+
label: "Customer ID",
|
|
307
|
+
description: "Group by customer/organization"
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
name: "metadata.labels",
|
|
311
|
+
label: "Label",
|
|
312
|
+
description: "Group by custom labels"
|
|
313
|
+
},
|
|
314
|
+
{
|
|
315
|
+
name: "metadata.model",
|
|
316
|
+
label: "Model",
|
|
317
|
+
description: "Group by LLM model name"
|
|
318
|
+
},
|
|
319
|
+
{
|
|
320
|
+
name: "metadata.span_type",
|
|
321
|
+
label: "Span Type",
|
|
322
|
+
description: "Group by span type (llm, tool, agent, etc.)"
|
|
323
|
+
},
|
|
324
|
+
{
|
|
325
|
+
name: "sentiment.input_sentiment",
|
|
326
|
+
label: "Input Sentiment",
|
|
327
|
+
description: "Group by detected input sentiment (positive, negative, neutral)"
|
|
328
|
+
},
|
|
329
|
+
{
|
|
330
|
+
name: "sentiment.thumbs_up_down",
|
|
331
|
+
label: "Thumbs Up/Down",
|
|
332
|
+
description: "Group by user feedback (positive, negative, neutral)"
|
|
333
|
+
},
|
|
334
|
+
{
|
|
335
|
+
name: "events.event_type",
|
|
336
|
+
label: "Event Type",
|
|
337
|
+
description: "Group by event type"
|
|
338
|
+
},
|
|
339
|
+
{
|
|
340
|
+
name: "evaluations.evaluation_passed",
|
|
341
|
+
label: "Evaluation Passed",
|
|
342
|
+
description: "Group by evaluation pass/fail status"
|
|
343
|
+
},
|
|
344
|
+
{
|
|
345
|
+
name: "evaluations.evaluation_label",
|
|
346
|
+
label: "Evaluation Label",
|
|
347
|
+
description: "Group by evaluation label result"
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
name: "evaluations.evaluation_processing_state",
|
|
351
|
+
label: "Evaluation Processing State",
|
|
352
|
+
description: "Group by evaluation processing state"
|
|
353
|
+
},
|
|
354
|
+
{
|
|
355
|
+
name: "error.has_error",
|
|
356
|
+
label: "Contains Error",
|
|
357
|
+
description: "Group by whether the trace contains an error"
|
|
358
|
+
}
|
|
359
|
+
];
|
|
360
|
+
|
|
361
|
+
// src/tools/discover-schema.ts
|
|
362
|
+
function formatSchema(category) {
|
|
363
|
+
const sections = [];
|
|
364
|
+
if (category === "filters" || category === "all") {
|
|
365
|
+
sections.push(formatFilters());
|
|
366
|
+
}
|
|
367
|
+
if (category === "metrics" || category === "all") {
|
|
368
|
+
sections.push(formatMetrics());
|
|
369
|
+
}
|
|
370
|
+
if (category === "aggregations" || category === "all") {
|
|
371
|
+
sections.push(formatAggregations());
|
|
372
|
+
}
|
|
373
|
+
if (category === "groups" || category === "all") {
|
|
374
|
+
sections.push(formatGroups());
|
|
375
|
+
}
|
|
376
|
+
return sections.join("\n\n");
|
|
377
|
+
}
|
|
378
|
+
function formatFilters() {
|
|
379
|
+
const lines = ["## Available Filter Fields", ""];
|
|
380
|
+
lines.push(
|
|
381
|
+
"Use these in the `filters` parameter of `search_traces` and `get_analytics`."
|
|
382
|
+
);
|
|
383
|
+
lines.push('Format: `{ "field_name": ["value1", "value2"] }`');
|
|
384
|
+
lines.push("");
|
|
385
|
+
for (const f of filterFields) {
|
|
386
|
+
lines.push(
|
|
387
|
+
`- **${f.field}**: ${f.description}${f.example ? ` (e.g., \`${f.example}\`)` : ""}`
|
|
388
|
+
);
|
|
389
|
+
}
|
|
390
|
+
return lines.join("\n");
|
|
391
|
+
}
|
|
392
|
+
function formatMetrics() {
|
|
393
|
+
const lines = ["## Available Metrics", ""];
|
|
394
|
+
lines.push(
|
|
395
|
+
"Use these in `get_analytics` as `metric` parameter in `category.name` format."
|
|
396
|
+
);
|
|
397
|
+
lines.push("");
|
|
398
|
+
const byCategory = /* @__PURE__ */ new Map();
|
|
399
|
+
for (const m of analyticsMetrics) {
|
|
400
|
+
const list = byCategory.get(m.category) || [];
|
|
401
|
+
list.push(m);
|
|
402
|
+
byCategory.set(m.category, list);
|
|
403
|
+
}
|
|
404
|
+
for (const [cat, metrics] of byCategory) {
|
|
405
|
+
lines.push(`### ${cat}`);
|
|
406
|
+
for (const m of metrics) {
|
|
407
|
+
lines.push(`- **${cat}.${m.name}** (${m.label}): ${m.description}`);
|
|
408
|
+
lines.push(` Aggregations: ${m.allowedAggregations.join(", ")}`);
|
|
409
|
+
}
|
|
410
|
+
lines.push("");
|
|
411
|
+
}
|
|
412
|
+
return lines.join("\n");
|
|
413
|
+
}
|
|
414
|
+
function formatAggregations() {
|
|
415
|
+
return [
|
|
416
|
+
"## Available Aggregation Types",
|
|
417
|
+
"",
|
|
418
|
+
"- **cardinality**: Count unique values",
|
|
419
|
+
"- **terms**: Distribution/breakdown of values",
|
|
420
|
+
"- **avg**: Average",
|
|
421
|
+
"- **sum**: Sum total",
|
|
422
|
+
"- **min**: Minimum",
|
|
423
|
+
"- **max**: Maximum",
|
|
424
|
+
"- **median**: 50th percentile",
|
|
425
|
+
"- **p90**: 90th percentile",
|
|
426
|
+
"- **p95**: 95th percentile",
|
|
427
|
+
"- **p99**: 99th percentile",
|
|
428
|
+
"",
|
|
429
|
+
"Note: Not all aggregations are available for all metrics. Check the metric's allowed aggregations."
|
|
430
|
+
].join("\n");
|
|
431
|
+
}
|
|
432
|
+
function formatGroups() {
|
|
433
|
+
const lines = ["## Available Group-By Options", ""];
|
|
434
|
+
lines.push(
|
|
435
|
+
"Use these in the `groupBy` parameter of `get_analytics`."
|
|
436
|
+
);
|
|
437
|
+
lines.push("");
|
|
438
|
+
for (const g of analyticsGroups) {
|
|
439
|
+
lines.push(`- **${g.name}** (${g.label}): ${g.description}`);
|
|
440
|
+
}
|
|
441
|
+
return lines.join("\n");
|
|
442
|
+
}
|
|
443
|
+
export {
|
|
444
|
+
formatSchema
|
|
445
|
+
};
|
|
446
|
+
//# sourceMappingURL=discover-schema-3T52ORPB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/schemas/filter-fields.ts","../src/schemas/analytics-metrics.ts","../src/schemas/analytics-groups.ts","../src/tools/discover-schema.ts"],"sourcesContent":["export interface FilterFieldInfo {\n field: string;\n description: string;\n example?: string;\n}\n\nexport const filterFields: FilterFieldInfo[] = [\n {\n field: \"topics.topics\",\n description: \"Main topic classification of the trace\",\n example: \"billing\",\n },\n {\n field: \"topics.subtopics\",\n description: \"Subtopic classification\",\n example: \"refund-request\",\n },\n {\n field: \"metadata.user_id\",\n description: \"User ID from trace metadata\",\n example: \"user-123\",\n },\n {\n field: \"metadata.thread_id\",\n description: \"Conversation thread ID\",\n example: \"thread-456\",\n },\n {\n field: \"metadata.customer_id\",\n description: \"Customer/organization ID\",\n example: \"customer-789\",\n },\n {\n field: \"metadata.labels\",\n description: \"Custom labels attached to traces\",\n example: \"production\",\n },\n {\n field: \"metadata.key\",\n description: \"Custom metadata key\",\n example: \"environment\",\n },\n {\n field: \"metadata.value\",\n description: \"Custom metadata value (used with metadata.key)\",\n example: \"staging\",\n },\n {\n field: \"metadata.prompt_ids\",\n description: \"Prompt IDs used in the trace\",\n },\n {\n field: \"traces.error\",\n description: \"Whether the trace has errors\",\n example: \"true\",\n },\n {\n field: \"spans.type\",\n description: \"Span type (llm, tool, agent, chain, rag)\",\n example: \"llm\",\n },\n {\n field: \"spans.model\",\n description: \"LLM model name used in spans\",\n example: \"gpt-4o\",\n },\n {\n field: \"evaluations.evaluator_id\",\n description: \"Evaluator that ran on the trace\",\n },\n {\n field: \"evaluations.evaluator_id.guardrails_only\",\n description: \"Evaluator ID filtered to guardrails only\",\n },\n {\n field: \"evaluations.passed\",\n description: \"Whether evaluations passed\",\n example: \"true\",\n },\n {\n field: \"evaluations.score\",\n description: \"Evaluation score (numeric)\",\n },\n {\n field: \"evaluations.state\",\n description: \"Evaluation state (processed, error, skipped)\",\n },\n {\n field: \"evaluations.label\",\n description: \"Evaluation label result\",\n },\n {\n field: \"events.event_type\",\n description: \"Type of event (thumbs_up_down, custom)\",\n example: \"thumbs_up_down\",\n },\n {\n field: \"events.metrics.key\",\n description: \"Event metric key\",\n },\n {\n field: \"events.metrics.value\",\n description: \"Event metric value (numeric)\",\n },\n {\n field: \"events.event_details.key\",\n description: \"Event detail key\",\n },\n {\n field: \"annotations.hasAnnotation\",\n description: \"Whether trace has human annotations\",\n example: \"true\",\n },\n {\n field: \"sentiment.input_sentiment\",\n description: \"Detected sentiment of input\",\n example: \"positive\",\n },\n];\n","export interface MetricInfo {\n category: string;\n name: string;\n label: string;\n allowedAggregations: string[];\n description: string;\n}\n\nexport const analyticsMetrics: MetricInfo[] = [\n // metadata\n {\n category: \"metadata\",\n name: \"trace_id\",\n label: \"Traces\",\n allowedAggregations: [\"cardinality\"],\n description: \"Count of unique traces\",\n },\n {\n category: \"metadata\",\n name: \"user_id\",\n label: \"Users\",\n allowedAggregations: [\"cardinality\"],\n description: \"Count of unique users\",\n },\n {\n category: \"metadata\",\n name: \"thread_id\",\n label: \"Threads\",\n allowedAggregations: [\"cardinality\"],\n description: \"Count of unique conversation threads\",\n },\n {\n category: \"metadata\",\n name: \"span_type\",\n label: \"Span Type\",\n allowedAggregations: [\"cardinality\"],\n description: \"Count of spans, optionally filtered by span type\",\n },\n // sentiment\n {\n category: \"sentiment\",\n name: \"input_sentiment\",\n label: \"Input Sentiment Score\",\n allowedAggregations: [\"avg\", \"sum\", \"min\", \"max\", \"median\", \"p99\", \"p95\", \"p90\"],\n description: \"Sentiment analysis score of inputs\",\n },\n {\n category: \"sentiment\",\n name: \"thumbs_up_down\",\n label: \"Thumbs Up/Down Score\",\n allowedAggregations: [\n \"terms\",\n \"cardinality\",\n \"avg\",\n \"sum\",\n \"min\",\n \"max\",\n \"median\",\n \"p99\",\n \"p95\",\n \"p90\",\n ],\n description: \"User feedback score (-1 to 1)\",\n },\n // performance\n {\n category: \"performance\",\n name: \"completion_time\",\n label: \"Completion Time\",\n allowedAggregations: [\"avg\", \"sum\", \"min\", \"max\", \"median\", \"p99\", \"p95\", \"p90\"],\n description: \"Time to complete the trace (ms)\",\n },\n {\n category: \"performance\",\n name: \"first_token\",\n label: \"Time to First Token\",\n allowedAggregations: [\"avg\", \"sum\", \"min\", \"max\", \"median\", \"p99\", \"p95\", \"p90\"],\n description: \"Time to first token (ms)\",\n },\n {\n category: \"performance\",\n name: \"total_cost\",\n label: \"Total Cost\",\n allowedAggregations: [\"avg\", \"sum\", \"min\", \"max\", \"median\", \"p99\", \"p95\", \"p90\"],\n description: \"Cost per trace in USD\",\n },\n {\n category: \"performance\",\n name: \"prompt_tokens\",\n label: \"Prompt Tokens\",\n allowedAggregations: [\"avg\", \"sum\", \"min\", \"max\", \"median\", \"p99\", \"p95\", \"p90\"],\n description: \"Input token count\",\n },\n {\n category: \"performance\",\n name: \"completion_tokens\",\n label: \"Completion Tokens\",\n allowedAggregations: [\"avg\", \"sum\", \"min\", \"max\", \"median\", \"p99\", \"p95\", \"p90\"],\n description: \"Output token count\",\n },\n {\n category: \"performance\",\n name: \"total_tokens\",\n label: \"Total Tokens\",\n allowedAggregations: [\"avg\", \"sum\", \"min\", \"max\", \"median\", \"p99\", \"p95\", \"p90\"],\n description: \"Total token count (input + output)\",\n },\n {\n category: \"performance\",\n name: \"tokens_per_second\",\n label: \"Tokens per Second\",\n allowedAggregations: [\"avg\", \"sum\", \"min\", \"max\", \"median\", \"p99\", \"p95\", \"p90\"],\n description: \"Token generation speed\",\n },\n // events\n {\n category: \"events\",\n name: \"event_type\",\n label: \"Event Type\",\n allowedAggregations: [\"cardinality\"],\n description: \"Count of events, optionally filtered by event type\",\n },\n {\n category: \"events\",\n name: \"event_score\",\n label: \"Event Score\",\n allowedAggregations: [\n \"terms\",\n \"avg\",\n \"sum\",\n \"min\",\n \"max\",\n \"median\",\n \"p99\",\n \"p95\",\n \"p90\",\n ],\n description: \"Numeric score from events (requires event_type key and metrics key)\",\n },\n {\n category: \"events\",\n name: \"event_details\",\n label: \"Event Details\",\n allowedAggregations: [\"cardinality\"],\n description:\n \"Event detail key/value distribution (requires event_type key and details key)\",\n },\n // evaluations\n {\n category: \"evaluations\",\n name: \"evaluation_score\",\n label: \"Evaluation Score\",\n allowedAggregations: [\"avg\", \"sum\", \"min\", \"max\", \"median\", \"p99\", \"p95\", \"p90\"],\n description: \"Numeric evaluation score (requires evaluator_id key)\",\n },\n {\n category: \"evaluations\",\n name: \"evaluation_pass_rate\",\n label: \"Evaluation Pass Rate\",\n allowedAggregations: [\"avg\", \"sum\", \"min\", \"max\", \"median\", \"p99\", \"p95\", \"p90\"],\n description:\n \"Percentage of traces passing evaluation (requires evaluator_id key)\",\n },\n {\n category: \"evaluations\",\n name: \"evaluation_runs\",\n label: \"Evaluation Runs\",\n allowedAggregations: [\"cardinality\"],\n description: \"Count of evaluation executions\",\n },\n // threads\n {\n category: \"threads\",\n name: \"average_duration_per_thread\",\n label: \"Thread Duration\",\n allowedAggregations: [\"avg\"],\n description: \"Average duration of conversation threads (ms)\",\n },\n];\n","export interface GroupByInfo {\n name: string;\n label: string;\n description: string;\n}\n\nexport const analyticsGroups: GroupByInfo[] = [\n {\n name: \"topics.topics\",\n label: \"Topic\",\n description: \"Group by topic classification\",\n },\n {\n name: \"metadata.user_id\",\n label: \"User\",\n description: \"Group by user ID\",\n },\n {\n name: \"metadata.thread_id\",\n label: \"Thread\",\n description: \"Group by conversation thread\",\n },\n {\n name: \"metadata.customer_id\",\n label: \"Customer ID\",\n description: \"Group by customer/organization\",\n },\n {\n name: \"metadata.labels\",\n label: \"Label\",\n description: \"Group by custom labels\",\n },\n {\n name: \"metadata.model\",\n label: \"Model\",\n description: \"Group by LLM model name\",\n },\n {\n name: \"metadata.span_type\",\n label: \"Span Type\",\n description: \"Group by span type (llm, tool, agent, etc.)\",\n },\n {\n name: \"sentiment.input_sentiment\",\n label: \"Input Sentiment\",\n description: \"Group by detected input sentiment (positive, negative, neutral)\",\n },\n {\n name: \"sentiment.thumbs_up_down\",\n label: \"Thumbs Up/Down\",\n description: \"Group by user feedback (positive, negative, neutral)\",\n },\n {\n name: \"events.event_type\",\n label: \"Event Type\",\n description: \"Group by event type\",\n },\n {\n name: \"evaluations.evaluation_passed\",\n label: \"Evaluation Passed\",\n description: \"Group by evaluation pass/fail status\",\n },\n {\n name: \"evaluations.evaluation_label\",\n label: \"Evaluation Label\",\n description: \"Group by evaluation label result\",\n },\n {\n name: \"evaluations.evaluation_processing_state\",\n label: \"Evaluation Processing State\",\n description: \"Group by evaluation processing state\",\n },\n {\n name: \"error.has_error\",\n label: \"Contains Error\",\n description: \"Group by whether the trace contains an error\",\n },\n];\n","import { filterFields } from \"../schemas/filter-fields.js\";\nimport { analyticsMetrics } from \"../schemas/analytics-metrics.js\";\nimport { analyticsGroups } from \"../schemas/analytics-groups.js\";\n\nexport type Category =\n | \"filters\"\n | \"metrics\"\n | \"aggregations\"\n | \"groups\"\n | \"all\";\n\n/**\n * Formats the LangWatch analytics schema into human-readable markdown.\n *\n * Returns documentation for the requested category of schema elements\n * (filter fields, metrics, aggregation types, or group-by options).\n */\nexport function formatSchema(category: Category): string {\n const sections: string[] = [];\n\n if (category === \"filters\" || category === \"all\") {\n sections.push(formatFilters());\n }\n if (category === \"metrics\" || category === \"all\") {\n sections.push(formatMetrics());\n }\n if (category === \"aggregations\" || category === \"all\") {\n sections.push(formatAggregations());\n }\n if (category === \"groups\" || category === \"all\") {\n sections.push(formatGroups());\n }\n\n return sections.join(\"\\n\\n\");\n}\n\nfunction formatFilters(): string {\n const lines = [\"## Available Filter Fields\", \"\"];\n lines.push(\n \"Use these in the `filters` parameter of `search_traces` and `get_analytics`.\"\n );\n lines.push('Format: `{ \"field_name\": [\"value1\", \"value2\"] }`');\n lines.push(\"\");\n for (const f of filterFields) {\n lines.push(\n `- **${f.field}**: ${f.description}${f.example ? ` (e.g., \\`${f.example}\\`)` : \"\"}`\n );\n }\n return lines.join(\"\\n\");\n}\n\nfunction formatMetrics(): string {\n const lines = [\"## Available Metrics\", \"\"];\n lines.push(\n \"Use these in `get_analytics` as `metric` parameter in `category.name` format.\"\n );\n lines.push(\"\");\n\n const byCategory = new Map<string, typeof analyticsMetrics>();\n for (const m of analyticsMetrics) {\n const list = byCategory.get(m.category) || [];\n list.push(m);\n byCategory.set(m.category, list);\n }\n\n for (const [cat, metrics] of byCategory) {\n lines.push(`### ${cat}`);\n for (const m of metrics) {\n lines.push(`- **${cat}.${m.name}** (${m.label}): ${m.description}`);\n lines.push(` Aggregations: ${m.allowedAggregations.join(\", \")}`);\n }\n lines.push(\"\");\n }\n return lines.join(\"\\n\");\n}\n\nfunction formatAggregations(): string {\n return [\n \"## Available Aggregation Types\",\n \"\",\n \"- **cardinality**: Count unique values\",\n \"- **terms**: Distribution/breakdown of values\",\n \"- **avg**: Average\",\n \"- **sum**: Sum total\",\n \"- **min**: Minimum\",\n \"- **max**: Maximum\",\n \"- **median**: 50th percentile\",\n \"- **p90**: 90th percentile\",\n \"- **p95**: 95th percentile\",\n \"- **p99**: 99th percentile\",\n \"\",\n \"Note: Not all aggregations are available for all metrics. Check the metric's allowed aggregations.\",\n ].join(\"\\n\");\n}\n\nfunction formatGroups(): string {\n const lines = [\"## Available Group-By Options\", \"\"];\n lines.push(\n \"Use these in the `groupBy` parameter of `get_analytics`.\"\n );\n lines.push(\"\");\n for (const g of analyticsGroups) {\n lines.push(`- **${g.name}** (${g.label}): ${g.description}`);\n }\n return lines.join(\"\\n\");\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import {
|
|
2
|
+
parseRelativeDate
|
|
3
|
+
} from "./chunk-ZXKLPC2E.js";
|
|
4
|
+
import {
|
|
5
|
+
getAnalyticsTimeseries
|
|
6
|
+
} from "./chunk-JVWDWL3J.js";
|
|
7
|
+
import "./chunk-AAQNA53E.js";
|
|
8
|
+
|
|
9
|
+
// src/tools/get-analytics.ts
|
|
10
|
+
async function handleGetAnalytics(params) {
|
|
11
|
+
const now = Date.now();
|
|
12
|
+
const startDate = params.startDate ? parseRelativeDate(params.startDate) : now - 7 * 864e5;
|
|
13
|
+
const endDate = params.endDate ? parseRelativeDate(params.endDate) : now;
|
|
14
|
+
const [category, name] = params.metric.includes(".") ? params.metric.split(".", 2) : ["metadata", params.metric];
|
|
15
|
+
const metricKey = `${category}.${name}`;
|
|
16
|
+
const aggregation = params.aggregation ?? "avg";
|
|
17
|
+
const result = await getAnalyticsTimeseries({
|
|
18
|
+
series: [{ metric: metricKey, aggregation }],
|
|
19
|
+
startDate,
|
|
20
|
+
endDate,
|
|
21
|
+
timeZone: params.timeZone ?? "UTC",
|
|
22
|
+
groupBy: params.groupBy,
|
|
23
|
+
filters: params.filters
|
|
24
|
+
});
|
|
25
|
+
const lines = [];
|
|
26
|
+
lines.push(`# Analytics: ${metricKey} (${aggregation})
|
|
27
|
+
`);
|
|
28
|
+
lines.push(
|
|
29
|
+
`Period: ${new Date(startDate).toISOString().split("T")[0]} to ${new Date(endDate).toISOString().split("T")[0]}`
|
|
30
|
+
);
|
|
31
|
+
if (params.groupBy) lines.push(`Grouped by: ${params.groupBy}`);
|
|
32
|
+
lines.push("");
|
|
33
|
+
const currentPeriod = result.currentPeriod ?? [];
|
|
34
|
+
if (currentPeriod.length === 0) {
|
|
35
|
+
lines.push("No data available for this period.");
|
|
36
|
+
} else {
|
|
37
|
+
lines.push("| Date | Value |");
|
|
38
|
+
lines.push("|------|-------|");
|
|
39
|
+
for (const bucket of currentPeriod) {
|
|
40
|
+
const date = bucket.date;
|
|
41
|
+
const value = Object.entries(bucket).find(
|
|
42
|
+
([k]) => k !== "date" && typeof bucket[k] === "number"
|
|
43
|
+
)?.[1] ?? "N/A";
|
|
44
|
+
lines.push(`| ${date} | ${value} |`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
lines.push(
|
|
48
|
+
"\n> Tip: Use `discover_schema` to see all available metrics and aggregation types."
|
|
49
|
+
);
|
|
50
|
+
return lines.join("\n");
|
|
51
|
+
}
|
|
52
|
+
export {
|
|
53
|
+
handleGetAnalytics
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=get-analytics-BAVXTAPB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/get-analytics.ts"],"sourcesContent":["import { getAnalyticsTimeseries as apiGetAnalytics } from \"../langwatch-api.js\";\nimport { parseRelativeDate } from \"../utils/date-parsing.js\";\n\n/**\n * Handles the get_analytics MCP tool invocation.\n *\n * Queries analytics timeseries from LangWatch and formats the results\n * as an AI-readable markdown table.\n */\nexport async function handleGetAnalytics(params: {\n metric: string;\n aggregation?: string;\n startDate?: string;\n endDate?: string;\n timeZone?: string;\n groupBy?: string;\n filters?: Record<string, string[]>;\n}): Promise<string> {\n const now = Date.now();\n const startDate = params.startDate\n ? parseRelativeDate(params.startDate)\n : now - 7 * 86400000;\n const endDate = params.endDate ? parseRelativeDate(params.endDate) : now;\n\n // Parse metric format \"category.name\"\n const [category, name] = params.metric.includes(\".\")\n ? params.metric.split(\".\", 2)\n : [\"metadata\", params.metric];\n const metricKey = `${category}.${name}`;\n const aggregation = params.aggregation ?? \"avg\";\n\n const result = await apiGetAnalytics({\n series: [{ metric: metricKey, aggregation }],\n startDate,\n endDate,\n timeZone: params.timeZone ?? \"UTC\",\n groupBy: params.groupBy,\n filters: params.filters,\n });\n\n const lines: string[] = [];\n lines.push(`# Analytics: ${metricKey} (${aggregation})\\n`);\n lines.push(\n `Period: ${new Date(startDate).toISOString().split(\"T\")[0]} to ${new Date(endDate).toISOString().split(\"T\")[0]}`\n );\n if (params.groupBy) lines.push(`Grouped by: ${params.groupBy}`);\n lines.push(\"\");\n\n const currentPeriod = result.currentPeriod ?? [];\n if (currentPeriod.length === 0) {\n lines.push(\"No data available for this period.\");\n } else {\n lines.push(\"| Date | Value |\");\n lines.push(\"|------|-------|\");\n for (const bucket of currentPeriod) {\n const date = bucket.date;\n // Find the metric value - it's typically keyed by index\n const value =\n Object.entries(bucket).find(\n ([k]) => k !== \"date\" && typeof bucket[k] === \"number\"\n )?.[1] ?? \"N/A\";\n lines.push(`| ${date} | ${value} |`);\n }\n }\n\n lines.push(\n \"\\n> Tip: Use `discover_schema` to see all available metrics and aggregation types.\"\n );\n\n return lines.join(\"\\n\");\n}\n"],"mappings":";;;;;;;;;AASA,eAAsB,mBAAmB,QAQrB;AAClB,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,YAAY,OAAO,YACrB,kBAAkB,OAAO,SAAS,IAClC,MAAM,IAAI;AACd,QAAM,UAAU,OAAO,UAAU,kBAAkB,OAAO,OAAO,IAAI;AAGrE,QAAM,CAAC,UAAU,IAAI,IAAI,OAAO,OAAO,SAAS,GAAG,IAC/C,OAAO,OAAO,MAAM,KAAK,CAAC,IAC1B,CAAC,YAAY,OAAO,MAAM;AAC9B,QAAM,YAAY,GAAG,QAAQ,IAAI,IAAI;AACrC,QAAM,cAAc,OAAO,eAAe;AAE1C,QAAM,SAAS,MAAM,uBAAgB;AAAA,IACnC,QAAQ,CAAC,EAAE,QAAQ,WAAW,YAAY,CAAC;AAAA,IAC3C;AAAA,IACA;AAAA,IACA,UAAU,OAAO,YAAY;AAAA,IAC7B,SAAS,OAAO;AAAA,IAChB,SAAS,OAAO;AAAA,EAClB,CAAC;AAED,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,gBAAgB,SAAS,KAAK,WAAW;AAAA,CAAK;AACzD,QAAM;AAAA,IACJ,WAAW,IAAI,KAAK,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,OAAO,IAAI,KAAK,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA,EAChH;AACA,MAAI,OAAO,QAAS,OAAM,KAAK,eAAe,OAAO,OAAO,EAAE;AAC9D,QAAM,KAAK,EAAE;AAEb,QAAM,gBAAgB,OAAO,iBAAiB,CAAC;AAC/C,MAAI,cAAc,WAAW,GAAG;AAC9B,UAAM,KAAK,oCAAoC;AAAA,EACjD,OAAO;AACL,UAAM,KAAK,kBAAkB;AAC7B,UAAM,KAAK,kBAAkB;AAC7B,eAAW,UAAU,eAAe;AAClC,YAAM,OAAO,OAAO;AAEpB,YAAM,QACJ,OAAO,QAAQ,MAAM,EAAE;AAAA,QACrB,CAAC,CAAC,CAAC,MAAM,MAAM,UAAU,OAAO,OAAO,CAAC,MAAM;AAAA,MAChD,IAAI,CAAC,KAAK;AACZ,YAAM,KAAK,KAAK,IAAI,MAAM,KAAK,IAAI;AAAA,IACrC;AAAA,EACF;AAEA,QAAM;AAAA,IACJ;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;","names":[]}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getPrompt
|
|
3
|
+
} from "./chunk-JVWDWL3J.js";
|
|
4
|
+
import "./chunk-AAQNA53E.js";
|
|
5
|
+
|
|
6
|
+
// src/tools/get-prompt.ts
|
|
7
|
+
async function handleGetPrompt(params) {
|
|
8
|
+
const prompt = await getPrompt(params.idOrHandle, params.version);
|
|
9
|
+
const lines = [];
|
|
10
|
+
lines.push(
|
|
11
|
+
`# Prompt: ${prompt.name || prompt.handle || prompt.id}
|
|
12
|
+
`
|
|
13
|
+
);
|
|
14
|
+
if (prompt.handle) lines.push(`**Handle**: ${prompt.handle}`);
|
|
15
|
+
if (prompt.id) lines.push(`**ID**: ${prompt.id}`);
|
|
16
|
+
if (prompt.description) lines.push(`**Description**: ${prompt.description}`);
|
|
17
|
+
if (prompt.latestVersionNumber != null)
|
|
18
|
+
lines.push(`**Latest Version**: v${prompt.latestVersionNumber}`);
|
|
19
|
+
const version = prompt.versions?.[0] ?? prompt;
|
|
20
|
+
if (version.model) lines.push(`**Model**: ${version.model}`);
|
|
21
|
+
if (version.modelProvider)
|
|
22
|
+
lines.push(`**Provider**: ${version.modelProvider}`);
|
|
23
|
+
const messages = version.messages || prompt.prompt || [];
|
|
24
|
+
if (Array.isArray(messages) && messages.length > 0) {
|
|
25
|
+
lines.push("\n## Messages");
|
|
26
|
+
for (const msg of messages) {
|
|
27
|
+
lines.push(`
|
|
28
|
+
### ${msg.role}`);
|
|
29
|
+
lines.push(msg.content);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (prompt.versions && prompt.versions.length > 0) {
|
|
33
|
+
lines.push("\n## Version History");
|
|
34
|
+
for (const v of prompt.versions.slice(0, 10)) {
|
|
35
|
+
const versionNum = v.version ?? "?";
|
|
36
|
+
const commitMsg = v.commitMessage || "No message";
|
|
37
|
+
lines.push(`- **v${versionNum}**: ${commitMsg}`);
|
|
38
|
+
}
|
|
39
|
+
if (prompt.versions.length > 10) {
|
|
40
|
+
lines.push(`... and ${prompt.versions.length - 10} more versions`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return lines.join("\n");
|
|
44
|
+
}
|
|
45
|
+
export {
|
|
46
|
+
handleGetPrompt
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=get-prompt-LKCPT26O.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/get-prompt.ts"],"sourcesContent":["import { getPrompt as apiGetPrompt } from \"../langwatch-api.js\";\n\n/**\n * Handles the get_prompt MCP tool invocation.\n *\n * Retrieves a specific prompt by ID or handle and formats it as\n * AI-readable markdown, including messages, model config, and version history.\n */\nexport async function handleGetPrompt(params: {\n idOrHandle: string;\n version?: number;\n}): Promise<string> {\n const prompt = await apiGetPrompt(params.idOrHandle, params.version);\n\n const lines: string[] = [];\n lines.push(\n `# Prompt: ${prompt.name || prompt.handle || prompt.id}\\n`\n );\n\n if (prompt.handle) lines.push(`**Handle**: ${prompt.handle}`);\n if (prompt.id) lines.push(`**ID**: ${prompt.id}`);\n if (prompt.description) lines.push(`**Description**: ${prompt.description}`);\n if (prompt.latestVersionNumber != null)\n lines.push(`**Latest Version**: v${prompt.latestVersionNumber}`);\n\n // Show model config\n const version = prompt.versions?.[0] ?? prompt;\n if (version.model) lines.push(`**Model**: ${version.model}`);\n if (version.modelProvider)\n lines.push(`**Provider**: ${version.modelProvider}`);\n\n // Show messages\n const messages = version.messages || prompt.prompt || [];\n if (Array.isArray(messages) && messages.length > 0) {\n lines.push(\"\\n## Messages\");\n for (const msg of messages) {\n lines.push(`\\n### ${msg.role}`);\n lines.push(msg.content);\n }\n }\n\n // Show version history\n if (prompt.versions && prompt.versions.length > 0) {\n lines.push(\"\\n## Version History\");\n for (const v of prompt.versions.slice(0, 10)) {\n const versionNum = v.version ?? \"?\";\n const commitMsg = v.commitMessage || \"No message\";\n lines.push(`- **v${versionNum}**: ${commitMsg}`);\n }\n if (prompt.versions.length > 10) {\n lines.push(`... and ${prompt.versions.length - 10} more versions`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n"],"mappings":";;;;;;AAQA,eAAsB,gBAAgB,QAGlB;AAClB,QAAM,SAAS,MAAM,UAAa,OAAO,YAAY,OAAO,OAAO;AAEnE,QAAM,QAAkB,CAAC;AACzB,QAAM;AAAA,IACJ,aAAa,OAAO,QAAQ,OAAO,UAAU,OAAO,EAAE;AAAA;AAAA,EACxD;AAEA,MAAI,OAAO,OAAQ,OAAM,KAAK,eAAe,OAAO,MAAM,EAAE;AAC5D,MAAI,OAAO,GAAI,OAAM,KAAK,WAAW,OAAO,EAAE,EAAE;AAChD,MAAI,OAAO,YAAa,OAAM,KAAK,oBAAoB,OAAO,WAAW,EAAE;AAC3E,MAAI,OAAO,uBAAuB;AAChC,UAAM,KAAK,wBAAwB,OAAO,mBAAmB,EAAE;AAGjE,QAAM,UAAU,OAAO,WAAW,CAAC,KAAK;AACxC,MAAI,QAAQ,MAAO,OAAM,KAAK,cAAc,QAAQ,KAAK,EAAE;AAC3D,MAAI,QAAQ;AACV,UAAM,KAAK,iBAAiB,QAAQ,aAAa,EAAE;AAGrD,QAAM,WAAW,QAAQ,YAAY,OAAO,UAAU,CAAC;AACvD,MAAI,MAAM,QAAQ,QAAQ,KAAK,SAAS,SAAS,GAAG;AAClD,UAAM,KAAK,eAAe;AAC1B,eAAW,OAAO,UAAU;AAC1B,YAAM,KAAK;AAAA,MAAS,IAAI,IAAI,EAAE;AAC9B,YAAM,KAAK,IAAI,OAAO;AAAA,IACxB;AAAA,EACF;AAGA,MAAI,OAAO,YAAY,OAAO,SAAS,SAAS,GAAG;AACjD,UAAM,KAAK,sBAAsB;AACjC,eAAW,KAAK,OAAO,SAAS,MAAM,GAAG,EAAE,GAAG;AAC5C,YAAM,aAAa,EAAE,WAAW;AAChC,YAAM,YAAY,EAAE,iBAAiB;AACrC,YAAM,KAAK,QAAQ,UAAU,OAAO,SAAS,EAAE;AAAA,IACjD;AACA,QAAI,OAAO,SAAS,SAAS,IAAI;AAC/B,YAAM,KAAK,WAAW,OAAO,SAAS,SAAS,EAAE,gBAAgB;AAAA,IACnE;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;","names":[]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getScenario
|
|
3
|
+
} from "./chunk-K2YFPOSD.js";
|
|
4
|
+
import "./chunk-JVWDWL3J.js";
|
|
5
|
+
import "./chunk-AAQNA53E.js";
|
|
6
|
+
|
|
7
|
+
// src/tools/get-scenario.ts
|
|
8
|
+
async function handleGetScenario(params) {
|
|
9
|
+
const scenario = await getScenario(params.scenarioId);
|
|
10
|
+
if (params.format === "json") {
|
|
11
|
+
return JSON.stringify(scenario, null, 2);
|
|
12
|
+
}
|
|
13
|
+
const lines = [];
|
|
14
|
+
lines.push(`# Scenario: ${scenario.name}
|
|
15
|
+
`);
|
|
16
|
+
lines.push(`**ID**: ${scenario.id}`);
|
|
17
|
+
lines.push(`**Situation**: ${scenario.situation}`);
|
|
18
|
+
if (Array.isArray(scenario.criteria) && scenario.criteria.length > 0) {
|
|
19
|
+
lines.push("\n## Criteria");
|
|
20
|
+
for (const criterion of scenario.criteria) {
|
|
21
|
+
lines.push(`- ${criterion}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
if (Array.isArray(scenario.labels) && scenario.labels.length > 0) {
|
|
25
|
+
lines.push(`
|
|
26
|
+
**Labels**: ${scenario.labels.join(", ")}`);
|
|
27
|
+
}
|
|
28
|
+
return lines.join("\n");
|
|
29
|
+
}
|
|
30
|
+
export {
|
|
31
|
+
handleGetScenario
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=get-scenario-3SCDW4Z6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/get-scenario.ts"],"sourcesContent":["import { getScenario as apiGetScenario } from \"../langwatch-api-scenarios.js\";\n\n/**\n * Handles the get_scenario MCP tool invocation.\n *\n * Retrieves a specific scenario by ID and formats it as\n * AI-readable markdown or raw JSON.\n */\nexport async function handleGetScenario(params: {\n scenarioId: string;\n format?: \"digest\" | \"json\";\n}): Promise<string> {\n const scenario = await apiGetScenario(params.scenarioId);\n\n if (params.format === \"json\") {\n return JSON.stringify(scenario, null, 2);\n }\n\n const lines: string[] = [];\n lines.push(`# Scenario: ${scenario.name}\\n`);\n lines.push(`**ID**: ${scenario.id}`);\n lines.push(`**Situation**: ${scenario.situation}`);\n\n if (Array.isArray(scenario.criteria) && scenario.criteria.length > 0) {\n lines.push(\"\\n## Criteria\");\n for (const criterion of scenario.criteria) {\n lines.push(`- ${criterion}`);\n }\n }\n\n if (Array.isArray(scenario.labels) && scenario.labels.length > 0) {\n lines.push(`\\n**Labels**: ${scenario.labels.join(\", \")}`);\n }\n\n return lines.join(\"\\n\");\n}\n"],"mappings":";;;;;;;AAQA,eAAsB,kBAAkB,QAGpB;AAClB,QAAM,WAAW,MAAM,YAAe,OAAO,UAAU;AAEvD,MAAI,OAAO,WAAW,QAAQ;AAC5B,WAAO,KAAK,UAAU,UAAU,MAAM,CAAC;AAAA,EACzC;AAEA,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,eAAe,SAAS,IAAI;AAAA,CAAI;AAC3C,QAAM,KAAK,WAAW,SAAS,EAAE,EAAE;AACnC,QAAM,KAAK,kBAAkB,SAAS,SAAS,EAAE;AAEjD,MAAI,MAAM,QAAQ,SAAS,QAAQ,KAAK,SAAS,SAAS,SAAS,GAAG;AACpE,UAAM,KAAK,eAAe;AAC1B,eAAW,aAAa,SAAS,UAAU;AACzC,YAAM,KAAK,KAAK,SAAS,EAAE;AAAA,IAC7B;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,SAAS,MAAM,KAAK,SAAS,OAAO,SAAS,GAAG;AAChE,UAAM,KAAK;AAAA,cAAiB,SAAS,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,EAC1D;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;","names":[]}
|