#agent-to-agent

1 messages ยท Page 1 of 1 (latest)

flint pasture
#

I want to enable agent 'main' can talk to other agent, and allow main can spawn other agents as sub-agents

{
"agents": {
"defaults": {
"workspace": "/home/openclaw/.openclaw/workspace",
"timeoutSeconds": 3600,
"verboseDefault": "full",
"model": "ollama/gemma4:e4b-h",
"llm": {
"idleTimeoutSeconds": 0
}
},
"list": [
{
"id": "main",
"tools": {
"profile": "full",
"alsoAllow": [
"browser",
"canvas",
"message",
"gateway",
"nodes",
"agents_list",
"tts"
]
},
"subagents": {
"allowAgents": ["onisuzume", "pikachu", "kamonegi"]
}
},
{
"id": "onisuzume",
"name": "onisuzume",
"workspace": "/home/openclaw/.openclaw/workspace/onisuzume",
"agentDir": "/home/openclaw/.openclaw/agents/onisuzume/agent",
"model": "ollama/gemma4:e4b-h",
"tools": {
"profile": "full",
"alsoAllow": ["browser", "canvas", "message", "gateway", "nodes", "agents_list", "tts"]
},
"subagents": {
"maxSpawnDepth": 2,
"runTimeoutSeconds": 900
}
},
{
"id": "pikachu",
"name": "pikachu",
"workspace": "/home/openclaw/.openclaw/workspace/pikachu",
"agentDir": "/home/openclaw/.openclaw/agents/pikachu/agent",
"model": "ollama/gemma4:e4b-h",
"tools": {
"profile": "full",
"alsoAllow": ["browser", "canvas", "message", "gateway", "nodes", "agents_list", "tts"]
},
"subagents": {
"maxSpawnDepth": 2,
"runTimeoutSeconds": 900
}
}
]
},

hidden crescentBOT
heady terraceBOT
#

To help others find answers, you can mark your question as solved via Right click solution message -> Apps -> โœ… Mark Solution

hidden crescentBOT
brave rapidsBOT
#

Youโ€™re very close. main.subagents.allowAgents only enables spawning.
For main to talk to other agents with sessions_send / sessions_list / session_status, you also need:

{
  tools: {
    sessions: {
      visibility: "all"
    },
    agentToAgent: {
      enabled: true,
      allow: ["main", "onisuzume", "pikachu"]
    }
  },
  agents: {
    list: [
#
      {
        id: "main",
        tools: {
          profile: "full"
        },
        subagents: {
          allowAgents: ["onisuzume", "pikachu"]
        }
      }
    ]
  }
}

A few important notes:

#
  • tools.agentToAgent.allow must include both the requester and target agent IDs. So include main too.
  • tools.sessions.visibility must be "all" or cross-agent session tools stay blocked.
  • kamonegi in your allowAgents will not work until you actually add an agent with id: "kamonegi".
  • profile: "full" already includes sessions_send, sessions_spawn, subagents, and agents_list, so you do not need to add those via alsoAllow.

Optional:

  • If you want A2A back-and-forth replies, add:
    session: {
      agentToAgent: {
        maxPingPongTurns: 1
      }
    }
    

Then restart the gateway:

brave rapidsBOT
#

No, not agents.defaults.

These go at the top-level tools block:

{
  tools: {
    sessions: {
      visibility: "all"
    },
    agentToAgent: {
      enabled: true,
      allow: ["main", "onisuzume", "pikachu"]
    }
  }
}
#

If you want spawn permissions only for main, keep this where you already have it:

{
  agents: {
    list: [
      {
        id: "main",
        subagents: {
          allowAgents: ["onisuzume", "pikachu"]
        }
      }
    ]
  }
}
#

If you wanted the same spawn allowlist for all agents by default, then that part would go under:

{
  agents: {
    defaults: {
      subagents: {
        allowAgents: ["onisuzume", "pikachu"]
      }
    }
  }
}

So, short version:

  • tools.agentToAgent โ†’ top level
#
  • tools.sessions.visibility โ†’ top level
  • agents.list[].subagents.allowAgents โ†’ per agent
  • agents.defaults.subagents.allowAgents โ†’ default for all agents

If you want, I can rewrite your full config snippet in the correct shape.

flint pasture
#

please help me to rewrite

brave rapidsBOT
#

Yep, hereโ€™s a cleaned-up rewrite.

I removed alsoAllow because profile: "full" already includes everything, and I removed kamonegi for now because you donโ€™t have an agent with that id yet.

{
  tools: {
    sessions: {
      visibility: "all"
    },
    agentToAgent: {
      enabled: true,
      allow: ["main", "onisuzume", "pikachu"]
    }
  },
#
  agents: {
    defaults: {
      workspace: "/home/openclaw/.openclaw/workspace",
      timeoutSeconds: 3600,
      verboseDefault: "full",
      model: "ollama/gemma4:e4b-h",
      llm: {
        idleTimeoutSeconds: 0
      }
    },

    list: [
      {
        id: "main",
        tools: {
#
          profile: "full"
        },
        subagents: {
          allowAgents: ["onisuzume", "pikachu"]
        }
      },

      {
        id: "onisuzume",
        name: "onisuzume",
        workspace: "/home/openclaw/.openclaw/workspace/onisuzume",
        agentDir: "/home/openclaw/.openclaw/agents/onisuzume/agent",
        model: "ollama/gemma4:e4b-h",
        tools: {
          profile: "full"
#
        },
        subagents: {
          maxSpawnDepth: 2,
          runTimeoutSeconds: 900
        }
      },

      {
        id: "pikachu",
        name: "pikachu",
        workspace: "/home/openclaw/.openclaw/workspace/pikachu",
        agentDir: "/home/openclaw/.openclaw/agents/pikachu/agent",
        model: "ollama/gemma4:e4b-h",
        tools: {
          profile: "full"
#
        },
        subagents: {
          maxSpawnDepth: 2,
          runTimeoutSeconds: 900
        }
      }
    ]
  }
}

Optional, if you want agent-to-agent reply loops too:

{
#
  session: {
    agentToAgent: {
      maxPingPongTurns: 1
    }
  }
}

Then restart:

openclaw gateway restart

If you want, I can also rewrite it again with kamonegi added properly.

flint pasture
brave rapidsBOT
#

Almost, but there are two different top-level blocks:

{
  tools: {
    sessions: {
      visibility: "all"
    },
    agentToAgent: {
      enabled: true,
      allow: ["main", "onisuzume", "pikachu"]
    }
  },

  session: {
    agentToAgent: {
#
      maxPingPongTurns: 1
    }
  }
}

So:

  • tools.sessions.visibility โ†’ under top-level tools
  • tools.agentToAgent โ†’ under top-level tools
  • session.agentToAgent.maxPingPongTurns โ†’ under top-level session, not under tools.sessions

If you want, I can paste the full final config with all 3 agents and the correct top-level layout in one block.

flint pasture
#

{
"tools": {
"sessions": {
"visibility": "all"
},
"agentToAgent": {
"enabled": true,
"allow": ["main", "onisuzume", "pikachu"]
}
},
{
"session": {
"agentToAgent": {
"maxPingPongTurns": 1
}
}
},
"agents": {
"defaults": {

brave rapidsBOT
#

Yep, just one small syntax issue: you added an extra { before "session".

This is the correct shape:

{
  tools: {
    sessions: {
      visibility: "all"
    },
    agentToAgent: {
      enabled: true,
      allow: ["main", "onisuzume", "pikachu"]
    }
  },
#
  session: {
    agentToAgent: {
      maxPingPongTurns: 1
    }
  },

  agents: {
    defaults: {
      workspace: "/home/openclaw/.openclaw/workspace",
      timeoutSeconds: 3600,
      verboseDefault: "full",
      model: "ollama/gemma4:e4b-h",
      llm: {
        idleTimeoutSeconds: 0
      }
#
    },

    list: [
      {
        id: "main",
        tools: {
          profile: "full"
        },
        subagents: {
          allowAgents: ["onisuzume", "pikachu"]
        }
      },
      {
        id: "onisuzume",
        name: "onisuzume",
#
        workspace: "/home/openclaw/.openclaw/workspace/onisuzume",
        agentDir: "/home/openclaw/.openclaw/agents/onisuzume/agent",
        model: "ollama/gemma4:e4b-h",
        tools: {
          profile: "full"
        },
        subagents: {
          maxSpawnDepth: 2,
          runTimeoutSeconds: 900
        }
      },
      {
        id: "pikachu",
        name: "pikachu",
        workspace: "/home/openclaw/.openclaw/workspace/pikachu",
#
        agentDir: "/home/openclaw/.openclaw/agents/pikachu/agent",
        model: "ollama/gemma4:e4b-h",
        tools: {
          profile: "full"
        },
        subagents: {
          maxSpawnDepth: 2,
          runTimeoutSeconds: 900
        }
      }
    ]
  }
}

Your broken part was:

#
  },
  {
    "session": {

It should just be:

  },

  session: {

After that, restart with:

#
openclaw gateway restart

If you want, I can also give you the same thing in strict JSON format instead of JSON5.

flint pasture
#

Apr 17 16:21:41 fedora node[984530]: 2026-04-17T16:21:41.938+07:00 [reload] config reload skipped (invalid config): agents.list.0.tools: Unrecognized key: "subagents", agents.list.1.tools: Unrecognized key: "subagents", agents.list.2.tools: Unrecognized key: "subagents", agents.list.3.tools: Unrecognized key: "subagents"

brave rapidsBOT
#

Ah, that log tells us exactly what happened.

subagents is currently nested inside agents.list[].tools in your real config, and that is invalid.

It must be a sibling of tools, like this:

{
  agents: {
    list: [
      {
        id: "main",
        tools: {
          profile: "full"
        },
        subagents: {
#
          allowAgents: ["onisuzume", "pikachu"]
        }
      }
    ]
  }
}

Not this:

{
  agents: {
    list: [
      {
#
        id: "main",
        tools: {
          profile: "full",
          subagents: {   // โŒ wrong place
            allowAgents: ["onisuzume", "pikachu"]
          }
        }
      }
    ]
  }
}

So the structure should be:

#
{
  tools: { ... },
  session: { ... },
  agents: {
    defaults: { ... },
    list: [
      {
        id: "main",
        tools: { ... },
        subagents: { ... }
      }
    ]
  }
}
#

If you want, use this exact corrected version:

{
  tools: {
    sessions: {
      visibility: "all"
    },
    agentToAgent: {
      enabled: true,
      allow: ["main", "onisuzume", "pikachu"]
    }
  },

  session: {
    agentToAgent: {
#
      maxPingPongTurns: 1
    }
  },

  agents: {
    defaults: {
      workspace: "/home/openclaw/.openclaw/workspace",
      timeoutSeconds: 3600,
      verboseDefault: "full",
      model: "ollama/gemma4:e4b-h",
      llm: {
        idleTimeoutSeconds: 0
      }
    },
#
    list: [
      {
        id: "main",
        tools: {
          profile: "full"
        },
        subagents: {
          allowAgents: ["onisuzume", "pikachu"]
        }
      },
      {
        id: "onisuzume",
        name: "onisuzume",
        workspace: "/home/openclaw/.openclaw/workspace/onisuzume",
        agentDir: "/home/openclaw/.openclaw/agents/onisuzume/agent",
#
        model: "ollama/gemma4:e4b-h",
        tools: {
          profile: "full"
        },
        subagents: {
          maxSpawnDepth: 2,
          runTimeoutSeconds: 900
        }
      },
      {
        id: "pikachu",
        name: "pikachu",
        workspace: "/home/openclaw/.openclaw/workspace/pikachu",
        agentDir: "/home/openclaw/.openclaw/agents/pikachu/agent",
        model: "ollama/gemma4:e4b-h",
#
        tools: {
          profile: "full"
        },
        subagents: {
          maxSpawnDepth: 2,
          runTimeoutSeconds: 900
        }
      }
    ]
  }
}

Then restart:

#
openclaw gateway restart

If it still errors, paste your full current config file because Iโ€™m pretty sure thereโ€™s just an indentation/nesting mistake.

flint pasture
#

{
"tools": {
"sessions": {
"visibility": "all"
},
"agentToAgent": {
"enabled": true,
"allow": ["main", "onisuzume", "pikachu"]
}
},
"session": {
"agentToAgent": {
"maxPingPongTurns": 1
}
},
"agents": {
...
},
"list": [
{
"id": "main",
"tools": {
"profile": "full",
},
"subagents": {
"allowAgents": ["onisuzume","pikachu"]
}
},
{
"id": "onisuzume",
"name": "onisuzume",
"workspace": "/home/openclaw/.openclaw/workspace/onisuzume",
"agentDir": "/home/openclaw/.openclaw/agents/onisuzume/agent",
"model": "ollama/gemma4:e4b-h",
"tools": {
"profile": "full",
},
"subagents": {
"maxSpawnDepth": 2,
"runTimeoutSeconds": 900
}
},
{
"id": "kamonegi",
"name": "kamonegi",
"workspace": "/home/openclaw/.openclaw/workspace/kamonegi",
"agentDir": "/home/openclaw/.openclaw/agents/kamonegi/agent",
"model": "ollama/gemma4:e4b-h",
"tools": {
"profile": "full",
},
"subagents": {
"maxSpawnDepth": 2,
"runTimeoutSeconds": 900
}
},
{
"id": "pikachu",
"name": "pikachu",
"workspace": "/home/openclaw/.openclaw/workspace/pikachu",
"agentDir": "/home/openclaw/.openclaw/agents/pikachu/agent",
"model": "ollama/gemma4:e4b-h",
"tools": {
"profile": "full",
},
"subagents": {
"maxSpawnDepth": 2,
"runTimeoutSeconds": 900
}
}
]
},

brave rapidsBOT
#

Youโ€™re very close, but this part is still malformed:

  • "list" must be inside "agents"
  • remove the ...
  • if you want main to talk to/spawn kamonegi, add kamonegi to both allowlists

Use this exact shape:

{
  "tools": {
    "sessions": {
      "visibility": "all"
    },
    "agentToAgent": {
      "enabled": true,
#
      "allow": ["main", "onisuzume", "kamonegi", "pikachu"]
    }
  },
  "session": {
    "agentToAgent": {
      "maxPingPongTurns": 1
    }
  },
  "agents": {
    "defaults": {
      "workspace": "/home/openclaw/.openclaw/workspace",
      "timeoutSeconds": 3600,
      "verboseDefault": "full",
      "model": "ollama/gemma4:e4b-h",
      "llm": {
#
        "idleTimeoutSeconds": 0
      }
    },
    "list": [
      {
        "id": "main",
        "tools": {
          "profile": "full"
        },
        "subagents": {
          "allowAgents": ["onisuzume", "kamonegi", "pikachu"]
        }
      },
      {
        "id": "onisuzume",
#
        "name": "onisuzume",
        "workspace": "/home/openclaw/.openclaw/workspace/onisuzume",
        "agentDir": "/home/openclaw/.openclaw/agents/onisuzume/agent",
        "model": "ollama/gemma4:e4b-h",
        "tools": {
          "profile": "full"
        },
        "subagents": {
          "maxSpawnDepth": 2,
          "runTimeoutSeconds": 900
        }
      },
      {
        "id": "kamonegi",
        "name": "kamonegi",
#
        "workspace": "/home/openclaw/.openclaw/workspace/kamonegi",
        "agentDir": "/home/openclaw/.openclaw/agents/kamonegi/agent",
        "model": "ollama/gemma4:e4b-h",
        "tools": {
          "profile": "full"
        },
        "subagents": {
          "maxSpawnDepth": 2,
          "runTimeoutSeconds": 900
        }
      },
      {
        "id": "pikachu",
        "name": "pikachu",
        "workspace": "/home/openclaw/.openclaw/workspace/pikachu",
#
        "agentDir": "/home/openclaw/.openclaw/agents/pikachu/agent",
        "model": "ollama/gemma4:e4b-h",
        "tools": {
          "profile": "full"
        },
        "subagents": {
          "maxSpawnDepth": 2,
          "runTimeoutSeconds": 900
        }
      }
    ]
  }
}

Then run:

#
openclaw gateway restart

One more subtle thing: tools.agentToAgent.allow is symmetric, so allowlisting onisuzume/kamonegi/pikachu means they can also initiate A2A unless you restrict their session tools separately.

flint pasture
#

[openclaw@fedora openclaw-config]$ openclaw doctor
Invalid config at /home/openclaw/.openclaw/openclaw.json:\n- agents.list.1.subagents: Unrecognized keys: "maxSpawnDepth", "runTimeoutSeconds"

  • agents.list.2.subagents: Unrecognized keys: "maxSpawnDepth", "runTimeoutSeconds"
  • agents.list.3.subagents: Unrecognized keys: "maxSpawnDepth", "runTimeoutSeconds"
brave rapidsBOT
#

Can you paste openclaw --version too? Version mismatch does matter here.

But the fix is clear from that doctor output:

  • maxSpawnDepth and runTimeoutSeconds do not belong under agents.list[].subagents
  • move them to agents.defaults.subagents
  • keep agents.list[].subagents only for things like allowAgents

Use this shape:

{
  "tools": {
    "sessions": {
      "visibility": "all"
    },
#
    "agentToAgent": {
      "enabled": true,
      "allow": ["main", "onisuzume", "kamonegi", "pikachu"]
    }
  },
  "session": {
    "agentToAgent": {
      "maxPingPongTurns": 1
    }
  },
  "agents": {
    "defaults": {
      "workspace": "/home/openclaw/.openclaw/workspace",
      "timeoutSeconds": 3600,
      "verboseDefault": "full",
#
      "model": "ollama/gemma4:e4b-h",
      "llm": {
        "idleTimeoutSeconds": 0
      },
      "subagents": {
        "maxSpawnDepth": 2,
        "runTimeoutSeconds": 900
      }
    },
    "list": [
      {
        "id": "main",
        "tools": {
          "profile": "full"
        },
#
        "subagents": {
          "allowAgents": ["onisuzume", "kamonegi", "pikachu"]
        }
      },
      {
        "id": "onisuzume",
        "name": "onisuzume",
        "workspace": "/home/openclaw/.openclaw/workspace/onisuzume",
        "agentDir": "/home/openclaw/.openclaw/agents/onisuzume/agent",
        "model": "ollama/gemma4:e4b-h",
        "tools": {
          "profile": "full"
        }
      },
      {
#
        "id": "kamonegi",
        "name": "kamonegi",
        "workspace": "/home/openclaw/.openclaw/workspace/kamonegi",
        "agentDir": "/home/openclaw/.openclaw/agents/kamonegi/agent",
        "model": "ollama/gemma4:e4b-h",
        "tools": {
          "profile": "full"
        }
      },
      {
        "id": "pikachu",
        "name": "pikachu",
        "workspace": "/home/openclaw/.openclaw/workspace/pikachu",
        "agentDir": "/home/openclaw/.openclaw/agents/pikachu/agent",
        "model": "ollama/gemma4:e4b-h",
#
        "tools": {
          "profile": "full"
        }
      }
    ]
  }
}

Short rule of thumb:

  • agents.defaults.subagents โ†’ global spawn behavior like maxSpawnDepth, runTimeoutSeconds
  • agents.list[].subagents โ†’ per-agent allowlist like allowAgents

Then run:

#
openclaw doctor
openclaw gateway restart

If you paste openclaw --version, I can sanity-check whether your docs and installed schema are aligned.

flint pasture
#

OpenClaw 2026.4.14 (323493f)

brave rapidsBOT
#

Perfect, thanks. That version lines up with what doctor is telling you.

On OpenClaw 2026.4.14:

  • agents.defaults.subagents supports maxSpawnDepth and runTimeoutSeconds
  • agents.list[].subagents does not support those keys
  • per-agent subagents is basically for things like allowAgents (and some lighter overrides), not nesting/timeout controls

So for your version, this is the correct pattern:

{
  "tools": {
    "sessions": {
      "visibility": "all"
    },
#
    "agentToAgent": {
      "enabled": true,
      "allow": ["main", "onisuzume", "kamonegi", "pikachu"]
    }
  },
  "session": {
    "agentToAgent": {
      "maxPingPongTurns": 1
    }
  },
  "agents": {
    "defaults": {
      "workspace": "/home/openclaw/.openclaw/workspace",
      "timeoutSeconds": 3600,
      "verboseDefault": "full",
#
      "model": "ollama/gemma4:e4b-h",
      "llm": {
        "idleTimeoutSeconds": 0
      },
      "subagents": {
        "maxSpawnDepth": 2,
        "runTimeoutSeconds": 900
      }
    },
    "list": [
      {
        "id": "main",
        "tools": {
          "profile": "full"
        },
#
        "subagents": {
          "allowAgents": ["onisuzume", "kamonegi", "pikachu"]
        }
      },
      {
        "id": "onisuzume",
        "name": "onisuzume",
        "workspace": "/home/openclaw/.openclaw/workspace/onisuzume",
        "agentDir": "/home/openclaw/.openclaw/agents/onisuzume/agent",
        "model": "ollama/gemma4:e4b-h",
        "tools": {
          "profile": "full"
        }
      },
      {
#
        "id": "kamonegi",
        "name": "kamonegi",
        "workspace": "/home/openclaw/.openclaw/workspace/kamonegi",
        "agentDir": "/home/openclaw/.openclaw/agents/kamonegi/agent",
        "model": "ollama/gemma4:e4b-h",
        "tools": {
          "profile": "full"
        }
      },
      {
        "id": "pikachu",
        "name": "pikachu",
        "workspace": "/home/openclaw/.openclaw/workspace/pikachu",
        "agentDir": "/home/openclaw/.openclaw/agents/pikachu/agent",
        "model": "ollama/gemma4:e4b-h",
#
        "tools": {
          "profile": "full"
        }
      }
    ]
  }
}

Then run:

openclaw doctor
openclaw gateway restart
#

If doctor comes back clean, youโ€™re good. If it still complains, paste the new error and Iโ€™ll help trim the last bit.

flint pasture
#

โ—‡ Doctor warnings โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚ โ”‚
โ”‚ - channels.discord.accounts.satoshi.groupPolicy is "allowlist" but groupAllowFrom (and โ”‚
โ”‚ allowFrom) is empty โ€” all group messages will be silently dropped. Add sender IDs to โ”‚
โ”‚ channels.discord.accounts.satoshi.groupAllowFrom or โ”‚
โ”‚ channels.discord.accounts.satoshi.allowFrom, or set groupPolicy to "open". โ”‚
โ”‚ - channels.discord.accounts.onisuzume.groupPolicy is "allowlist" but groupAllowFrom (and โ”‚
โ”‚ allowFrom) is empty โ€” all group messages will be silently dropped. Add sender IDs to โ”‚
โ”‚ channels.discord.accounts.onisuzume.groupAllowFrom or โ”‚
โ”‚ channels.discord.accounts.onisuzume.allowFrom, or set groupPolicy to "open". โ”‚
โ”‚ - channels.discord.accounts.pikachu.groupPolicy is "allowlist" but groupAllowFrom (and โ”‚
โ”‚ allowFrom) is empty โ€” all group messages will be silently dropped. Add sender IDs to โ”‚
โ”‚ channels.discord.accounts.pikachu.groupAllowFrom or โ”‚
โ”‚ channels.discord.accounts.pikachu.allowFrom, or set groupPolicy to "open". โ”‚
โ”‚ โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ

"bindings": [
{
"agentId": "onisuzume",
"match": {
"channel": "discord",
"accountId": "onisuzume"
}
},
{
"agentId": "pikachu",
"match": {
"channel": "discord",
"accountId": "pikachu"
}
}
],

I will pate my channels.discord after this .

brave rapidsBOT
#

Yep, paste your channels.discord next.

Also, those warnings are separate from your agent/subagent config.
Your bindings look fine. The problem now is Discord group/channel access:

  • groupPolicy: "allowlist" is enabled
  • but groupAllowFrom / allowFrom is empty
  • so those Discord accounts will silently ignore server/channel messages

So for each Discord account, you need one of these:

  1. Keep it locked down, add your Discord user id to allowFrom or groupAllowFrom
  2. Make it broader, set groupPolicy: "open"

Example of the locked-down version:

#
{
  "channels": {
    "discord": {
      "accounts": {
        "onisuzume": {
          "groupPolicy": "allowlist",
          "allowFrom": ["347768170330849282"]
        },
        "pikachu": {
          "groupPolicy": "allowlist",
          "allowFrom": ["347768170330849282"]
        }
      }
    }
  }
#
}

If satoshi should also work in servers, do the same there.

So, short version:

  • bindings = routing, probably okay
  • channels.discord.accounts.*.groupPolicy/allowFrom = who is allowed to trigger the bot in Discord servers, currently blocking you

Paste your channels.discord block and Iโ€™ll help rewrite it cleanly.

flint pasture
#

"channels": {
"discord": {
"enabled": true,
"dm": {
"enabled": true
},
"allowBots": true,
"defaultAccount": "satoshi",
"accounts": {
"satoshi": {
"token": "BOT_1_TOKEN",
"groupPolicy": "allowlist",
"guilds": {
"SERVER_ID": {
"channels": {
"PRIVATE_BOT1_CHAT": {
"requireMention": false,
"enabled": true
},
"GENERAL_CHAT_ID": {
"requireMention": true,
"enabled": true
}
}
}
}
},
"onisuzume": {
"token": "BOT_2_TOKEN",
"groupPolicy": "allowlist",
"guilds": {
"SERVER_ID": {
"channels": {
"PRIVATE_BOT2_CHAT": {
"requireMention": false,
"enabled": true
},
"GENERAL_CHAT_ID": {
"requireMention": true,
"enabled": true
}
}
}
}
},
"pikachu": {
"token": "BOT_3_TOKEN",
"groupPolicy": "allowlist",
"guilds": {
"SERVER_ID": {
"channels": {
"PRIVATE_BOT3_CHAT": {
"requireMention": false,
"enabled": true
},
"GENERAL_CHAT_ID": {
"requireMention": true,
"enabled": true
}
}
}
}
},
"default": {
"groupPolicy": "open",
"dmPolicy": "allowlist",
"allowFrom": [
"MY_DC_ID",
"BOT_1_ID",
"BOT_2_ID",
"BOT_3_ID"
]
}
}
}
},

brave rapidsBOT
#

Aha, I see the issue.

Your "default" block under channels.discord.accounts is not a shared defaults block.
It only applies to an account literally named "default".

So this part:

"accounts": {
  "default": {
    "groupPolicy": "open",
    "dmPolicy": "allowlist",
    "allowFrom": [...]
  }
}
#

does not get inherited by satoshi, onisuzume, or pikachu.

Fix

Move allowFrom (and optionally dmPolicy) to the top-level channels.discord block, or repeat it under each named account.

Hereโ€™s the clean rewrite:

"channels": {
  "discord": {
    "enabled": true,
    "dm": {
      "enabled": true
    },
    "dmPolicy": "allowlist",
#
    "allowBots": true,
    "defaultAccount": "satoshi",
    "allowFrom": [
      "MY_DC_ID",
      "BOT_1_ID",
      "BOT_2_ID",
      "BOT_3_ID"
    ],
    "accounts": {
      "satoshi": {
        "token": "BOT_1_TOKEN",
        "groupPolicy": "allowlist",
        "guilds": {
          "SERVER_ID": {
            "channels": {
#
              "PRIVATE_BOT1_CHAT": {
                "requireMention": false,
                "enabled": true
              },
              "GENERAL_CHAT_ID": {
                "requireMention": true,
                "enabled": true
              }
            }
          }
        }
      },
      "onisuzume": {
        "token": "BOT_2_TOKEN",
        "groupPolicy": "allowlist",
#
        "guilds": {
          "SERVER_ID": {
            "channels": {
              "PRIVATE_BOT2_CHAT": {
                "requireMention": false,
                "enabled": true
              },
              "GENERAL_CHAT_ID": {
                "requireMention": true,
                "enabled": true
              }
            }
          }
        }
      },
#
      "pikachu": {
        "token": "BOT_3_TOKEN",
        "groupPolicy": "allowlist",
        "guilds": {
          "SERVER_ID": {
            "channels": {
              "PRIVATE_BOT3_CHAT": {
                "requireMention": false,
                "enabled": true
              },
              "GENERAL_CHAT_ID": {
                "requireMention": true,
                "enabled": true
              }
            }
#
          }
        }
      }
    }
  }
}

Important note

You probably only need:

"allowFrom": ["MY_DC_ID"]
#

unless you explicitly want bot-authored Discord messages to trigger other bots.
For internal OpenClaw agent-to-agent / subagent behavior, the bot IDs usually are not needed.

So Iโ€™d recommend starting with just your user ID first.

After updating it, run:

openclaw doctor
openclaw gateway restart

If you want, next I can combine this channels.discord block with your agents + tools config into one final full openclaw.json.

flint pasture
#

my Intnetion is bot should talk to each other in general chat

brave rapidsBOT
#

Got it. That changes the answer a bit.

If your intention is visible bot-to-bot chatting in Discord general chat, then yes:

  • keep allowBots: true
  • include the bot user IDs in allowFrom
  • do not put that under accounts.default, put it at channels.discord.allowFrom
  • make sure the target channel is enabled for each bot account

Safer setup Iโ€™d recommend

Keep GENERAL_CHAT_ID as:

"GENERAL_CHAT_ID": {
  "requireMention": true,
#
  "enabled": true
}

and use:

"allowFrom": [
  "MY_DC_ID",
  "BOT_1_ID",
  "BOT_2_ID",
  "BOT_3_ID"
]

That lets bots respond to each other when explicitly mentioned / replied to, but avoids runaway chatter.

#

If you want autonomous bot-to-bot chatter in general

Then youโ€™d need:

"GENERAL_CHAT_ID": {
  "requireMention": false,
  "enabled": true
}

But Iโ€™m a bit worried about that in a general channel, because it can create:

  • reply loops
  • spam storms
  • bots constantly re-triggering each other
#

So honestly, for that mode Iโ€™d use a dedicated bot channel, not general.

Recommended split

  • Internal agent collaboration: use sessions_send / sessions_spawn
  • Human-visible bot-to-bot chat: dedicated Discord bot channel
  • General chat: keep requireMention: true

So yes, if you really want bots to talk to each other in chat, keep the bot IDs in channels.discord.allowFrom.
Just donโ€™t rely on accounts.default for that, it wonโ€™t inherit to the named accounts.

If you want, I can rewrite your full channels.discord block for the bot-to-bot in general chat case, with both:

  1. safe mention-gated mode
  2. autonomous mode
flint pasture
#

oh that's I want

brave rapidsBOT
#

Nice, then use the autonomous bot-to-bot version.

This is the channels.discord shape Iโ€™d use for that:

"channels": {
  "discord": {
    "enabled": true,
    "dm": {
      "enabled": true
    },
    "dmPolicy": "allowlist",
    "allowBots": true,
    "defaultAccount": "satoshi",
    "allowFrom": [
      "MY_DC_ID",
#
      "BOT_1_ID",
      "BOT_2_ID",
      "BOT_3_ID"
    ],
    "accounts": {
      "satoshi": {
        "token": "BOT_1_TOKEN",
        "groupPolicy": "allowlist",
        "guilds": {
          "SERVER_ID": {
            "channels": {
              "PRIVATE_BOT1_CHAT": {
                "requireMention": false,
                "enabled": true
              },
#
              "GENERAL_CHAT_ID": {
                "requireMention": false,
                "enabled": true
              }
            }
          }
        }
      },
      "onisuzume": {
        "token": "BOT_2_TOKEN",
        "groupPolicy": "allowlist",
        "guilds": {
          "SERVER_ID": {
            "channels": {
              "PRIVATE_BOT2_CHAT": {
#
                "requireMention": false,
                "enabled": true
              },
              "GENERAL_CHAT_ID": {
                "requireMention": false,
                "enabled": true
              }
            }
          }
        }
      },
      "pikachu": {
        "token": "BOT_3_TOKEN",
        "groupPolicy": "allowlist",
        "guilds": {
#
          "SERVER_ID": {
            "channels": {
              "PRIVATE_BOT3_CHAT": {
                "requireMention": false,
                "enabled": true
              },
              "GENERAL_CHAT_ID": {
                "requireMention": false,
                "enabled": true
              }
            }
          }
        }
      }
    }
#
  }
}

Important changes:

  • allowFrom moved to top-level channels.discord.allowFrom
  • removed the fake "accounts.default" block
  • GENERAL_CHAT_ID.requireMention = false for all three bots
  • allowBots = true stays on

That should let the bots talk to each other in the shared general channel.

Two quick warnings:

  1. This can absolutely create reply loops.
#
  1. Start with a low-traffic test channel before using a real general channel.

After updating:

openclaw doctor
openclaw gateway restart

If you want, I can now merge this with your tools + session + agents blocks into one final full config.

flint pasture
#

also bind that you provide above still need ? as well ?

brave rapidsBOT
#

Yes, keep the bindings if you want each Discord account to map to a specific agent.

They do a different job:

  • channels.discord... = who can talk, which channels are allowed
  • bindings = which agent handles messages from each Discord account

So for your setup, Iโ€™d keep something like:

"bindings": [
  {
    "agentId": "main",
    "match": {
      "channel": "discord",
      "accountId": "satoshi"
#
    }
  },
  {
    "agentId": "onisuzume",
    "match": {
      "channel": "discord",
      "accountId": "onisuzume"
    }
  },
  {
    "agentId": "pikachu",
    "match": {
      "channel": "discord",
      "accountId": "pikachu"
    }
#
  }
]

When bindings are needed

Keep them if you want:

  • satoshi bot account โ†’ main agent
  • onisuzume bot account โ†’ onisuzume agent
  • pikachu bot account โ†’ pikachu agent

When bindings are optional

If you remove them, traffic falls back to the default agent routing, so multiple accounts may end up hitting main, which is probably not what you want.