Skip to content

Commit dbe859e

Browse files
committed
refactor: update usage types to ModelUsage in session
1 parent 9588313 commit dbe859e

2 files changed

Lines changed: 22 additions & 11 deletions

File tree

src/session.ts

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,11 @@ function addUsageValue(current: unknown, next: unknown): unknown {
6565
return next;
6666
}
6767

68-
function accumulateUsage(current: unknown | null, next: unknown | null | undefined): unknown | null {
68+
function accumulateUsage(current: ModelUsage | null, next: unknown | null | undefined): ModelUsage | null {
6969
if (next == null) {
7070
return current ?? null;
7171
}
72-
return addUsageValue(current, next);
72+
return addUsageValue(current, next) as ModelUsage;
7373
}
7474

7575
function getExtensionRoot(): string {
@@ -81,7 +81,7 @@ function getExtensionRoot(): string {
8181
return path.resolve(path.dirname(currentFilePath), "..");
8282
}
8383

84-
function getTotalTokens(usage: unknown | null | undefined): number {
84+
function getTotalTokens(usage: ModelUsage | null | undefined): number {
8585
if (!isUsageRecord(usage)) {
8686
return 0;
8787
}
@@ -91,6 +91,17 @@ function getTotalTokens(usage: unknown | null | undefined): number {
9191

9292
export type SessionStatus = "failed" | "pending" | "processing" | "waiting_for_user" | "completed" | "interrupted";
9393

94+
export type ModelUsage = {
95+
prompt_tokens: number;
96+
completion_tokens: number;
97+
total_tokens: number;
98+
completion_tokens_details?: Record<string, unknown>;
99+
prompt_tokens_details?: Record<string, unknown>;
100+
prompt_cache_hit_tokens?: number;
101+
prompt_cache_miss_tokens?: number;
102+
total_reqs?: number;
103+
};
104+
94105
export type SessionEntry = {
95106
id: string;
96107
summary: string | null;
@@ -100,7 +111,7 @@ export type SessionEntry = {
100111
toolCalls: unknown[] | null;
101112
status: SessionStatus;
102113
failReason: string | null;
103-
usage: unknown | null;
114+
usage: ModelUsage | null;
104115
activeTokens: number;
105116
createTime: string;
106117
updateTime: string;
@@ -286,7 +297,7 @@ export class SessionManager {
286297
debug?: ChatCompletionDebugOptions
287298
): Promise<{
288299
choices?: Array<{ message?: Record<string, unknown> }>;
289-
usage?: unknown;
300+
usage?: ModelUsage | null;
290301
}> {
291302
const requestId = crypto.randomUUID();
292303
const startedAt = new Date().toISOString();
@@ -355,13 +366,13 @@ export class SessionManager {
355366
request: streamRequest,
356367
response,
357368
});
358-
return response as { choices?: Array<{ message?: Record<string, unknown> }>; usage?: unknown };
369+
return response as { choices?: Array<{ message?: Record<string, unknown> }>; usage?: ModelUsage | null };
359370
}
360371

361372
let content = "";
362373
let reasoningContent = "";
363374
let refusal: string | null = null;
364-
let usage: unknown = null;
375+
let usage: ModelUsage | null = null;
365376
const responseChunks: unknown[] = [];
366377
const toolCallsByIndex = new Map<
367378
number,
@@ -386,7 +397,7 @@ export class SessionManager {
386397
responseChunks.push(chunk);
387398
}
388399
if ("usage" in chunk && chunk.usage != null) {
389-
usage = chunk.usage;
400+
usage = chunk.usage as ModelUsage;
390401
}
391402

392403
const choices = Array.isArray(chunk.choices) ? chunk.choices : [];
@@ -2096,7 +2107,7 @@ ${skillMd}
20962107
toolCalls: Array.isArray(value.toolCalls) ? value.toolCalls : null,
20972108
status: this.normalizeSessionStatus(value.status),
20982109
failReason: typeof value.failReason === "string" ? value.failReason : null,
2099-
usage: value.usage ?? null,
2110+
usage: (value.usage as ModelUsage) ?? null,
21002111
activeTokens: typeof value.activeTokens === "number" ? value.activeTokens : 0,
21012112
createTime: typeof value.createTime === "string" ? value.createTime : new Date().toISOString(),
21022113
updateTime: typeof value.updateTime === "string" ? value.updateTime : new Date().toISOString(),

src/tests/exitSummary.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { test } from "node:test";
22
import assert from "node:assert/strict";
33
import { buildExitSummaryText } from "../ui";
4-
import type { SessionEntry, SessionMessage } from "../session";
4+
import type { SessionEntry, SessionMessage, ModelUsage } from "../session";
55

66
const stripAnsi = (text: string): string => text.replace(/\u001b\[[0-9;]*m/g, "");
77

@@ -33,7 +33,7 @@ test("buildExitSummaryText only shows Goodbye and model usage with cached tokens
3333
assert.doesNotMatch(summary, /Reasoning Tokens/);
3434
});
3535

36-
function buildSession(usage: unknown): SessionEntry {
36+
function buildSession(usage: ModelUsage | null): SessionEntry {
3737
return {
3838
id: "session-1",
3939
summary: null,

0 commit comments

Comments
 (0)