Expose turn token usage in the SDK (#4700)
It's present on the event, add it to the final result as well.
This commit is contained in:
@@ -3,6 +3,22 @@ import http from "node:http";
|
||||
const DEFAULT_RESPONSE_ID = "resp_mock";
|
||||
const DEFAULT_MESSAGE_ID = "msg_mock";
|
||||
|
||||
type ResponseCompletedUsage = {
|
||||
input_tokens: number;
|
||||
input_tokens_details: { cached_tokens: number } | null;
|
||||
output_tokens: number;
|
||||
output_tokens_details: { reasoning_tokens: number } | null;
|
||||
total_tokens: number;
|
||||
};
|
||||
|
||||
const DEFAULT_COMPLETED_USAGE: ResponseCompletedUsage = {
|
||||
input_tokens: 42,
|
||||
input_tokens_details: { cached_tokens: 12 },
|
||||
output_tokens: 5,
|
||||
output_tokens_details: null,
|
||||
total_tokens: 47,
|
||||
};
|
||||
|
||||
type SseEvent = {
|
||||
type: string;
|
||||
[key: string]: unknown;
|
||||
@@ -157,17 +173,26 @@ export function assistantMessage(text: string, itemId: string = DEFAULT_MESSAGE_
|
||||
};
|
||||
}
|
||||
|
||||
export function responseCompleted(responseId: string = DEFAULT_RESPONSE_ID): SseEvent {
|
||||
export function responseCompleted(
|
||||
responseId: string = DEFAULT_RESPONSE_ID,
|
||||
usage: ResponseCompletedUsage = DEFAULT_COMPLETED_USAGE,
|
||||
): SseEvent {
|
||||
const inputDetails = usage.input_tokens_details
|
||||
? { ...usage.input_tokens_details }
|
||||
: null;
|
||||
const outputDetails = usage.output_tokens_details
|
||||
? { ...usage.output_tokens_details }
|
||||
: null;
|
||||
return {
|
||||
type: "response.completed",
|
||||
response: {
|
||||
id: responseId,
|
||||
usage: {
|
||||
input_tokens: 0,
|
||||
input_tokens_details: null,
|
||||
output_tokens: 0,
|
||||
output_tokens_details: null,
|
||||
total_tokens: 0,
|
||||
input_tokens: usage.input_tokens,
|
||||
input_tokens_details: inputDetails,
|
||||
output_tokens: usage.output_tokens,
|
||||
output_tokens_details: outputDetails,
|
||||
total_tokens: usage.total_tokens,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -38,6 +38,11 @@ describe("Codex", () => {
|
||||
},
|
||||
];
|
||||
expect(result.items).toEqual(expectedItems);
|
||||
expect(result.usage).toEqual({
|
||||
cached_input_tokens: 12,
|
||||
input_tokens: 42,
|
||||
output_tokens: 5,
|
||||
});
|
||||
expect(thread.id).toEqual(expect.any(String));
|
||||
} finally {
|
||||
await close();
|
||||
|
||||
@@ -52,9 +52,9 @@ describe("Codex", () => {
|
||||
{
|
||||
type: "turn.completed",
|
||||
usage: {
|
||||
cached_input_tokens: 0,
|
||||
input_tokens: 0,
|
||||
output_tokens: 0,
|
||||
cached_input_tokens: 12,
|
||||
input_tokens: 42,
|
||||
output_tokens: 5,
|
||||
},
|
||||
},
|
||||
]);
|
||||
|
||||
Reference in New Issue
Block a user