Skip to main content
bryel is agent-first. Three units structure everything you see.

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

KeySet viaPurpose
sessionIdtelemetry metadata.sessionIdgroups turns into a conversation
userIdtelemetry metadata.userIdthe end-user behind the run
messageIdtelemetry metadata.messageIda 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.
KindWhat it represents
LLMA model generation — generateText / streamText / a provider request
TOOLA tool / function call inside a run
CHAINA composite step that wraps other spans (e.g. an agent loop)
AGENTAn agent run
RETRIEVER · EMBEDDING · RERANKERRetrieval-augmented steps
GUARDRAIL · EVALUATORSafety 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 as bryel.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.