From 88523e099cf09e76830d848e29ddcdbe61cbf876 Mon Sep 17 00:00:00 2001 From: yin1245 <2573101189@qq.com> Date: Sun, 29 Mar 2026 12:31:46 +0800 Subject: [PATCH] fix: use per-model context window size for accurate input_tokens estimation Different Claude models have different context window sizes: - Opus 4.5/4.6: 1M tokens - Sonnet 4.5/4.6: 200K tokens - Haiku 4.5: 200K tokens The current implementation uses a single hardcoded TOTAL_CONTEXT_TOKENS constant for all models, which causes input_tokens to be overestimated for small-context models or underestimated for large-context models. This change adds a MODEL_CONTEXT_TOKENS mapping and a helper function getContextTokensForModel() that selects the correct context window size based on the model being used, falling back to KIRO_CONSTANTS.TOTAL_CONTEXT_TOKENS for unknown models. --- src/providers/claude/claude-kiro.js | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/providers/claude/claude-kiro.js b/src/providers/claude/claude-kiro.js index 303533d..7c185e3 100644 --- a/src/providers/claude/claude-kiro.js +++ b/src/providers/claude/claude-kiro.js @@ -47,6 +47,21 @@ const KIRO_CONSTANTS = { TOTAL_CONTEXT_TOKENS: 200000, // Claude Sonnet 4.5 actual context is 200K }; +// Per-model context window sizes for accurate token estimation +const MODEL_CONTEXT_TOKENS = { + "claude-opus-4-6": 1000000, + "claude-opus-4-5": 1000000, + "claude-opus-4-5-20251101": 1000000, + "claude-sonnet-4-6": 200000, + "claude-sonnet-4-5": 200000, + "claude-sonnet-4-5-20250929": 200000, + "claude-haiku-4-5": 200000, + "claude-haiku-4-5-20251001": 200000, +}; + +function getContextTokensForModel(model) { + return MODEL_CONTEXT_TOKENS[model] || KIRO_CONSTANTS.TOTAL_CONTEXT_TOKENS; +} // 从 provider-models.js 获取支持的模型列表 const KIRO_MODELS = getProviderModels(MODEL_PROVIDER.KIRO_API); @@ -2631,7 +2646,8 @@ async saveCredentialsToFile(filePath, newData) { // 总 token = TOTAL_CONTEXT_TOKENS * contextUsagePercentage / 100 // input token = 总 token - output token if (contextUsagePercentage !== null && contextUsagePercentage > 0) { - const totalTokens = Math.round(KIRO_CONSTANTS.TOTAL_CONTEXT_TOKENS * contextUsagePercentage / 100); + const contextTokens = getContextTokensForModel(finalModel); + const totalTokens = Math.round(contextTokens * contextUsagePercentage / 100); inputTokens = Math.max(0, totalTokens - outputTokens); logger.info(`[Kiro] Token calculation from contextUsagePercentage: total=${totalTokens}, output=${outputTokens}, input=${inputTokens}`); } else {