Skip to main content

Agent Configuration

An agent is a YAML file in ~/.arc/agents/. The filename (without .yaml) is the agent name used in arc ask --agent <name> and in cron job definitions.

Creating an agent

Interactive

arc agent create
# Agent name: coach
# Workspace path: /workspace/fitness-coach
# Model [sonnet]: sonnet
# Created agent 'coach' at /Users/you/.arc/agents/coach.yaml

With flags

arc agent create \
--name coach \
--workspace /workspace/fitness-coach \
--model sonnet

From an existing YAML file

arc agent create --from ./my-agent.yaml
# Created agent 'my-agent'.

The --name flag overrides the name field in the YAML if you want to rename it on import.

Agent YAML structure

name: coach
description: "Coach Kai - personal fitness coach"
workspace: /workspace/fitness-coach

system_prompt_files:
- AGENTS.md
- IDENTITY.md
- SOUL.md
- USER.md
- TOOLS.md

model: sonnet
allowed_models:
- sonnet
- haiku

permission_mode: approve-all

discord:
channel_id: "1234567890123456789"
require_mention: false

System prompt files

system_prompt_files is a list of filenames relative to workspace. arc reads each file that exists and concatenates them with --- separators to form the system prompt.

# AGENTS.md

<contents>

---

# IDENTITY.md

<contents>

---

The conventional files and their purposes:

FilePurpose
AGENTS.mdClaude Code instructions: tool use, coding conventions, agent behaviors
IDENTITY.mdWho the agent is: role, name, mission
SOUL.mdTone, values, communication style
USER.mdUser profile: preferences, history, context the agent should remember
TOOLS.mdAvailable tools and how the agent should use them

These are conventions inherited from the OpenClaw ecosystem. You can use any filenames you like. Files that do not exist are skipped with a warning in the daemon log.

Local context files (Ollama agents)

Ollama models cannot read the filesystem. The local_context_files field injects the content of workspace files directly into the request as a system message.

name: trainer
workspace: /workspace/fitness-coach
model: ollama/qwen3:8b
local_context_files:
- programs/current.md
- weeks/current.md

Each file is read from workspace/<filename> and included verbatim under --- <filename> --- headers. Files that do not exist are skipped.

This is Ollama-specific: for Claude agents, the agent can read the filesystem directly via Claude Code's file tools.

Model configuration

model is the default model for the agent. allowed_models is an optional list of models that callers are permitted to request. If allowed_models is empty, any valid model string is accepted.

For Claude models, use the acpx alias (sonnet, haiku, default, opus), not the full Anthropic model ID. See the Model Routing guide for the full alias table.

model: sonnet
allowed_models:
- sonnet
- haiku
- ollama/qwen3:8b

A request for a model not in allowed_models is rejected with an error before dispatch.

Permission mode

permission_mode controls how acpx handles tool use permissions. This only applies to Claude dispatch.

Valueacpx flagBehavior
approve-all--approve-allAuto-approve all tool use (file reads, writes, bash)
approve-reads--approve-readsAuto-approve reads; prompt for writes and bash
deny-all--deny-allDeny all tool use
bypassPermissions--approve-allLegacy Claude Code value, mapped to approve-all
auto--approve-allLegacy Claude Code value, mapped to approve-all
acceptEdits--approve-readsLegacy Claude Code value, mapped to approve-reads

For fully automated headless operation (daemon, cron, Discord), use approve-all. For agents that should not modify files, use approve-reads or deny-all.

Discord binding

Bind an agent to a Discord channel by setting discord.channel_id to the channel's ID (a string):

discord:
channel_id: "1234567890123456789"
require_mention: false

require_mention: true means the bot only responds when @mentioned in the channel. The default is false (respond to every message).

Multiple agents can be bound to different channels in the same server. Each channel can only have one agent bound to it.

To get a channel ID in Discord: enable Developer Mode in settings, then right-click the channel and choose "Copy Channel ID".

Managing agents

List all agents

arc agent list
# coach sonnet /workspace/fitness-coach channel=1234567890123456789
# trainer ollama/qwen3:8b /workspace/fitness-coach

Show agent config

arc agent show coach

Prints the raw YAML for the agent.

Edit an agent

arc agent edit coach

Opens the agent YAML in $EDITOR. Restart the daemon after editing for changes to take effect.

Clone an agent

arc agent clone coach coach-dev

Creates a copy of coach as coach-dev. The clone's discord.channel_id is cleared so it does not accidentally steal messages from the original agent's channel.

Delete an agent

arc agent delete coach
# Delete agent 'coach'? [y/N]: y
# Deleted agent 'coach'.

Use --yes to skip the confirmation prompt:

arc agent delete coach --yes

Full example: fitness coach

# ~/.arc/agents/coach.yaml
name: coach
description: "Coach Kai - AI-powered personal fitness coach"
workspace: /workspace/fitness-coach

system_prompt_files:
- AGENTS.md
- IDENTITY.md
- SOUL.md
- USER.md
- TOOLS.md

model: sonnet
allowed_models:
- sonnet
- haiku

permission_mode: approve-all

discord:
channel_id: "1234567890123456789"
require_mention: false
# ~/.arc/agents/coach-quick.yaml
name: coach-quick
description: "Coach Kai on Haiku for fast, cheap responses"
workspace: /workspace/fitness-coach

system_prompt_files:
- IDENTITY.md
- SOUL.md

model: haiku
allowed_models:
- haiku

permission_mode: approve-reads

discord: {}