- Quickstart - create, compile, and choose a host
- Keep the package as the source - what belongs where
- Choose models and regions - configuration and target limits
- Separate accounts and credentials - names and values
- Deploy and verify - follow the hosting route
- Update the agent - code, secrets, and names
- Advanced - custom code and hosting limits
- Troubleshooting - symptom, cause, and fix
- Where to go next
Quickstart
Run these commands from the directory that will hold your new package:Terminal
unmute init without a name for the interactive target choices.
A saved manifest guides creation through its allowed choices; see
initialization.
Already have a package? Start inside it at unmute validate. To change its
target, follow Switching a package,
including the model changes that target needs. --target selects a declared
instance; it does not convert the package to another framework.
Then follow one hosting guide:
The target guides supply the authentication, destination, region, and secret
steps those commands need.
unmute deploy currently pushes SLNG only.
1. Keep the package as the source
unmute validate checks the package against each selected target.
unmute compile performs those checks too, then writes
build/<target-instance>/. No provider credentials are needed to compile.
On LiveKit and Pipecat, that directory includes a Dockerfile,
pyproject.toml, runtime code, .env.example, and README.md. Pipecat also
gets pcc-deploy.toml. SLNG gets an agent body and a runbook, with no Python
project or container to build.
Read the generated README.md for your build’s commands and required values.
compile-report.json records resolved models, dependencies, sizing, environment
names, and target limits. Generated files hold names, never credential values.
Recompilation replaces the selected build directory. Keep authored code outside
build/. The compiler preserves .env, livekit*.toml, and samples/*.json;
it does not preserve arbitrary edits or added modules.
2. Choose models and regions
Models live undermodels in agent.yaml. Agents bind a named reasoning and
voice entry; the package also supplies listening and turn detection where its
pipeline uses them.
For example, this is the reasoning entry from the current scaffold. Merge it
into the existing models.think block; it is one supported choice:
agent.yaml
supported provider name
required
Selects an integration for this model role and target. See the role pages below.
string
The provider’s model identifier. Requiredness and defaults depend on the integration;
copy a supported binding from its role page.
object
Provider settings for this binding. Omit to use the integration’s defaults.
These are not an unrestricted runtime configuration API.
Unmute checks provider support and known invalid settings. It transforms some
settings and forwards others to the provider integration; the compile report
shows the resolved binding. Validation cannot prove a model exists in your
account or that every forwarded parameter will succeed.
The role pages link to the provider’s parameter and credential documentation.
For a target-specific choice, use a model override.
An override replaces the provider, model, and parameters. Omitted shared
behavior settings, such as turn timing, carry forward.
Keep three different region choices separate:
A hosting region does not move a provider’s inference service. See
target fields and the
SLNG router for their respective settings.
3. Separate accounts and credentials
For a code target, declare environment names separately from provisioning their
values. Merge the names your package reads into this list:
agent.yaml
list of UPPER_SNAKE names
Inventory of environment names the generated project reads, including non-secret
configuration. Declaring a name does not create or populate a host secret.
SLNG derives its Vault requirements from the compiled body instead.
.env.example.
Fill only the names read by the deployed agent. Some routes also list values
for a separately hosted helper; follow the comments rather than uploading the
whole development environment.
For a handler that reads these two names, a minimal file has this shape.
Replace the placeholders privately before using it:
.env.deploy (outside the build directory)
4. Deploy and verify
Each hosting guide separates first creation, later code updates, and secrets-only changes. It also explains how the host finds the existing agent: LiveKit, Pipecat, SLNG. Check each stage separately:- Validation passes: the package fits the target. Provider access remains untested.
- The build finishes: the host has an image or agent body. Check readiness next.
- The worker is ready: open a new session through the selected host and transport.
- A full interaction works: speak a short question, confirm the input was received, and hear a relevant answer.
- The application works: exercise a tool or task that matters to your agent, then end the session.
unmute dev is the
local browser workflow, not a deployed phone test.
5. Update the agent
Change the authored prompt, tool, model, or configuration, then run from the package directory:Terminal
unmute deploy validates and recompiles automatically before pushing.
A changed value under an existing environment name needs the host’s
secrets-only workflow. Adding a new required name also changes the package’s
inventory, so compile and deploy that source change. Check a new session after
either update.
--target livekit replaces only build/livekit/. Deploying from another build
directory can ship stale code, names, or requirements. Compile the instance
you intend to deploy.
Except changing its name
The package’sname joined to its target instance becomes the deployment name.
A rename is an identity change, and phone routing may still point at the old one.
Renaming a target also changes its build directory. On LiveKit, recover the
existing agent config in that new directory before updating; compilation does
not move it from the old folder.
Follow the rename steps for LiveKit,
Pipecat, or
SLNG before changing a production name.
Advanced
Add only the code you need
Start with native declarations and tools. Use a webhook for an HTTP service or MCP for a supported remote tool server. Use a local Python handler for logic inside the generated LiveKit or Pipecat process. Sharing Python helpers explains the supported single-source-file pattern and the limit on separate imported modules. Arbitrary module trees and data files are not copied into the build. Declared knowledge documents have their own supported inclusion path. There is no authored lifecycle-hook API or custom Dockerfile hook. LiveKit’s target pins can change versions of recognized dependencies within supported bounds; they cannot add arbitrary packages. Pipecat does not support those overrides. Per-tool dependency declarations are refused on both code targets. Use the compiler-owned build files for the native workflow. An SDK that needs an extra package or a custom startup service has no durable package extension point today; consider a remote tool service instead.Hosting the generated container yourself
The managed-host pages cover the native deployment commands. Operating the container yourself also means supplying networking, credentials, monitoring, and session draining. A LiveKit worker connects out to LiveKit Server. The server needs public media connectivity and trusted TLS; SIP adds its own signaling and media service. Follow LiveKit’s self-hosting documentation. For self-hosted Pipecat browser calls, the generated SmallWebRTC configuration adds no ICE servers. Cross-network use needs a supported STUN/TURN setup that Unmute does not currently expose as an authored deployment option.Troubleshooting
Where to go next
LiveKit Cloud
Create a cloud agent, update it, and manage its secrets.
Pipecat Cloud
Deploy the generated project to a chosen organization and region.
SLNG
Push an agent body and resolve its hosted dependencies.
Python tools
Keep reusable tool logic in the authored package.