From 8b403c54df729e255b574b6b0b7af691176d4cda Mon Sep 17 00:00:00 2001 From: seonNoh Date: Thu, 8 Oct 2026 10:53:08 +0900 Subject: [PATCH] fix(agent): record token usage summed over all turns MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit previous_response_id로 잇는 Responses API는 턴마다 전체 컨텍스트를 입력으로 과금하는데 세션에는 마지막 턴의 usage만 남아 비용이 과소 기록되었다(실측 2026-10-08: 12턴, 마지막 턴 입력 10,997). 턴별 input/output/total을 합산하고 턴 수도 함께 기록한다. --- ai/internal/agent/agent.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ai/internal/agent/agent.go b/ai/internal/agent/agent.go index 0715b99..149b58f 100644 --- a/ai/internal/agent/agent.go +++ b/ai/internal/agent/agent.go @@ -158,7 +158,9 @@ func (a *Agent) Diagnose(ctx context.Context, req Request) (*Result, error) { var prevID string var diagnosis *diag.Diagnosis pf := false - var usage any + // usage is summed over every turn: with previous_response_id each turn re-bills the whole context, so the + // last response alone understates the cost (seen 2026-10-08: 12 turns, last turn 11K input tokens). + usage := map[string]int{"input_tokens": 0, "output_tokens": 0, "total_tokens": 0, "turns": 0} for turn := 1; turn <= a.cfg.MaxTurns && diagnosis == nil; turn++ { res.Turns = turn r := openai.Request{Model: a.cfg.Model, Input: input, Tools: defs, ToolChoice: "auto", MaxOutputTokens: a.cfg.MaxOutputTokens, ParallelToolCalls: &pf} @@ -173,7 +175,10 @@ func (a *Agent) Diagnose(ctx context.Context, req Request) (*Result, error) { finish(err) return nil, err } - usage = resp.Usage + usage["input_tokens"] += resp.Usage.InputTokens + usage["output_tokens"] += resp.Usage.OutputTokens + usage["total_tokens"] += resp.Usage.TotalTokens + usage["turns"]++ prevID = resp.ID fcs := resp.FunctionCalls() if len(fcs) == 0 {