- Quickstart - save a contract and create an agent
- Save the company rules - what a restriction means
- Create an agent from them - guided setup or a coding assistant
- Check the package - validation and compilation
- What an agent carries - the copied contract and its link
- Example manifest - one complete contract
- Every key - field reference
- Advanced - saved defaults and later edits
- Validation and limits - what checks can establish
- Troubleshooting
- Where to go next
Quickstart
These complete commands create a saved contract and a new agent package. Both creation steps are interactive; finish and save each before continuing.Terminal — project folder
1. Save the company rules
acme-corp is the local storage name. The editor separately lets you set the
company name and revision. The revision starts at 1 and changes only when
you edit it; it is not an Unmute or SDK version.
A provider is the service the agent connects to. SLNG can serve models from
different makers. Keep provider
slng for those models, even when their IDs
name Cartesia or Deepgram. Each role supports several providers and model IDs.
Choosing Allow all models omits that provider’s allow field.
Providers missing from a restricted role remain forbidden. Permission does not
add target support or verify that an ID exists at the service.
See Models for the field meanings.
Use arrows and Enter in menus, and Tab or Shift+Tab between form fields and
controls. F1 opens help; F2 switches sections. A form’s Apply keeps the entry
in the draft. Only Review and save writes it to disk.
See editor controls for the full workflow.
2. Create an agent from them
Use the same saved name when creating the package. These are alternatives; choose one for a new directory.
The draft selects no models, targets or channels. Install the
Unmute skill, then give the assistant the use case and
ask it to complete the existing package under
hotel-agent/manifest.
The CLI copies the contract; the assistant writes the agent.
The skill reads company rules before choosing bindings or tools. It uses exact
approved IDs when listed, preserves the contract, and explains conflicts
instead of weakening rules. Use the complete assistant brief
when handing it a draft.
3. Check the package
After guided setup or the coding assistant completes the package, run:Terminal — project folder
unmute dev;
follow the deployment workflow.
What an agent carries
Initialization copies the selected file tohotel-agent/manifest, preserving
its exact bytes. It also writes this link in agent.yaml.
If attaching a contract by hand, merge this single field into the existing
package; it is not a complete agent.yaml:
agent.yaml
manifest: manifest is supported; no parent paths or remote URLs.
Packages with neither file nor link continue to work without a company contract.
Example manifest
This is a complete contract file, not an agent package. Use it as a starting point for company review; replace the example approvals with your own.manifest
Every key
Onlymanifest and version are required. Add the rule blocks you need.
Omitting a rule adds no restriction. An explicit empty allowlist permits
nothing. Lists cannot contain null, blank strings or duplicate entries, and
unknown keys are refused.
Identity
string
required
The name of the organization this manifest describes, such as
acme-corp.
Any non-blank text is accepted. This is separate from the local name chosen
with unmute manifest create, which identifies the saved file.integer
required
The revision of this manifest: any integer greater than or equal to
1.
Increase it when you publish changed rules. It does not select the agent
schema, an Unmute release, or a LiveKit or Pipecat SDK version.Models
A provider is the service the agent connects to. A model maker creates the model that service offers. For models served through SLNG, keep the provider asslng, even when their IDs name Deepgram, Cartesia or Soniox.
Each role can allow several providers, and each provider can allow several
models. Add provider opens the service picker, then offers Allow all models
or Add model ID. Adding a model opens the input directly.
Use Add model ID again for more models, or Add provider for another service. Completed entries stay in your draft as you move between
screens; no extra Apply step is needed.
The guided editor does not offer Allow nothing for models.
Existing empty model rules remain visible and must be repaired before saving.
Add models, choose Allow all models for a provider, or choose No restriction for the role.
The YAML format and --editor still support explicitly empty lists.
object
Restricts model choices by role. Its only keys are
listen, speak and
think. Each role contains a list of provider entries. Agents still define
their own model profiles; the manifest approves exact provider/model pairs.
Turn models are outside these rules.object[]
Allowed speech-to-text (STT) providers and models. Omit it for no STT
restriction, or write
listen: [] to allow no STT models. When present,
providers missing from this list are forbidden for this role. A provider
may appear only once.string
required
The exact provider value used by the agent’s listen profile, such as
slng
or deepgram. See STT providers for supported integrations
on each target. Provider names are strings, not a fixed manifest enum.string[]
Omit this field to allow all current and future models from this provider.
Other providers remain forbidden unless listed for the role.
Exact model IDs approved for this provider, such as
deepgram/nova:3 with
slng. Model IDs are provider-defined strings. No wildcards or prefix
matching; case must match. An empty list approves none of this provider’s
STT models. There is no default model.object[]
Allowed text-to-speech (TTS) providers and models. Omit it for no TTS
restriction, or write
speak: [] to allow no TTS models. Providers not
listed are forbidden for this role. A provider may appear only once.string
required
The exact provider value used by the agent’s speak profile, such as
slng
or elevenlabs. See TTS providers for target support.
Provider names are strings, not a fixed manifest enum.string[]
Omit this field to allow all current and future models from this provider.
Other providers remain forbidden unless listed for the role.
Exact model IDs approved for this provider, such as
deepgram/aura:2 with
slng. IDs are provider-defined and case-sensitive; wildcards are not
supported. An empty list approves no models. This does not restrict voice
IDs or supply a default voice.object[]
Allowed language-model (LLM) providers and models. Omit it for no LLM
restriction, or write
think: [] to allow no LLM models. Providers not
listed are forbidden for this role. A provider may appear only once.string
required
The exact provider value used by the agent’s think profile, such as
openai or slng. See LLM providers for target support.
Match the configured provider, including when it routes to another service.
Provider names are strings, not a fixed manifest enum.string[]
Omit this field to allow all current and future models from this provider.
Other providers remain forbidden unless listed for the role.
Exact model IDs approved for this provider, such as
gpt-5.6-terra with
openai. IDs are provider-defined and case-sensitive. No wildcards or automatic model choice. An empty list approves
no models.Languages
object
Limits configured STT and TTS languages. Its only key is
allow. Omitting
this block adds no language restriction. It changes no LLM prompt and
does not guarantee the language of every spoken word.string[]
required
Language tags such as
en, es or en-US. Values are not a fixed enum:
the accepted shape is 2 to 8 letters, followed by zero or more hyphen-separated
groups of 1 to 8 letters or digits. The speech integration must also support
the configured tag.Matching ignores case, but uses the whole tag: en does not approve
en-US. No language is chosen by omission. An empty list forbids all
speech languages, including an unset one. For a nonempty list, automatic
or hidden language settings that cannot be checked produce a warning.Regions
object
Limits model-service and deployment regions separately. Its only keys are
models and deployments. Neither list sets the other location.object[]
Region rules for model services, matched by
role and provider. Each
pair may appear only once. An omitted or empty rule list adds no model
region restrictions; a rule’s own empty allow list forbids that pair.
Providers and roles with no matching row have no added region rule.listen | speak | think
required
Exactly one of
listen (STT), speak (TTS), or think (LLM).
There is no default and no turn option.string
required
The exact configured model provider this row governs, such as
slng
or aws. This is a model provider, not the deployment target. It must be
nonempty; provider names are not a fixed manifest enum.string[]
required
Exact native region names for the matched service. There are no shared
EU aliases, wildcards or automatic geographic conversions. Matching is
case-sensitive. An empty list forbids this provider/role even when its
region is unknown. A nonempty list warns when the region cannot be checked.The compiler currently reads these settings:Other providers, unsupported settings and endpoints supplied through
environment variables do not establish a verifiable model region.
A checked gateway setting is not proof of the upstream processing location.
object[]
Region rules matched by deployment provider. Each provider may appear only
once. Omitting this list or a provider’s row adds no region restriction
for that provider.
livekit | pipecat | slng
required
Exactly one of
livekit, pipecat, or slng. Match the target’s
provider, not its instance name. There is no default.string[]
required
Exact native values permitted in the target’s
deployment_region.
If the target declares several regions, every region must be allowed.
An empty list forbids deployment on this provider, including when no
region is declared. With a nonempty list, an omitted region warns.LiveKit and Pipecat use their platform’s region strings; Unmute does not
maintain a closed list. SLNG uses the same 13 regions as its model services:
us-east, us-west, br, eu-west, eu-north, gb, za, il, jp, sg, id, in, au. The retired any value is refused. See Targets.Deployment targets
object
Restricts where the package can be compiled or deployed. Its only key is
allow. Omitting it adds no target restriction.string[]
required
Any subset of
livekit, pipecat, and slng. These are deployment
providers, not target instance names. An empty list allows no target.
Every target declared in the package is checked, even when a command
selects only one of them.Tools
object
Restricts tools by kind and identity. The available keys are
kinds,
names, builtin, and slng. Every applicable rule must pass.
Permission does not create or attach a tool, and it does not add target
support for that tool.object
Restricts execution kinds. Its only key is
allow. Omit it to leave
execution kinds unrestricted by the manifest.string[]
required
Any subset of these eight values:
An empty list allows no tools. The ordinary target capability checks still
apply; listing a gated kind here does not enable it.
object
Restricts package tool names. Its only key is
allow. Omission adds no
package-name restriction.string[]
required
Exact names from the package’s
tools list: for example, check_booking
means tools/check_booking.yaml. Names are user-defined strings, with no
wildcard matching. An empty list permits no package tools.object
Restricts builtin IDs in addition to any kind or package-name rules.
Its only key is
allow. This rule applies only to builtin tools.string[]
required
Exact builtin IDs. Currently
end_call is supported on all three targets;
send_sms is supported only on SLNG. The manifest accepts nonempty ID
strings, while tool validation checks whether the ID and target are
supported. An empty list forbids builtin tools.object
Restricts the identity of tools hosted on SLNG. Its only key is
allow.
This rule applies to a slng: tool on any target that uses it.string[]
required
Exact hosted tool names from
slng:, which may differ from the local tool
filename. Names are organization-defined strings. There is no wildcard or
automatic discovery. The legacy pinned form uses the local package tool
name. An empty list forbids SLNG-hosted tools.Tracing
object
Restricts the tracing provider when tracing is enabled. Its only key is
allow. Tracing stays optional; this block does not turn it on or require it.string[]
required
Any subset of
langfuse and coval. An empty list requires tracing to
remain disabled. Omitting this block adds no provider restriction.
Target support and credential requirements still apply.Advanced
Choose a different default
The first saved manifest becomes the default. Later creations offer to change it. Plainunmute init uses that default and opens guided setup. Without a saved
default, it uses the ordinary creation flow.
This complete command changes the default for future agents:
Terminal — select a saved default
--manifest acme-corp for one agent without changing the default.
Use --from-manifest to open a picker instead; it takes no name.
A broken default is an error unless you select a saved manifest directly.
Draft creation always requires an explicit agent name and --manifest.
Edit the saved source
Saved contracts live under the operating system’s user config directory atunmute/manifests/<name>/manifest. The CLI prints the path after saving.
This complete command reopens the example contract:
Terminal — edit the saved contract
--editor only when you want external YAML editing or need to repair an
invalid saved file. See external editor setup.
Update an existing agent’s contract
When the contract owner approves a new revision, replace the package’smanifest with that approved file, then validate and compile again.
Keep its manifest: manifest link. Neither editing the library nor changing
the default performs this replacement for you.
Validation and limits
The contract covers the whole declared package, including unused profiles, fallbacks and every target override. Selecting one target for compilation does not hide a violation in another target. Known violations fail before output is written. Automatic or hidden language and region values that cannot be checked produce warnings. Read those warnings; a successful compile does not prove data residency. The compile report records the contract name, revision and verification warnings. Existing target capability checks still apply. Permission in a manifest does not add provider support or make an unsupported setting work. The creation console cannot collect custom model endpoint settings or a SLNG Context Router upstream. It excludes those model choices. If your contract allows only such bindings, use--manifest <name> --draft and complete the
package by hand or with a coding assistant. Validation and compilation still
enforce the same rules.
The contract checks declared settings, not arbitrary local tool code, the
provider’s actual processing location or tracing delivery. It is not signed
and does not prevent somebody deleting both file and link. Pronunciation
dictionaries, compliance libraries, placement, URL restrictions, dependency
rules and prefetch limits are not part of this version.
Troubleshooting
Where to go next
Create the agent
Hand a manifest-backed draft to your coding assistant.
Edit company rules
Navigate the editor, save changes and manage backups.
Install the skill
Give the assistant Unmute’s authoring and validation workflow.
Read validation results
Fix package errors before compiling.