@sema-agent/core
Version:
Stateless, task-oriented AI agent core
86 lines (85 loc) • 3.49 kB
JavaScript
export function buildCumulativeStats(base, acc) {
return {
...base,
tokens: acc.tokens,
turns: acc.turns,
promptTokens: acc.promptTokens || undefined,
totalInputTokens: acc.totalInputTokens || undefined,
cachedTokens: acc.cachedTokens || undefined,
outputTokens: acc.outputTokens || undefined,
cacheWriteTokens: acc.cacheWriteTokens || undefined,
cacheWriteTokensLong: acc.cacheWriteTokensLong || undefined,
cacheHitRate: acc.totalInputTokens > 0 ? Math.min(1, acc.cachedTokens / acc.totalInputTokens) : undefined,
costMicroUsd: acc.anyLegUnpriced ? undefined : acc.costMicroUsd,
nested: acc.nested.tokens > 0 || acc.nested.tasks > 0
? { tokens: acc.nested.tokens, turns: acc.nested.turns, tasks: acc.nested.tasks, costMicroUsd: acc.nested.costMicroUsd || undefined }
: undefined,
costBreakdown: acc.anyLegUnpriced
? undefined
: {
llmRootMicroUsd: acc.llmRootMicroUsd,
nestedSubagentMicroUsd: acc.nested.costMicroUsd,
memoryConsolidationMicroUsd: 0,
compactionMicroUsd: acc.compactionMicroUsd,
},
humanReview: acc.humanReview.count > 0
? { count: acc.humanReview.count, totalWaitMs: acc.humanReview.totalWaitMs, gates: acc.humanReview.gates }
: undefined,
};
}
export function createCumulativeStatsTracker() {
let legs = 0;
const acc = {
tokens: 0,
turns: 0,
promptTokens: 0,
totalInputTokens: 0,
cachedTokens: 0,
outputTokens: 0,
cacheWriteTokens: 0,
cacheWriteTokensLong: 0,
costMicroUsd: 0,
anyLegUnpriced: false,
llmRootMicroUsd: 0,
compactionMicroUsd: 0,
nested: { tokens: 0, turns: 0, tasks: 0, costMicroUsd: 0 },
humanReview: { count: 0, totalWaitMs: 0, gates: [] },
};
return {
get legs() {
return legs;
},
add(s) {
legs += 1;
acc.tokens += s.tokens;
acc.turns += s.turns;
acc.promptTokens += s.promptTokens ?? 0;
acc.totalInputTokens += s.totalInputTokens ?? 0;
acc.cachedTokens += s.cachedTokens ?? 0;
acc.outputTokens += s.outputTokens ?? 0;
acc.cacheWriteTokens += s.cacheWriteTokens ?? 0;
acc.cacheWriteTokensLong += s.cacheWriteTokensLong ?? 0;
acc.costMicroUsd = (acc.costMicroUsd ?? 0) + (s.costMicroUsd ?? 0);
if (s.costMicroUsd === undefined)
acc.anyLegUnpriced = true;
if (s.costBreakdown) {
acc.llmRootMicroUsd += s.costBreakdown.llmRootMicroUsd;
acc.compactionMicroUsd += s.costBreakdown.compactionMicroUsd;
}
if (s.humanReview) {
acc.humanReview.count += s.humanReview.count;
acc.humanReview.totalWaitMs += s.humanReview.totalWaitMs;
acc.humanReview.gates.push(...s.humanReview.gates);
}
if (s.nested) {
acc.nested.tokens += s.nested.tokens;
acc.nested.turns += s.nested.turns;
acc.nested.tasks += s.nested.tasks;
acc.nested.costMicroUsd += s.nested.costMicroUsd ?? 0;
}
},
build(base) {
return buildCumulativeStats(base, acc);
},
};
}