Canonical Event Schema
Every event stored in HoneyHive has the following top-level structure. Root fields are stored directly on the event object. The seven buckets are nested objects.Root Fields
Seven Structured Buckets
Any OTLP or REST attribute that does not match a known canonical field is routed to
metadata by default.Stability Levels
If an attribute is absent from this reference, treat it as development-level stability.
Reserved Attribute Reference
Reserved attributes have pre-set platform behavior regardless of how they are set — via the HoneyHive SDK, REST API, or OTLP ingestion. Each entry describes what the platform does differently when the attribute is present.Root Field Behaviors
event_type
Controls icon, color coding, and available actions in the sideview header.
Stability: stable
event_name
Displayed as the span title in the sideview header alongside the event_type icon.
Stability: stable
error
When non-null and non-empty, renders a red error panel at the top of the Output section in the sideview. The error string is JSON-stringified before display.
Stability: stable
start_time
Children within a session are sorted by start_time ascending before trace tree rendering. Also displayed as the event timestamp in the table and sideview header.
Stability: stable
duration
Displayed as the “Latency” column in the events table. Computed automatically as end_time - start_time if not set explicitly.
Stability: stable
session_id
Used to fetch the full session tree when a sideview is opened. Enables the tree, timeline, and graph views. Cached by the sideview via an LRU cache keyed on session_id.
Stability: stable
parent_id
Used to determine sibling relationships in the trace tree (controls prev/next navigation between sibling spans).
Stability: stable
Tree view, timeline view, and graph view
All three session visualization views (tree list, timeline, and graph) exclusively read root fields. No bucket sub-keys are used. The fields consumed are:
The graph view tooltip additionally shows
event_type, start_time, duration, and error inline.
inputs Bucket
Well-known inputs sub-keys
inputs.chat_history
The single most special sub-key in the schema. When present:
- A “Chat History” tab appears in the Input section of the sideview (blue tab with chat icon).
inputs.chat_historyis excluded from the general “Inputs” key-value view (cleanInputsstrips it).- The Chat History tab renders the array using
OpenAIChatRenderer. - If
config.templateis also present (see below), the firsttemplate.lengthmessages inchat_historyare rendered as template messages with{{variable}}substitution; remaining messages are rendered normally. - When both non-chat inputs and
chat_historyexist, the sideview defaults to showing the Chat History tab. - When only non-chat inputs exist (no
chat_history), the sideview defaults to showing the Inputs tab.
role field and one of content, value, tool_calls, or function_call.
Stability: stable
outputs Bucket
The sideview uses the presence of specific sub-keys to select a rendering mode.
Well-known outputs sub-keys
Chat message rendering mode
Within chat message rendering mode, individual message fields are handled as follows:
If a message object contains keys with
. in them (non-standard dot-notation fields such as tool_calls.0.id), the entire message is rendered as raw JSON instead of the structured chat layout.
Stability of outputs.role: stableStability of
outputs.chat_history: stable
outputs.tool_calls.* (dot-notation keys)
When outputs.role is present and the outputs object contains flattened dot-notation keys like tool_calls.0.id, tool_calls.0.function.name, etc., the sideview reconstructs a proper tool_calls array before rendering. The reconstruction logic:
- Collects all keys starting with
tool_calls. - Groups by index (second segment after split on
.) - Builds an array of tool call objects;
argumentsvalues are JSON-parsed
outputs.text
When outputs.text exists, that string is used as the output value instead of the full outputs object. The text is then rendered in the standard markdown/JSON toggle view.
Stability: stable
Generic rendering mode
When neitheroutputs.role nor outputs.chat_history is present, the output renders in a markdown/JSON toggle view. Users can switch between markdown rendering and raw JSON rendering via a dropdown.
config Bucket
The config bucket holds model and tool configuration. The sub-keys below are produced by the normalizer from various framework attributes. All are rendered as generic key-value pairs in the “Configuration” sideview section, except config.template.
Well-known config sub-keys
config.model and config.provider are also read by the Playground when loading an event for replay.
config.template
When config.template is an array of prompt template objects (each with role and content), the sideview renders a Template section above the chat history. Template messages are rendered via SideviewChatTemplateRenderer, which:
- Displays each message with its
roleas a label. - Finds
{{variableName}}placeholders incontentusing the regex/{{(.*?)}}/g. - Substitutes each placeholder with the matching key from
inputs(non-chat-history inputs), highlighted in a blue badge. - Truncates content at 400 characters with a “Show more” / “Show less” toggle.
template.length also controls how many messages in inputs.chat_history are skipped by the main OpenAIChatRenderer (they are already shown as template messages above).
config.template can also be an object with name, version, and content sub-keys (from honeyhive_prompt_template.template.*), in which case it is rendered as a generic key-value block.
Stability: stable
metadata Bucket
Most metadata sub-keys render as generic key-value pairs in the “Metadata” sideview section. The table below lists well-known canonical sub-keys produced by the normalizer, followed by the sub-keys that have additional platform treatment.
Well-known metadata sub-keys
Agent and model identity
Token counts
Finish reasons
Response context
Session-level aggregates (set by normalizer on session events)
Latency (note: set in
metadata by the standard GenAI strategy; set in metrics by the Traceloop strategy; check both buckets)
Context identifiers
Multimodal
Tool / agent status
Messaging
MCP (Model Context Protocol)
Google ADK
OTLP traceability (set on every OTLP-ingested event)
metadata.num_events and metadata.num_model_events
metadata.num_events is shown as the “Num of Events” column in the sessions table and as the “Number of children” stat in Session Summary. metadata.num_model_events is shown as the “Num of LLM Requests” column in the sessions table. Both are initialized to 0 by the normalizer on session events.
Stability: stable
metadata.total_tokens and metadata.cost
metadata.total_tokens is displayed as the “Total Tokens” stat in Session Summary (parsed as integer). metadata.cost is displayed as the “Cost” stat (parsed as float, formatted as $X.XXXX). Both initialized to 0 / 0.1 by the normalizer on session events.
Stability: stable
metrics Bucket
All sub-keys in metrics render in the “Automated Evaluations” section of the sideview. The following filtering rules apply:
- Keys with
nullvalues are hidden. - Keys that match
humanEvalFields(human annotation fields fetched separately) are excluded from Automated Evaluations and rendered instead under “Human Annotations”. - In the Session Summary panel, metrics are collected from all child events, grouped by
event_type, and displayed as a grid. String values and arrays are excluded from this grid; only numeric and boolean primitives are shown. - Keys ending in
_explanationare skipped in both the Session Summary metrics and feedback aggregations.
Well-known metrics sub-keys
The following sub-keys are set by the ingestion pipeline for OTLP-ingested events. All other sub-keys are user-defined.
The standard GenAI strategy routes
latency_ms and time_to_first_token_ms to metadata instead of metrics. When querying these values, check both metadata.latency_ms and metrics.latency_ms depending on the instrumentor.feedback Bucket
All sub-keys in feedback render in the “User Feedback” dropdown section of the sideview. In the Session Summary panel, feedback is collected from all child events and grouped by event_type. The same filtering rules as metrics apply: string values, arrays, and _explanation-suffixed keys are excluded from the summary grid.
Stability: stable
user_properties Bucket
All sub-keys in user_properties render in the “User Properties” dropdown section of the sideview. No sub-keys have additional special behavior beyond this.
Stability: stable
UI Sideview Section Map
The sideview panel renders canonical attributes into labeled sections in this order:Session Summary Panel
Shown only whenevent_type === "session". Reads these specific attributes:
Stability Policy
Related pages
- Framework Attribute Mapping - how OTel GenAI, OpenInference, and Traceloop attributes map to the canonical schema above

