@mastra/server 1.15.0 → 1.16.0-alpha.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 (71) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/_types/@internal_core/dist/index.d.ts +7 -0
  3. package/dist/{chunk-5N4O5XJZ.js → chunk-7LQDR5AI.js} +84 -8
  4. package/dist/chunk-7LQDR5AI.js.map +1 -0
  5. package/dist/{chunk-M2PIFW7O.cjs → chunk-AOAIJJY6.cjs} +331 -58
  6. package/dist/chunk-AOAIJJY6.cjs.map +1 -0
  7. package/dist/{chunk-47RDD2HN.js → chunk-APJA4LIB.js} +4 -3
  8. package/dist/chunk-APJA4LIB.js.map +1 -0
  9. package/dist/{chunk-7D3YBNO6.cjs → chunk-FOHX5HVN.cjs} +4 -3
  10. package/dist/chunk-FOHX5HVN.cjs.map +1 -0
  11. package/dist/{chunk-2SQXNXDG.cjs → chunk-FXX6WI5F.cjs} +6 -3
  12. package/dist/chunk-FXX6WI5F.cjs.map +1 -0
  13. package/dist/{chunk-NDI2C7UD.js → chunk-I3QRIKI5.js} +279 -9
  14. package/dist/chunk-I3QRIKI5.js.map +1 -0
  15. package/dist/{chunk-3KRZUGE2.cjs → chunk-LG2MUCSW.cjs} +22 -19
  16. package/dist/chunk-LG2MUCSW.cjs.map +1 -0
  17. package/dist/{chunk-XJ4C64FH.cjs → chunk-MPXNKSVP.cjs} +21 -21
  18. package/dist/{chunk-XJ4C64FH.cjs.map → chunk-MPXNKSVP.cjs.map} +1 -1
  19. package/dist/{chunk-KTKTSTDR.cjs → chunk-N5RFB7A4.cjs} +89 -7
  20. package/dist/chunk-N5RFB7A4.cjs.map +1 -0
  21. package/dist/{chunk-BN5YN4UU.js → chunk-R344LGXP.js} +9 -6
  22. package/dist/chunk-R344LGXP.js.map +1 -0
  23. package/dist/{chunk-H37CMPNZ.js → chunk-UYAZFEAW.js} +6 -3
  24. package/dist/chunk-UYAZFEAW.js.map +1 -0
  25. package/dist/{chunk-EYPXYWPY.js → chunk-Y452XTPZ.js} +3 -3
  26. package/dist/{chunk-EYPXYWPY.js.map → chunk-Y452XTPZ.js.map} +1 -1
  27. package/dist/docs/SKILL.md +1 -1
  28. package/dist/docs/assets/SOURCE_MAP.json +1 -1
  29. package/dist/server/handlers/datasets.cjs +33 -21
  30. package/dist/server/handlers/datasets.d.ts +808 -472
  31. package/dist/server/handlers/datasets.d.ts.map +1 -1
  32. package/dist/server/handlers/datasets.js +1 -1
  33. package/dist/server/handlers/observability-new-endpoints.cjs +19 -19
  34. package/dist/server/handlers/observability-new-endpoints.d.ts +8 -0
  35. package/dist/server/handlers/observability-new-endpoints.d.ts.map +1 -1
  36. package/dist/server/handlers/observability-new-endpoints.js +1 -1
  37. package/dist/server/handlers/observability.cjs +24 -24
  38. package/dist/server/handlers/observability.js +2 -2
  39. package/dist/server/handlers/scores.cjs +7 -7
  40. package/dist/server/handlers/scores.d.ts +10 -0
  41. package/dist/server/handlers/scores.d.ts.map +1 -1
  42. package/dist/server/handlers/scores.js +1 -1
  43. package/dist/server/handlers.cjs +4 -4
  44. package/dist/server/handlers.js +2 -2
  45. package/dist/server/schemas/datasets.d.ts +138 -0
  46. package/dist/server/schemas/datasets.d.ts.map +1 -1
  47. package/dist/server/schemas/index.cjs +69 -45
  48. package/dist/server/schemas/index.js +2 -2
  49. package/dist/server/schemas/scores.d.ts +8 -0
  50. package/dist/server/schemas/scores.d.ts.map +1 -1
  51. package/dist/server/server-adapter/index.cjs +56 -51
  52. package/dist/server/server-adapter/index.cjs.map +1 -1
  53. package/dist/server/server-adapter/index.js +10 -5
  54. package/dist/server/server-adapter/index.js.map +1 -1
  55. package/dist/server/server-adapter/routes/datasets.d.ts +333 -1
  56. package/dist/server/server-adapter/routes/datasets.d.ts.map +1 -1
  57. package/dist/server/server-adapter/routes/observability.d.ts +4 -0
  58. package/dist/server/server-adapter/routes/observability.d.ts.map +1 -1
  59. package/dist/server/server-adapter/routes/scorers.d.ts +10 -0
  60. package/dist/server/server-adapter/routes/scorers.d.ts.map +1 -1
  61. package/package.json +5 -5
  62. package/dist/chunk-2SQXNXDG.cjs.map +0 -1
  63. package/dist/chunk-3KRZUGE2.cjs.map +0 -1
  64. package/dist/chunk-47RDD2HN.js.map +0 -1
  65. package/dist/chunk-5N4O5XJZ.js.map +0 -1
  66. package/dist/chunk-7D3YBNO6.cjs.map +0 -1
  67. package/dist/chunk-BN5YN4UU.js.map +0 -1
  68. package/dist/chunk-H37CMPNZ.js.map +0 -1
  69. package/dist/chunk-KTKTSTDR.cjs.map +0 -1
  70. package/dist/chunk-M2PIFW7O.cjs.map +0 -1
  71. package/dist/chunk-NDI2C7UD.js.map +0 -1
