Trace
One agent run (turn) — the root span plus all its model steps and tool calls.
Interaction
The turn itself — one user → agent exchange, summarized.
Session
A conversation — multiple turns grouped by
sessionId.Grouping keys
| Key | Set via | Purpose |
|---|---|---|
sessionId | telemetry metadata.sessionId | groups turns into a conversation |
userId | telemetry metadata.userId | the end-user behind the run |
messageId | telemetry metadata.messageId | a per-turn handle; stamped as bryel.interaction.id so feedback joins to the turn |
Span kinds
Every span carries an OpenInference span kind (openinference.span.kind) so
bryel knows what it is. The adapters set this for you; a custom
SpanMapper sets it from
OpenInferenceSpanKind.
| Kind | What it represents |
|---|---|
LLM | A model generation — generateText / streamText / a provider request |
TOOL | A tool / function call inside a run |
CHAIN | A composite step that wraps other spans (e.g. an agent loop) |
AGENT | An agent run |
RETRIEVER · EMBEDDING · RERANKER | Retrieval-augmented steps |
GUARDRAIL · EVALUATOR | Safety checks and scoring steps |
Tokens & cost
Token counts live on the leaf model spans (the actual provider request); the outer operation span repeats them as a roll-up. bryel sums tokens and cost over the whole trace and prices them at ingest — so you see cost per turn, per session, and per project. Pricing is recorded asbryel.cost.usd with a bryel.cost.status
(provider_reported, priced, unknown_model, or no_tokens) so you always
know whether a number is exact, estimated, or unavailable.