@koda-sl/baker-bridge 0.65.0 → 0.66.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 +23 -8
- package/dist/hono/bridge-job.d.ts +4 -0
- package/dist/hono/bridge-job.d.ts.map +1 -1
- package/dist/hono/bridge-job.js +64 -11
- package/dist/hono/bridge-job.js.map +1 -1
- package/dist/hono/bridge-job.test.js +46 -0
- package/dist/hono/bridge-job.test.js.map +1 -1
- package/dist/hono/relay.d.ts +4 -0
- package/dist/hono/relay.d.ts.map +1 -1
- package/dist/hono/relay.js +1 -0
- package/dist/hono/relay.js.map +1 -1
- package/dist/hono/turn-model-usage.d.ts +49 -0
- package/dist/hono/turn-model-usage.d.ts.map +1 -0
- package/dist/hono/turn-model-usage.js +71 -0
- package/dist/hono/turn-model-usage.js.map +1 -0
- package/dist/hono/turn-model-usage.test.d.ts +2 -0
- package/dist/hono/turn-model-usage.test.d.ts.map +1 -0
- package/dist/hono/turn-model-usage.test.js +88 -0
- package/dist/hono/turn-model-usage.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { addQueryModelUsage, queryModelUsage, turnModelUsageList } from "./turn-model-usage.js";
|
|
3
|
+
function usage(overrides = {}) {
|
|
4
|
+
return {
|
|
5
|
+
inputTokens: 0,
|
|
6
|
+
outputTokens: 0,
|
|
7
|
+
cacheReadInputTokens: 0,
|
|
8
|
+
cacheCreationInputTokens: 0,
|
|
9
|
+
webSearchRequests: 0,
|
|
10
|
+
costUSD: 0,
|
|
11
|
+
contextWindow: 200_000,
|
|
12
|
+
maxOutputTokens: 8_192,
|
|
13
|
+
...overrides,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function totals(entries, model) {
|
|
17
|
+
return entries?.find((entry) => entry.model === model);
|
|
18
|
+
}
|
|
19
|
+
describe("queryModelUsage", () => {
|
|
20
|
+
it("records each model that served part of the query", () => {
|
|
21
|
+
const snapshot = queryModelUsage({
|
|
22
|
+
"claude-opus-4-8": usage({ inputTokens: 100, outputTokens: 200, costUSD: 0.5 }),
|
|
23
|
+
"claude-haiku-4-5": usage({ inputTokens: 10, outputTokens: 5, costUSD: 0.001 }),
|
|
24
|
+
});
|
|
25
|
+
const list = turnModelUsageList(snapshot) ?? [];
|
|
26
|
+
expect(list).toHaveLength(2);
|
|
27
|
+
expect(totals(list, "claude-opus-4-8")?.outputTokens).toBe(200);
|
|
28
|
+
expect(totals(list, "claude-haiku-4-5")?.inputTokens).toBe(10);
|
|
29
|
+
});
|
|
30
|
+
it("rolls provider-specific aliases up under the canonical model id", () => {
|
|
31
|
+
const snapshot = queryModelUsage({
|
|
32
|
+
"anthropic/claude-opus-4-8": usage({ inputTokens: 100, canonicalModel: "claude-opus-4-8" }),
|
|
33
|
+
"us.anthropic.claude-opus-4-8-v1:0": usage({ inputTokens: 40, canonicalModel: "claude-opus-4-8" }),
|
|
34
|
+
});
|
|
35
|
+
const list = turnModelUsageList(snapshot) ?? [];
|
|
36
|
+
expect(list).toHaveLength(1);
|
|
37
|
+
expect(list[0]?.model).toBe("claude-opus-4-8");
|
|
38
|
+
expect(list[0]?.inputTokens).toBe(140);
|
|
39
|
+
});
|
|
40
|
+
it("carries cache reads and creations separately from fresh input", () => {
|
|
41
|
+
const snapshot = queryModelUsage({
|
|
42
|
+
opus: usage({ inputTokens: 12, cacheReadInputTokens: 40_000, cacheCreationInputTokens: 2_000 }),
|
|
43
|
+
});
|
|
44
|
+
const entry = totals(turnModelUsageList(snapshot), "opus");
|
|
45
|
+
expect(entry?.inputTokens).toBe(12);
|
|
46
|
+
expect(entry?.cacheReadInputTokens).toBe(40_000);
|
|
47
|
+
expect(entry?.cacheCreationInputTokens).toBe(2_000);
|
|
48
|
+
});
|
|
49
|
+
it("is empty for a missing modelUsage block", () => {
|
|
50
|
+
expect(turnModelUsageList(queryModelUsage(undefined))).toBeUndefined();
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
describe("addQueryModelUsage", () => {
|
|
54
|
+
it("sums separate query invocations, because a stalled turn resumes in a fresh query", () => {
|
|
55
|
+
const turn = new Map();
|
|
56
|
+
addQueryModelUsage(turn, queryModelUsage({ opus: usage({ inputTokens: 100, outputTokens: 50, costUSD: 0.2 }) }));
|
|
57
|
+
addQueryModelUsage(turn, queryModelUsage({ opus: usage({ inputTokens: 30, outputTokens: 20, costUSD: 0.1 }) }));
|
|
58
|
+
const entry = totals(turnModelUsageList(turn), "opus");
|
|
59
|
+
expect(entry?.inputTokens).toBe(130);
|
|
60
|
+
expect(entry?.outputTokens).toBe(70);
|
|
61
|
+
expect(entry?.costUsd).toBeCloseTo(0.3, 10);
|
|
62
|
+
});
|
|
63
|
+
it("does NOT double-count cumulative snapshots from the same query", () => {
|
|
64
|
+
// A single query emits several result messages when a settled task wakes the
|
|
65
|
+
// model; each is cumulative, so the caller keeps only the latest and folds it
|
|
66
|
+
// once. Folding just that latest snapshot must not inflate the turn total.
|
|
67
|
+
const first = queryModelUsage({ opus: usage({ inputTokens: 100, outputTokens: 50, costUSD: 0.2 }) });
|
|
68
|
+
const second = queryModelUsage({ opus: usage({ inputTokens: 160, outputTokens: 90, costUSD: 0.35 }) });
|
|
69
|
+
expect(first).toBeDefined();
|
|
70
|
+
const turn = new Map();
|
|
71
|
+
addQueryModelUsage(turn, second);
|
|
72
|
+
const entry = totals(turnModelUsageList(turn), "opus");
|
|
73
|
+
expect(entry?.inputTokens).toBe(160);
|
|
74
|
+
expect(entry?.outputTokens).toBe(90);
|
|
75
|
+
expect(entry?.costUsd).toBeCloseTo(0.35, 10);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
describe("turnModelUsageList", () => {
|
|
79
|
+
it("drops an entry with neither tokens nor cost", () => {
|
|
80
|
+
const turn = addQueryModelUsage(new Map(), queryModelUsage({ "router-probe": usage() }));
|
|
81
|
+
expect(turnModelUsageList(turn)).toBeUndefined();
|
|
82
|
+
});
|
|
83
|
+
it("keeps a zero-token entry that still cost money", () => {
|
|
84
|
+
const turn = addQueryModelUsage(new Map(), queryModelUsage({ "web-search": usage({ costUSD: 0.01 }) }));
|
|
85
|
+
expect(turnModelUsageList(turn)?.map((entry) => entry.model)).toEqual(["web-search"]);
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=turn-model-usage.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn-model-usage.test.js","sourceRoot":"","sources":["../../src/hono/turn-model-usage.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED