Files

75 lines
2.1 KiB
TypeScript
Raw Permalink Normal View History

import { describe, it } from "node:test";
import assert from "node:assert/strict";
import {
parseTokenUsageFromLines,
formatExactCount,
formatTokenBreakdownLine,
parseUsageObject,
} from "../src/token-usage.js";
describe("token-usage", () => {
it("parses turn_completed usage with cache", () => {
const lines = [
JSON.stringify({
method: "session/update",
params: {
update: {
sessionUpdate: "turn_completed",
usage: {
inputTokens: 1000,
outputTokens: 50,
cachedReadTokens: 800,
reasoningTokens: 20,
totalTokens: 1050,
modelCalls: 2,
},
},
},
}),
JSON.stringify({
method: "_x.ai/session/update",
params: {
update: {
sessionUpdate: "turn_completed",
usage: {
inputTokens: 974820,
outputTokens: 15706,
cachedReadTokens: 944000,
reasoningTokens: 9717,
totalTokens: 990526,
modelCalls: 9,
},
},
},
}),
];
const r = parseTokenUsageFromLines(lines);
assert.equal(r.turnCount, 2);
assert.ok(r.lastTurn);
assert.equal(r.lastTurn!.inputTokens, 974820);
assert.equal(r.lastTurn!.outputTokens, 15706);
assert.equal(r.lastTurn!.cachedReadTokens, 944000);
assert.equal(r.lastTurn!.reasoningTokens, 9717);
assert.ok(r.lastTurn!.cacheHitPct > 90);
assert.equal(r.session.inputTokens, 1000 + 974820);
assert.equal(r.session.outputTokens, 50 + 15706);
});
it("formats exact digits and breakdown line", () => {
assert.equal(formatExactCount(974820), "974,820");
const line = formatTokenBreakdownLine(
parseUsageObject({
inputTokens: 974820,
outputTokens: 15706,
cachedReadTokens: 944000,
reasoningTokens: 9717,
}),
{ mode: "exact" },
);
assert.match(line, /TOK IN 974,820/);
assert.match(line, /OUT 15,706/);
assert.match(line, /CACHE 944,000 \(97%\)/);
assert.match(line, /REASON 9,717/);
});
});