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.
This commit is contained in:
yin1245 2026-03-29 12:31:46 +08:00
parent a639ca3d26
commit 88523e099c

View file

@ -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 {