Kanalen & routering

OpenClaw routeert antwoorden terug naar het kanaal waar een bericht vandaan kwam. Het model kiest geen kanaal; routering is deterministisch en wordt beheerd door de hostconfiguratie.

Belangrijke termen

  • Kanaal: whatsapp, telegram, discord, slack, signal, imessage, webchat.
  • AccountId: per-kanaal accountinstantie (indien ondersteund).
  • Optioneel kanaalstandaardaccount: channels.<channel>.defaultAccount bepaalt welk account wordt gebruikt wanneer een uitgaand pad geen accountId specificeert.
    • Bij multi-accountconfiguraties stel je een expliciet standaardaccount in (defaultAccount of accounts.default) wanneer twee of meer accounts zijn geconfigureerd. Zonder dit kan fallback-routering het eerste genormaliseerde account-ID kiezen.
  • AgentId: een geïsoleerde workspace + sessieopslag (“brein”).
  • SessionKey: de bucketsleutel die wordt gebruikt om context op te slaan en gelijktijdigheid te beheren.

Sessiesleutelvormen (voorbeelden)

Directe berichten worden samengevouwen naar de main-sessie van de agent:

  • agent:<agentId>:<mainKey> (standaard: agent:main:main)

Groepen en kanalen blijven geïsoleerd per kanaal:

  • Groepen: agent:<agentId>:<channel>:group:<id>
  • Kanalen/kamers: agent:<agentId>:<channel>:channel:<id>

Threads:

  • Slack/Discord-threads voegen :thread:<threadId> toe aan de basissleutel.
  • Telegram-forumonderwerpen bevatten :topic:<topicId> in de groepssleutel.

Voorbeelden:

  • agent:main:telegram:group:-1001234567890:topic:42
  • agent:main:discord:channel:123456:thread:987654

Main DM-routevastpinning

Wanneer session.dmScope main is, kunnen directe berichten één main-sessie delen. Om te voorkomen dat de lastRoute van de sessie wordt overschreven door niet-eigenaar DM’s, leidt OpenClaw een vastgepinde eigenaar af uit allowFrom wanneer aan al deze voorwaarden is voldaan:

  • allowFrom heeft precies één niet-wildcard vermelding.
  • De vermelding kan worden genormaliseerd naar een concreet afzender-ID voor dat kanaal.
  • De inkomende DM-afzender komt niet overeen met die vastgepinde eigenaar.

In dat geval registreert OpenClaw nog steeds inkomende sessiemetadata, maar slaat het bijwerken van de main-sessie lastRoute over.

Routeringsregels (hoe een agent wordt gekozen)

Routering kiest één agent voor elk inkomend bericht:

  1. Exacte peer-match (bindings met peer.kind + peer.id).
  2. Bovenliggende peer-match (thread-overerving).
  3. Guild + rollen match (Discord) via guildId + roles.
  4. Guild-match (Discord) via guildId.
  5. Team-match (Slack) via teamId.
  6. Account-match (accountId op het kanaal).
  7. Kanaal-match (elk account op dat kanaal, accountId: "*").
  8. Standaard-agent (agents.list[].default, anders eerste lijstvermelding, terugval naar main).

Wanneer een binding meerdere matchvelden bevat (peer, guildId, teamId, roles), moeten alle opgegeven velden overeenkomen om die binding toe te passen.

De gematchte agent bepaalt welke workspace en sessieopslag worden gebruikt.

Broadcastgroepen (meerdere agents uitvoeren)

Broadcastgroepen stellen je in staat om meerdere agents uit te voeren voor dezelfde peer wanneer OpenClaw normaal zou antwoorden (bijvoorbeeld: in WhatsApp-groepen, na vermeldings-/activeringsgating).

Configuratie:

{
  broadcast: {
    strategy: "parallel",
    "[email protected]": ["alfred", "baerbel"],
    "+15555550123": ["support", "logger"],
  },
}

Zie: Broadcastgroepen.

Configuratieoverzicht

  • agents.list: benoemde agentdefinities (workspace, model, etc.).
  • bindings: koppel inkomende kanalen/accounts/peers aan agents.

Voorbeeld:

{
  agents: {
    list: [{ id: "support", name: "Support", workspace: "~/.openclaw/workspace-support" }],
  },
  bindings: [
    { match: { channel: "slack", teamId: "T123" }, agentId: "support" },
    { match: { channel: "telegram", peer: { kind: "group", id: "-100123" } }, agentId: "support" },
  ],
}

Sessieopslag

Sessieopslag bevindt zich onder de statusmap (standaard ~/.openclaw):

  • ~/.openclaw/agents/<agentId>/sessions/sessions.json
  • JSONL-transcripten bevinden zich naast de opslag

Je kunt het opslagpad overschrijven via session.store en {agentId}-templating.

Gateway- en ACP-sessie-ontdekking scant ook schijfgebaseerde agentopslagen onder de standaard agents/-root en onder getemplatte session.store-roots. Ontdekte opslagen moeten binnen die opgeloste agentroot blijven en een regulier sessions.json-bestand gebruiken. Symlinks en paden buiten de root worden genegeerd.

WebChat-gedrag

WebChat koppelt aan de geselecteerde agent en gebruikt standaard de main-sessie van de agent. Hierdoor kun je in WebChat cross-kanaal context voor die agent op één plek zien.

Antwoordcontext

Inkomende antwoorden bevatten:

  • ReplyToId, ReplyToBody en ReplyToSender wanneer beschikbaar.
  • Geciteerde context wordt als [Replying to ...]-blok aan Body toegevoegd.

Dit is consistent over alle kanalen.