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

FieldTypeDescription
event_idstringUnique event identifier
session_idstringSession grouping identifier; links all spans in one invocation
projectstringProject name; routes the event to the correct project
sourcestringEnvironment tag: "prod", "dev", or "staging"
event_typestringEvent classification: "model", "tool", "chain", or "session"
event_namestringHuman-readable span label
errorstringError message if the traced function raised; null when no error
parent_idstringParent span ID for hierarchical trace rendering
start_timenumberSpan start timestamp (Unix ms)
end_timenumberSpan end timestamp (Unix ms)
durationnumberWall-clock duration in milliseconds

Seven Structured Buckets

BucketTypePurpose
inputsobjectInput data: prompts, queries, messages passed into the span
outputsobjectOutput data: completions, responses, results from the span
configobjectModel or tool configuration: model name, temperature, max_tokens, etc.
metadataobjectOperational data: framework info, response IDs, token counts
metricsobjectScalar performance metrics: latency, token counts, evaluation scores
feedbackobjectHuman or automated feedback annotations
user_propertiesobjectPer-user profile attributes
Any OTLP or REST attribute that does not match a known canonical field is routed to metadata by default.

Stability Levels

LevelMeaning
stablePart of the public API. Breaking changes require a major version bump and a migration guide. Safe to reference in evaluator configuration, dashboards, and saved filters.
developmentMay change name, type, or semantics in minor releases. Do not configure evaluators, dashboards, or automation against development attributes.
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.
ValueIconColorAdditional UI behavior
session or conversationNetworkPurpleShows Session Summary panel and Composite Evaluations section
model or completionSparklesBlueShows “Open in Playground” button
toolWrenchRedStandard sideview layout
chain or genericLink/BracesGrayStandard sideview layout
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:
FieldUsage
event_typeIcon and color coding per node
event_nameNode label
event_idNode key and linking
durationDuration badge on each node
errorSuccess/error indicator (green checkmark vs red X)
start_timeChildren sorted ascending by start_time before rendering; used in timeline positioning
parent_idSibling detection for prev/next navigation
The graph view tooltip additionally shows event_type, start_time, duration, and error inline.

inputs Bucket

Well-known inputs sub-keys

Sub-keyDescription
chat_historyMessage thread array; triggers Chat History tab (see below)
messagesRaw messages array; used by frameworks that do not use chat_history naming
querySearch or retrieval query string
chunksRetrieved document chunks (RAG pipelines)
nodesRetrieved nodes (LlamaIndex / graph RAG)
parametersFunction or tool call parameters
tool_argumentsTool call arguments, alternative to parameters
tool_nameName of the tool being called
user_messageRaw user message string
system_contextSystem context string (non-template format)
user_idUser identifier embedded in inputs
session_idSession identifier embedded in inputs

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

Sub-keyDescriptionChat rendering mode
roleSpeaker role (user/assistant/system/tool); presence triggers chat renderingRequired to enter chat mode
contentText content of the message; rendered as markdownRendered as markdown
valueAlternative to content; rendered as markdownRendered as markdown when content absent
tool_callsArray of tool call objectsEach rendered as named JSON block
function_callLegacy OpenAI function call object (name + arguments)Rendered as named JSON block
nameMessage author nameUsed as speaker label supplement
chat_historyArray of messages; first element rendered when role absentTriggers chat mode when role absent
messageMessage object (nested); some frameworks wrap the output message in this keyRendered as nested object
resultGeneric result string for tool/agent outputsNo chat rendering; generic markdown/JSON view
authorAgent author identifier (Google ADK multi-agent)Generic key-value in non-chat mode
invocation_idInvocation identifier (Google ADK)Generic key-value in non-chat mode
textText string; when present, used as output value instead of full outputs objectBypasses bucket entirely
finish_reasonModel finish reason stored directly in outputs (some frameworks)Generic key-value
statusStatus string for tool or agent outputsGeneric key-value
errorError string from the traced function (also mirrored in root error field)Generic key-value; red panel shown via root error
choicesRaw API response choices array (OpenAI-format)Generic key-value; not rendered in chat mode
tool_call_idTool call identifier (present on tool result spans)Generic key-value

