@dataclass
class CallEvent:
ts: str # ISO 8601 UTC timestamp
model: str # model name from response
provider: str # anthropic | openai | groq | unknown
input_tokens: int
output_tokens: int
cost_usd: float # estimated cost
latency_ms: int
user_id: str | None
session_id: str | None
tags: list[str] | None
routed_tier: str | None # set by Router if routing was used
error: str | None # set if the call raised an exception