@mastra/core 0.18.0-alpha.2 → 0.18.0-alpha.3
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 +19 -0
- package/dist/agent/agent.d.ts +3 -0
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.types.d.ts +4 -0
- package/dist/agent/agent.types.d.ts.map +1 -1
- package/dist/agent/index.cjs +11 -11
- package/dist/agent/index.js +2 -2
- package/dist/agent/input-processor/index.cjs +6 -6
- package/dist/agent/input-processor/index.js +1 -1
- package/dist/agent/workflows/prepare-stream/index.d.ts +3 -1
- package/dist/agent/workflows/prepare-stream/index.d.ts.map +1 -1
- package/dist/agent/workflows/prepare-stream/stream-step.d.ts +3 -1
- package/dist/agent/workflows/prepare-stream/stream-step.d.ts.map +1 -1
- package/dist/ai-tracing/index.cjs +32 -32
- package/dist/ai-tracing/index.js +1 -1
- package/dist/{chunk-5GZUTAC3.js → chunk-2ZSMA4EM.js} +33 -31
- package/dist/chunk-2ZSMA4EM.js.map +1 -0
- package/dist/{chunk-4VMYYXFD.js → chunk-6NZTZOEI.js} +18 -7
- package/dist/chunk-6NZTZOEI.js.map +1 -0
- package/dist/{chunk-GGMAYEJY.js → chunk-7CF3FKP3.js} +5 -39
- package/dist/chunk-7CF3FKP3.js.map +1 -0
- package/dist/{chunk-MTJXEZUV.cjs → chunk-AEYCHF2U.cjs} +20 -10
- package/dist/chunk-AEYCHF2U.cjs.map +1 -0
- package/dist/{chunk-RAQ4VAQ4.js → chunk-AR76DMZQ.js} +10 -3
- package/dist/chunk-AR76DMZQ.js.map +1 -0
- package/dist/{chunk-6V4L7V2Q.cjs → chunk-CBV6EVJK.cjs} +55 -53
- package/dist/chunk-CBV6EVJK.cjs.map +1 -0
- package/dist/chunk-F7GI2OYP.js +3 -0
- package/dist/chunk-F7GI2OYP.js.map +1 -0
- package/dist/chunk-FVIT6JZ5.cjs +4 -0
- package/dist/chunk-FVIT6JZ5.cjs.map +1 -0
- package/dist/{chunk-N4YXCARN.cjs → chunk-GGN63GU5.cjs} +8 -7
- package/dist/chunk-GGN63GU5.cjs.map +1 -0
- package/dist/{chunk-GWSHTBQY.js → chunk-GMQUHK3L.js} +18 -8
- package/dist/chunk-GMQUHK3L.js.map +1 -0
- package/dist/{chunk-SYLRGTK6.cjs → chunk-JRTFV63C.cjs} +27 -16
- package/dist/chunk-JRTFV63C.cjs.map +1 -0
- package/dist/{chunk-ROT2EVXS.js → chunk-JXRAFE3E.js} +3 -3
- package/dist/{chunk-ROT2EVXS.js.map → chunk-JXRAFE3E.js.map} +1 -1
- package/dist/{chunk-WYBYCVS3.cjs → chunk-L7Z3C5XG.cjs} +4 -4
- package/dist/{chunk-WYBYCVS3.cjs.map → chunk-L7Z3C5XG.cjs.map} +1 -1
- package/dist/{chunk-PRVMPHNQ.cjs → chunk-OVVKYARB.cjs} +10 -3
- package/dist/chunk-OVVKYARB.cjs.map +1 -0
- package/dist/{chunk-SVZWWLGF.cjs → chunk-QIXLPKMN.cjs} +4 -4
- package/dist/{chunk-SVZWWLGF.cjs.map → chunk-QIXLPKMN.cjs.map} +1 -1
- package/dist/{chunk-CIPXOPLS.js → chunk-SHFLPFKN.js} +3 -3
- package/dist/{chunk-CIPXOPLS.js.map → chunk-SHFLPFKN.js.map} +1 -1
- package/dist/{chunk-VRRY6NGC.js → chunk-SQFVIROI.js} +4 -3
- package/dist/chunk-SQFVIROI.js.map +1 -0
- package/dist/{chunk-BFLZKJAS.cjs → chunk-TJZ4ERV4.cjs} +8 -46
- package/dist/chunk-TJZ4ERV4.cjs.map +1 -0
- package/dist/{chunk-BZ4AOVOL.cjs → chunk-TRZT7QPJ.cjs} +6 -6
- package/dist/{chunk-BZ4AOVOL.cjs.map → chunk-TRZT7QPJ.cjs.map} +1 -1
- package/dist/{chunk-BJLIYOUK.js → chunk-TZZFP4EW.js} +3 -3
- package/dist/{chunk-BJLIYOUK.js.map → chunk-TZZFP4EW.js.map} +1 -1
- package/dist/{chunk-GCUTIOQR.cjs → chunk-UMATHB4Q.cjs} +56 -23
- package/dist/chunk-UMATHB4Q.cjs.map +1 -0
- package/dist/{chunk-TKIKIC36.js → chunk-USHKSVKL.js} +49 -16
- package/dist/chunk-USHKSVKL.js.map +1 -0
- package/dist/chunk-WAGAASWE.cjs +46 -0
- package/dist/chunk-WAGAASWE.cjs.map +1 -0
- package/dist/chunk-X2TVBX7O.js +41 -0
- package/dist/chunk-X2TVBX7O.js.map +1 -0
- package/dist/{chunk-WOC5SCZF.cjs → chunk-Y5XECV4O.cjs} +4 -4
- package/dist/{chunk-WOC5SCZF.cjs.map → chunk-Y5XECV4O.cjs.map} +1 -1
- package/dist/{chunk-C7EN3GVU.js → chunk-YDLEEOJ6.js} +3 -3
- package/dist/{chunk-C7EN3GVU.js.map → chunk-YDLEEOJ6.js.map} +1 -1
- package/dist/index.cjs +45 -45
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +10 -10
- package/dist/index.js.map +1 -1
- package/dist/integration/index.cjs +3 -3
- package/dist/integration/index.js +1 -1
- package/dist/llm/model/model.loop.d.ts +1 -1
- package/dist/llm/model/model.loop.d.ts.map +1 -1
- package/dist/loop/index.cjs +2 -2
- package/dist/loop/index.js +1 -1
- package/dist/loop/loop.d.ts +1 -1
- package/dist/loop/loop.d.ts.map +1 -1
- package/dist/loop/test-utils/options.d.ts.map +1 -1
- package/dist/loop/types.d.ts +10 -1
- package/dist/loop/types.d.ts.map +1 -1
- package/dist/loop/workflows/agentic-execution/index.d.ts.map +1 -1
- package/dist/loop/workflows/agentic-execution/llm-execution-step.d.ts.map +1 -1
- package/dist/loop/workflows/agentic-execution/tool-call-step.d.ts +1 -1
- package/dist/loop/workflows/agentic-execution/tool-call-step.d.ts.map +1 -1
- package/dist/loop/workflows/stream.d.ts +1 -1
- package/dist/loop/workflows/stream.d.ts.map +1 -1
- package/dist/mastra/hooks.d.ts.map +1 -1
- package/dist/mastra/index.cjs +2 -2
- package/dist/mastra/index.d.ts +3 -0
- package/dist/mastra/index.d.ts.map +1 -1
- package/dist/mastra/index.js +1 -1
- package/dist/memory/index.cjs +4 -4
- package/dist/memory/index.js +1 -1
- package/dist/memory/memory.d.ts +1 -1
- package/dist/memory/memory.d.ts.map +1 -1
- package/dist/memory/types.d.ts +27 -0
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/network/vNext/index.cjs +34 -31
- package/dist/network/vNext/index.cjs.map +1 -1
- package/dist/network/vNext/index.d.ts +1 -1
- package/dist/network/vNext/index.d.ts.map +1 -1
- package/dist/network/vNext/index.js +7 -4
- package/dist/network/vNext/index.js.map +1 -1
- package/dist/processors/index.cjs +10 -10
- package/dist/processors/index.js +1 -1
- package/dist/relevance/index.cjs +4 -4
- package/dist/relevance/index.js +1 -1
- package/dist/scores/base.d.ts.map +1 -1
- package/dist/scores/index.cjs +9 -8
- package/dist/scores/index.js +2 -1
- package/dist/scores/scoreTraces/index.cjs +442 -0
- package/dist/scores/scoreTraces/index.cjs.map +1 -0
- package/dist/scores/scoreTraces/index.d.ts +3 -0
- package/dist/scores/scoreTraces/index.d.ts.map +1 -0
- package/dist/scores/scoreTraces/index.js +434 -0
- package/dist/scores/scoreTraces/index.js.map +1 -0
- package/dist/scores/scoreTraces/scoreTraces.d.ts +10 -0
- package/dist/scores/scoreTraces/scoreTraces.d.ts.map +1 -0
- package/dist/scores/scoreTraces/scoreTracesWorkflow.d.ts +87 -0
- package/dist/scores/scoreTraces/scoreTracesWorkflow.d.ts.map +1 -0
- package/dist/scores/scoreTraces/utils.d.ts +25 -0
- package/dist/scores/scoreTraces/utils.d.ts.map +1 -0
- package/dist/scores/types.d.ts +8 -7
- package/dist/scores/types.d.ts.map +1 -1
- package/dist/storage/index.cjs +3 -3
- package/dist/storage/index.js +1 -1
- package/dist/stream/base/output.d.ts +30 -1
- package/dist/stream/base/output.d.ts.map +1 -1
- package/dist/stream/index.cjs +4 -4
- package/dist/stream/index.js +1 -1
- package/dist/stream/types.d.ts +16 -0
- package/dist/stream/types.d.ts.map +1 -1
- package/dist/test-utils/llm-mock.cjs +2 -2
- package/dist/test-utils/llm-mock.js +1 -1
- package/dist/tools/index.cjs +4 -4
- package/dist/tools/index.js +1 -1
- package/dist/tools/index.warning.d.ts +2 -2
- package/dist/tools/index.warning.d.ts.map +1 -1
- package/dist/tools/is-vercel-tool.cjs +2 -2
- package/dist/tools/is-vercel-tool.js +1 -1
- package/dist/tools/tool-builder/builder.d.ts.map +1 -1
- package/dist/tools/tool.d.ts +13 -8
- package/dist/tools/tool.d.ts.map +1 -1
- package/dist/tools/types.d.ts +7 -2
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/utils.cjs +17 -17
- package/dist/utils.d.ts +1 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +1 -1
- package/dist/workflows/default.d.ts.map +1 -1
- package/dist/workflows/evented/index.cjs +10 -10
- package/dist/workflows/evented/index.js +1 -1
- package/dist/workflows/evented/workflow-event-processor/index.d.ts.map +1 -1
- package/dist/workflows/evented/workflow.d.ts +1 -1
- package/dist/workflows/evented/workflow.d.ts.map +1 -1
- package/dist/workflows/index.cjs +11 -11
- package/dist/workflows/index.js +1 -1
- package/dist/workflows/legacy/index.cjs +22 -22
- package/dist/workflows/legacy/index.js +1 -1
- package/dist/workflows/types.d.ts +1 -0
- package/dist/workflows/types.d.ts.map +1 -1
- package/dist/workflows/workflow.d.ts +2 -2
- package/dist/workflows/workflow.d.ts.map +1 -1
- package/package.json +14 -4
- package/scores/scoreTraces.d.ts +1 -0
- package/dist/chunk-4VMYYXFD.js.map +0 -1
- package/dist/chunk-5GZUTAC3.js.map +0 -1
- package/dist/chunk-6V4L7V2Q.cjs.map +0 -1
- package/dist/chunk-BFLZKJAS.cjs.map +0 -1
- package/dist/chunk-GCUTIOQR.cjs.map +0 -1
- package/dist/chunk-GGMAYEJY.js.map +0 -1
- package/dist/chunk-GWSHTBQY.js.map +0 -1
- package/dist/chunk-MTJXEZUV.cjs.map +0 -1
- package/dist/chunk-N4YXCARN.cjs.map +0 -1
- package/dist/chunk-PRVMPHNQ.cjs.map +0 -1
- package/dist/chunk-RAQ4VAQ4.js.map +0 -1
- package/dist/chunk-SYLRGTK6.cjs.map +0 -1
- package/dist/chunk-TKIKIC36.js.map +0 -1
- package/dist/chunk-VRRY6NGC.js.map +0 -1
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkJRTFV63C_cjs = require('../../chunk-JRTFV63C.cjs');
|
|
4
|
+
var chunkWAGAASWE_cjs = require('../../chunk-WAGAASWE.cjs');
|
|
5
|
+
var chunkL7Z3C5XG_cjs = require('../../chunk-L7Z3C5XG.cjs');
|
|
6
|
+
var chunkC73WLCY3_cjs = require('../../chunk-C73WLCY3.cjs');
|
|
7
|
+
var pMap = require('p-map');
|
|
8
|
+
var z = require('zod');
|
|
9
|
+
|
|
10
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
+
|
|
12
|
+
var pMap__default = /*#__PURE__*/_interopDefault(pMap);
|
|
13
|
+
var z__default = /*#__PURE__*/_interopDefault(z);
|
|
14
|
+
|
|
15
|
+
// src/scores/scoreTraces/scoreTraces.ts
|
|
16
|
+
async function scoreTraces({
|
|
17
|
+
scorerName,
|
|
18
|
+
targets,
|
|
19
|
+
mastra
|
|
20
|
+
}) {
|
|
21
|
+
const workflow = mastra.__getInternalWorkflow("__batch-scoring-traces");
|
|
22
|
+
try {
|
|
23
|
+
const run = await workflow.createRunAsync();
|
|
24
|
+
await run.start({ inputData: { targets, scorerName } });
|
|
25
|
+
} catch (error) {
|
|
26
|
+
const mastraError = new chunkC73WLCY3_cjs.MastraError(
|
|
27
|
+
{
|
|
28
|
+
category: "SYSTEM",
|
|
29
|
+
domain: "SCORER",
|
|
30
|
+
id: "MASTRA_SCORER_FAILED_TO_RUN_TRACE_SCORING",
|
|
31
|
+
details: {
|
|
32
|
+
scorerName,
|
|
33
|
+
targets: JSON.stringify(targets)
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
error
|
|
37
|
+
);
|
|
38
|
+
mastra.getLogger()?.trackException(mastraError);
|
|
39
|
+
mastra.getLogger()?.error(mastraError.toString());
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// src/scores/scoreTraces/utils.ts
|
|
44
|
+
function buildSpanTree(spans) {
|
|
45
|
+
const spanMap = /* @__PURE__ */ new Map();
|
|
46
|
+
const childrenMap = /* @__PURE__ */ new Map();
|
|
47
|
+
const rootSpans = [];
|
|
48
|
+
for (const span of spans) {
|
|
49
|
+
spanMap.set(span.spanId, span);
|
|
50
|
+
}
|
|
51
|
+
for (const span of spans) {
|
|
52
|
+
if (span.parentSpanId === null) {
|
|
53
|
+
rootSpans.push(span);
|
|
54
|
+
} else {
|
|
55
|
+
const siblings = childrenMap.get(span.parentSpanId) || [];
|
|
56
|
+
siblings.push(span);
|
|
57
|
+
childrenMap.set(span.parentSpanId, siblings);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
for (const children of childrenMap.values()) {
|
|
61
|
+
children.sort((a, b) => new Date(a.startedAt).getTime() - new Date(b.startedAt).getTime());
|
|
62
|
+
}
|
|
63
|
+
rootSpans.sort((a, b) => new Date(a.startedAt).getTime() - new Date(b.startedAt).getTime());
|
|
64
|
+
return { spanMap, childrenMap, rootSpans };
|
|
65
|
+
}
|
|
66
|
+
function getChildrenOfType(spanTree, parentSpanId, spanType) {
|
|
67
|
+
const children = spanTree.childrenMap.get(parentSpanId) || [];
|
|
68
|
+
return children.filter((span) => span.spanType === spanType);
|
|
69
|
+
}
|
|
70
|
+
function normalizeMessageContent(content) {
|
|
71
|
+
if (typeof content === "string") {
|
|
72
|
+
return content;
|
|
73
|
+
}
|
|
74
|
+
const tempMessage = {
|
|
75
|
+
id: "temp",
|
|
76
|
+
role: "user",
|
|
77
|
+
parts: content.map((part) => ({ type: part.type, text: part.text }))
|
|
78
|
+
};
|
|
79
|
+
const converted = chunkL7Z3C5XG_cjs.convertMessages(tempMessage).to("AIV4.UI");
|
|
80
|
+
return converted[0]?.content || "";
|
|
81
|
+
}
|
|
82
|
+
function convertToUIMessage(message, createdAt) {
|
|
83
|
+
let messageInput;
|
|
84
|
+
if (typeof message.content === "string") {
|
|
85
|
+
messageInput = {
|
|
86
|
+
id: "temp",
|
|
87
|
+
role: message.role,
|
|
88
|
+
content: message.content
|
|
89
|
+
};
|
|
90
|
+
} else {
|
|
91
|
+
messageInput = {
|
|
92
|
+
id: "temp",
|
|
93
|
+
role: message.role,
|
|
94
|
+
parts: message.content.map((part) => ({ type: part.type, text: part.text }))
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
const converted = chunkL7Z3C5XG_cjs.convertMessages(messageInput).to("AIV4.UI");
|
|
98
|
+
const result = converted[0];
|
|
99
|
+
if (!result) {
|
|
100
|
+
throw new Error("Failed to convert message");
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
...result,
|
|
104
|
+
id: "",
|
|
105
|
+
// Spans don't have message IDs
|
|
106
|
+
createdAt: new Date(createdAt)
|
|
107
|
+
// Use span timestamp
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function extractInputMessages(agentSpan) {
|
|
111
|
+
const input = agentSpan.input;
|
|
112
|
+
if (typeof input === "string") {
|
|
113
|
+
return [
|
|
114
|
+
{
|
|
115
|
+
role: "user",
|
|
116
|
+
content: input,
|
|
117
|
+
createdAt: new Date(agentSpan.startedAt),
|
|
118
|
+
parts: [{ type: "text", text: input }],
|
|
119
|
+
experimental_attachments: []
|
|
120
|
+
}
|
|
121
|
+
];
|
|
122
|
+
}
|
|
123
|
+
if (Array.isArray(input)) {
|
|
124
|
+
return input.map((msg) => convertToUIMessage(msg, agentSpan.startedAt));
|
|
125
|
+
}
|
|
126
|
+
if (input && typeof input === "object" && Array.isArray(input.messages)) {
|
|
127
|
+
return input.messages.map((msg) => convertToUIMessage(msg, agentSpan.startedAt));
|
|
128
|
+
}
|
|
129
|
+
return [];
|
|
130
|
+
}
|
|
131
|
+
function extractSystemMessages(llmSpan) {
|
|
132
|
+
return (llmSpan.input?.messages || []).filter((msg) => msg.role === "system").map((msg) => ({
|
|
133
|
+
role: "system",
|
|
134
|
+
content: normalizeMessageContent(msg.content)
|
|
135
|
+
}));
|
|
136
|
+
}
|
|
137
|
+
function extractRememberedMessages(llmSpan, currentInputContent) {
|
|
138
|
+
const messages = (llmSpan.input?.messages || []).filter((msg) => msg.role !== "system").filter((msg) => normalizeMessageContent(msg.content) !== currentInputContent);
|
|
139
|
+
return messages.map((msg) => convertToUIMessage(msg, llmSpan.startedAt));
|
|
140
|
+
}
|
|
141
|
+
function reconstructToolInvocations(spanTree, parentSpanId) {
|
|
142
|
+
const toolSpans = getChildrenOfType(spanTree, parentSpanId, "tool_call" /* TOOL_CALL */);
|
|
143
|
+
return toolSpans.map((toolSpan) => ({
|
|
144
|
+
state: "result",
|
|
145
|
+
toolName: toolSpan.attributes?.toolId,
|
|
146
|
+
args: toolSpan.input || {},
|
|
147
|
+
result: toolSpan.output || {}
|
|
148
|
+
}));
|
|
149
|
+
}
|
|
150
|
+
function createMessageParts(toolInvocations, textContent) {
|
|
151
|
+
const parts = [];
|
|
152
|
+
for (const toolInvocation of toolInvocations) {
|
|
153
|
+
parts.push({
|
|
154
|
+
type: "tool-invocation",
|
|
155
|
+
toolInvocation
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
if (textContent.trim()) {
|
|
159
|
+
parts.push({
|
|
160
|
+
type: "text",
|
|
161
|
+
text: textContent
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
return parts;
|
|
165
|
+
}
|
|
166
|
+
function validateTrace(trace) {
|
|
167
|
+
if (!trace) {
|
|
168
|
+
throw new Error("Trace is null or undefined");
|
|
169
|
+
}
|
|
170
|
+
if (!trace.spans || !Array.isArray(trace.spans)) {
|
|
171
|
+
throw new Error("Trace must have a spans array");
|
|
172
|
+
}
|
|
173
|
+
if (trace.spans.length === 0) {
|
|
174
|
+
throw new Error("Trace has no spans");
|
|
175
|
+
}
|
|
176
|
+
const spanIds = new Set(trace.spans.map((span) => span.spanId));
|
|
177
|
+
for (const span of trace.spans) {
|
|
178
|
+
if (span.parentSpanId && !spanIds.has(span.parentSpanId)) {
|
|
179
|
+
throw new Error(`Span ${span.spanId} references non-existent parent ${span.parentSpanId}`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
function findPrimaryLLMSpan(spanTree, rootAgentSpan) {
|
|
184
|
+
const directLLMSpans = getChildrenOfType(spanTree, rootAgentSpan.spanId, "llm_generation" /* LLM_GENERATION */);
|
|
185
|
+
if (directLLMSpans.length > 0) {
|
|
186
|
+
return directLLMSpans[0];
|
|
187
|
+
}
|
|
188
|
+
throw new Error("No LLM generation span found in trace");
|
|
189
|
+
}
|
|
190
|
+
function transformTraceToScorerInput(trace) {
|
|
191
|
+
try {
|
|
192
|
+
validateTrace(trace);
|
|
193
|
+
const spanTree = buildSpanTree(trace.spans);
|
|
194
|
+
const rootAgentSpan = spanTree.rootSpans.find((span) => span.spanType === "agent_run");
|
|
195
|
+
if (!rootAgentSpan) {
|
|
196
|
+
throw new Error("No root agent_run span found in trace");
|
|
197
|
+
}
|
|
198
|
+
const primaryLLMSpan = findPrimaryLLMSpan(spanTree, rootAgentSpan);
|
|
199
|
+
const inputMessages = extractInputMessages(rootAgentSpan);
|
|
200
|
+
const systemMessages = extractSystemMessages(primaryLLMSpan);
|
|
201
|
+
const currentInputContent = inputMessages[0]?.content || "";
|
|
202
|
+
const rememberedMessages = extractRememberedMessages(primaryLLMSpan, currentInputContent);
|
|
203
|
+
return {
|
|
204
|
+
// We do not keep track of the tool call ids in traces, so we need to cast to UIMessageWithMetadata
|
|
205
|
+
inputMessages,
|
|
206
|
+
rememberedMessages,
|
|
207
|
+
systemMessages,
|
|
208
|
+
taggedSystemMessages: {}
|
|
209
|
+
// Todo: Support tagged system messages
|
|
210
|
+
};
|
|
211
|
+
} catch (error) {
|
|
212
|
+
throw new Error(
|
|
213
|
+
`Failed to transform trace to scorer input: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
214
|
+
);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
function transformTraceToScorerOutput(trace) {
|
|
218
|
+
try {
|
|
219
|
+
validateTrace(trace);
|
|
220
|
+
const spanTree = buildSpanTree(trace.spans);
|
|
221
|
+
const rootAgentSpan = spanTree.rootSpans.find((span) => span.spanType === "agent_run");
|
|
222
|
+
if (!rootAgentSpan) {
|
|
223
|
+
throw new Error("No root agent_run span found in trace");
|
|
224
|
+
}
|
|
225
|
+
if (!rootAgentSpan.output) {
|
|
226
|
+
throw new Error("Root agent span has no output");
|
|
227
|
+
}
|
|
228
|
+
const toolInvocations = reconstructToolInvocations(spanTree, rootAgentSpan.spanId);
|
|
229
|
+
const responseText = rootAgentSpan.output.text || "";
|
|
230
|
+
const responseMessage = {
|
|
231
|
+
role: "assistant",
|
|
232
|
+
content: responseText,
|
|
233
|
+
createdAt: new Date(rootAgentSpan.endedAt || rootAgentSpan.startedAt),
|
|
234
|
+
// @ts-ignore
|
|
235
|
+
parts: createMessageParts(toolInvocations, responseText),
|
|
236
|
+
experimental_attachments: [],
|
|
237
|
+
// Tool invocations are being deprecated however we need to support it for now
|
|
238
|
+
toolInvocations
|
|
239
|
+
};
|
|
240
|
+
return [responseMessage];
|
|
241
|
+
} catch (error) {
|
|
242
|
+
throw new Error(
|
|
243
|
+
`Failed to transform trace to scorer output: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// src/scores/scoreTraces/scoreTracesWorkflow.ts
|
|
249
|
+
var getTraceStep = chunkJRTFV63C_cjs.createStep({
|
|
250
|
+
id: "__process-trace-scoring",
|
|
251
|
+
inputSchema: z__default.default.object({
|
|
252
|
+
targets: z__default.default.array(
|
|
253
|
+
z__default.default.object({
|
|
254
|
+
traceId: z__default.default.string(),
|
|
255
|
+
spanId: z__default.default.string().optional()
|
|
256
|
+
})
|
|
257
|
+
),
|
|
258
|
+
scorerName: z__default.default.string()
|
|
259
|
+
}),
|
|
260
|
+
outputSchema: z__default.default.any(),
|
|
261
|
+
execute: async ({ inputData, tracingContext, mastra }) => {
|
|
262
|
+
const logger = mastra.getLogger();
|
|
263
|
+
if (!logger) {
|
|
264
|
+
console.warn(
|
|
265
|
+
"[scoreTracesWorkflow] Logger not initialized: no debug or error logs will be recorded for scoring traces."
|
|
266
|
+
);
|
|
267
|
+
}
|
|
268
|
+
const storage = mastra.getStorage();
|
|
269
|
+
if (!storage) {
|
|
270
|
+
const mastraError = new chunkC73WLCY3_cjs.MastraError({
|
|
271
|
+
id: "MASTRA_STORAGE_NOT_FOUND_FOR_TRACE_SCORING",
|
|
272
|
+
domain: "STORAGE" /* STORAGE */,
|
|
273
|
+
category: "SYSTEM" /* SYSTEM */,
|
|
274
|
+
text: "Storage not found for trace scoring",
|
|
275
|
+
details: {
|
|
276
|
+
scorerName: inputData.scorerName
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
logger?.error(mastraError.toString());
|
|
280
|
+
logger?.trackException(mastraError);
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
let scorer;
|
|
284
|
+
try {
|
|
285
|
+
scorer = mastra.getScorerByName(inputData.scorerName);
|
|
286
|
+
} catch (error) {
|
|
287
|
+
const mastraError = new chunkC73WLCY3_cjs.MastraError(
|
|
288
|
+
{
|
|
289
|
+
id: "MASTRA_SCORER_NOT_FOUND_FOR_TRACE_SCORING",
|
|
290
|
+
domain: "SCORER" /* SCORER */,
|
|
291
|
+
category: "SYSTEM" /* SYSTEM */,
|
|
292
|
+
text: `Scorer not found for trace scoring`,
|
|
293
|
+
details: {
|
|
294
|
+
scorerName: inputData.scorerName
|
|
295
|
+
}
|
|
296
|
+
},
|
|
297
|
+
error
|
|
298
|
+
);
|
|
299
|
+
logger?.error(mastraError.toString());
|
|
300
|
+
logger?.trackException(mastraError);
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
await pMap__default.default(
|
|
304
|
+
inputData.targets,
|
|
305
|
+
async (target) => {
|
|
306
|
+
try {
|
|
307
|
+
await runScorerOnTarget({ storage, scorer, target, tracingContext });
|
|
308
|
+
} catch (error) {
|
|
309
|
+
const mastraError = new chunkC73WLCY3_cjs.MastraError(
|
|
310
|
+
{
|
|
311
|
+
id: "MASTRA_SCORER_FAILED_TO_RUN_SCORER_ON_TRACE",
|
|
312
|
+
domain: "SCORER" /* SCORER */,
|
|
313
|
+
category: "SYSTEM" /* SYSTEM */,
|
|
314
|
+
details: {
|
|
315
|
+
scorerName: scorer.name,
|
|
316
|
+
spanId: target.spanId || "",
|
|
317
|
+
traceId: target.traceId
|
|
318
|
+
}
|
|
319
|
+
},
|
|
320
|
+
error
|
|
321
|
+
);
|
|
322
|
+
logger?.error(mastraError.toString());
|
|
323
|
+
logger?.trackException(mastraError);
|
|
324
|
+
}
|
|
325
|
+
},
|
|
326
|
+
{ concurrency: 3 }
|
|
327
|
+
);
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
async function runScorerOnTarget({
|
|
331
|
+
storage,
|
|
332
|
+
scorer,
|
|
333
|
+
target,
|
|
334
|
+
tracingContext
|
|
335
|
+
}) {
|
|
336
|
+
const trace = await storage.getAITrace(target.traceId);
|
|
337
|
+
if (!trace) {
|
|
338
|
+
throw new Error(`Trace not found for scoring, traceId: ${target.traceId}`);
|
|
339
|
+
}
|
|
340
|
+
let span;
|
|
341
|
+
if (target.spanId) {
|
|
342
|
+
span = trace.spans.find((span2) => span2.spanId === target.spanId);
|
|
343
|
+
} else {
|
|
344
|
+
span = trace.spans.find((span2) => span2.parentSpanId === null);
|
|
345
|
+
}
|
|
346
|
+
if (!span) {
|
|
347
|
+
throw new Error(
|
|
348
|
+
`Span not found for scoring, traceId: ${target.traceId}, spanId: ${target.spanId ?? "Not provided"}`
|
|
349
|
+
);
|
|
350
|
+
}
|
|
351
|
+
const scorerRun = buildScorerRun({
|
|
352
|
+
scorerType: scorer.type === "agent" ? "agent" : void 0,
|
|
353
|
+
tracingContext,
|
|
354
|
+
trace,
|
|
355
|
+
targetSpan: span
|
|
356
|
+
});
|
|
357
|
+
const result = await scorer.run(scorerRun);
|
|
358
|
+
const traceId = `${target.traceId}${target.spanId ? `-${target.spanId}` : ""}`;
|
|
359
|
+
const scorerResult = {
|
|
360
|
+
...result,
|
|
361
|
+
scorer: {
|
|
362
|
+
id: scorer.name,
|
|
363
|
+
name: scorer.name,
|
|
364
|
+
description: scorer.description
|
|
365
|
+
},
|
|
366
|
+
traceId,
|
|
367
|
+
entityId: span.name,
|
|
368
|
+
entityType: span.spanType,
|
|
369
|
+
entity: { traceId: span.traceId, spanId: span.spanId },
|
|
370
|
+
source: "TEST",
|
|
371
|
+
scorerId: scorer.name
|
|
372
|
+
};
|
|
373
|
+
const savedScoreRecord = await validateAndSaveScore({ storage, scorerResult });
|
|
374
|
+
await attachScoreToSpan({ storage, span, scoreRecord: savedScoreRecord });
|
|
375
|
+
}
|
|
376
|
+
async function validateAndSaveScore({ storage, scorerResult }) {
|
|
377
|
+
const payloadToSave = chunkWAGAASWE_cjs.saveScorePayloadSchema.parse(scorerResult);
|
|
378
|
+
const result = await storage.saveScore(payloadToSave);
|
|
379
|
+
return result.score;
|
|
380
|
+
}
|
|
381
|
+
function buildScorerRun({
|
|
382
|
+
scorerType,
|
|
383
|
+
tracingContext,
|
|
384
|
+
trace,
|
|
385
|
+
targetSpan
|
|
386
|
+
}) {
|
|
387
|
+
let runPayload;
|
|
388
|
+
if (scorerType === "agent") {
|
|
389
|
+
runPayload = {
|
|
390
|
+
input: transformTraceToScorerInput(trace),
|
|
391
|
+
output: transformTraceToScorerOutput(trace)
|
|
392
|
+
};
|
|
393
|
+
} else {
|
|
394
|
+
runPayload = { input: targetSpan.input, output: targetSpan.output };
|
|
395
|
+
}
|
|
396
|
+
runPayload.tracingContext = tracingContext;
|
|
397
|
+
return runPayload;
|
|
398
|
+
}
|
|
399
|
+
async function attachScoreToSpan({
|
|
400
|
+
storage,
|
|
401
|
+
span,
|
|
402
|
+
scoreRecord
|
|
403
|
+
}) {
|
|
404
|
+
const existingLinks = span.links || [];
|
|
405
|
+
const link = {
|
|
406
|
+
type: "score",
|
|
407
|
+
scoreId: scoreRecord.id,
|
|
408
|
+
scorerName: scoreRecord.scorer.name,
|
|
409
|
+
score: scoreRecord.score,
|
|
410
|
+
createdAt: scoreRecord.createdAt
|
|
411
|
+
};
|
|
412
|
+
await storage.updateAISpan({
|
|
413
|
+
spanId: span.spanId,
|
|
414
|
+
traceId: span.traceId,
|
|
415
|
+
updates: { links: [...existingLinks, link] }
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
var scoreTracesWorkflow = chunkJRTFV63C_cjs.createWorkflow({
|
|
419
|
+
id: "__batch-scoring-traces",
|
|
420
|
+
inputSchema: z__default.default.object({
|
|
421
|
+
targets: z__default.default.array(
|
|
422
|
+
z__default.default.object({
|
|
423
|
+
traceId: z__default.default.string(),
|
|
424
|
+
spanId: z__default.default.string().optional()
|
|
425
|
+
})
|
|
426
|
+
),
|
|
427
|
+
scorerName: z__default.default.string()
|
|
428
|
+
}),
|
|
429
|
+
outputSchema: z__default.default.any(),
|
|
430
|
+
steps: [getTraceStep],
|
|
431
|
+
options: {
|
|
432
|
+
tracingPolicy: {
|
|
433
|
+
internal: 15 /* ALL */
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
});
|
|
437
|
+
scoreTracesWorkflow.then(getTraceStep).commit();
|
|
438
|
+
|
|
439
|
+
exports.scoreTraces = scoreTraces;
|
|
440
|
+
exports.scoreTracesWorkflow = scoreTracesWorkflow;
|
|
441
|
+
//# sourceMappingURL=index.cjs.map
|
|
442
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/scores/scoreTraces/scoreTraces.ts","../../../src/scores/scoreTraces/utils.ts","../../../src/scores/scoreTraces/scoreTracesWorkflow.ts"],"names":["MastraError","convertMessages","createStep","z","pMap","span","saveScorePayloadSchema","createWorkflow"],"mappings":"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","file":"index.cjs","sourcesContent":["import { MastraError } from '../../error';\nimport type { Mastra } from '../../mastra';\n\nexport async function scoreTraces({\n scorerName,\n targets,\n mastra,\n}: {\n scorerName: string;\n targets: { traceId: string; spanId?: string }[];\n mastra: Mastra;\n}) {\n const workflow = mastra.__getInternalWorkflow('__batch-scoring-traces');\n try {\n const run = await workflow.createRunAsync();\n await run.start({ inputData: { targets, scorerName } });\n } catch (error) {\n const mastraError = new MastraError(\n {\n category: 'SYSTEM',\n domain: 'SCORER',\n id: 'MASTRA_SCORER_FAILED_TO_RUN_TRACE_SCORING',\n details: {\n scorerName,\n targets: JSON.stringify(targets),\n },\n },\n error,\n );\n mastra.getLogger()?.trackException(mastraError);\n mastra.getLogger()?.error(mastraError.toString());\n }\n}\n","import type { ToolInvocation } from 'ai';\nimport type { UIMessageWithMetadata } from '../../agent';\nimport { convertMessages } from '../../agent/message-list/utils/convert-messages';\nimport { AISpanType } from '../../ai-tracing';\nimport type { AISpanRecord, AITraceRecord } from '../../storage';\nimport type { ScorerRunInputForAgent, ScorerRunOutputForAgent } from '../types';\n\n// // Span tree structure for efficient lookups\ninterface SpanTree {\n spanMap: Map<string, AISpanRecord>;\n childrenMap: Map<string, AISpanRecord[]>;\n rootSpans: AISpanRecord[];\n}\n\n// Spans don't have ids, so we need to omit it from the UIMessageWithMetadata type\ntype TransformedUIMessage = Omit<UIMessageWithMetadata, 'id'>;\n\n/**\n * Build a hierarchical span tree with efficient lookup maps\n */\nexport function buildSpanTree(spans: AISpanRecord[]): SpanTree {\n const spanMap = new Map<string, AISpanRecord>();\n const childrenMap = new Map<string, AISpanRecord[]>();\n const rootSpans: AISpanRecord[] = [];\n\n // First pass: build span map\n for (const span of spans) {\n spanMap.set(span.spanId, span);\n }\n\n // Second pass: build parent-child relationships\n for (const span of spans) {\n if (span.parentSpanId === null) {\n rootSpans.push(span);\n } else {\n const siblings = childrenMap.get(span.parentSpanId) || [];\n siblings.push(span);\n childrenMap.set(span.parentSpanId, siblings);\n }\n }\n\n // Sort children by startedAt timestamp for temporal ordering\n for (const children of childrenMap.values()) {\n children.sort((a, b) => new Date(a.startedAt).getTime() - new Date(b.startedAt).getTime());\n }\n\n // Sort root spans by startedAt\n rootSpans.sort((a, b) => new Date(a.startedAt).getTime() - new Date(b.startedAt).getTime());\n\n return { spanMap, childrenMap, rootSpans };\n}\n\n/**\n * Extract children spans of a specific type\n */\nfunction getChildrenOfType<T extends AISpanRecord>(\n spanTree: SpanTree,\n parentSpanId: string,\n spanType: AISpanType,\n): T[] {\n const children = spanTree.childrenMap.get(parentSpanId) || [];\n return children.filter(span => span.spanType === spanType) as T[];\n}\n\n/**\n * Convert AI SDK v5 message content to v4 format\n */\nfunction normalizeMessageContent(content: string | Array<{ type: string; text: string }>): string {\n if (typeof content === 'string') {\n return content;\n }\n\n const tempMessage = {\n id: 'temp',\n role: 'user' as const,\n parts: content.map(part => ({ type: part.type as 'text', text: part.text })),\n };\n\n const converted = convertMessages(tempMessage).to('AIV4.UI');\n return converted[0]?.content || '';\n}\n\n/**\n * Convert v5 message to v4 UIMessage format using convertMessages\n * Ensures full consistency with AI SDK UIMessage behavior\n */\nfunction convertToUIMessage(\n message: { role: string; content: string | Array<{ type: string; text: string }> },\n createdAt: Date,\n): UIMessageWithMetadata {\n // Create proper message input for convertMessages\n let messageInput;\n if (typeof message.content === 'string') {\n messageInput = {\n id: 'temp',\n role: message.role as 'user' | 'assistant' | 'system',\n content: message.content,\n };\n } else {\n messageInput = {\n id: 'temp',\n role: message.role as 'user' | 'assistant' | 'system',\n parts: message.content.map(part => ({ type: part.type as 'text', text: part.text })),\n };\n }\n\n const converted = convertMessages(messageInput).to('AIV4.UI');\n const result = converted[0];\n\n if (!result) {\n throw new Error('Failed to convert message');\n }\n\n return {\n ...result,\n id: '', // Spans don't have message IDs\n createdAt: new Date(createdAt), // Use span timestamp\n };\n}\n\n/**\n * Extract input messages from agent run span\n */\nfunction extractInputMessages(agentSpan: AISpanRecord): TransformedUIMessage[] {\n const input = agentSpan.input;\n\n // Handle different input formats\n if (typeof input === 'string') {\n return [\n {\n role: 'user',\n content: input,\n createdAt: new Date(agentSpan.startedAt),\n parts: [{ type: 'text', text: input }],\n experimental_attachments: [],\n },\n ];\n }\n\n if (Array.isArray(input)) {\n return input.map(msg => convertToUIMessage(msg, agentSpan.startedAt));\n }\n\n // @ts-ignore\n if (input && typeof input === 'object' && Array.isArray(input.messages)) {\n // @ts-ignore\n return input.messages.map(msg => convertToUIMessage(msg, agentSpan.startedAt));\n }\n return [];\n}\n\n/**\n * Extract system messages from LLM span\n */\nfunction extractSystemMessages(llmSpan: AISpanRecord): Array<{ role: 'system'; content: string }> {\n return (llmSpan.input?.messages || [])\n .filter((msg: any) => msg.role === 'system')\n .map((msg: any) => ({\n role: 'system' as const,\n content: normalizeMessageContent(msg.content),\n }));\n}\n\n/**\n * Extract conversation history (remembered messages) from LLM span\n * Excludes system messages and the current input message\n */\nfunction extractRememberedMessages(llmSpan: AISpanRecord, currentInputContent: string): TransformedUIMessage[] {\n const messages = (llmSpan.input?.messages || [])\n .filter((msg: any) => msg.role !== 'system')\n .filter((msg: any) => normalizeMessageContent(msg.content) !== currentInputContent);\n\n return messages.map((msg: any) => convertToUIMessage(msg, llmSpan.startedAt));\n}\n\n/**\n * Reconstruct tool invocations from tool call spans\n */\nfunction reconstructToolInvocations(spanTree: SpanTree, parentSpanId: string) {\n const toolSpans = getChildrenOfType<AISpanRecord>(spanTree, parentSpanId, AISpanType.TOOL_CALL);\n\n return toolSpans.map(toolSpan => ({\n state: 'result' as const,\n toolName: toolSpan.attributes?.toolId,\n args: toolSpan.input || {},\n result: toolSpan.output || {},\n }));\n}\n\n/**\n * Create message parts array including tool invocations and text\n */\nfunction createMessageParts(toolInvocations: AISpanRecord[], textContent: string) {\n const parts: { type: 'tool-invocation' | 'text'; toolInvocation?: AISpanRecord; text?: string }[] = [];\n for (const toolInvocation of toolInvocations) {\n parts.push({\n type: 'tool-invocation',\n toolInvocation,\n });\n }\n\n if (textContent.trim()) {\n parts.push({\n type: 'text',\n text: textContent,\n });\n }\n\n return parts;\n}\n\n/**\n * Validate trace structure and throw descriptive errors\n */\nexport function validateTrace(trace: AITraceRecord): void {\n if (!trace) {\n throw new Error('Trace is null or undefined');\n }\n\n if (!trace.spans || !Array.isArray(trace.spans)) {\n throw new Error('Trace must have a spans array');\n }\n\n if (trace.spans.length === 0) {\n throw new Error('Trace has no spans');\n }\n\n // Check for circular references in parent-child relationships\n const spanIds = new Set(trace.spans.map(span => span.spanId));\n for (const span of trace.spans) {\n if (span.parentSpanId && !spanIds.has(span.parentSpanId)) {\n throw new Error(`Span ${span.spanId} references non-existent parent ${span.parentSpanId}`);\n }\n }\n}\n\n/**\n * Find the most recent LLM span that contains conversation history\n */\nfunction findPrimaryLLMSpan(spanTree: SpanTree, rootAgentSpan: AISpanRecord): AISpanRecord {\n const directLLMSpans = getChildrenOfType<AISpanRecord>(spanTree, rootAgentSpan.spanId, AISpanType.LLM_GENERATION);\n if (directLLMSpans.length > 0) {\n // There should only be one LLM generation span per agent run which is a direct child of the root agent span\n return directLLMSpans[0]!;\n }\n\n throw new Error('No LLM generation span found in trace');\n}\n\n/**\n * Transform trace to scorer input format\n */\nexport function transformTraceToScorerInput(trace: AITraceRecord): ScorerRunInputForAgent {\n try {\n validateTrace(trace);\n const spanTree = buildSpanTree(trace.spans);\n\n // Find the root agent run span\n const rootAgentSpan = spanTree.rootSpans.find(span => span.spanType === 'agent_run') as AISpanRecord | undefined;\n\n if (!rootAgentSpan) {\n throw new Error('No root agent_run span found in trace');\n }\n\n const primaryLLMSpan = findPrimaryLLMSpan(spanTree, rootAgentSpan);\n const inputMessages = extractInputMessages(rootAgentSpan);\n const systemMessages = extractSystemMessages(primaryLLMSpan);\n\n // Extract remembered messages from LLM span (excluding current input)\n const currentInputContent = inputMessages[0]?.content || '';\n const rememberedMessages = extractRememberedMessages(primaryLLMSpan, currentInputContent);\n\n return {\n // We do not keep track of the tool call ids in traces, so we need to cast to UIMessageWithMetadata\n inputMessages: inputMessages as UIMessageWithMetadata[],\n rememberedMessages: rememberedMessages as UIMessageWithMetadata[],\n systemMessages,\n taggedSystemMessages: {}, // Todo: Support tagged system messages\n };\n } catch (error) {\n throw new Error(\n `Failed to transform trace to scorer input: ${error instanceof Error ? error.message : 'Unknown error'}`,\n );\n }\n}\n\n/**\n * Transform trace to scorer output format\n */\nexport function transformTraceToScorerOutput(trace: AITraceRecord): ScorerRunOutputForAgent {\n try {\n validateTrace(trace);\n const spanTree = buildSpanTree(trace.spans);\n\n const rootAgentSpan = spanTree.rootSpans.find(span => span.spanType === 'agent_run') as AISpanRecord | undefined;\n\n if (!rootAgentSpan) {\n throw new Error('No root agent_run span found in trace');\n }\n\n if (!rootAgentSpan.output) {\n throw new Error('Root agent span has no output');\n }\n\n const toolInvocations = reconstructToolInvocations(spanTree, rootAgentSpan.spanId);\n\n const responseText = rootAgentSpan.output.text || '';\n\n const responseMessage: TransformedUIMessage = {\n role: 'assistant',\n content: responseText,\n createdAt: new Date(rootAgentSpan.endedAt || rootAgentSpan.startedAt),\n // @ts-ignore\n parts: createMessageParts(toolInvocations, responseText),\n experimental_attachments: [],\n // Tool invocations are being deprecated however we need to support it for now\n toolInvocations: toolInvocations as unknown as ToolInvocation[],\n };\n\n // We do not keep track of the tool call ids in traces, so we need to cast to UIMessageWithMetadata\n return [responseMessage as UIMessageWithMetadata];\n } catch (error) {\n throw new Error(\n `Failed to transform trace to scorer output: ${error instanceof Error ? error.message : 'Unknown error'}`,\n );\n }\n}\n","import pMap from 'p-map';\nimport z from 'zod';\nimport { InternalSpans } from '../../ai-tracing';\nimport type { TracingContext } from '../../ai-tracing';\nimport { ErrorCategory, ErrorDomain, MastraError } from '../../error';\nimport type { AISpanRecord, AITraceRecord, MastraStorage } from '../../storage';\nimport { createStep, createWorkflow } from '../../workflows/evented';\nimport type { MastraScorer, ScorerRun } from '../base';\nimport type { ScoreRowData } from '../types';\nimport { saveScorePayloadSchema } from '../types';\nimport { transformTraceToScorerInput, transformTraceToScorerOutput } from './utils';\n\nconst getTraceStep = createStep({\n id: '__process-trace-scoring',\n inputSchema: z.object({\n targets: z.array(\n z.object({\n traceId: z.string(),\n spanId: z.string().optional(),\n }),\n ),\n scorerName: z.string(),\n }),\n outputSchema: z.any(),\n execute: async ({ inputData, tracingContext, mastra }) => {\n const logger = mastra.getLogger();\n if (!logger) {\n console.warn(\n '[scoreTracesWorkflow] Logger not initialized: no debug or error logs will be recorded for scoring traces.',\n );\n }\n\n const storage = mastra.getStorage();\n if (!storage) {\n const mastraError = new MastraError({\n id: 'MASTRA_STORAGE_NOT_FOUND_FOR_TRACE_SCORING',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: 'Storage not found for trace scoring',\n details: {\n scorerName: inputData.scorerName,\n },\n });\n logger?.error(mastraError.toString());\n logger?.trackException(mastraError);\n return;\n }\n\n let scorer: MastraScorer | undefined;\n try {\n scorer = mastra.getScorerByName(inputData.scorerName);\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: 'MASTRA_SCORER_NOT_FOUND_FOR_TRACE_SCORING',\n domain: ErrorDomain.SCORER,\n category: ErrorCategory.SYSTEM,\n text: `Scorer not found for trace scoring`,\n details: {\n scorerName: inputData.scorerName,\n },\n },\n error,\n );\n logger?.error(mastraError.toString());\n logger?.trackException(mastraError);\n return;\n }\n\n await pMap(\n inputData.targets,\n async target => {\n try {\n await runScorerOnTarget({ storage, scorer, target, tracingContext });\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: 'MASTRA_SCORER_FAILED_TO_RUN_SCORER_ON_TRACE',\n domain: ErrorDomain.SCORER,\n category: ErrorCategory.SYSTEM,\n details: {\n scorerName: scorer.name,\n spanId: target.spanId || '',\n traceId: target.traceId,\n },\n },\n error,\n );\n logger?.error(mastraError.toString());\n logger?.trackException(mastraError);\n }\n },\n { concurrency: 3 },\n );\n },\n});\n\nexport async function runScorerOnTarget({\n storage,\n scorer,\n target,\n tracingContext,\n}: {\n storage: MastraStorage;\n scorer: MastraScorer;\n target: { traceId: string; spanId?: string };\n tracingContext: TracingContext;\n}) {\n // TODO: add storage api to get a single span\n const trace = await storage.getAITrace(target.traceId);\n\n if (!trace) {\n throw new Error(`Trace not found for scoring, traceId: ${target.traceId}`);\n }\n\n let span: AISpanRecord | undefined;\n if (target.spanId) {\n span = trace.spans.find(span => span.spanId === target.spanId);\n } else {\n span = trace.spans.find(span => span.parentSpanId === null);\n }\n\n if (!span) {\n throw new Error(\n `Span not found for scoring, traceId: ${target.traceId}, spanId: ${target.spanId ?? 'Not provided'}`,\n );\n }\n\n const scorerRun = buildScorerRun({\n scorerType: scorer.type === 'agent' ? 'agent' : undefined,\n tracingContext,\n trace,\n targetSpan: span,\n });\n\n const result = await scorer.run(scorerRun);\n const traceId = `${target.traceId}${target.spanId ? `-${target.spanId}` : ''}`;\n const scorerResult = {\n ...result,\n scorer: {\n id: scorer.name,\n name: scorer.name,\n description: scorer.description,\n },\n traceId,\n entityId: span.name,\n entityType: span.spanType,\n entity: { traceId: span.traceId, spanId: span.spanId },\n source: 'TEST',\n scorerId: scorer.name,\n };\n\n const savedScoreRecord = await validateAndSaveScore({ storage, scorerResult });\n await attachScoreToSpan({ storage, span, scoreRecord: savedScoreRecord });\n}\n\nasync function validateAndSaveScore({ storage, scorerResult }: { storage: MastraStorage; scorerResult: ScorerRun }) {\n const payloadToSave = saveScorePayloadSchema.parse(scorerResult);\n const result = await storage.saveScore(payloadToSave);\n return result.score;\n}\n\nfunction buildScorerRun({\n scorerType,\n tracingContext,\n trace,\n targetSpan,\n}: {\n scorerType?: string;\n tracingContext: TracingContext;\n trace: AITraceRecord;\n targetSpan: AISpanRecord;\n}) {\n let runPayload: ScorerRun;\n if (scorerType === 'agent') {\n runPayload = {\n input: transformTraceToScorerInput(trace as any),\n output: transformTraceToScorerOutput(trace as any),\n };\n } else {\n runPayload = { input: targetSpan.input, output: targetSpan.output };\n }\n\n runPayload.tracingContext = tracingContext;\n return runPayload;\n}\n\nasync function attachScoreToSpan({\n storage,\n span,\n scoreRecord,\n}: {\n storage: MastraStorage;\n span: AISpanRecord;\n scoreRecord: ScoreRowData;\n}) {\n const existingLinks = span.links || [];\n const link = {\n type: 'score',\n scoreId: scoreRecord.id,\n scorerName: scoreRecord.scorer.name,\n score: scoreRecord.score,\n createdAt: scoreRecord.createdAt,\n };\n await storage.updateAISpan({\n spanId: span.spanId,\n traceId: span.traceId,\n updates: { links: [...existingLinks, link] },\n });\n}\n\nexport const scoreTracesWorkflow = createWorkflow({\n id: '__batch-scoring-traces',\n inputSchema: z.object({\n targets: z.array(\n z.object({\n traceId: z.string(),\n spanId: z.string().optional(),\n }),\n ),\n scorerName: z.string(),\n }),\n outputSchema: z.any(),\n steps: [getTraceStep],\n options: {\n tracingPolicy: {\n internal: InternalSpans.ALL,\n },\n },\n});\n\nscoreTracesWorkflow.then(getTraceStep).commit();\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scores/scoreTraces/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC"}
|