An agent is a folder
Each agent lives inpackages/ziro-core/src/ziro/agents/<agent_id>/ and is self-contained:
For the field-by-field schema of each file, see
Agent files.
meta.yaml
The shipped agents
- chat flavour
- engineering flavour
- research flavour
Per-agent model and provider
meta.yaml’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.yaml’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
meta.yaml’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 policy file resolves most-specific-first across three layers:1
Project layer
<project>/.ziro/agents/<id>/<file>2
Home layer
~/.ziro/agents/<id>/<file>3
Bundled package
The file shipped inside Ziro itself.
permissions.yaml 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
plugin_config.yaml, and an agent with no
plugin_config.yaml 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 policy file.
Flavours
Grouping agents into a shared workspace.