- claw-code compaction accounting 흐름을 참고해 service:model 기준 일별 토큰 집계와 compact 이후 모델 사용량 버킷을 추가함 - microcompact/session_memory/collapsed boundary 메시지를 전용 압축 카드로 렌더링하고 compact 관련 thinking 이벤트를 얇은 compact pill로 분리함 - README 및 docs/DEVELOPMENT.md에 2026-04-05 00:01 (KST) 기준 이력을 반영함 - 검증: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\ (경고 0 / 오류 0)
This commit is contained in:
@@ -70,7 +70,7 @@ internal static class UsageStatisticsService
|
||||
}
|
||||
|
||||
/// <summary>토큰 사용량을 기록합니다.</summary>
|
||||
public static void RecordTokens(int promptTokens, int completionTokens)
|
||||
public static void RecordTokens(int promptTokens, int completionTokens, string? service = null, string? model = null, bool isPostCompaction = false)
|
||||
{
|
||||
if (promptTokens <= 0 && completionTokens <= 0) return;
|
||||
EnsureInitialized();
|
||||
@@ -79,6 +79,23 @@ internal static class UsageStatisticsService
|
||||
_today.PromptTokens += promptTokens;
|
||||
_today.CompletionTokens += completionTokens;
|
||||
_today.TotalTokens += promptTokens + completionTokens;
|
||||
|
||||
var key = BuildModelUsageKey(service, model);
|
||||
if (!string.IsNullOrWhiteSpace(key))
|
||||
{
|
||||
_today.ModelPromptTokens.TryGetValue(key, out var modelPrompt);
|
||||
_today.ModelCompletionTokens.TryGetValue(key, out var modelCompletion);
|
||||
_today.ModelPromptTokens[key] = modelPrompt + promptTokens;
|
||||
_today.ModelCompletionTokens[key] = modelCompletion + completionTokens;
|
||||
|
||||
if (isPostCompaction)
|
||||
{
|
||||
_today.PostCompactionPromptTokens.TryGetValue(key, out var postPrompt);
|
||||
_today.PostCompactionCompletionTokens.TryGetValue(key, out var postCompletion);
|
||||
_today.PostCompactionPromptTokens[key] = postPrompt + promptTokens;
|
||||
_today.PostCompactionCompletionTokens[key] = postCompletion + completionTokens;
|
||||
}
|
||||
}
|
||||
}
|
||||
_ = SaveTodayAsync();
|
||||
}
|
||||
@@ -205,8 +222,21 @@ internal static class UsageStatisticsService
|
||||
TotalTokens = _today.TotalTokens,
|
||||
PromptTokens = _today.PromptTokens,
|
||||
CompletionTokens = _today.CompletionTokens,
|
||||
ModelPromptTokens = new Dictionary<string, long>(_today.ModelPromptTokens),
|
||||
ModelCompletionTokens = new Dictionary<string, long>(_today.ModelCompletionTokens),
|
||||
PostCompactionPromptTokens = new Dictionary<string, long>(_today.PostCompactionPromptTokens),
|
||||
PostCompactionCompletionTokens = new Dictionary<string, long>(_today.PostCompactionCompletionTokens),
|
||||
};
|
||||
|
||||
private static string GetFilePath(string dateStr)
|
||||
=> Path.Combine(_statsDir, $"{dateStr}.json");
|
||||
|
||||
private static string BuildModelUsageKey(string? service, string? model)
|
||||
{
|
||||
var normalizedService = (service ?? "").Trim().ToLowerInvariant();
|
||||
var normalizedModel = (model ?? "").Trim();
|
||||
if (string.IsNullOrWhiteSpace(normalizedService) || string.IsNullOrWhiteSpace(normalizedModel))
|
||||
return "";
|
||||
return $"{normalizedService}:{normalizedModel}";
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user