> ## Documentation Index
> Fetch the complete documentation index at: https://docs.galtea.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Trace

> A single turn in a conversation between a user and an AI system

## What is a Trace?

A trace is a single turn in a conversation — one user input paired with one AI output. It belongs to a [session](/concepts/product/version/session) and can optionally include metadata like latency, token usage, cost, and retrieval context (for RAG evaluations).

You can create traces from the [Galtea dashboard](https://platform.galtea.ai/) (using [Endpoint Connections](/concepts/product/endpoint-connection)) or programmatically using the [Galtea SDK](/sdk/api/trace/service).

<Note>
  **This entity was called Inference Result before SDK 5.0.0**, and `galtea.traces` used to mean what
  is now a [Span](/concepts/product/version/session/span). See
  [Dataset, Trace, and Span Renames](/sdk/migration-guides/entity-renames) for what to change in
  your code.
</Note>

<Info>
  **Two things are called "trace" here.** A Galtea Trace is the turn described on this page, and its
  own id is `id`. An OpenTelemetry trace is a distributed-tracing correlation id, the API field
  `traceId`. The [OpenTelemetry Trace ID](#trace-properties) property below holds that one, not the id
  of this Trace. The dashboard uses the same two names: "Galtea Trace ID" for this turn's id and
  "OpenTelemetry Trace ID" for the correlation id.
</Info>

## SDK Integration

<Card title="Trace Service SDK" icon="arrow-right-from-bracket" iconType="solid" href="/sdk/api/trace/service">
  Manage traces using the Python SDK
</Card>

## Trace Properties

<ResponseField name="Session" type="Session" required>
  The session to which the trace belongs.
</ResponseField>

<ResponseField name="Input" type="string | object" optional>
  The input text or prompt for the trace. For most runs this is a plain string. For phone (voice) runs, when the simulated user's audio was captured, this is a content-parts envelope `{"user_message": "<transcript>", "content": [{"type": "audio", "uri": "...", "transcript": "..."}]}` — the `user_message` field is the canonical scored scalar. Access the envelope via the SDK's `.input_data` field and the spoken transcript via `.input`.
</ResponseField>

<ResponseField name="Output" type="string | object" optional>
  The generated output or response for the trace. For most runs this is a plain string. For phone (voice) runs, when the agent's audio was captured, this is a content-parts envelope `{"assistant_message": "<transcript>", "content": [{"type": "audio", "uri": "...", "transcript": "..."}]}` — the `assistant_message` field is the canonical scored scalar. Access the envelope via the SDK's `.actual_output_data` field and the scored transcript via `.actual_output`.
</ResponseField>

<Note>
  Retrieval context is not a stored field on the trace. It is derived from the trace's
  [`RETRIEVER` spans](/concepts/product/version/session/span#retrieval-context-in-retriever-spans).
  You can still supply `retrieval_context` when logging (on create, update, or an agent response); Galtea
  records it as a `RETRIEVER` span.

  If your agent already emits spans, we recommend sending `RETRIEVER` spans directly instead. This keeps
  one source of truth and lets you capture several retrieval steps per turn, which a single
  `retrieval_context` value cannot.
</Note>

<ResponseField name="Latency" type="float" optional>
  The latency in milliseconds for the model's response.
</ResponseField>

<ResponseField name="Usage Info" type="dict" optional>
  Token usage information for the trace.
</ResponseField>

<ResponseField name="Cost Info" type="dict" optional>
  Cost information for the trace.
</ResponseField>

<ResponseField name="Dropped Span Count" type="int" optional>
  How many spans sent with this trace were not stored. Empty when none were. A span is dropped when its data is invalid, for example an empty name or a negative latency, and each drop adds to this count as more spans arrive. An unrecognized span **type** never causes a drop; Galtea [normalizes it](/concepts/product/version/session/span#span-types) instead. The dashboard shows the count on the trace so you do not have to read a log to learn a span is missing.
</ResponseField>

<ResponseField name="OpenTelemetry Trace ID" type="string" optional>
  The W3C trace ID for the root span created during [Direct Inference](/concepts/product/endpoint-connection). This is the OpenTelemetry trace id, not the id of this Trace, which is `id`. It is the same trace ID propagated to your endpoint via the `traceparent` header, enabling correlation with your OTEL-instrumented service. Only present when the inference was generated via Direct Inference with W3C trace context propagation enabled.
</ResponseField>

## Related

<CardGroup cols={3}>
  <Card title="Concepts overview" icon="diagram-project" iconType="solid" href="/concepts/overview">
    How Galtea's concepts connect — diagram + per-entity quick reference.
  </Card>

  <Card title="Session" icon="comments" href="/concepts/product/version/session">
    The conversation that groups traces together.
  </Card>

  <Card title="Evaluation" icon="clipboard-check" href="/concepts/product/version/session/evaluation">
    Score traces using metrics.
  </Card>

  <Card title="Span" icon="sitemap" href="/concepts/product/version/session/span">
    Capture internal operations linked to traces.
  </Card>
</CardGroup>
