7ea7b53783
* Track Copilot premium requests with model multipliers * refactor(copilot): source premium multipliers from models.json * feat(copilot): add gpt-5.3-codex bundled model * fix(stats): round premium request totals in summary * fix(stats): round premium requests in sync summary
124 lines
3.2 KiB
TypeScript
124 lines
3.2 KiB
TypeScript
import { describe, expect, it } from "bun:test";
|
|
import { SessionManager } from "@oh-my-pi/pi-coding-agent/session/session-manager";
|
|
|
|
describe("SessionManager usage statistics", () => {
|
|
it("accumulates premium requests from assistant messages and task tool results", () => {
|
|
const session = SessionManager.inMemory();
|
|
|
|
session.appendMessage({ role: "user", content: "hello", timestamp: 1 });
|
|
session.appendMessage({
|
|
role: "assistant",
|
|
content: [{ type: "text", text: "hi" }],
|
|
api: "openai-completions",
|
|
provider: "github-copilot",
|
|
model: "gpt-4o",
|
|
usage: {
|
|
input: 10,
|
|
output: 5,
|
|
cacheRead: 0,
|
|
cacheWrite: 0,
|
|
totalTokens: 15,
|
|
premiumRequests: 1,
|
|
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
|
|
},
|
|
stopReason: "stop",
|
|
timestamp: 2,
|
|
});
|
|
session.appendMessage({
|
|
role: "toolResult",
|
|
toolCallId: "task_1",
|
|
toolName: "task",
|
|
content: [{ type: "text", text: "task output" }],
|
|
details: {
|
|
usage: {
|
|
input: 2,
|
|
output: 3,
|
|
cacheRead: 0,
|
|
cacheWrite: 0,
|
|
totalTokens: 5,
|
|
premiumRequests: 2,
|
|
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
|
|
},
|
|
},
|
|
isError: false,
|
|
timestamp: 3,
|
|
});
|
|
|
|
const usage = session.getUsageStatistics();
|
|
expect(usage.input).toBe(12);
|
|
expect(usage.output).toBe(8);
|
|
expect(usage.premiumRequests).toBe(3);
|
|
});
|
|
|
|
it("preserves fractional premium request multipliers", () => {
|
|
const session = SessionManager.inMemory();
|
|
|
|
session.appendMessage({ role: "user", content: "hello", timestamp: 1 });
|
|
session.appendMessage({
|
|
role: "assistant",
|
|
content: [{ type: "text", text: "haiku" }],
|
|
api: "anthropic-messages",
|
|
provider: "github-copilot",
|
|
model: "claude-haiku-4.5",
|
|
usage: {
|
|
input: 10,
|
|
output: 5,
|
|
cacheRead: 0,
|
|
cacheWrite: 0,
|
|
totalTokens: 15,
|
|
premiumRequests: 0.33,
|
|
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
|
|
},
|
|
stopReason: "stop",
|
|
timestamp: 2,
|
|
});
|
|
session.appendMessage({
|
|
role: "toolResult",
|
|
toolCallId: "task_1",
|
|
toolName: "task",
|
|
content: [{ type: "text", text: "task output" }],
|
|
details: {
|
|
usage: {
|
|
input: 2,
|
|
output: 3,
|
|
cacheRead: 0,
|
|
cacheWrite: 0,
|
|
totalTokens: 5,
|
|
premiumRequests: 3,
|
|
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
|
|
},
|
|
},
|
|
isError: false,
|
|
timestamp: 3,
|
|
});
|
|
|
|
const usage = session.getUsageStatistics();
|
|
expect(usage.premiumRequests).toBeCloseTo(3.33, 8);
|
|
});
|
|
it("defaults premium requests to zero when usage payload omits the field", () => {
|
|
const session = SessionManager.inMemory();
|
|
|
|
session.appendMessage({ role: "user", content: "hello", timestamp: 1 });
|
|
session.appendMessage({
|
|
role: "assistant",
|
|
content: [{ type: "text", text: "hi" }],
|
|
api: "openai-completions",
|
|
provider: "openai",
|
|
model: "gpt-4o",
|
|
usage: {
|
|
input: 10,
|
|
output: 5,
|
|
cacheRead: 0,
|
|
cacheWrite: 0,
|
|
totalTokens: 15,
|
|
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
|
|
},
|
|
stopReason: "stop",
|
|
timestamp: 2,
|
|
});
|
|
|
|
const usage = session.getUsageStatistics();
|
|
expect(usage.premiumRequests).toBe(0);
|
|
});
|
|
});
|