Skip to content

Commit b511271

Browse files
committed
fix(usage): type chat-completions usage details
1 parent 14e3de8 commit b511271

2 files changed

Lines changed: 15 additions & 20 deletions

File tree

src/agents/usage.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,14 @@ export type NormalizedUsage = {
5050
total?: number;
5151
};
5252

53+
export type OpenAiChatCompletionsUsage = {
54+
prompt_tokens: number;
55+
completion_tokens: number;
56+
total_tokens: number;
57+
prompt_tokens_details?: { cached_tokens: number };
58+
completion_tokens_details?: { reasoning_tokens: number };
59+
};
60+
5361
export type AssistantUsageSnapshot = {
5462
input: number;
5563
output: number;
@@ -201,13 +209,9 @@ export function normalizeUsage(raw?: UsageLike | null): NormalizedUsage | undefi
201209
* cost. Field name and shape match OpenAI's documented usage breakdown:
202210
* https://platform.openai.com/docs/guides/prompt-caching
203211
*/
204-
export function toOpenAiChatCompletionsUsage(usage: NormalizedUsage | undefined): {
205-
prompt_tokens: number;
206-
completion_tokens: number;
207-
total_tokens: number;
208-
prompt_tokens_details?: { cached_tokens: number };
209-
completion_tokens_details?: { reasoning_tokens: number };
210-
} {
212+
export function toOpenAiChatCompletionsUsage(
213+
usage: NormalizedUsage | undefined,
214+
): OpenAiChatCompletionsUsage {
211215
const input = usage?.input ?? 0;
212216
const output = usage?.output ?? 0;
213217
const cacheRead = usage?.cacheRead ?? 0;

src/gateway/openai-http.ts

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
normalizeUsage,
1010
toOpenAiChatCompletionsUsage,
1111
type NormalizedUsage,
12+
type OpenAiChatCompletionsUsage,
1213
} from "../agents/usage.js";
1314
import { createDefaultDeps } from "../cli/deps.js";
1415
import { agentCommandFromIngress } from "../commands/agent.js";
@@ -348,7 +349,7 @@ function writeUsageChunk(
348349
params: {
349350
runId: string;
350351
model: string;
351-
usage: { prompt_tokens: number; completion_tokens: number; total_tokens: number };
352+
usage: OpenAiChatCompletionsUsage;
352353
},
353354
) {
354355
writeSse(res, {
@@ -767,11 +768,7 @@ function resolveStopReasonAndPendingToolCalls(meta: unknown): {
767768
return { stopReason, pendingToolCalls };
768769
}
769770

770-
function resolveChatCompletionUsage(result: unknown): {
771-
prompt_tokens: number;
772-
completion_tokens: number;
773-
total_tokens: number;
774-
} {
771+
function resolveChatCompletionUsage(result: unknown): OpenAiChatCompletionsUsage {
775772
return toOpenAiChatCompletionsUsage(resolveAgentRunUsage(result));
776773
}
777774

@@ -1066,13 +1063,7 @@ export async function handleOpenAiHttpRequest(
10661063
let wroteRole = false;
10671064
let wroteStopChunk = false;
10681065
let sawAssistantDelta = false;
1069-
let finalUsage:
1070-
| {
1071-
prompt_tokens: number;
1072-
completion_tokens: number;
1073-
total_tokens: number;
1074-
}
1075-
| undefined;
1066+
let finalUsage: OpenAiChatCompletionsUsage | undefined;
10761067
let finalizeRequested = false;
10771068
let finalizeFinishReason: "stop" | "tool_calls" = "stop";
10781069
let resultResolved = false;

0 commit comments

Comments
 (0)