> ## 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.

# Targets configuration

> Every field of a target, plus the connection files it points at.

`targets.yaml` says where the agent runs. Nothing about the agent's behavior
belongs here.

```yaml targets.yaml theme={null}
targets:
  pipecat:
    provider: pipecat
    version: "1.10.0"

  livekit:
    provider: livekit
    version: "1.8.1"
    sdk_language: python
    models:
      detector:
        provider: livekit
        model: turn-detector-mini
```

## All keys

<ParamField path="targets" type="map" required>
  Target definitions selected by `--target`. Accepts one or more target instance names.
  Required; omission is refused.
</ParamField>

<ParamField path="targets.<name>.provider" type="string" required>
  Target provider. Accepts `livekit`, `pipecat`, `slng`. Required; omission is refused.
</ParamField>

<ParamField path="targets.<name>.version" type="string">
  Framework version pinned in an emitted project. Accepts exact `x.y.z` in the supported
  window for LiveKit and Pipecat. Required for LiveKit and Pipecat; omit on SLNG, which
  emits no framework project.
</ParamField>

<ParamField path="targets.<name>.pins" type="map of strings">
  LiveKit package overrides; other providers do not consume them. Accepts known LiveKit
  package names to semantic versions. If omitted, use the catalog’s package pins.
</ParamField>

<ParamField path="targets.<name>.sdk_language" type="string">
  SDK used by an emitted project. Accepts `python` when written. If omitted, code targets
  emit Python. Omit on SLNG, which refuses this key.
</ParamField>

<ParamField path="targets.<name>.connection" type="string">
  This target's phone route; illegal when the package has no phone use. Accepts connection
  file stem. If omitted, there is no phone route; required for LiveKit or Pipecat
  telephony.
</ParamField>

