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

> ## Agent Instructions
> Unmute compiles to exactly three targets. Pipecat and LiveKit are code targets: compile writes a Python project you run. SLNG is a hosted target: compile writes a deployment body and SLNG runs the agent, so it has no `unmute dev`. Those three are the only values `provider` accepts in `targets.yaml`. Deepgram and ElevenLabs appear in these docs as model vendors, which is not the same thing as a target, and `slng` is both.
> The Go structs in `internal/spec` and `internal/ir` are the schema truth. Check a field against them, or run `unmute validate`, rather than against what you remember.

# Tracing

> See what happened inside a call: what the caller said, what the model decided, and which tools ran.

Tracing records the inside of a call. Each turn becomes a span, so you can see
what the caller said, what the model did with it, which tools ran, and how long
each step took.

Turn it on with one block in `agent.yaml`:

```yaml theme={null}
tracing:
  provider: langfuse
```

There are two providers.

| Provider                        | Use it for                                                                   | Needs                                                             |
| ------------------------------- | ---------------------------------------------------------------------------- | ----------------------------------------------------------------- |
| [`langfuse`](/tracing/langfuse) | watching live calls and debugging one conversation at a time                 | `LANGFUSE_BASE_URL`, `LANGFUSE_PUBLIC_KEY`, `LANGFUSE_SECRET_KEY` |
| [`coval`](/tracing/coval)       | scoring simulated calls in Coval, where each trace belongs to one simulation | `COVAL_API_KEY`                                                   |

Pick one. `provider` takes a single value.

## Tracing fields

<ParamField path="provider" type="string" required>
  Accepts `langfuse` or `coval`. Required inside `tracing`; no provider is inferred. Omit
  the whole `tracing` block to disable tracing. Supported on LiveKit and Pipecat; refused
  on SLNG.
</ParamField>

## What works where

Tracing needs a process to instrument, so it works on the two code targets and
not on the hosted one.

| Target    | Tracing |
| --------- | ------- |
| `pipecat` | yes     |
| `livekit` | yes     |
| `slng`    | no      |

A hosted target instruments no process of yours: read its calls in the SLNG
dashboard instead.

## Secrets

You do not have to list tracing keys under `secrets:` yourself. The compiler
adds the ones your chosen provider needs, and `unmute compile` prints them in
the required environment list. See [secrets](/reference/secrets).

Leaving a tracing key out of `secrets:` does not stop it being required. Both
`unmute validate` and `unmute compile` warn on it every time. `unmute compile`
prints:

```text theme={null}
warning: livekit: environment variables referenced but not declared in secrets: COVAL_API_KEY (tracing.provider: coval)
```

## Before you send real calls through it

A trace can contain caller speech, model input and output, and tool arguments and
results. That is the point of it, and it is also the risk.

Use fake identities and fake customer data for release tests. Keep those tests in
a separate project on whichever provider you chose, and do not send real customer
data until that project's access and retention rules are approved.

## Where to go next

<Columns cols={2}>
  <Card title="Coval" icon="flask" href="/tracing/coval">
    Attach spans to the simulation that produced the call.
  </Card>

  <Card title="Langfuse" icon="eye" href="/tracing/langfuse">
    Watch a live call and debug one conversation at a time.
  </Card>
</Columns>
