An agent is a folder
Each agent lives inpackages/ziro-core/src/ziro/agents/<agent_id>/ and is
self-contained. It is configured by a single settings.yaml with one optional
section per concern:
_policy / _servers /
_config suffix. Legacy split files (shell_policy.yaml, …) still resolve at
each layer as an alternative to the matching section, so existing agents keep
working; run ziro migrate-config to fold them into one file.
There are no agent config files in the project root. If an agent omits a
section, the loader degrades to the built-in defaults for that feature.
For the field-by-field schema of each section, see
Agent files, and Configuration
for how layers deep-merge.
The meta section
The shipped agents
- chat flavour
- engineering flavour
- research flavour
Per-agent model and provider
Themeta section’s model field sets the model id for that agent. It flows through
AgentProfile.model into the LLM factory at startup. Omit it, or set
model: null, to use the provider’s env default.
meta section’s provider field selects the LLM provider for that agent:
openrouter, anthropic, openai, or any custom label you have registered.
Default is None, which falls back to the global default provider
(ZIRO_LLM_PROVIDER, itself defaulting to openrouter).
Provider and model resolve as one coupled pair, never as independent axes.
An explicit model choice wins and carries its provider; otherwise the provider
decides and the model follows the agent’s pin only when compatible, else the
provider default. See Providers.
planning, execution, and fast_execution each resolve from
<PROVIDER>_<TIER>_MODEL (for example OPENROUTER_EXECUTION_MODEL), collapsing
to <PROVIDER>_MODEL when unset. The token resolves against whichever provider
is active at build time.
The enabled flag
Themeta section’s enabled flag controls whether an agent is selectable. A disabled
agent is hidden from the picker and rejected if requested with --agent.
packages/ziro-core/src/ziro/agents/registry.yaml holds only default, the agent used when none is
named. If the default agent is disabled, the first enabled agent is used instead.
Config resolution order
Every section resolves most-specific-first across three layers, and the layers deep-merge (a partial override inherits unset keys from lower layers):1
Project layer
<project>/.ziro/agents/<id>/settings.yaml (or the matching split file)2
Home layer
~/.ziro/agents/<id>/settings.yaml3
Bundled package
The
settings.yaml shipped inside Ziro itself.permissions section in the project layer and inherit everything else from the
bundle. This is how an installed Ziro is configured under ~/.ziro/agents/<id>/
without editing the package.
Memory isolation
Long-term memory is keyed("memory", user_id, agent_id), so each agent keeps
its own facts per user. The agent_id flows through the runnable config to both
the memory loader and the save_memory tool.
When a flavour is active, the key becomes ("memory", user_id, flavour) instead.
Every agent in a flavour shares one memory store, so switching agents inside a
flavour never loses or cross-contaminates memory. A config with no flavour
(subagents, legacy callers) falls back to agent_id.
Selecting an agent
/agent lists the agents available in the active flavour and switches
in place, keeping the same thread and history.
Managing agents
add seeds the config files from the default agent, or from --template <id>.
Pass --no-copy for a meta-only scaffold.
A newly scaffolded agent ships no
plugins section, and an agent with no
plugins section in any config layer surfaces zero plugins. Plugins are
per-agent opt-in: a new agent never silently inherits whatever the machine has
installed.Next steps
Manage agents CLI
Every subcommand, with flags.
Agent files
The schema of each
settings.yaml section.Flavours
Grouping agents into a shared workspace.