agentv 3.12.0 → 3.13.1
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/README.md +9 -10
- package/dist/{chunk-UYBLUYHN.js → chunk-K747KGDP.js} +64 -49
- package/dist/chunk-K747KGDP.js.map +1 -0
- package/dist/{chunk-VLOFRXH4.js → chunk-LSXO22CF.js} +17 -43
- package/dist/chunk-LSXO22CF.js.map +1 -0
- package/dist/{chunk-2ELQ6F3C.js → chunk-UK7UMQOX.js} +29 -34
- package/dist/chunk-UK7UMQOX.js.map +1 -0
- package/dist/cli.js +3 -4
- package/dist/cli.js.map +1 -1
- package/dist/{dist-L6R5HJ72.js → dist-LCZDS36N.js} +2 -6
- package/dist/index.js +3 -4
- package/dist/{interactive-5X62YEEX.js → interactive-76ZJVPI7.js} +3 -4
- package/dist/{interactive-5X62YEEX.js.map → interactive-76ZJVPI7.js.map} +1 -1
- package/package.json +1 -1
- package/dist/chunk-2ELQ6F3C.js.map +0 -1
- package/dist/chunk-NR7QVL75.js +0 -122
- package/dist/chunk-NR7QVL75.js.map +0 -1
- package/dist/chunk-UYBLUYHN.js.map +0 -1
- package/dist/chunk-VLOFRXH4.js.map +0 -1
- package/dist/simple-trace-file-exporter-CRIO5HDZ-QYYT2QQT.js +0 -9
- package/dist/simple-trace-file-exporter-CRIO5HDZ-QYYT2QQT.js.map +0 -1
- /package/dist/{dist-L6R5HJ72.js.map → dist-LCZDS36N.js.map} +0 -0
package/dist/chunk-NR7QVL75.js
DELETED
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
|
|
2
|
-
|
|
3
|
-
// ../../packages/core/dist/chunk-3G2KXH7N.js
|
|
4
|
-
import { createWriteStream } from "node:fs";
|
|
5
|
-
import { mkdir } from "node:fs/promises";
|
|
6
|
-
import { dirname } from "node:path";
|
|
7
|
-
var SimpleTraceFileExporter = class {
|
|
8
|
-
stream = null;
|
|
9
|
-
filePath;
|
|
10
|
-
streamReady = null;
|
|
11
|
-
pendingWrites = [];
|
|
12
|
-
_shuttingDown = false;
|
|
13
|
-
spansByTraceId = /* @__PURE__ */ new Map();
|
|
14
|
-
constructor(filePath) {
|
|
15
|
-
this.filePath = filePath;
|
|
16
|
-
}
|
|
17
|
-
async ensureStream() {
|
|
18
|
-
if (!this.streamReady) {
|
|
19
|
-
this.streamReady = (async () => {
|
|
20
|
-
await mkdir(dirname(this.filePath), { recursive: true });
|
|
21
|
-
this.stream = createWriteStream(this.filePath, { flags: "w" });
|
|
22
|
-
return this.stream;
|
|
23
|
-
})();
|
|
24
|
-
}
|
|
25
|
-
return this.streamReady;
|
|
26
|
-
}
|
|
27
|
-
export(spans, resultCallback) {
|
|
28
|
-
if (this._shuttingDown) {
|
|
29
|
-
resultCallback({ code: 0 });
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
const rootSpans = [];
|
|
33
|
-
for (const span of spans) {
|
|
34
|
-
const traceId = span.spanContext().traceId;
|
|
35
|
-
const existing = this.spansByTraceId.get(traceId) ?? [];
|
|
36
|
-
existing.push(span);
|
|
37
|
-
this.spansByTraceId.set(traceId, existing);
|
|
38
|
-
if (span.name === "agentv.eval") {
|
|
39
|
-
rootSpans.push(span);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
const writePromise = this.ensureStream().then((stream) => {
|
|
43
|
-
for (const root of rootSpans) {
|
|
44
|
-
const traceId = root.spanContext().traceId;
|
|
45
|
-
const traceSpans = this.spansByTraceId.get(traceId) ?? [root];
|
|
46
|
-
const children = traceSpans.filter(
|
|
47
|
-
(span) => span.spanContext().spanId !== root.spanContext().spanId
|
|
48
|
-
);
|
|
49
|
-
const record = this.buildSimpleRecord(root, children);
|
|
50
|
-
stream.write(`${JSON.stringify(record)}
|
|
51
|
-
`);
|
|
52
|
-
this.spansByTraceId.delete(traceId);
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
this.pendingWrites.push(writePromise);
|
|
56
|
-
resultCallback({ code: 0 });
|
|
57
|
-
}
|
|
58
|
-
async shutdown() {
|
|
59
|
-
this._shuttingDown = true;
|
|
60
|
-
await Promise.all(this.pendingWrites);
|
|
61
|
-
this.pendingWrites = [];
|
|
62
|
-
this.spansByTraceId.clear();
|
|
63
|
-
return new Promise((resolve) => {
|
|
64
|
-
if (this.stream) {
|
|
65
|
-
this.stream.end(() => resolve());
|
|
66
|
-
} else {
|
|
67
|
-
resolve();
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
async forceFlush() {
|
|
72
|
-
await Promise.all(this.pendingWrites);
|
|
73
|
-
this.pendingWrites = [];
|
|
74
|
-
}
|
|
75
|
-
buildSimpleRecord(root, children) {
|
|
76
|
-
const attrs = root.attributes || {};
|
|
77
|
-
const durationMs = typeof attrs["agentv.trace.duration_ms"] === "number" ? attrs["agentv.trace.duration_ms"] : hrTimeDiffMs(root.startTime, root.endTime);
|
|
78
|
-
let inputTokens = 0;
|
|
79
|
-
let outputTokens = 0;
|
|
80
|
-
for (const child of children) {
|
|
81
|
-
const ca = child.attributes || {};
|
|
82
|
-
if (ca["gen_ai.usage.input_tokens"]) inputTokens += ca["gen_ai.usage.input_tokens"];
|
|
83
|
-
if (ca["gen_ai.usage.output_tokens"]) outputTokens += ca["gen_ai.usage.output_tokens"];
|
|
84
|
-
}
|
|
85
|
-
const rootInputTokens = typeof attrs["agentv.trace.token_input"] === "number" ? attrs["agentv.trace.token_input"] : 0;
|
|
86
|
-
const rootOutputTokens = typeof attrs["agentv.trace.token_output"] === "number" ? attrs["agentv.trace.token_output"] : 0;
|
|
87
|
-
const rootCachedTokens = typeof attrs["agentv.trace.token_cached"] === "number" ? attrs["agentv.trace.token_cached"] : void 0;
|
|
88
|
-
const llmSpans = children.filter((s) => s.attributes?.["gen_ai.operation.name"] === "chat").map((s) => ({
|
|
89
|
-
type: "llm",
|
|
90
|
-
name: s.name,
|
|
91
|
-
duration_ms: hrTimeDiffMs(s.startTime, s.endTime)
|
|
92
|
-
}));
|
|
93
|
-
const toolSpans = children.filter((s) => s.attributes?.["gen_ai.tool.name"]).map((s) => ({
|
|
94
|
-
type: "tool",
|
|
95
|
-
name: s.attributes["gen_ai.tool.name"],
|
|
96
|
-
duration_ms: hrTimeDiffMs(s.startTime, s.endTime)
|
|
97
|
-
}));
|
|
98
|
-
return {
|
|
99
|
-
test_id: attrs["agentv.test_id"],
|
|
100
|
-
target: attrs["agentv.target"],
|
|
101
|
-
score: attrs["agentv.score"],
|
|
102
|
-
duration_ms: durationMs,
|
|
103
|
-
cost_usd: attrs["agentv.trace.cost_usd"],
|
|
104
|
-
token_usage: inputTokens || outputTokens || rootInputTokens || rootOutputTokens || rootCachedTokens ? {
|
|
105
|
-
input: inputTokens || rootInputTokens,
|
|
106
|
-
output: outputTokens || rootOutputTokens,
|
|
107
|
-
...rootCachedTokens ? { cached: rootCachedTokens } : {}
|
|
108
|
-
} : void 0,
|
|
109
|
-
spans: [...llmSpans, ...toolSpans].length > 0 ? [...llmSpans, ...toolSpans] : void 0
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
};
|
|
113
|
-
function hrTimeDiffMs(start, end) {
|
|
114
|
-
const diffSec = end[0] - start[0];
|
|
115
|
-
const diffNano = end[1] - start[1];
|
|
116
|
-
return Math.round(diffSec * 1e3 + diffNano / 1e6);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
export {
|
|
120
|
-
SimpleTraceFileExporter
|
|
121
|
-
};
|
|
122
|
-
//# sourceMappingURL=chunk-NR7QVL75.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../packages/core/src/observability/simple-trace-file-exporter.ts"],"sourcesContent":["import { type WriteStream, createWriteStream } from 'node:fs';\nimport { mkdir } from 'node:fs/promises';\nimport { dirname } from 'node:path';\n\n// biome-ignore lint/suspicious/noExplicitAny: OTel ReadableSpan loaded dynamically\ntype ReadableSpan = any;\n\n/**\n * SpanExporter that writes human-readable JSONL (one line per root span).\n * Designed for quick debugging and analysis without OTel tooling.\n */\nexport class SimpleTraceFileExporter {\n private stream: WriteStream | null = null;\n private filePath: string;\n private streamReady: Promise<WriteStream> | null = null;\n private pendingWrites: Promise<void>[] = [];\n private _shuttingDown = false;\n private spansByTraceId = new Map<string, ReadableSpan[]>();\n\n constructor(filePath: string) {\n this.filePath = filePath;\n }\n\n private async ensureStream(): Promise<WriteStream> {\n if (!this.streamReady) {\n this.streamReady = (async () => {\n await mkdir(dirname(this.filePath), { recursive: true });\n this.stream = createWriteStream(this.filePath, { flags: 'w' });\n return this.stream;\n })();\n }\n return this.streamReady;\n }\n\n export(spans: ReadableSpan[], resultCallback: (result: { code: number }) => void): void {\n if (this._shuttingDown) {\n resultCallback({ code: 0 });\n return;\n }\n const rootSpans: ReadableSpan[] = [];\n for (const span of spans) {\n const traceId = span.spanContext().traceId;\n const existing = this.spansByTraceId.get(traceId) ?? [];\n existing.push(span);\n this.spansByTraceId.set(traceId, existing);\n if (span.name === 'agentv.eval') {\n rootSpans.push(span);\n }\n }\n\n const writePromise = this.ensureStream().then((stream) => {\n for (const root of rootSpans) {\n const traceId = root.spanContext().traceId;\n const traceSpans = this.spansByTraceId.get(traceId) ?? [root];\n const children = traceSpans.filter(\n (span) => span.spanContext().spanId !== root.spanContext().spanId,\n );\n const record = this.buildSimpleRecord(root, children);\n stream.write(`${JSON.stringify(record)}\\n`);\n this.spansByTraceId.delete(traceId);\n }\n });\n this.pendingWrites.push(writePromise);\n\n resultCallback({ code: 0 });\n }\n\n async shutdown(): Promise<void> {\n this._shuttingDown = true;\n await Promise.all(this.pendingWrites);\n this.pendingWrites = [];\n this.spansByTraceId.clear();\n return new Promise((resolve) => {\n if (this.stream) {\n this.stream.end(() => resolve());\n } else {\n resolve();\n }\n });\n }\n\n async forceFlush(): Promise<void> {\n await Promise.all(this.pendingWrites);\n this.pendingWrites = [];\n }\n\n private buildSimpleRecord(root: ReadableSpan, children: ReadableSpan[]): Record<string, unknown> {\n const attrs = root.attributes || {};\n const durationMs =\n typeof attrs['agentv.trace.duration_ms'] === 'number'\n ? attrs['agentv.trace.duration_ms']\n : hrTimeDiffMs(root.startTime, root.endTime);\n\n let inputTokens = 0;\n let outputTokens = 0;\n for (const child of children) {\n const ca = child.attributes || {};\n if (ca['gen_ai.usage.input_tokens']) inputTokens += ca['gen_ai.usage.input_tokens'];\n if (ca['gen_ai.usage.output_tokens']) outputTokens += ca['gen_ai.usage.output_tokens'];\n }\n const rootInputTokens =\n typeof attrs['agentv.trace.token_input'] === 'number' ? attrs['agentv.trace.token_input'] : 0;\n const rootOutputTokens =\n typeof attrs['agentv.trace.token_output'] === 'number'\n ? attrs['agentv.trace.token_output']\n : 0;\n const rootCachedTokens =\n typeof attrs['agentv.trace.token_cached'] === 'number'\n ? attrs['agentv.trace.token_cached']\n : undefined;\n\n const llmSpans = children\n .filter((s: ReadableSpan) => s.attributes?.['gen_ai.operation.name'] === 'chat')\n .map((s: ReadableSpan) => ({\n type: 'llm' as const,\n name: s.name,\n duration_ms: hrTimeDiffMs(s.startTime, s.endTime),\n }));\n\n const toolSpans = children\n .filter((s: ReadableSpan) => s.attributes?.['gen_ai.tool.name'])\n .map((s: ReadableSpan) => ({\n type: 'tool' as const,\n name: s.attributes['gen_ai.tool.name'],\n duration_ms: hrTimeDiffMs(s.startTime, s.endTime),\n }));\n\n return {\n test_id: attrs['agentv.test_id'],\n target: attrs['agentv.target'],\n score: attrs['agentv.score'],\n duration_ms: durationMs,\n cost_usd: attrs['agentv.trace.cost_usd'],\n token_usage:\n inputTokens || outputTokens || rootInputTokens || rootOutputTokens || rootCachedTokens\n ? {\n input: inputTokens || rootInputTokens,\n output: outputTokens || rootOutputTokens,\n ...(rootCachedTokens ? { cached: rootCachedTokens } : {}),\n }\n : undefined,\n spans: [...llmSpans, ...toolSpans].length > 0 ? [...llmSpans, ...toolSpans] : undefined,\n };\n }\n}\n\nfunction hrTimeDiffMs(start: [number, number], end: [number, number]): number {\n const diffSec = end[0] - start[0];\n const diffNano = end[1] - start[1];\n return Math.round(diffSec * 1000 + diffNano / 1_000_000);\n}\n"],"mappings":"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","names":[]}
|