Documentation
¶
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func EventUsagePayload ¶
func EventUsagePayload(u zeroruntime.Usage) map[string]any
EventUsagePayload builds the persisted EventUsage payload for a usage record. It is the single writer paired with usageEventPayload (the reader), so the JSON keys can never drift. Cache and reasoning counts are written only when non-zero, keeping payloads compact and older readers unaffected; BuildReport reads them back to price a turn exactly (cache discount + cache-write premium + reasoning) rather than estimating from prompt/completion alone. Callers add "model" afterward on escalation runs.
func FormatSummary ¶
Types ¶
type DayBucket ¶
type DayBucket struct {
Date string `json:"date"`
Requests int `json:"requests"`
InputTokens int `json:"inputTokens"`
OutputTokens int `json:"outputTokens"`
TotalTokens int `json:"totalTokens"`
TotalCost float64 `json:"totalCost"`
}
DayBucket aggregates usage events sharing the same UTC calendar date.
type ModelSummary ¶
type ModelSummary struct {
ModelID string
Provider modelregistry.ProviderKind
RecordCount int
InputTokens int
CachedInputTokens int
CacheWriteTokens int
OutputTokens int
ReasoningTokens int
TotalTokens int
InputCost float64
CachedInputCost float64
CacheWriteCost float64
OutputCost float64
TotalCost float64
FormattedTotalCost string
}
type Normalized ¶
type Normalized struct {
InputTokens int
CachedInputTokens int
CacheWriteTokens int
OutputTokens int
ReasoningTokens int
TotalTokens int
}
func Normalize ¶
func Normalize(usage zeroruntime.Usage) (Normalized, zeroruntime.Usage, error)
type Record ¶
type Record struct {
ID string
Sequence int
ModelID string
Provider modelregistry.ProviderKind
Source string
CreatedAt string
Usage Normalized
Cost modelregistry.CostBreakdown
}
type RecordInput ¶
type RecordInput struct {
ModelID string
Usage zeroruntime.Usage
Source string
}
type Report ¶
type Report struct {
Buckets []DayBucket `json:"buckets"`
Total Totals `json:"total"`
NetLOC int `json:"netLOC"`
NetLOCPositive bool `json:"netLOCPositive"`
TokensPerNetLOC float64 `json:"tokensPerNetLOC"`
CostPerNetLOC float64 `json:"costPerNetLOC"`
LOCEstimated bool `json:"locEstimated"`
CostEstimated bool `json:"costEstimated"`
}
Report is the aggregated usage view rendered by `zero usage report`. Cost is a reconstructed estimate (see usageEventPayload) and NetLOC is a working-tree estimate; both are surfaced as estimates in the rendered output.
func BuildReport ¶
func BuildReport(events []sessions.Event, meta []sessions.Metadata, registry *modelregistry.Registry, netLOC int) (Report, error)
BuildReport aggregates persisted EventUsage events into per-day buckets and a report-wide total, reconstructing cost from the owning session's Metadata.ModelID via modelregistry.CalculateCost. Sessions whose model id is empty or unknown contribute token counts but no cost. The per-net-LOC ratios are guarded against a non-positive netLOC.
type Summary ¶
type Summary struct {
RecordCount int
Currency string
InputTokens int
CachedInputTokens int
CacheWriteTokens int
OutputTokens int
ReasoningTokens int
TotalTokens int
InputCost float64
CachedInputCost float64
CacheWriteCost float64
OutputCost float64
TotalCost float64
FormattedTotalCost string
ByModel []ModelSummary
LastRecord *Record
}
type Totals ¶
type Totals struct {
Requests int `json:"requests"`
InputTokens int `json:"inputTokens"`
OutputTokens int `json:"outputTokens"`
TotalTokens int `json:"totalTokens"`
TotalCost float64 `json:"totalCost"`
}
Totals carries report-wide sums across every bucket.
type Tracker ¶
type Tracker struct {
// contains filtered or unexported fields
}
func NewTracker ¶
func NewTracker(options TrackerOptions) *Tracker
type TrackerOptions ¶
type TrackerOptions struct {
Now func() time.Time
Registry *modelregistry.Registry
}