The canonical event
DesignOne schema everything revolves around, always expressible as OpenTelemetry gen_ai.* attributes.
#One schema, three ingestion paths
SDK, OpenTelemetry, and proxy all normalise to a single canonical event. None is preferred; all are first-class. Field names are snake_case and must always be expressible as OTel gen_ai.* attributes, so nothing is trapped behind a proprietary shape.
- trace_id, span_id — the run identity.
- model, provider — what was called.
- prompt_tokens, completion_tokens, total_tokens — the usage.
- latency_ms, cost_usd — computed at ingestion from the pricing registry.
#Cost is computed, not trusted
cost_usd is derived at ingestion time from a sourced, effective-dated pricing registry — never taken from the client. An unknown or stale price produces an explicit outcome, not a guessed number.