* fix(agents): finalize guided creation safely Run channel post-write hooks only after config publication, defer portable auth copying until agent creation succeeds without overwriting newer credentials, and provision existing workspaces before publishing updates. Keep JSON-only guided creation interactive while routing wizard output to stderr so stdout remains one machine-readable summary. * fix(terminal): preserve note call signature * fix(agents): pass committed config to setup hooks * ci: split heavy codex changed-test shards Cap non-isolated Codex extension processes at 20 files so 4-vCPU changed-target jobs do not starve real-time watches or hit the no-output watchdog. * test(ci): align codex shard cap fixture * docs(cli): clarify agents add JSON mode
8.5 KiB
summary, read_when, title
| summary | read_when | title | |
|---|---|---|---|
| CLI reference for `openclaw agents` (list/add/delete/bindings/bind/unbind/set identity) |
|
Agents |
openclaw agents
Manage isolated agents (workspaces + auth + routing). Running openclaw agents with no subcommand is equivalent to openclaw agents list.
Related:
- Multi-agent routing
- Agent workspace
- Skills config: skill visibility configuration.
Examples
openclaw agents list
openclaw agents list --bindings
openclaw agents add work --workspace ~/.openclaw/workspace-work
openclaw agents add work --workspace ~/.openclaw/workspace-work --bind telegram:*
openclaw agents add ops --workspace ~/.openclaw/workspace-ops --bind telegram:ops --non-interactive
openclaw agents bindings
openclaw agents bind --agent work --bind telegram:ops
openclaw agents unbind --agent work --bind telegram:ops
openclaw agents set-identity --workspace ~/.openclaw/workspace --from-identity
openclaw agents set-identity --agent main --avatar avatars/openclaw.png
openclaw agents delete work
Command surface
agents list
Options: --json, --bindings (include full routing rules, not only per-agent counts/summaries).
agents add [name]
Options: --workspace <dir>, --model <id>, --agent-dir <dir>, --bind <channel[:accountId]> (repeatable), --non-interactive, --json.
- The automation flags
--workspace,--model,--agent-dir,--bind, and--non-interactiveselect the non-interactive path. Non-interactive mode requires both an agent name and--workspace. --jsonalone keeps the guided wizard interactive. Prompts and status are written to stderr, and stdout contains one JSON summary after setup completes.mainis an ordinary agent id. Recreating it after another agent owns the installation can requireopenclaw doctor --fixto repair legacy session or shared-auth ownership first.- Interactive mode seeds auth by copying only portable static credentials (
api_keyand statictokenprofiles) unless a credential opts out withcopyToAgents: false; OAuth refresh-token profiles are not copied unless a provider opts in withcopyToAgents: true. Without a copy, OAuth stays available through the shared auth base. If the configured default agent has its own local OAuth profile, sign in separately for the new agent.
agents bindings
Options: --agent <id>, --json.
agents bind
Options: --agent <id> (defaults to the current default agent), --bind <channel[:accountId]> (repeatable), --json.
agents unbind
Options: --agent <id> (defaults to the current default agent), --bind <channel[:accountId]> (repeatable), --all, --json. Accepts either --all or one or more --bind values, not both.
agents set-identity
Options: --agent <id>, --workspace <dir>, --identity-file <path>, --from-identity, --name <name>, --theme <theme>, --emoji <emoji>, --avatar <value>, --json. See Set identity below.
agents delete <id>
Options: --force, --json.
- The only configured agent cannot be deleted.
- Without
--force, interactive confirmation is required (fails in a non-TTY session; re-run with--force). - Workspace, agent state, and session transcript directories move to Trash, not hard-deleted. If Trash is unavailable, agent config deletion still succeeds and reports paths requiring manual cleanup;
--jsonexposes path outcomes inremovedandfailedarrays. - On installations that have not migrated shared auth yet, the legacy owner cannot be deleted. Run
openclaw doctor --fix; after relocation into shared state SQLite,mainfollows the same deletion rules as any other agent. - When the Gateway is reachable, deletion routes through the Gateway so config and session-store cleanup share the same writer as runtime traffic. If the Gateway is unreachable, the CLI falls back to the offline local path.
- If another agent's workspace is the same path, inside this workspace, or contains this workspace, the workspace is retained, and
--jsonreportsworkspaceRetained,workspaceRetainedReason, andworkspaceSharedWith.
Routing bindings
Use routing bindings to pin inbound channel traffic to a specific agent.
If you also want different visible skills per agent, configure agents.defaults.skills and agents.entries.*.skills in openclaw.json. See Skills config and Configuration reference.
List bindings:
openclaw agents bindings
openclaw agents bindings --agent work
openclaw agents bindings --json
Add bindings:
openclaw agents bind --agent work --bind telegram:ops --bind discord:guild-a
You can also add bindings when creating an agent:
openclaw agents add work --workspace ~/.openclaw/workspace-work --bind telegram:* --bind discord:*
If you omit accountId (--bind <channel>), OpenClaw resolves it from plugin setup hooks, forced account binding, or the channel's configured account count.
If you omit --agent for bind or unbind, OpenClaw targets the current default agent.
--bind format
| Format | Meaning |
|---|---|
--bind <channel>:* |
Match all accounts on the channel. |
--bind <channel>:<account> |
Match one account. |
--bind <channel> |
Match the default account only, unless the CLI can safely resolve a plugin-specific account scope. |
Binding scope behavior
- A stored binding without
accountIdmatches the channel default account only. accountId: "*"is the channel-wide fallback (all accounts) and is less specific than an explicit account binding.- If the same agent already has a matching channel binding without
accountId, and you later bind with an explicit or resolvedaccountId, OpenClaw upgrades that existing binding in place instead of adding a duplicate.
Examples:
# match all accounts on the channel
openclaw agents bind --agent work --bind telegram:*
# match a specific account
openclaw agents bind --agent work --bind telegram:ops
# initial channel-only binding
openclaw agents bind --agent work --bind telegram
# later upgrade to account-scoped binding
openclaw agents bind --agent work --bind telegram:alerts
After the upgrade, routing for that binding is scoped to telegram:alerts. If you also want default-account routing, add it explicitly (for example --bind telegram:default).
Remove bindings:
openclaw agents unbind --agent work --bind telegram:ops
openclaw agents unbind --agent work --all
Identity files
Each agent workspace can include an IDENTITY.md at the workspace root:
- Example path:
~/.openclaw/workspace/IDENTITY.md set-identity --from-identityreads from the workspace root (or an explicit--identity-file).
Avatar paths resolve relative to the workspace root and cannot escape it, even through a symlink.
Set identity
set-identity writes fields into agents.entries.*.identity: name, theme, emoji, avatar (workspace-relative path, http(s) URL, or data URI).
--agentor--workspaceselects the target agent. If--workspacematches more than one agent, the command fails and asks you to pass--agent.- Local workspace-relative avatar image files are limited to 2 MB. HTTP(S) URLs and
data:URIs are not checked against the local file-size limit. - When no explicit identity fields are provided, the command reads identity data from
IDENTITY.md.
Load from IDENTITY.md:
openclaw agents set-identity --workspace ~/.openclaw/workspace --from-identity
Override fields explicitly:
openclaw agents set-identity --agent main --name "OpenClaw" --emoji "🦞" --avatar avatars/openclaw.png
Config sample:
{
agents: {
entries: {
main: {
default: true,
identity: {
name: "OpenClaw",
theme: "space lobster",
emoji: "🦞",
avatar: "avatars/openclaw.png",
},
},
},
},
}