Skip to main content
Ziro can run as one of several named agents, each with its own persona, tool policy, MCP servers, and guardrails. Plug-and-play is per agent: every agent carries its own on/off flag, so agents are enabled and disabled independently. There is no global single-vs-multi toggle.

An agent is a folder

Each agent lives in packages/ziro-core/src/ziro/agents/<agent_id>/ and is self-contained:
There are no agent config files in the project root. If an agent omits a file, the loader degrades to the built-in defaults for that feature.
For the field-by-field schema of each file, see Agent files.

meta.yaml

The shipped agents

coder, analyst, and researcher run shell and write tools with default_action: allow and no per-call approval, so they work in headless and subagent flows. Autonomy is bought back with deterministic containment rather than a human gate: they do not hold the web tools, fs_write refuses the control plane (.env, *_policy.yaml, permissions.yaml, hooks.yaml, .git, .github, .ziro), and their shell policies add a per-agent deny regex list. See Permissions.

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.
You can also pin a model tier token instead of a concrete id:
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.
Resolution is per file, not per folder: an agent can override just 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.
An untrusted project layer is skipped wholesale for files in DANGEROUS_PROJECT_FILES (which includes plugin_config.yaml). Folder trust is content-hashed, so editing such a file revokes trust until you re-confirm it.

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

In-chat, /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.