Skip to main content
HoneyHive stores every event in a fixed canonical schema. This page defines that schema, identifies which attributes trigger special platform behavior (different rendering, filtering, or aggregation), and maps canonical attributes to their UI sideview sections.

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_history is excluded from the general “Inputs” key-value view (cleanInputs strips it).
  • The Chat History tab renders the array using OpenAIChatRenderer.
  • If config.template is also present (see below), the first template.length messages in chat_history are rendered as template messages with {{variable}} substitution; remaining messages are rendered normally.
  • When both non-chat inputs and chat_history exist, 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.
Expected format: array of message objects with at minimum a 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: stable
Stability 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:
  1. Collects all keys starting with tool_calls.
  2. Groups by index (second segment after split on .)
  3. Builds an array of tool call objects; arguments values are JSON-parsed
Stability: stable

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 neither outputs.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 role as a label.
  • Finds {{variableName}} placeholders in content using 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.
The 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 null values 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 _explanation are 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.
Stability: stable

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 when event_type === "session". Reads these specific attributes:

Stability Policy