<ParamField path="targets.<name>.deployment_region" type="string or list of strings">
  Deployment regions; more than one is LiveKit only. LiveKit accepts `us-east`, `eu-central`, or `ap-south`,
  with no duplicates. Pipecat forwards one non-empty platform region name.
  Both use platform placement when omitted. SLNG requires exactly one of its
  [13 world parts](/targets/slng#targets-yaml); omission and `any` are refused. See the target pages for each contract.
</ParamField>

<ParamField path="targets.<name>.warm_instances" type="integer">
  Instances the platform holds ready, so a call is not waiting on a cold container.
  Accepts zero or more; Pipecat only. If omitted, no minimum is emitted; Pipecat can scale
  to zero.
</ParamField>

<ParamField path="targets.<name>.models" type="map">
  Per-target model overrides. Accepts existing model entry names to model definitions. If
  omitted, use the package’s model entries without overrides.
</ParamField>

The map key is the **target instance name**. It is what `--target` takes and
what names the output directory, `build/<name>/`. Two targets may use the same
provider with different settings, for example `pipecat_twilio` and
`pipecat_telnyx`.

That is the whole list. A target says where the agent runs and, for a phone
agent, which one connection carries the call. `unmute compile` compiles a
project only for `livekit` and `pipecat` today; a `slng` target compiles to a
deployment body instead, which [Deploy to SLNG](/deploy/slng) covers.

`vapi` and `deepgram` used to be target names too. Both are retired, and
`unmute validate` refuses either one:

```text theme={null}
provider "deepgram" was retired: the deepgram target never emitted a runnable project and
  was retired on 2026-08-24; deepgram remains available as a model vendor, for example
  slng/deepgram/nova:3-en. Supported providers: livekit, pipecat, slng
```

Deepgram stays a model vendor: what the refusal calls out is the target name,
never the vendor.

## Framework versions are exact

For LiveKit and Pipecat, write all three numbers, such as `1.10.0`. Unmute installs
exactly what the target declares. It never widens the pin or silently upgrades it
for a feature.

This Unmute release supports exactly `livekit-agents` 1.8.1 and
exactly `pipecat-ai` 1.10.0. Any other version is refused.

## Deployment regions

`deployment_region` accepts one region or a list. Pipecat accepts exactly one;
deploying there again means another target and agent name. LiveKit emits one
`lk agent create --region` command per declared region. A LiveKit region is
chosen when the agent is created and cannot be changed in place.

LiveKit accepts `us-east`, `eu-central`, or `ap-south` and refuses other names.
Pipecat forwards its platform's region name as written. A
model endpoint's region is separate and stays in that model's `params` or
`endpoint_env`. See [regional infrastructure](/optimization/regional-infrastructure)
for complete worker, STT, and TTS examples plus LiveKit media guidance.

An empty list entry or duplicate region is an error. See the
[region vocabulary comparison](/optimization/regional-infrastructure#three-region-settings)
before choosing model gateways and worker regions.

## Instances held ready

```yaml theme={null}
    warm_instances: 1
```

With none declared the platform scales to zero when idle, so the first call after
every quiet period waits for a container to start. On a phone route that wait can
outrun the call: the session expires and nobody is answered at all. One instance
held ready removes it, and bills for that instance whether or not anyone calls.

The number lands in `pcc-deploy.toml` as `[scaling] min_agents`, which is why it
belongs here rather than on the deploy command. `pipecat cloud deploy --min-agents 1` does the same thing for one deploy, and the manifest is rewritten
by every `unmute compile`, so a `[scaling]` block added to it by hand does not
survive.

**Pipecat only.** LiveKit refuses it: `livekit.toml` holds the project subdomain
and the agent id and nothing else, and on LiveKit Cloud a warm production replica
is a property of the billing plan rather than something the compiler can write.
See [Pipecat over Twilio](/telephony/pipecat-twilio#deploy-with-a-warm-instance)
for a deployed example.

## Package pins

`pins` is a LiveKit-only escape hatch for packages already known to the LiveKit
driver. Unknown package names and versions below the catalogue floor are errors.
On a `pipecat` target the map validates with no error, and nothing reads it.
SLNG refuses a non-empty `pins` map. Leave it out on both targets.

## models overrides

```yaml theme={null}
    models:
      detector:
        provider: livekit
        model: turn-detector-mini
```

Keyed by the entry name from `agent.yaml`, and taking the same fields as an
entry there. Use it when a target cannot run an entry as defined, or runs its
own better.

An override replaces the entry: a field it does not set is gone, not
inherited from the base entry. Four fields are the exception. `pace`,
`endpointing_delay`, `semantic_endpointing`, and `prompt_suffix` carry forward
from the base entry whenever the override leaves them empty, because every
target running this package wants the same turn timing and the same prompt
directive. An override may replace `endpointing_delay` or `semantic_endpointing`.
It cannot author `pace` or a different `prompt_suffix`.

## The phone route is not here

A target names one connection and declares nothing else about how a call reaches
it:

```yaml targets.yaml theme={null}
targets:
  livekit:
    provider: livekit
    version: "1.8.1"
    sdk_language: python
    connection: twilio_sip
```

The mechanism, the carrier, and the account credentials live in that one file.
See [`connections/<name>.yaml`](/reference/connections-yaml).

Three fields used to sit on the target. Writing any of them here is refused, and
the refusal names the new home:

```text theme={null}
targets.yaml:6: target "livekit" declares transport: sip, which now belongs in
  connections/twilio_sip.yaml. A target names one connection and the connection
  declares the route
```

```text theme={null}
targets.yaml:6: target "livekit" declares carrier: twilio, which now belongs in
  connections/twilio_sip.yaml alongside its transport
```

```text theme={null}
targets.yaml:7: target "livekit" declares destinations, which now belong at the top
  level of agent.yaml. A destination is who this agent escalates to, which is the same
  desk whichever carrier reaches it
```

Where the target names no connection, the first two messages say
`in the connection file this target should name` instead of a file name.

## Where to go next

<Columns cols={2}>
  <Card title="connections/<name>.yaml" icon="phone" href="/reference/connections-yaml">
    The route: transport, carrier, and the names it needs.
  </Card>

  <Card title="Targets" icon="boxes" href="/targets/overview">
    What each generated project looks like.
  </Card>
</Columns>