Chat message rendering mode

Within chat message rendering mode, individual message fields are handled as follows:
FieldRendering
contentRendered as markdown (truncated at 400 chars with expand)
valueRendered as markdown; fallback when content is absent
tool_calls (array)Each tool call rendered as a named JSON block
function_callObject with name and arguments; arguments parsed as JSON and rendered as named block
roleUsed as the speaker label (capitalized)
nameMessage author name
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

Sub-keyDescription
modelModel identifier used for the call
providerProvider name (openai, anthropic, bedrock, google, etc.)
temperatureSampling temperature
max_tokensMax output token limit
max_output_tokensMax output tokens (Google GenAI / Vertex AI variant of max_tokens)
top_pTop-p sampling parameter
top_kTop-k sampling parameter
frequency_penaltyFrequency penalty
presence_penaltyPresence penalty
stop_sequencesStop sequences array
seedRandom seed
reasoning_effortReasoning effort level
systemProvider system field (e.g., "openai", "anthropic")
system_instructionsSystem instructions prepended to the prompt (modern format)
system_instructionSystem instruction string, older format used by pydantic-ai and Google GenAI
toolsTool/function definitions array available to the model
destinationMessaging destination, set for messaging-system spans
templatePrompt template; triggers special sideview rendering (see below)
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
Sub-keyDescription
agent_nameAgent name
agent_descriptionAgent description
agent_idAgent identifier
model_nameResolved model name (response model, if available; otherwise request model)
llm.model_nameLegacy dotted model name key; set by older OpenInference instrumentation alongside model_name; both are stored
providerProvider name (openai, anthropic, bedrock, google, etc.)
systemProvider system string (mirrors provider; set from gen_ai.system)
span_kindInstrumentor span kind string (LLM, AGENT, TOOL, CHAIN, etc.)
operation_nameOperation name
conversation_idConversation identifier
request_typeLLM request type (chat, completion, embedding, etc.)
event_idInternal event ID copy set from tool call ID or GCP ADK event ID
event_typeEvent type label (informational copy; does not override root event_type)
event_nameEvent name label (informational copy; does not override root event_name)
Token counts
Sub-keyDescription
prompt_tokensInput/prompt token count
input_tokensOTel v1.36+ alias for prompt_tokens; both are stored when the source attribute is present
completion_tokensOutput/completion token count
output_tokensOTel v1.36+ alias for completion_tokens; both are stored when the source attribute is present
total_tokensTotal token count; read by Session Summary (see below)
cache_read_input_tokensPrompt cache read tokens (Anthropic models)
reasoning_tokensInternal reasoning tokens consumed (o-series, Claude extended thinking)
Finish reasons
Sub-keyDescription
finish_reasonScalar model finish reason (stop, length, tool_calls, etc.); first element of the finish reasons array
finish_reasonsArray of all model finish reasons
response_finish_reasonsAlias for finish_reasons; set alongside it by the OpenInference strategy for backwards compatibility
Response context
Sub-keyDescription
response_idModel API response identifier
response_modelModel name as returned by the API response (may differ from request model due to aliasing)
openai_api_baseOpenAI-compatible API base URL
openai_system_fingerprintOpenAI system fingerprint
status_codeHTTP status code of the underlying API call
Session-level aggregates (set by normalizer on session events)
Sub-keyDescription
num_eventsTotal child event count; shown as “Num of Events” in the sessions table
num_model_eventsModel event count; shown as “Num of LLM Requests” in the sessions table
has_feedbackBoolean; true when the session has at least one feedback annotation
costAggregated cost for the session; displayed as a stat in Session Summary
Latency (note: set in metadata by the standard GenAI strategy; set in metrics by the Traceloop strategy; check both buckets)
Sub-keyDescription
latency_msEnd-to-end request latency in milliseconds
time_to_first_token_msTime to first streaming token in milliseconds
Context identifiers
Sub-keyDescription
session_idOTel session ID (informational; does not override root session_id)
user_idUser identifier
run_idEvaluation run ID (HoneyHive dataset run)
dataset_idDataset ID (HoneyHive dataset)
datapoint_idDatapoint ID within a dataset
tool_call_idTool call identifier
disable_http_tracingBoolean; when true, HTTP spans emitted by the same trace are suppressed during ingestion
Multimodal
Sub-keyDescription
input_mime_typeMIME type of the input (e.g., image/jpeg, text/plain)
output_mime_typeMIME type of the output
Tool / agent status
Sub-keyDescription
tool_statusTool execution status string
Messaging
Sub-keyDescription
messaging_destinationMessaging system destination topic or queue
MCP (Model Context Protocol)
Sub-keyDescription
mcp_client_nameMCP client name
mcp_server_nameMCP server name
mcp_tool_nameMCP tool name
mcp_request_typeMCP request type
mcp_session_idMCP session ID
Google ADK
Sub-keyDescription
gcp.vertex.agent.event_idGoogle ADK event ID (dotted key preserved as-is in metadata)
OTLP traceability (set on every OTLP-ingested event)
Sub-keyDescription
trace_idOriginal OTel trace ID (hex string)
span_idOriginal OTel span ID (hex string)
parent_span_idOriginal OTel parent span ID (hex string); used for tree reconstruction before parent_id is resolved
instrumentorDetected instrumentation library (openinference, traceloop, aws-strands, google-adk, standardgenai, etc.)
has_otlp_lineageAlways true on OTLP-ingested events; signals the tree-builder to use span ID lineage instead of temporal containment for parent-child relationships
honeyhive_event_typePreserved copy of the honeyhive_event_type source attribute when present (informational)

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.
Sub-keyDescription
latency_msEnd-to-end request latency in milliseconds, set by the Traceloop strategy
time_to_first_token_msTime to first streaming token in milliseconds, set by the Traceloop strategy
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:
Sideview SectionCanonical AttributeDisplay LabelSpecial Notes
Event headerevent_type, event_nameIcon + span titleIcon and color vary by event_type
Event headerevent_idEvent IDCopyable on click
Event headerstart_timeTimestampFormatted with local timezone
Input / Chat Historyinputs”Inputs”Chat History tab shown when inputs.chat_history exists; chat_history key excluded from Inputs tab
Input / Chat Historyinputs.chat_history”Chat History”Rendered as message thread via OpenAIChatRenderer
Outputoutputs”Output” or “Assistant:“Chat rendering when outputs.role or outputs.chat_history present; markdown/JSON toggle otherwise
Error panelerror”Error:“Shown only when non-null and non-empty; red background
Human Annotationsmetrics (human-eval keys)“Human Annotations”Keys in humanEvalFields list
Automated Evaluationsmetrics”Automated Evaluations”Non-human-eval keys; null values hidden
Configurationconfig”Configuration”Generic key-value; config.template triggers template rendering
User Feedbackfeedback”User Feedback”Generic key-value dropdown
User Propertiesuser_properties”User Properties”Generic key-value dropdown
Metadatametadata”Metadata”Generic key-value dropdown
Event JSONAll fields”Event JSON”Raw event JSON; index and zOrder keys excluded

Session Summary Panel

Shown only when event_type === "session". Reads these specific attributes:
StatSource AttributeNotes
Number of childrenmetadata.num_eventsFalls back to events.length - 1 if absent
Model EventsCounted from child event_type === "model"Live count, not stored
Success RatePercentage of child events with null errorLive count
Total DurationCalculated from start_time / end_time across childrenNot a stored attribute
Total Tokensmetadata.total_tokensParsed as integer
Costmetadata.costParsed as float; formatted as $X.XXXX

Stability Policy

LevelChange policy
stableBreaking changes (rename, removal, type change) require a major version bump and a published migration guide. New stable attributes may be added in minor releases.
developmentMay change name, type, or semantics in minor releases. Do not configure evaluators, dashboards, or saved filters against development attributes.
absent from this referenceTreat as development-level stability. It may have been added by an auto-instrumentor or internal SDK path and carries no stability guarantee.