From 10e60551047c2562c6e5b949a82f56136d81e63f Mon Sep 17 00:00:00 2001 From: luvs01 Date: Sat, 15 Aug 2026 11:39:36 +0900 Subject: [PATCH] fix(usage): recompute totals after estimate cap --- src/server/request-log.ts | 6 +++++- tests/request-log-estimate-cap.test.ts | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/server/request-log.ts b/src/server/request-log.ts index f4c4df662..430fc01b8 100644 --- a/src/server/request-log.ts +++ b/src/server/request-log.ts @@ -1017,7 +1017,11 @@ function finalizedUsage( // ESTIMATE via capEstimateAtContextWindow, and Math.max preserves a real // provider-reported count, so it needs no further reduction. ? (finalUsage.estimated && contextWindow !== undefined && finalUsage.inputTokens > contextWindow - ? { ...finalUsage, inputTokens: contextWindow } + ? { + ...finalUsage, + inputTokens: contextWindow, + totalTokens: contextWindow + finalUsage.outputTokens, + } : finalUsage) : usageFallback; const totalTokens = usageTotalTokens(loggedUsage); diff --git a/tests/request-log-estimate-cap.test.ts b/tests/request-log-estimate-cap.test.ts index b51f7aeb6..3554dd62b 100644 --- a/tests/request-log-estimate-cap.test.ts +++ b/tests/request-log-estimate-cap.test.ts @@ -31,6 +31,23 @@ describe("request log token-estimate context-window cap (codex-router PR #140)", expect(attempt.usage?.inputTokens).toBe(100_000); }); + test("capping adapter-estimated input recomputes an explicit total", () => { + const attempt = beginRequestAttempt(1, "kiro", "deepseek-3.2", "kiro"); + finishRequestAttempt(attempt, 200, 10, { + inputTokens: 200_000, + outputTokens: 4, + totalTokens: 200_004, + estimated: true, + }); + expect(attempt.usage).toEqual({ + inputTokens: DEEPSEEK_WINDOW, + outputTokens: 4, + totalTokens: DEEPSEEK_WINDOW + 4, + estimated: true, + }); + expect(attempt.totalTokens).toBe(DEEPSEEK_WINDOW + 4); + }); + test("a positive provider-reported input count is never reduced by the cap", () => { const attempt = beginRequestAttempt(1, "kiro", "deepseek-3.2", "kiro"); noteAttemptSend(attempt, 200_000); // estimate would exceed the window