@@ -1,12 +1,16 @@
1
1
  'use strict';
2
2
 
3
- var chunkKTKTSTDR_cjs = require('./chunk-KTKTSTDR.cjs');
3
+ var chunkN5RFB7A4_cjs = require('./chunk-N5RFB7A4.cjs');
4
4
  var chunkZYXDUS6Q_cjs = require('./chunk-ZYXDUS6Q.cjs');
5
5
  var chunkY2BKW5ND_cjs = require('./chunk-Y2BKW5ND.cjs');
6
6
  var chunkYJLDMFSE_cjs = require('./chunk-YJLDMFSE.cjs');
7
7
  var chunk64ITUOXI_cjs = require('./chunk-64ITUOXI.cjs');
8
+ var agent = require('@mastra/core/agent');
8
9
  var error = require('@mastra/core/error');
9
10
  var features = require('@mastra/core/features');
11
+ var llm = require('@mastra/core/llm');
12
+ var requestContext = require('@mastra/core/request-context');
13
+ var zod = require('zod');
10
14
 
11
15
  function assertDatasetsAvailable() {
12
16
  if (!features.coreFeatures.has("datasets")) {
@@ -34,8 +38,8 @@ var LIST_DATASETS_ROUTE = chunkYJLDMFSE_cjs.createRoute({
34
38
  method: "GET",
35
39
  path: "/datasets",
36
40
  responseType: "json",
37
- queryParamSchema: chunkKTKTSTDR_cjs.paginationQuerySchema,
38
- responseSchema: chunkKTKTSTDR_cjs.listDatasetsResponseSchema,
41
+ queryParamSchema: chunkN5RFB7A4_cjs.paginationQuerySchema,
42
+ responseSchema: chunkN5RFB7A4_cjs.listDatasetsResponseSchema,
39
43
  summary: "List all datasets",
40
44
  description: "Returns a paginated list of all datasets",
41
45
  tags: ["Datasets"],
@@ -61,8 +65,8 @@ var CREATE_DATASET_ROUTE = chunkYJLDMFSE_cjs.createRoute({
61
65
  method: "POST",
62
66
  path: "/datasets",
63
67
  responseType: "json",
64
- bodySchema: chunkKTKTSTDR_cjs.createDatasetBodySchema,
65
- responseSchema: chunkKTKTSTDR_cjs.datasetResponseSchema,
68
+ bodySchema: chunkN5RFB7A4_cjs.createDatasetBodySchema,
69
+ responseSchema: chunkN5RFB7A4_cjs.datasetResponseSchema,
66
70
  summary: "Create a new dataset",
67
71
  description: "Creates a new dataset with the specified name and optional metadata",
68
72
  tags: ["Datasets"],
@@ -70,14 +74,25 @@ var CREATE_DATASET_ROUTE = chunkYJLDMFSE_cjs.createRoute({
70
74
  handler: async ({ mastra, ...params }) => {
71
75
  assertDatasetsAvailable();
72
76
  try {
73
- const { name, description, metadata, inputSchema, groundTruthSchema, requestContextSchema } = params;
77
+ const {
78
+ name,
79
+ description,
80
+ metadata,
81
+ inputSchema,
82
+ groundTruthSchema,
83
+ requestContextSchema,
84
+ targetType,
85
+ targetIds
86
+ } = params;
74
87
  const ds = await mastra.datasets.create({
75
88
  name,
76
89
  description,
77
90
  metadata,
78
91
  inputSchema,
79
92
  groundTruthSchema,
80
- requestContextSchema
93
+ requestContextSchema,
94
+ targetType,
95
+ targetIds
81
96
  });
82
97
  const details = await ds.getDetails();
83
98
  return details;
@@ -93,8 +108,8 @@ var GET_DATASET_ROUTE = chunkYJLDMFSE_cjs.createRoute({
93
108
  method: "GET",
94
109
  path: "/datasets/:datasetId",
95
110
  responseType: "json",
96
- pathParamSchema: chunkKTKTSTDR_cjs.datasetIdPathParams,
97
- responseSchema: chunkKTKTSTDR_cjs.datasetResponseSchema.nullable(),
111
+ pathParamSchema: chunkN5RFB7A4_cjs.datasetIdPathParams,
112
+ responseSchema: chunkN5RFB7A4_cjs.datasetResponseSchema.nullable(),
98
113
  summary: "Get dataset by ID",
99
114
  description: "Returns details for a specific dataset",
100
115
  tags: ["Datasets"],
@@ -116,9 +131,9 @@ var UPDATE_DATASET_ROUTE = chunkYJLDMFSE_cjs.createRoute({
116
131
  method: "PATCH",
117
132
  path: "/datasets/:datasetId",
118
133
  responseType: "json",
119
- pathParamSchema: chunkKTKTSTDR_cjs.datasetIdPathParams,
120
- bodySchema: chunkKTKTSTDR_cjs.updateDatasetBodySchema,
121
- responseSchema: chunkKTKTSTDR_cjs.datasetResponseSchema,
134
+ pathParamSchema: chunkN5RFB7A4_cjs.datasetIdPathParams,
135
+ bodySchema: chunkN5RFB7A4_cjs.updateDatasetBodySchema,
136
+ responseSchema: chunkN5RFB7A4_cjs.datasetResponseSchema,
122
137
  summary: "Update dataset",
123
138
  description: "Updates a dataset with the specified fields",
124
139
  tags: ["Datasets"],
@@ -126,7 +141,17 @@ var UPDATE_DATASET_ROUTE = chunkYJLDMFSE_cjs.createRoute({
126
141
  handler: async ({ mastra, datasetId, ...params }) => {
127
142
  assertDatasetsAvailable();
128
143
  try {
129
- const { name, description, metadata, inputSchema, groundTruthSchema, requestContextSchema } = params;
144
+ const {
145
+ name,
146
+ description,
147
+ metadata,
148
+ inputSchema,
149
+ groundTruthSchema,
150
+ requestContextSchema,
151
+ tags,
152
+ targetType,
153
+ targetIds
154
+ } = params;
130
155
  const ds = await mastra.datasets.get({ id: datasetId });
131
156
  const result = await ds.update({
132
157
  name,
@@ -134,7 +159,10 @@ var UPDATE_DATASET_ROUTE = chunkYJLDMFSE_cjs.createRoute({
134
159
  metadata,
135
160
  inputSchema,
136
161
  groundTruthSchema,
137
- requestContextSchema
162
+ requestContextSchema,
163
+ tags,
164
+ targetType,
165
+ targetIds
138
166
  });
139
167
  return result;
140
168
  } catch (error$1) {
@@ -161,7 +189,7 @@ var DELETE_DATASET_ROUTE = chunkYJLDMFSE_cjs.createRoute({
161
189
  method: "DELETE",
162
190
  path: "/datasets/:datasetId",
163
191
  responseType: "json",
164
- pathParamSchema: chunkKTKTSTDR_cjs.datasetIdPathParams,
192
+ pathParamSchema: chunkN5RFB7A4_cjs.datasetIdPathParams,
165
193
  responseSchema: chunkZYXDUS6Q_cjs.successResponseSchema,
166
194
  summary: "Delete dataset",
167
195
  description: "Deletes a dataset and all its items",
@@ -185,9 +213,9 @@ var LIST_ITEMS_ROUTE = chunkYJLDMFSE_cjs.createRoute({
185
213
  method: "GET",
186
214
  path: "/datasets/:datasetId/items",
187
215
  responseType: "json",
188
- pathParamSchema: chunkKTKTSTDR_cjs.datasetIdPathParams,
189
- queryParamSchema: chunkKTKTSTDR_cjs.listItemsQuerySchema,
190
- responseSchema: chunkKTKTSTDR_cjs.listItemsResponseSchema,
216
+ pathParamSchema: chunkN5RFB7A4_cjs.datasetIdPathParams,
217
+ queryParamSchema: chunkN5RFB7A4_cjs.listItemsQuerySchema,
218
+ responseSchema: chunkN5RFB7A4_cjs.listItemsResponseSchema,
191
219
  summary: "List dataset items",
192
220
  description: "Returns a paginated list of items in the dataset",
193
221
  tags: ["Datasets"],
@@ -219,9 +247,9 @@ var ADD_ITEM_ROUTE = chunkYJLDMFSE_cjs.createRoute({
219
247
  method: "POST",
220
248
  path: "/datasets/:datasetId/items",
221
249
  responseType: "json",
222
- pathParamSchema: chunkKTKTSTDR_cjs.datasetIdPathParams,
223
- bodySchema: chunkKTKTSTDR_cjs.addItemBodySchema,
224
- responseSchema: chunkKTKTSTDR_cjs.datasetItemResponseSchema,
250
+ pathParamSchema: chunkN5RFB7A4_cjs.datasetIdPathParams,
251
+ bodySchema: chunkN5RFB7A4_cjs.addItemBodySchema,
252
+ responseSchema: chunkN5RFB7A4_cjs.datasetItemResponseSchema,
225
253
  summary: "Add item to dataset",
226
254
  description: "Adds a new item to the dataset (auto-increments dataset version)",
227
255
  tags: ["Datasets"],
@@ -250,8 +278,8 @@ var GET_ITEM_ROUTE = chunkYJLDMFSE_cjs.createRoute({
250
278
  method: "GET",
251
279
  path: "/datasets/:datasetId/items/:itemId",
252
280
  responseType: "json",
253
- pathParamSchema: chunkKTKTSTDR_cjs.datasetAndItemIdPathParams,
254
- responseSchema: chunkKTKTSTDR_cjs.datasetItemResponseSchema.nullable(),
281
+ pathParamSchema: chunkN5RFB7A4_cjs.datasetAndItemIdPathParams,
282
+ responseSchema: chunkN5RFB7A4_cjs.datasetItemResponseSchema.nullable(),
255
283
  summary: "Get dataset item by ID",
256
284
  description: "Returns details for a specific dataset item",
257
285
  tags: ["Datasets"],
@@ -277,9 +305,9 @@ var UPDATE_ITEM_ROUTE = chunkYJLDMFSE_cjs.createRoute({
277
305
  method: "PATCH",
278
306
  path: "/datasets/:datasetId/items/:itemId",
279
307
  responseType: "json",
280
- pathParamSchema: chunkKTKTSTDR_cjs.datasetAndItemIdPathParams,
281
- bodySchema: chunkKTKTSTDR_cjs.updateItemBodySchema,
282
- responseSchema: chunkKTKTSTDR_cjs.datasetItemResponseSchema,
308
+ pathParamSchema: chunkN5RFB7A4_cjs.datasetAndItemIdPathParams,
309
+ bodySchema: chunkN5RFB7A4_cjs.updateItemBodySchema,
310
+ responseSchema: chunkN5RFB7A4_cjs.datasetItemResponseSchema,
283
311
  summary: "Update dataset item",
284
312
  description: "Updates a dataset item (auto-increments dataset version)",
285
313
  tags: ["Datasets"],
@@ -312,7 +340,7 @@ var DELETE_ITEM_ROUTE = chunkYJLDMFSE_cjs.createRoute({
312
340
  method: "DELETE",
313
341
  path: "/datasets/:datasetId/items/:itemId",
314
342
  responseType: "json",
315
- pathParamSchema: chunkKTKTSTDR_cjs.datasetAndItemIdPathParams,
343
+ pathParamSchema: chunkN5RFB7A4_cjs.datasetAndItemIdPathParams,
316
344
  responseSchema: chunkZYXDUS6Q_cjs.successResponseSchema,
317
345
  summary: "Delete dataset item",
318
346
  description: "Deletes a dataset item",
@@ -340,9 +368,9 @@ var LIST_EXPERIMENTS_ROUTE = chunkYJLDMFSE_cjs.createRoute({
340
368
  method: "GET",
341
369
  path: "/datasets/:datasetId/experiments",
342
370
  responseType: "json",
343
- pathParamSchema: chunkKTKTSTDR_cjs.datasetIdPathParams,
344
- queryParamSchema: chunkKTKTSTDR_cjs.paginationQuerySchema,
345
- responseSchema: chunkKTKTSTDR_cjs.listExperimentsResponseSchema,
371
+ pathParamSchema: chunkN5RFB7A4_cjs.datasetIdPathParams,
372
+ queryParamSchema: chunkN5RFB7A4_cjs.paginationQuerySchema,
373
+ responseSchema: chunkN5RFB7A4_cjs.listExperimentsResponseSchema,
346
374
  summary: "List experiments for dataset",
347
375
  description: "Returns a paginated list of experiments for the dataset",
348
376
  tags: ["Datasets"],
@@ -366,9 +394,9 @@ var TRIGGER_EXPERIMENT_ROUTE = chunkYJLDMFSE_cjs.createRoute({
366
394
  method: "POST",
367
395
  path: "/datasets/:datasetId/experiments",
368
396
  responseType: "json",
369
- pathParamSchema: chunkKTKTSTDR_cjs.datasetIdPathParams,
370
- bodySchema: chunkKTKTSTDR_cjs.triggerExperimentBodySchema,
371
- responseSchema: chunkKTKTSTDR_cjs.experimentSummaryResponseSchema,
397
+ pathParamSchema: chunkN5RFB7A4_cjs.datasetIdPathParams,
398
+ bodySchema: chunkN5RFB7A4_cjs.triggerExperimentBodySchema,
399
+ responseSchema: chunkN5RFB7A4_cjs.experimentSummaryResponseSchema,
372
400
  summary: "Trigger a new experiment",
373
401
  description: "Triggers a new experiment on the dataset against the specified target. Returns immediately with pending status; execution happens in background.",
374
402
  tags: ["Datasets"],
@@ -376,7 +404,15 @@ var TRIGGER_EXPERIMENT_ROUTE = chunkYJLDMFSE_cjs.createRoute({
376
404
  handler: async ({ mastra, datasetId, ...params }) => {
377
405
  assertDatasetsAvailable();
378
406
  try {
379
- const { targetType, targetId, scorerIds, version, maxConcurrency, requestContext } = params;
407
+ const {
408
+ targetType,
409
+ targetId,
410
+ scorerIds,
411
+ version,
412
+ maxConcurrency,
413
+ requestContext: rawRequestContext
414
+ } = params;
415
+ const requestContext$1 = rawRequestContext instanceof requestContext.RequestContext ? rawRequestContext.all : rawRequestContext;
380
416
  const ds = await mastra.datasets.get({ id: datasetId });
381
417
  const result = await ds.startExperimentAsync({
382
418
  targetType,
@@ -384,7 +420,7 @@ var TRIGGER_EXPERIMENT_ROUTE = chunkYJLDMFSE_cjs.createRoute({
384
420
  scorers: scorerIds,
385
421
  version,
386
422
  maxConcurrency,
387
- requestContext
423
+ requestContext: requestContext$1
388
424
  });
389
425
  return {
390
426
  experimentId: result.experimentId,
@@ -408,8 +444,8 @@ var GET_EXPERIMENT_ROUTE = chunkYJLDMFSE_cjs.createRoute({
408
444
  method: "GET",
409
445
  path: "/datasets/:datasetId/experiments/:experimentId",
410
446
  responseType: "json",
411
- pathParamSchema: chunkKTKTSTDR_cjs.datasetAndExperimentIdPathParams,
412
- responseSchema: chunkKTKTSTDR_cjs.experimentResponseSchema.nullable(),
447
+ pathParamSchema: chunkN5RFB7A4_cjs.datasetAndExperimentIdPathParams,
448
+ responseSchema: chunkN5RFB7A4_cjs.experimentResponseSchema.nullable(),
413
449
  summary: "Get experiment by ID",
414
450
  description: "Returns details for a specific experiment",
415
451
  tags: ["Datasets"],
@@ -435,9 +471,9 @@ var LIST_EXPERIMENT_RESULTS_ROUTE = chunkYJLDMFSE_cjs.createRoute({
435
471
  method: "GET",
436
472
  path: "/datasets/:datasetId/experiments/:experimentId/results",
437
473
  responseType: "json",
438
- pathParamSchema: chunkKTKTSTDR_cjs.datasetAndExperimentIdPathParams,
439
- queryParamSchema: chunkKTKTSTDR_cjs.paginationQuerySchema,
440
- responseSchema: chunkKTKTSTDR_cjs.listExperimentResultsResponseSchema,
474
+ pathParamSchema: chunkN5RFB7A4_cjs.datasetAndExperimentIdPathParams,
475
+ queryParamSchema: chunkN5RFB7A4_cjs.paginationQuerySchema,
476
+ responseSchema: chunkN5RFB7A4_cjs.listExperimentResultsResponseSchema,
441
477
  summary: "List experiment results",
442
478
  description: "Returns a paginated list of results for the experiment",
443
479
  tags: ["Datasets"],
@@ -464,13 +500,50 @@ var LIST_EXPERIMENT_RESULTS_ROUTE = chunkYJLDMFSE_cjs.createRoute({
464
500
  }
465
501
  }
466
502
  });
503
+ var UPDATE_EXPERIMENT_RESULT_ROUTE = chunkYJLDMFSE_cjs.createRoute({
504
+ method: "PATCH",
505
+ path: "/datasets/:datasetId/experiments/:experimentId/results/:resultId",
506
+ responseType: "json",
507
+ pathParamSchema: chunkN5RFB7A4_cjs.experimentResultIdPathParams,
508
+ bodySchema: chunkN5RFB7A4_cjs.updateExperimentResultBodySchema,
509
+ responseSchema: chunkN5RFB7A4_cjs.experimentResultResponseSchema,
510
+ summary: "Update an experiment result",
511
+ description: "Updates the status and/or tags on an experiment result",
512
+ tags: ["Datasets"],
513
+ requiresAuth: true,
514
+ handler: async ({ mastra, resultId, experimentId, ...params }) => {
515
+ assertDatasetsAvailable();
516
+ try {
517
+ const storage = mastra.getStorage();
518
+ if (!storage) {
519
+ throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Storage not configured" });
520
+ }
521
+ const experimentsStore = await storage.getStore("experiments");
522
+ if (!experimentsStore) {
523
+ throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Experiments storage not available" });
524
+ }
525
+ const result = await experimentsStore.updateExperimentResult({
526
+ id: resultId,
527
+ experimentId,
528
+ status: params.status,
529
+ tags: params.tags
530
+ });
531
+ return result;
532
+ } catch (error$1) {
533
+ if (error$1 instanceof error.MastraError) {
534
+ throw new chunk64ITUOXI_cjs.HTTPException(getHttpStatusForMastraError(error$1.id), { message: error$1.message });
535
+ }
536
+ return chunkY2BKW5ND_cjs.handleError(error$1, "Error updating experiment result");
537
+ }
538
+ }
539
+ });
467
540
  var COMPARE_EXPERIMENTS_ROUTE = chunkYJLDMFSE_cjs.createRoute({
468
541
  method: "POST",
469
542
  path: "/datasets/:datasetId/compare",
470
543
  responseType: "json",
471
- pathParamSchema: chunkKTKTSTDR_cjs.datasetIdPathParams,
472
- bodySchema: chunkKTKTSTDR_cjs.compareExperimentsBodySchema,
473
- responseSchema: chunkKTKTSTDR_cjs.comparisonResponseSchema,
544
+ pathParamSchema: chunkN5RFB7A4_cjs.datasetIdPathParams,
545
+ bodySchema: chunkN5RFB7A4_cjs.compareExperimentsBodySchema,
546
+ responseSchema: chunkN5RFB7A4_cjs.comparisonResponseSchema,
474
547
  summary: "Compare two experiments",
475
548
  description: "Compares two experiments to detect score regressions",
476
549
  tags: ["Datasets"],
@@ -497,9 +570,9 @@ var LIST_DATASET_VERSIONS_ROUTE = chunkYJLDMFSE_cjs.createRoute({
497
570
  method: "GET",
498
571
  path: "/datasets/:datasetId/versions",
499
572
  responseType: "json",
500
- pathParamSchema: chunkKTKTSTDR_cjs.datasetIdPathParams,
501
- queryParamSchema: chunkKTKTSTDR_cjs.paginationQuerySchema,
502
- responseSchema: chunkKTKTSTDR_cjs.listDatasetVersionsResponseSchema,
573
+ pathParamSchema: chunkN5RFB7A4_cjs.datasetIdPathParams,
574
+ queryParamSchema: chunkN5RFB7A4_cjs.paginationQuerySchema,
575
+ responseSchema: chunkN5RFB7A4_cjs.listDatasetVersionsResponseSchema,
503
576
  summary: "List dataset versions",
504
577
  description: "Returns a paginated list of all versions for the dataset",
505
578
  tags: ["Datasets"],
@@ -523,8 +596,8 @@ var LIST_ITEM_VERSIONS_ROUTE = chunkYJLDMFSE_cjs.createRoute({
523
596
  method: "GET",
524
597
  path: "/datasets/:datasetId/items/:itemId/history",
525
598
  responseType: "json",
526
- pathParamSchema: chunkKTKTSTDR_cjs.datasetAndItemIdPathParams,
527
- responseSchema: chunkKTKTSTDR_cjs.listItemVersionsResponseSchema,
599
+ pathParamSchema: chunkN5RFB7A4_cjs.datasetAndItemIdPathParams,
600
+ responseSchema: chunkN5RFB7A4_cjs.listItemVersionsResponseSchema,
528
601
  summary: "Get item history",
529
602
  description: "Returns the full SCD-2 history of the item across all dataset versions",
530
603
  tags: ["Datasets"],
@@ -550,8 +623,8 @@ var GET_ITEM_VERSION_ROUTE = chunkYJLDMFSE_cjs.createRoute({
550
623
  method: "GET",
551
624
  path: "/datasets/:datasetId/items/:itemId/versions/:datasetVersion",
552
625
  responseType: "json",
553
- pathParamSchema: chunkKTKTSTDR_cjs.datasetItemVersionPathParams,
554
- responseSchema: chunkKTKTSTDR_cjs.datasetItemResponseSchema.nullable(),
626
+ pathParamSchema: chunkN5RFB7A4_cjs.datasetItemVersionPathParams,
627
+ responseSchema: chunkN5RFB7A4_cjs.datasetItemResponseSchema.nullable(),
555
628
  summary: "Get item at specific dataset version",
556
629
  description: "Returns the item as it existed at a specific dataset version",
557
630
  tags: ["Datasets"],
@@ -580,9 +653,9 @@ var BATCH_INSERT_ITEMS_ROUTE = chunkYJLDMFSE_cjs.createRoute({
580
653
  method: "POST",
581
654
  path: "/datasets/:datasetId/items/batch",
582
655
  responseType: "json",
583
- pathParamSchema: chunkKTKTSTDR_cjs.datasetIdPathParams,
584
- bodySchema: chunkKTKTSTDR_cjs.batchInsertItemsBodySchema,
585
- responseSchema: chunkKTKTSTDR_cjs.batchInsertItemsResponseSchema,
656
+ pathParamSchema: chunkN5RFB7A4_cjs.datasetIdPathParams,
657
+ bodySchema: chunkN5RFB7A4_cjs.batchInsertItemsBodySchema,
658
+ responseSchema: chunkN5RFB7A4_cjs.batchInsertItemsResponseSchema,
586
659
  summary: "Batch insert items to dataset",
587
660
  description: "Adds multiple items to the dataset in a single operation (single version entry)",
588
661
  tags: ["Datasets"],
@@ -612,9 +685,9 @@ var BATCH_DELETE_ITEMS_ROUTE = chunkYJLDMFSE_cjs.createRoute({
612
685
  method: "DELETE",
613
686
  path: "/datasets/:datasetId/items/batch",
614
687
  responseType: "json",
615
- pathParamSchema: chunkKTKTSTDR_cjs.datasetIdPathParams,
616
- bodySchema: chunkKTKTSTDR_cjs.batchDeleteItemsBodySchema,
617
- responseSchema: chunkKTKTSTDR_cjs.batchDeleteItemsResponseSchema,
688
+ pathParamSchema: chunkN5RFB7A4_cjs.datasetIdPathParams,
689
+ bodySchema: chunkN5RFB7A4_cjs.batchDeleteItemsBodySchema,
690
+ responseSchema: chunkN5RFB7A4_cjs.batchDeleteItemsResponseSchema,
618
691
  summary: "Batch delete items from dataset",
619
692
  description: "Deletes multiple items from the dataset in a single operation (single version entry)",
620
693
  tags: ["Datasets"],
@@ -634,14 +707,213 @@ var BATCH_DELETE_ITEMS_ROUTE = chunkYJLDMFSE_cjs.createRoute({
634
707
  }
635
708
  }
636
709
  });
710
+ var GENERATE_ITEMS_SYSTEM_PROMPT = `You are a test data generation expert. Your job is to generate realistic, diverse test data items for an AI agent evaluation dataset.
711
+
712
+ You will be given context about the agent being tested \u2014 its purpose, system prompt, and available tools. Use this to generate inputs that thoroughly exercise the agent's capabilities.
713
+
714
+ Generate test items that:
715
+ 1. Are realistic and diverse \u2014 cover edge cases, different complexities, and various scenarios
716
+ 2. Match the provided schemas exactly
717
+ 3. Include ground truth values when a ground truth schema is provided
718
+ 4. Vary in difficulty (easy, medium, hard cases)
719
+ 5. Include potential edge cases and tricky inputs
720
+ 6. Test different aspects of the agent's capabilities based on its tools and instructions
721
+
722
+ Return the items as a JSON array.`;
723
+ var GENERATE_ITEMS_ROUTE = chunkYJLDMFSE_cjs.createRoute({
724
+ method: "POST",
725
+ path: "/datasets/:datasetId/generate-items",
726
+ responseType: "json",
727
+ pathParamSchema: chunkN5RFB7A4_cjs.datasetIdPathParams,
728
+ bodySchema: chunkN5RFB7A4_cjs.generateItemsBodySchema,
729
+ responseSchema: chunkN5RFB7A4_cjs.generateItemsResponseSchema,
730
+ summary: "Generate dataset items using AI",
731
+ description: "Uses an LLM to generate synthetic dataset items based on the dataset schema and a user prompt. Returns generated items for review \u2014 they are NOT automatically added to the dataset.",
732
+ tags: ["Datasets"],
733
+ requiresAuth: true,
734
+ handler: async ({ mastra, datasetId, modelId, prompt, count, agentContext }) => {
735
+ assertDatasetsAvailable();
736
+ try {
737
+ const ds = await mastra.datasets.get({ id: datasetId });
738
+ const dataset = await ds.getDetails();
739
+ const model = await llm.resolveModelConfig(modelId, void 0, mastra);
740
+ const schemaContext = [
741
+ dataset.inputSchema ? `Input schema:
742
+ ${JSON.stringify(dataset.inputSchema, null, 2)}` : null,
743
+ dataset.groundTruthSchema ? `Ground truth schema:
744
+ ${JSON.stringify(dataset.groundTruthSchema, null, 2)}` : null
745
+ ].filter(Boolean).join("\n\n");
746
+ const generatorAgent = new agent.Agent({
747
+ id: "dataset-item-generator",
748
+ name: "dataset-item-generator",
749
+ instructions: GENERATE_ITEMS_SYSTEM_PROMPT,
750
+ model
751
+ });
752
+ const itemSchema = zod.z.object({
753
+ input: zod.z.string().describe("The input data as a JSON string matching the input schema, or a plain text string if no schema"),
754
+ groundTruth: zod.z.string().optional().describe("The expected output as a JSON string matching the ground truth schema")
755
+ });
756
+ const outputSchema = zod.z.object({
757
+ items: zod.z.array(itemSchema).min(1).max(count)
758
+ });
759
+ const agentContextParts = [];
760
+ if (agentContext?.description) {
761
+ agentContextParts.push(`Agent description: ${agentContext.description}`);
762
+ }
763
+ if (agentContext?.instructions) {
764
+ agentContextParts.push(`Agent system prompt:
765
+ ${agentContext.instructions}`);
766
+ }
767
+ if (agentContext?.tools?.length) {
768
+ agentContextParts.push(`Agent tools: ${agentContext.tools.join(", ")}`);
769
+ }
770
+ const agentContextSection = agentContextParts.length > 0 ? agentContextParts.join("\n\n") : null;
771
+ const userMessage = [
772
+ `Generate exactly ${count} test items for a dataset named "${dataset.name}".`,
773
+ dataset.description ? `Dataset description: ${dataset.description}` : null,
774
+ agentContextSection ? `--- AGENT CONTEXT ---
775
+ ${agentContextSection}` : null,
776
+ schemaContext || null,
777
+ `User's request: ${prompt}`,
778
+ `Return exactly ${count} items.`
779
+ ].filter(Boolean).join("\n\n");
780
+ const result = await generatorAgent.generate(userMessage, {
781
+ structuredOutput: { schema: outputSchema }
782
+ });
783
+ const generated = await result.object;
784
+ const items = generated.items.map((item) => {
785
+ let input = item.input;
786
+ try {
787
+ input = JSON.parse(item.input);
788
+ } catch {
789
+ }
790
+ let groundTruth = item.groundTruth;
791
+ if (item.groundTruth) {
792
+ try {
793
+ groundTruth = JSON.parse(item.groundTruth);
794
+ } catch {
795
+ }
796
+ }
797
+ return { input, groundTruth };
798
+ });
799
+ return { items };
800
+ } catch (error$1) {
801
+ if (error$1 instanceof error.MastraError) {
802
+ throw new chunk64ITUOXI_cjs.HTTPException(getHttpStatusForMastraError(error$1.id), { message: error$1.message });
803
+ }
804
+ return chunkY2BKW5ND_cjs.handleError(error$1, "Error generating dataset items");
805
+ }
806
+ }
807
+ });
808
+ var CLUSTER_FAILURES_SYSTEM_PROMPT = `You are an AI evaluation expert specializing in failure analysis. Given a set of failure items from an AI agent experiment, identify common failure patterns and assign descriptive tags to each item.
809
+
810
+ For each cluster you identify, provide:
811
+ - A short, descriptive tag label (2-5 words, lowercase, hyphenated, e.g., "no-tool-usage", "hallucination")
812
+ - A description explaining the common failure pattern
813
+ - The IDs of items that belong to this cluster
814
+
815
+ Also return a "proposedTags" array mapping each item ID to the tags you recommend, along with a brief "reason" explaining WHY those tags apply to that specific item. The reason should reference concrete evidence from the item's input/output/error.
816
+
817
+ Guidelines:
818
+ - Create between 1 and 8 clusters depending on the diversity of failures
819
+ - Every item must be assigned to at least one cluster unless there is no clear pattern of failure
820
+ - Focus on the root cause of failures, not surface-level symptoms
821
+ - If items have scores, use low scores as signals for the failure type
822
+ - Be specific about what went wrong
823
+ - IMPORTANT: If existing tags are provided, PREFER reusing them over creating new ones. Only create new tags when no existing tag fits.
824
+ - Items may already have tags \u2014 consider those when assigning new ones and avoid duplicating existing tags on an item.
825
+ - The "reason" field should be 1-2 sentences explaining the specific evidence for each tag assignment.`;
826
+ var CLUSTER_FAILURES_ROUTE = chunkYJLDMFSE_cjs.createRoute({
827
+ method: "POST",
828
+ path: "/datasets/cluster-failures",
829
+ responseType: "json",
830
+ bodySchema: chunkN5RFB7A4_cjs.clusterFailuresBodySchema,
831
+ responseSchema: chunkN5RFB7A4_cjs.clusterFailuresResponseSchema,
832
+ summary: "Cluster experiment failures using AI",
833
+ description: "Uses an LLM to analyze failure items from an experiment and group them into meaningful failure pattern clusters.",
834
+ tags: ["Datasets"],
835
+ requiresAuth: true,
836
+ handler: async ({ mastra, modelId, items, availableTags, prompt }) => {
837
+ assertDatasetsAvailable();
838
+ try {
839
+ const model = await llm.resolveModelConfig(modelId, void 0, mastra);
840
+ const clusterAgent = new agent.Agent({
841
+ id: "failure-cluster-analyzer",
842
+ name: "failure-cluster-analyzer",
843
+ instructions: CLUSTER_FAILURES_SYSTEM_PROMPT,
844
+ model
845
+ });
846
+ const outputSchema = zod.z.object({
847
+ clusters: zod.z.array(
848
+ zod.z.object({
849
+ id: zod.z.string(),
850
+ label: zod.z.string(),
851
+ description: zod.z.string(),
852
+ itemIds: zod.z.array(zod.z.string())
853
+ })
854
+ ),
855
+ proposedTags: zod.z.array(
856
+ zod.z.object({
857
+ itemId: zod.z.string(),
858
+ tags: zod.z.array(zod.z.string()),
859
+ reason: zod.z.string().describe("Brief explanation of why these tags were assigned")
860
+ })
861
+ )
862
+ });
863
+ const itemSummaries = items.map((item, i) => {
864
+ const parts = [`Item ${i + 1} (id: ${item.id}):`];
865
+ if (item.input !== void 0 && item.input !== null) parts.push(` Input: ${JSON.stringify(item.input)}`);
866
+ if (item.output !== void 0 && item.output !== null) parts.push(` Output: ${JSON.stringify(item.output)}`);
867
+ if (item.error !== void 0 && item.error !== null) {
868
+ parts.push(` Error: ${typeof item.error === "string" ? item.error : JSON.stringify(item.error)}`);
869
+ }
870
+ if (item.scores !== void 0 && item.scores !== null) {
871
+ parts.push(` Scores: ${JSON.stringify(item.scores)}`);
872
+ }
873
+ if (item.existingTags && item.existingTags.length > 0) {
874
+ parts.push(` Existing tags: ${item.existingTags.join(", ")}`);
875
+ }
876
+ return parts.join("\n");
877
+ });
878
+ let userMessage = `Analyze these ${items.length} failure items and group them into clusters of common failure patterns:
879
+
880
+ ${itemSummaries.join("\n\n")}`;
881
+ if (availableTags && availableTags.length > 0) {
882
+ userMessage += `
883
+
884
+ Existing tag vocabulary (prefer reusing these): ${availableTags.join(", ")}`;
885
+ }
886
+ if (prompt) {
887
+ userMessage += `
888
+
889
+ Additional instructions from the reviewer: ${prompt}`;
890
+ }
891
+ userMessage += `
892
+
893
+ Return both "clusters" (grouping items by pattern) and "proposedTags" (a list mapping each item ID to the tag labels you recommend, with a "reason" explaining why). For proposedTags, only include NEW tags to add \u2014 do not repeat tags the item already has.`;
894
+ const result = await clusterAgent.generate(userMessage, {
895
+ structuredOutput: { schema: outputSchema }
896
+ });
897
+ const generated = await result.object;
898
+ return { clusters: generated.clusters, proposedTags: generated.proposedTags ?? [] };
899
+ } catch (error$1) {
900
+ if (error$1 instanceof error.MastraError) {
901
+ throw new chunk64ITUOXI_cjs.HTTPException(getHttpStatusForMastraError(error$1.id), { message: error$1.message });
902
+ }
903
+ return chunkY2BKW5ND_cjs.handleError(error$1, "Error clustering failures");
904
+ }
905
+ }
906
+ });
637
907
 
638
908
  exports.ADD_ITEM_ROUTE = ADD_ITEM_ROUTE;
639
909
  exports.BATCH_DELETE_ITEMS_ROUTE = BATCH_DELETE_ITEMS_ROUTE;
640
910
  exports.BATCH_INSERT_ITEMS_ROUTE = BATCH_INSERT_ITEMS_ROUTE;
911
+ exports.CLUSTER_FAILURES_ROUTE = CLUSTER_FAILURES_ROUTE;
641
912
  exports.COMPARE_EXPERIMENTS_ROUTE = COMPARE_EXPERIMENTS_ROUTE;
642
913
  exports.CREATE_DATASET_ROUTE = CREATE_DATASET_ROUTE;
643
914
  exports.DELETE_DATASET_ROUTE = DELETE_DATASET_ROUTE;
644
915
  exports.DELETE_ITEM_ROUTE = DELETE_ITEM_ROUTE;
916
+ exports.GENERATE_ITEMS_ROUTE = GENERATE_ITEMS_ROUTE;
645
917
  exports.GET_DATASET_ROUTE = GET_DATASET_ROUTE;
646
918
  exports.GET_EXPERIMENT_ROUTE = GET_EXPERIMENT_ROUTE;
647
919
  exports.GET_ITEM_ROUTE = GET_ITEM_ROUTE;
@@ -654,6 +926,7 @@ exports.LIST_ITEMS_ROUTE = LIST_ITEMS_ROUTE;
654
926
  exports.LIST_ITEM_VERSIONS_ROUTE = LIST_ITEM_VERSIONS_ROUTE;
655
927
  exports.TRIGGER_EXPERIMENT_ROUTE = TRIGGER_EXPERIMENT_ROUTE;
656
928
  exports.UPDATE_DATASET_ROUTE = UPDATE_DATASET_ROUTE;
929
+ exports.UPDATE_EXPERIMENT_RESULT_ROUTE = UPDATE_EXPERIMENT_RESULT_ROUTE;
657
930
  exports.UPDATE_ITEM_ROUTE = UPDATE_ITEM_ROUTE;
658
- //# sourceMappingURL=chunk-M2PIFW7O.cjs.map
659
- //# sourceMappingURL=chunk-M2PIFW7O.cjs.map
931
+ //# sourceMappingURL=chunk-AOAIJJY6.cjs.map
932
+ //# sourceMappingURL=chunk-AOAIJJY6.cjs.map