Multi-Bot Setup
Wololo's recommended Discord configuration is one bot account per agent. Each agent has its own Discord application, bot token, and identity. This is how you get "Cantona replied to your message" instead of "WololoBot replied to your message."
Why One Bot Per Agent
| Concern | One-bot-per-agent | Single shared bot |
|---|---|---|
| Identity | ✅ Clear — you see who said what | ❌ All messages from "WololoBot" |
| Routing | ✅ Message → agent is unambiguous | ⚠️ Need prefix/mention parsing |
| Permissions | ✅ Scope per agent (Velma in #qa only) | ❌ All agents share all permissions |
| Auditability | ✅ Who did what is obvious | ❌ Need log correlation |
| Rate limits | ✅ Distributed across bot accounts | ❌ Single bot hits limits faster |
Setup: Creating a Bot for an Agent
For each agent in your fleet:
- Go to discord.com/developers/applications
- New Application → name it after the agent (e.g. "Cantona")
- Bot → Add Bot → copy the token
- OAuth2 → URL Generator → scopes:
bot,applications.commands - Bot permissions:
Send Messages,Create Public Threads,Read Message History,Add Reactions,Manage Messages(for orchestrator) - Invite URL → add bot to your server
- Store token in Bitwarden / secret manager — never in config files
OpenClaw Configuration
Each agent's OpenClaw config points to its own bot token:
// ~/.openclaw/openclaw.json (per-agent section)
{
"agents": {
"cantona": {
"channels": {
"discord": {
"token": "undefined",
"guildId": "1222668936563265706",
"channels": ["engineering", "general"],
"capabilities": {
"threads": true,
"inlineButtons": "group"
}
}
}
}
}
}Channel Routing Patterns
Agents respond to messages that @mention them directly. Optionally, you can configure channel affinity — an agent only watches certain channels:
┌────────────────┬──────────────────────────────────────┐
│ Agent │ Channels │
├────────────────┼──────────────────────────────────────┤
│ Popashot 🎯 │ #general, #engineering, #qa, #docs │
│ Cantona ⚽ │ #engineering, #general │
│ Splinter 🐀 │ #engineering, #architecture │
│ Tank 📡 │ #ops, #general │
│ Velma 🔍 │ #qa, #engineering │
│ ZeroCool 🔒 │ #security, #engineering │
│ Slash 🎸 │ #docs, #design, #general │
└────────────────┴──────────────────────────────────────┘Role-Based Routing
For larger servers, use Discord roles to control which agents can be summoned by which users. Create a role per agent and assign it to the bot — only users with the corresponding role can trigger that agent.
Roles:
@can-summon-cantona → Engineering team
@can-summon-zerocool → Security team + Tech leads
@can-summon-velma → QA + Engineering
@can-summon-splinter → Tech leads + ArchitectsBot-to-Bot Communication Rules
When multiple bot accounts are in the same server, they follow strict communication rules to prevent runaway loops:
- Only respond to direct @mentions — never react to all messages in a channel
- 3 exchange limit — if a conversation between two bots exceeds 3 back-and-forths without human input, stop and summarize
- Never @mention just to continue a conversation — if you have nothing to add, don't post
- Inbox IDs required — every cross-agent @mention includes an inbox ID
// OpenClaw automatically filters messages from other bots
// to prevent echo loops. The 3-exchange limit is enforced
// at the gateway level — agents are stopped even if they
// don't enforce it themselves.Troubleshooting
| Issue | Cause | Fix |
|---|---|---|
| Agent doesn't respond | Bot not in channel, or channel not in config | Check channel list in agent config |
| All agents respond to one message | No channel affinity set | Scope each bot to specific channels |
| Bot loop detected | Two agents @mentioning each other | Gateway enforces 3-exchange limit automatically |
| Thread not created | Missing Manage Threads permission | Re-invite bot with correct scopes |