Before diving into the dashboard, it helps to understand how LumiqTrace structures the data it collects from your agents. Everything starts with a single operation — an LLM call, a tool invocation, an agent turn — and builds upward through a clear hierarchy.Documentation Index
Fetch the complete documentation index at: https://docs.lumiqtrace.com/llms.txt
Use this file to discover all available pages before exploring further.
The data hierarchy
Event
An event is the most fundamental unit of data in LumiqTrace. Every time your instrumented code executes an operation — an LLM call, a tool invocation, an agent turn — the SDK captures a single event and sends it to the ingest endpoint. Events are immutable once stored.Identity fields
event_id — unique UUIDv4 for this eventtrace_id — links this event to others in the same agent runspan_id — unique ID for this specific operationparent_span_id — set when this step is nested inside another spanOperation fields
provider — "openai", "anthropic", "google", or "custom"model — the exact model string, e.g. "gpt-4o"span_kind — what type of operation this is (see below)operation — "chat", "embed", "tool", "agent", or "custom"Performance fields
latency_ms — total time from start to finishttft_ms — time to first token (streaming LLM calls only)input_tokens — tokens consumed in the promptoutput_tokens — tokens generated in the completioncached_tokens — prompt tokens served from provider cacheCost and status
cost_usd — computed by the SDK from per-model token pricingstatus — "success", "error", "timeout", "rate_limited", or "cancelled"error_code — provider error code when status is not "success"error_message — up to 500 characters, sanitized before storageenvironment, user_id, session_id, and a tags map of arbitrary string key-value pairs.
Prompt text is not stored by default. The SDK always computes a SHA-256 hash of the prompt (
prompt_hash) for deduplication, but the raw text is only sent if you explicitly set storePrompts: true when calling lumiqtrace.init().Span
A span is an event that carries trace context. Every event is technically a span — the term emphasizes that the event participates in a parent-child relationship with other events in the same agent run. Two fields link spans together:span_id— a unique identifier for this specific operationparent_span_id— thespan_idof the operation that triggered this one
Span kinds
Every span has aspan_kind field that describes the type of operation it represents. This controls how the span is rendered in the flame graph and how it appears in the agent registry.
| Span kind | Emitted by | What it represents |
|---|---|---|
llm | Provider wrappers | A direct call to an LLM API |
agent | withAgent(), ADK/LangChain integrations | The execution scope of a single agent |
tool | agent.traceTool(), LangChain/ADK integrations | A tool or function call by an agent |
planning | agent.logPlan() | Steps the agent planned before executing |
handoff | agent.delegateTo(), multi-agent frameworks | An agent delegating to another agent |
retriever | Manual spans, LangChain retriever handler | A document retrieval operation (RAG) |
guardrail | SDK guardrail client | A pre- or post-LLM content check |
general | Manual startSpan() | Any other custom operation |
span_kind automatically for all wrapper-generated spans. For manual spans:
Trace
A trace is a group of spans sharing the sametrace_id. It represents one complete end-to-end agent run — from the first operation to the last, across all agent turns, tool calls, and LLM interactions.
For a simple chatbot making one API call per message, a trace contains one span. For a multi-agent workflow that routes, retrieves context, delegates to specialists, and synthesizes a response, a trace may contain dozens of nested spans across multiple agents.
In the dashboard, the Traces view shows the flame graph for a full trace:
- The x-axis is wall-clock time from start to end of the root span
- Each bar is a span coloured by status (green = success, red = error, yellow = slow)
- Hovering shows span details; clicking opens the full span detail panel
- The total trace cost is the sum of
cost_usdacross all spans
A trace is not an object you create explicitly. It emerges automatically from spans that share a
trace_id. The SDK generates a new trace_id for each top-level agent run and propagates it to all nested operations through context propagation.Project
A project is an isolated container for agent events. Every project has exactly one API key and all events ingested with that key are scoped to that project. Projects are the primary unit of data isolation. Use separate projects for:- Different applications — one project per service or agent system
- Different environments — or use the
environmentfield to keep production and staging in one project with easy filtering
Organization
An organization is the top-level workspace. It holds your projects, team members, and billing subscription. All usage — events ingested, data retained, members invited — counts against the organization’s plan.| Role | Access |
|---|---|
| Owner | Full access including billing, org deletion, and all admin actions |
| Admin | Manage projects, API keys, alerts, AI features; read billing |
| Member | Read-only dashboard access |
Billing is per organization, not per project or user. Your plan’s event quota is shared across all projects and resets monthly.
Cost calculation
LumiqTrace computescost_usd client-side in the SDK before events are sent. Costs appear immediately in the dashboard without any server-side enrichment step.
cost_usd is set to 0 rather than throwing an error. See the supported models reference for the full pricing table.