package historymetrics import ( "encoding/json" "errors" "fmt" "os" ) type usageFileDocument struct { Totals struct { ProviderCalls int64 `json:"provider_calls"` TurnsTotal int64 `json:"turns_total"` ValidTurnsTotal int64 `json:"valid_turns_total"` InvalidTurnsTotal int64 `json:"invalid_turns_total"` InputTokens int64 `json:"input_tokens"` OutputTokens int64 `json:"output_tokens"` CacheReadTokens int64 `json:"cache_read_tokens"` CacheWriteTokens int64 `json:"cache_write_tokens"` TotalTokens int64 `json:"total_tokens"` } `json:"totals"` } func LoadUsageSummary(path string) (Summary, error) { body, err := os.ReadFile(path) if err != nil { if errors.Is(err, os.ErrNotExist) { return Summary{}, nil } return Summary{}, fmt.Errorf("read usage file: %w", err) } var doc usageFileDocument if err := json.Unmarshal(body, &doc); err != nil { return Summary{}, fmt.Errorf("decode usage file: %w", err) } totals := Totals{ InputTokens: doc.Totals.InputTokens, OutputTokens: doc.Totals.OutputTokens, CacheReadTokens: doc.Totals.CacheReadTokens, CacheWriteTokens: doc.Totals.CacheWriteTokens, PromptTokensTotal: doc.Totals.InputTokens + doc.Totals.CacheReadTokens + doc.Totals.CacheWriteTokens, RequestTokensTotal: doc.Totals.TotalTokens, } return Summary{ ProviderCallsTotal: int(doc.Totals.ProviderCalls), TurnsTotal: int(doc.Totals.TurnsTotal), ValidTurnsTotal: int(doc.Totals.ValidTurnsTotal), InvalidTurnsTotal: int(doc.Totals.InvalidTurnsTotal), RequestTokensTotal: totals.RequestTokensTotal, PromptTokensTotal: totals.PromptTokensTotal, CacheReadTokens: totals.CacheReadTokens, CacheWriteTokens: totals.CacheWriteTokens, CacheHitRate: cacheHitRateFromTotals(totals), }, nil }