Zum Hauptinhalt springen

Konfigurationsreferenz

Zentrale Konfigurationsreferenz für ~/.openclaw/openclaw.json. Eine aufgabenorientierte Übersicht finden Sie unter Konfiguration. Diese Seite behandelt die wichtigsten OpenClaw-Konfigurationsoberflächen und verlinkt weiter, wenn ein Subsystem eine eigene, ausführlichere Referenz hat. Sie versucht nicht, jeden kanal-/plugin-eigenen Befehlskatalog oder jede tiefgehende Memory-/QMD-Einstellung auf einer einzigen Seite einzubetten. Code-Quelle:
  • openclaw config schema gibt das Live-JSON-Schema aus, das für Validierung und Control UI verwendet wird, wobei gebündelte Plugin-/Kanal-Metadaten zusammengeführt werden, wenn verfügbar
  • config.schema.lookup gibt einen einzelnen pfadbezogenen Schemaknoten für Drilldown-Tools zurück
  • pnpm config:docs:check / pnpm config:docs:gen validieren den Hash der Konfigurationsdokumentations-Baseline gegen die aktuelle Schemaoberfläche
Dedizierte ausführliche Referenzen:
  • Memory-Konfigurationsreferenz für agents.defaults.memorySearch.*, memory.qmd.*, memory.citations und Dreaming-Konfiguration unter plugins.entries.memory-core.config.dreaming
  • Slash Commands für den aktuellen integrierten + gebündelten Befehlskatalog
  • zuständige Kanal-/Plugin-Seiten für kanalspezifische Befehlsoberflächen
Das Konfigurationsformat ist JSON5 (Kommentare + nachgestellte Kommas sind erlaubt). Alle Felder sind optional — OpenClaw verwendet sichere Standardwerte, wenn sie weggelassen werden.

Kanäle

Jeder Kanal startet automatisch, wenn sein Konfigurationsabschnitt vorhanden ist (außer bei enabled: false).

DM- und Gruppenzugriff

Alle Kanäle unterstützen DM-Richtlinien und Gruppenrichtlinien:
DM-RichtlinieVerhalten
pairing (Standard)Unbekannte Absender erhalten einen einmaligen Pairing-Code; der Eigentümer muss zustimmen
allowlistNur Absender in allowFrom (oder im gepaarten Erlaubnisspeicher)
openAlle eingehenden DMs zulassen (erfordert allowFrom: ["*"])
disabledAlle eingehenden DMs ignorieren
GruppenrichtlinieVerhalten
allowlist (Standard)Nur Gruppen, die der konfigurierten Erlaubnisliste entsprechen
openGruppen-Erlaubnislisten umgehen (Mention-Gating gilt weiterhin)
disabledAlle Gruppen-/Raumnachrichten blockieren
channels.defaults.groupPolicy setzt den Standard, wenn groupPolicy eines Providers nicht gesetzt ist. Pairing-Codes laufen nach 1 Stunde ab. Ausstehende DM-Pairing-Anfragen sind auf 3 pro Kanal begrenzt. Wenn ein Provider-Block vollständig fehlt (channels.<provider> nicht vorhanden), fällt die Gruppenrichtlinie zur Laufzeit auf allowlist zurück (Fail-Closed) und gibt beim Start eine Warnung aus.

Kanal-Modellüberschreibungen

Verwenden Sie channels.modelByChannel, um bestimmte Kanal-IDs an ein Modell zu binden. Werte akzeptieren provider/model oder konfigurierte Modell-Aliasse. Das Kanal-Mapping wird angewendet, wenn eine Sitzung nicht bereits eine Modellüberschreibung hat (zum Beispiel über /model gesetzt).
{
  channels: {
    modelByChannel: {
      discord: {
        "123456789012345678": "anthropic/claude-opus-4-6",
      },
      slack: {
        C1234567890: "openai/gpt-4.1",
      },
      telegram: {
        "-1001234567890": "openai/gpt-4.1-mini",
        "-1001234567890:topic:99": "anthropic/claude-sonnet-4-6",
      },
    },
  },
}

Kanal-Standardeinstellungen und Heartbeat

Verwenden Sie channels.defaults für gemeinsames Gruppenrichtlinien- und Heartbeat-Verhalten über Provider hinweg:
{
  channels: {
    defaults: {
      groupPolicy: "allowlist", // open | allowlist | disabled
      contextVisibility: "all", // all | allowlist | allowlist_quote
      heartbeat: {
        showOk: false,
        showAlerts: true,
        useIndicator: true,
      },
    },
  },
}
  • channels.defaults.groupPolicy: Fallback-Gruppenrichtlinie, wenn eine providerbezogene groupPolicy nicht gesetzt ist.
  • channels.defaults.contextVisibility: Standardmodus für die Sichtbarkeit ergänzenden Kontexts für alle Kanäle. Werte: all (Standard, schließt allen zitierten/Thread-/Verlaufs-Kontext ein), allowlist (schließt nur Kontext von erlaubten Absendern ein), allowlist_quote (wie allowlist, behält aber expliziten Zitat-/Antwortkontext bei). Überschreibung pro Kanal: channels.<channel>.contextVisibility.
  • channels.defaults.heartbeat.showOk: Gesunde Kanalstatus in die Heartbeat-Ausgabe aufnehmen.
  • channels.defaults.heartbeat.showAlerts: Beeinträchtigte/Fehlerstatus in die Heartbeat-Ausgabe aufnehmen.
  • channels.defaults.heartbeat.useIndicator: Kompakte Heartbeat-Ausgabe im Indikatorstil rendern.

WhatsApp

WhatsApp läuft über den Web-Kanal des Gateways (Baileys Web). Er startet automatisch, wenn eine verknüpfte Sitzung vorhanden ist.
{
  channels: {
    whatsapp: {
      dmPolicy: "pairing", // pairing | allowlist | open | disabled
      allowFrom: ["+15555550123", "+447700900123"],
      textChunkLimit: 4000,
      chunkMode: "length", // length | newline
      mediaMaxMb: 50,
      sendReadReceipts: true, // blaue Häkchen (false im Selbstchat-Modus)
      groups: {
        "*": { requireMention: true },
      },
      groupPolicy: "allowlist",
      groupAllowFrom: ["+15551234567"],
    },
  },
  web: {
    enabled: true,
    heartbeatSeconds: 60,
    reconnect: {
      initialMs: 2000,
      maxMs: 120000,
      factor: 1.4,
      jitter: 0.2,
      maxAttempts: 0,
    },
  },
}
{
  channels: {
    whatsapp: {
      accounts: {
        default: {},
        personal: {},
        biz: {
          // authDir: "~/.openclaw/credentials/whatsapp/biz",
        },
      },
    },
  },
}
  • Ausgehende Befehle verwenden standardmäßig das Konto default, falls vorhanden; andernfalls die erste konfigurierte Konto-ID (sortiert).
  • Optional überschreibt channels.whatsapp.defaultAccount diese Standardkontenauswahl, wenn es mit einer konfigurierten Konto-ID übereinstimmt.
  • Das alte Baileys-Authentifizierungsverzeichnis für ein einzelnes Konto wird von openclaw doctor nach whatsapp/default migriert.
  • Überschreibungen pro Konto: channels.whatsapp.accounts.<id>.sendReadReceipts, channels.whatsapp.accounts.<id>.dmPolicy, channels.whatsapp.accounts.<id>.allowFrom.

Telegram

{
  channels: {
    telegram: {
      enabled: true,
      botToken: "your-bot-token",
      dmPolicy: "pairing",
      allowFrom: ["tg:123456789"],
      groups: {
        "*": { requireMention: true },
        "-1001234567890": {
          allowFrom: ["@admin"],
          systemPrompt: "Halten Sie Antworten kurz.",
          topics: {
            "99": {
              requireMention: false,
              skills: ["search"],
              systemPrompt: "Bleiben Sie beim Thema.",
            },
          },
        },
      },
      customCommands: [
        { command: "backup", description: "Git-Backup" },
        { command: "generate", description: "Ein Bild erstellen" },
      ],
      historyLimit: 50,
      replyToMode: "first", // off | first | all | batched
      linkPreview: true,
      streaming: "partial", // off | partial | block | progress (Standard: off; explizit aktivieren, um Ratenbegrenzungen bei Vorschau-Bearbeitungen zu vermeiden)
      actions: { reactions: true, sendMessage: true },
      reactionNotifications: "own", // off | own | all
      mediaMaxMb: 100,
      retry: {
        attempts: 3,
        minDelayMs: 400,
        maxDelayMs: 30000,
        jitter: 0.1,
      },
      network: {
        autoSelectFamily: true,
        dnsResultOrder: "ipv4first",
      },
      proxy: "socks5://localhost:9050",
      webhookUrl: "https://example.com/telegram-webhook",
      webhookSecret: "secret",
      webhookPath: "/telegram-webhook",
    },
  },
}
  • Bot-Token: channels.telegram.botToken oder channels.telegram.tokenFile (nur reguläre Datei; Symlinks werden abgelehnt), mit TELEGRAM_BOT_TOKEN als Fallback für das Standardkonto.
  • Optional überschreibt channels.telegram.defaultAccount die Standardkontenauswahl, wenn es mit einer konfigurierten Konto-ID übereinstimmt.
  • In Setups mit mehreren Konten (2+ Konto-IDs) sollten Sie einen expliziten Standard setzen (channels.telegram.defaultAccount oder channels.telegram.accounts.default), um Fallback-Routing zu vermeiden; openclaw doctor warnt, wenn dies fehlt oder ungültig ist.
  • configWrites: false blockiert von Telegram initiierte Konfigurationsschreibvorgänge (Supergroup-ID-Migrationen, /config set|unset).
  • Top-Level-Einträge in bindings[] mit type: "acp" konfigurieren persistente ACP-Bindings für Foren-Themen (verwenden Sie das kanonische chatId:topic:topicId in match.peer.id). Die Feldsemantik ist gemeinsam in ACP Agents beschrieben.
  • Telegram-Stream-Vorschauen verwenden sendMessage + editMessageText (funktioniert in Direkt- und Gruppenchats).
  • Retry-Richtlinie: siehe Retry-Richtlinie.

Discord

{
  channels: {
    discord: {
      enabled: true,
      token: "your-bot-token",
      mediaMaxMb: 100,
      allowBots: false,
      actions: {
        reactions: true,
        stickers: true,
        polls: true,
        permissions: true,
        messages: true,
        threads: true,
        pins: true,
        search: true,
        memberInfo: true,
        roleInfo: true,
        roles: false,
        channelInfo: true,
        voiceStatus: true,
        events: true,
        moderation: false,
      },
      replyToMode: "off", // off | first | all | batched
      dmPolicy: "pairing",
      allowFrom: ["1234567890", "123456789012345678"],
      dm: { enabled: true, groupEnabled: false, groupChannels: ["openclaw-dm"] },
      guilds: {
        "123456789012345678": {
          slug: "friends-of-openclaw",
          requireMention: false,
          ignoreOtherMentions: true,
          reactionNotifications: "own",
          users: ["987654321098765432"],
          channels: {
            general: { allow: true },
            help: {
              allow: true,
              requireMention: true,
              users: ["987654321098765432"],
              skills: ["docs"],
              systemPrompt: "Nur kurze Antworten.",
            },
          },
        },
      },
      historyLimit: 20,
      textChunkLimit: 2000,
      chunkMode: "length", // length | newline
      streaming: "off", // off | partial | block | progress (progress wird auf Discord zu partial abgebildet)
      maxLinesPerMessage: 17,
      ui: {
        components: {
          accentColor: "#5865F2",
        },
      },
      threadBindings: {
        enabled: true,
        idleHours: 24,
        maxAgeHours: 0,
        spawnSubagentSessions: false, // Opt-in für sessions_spawn({ thread: true })
      },
      voice: {
        enabled: true,
        autoJoin: [
          {
            guildId: "123456789012345678",
            channelId: "234567890123456789",
          },
        ],
        daveEncryption: true,
        decryptionFailureTolerance: 24,
        tts: {
          provider: "openai",
          openai: { voice: "alloy" },
        },
      },
      execApprovals: {
        enabled: "auto", // true | false | "auto"
        approvers: ["987654321098765432"],
        agentFilter: ["default"],
        sessionFilter: ["discord:"],
        target: "dm", // dm | channel | both
        cleanupAfterResolve: false,
      },
      retry: {
        attempts: 3,
        minDelayMs: 500,
        maxDelayMs: 30000,
        jitter: 0.1,
      },
    },
  },
}
  • Token: channels.discord.token, mit DISCORD_BOT_TOKEN als Fallback für das Standardkonto.
  • Direkte ausgehende Aufrufe, die ein explizites Discord-token bereitstellen, verwenden dieses Token für den Aufruf; Kontowiederholungs-/Richtlinieneinstellungen stammen weiterhin aus dem ausgewählten Konto im aktiven Laufzeit-Snapshot.
  • Optional überschreibt channels.discord.defaultAccount die Standardkontenauswahl, wenn es mit einer konfigurierten Konto-ID übereinstimmt.
  • Verwenden Sie user:<id> (DM) oder channel:<id> (Guild-Kanal) für Zustellungsziele; einfache numerische IDs werden abgelehnt.
  • Guild-Slugs sind kleingeschrieben, wobei Leerzeichen durch - ersetzt werden; Kanalschlüssel verwenden den Slug-Namen (ohne #). Bevorzugen Sie Guild-IDs.
  • Von Bots verfasste Nachrichten werden standardmäßig ignoriert. allowBots: true aktiviert sie; verwenden Sie allowBots: "mentions", um nur Bot-Nachrichten zu akzeptieren, die den Bot erwähnen (eigene Nachrichten werden weiterhin gefiltert).
  • channels.discord.guilds.<id>.ignoreOtherMentions (und Kanalüberschreibungen) verwirft Nachrichten, die einen anderen Benutzer oder eine andere Rolle erwähnen, aber nicht den Bot (ausgenommen @everyone/@here).
  • maxLinesPerMessage (Standard 17) teilt hohe Nachrichten auch dann auf, wenn sie unter 2000 Zeichen liegen.
  • channels.discord.threadBindings steuert an Discord-Threads gebundenes Routing:
    • enabled: Discord-Überschreibung für an Threads gebundene Sitzungsfunktionen (/focus, /unfocus, /agents, /session idle, /session max-age sowie gebundene Zustellung/Weiterleitung)
    • idleHours: Discord-Überschreibung für automatisches Entfokussieren bei Inaktivität in Stunden (0 deaktiviert)
    • maxAgeHours: Discord-Überschreibung für hartes maximales Alter in Stunden (0 deaktiviert)
    • spawnSubagentSessions: Opt-in-Schalter für die automatische Thread-Erstellung/-Bindung durch sessions_spawn({ thread: true })
  • Top-Level-Einträge in bindings[] mit type: "acp" konfigurieren persistente ACP-Bindings für Kanäle und Threads (verwenden Sie Kanal-/Thread-ID in match.peer.id). Die Feldsemantik ist gemeinsam in ACP Agents beschrieben.
  • channels.discord.ui.components.accentColor setzt die Akzentfarbe für Discord-Komponenten-v2-Container.
  • channels.discord.voice aktiviert Unterhaltungen in Discord-Sprachkanälen sowie optionale automatische Beitritte und TTS-Überschreibungen.
  • channels.discord.voice.daveEncryption und channels.discord.voice.decryptionFailureTolerance werden an DAVE-Optionen von @discordjs/voice durchgereicht (standardmäßig true bzw. 24).
  • OpenClaw versucht zusätzlich, den Empfang von Sprache wiederherzustellen, indem nach wiederholten Entschlüsselungsfehlern eine Sprachsitzung verlassen und erneut beigetreten wird.
  • channels.discord.streaming ist der kanonische Schlüssel für den Stream-Modus. Veraltete Werte streamMode und boolesche streaming-Werte werden automatisch migriert.
  • channels.discord.autoPresence bildet die Laufzeitverfügbarkeit auf die Bot-Präsenz ab (healthy => online, degraded => idle, exhausted => dnd) und erlaubt optionale Überschreibungen des Statustexts.
  • channels.discord.dangerouslyAllowNameMatching aktiviert veränderbares Namens-/Tag-Matching erneut (Break-Glass-Kompatibilitätsmodus).
  • channels.discord.execApprovals: Discord-native Zustellung von Exec-Genehmigungen und Autorisierung von Genehmigern.
    • enabled: true, false oder "auto" (Standard). Im Auto-Modus werden Exec-Genehmigungen aktiviert, wenn Genehmiger aus approvers oder commands.ownerAllowFrom aufgelöst werden können.
    • approvers: Discord-Benutzer-IDs, die Exec-Anfragen genehmigen dürfen. Fällt auf commands.ownerAllowFrom zurück, wenn weggelassen.
    • agentFilter: optionale Erlaubnisliste für Agent-IDs. Weglassen, um Genehmigungen für alle Agenten weiterzuleiten.
    • sessionFilter: optionale Sitzungs-Schlüsselmuster (Teilzeichenfolge oder Regex).
    • target: wohin Genehmigungsaufforderungen gesendet werden. "dm" (Standard) sendet an DMs der Genehmiger, "channel" an den Ursprungskanal, "both" an beides. Wenn das Ziel "channel" enthält, sind Schaltflächen nur für aufgelöste Genehmiger nutzbar.
    • cleanupAfterResolve: löscht bei true Genehmigungs-DMs nach Genehmigung, Ablehnung oder Zeitüberschreitung.
Modi für Benachrichtigungen über Reaktionen: off (keine), own (Nachrichten des Bots, Standard), all (alle Nachrichten), allowlist (aus guilds.<id>.users für alle Nachrichten).

Google Chat

{
  channels: {
    googlechat: {
      enabled: true,
      serviceAccountFile: "/path/to/service-account.json",
      audienceType: "app-url", // app-url | project-number
      audience: "https://gateway.example.com/googlechat",
      webhookPath: "/googlechat",
      botUser: "users/1234567890",
      dm: {
        enabled: true,
        policy: "pairing",
        allowFrom: ["users/1234567890"],
      },
      groupPolicy: "allowlist",
      groups: {
        "spaces/AAAA": { allow: true, requireMention: true },
      },
      actions: { reactions: true },
      typingIndicator: "message",
      mediaMaxMb: 20,
    },
  },
}
  • Service-Account-JSON: inline (serviceAccount) oder dateibasiert (serviceAccountFile).
  • SecretRef für den Service Account wird ebenfalls unterstützt (serviceAccountRef).
  • Env-Fallbacks: GOOGLE_CHAT_SERVICE_ACCOUNT oder GOOGLE_CHAT_SERVICE_ACCOUNT_FILE.
  • Verwenden Sie spaces/<spaceId> oder users/<userId> für Zustellungsziele.
  • channels.googlechat.dangerouslyAllowNameMatching aktiviert veränderbares Matching von E-Mail-Principals erneut (Break-Glass-Kompatibilitätsmodus).

Slack

{
  channels: {
    slack: {
      enabled: true,
      botToken: "xoxb-...",
      appToken: "xapp-...",
      dmPolicy: "pairing",
      allowFrom: ["U123", "U456", "*"],
      dm: { enabled: true, groupEnabled: false, groupChannels: ["G123"] },
      channels: {
        C123: { allow: true, requireMention: true, allowBots: false },
        "#general": {
          allow: true,
          requireMention: true,
          allowBots: false,
          users: ["U123"],
          skills: ["docs"],
          systemPrompt: "Nur kurze Antworten.",
        },
      },
      historyLimit: 50,
      allowBots: false,
      reactionNotifications: "own",
      reactionAllowlist: ["U123"],
      replyToMode: "off", // off | first | all | batched
      thread: {
        historyScope: "thread", // thread | channel
        inheritParent: false,
      },
      actions: {
        reactions: true,
        messages: true,
        pins: true,
        memberInfo: true,
        emojiList: true,
      },
      slashCommand: {
        enabled: true,
        name: "openclaw",
        sessionPrefix: "slack:slash",
        ephemeral: true,
      },
      typingReaction: "hourglass_flowing_sand",
      textChunkLimit: 4000,
      chunkMode: "length",
      streaming: {
        mode: "partial", // off | partial | block | progress
        nativeTransport: true, // Slack-native Streaming-API verwenden, wenn mode=partial
      },
      mediaMaxMb: 20,
      execApprovals: {
        enabled: "auto", // true | false | "auto"
        approvers: ["U123"],
        agentFilter: ["default"],
        sessionFilter: ["slack:"],
        target: "dm", // dm | channel | both
      },
    },
  },
}
  • Socket-Modus erfordert sowohl botToken als auch appToken (SLACK_BOT_TOKEN + SLACK_APP_TOKEN als Env-Fallback für das Standardkonto).
  • HTTP-Modus erfordert botToken plus signingSecret (am Root oder pro Konto).
  • botToken, appToken, signingSecret und userToken akzeptieren Klartextzeichenfolgen oder SecretRef-Objekte.
  • Slack-Konto-Snapshots stellen pro Anmeldedaten Quelle-/Statusfelder wie botTokenSource, botTokenStatus, appTokenStatus und im HTTP-Modus signingSecretStatus bereit. configured_unavailable bedeutet, dass das Konto über SecretRef konfiguriert ist, der aktuelle Befehls-/Laufzeitpfad den Secret-Wert jedoch nicht auflösen konnte.
  • configWrites: false blockiert von Slack initiierte Konfigurationsschreibvorgänge.
  • Optional überschreibt channels.slack.defaultAccount die Standardkontenauswahl, wenn es mit einer konfigurierten Konto-ID übereinstimmt.
  • channels.slack.streaming.mode ist der kanonische Schlüssel für den Slack-Stream-Modus. channels.slack.streaming.nativeTransport steuert den nativen Streaming-Transport von Slack. Veraltete Werte streamMode, boolesche streaming-Werte und nativeStreaming werden automatisch migriert.
  • Verwenden Sie user:<id> (DM) oder channel:<id> für Zustellungsziele.
Modi für Benachrichtigungen über Reaktionen: off, own (Standard), all, allowlist (aus reactionAllowlist). Isolierung von Thread-Sitzungen: thread.historyScope ist pro Thread (Standard) oder kanalweit gemeinsam. thread.inheritParent kopiert das übergeordnete Kanaltranskript in neue Threads.
  • Slack-natives Streaming sowie der Slack-assistentenartige Thread-Status „is typing…“ erfordern ein Antwort-Thread-Ziel. DMs auf oberster Ebene bleiben standardmäßig außerhalb von Threads, daher verwenden sie stattdessen typingReaction oder normale Zustellung anstelle der Thread-Vorschau.
  • typingReaction fügt der eingehenden Slack-Nachricht während der Antwortausführung vorübergehend eine Reaktion hinzu und entfernt sie nach Abschluss wieder. Verwenden Sie einen Slack-Emoji-Shortcode wie "hourglass_flowing_sand".
  • channels.slack.execApprovals: Slack-native Zustellung von Exec-Genehmigungen und Autorisierung von Genehmigern. Gleiches Schema wie bei Discord: enabled (true/false/"auto"), approvers (Slack-Benutzer-IDs), agentFilter, sessionFilter und target ("dm", "channel" oder "both").
AktionsgruppeStandardHinweise
reactionsaktiviertReagieren + Reaktionen auflisten
messagesaktiviertLesen/Senden/Bearbeiten/Löschen
pinsaktiviertAnheften/Lösen/Auflisten
memberInfoaktiviertMitgliederinformationen
emojiListaktiviertListe benutzerdefinierter Emojis

Mattermost

Mattermost wird als Plugin ausgeliefert: openclaw plugins install @openclaw/mattermost.
{
  channels: {
    mattermost: {
      enabled: true,
      botToken: "mm-token",
      baseUrl: "https://chat.example.com",
      dmPolicy: "pairing",
      chatmode: "oncall", // oncall | onmessage | onchar
      oncharPrefixes: [">", "!"],
      groups: {
        "*": { requireMention: true },
        "team-channel-id": { requireMention: false },
      },
      commands: {
        native: true, // Opt-in
        nativeSkills: true,
        callbackPath: "/api/channels/mattermost/command",
        // Optional explizite URL für Reverse-Proxy-/öffentliche Deployments
        callbackUrl: "https://gateway.example.com/api/channels/mattermost/command",
      },
      textChunkLimit: 4000,
      chunkMode: "length",
    },
  },
}
Chat-Modi: oncall (antworten bei @-Erwähnung, Standard), onmessage (jede Nachricht), onchar (Nachrichten, die mit dem Auslöserpräfix beginnen). Wenn native Mattermost-Befehle aktiviert sind:
  • commands.callbackPath muss ein Pfad sein (zum Beispiel /api/channels/mattermost/command), keine vollständige URL.
  • commands.callbackUrl muss zum OpenClaw-Gateway-Endpunkt aufgelöst werden und vom Mattermost-Server aus erreichbar sein.
  • Native Slash-Callbacks werden mit den pro Befehl verwendeten Token authentifiziert, die Mattermost bei der Registrierung von Slash-Befehlen zurückgibt. Wenn die Registrierung fehlschlägt oder keine Befehle aktiviert werden, lehnt OpenClaw Callbacks mit Unauthorized: invalid command token. ab.
  • Für private/Tailnet-/interne Callback-Hosts kann Mattermost verlangen, dass ServiceSettings.AllowedUntrustedInternalConnections den Callback-Host bzw. die Domain enthält. Verwenden Sie Host-/Domainwerte, keine vollständigen URLs.
  • channels.mattermost.configWrites: Mattermost-initiierte Konfigurationsschreibvorgänge erlauben oder verweigern.
  • channels.mattermost.requireMention: @mention vor der Antwort in Kanälen verlangen.
  • channels.mattermost.groups.<channelId>.requireMention: Überschreibung des Mention-Gatings pro Kanal ("*" für Standard).
  • Optional überschreibt channels.mattermost.defaultAccount die Standardkontenauswahl, wenn es mit einer konfigurierten Konto-ID übereinstimmt.

Signal

{
  channels: {
    signal: {
      enabled: true,
      account: "+15555550123", // optionale Kontobindung
      dmPolicy: "pairing",
      allowFrom: ["+15551234567", "uuid:123e4567-e89b-12d3-a456-426614174000"],
      configWrites: true,
      reactionNotifications: "own", // off | own | all | allowlist
      reactionAllowlist: ["+15551234567", "uuid:123e4567-e89b-12d3-a456-426614174000"],
      historyLimit: 50,
    },
  },
}
Modi für Benachrichtigungen über Reaktionen: off, own (Standard), all, allowlist (aus reactionAllowlist).
  • channels.signal.account: Kanalstart auf eine bestimmte Signal-Kontoidentität festlegen.
  • channels.signal.configWrites: von Signal initiierte Konfigurationsschreibvorgänge erlauben oder verweigern.
  • Optional überschreibt channels.signal.defaultAccount die Standardkontenauswahl, wenn es mit einer konfigurierten Konto-ID übereinstimmt.

BlueBubbles

BlueBubbles ist der empfohlene iMessage-Pfad (plugin-basiert, konfiguriert unter channels.bluebubbles).
{
  channels: {
    bluebubbles: {
      enabled: true,
      dmPolicy: "pairing",
      // serverUrl, password, webhookPath, group controls, and advanced actions:
      // siehe /channels/bluebubbles
    },
  },
}
  • Zentrale Schlüsselpfade, die hier behandelt werden: channels.bluebubbles, channels.bluebubbles.dmPolicy.
  • Optional überschreibt channels.bluebubbles.defaultAccount die Standardkontenauswahl, wenn es mit einer konfigurierten Konto-ID übereinstimmt.
  • Top-Level-Einträge in bindings[] mit type: "acp" können BlueBubbles-Unterhaltungen an persistente ACP-Sitzungen binden. Verwenden Sie einen BlueBubbles-Handle oder Ziel-String (chat_id:*, chat_guid:*, chat_identifier:*) in match.peer.id. Gemeinsame Feldsemantik: ACP Agents.
  • Die vollständige BlueBubbles-Kanalkonfiguration ist unter BlueBubbles dokumentiert.

iMessage

OpenClaw startet imsg rpc (JSON-RPC über stdio). Kein Daemon oder Port erforderlich.
{
  channels: {
    imessage: {
      enabled: true,
      cliPath: "imsg",
      dbPath: "~/Library/Messages/chat.db",
      remoteHost: "user@gateway-host",
      dmPolicy: "pairing",
      allowFrom: ["+15555550123", "user@example.com", "chat_id:123"],
      historyLimit: 50,
      includeAttachments: false,
      attachmentRoots: ["/Users/*/Library/Messages/Attachments"],
      remoteAttachmentRoots: ["/Users/*/Library/Messages/Attachments"],
      mediaMaxMb: 16,
      service: "auto",
      region: "US",
    },
  },
}
  • Optional überschreibt channels.imessage.defaultAccount die Standardkontenauswahl, wenn es mit einer konfigurierten Konto-ID übereinstimmt.
  • Erfordert Vollzugriff auf die Messages-Datenbank.
  • Bevorzugen Sie Ziele im Format chat_id:<id>. Verwenden Sie imsg chats --limit 20, um Chats aufzulisten.
  • cliPath kann auf einen SSH-Wrapper zeigen; setzen Sie remoteHost (host oder user@host) für den SCP-Abruf von Anhängen.
  • attachmentRoots und remoteAttachmentRoots beschränken eingehende Anhangspfade (Standard: /Users/*/Library/Messages/Attachments).
  • SCP verwendet strikte Host-Key-Prüfung, daher muss der Relay-Host-Key bereits in ~/.ssh/known_hosts vorhanden sein.
  • channels.imessage.configWrites: von iMessage initiierte Konfigurationsschreibvorgänge erlauben oder verweigern.
  • Top-Level-Einträge in bindings[] mit type: "acp" können iMessage-Unterhaltungen an persistente ACP-Sitzungen binden. Verwenden Sie einen normalisierten Handle oder ein explizites Chat-Ziel (chat_id:*, chat_guid:*, chat_identifier:*) in match.peer.id. Gemeinsame Feldsemantik: ACP Agents.
#!/usr/bin/env bash
exec ssh -T gateway-host imsg "$@"

Matrix

Matrix ist extension-basiert und wird unter channels.matrix konfiguriert.
{
  channels: {
    matrix: {
      enabled: true,
      homeserver: "https://matrix.example.org",
      accessToken: "syt_bot_xxx",
      proxy: "http://127.0.0.1:7890",
      encryption: true,
      initialSyncLimit: 20,
      defaultAccount: "ops",
      accounts: {
        ops: {
          name: "Ops",
          userId: "@ops:example.org",
          accessToken: "syt_ops_xxx",
        },
        alerts: {
          userId: "@alerts:example.org",
          password: "secret",
          proxy: "http://127.0.0.1:7891",
        },
      },
    },
  },
}
  • Token-Authentifizierung verwendet accessToken; Passwort-Authentifizierung verwendet userId + password.
  • channels.matrix.proxy leitet Matrix-HTTP-Datenverkehr über einen expliziten HTTP(S)-Proxy. Benannte Konten können ihn mit channels.matrix.accounts.<id>.proxy überschreiben.
  • channels.matrix.network.dangerouslyAllowPrivateNetwork erlaubt private/interne Homeserver. proxy und dieses Netzwerk-Opt-in sind unabhängige Steuerungen.
  • channels.matrix.defaultAccount wählt in Setups mit mehreren Konten das bevorzugte Konto aus.
  • channels.matrix.autoJoin ist standardmäßig off, daher werden eingeladene Räume und neue DM-artige Einladungen ignoriert, bis Sie autoJoin: "allowlist" mit autoJoinAllowlist oder autoJoin: "always" setzen.
  • channels.matrix.execApprovals: Matrix-native Zustellung von Exec-Genehmigungen und Autorisierung von Genehmigern.
    • enabled: true, false oder "auto" (Standard). Im Auto-Modus werden Exec-Genehmigungen aktiviert, wenn Genehmiger aus approvers oder commands.ownerAllowFrom aufgelöst werden können.
    • approvers: Matrix-Benutzer-IDs (z. B. @owner:example.org), die Exec-Anfragen genehmigen dürfen.
    • agentFilter: optionale Erlaubnisliste für Agent-IDs. Weglassen, um Genehmigungen für alle Agenten weiterzuleiten.
    • sessionFilter: optionale Sitzungs-Schlüsselmuster (Teilzeichenfolge oder Regex).
    • target: wohin Genehmigungsaufforderungen gesendet werden. "dm" (Standard), "channel" (Ursprungsraum) oder "both".
    • Überschreibungen pro Konto: channels.matrix.accounts.<id>.execApprovals.
  • channels.matrix.dm.sessionScope steuert, wie Matrix-DMs in Sitzungen gruppiert werden: per-user (Standard) teilt nach weitergeleitetem Peer, während per-room jeden DM-Raum isoliert.
  • Matrix-Statusprüfungen und Live-Verzeichnissuchen verwenden dieselbe Proxy-Richtlinie wie Laufzeitdatenverkehr.
  • Die vollständige Matrix-Konfiguration, Zielregeln und Setup-Beispiele sind unter Matrix dokumentiert.

Microsoft Teams

Microsoft Teams ist extension-basiert und wird unter channels.msteams konfiguriert.
{
  channels: {
    msteams: {
      enabled: true,
      configWrites: true,
      // appId, appPassword, tenantId, webhook, team/channel policies:
      // siehe /channels/msteams
    },
  },
}
  • Zentrale Schlüsselpfade, die hier behandelt werden: channels.msteams, channels.msteams.configWrites.
  • Die vollständige Teams-Konfiguration (Anmeldedaten, Webhook, DM-/Gruppenrichtlinie, Überschreibungen pro Team/pro Kanal) ist unter Microsoft Teams dokumentiert.

IRC

IRC ist extension-basiert und wird unter channels.irc konfiguriert.
{
  channels: {
    irc: {
      enabled: true,
      dmPolicy: "pairing",
      configWrites: true,
      nickserv: {
        enabled: true,
        service: "NickServ",
        password: "${IRC_NICKSERV_PASSWORD}",
        register: false,
        registerEmail: "bot@example.com",
      },
    },
  },
}
  • Zentrale Schlüsselpfade, die hier behandelt werden: channels.irc, channels.irc.dmPolicy, channels.irc.configWrites, channels.irc.nickserv.*.
  • Optional überschreibt channels.irc.defaultAccount die Standardkontenauswahl, wenn es mit einer konfigurierten Konto-ID übereinstimmt.
  • Die vollständige IRC-Kanalkonfiguration (Host/Port/TLS/Kanäle/Erlaubnislisten/Mention-Gating) ist unter IRC dokumentiert.

Mehrere Konten (alle Kanäle)

Führen Sie mehrere Konten pro Kanal aus (jedes mit eigener accountId):
{
  channels: {
    telegram: {
      accounts: {
        default: {
          name: "Primärer Bot",
          botToken: "123456:ABC...",
        },
        alerts: {
          name: "Alerts-Bot",
          botToken: "987654:XYZ...",
        },
      },
    },
  },
}
  • default wird verwendet, wenn accountId weggelassen wird (CLI + Routing).
  • Env-Tokens gelten nur für das default-Konto.
  • Basis-Kanaleinstellungen gelten für alle Konten, sofern sie nicht pro Konto überschrieben werden.
  • Verwenden Sie bindings[].match.accountId, um jedes Konto an einen anderen Agenten weiterzuleiten.
  • Wenn Sie über openclaw channels add (oder Kanal-Onboarding) ein Nicht-Standardkonto hinzufügen, während Sie sich noch auf einer Top-Level-Kanalkonfiguration für ein einzelnes Konto befinden, verschiebt OpenClaw zunächst kontobezogene Top-Level-Werte für ein einzelnes Konto in die Kontozuordnung des Kanals, damit das ursprüngliche Konto weiter funktioniert. Die meisten Kanäle verschieben sie nach channels.<channel>.accounts.default; Matrix kann stattdessen ein vorhandenes passendes benanntes/default-Ziel beibehalten.
  • Bestehende nur kanalbezogene Bindings (ohne accountId) passen weiterhin auf das Standardkonto; kontoabhängige Bindings bleiben optional.
  • openclaw doctor --fix repariert auch gemischte Formen, indem kontobezogene Top-Level-Werte für ein einzelnes Konto in das für diesen Kanal ausgewählte verschobene Konto verschoben werden. Die meisten Kanäle verwenden accounts.default; Matrix kann stattdessen ein vorhandenes passendes benanntes/default-Ziel beibehalten.

Andere extension-basierte Kanäle

Viele extension-basierte Kanäle werden als channels.<id> konfiguriert und auf ihren dedizierten Kanalseiten dokumentiert (zum Beispiel Feishu, Matrix, LINE, Nostr, Zalo, Nextcloud Talk, Synology Chat und Twitch). Siehe den vollständigen Kanalindex: Channels.

Mention-Gating in Gruppenchats

Gruppennachrichten erfordern standardmäßig eine Erwähnung (Metadaten-Erwähnung oder sichere Regex-Muster). Gilt für WhatsApp, Telegram, Discord, Google Chat und iMessage-Gruppenchats. Erwähnungstypen:
  • Metadaten-Erwähnungen: Native Plattform-@-Erwähnungen. Im WhatsApp-Selbstchat-Modus ignoriert.
  • Textmuster: Sichere Regex-Muster in agents.list[].groupChat.mentionPatterns. Ungültige Muster und unsichere verschachtelte Wiederholungen werden ignoriert.
  • Mention-Gating wird nur erzwungen, wenn eine Erkennung möglich ist (native Erwähnungen oder mindestens ein Muster).
{
  messages: {
    groupChat: { historyLimit: 50 },
  },
  agents: {
    list: [{ id: "main", groupChat: { mentionPatterns: ["@openclaw", "openclaw"] } }],
  },
}
messages.groupChat.historyLimit setzt den globalen Standard. Kanäle können ihn mit channels.<channel>.historyLimit (oder pro Konto) überschreiben. Setzen Sie 0, um ihn zu deaktivieren.

DM-Verlaufsgrenzen

{
  channels: {
    telegram: {
      dmHistoryLimit: 30,
      dms: {
        "123456789": { historyLimit: 50 },
      },
    },
  },
}
Auflösung: Überschreibung pro DM → Provider-Standard → keine Grenze (alles wird behalten). Unterstützt: telegram, whatsapp, discord, slack, signal, imessage, msteams.

Selbstchat-Modus

Nehmen Sie Ihre eigene Nummer in allowFrom auf, um den Selbstchat-Modus zu aktivieren (ignoriert native @-Erwähnungen, antwortet nur auf Textmuster):
{
  channels: {
    whatsapp: {
      allowFrom: ["+15555550123"],
      groups: { "*": { requireMention: true } },
    },
  },
  agents: {
    list: [
      {
        id: "main",
        groupChat: { mentionPatterns: ["reisponde", "@openclaw"] },
      },
    ],
  },
}

Befehle (Chat-Befehlsverarbeitung)

{
  commands: {
    native: "auto", // native Befehle registrieren, wenn unterstützt
    nativeSkills: "auto", // native Skills-Befehle registrieren, wenn unterstützt
    text: true, // /commands in Chat-Nachrichten parsen
    bash: false, // ! erlauben (Alias: /bash)
    bashForegroundMs: 2000,
    config: false, // /config erlauben
    mcp: false, // /mcp erlauben
    plugins: false, // /plugins erlauben
    debug: false, // /debug erlauben
    restart: true, // /restart + Gateway-Neustart-Tool erlauben
    ownerAllowFrom: ["discord:123456789012345678"],
    ownerDisplay: "raw", // raw | hash
    ownerDisplaySecret: "${OWNER_ID_HASH_SECRET}",
    allowFrom: {
      "*": ["user1"],
      discord: ["user:123"],
    },
    useAccessGroups: true,
  },
}
  • Dieser Block konfiguriert Befehlsoberflächen. Den aktuellen integrierten + gebündelten Befehlskatalog finden Sie unter Slash Commands.
  • Diese Seite ist eine Konfigurationsschlüssel-Referenz, nicht der vollständige Befehlskatalog. Kanal-/plugin-eigene Befehle wie QQ Bot /bot-ping /bot-help /bot-logs, LINE /card, Geräte-Pairing /pair, Memory /dreaming, Telefonsteuerung /phone und Talk /voice sind auf ihren Kanal-/Plugin-Seiten sowie unter Slash Commands dokumentiert.
  • Textbefehle müssen eigenständige Nachrichten mit führendem / sein.
  • native: "auto" aktiviert native Befehle für Discord/Telegram, lässt Slack deaktiviert.
  • nativeSkills: "auto" aktiviert native Skills-Befehle für Discord/Telegram, lässt Slack deaktiviert.
  • Überschreibung pro Kanal: channels.discord.commands.native (bool oder "auto"). false löscht zuvor registrierte Befehle.
  • Überschreiben Sie die Registrierung nativer Skills pro Kanal mit channels.<provider>.commands.nativeSkills.
  • channels.telegram.customCommands fügt zusätzliche Telegram-Bot-Menüeinträge hinzu.
  • bash: true aktiviert ! <cmd> für die Host-Shell. Erfordert tools.elevated.enabled und einen Absender in tools.elevated.allowFrom.<channel>.
  • config: true aktiviert /config (liest/schreibt openclaw.json). Für Gateway-chat.send-Clients erfordern persistente Schreibvorgänge mit /config set|unset zusätzlich operator.admin; schreibgeschütztes /config show bleibt für normale Operator-Clients mit Schreibbereich verfügbar.
  • mcp: true aktiviert /mcp für von OpenClaw verwaltete MCP-Serverkonfiguration unter mcp.servers.
  • plugins: true aktiviert /plugins für Plugin-Erkennung sowie Installations- und Aktivieren-/Deaktivieren-Steuerung.
  • channels.<provider>.configWrites steuert Konfigurationsänderungen pro Kanal (Standard: true).
  • Für Kanäle mit mehreren Konten steuert channels.<provider>.accounts.<id>.configWrites auch Schreibvorgänge, die auf dieses Konto zielen (zum Beispiel /allowlist --config --account <id> oder /config set channels.<provider>.accounts.<id>...).
  • restart: false deaktiviert /restart und Gateway-Neustart-Tool-Aktionen. Standard: true.
  • ownerAllowFrom ist die explizite Erlaubnisliste für Eigentümer für nur-Eigentümer-Befehle/-Tools. Sie ist getrennt von allowFrom.
  • ownerDisplay: "hash" hasht Eigentümer-IDs im System-Prompt. Setzen Sie ownerDisplaySecret, um das Hashing zu steuern.
  • allowFrom ist providerbezogen. Wenn gesetzt, ist es die einzige Autorisierungsquelle (Kanal-Erlaubnislisten/Pairing und useAccessGroups werden ignoriert).
  • useAccessGroups: false erlaubt Befehlen, Richtlinien für Zugriffsgruppen zu umgehen, wenn allowFrom nicht gesetzt ist.
  • Zuordnung der Befehlsdokumentation:

Agent-Standardeinstellungen

agents.defaults.workspace

Standard: ~/.openclaw/workspace.
{
  agents: { defaults: { workspace: "~/.openclaw/workspace" } },
}

agents.defaults.repoRoot

Optionales Repository-Root, das in der Runtime-Zeile des System-Prompts angezeigt wird. Wenn nicht gesetzt, erkennt OpenClaw es automatisch, indem es vom Workspace aus nach oben sucht.
{
  agents: { defaults: { repoRoot: "~/Projects/openclaw" } },
}

agents.defaults.skills

Optionale Standard-Erlaubnisliste für Skills für Agenten, die agents.list[].skills nicht setzen.
{
  agents: {
    defaults: { skills: ["github", "weather"] },
    list: [
      { id: "writer" }, // erbt github, weather
      { id: "docs", skills: ["docs-search"] }, // ersetzt Standardwerte
      { id: "locked-down", skills: [] }, // keine Skills
    ],
  },
}
  • Lassen Sie agents.defaults.skills weg, um standardmäßig uneingeschränkte Skills zu erlauben.
  • Lassen Sie agents.list[].skills weg, um die Standardwerte zu erben.
  • Setzen Sie agents.list[].skills: [] für keine Skills.
  • Eine nicht leere Liste in agents.list[].skills ist die endgültige Menge für diesen Agenten; sie wird nicht mit den Standardwerten zusammengeführt.

agents.defaults.skipBootstrap

Deaktiviert die automatische Erstellung von Workspace-Bootstrap-Dateien (AGENTS.md, SOUL.md, TOOLS.md, IDENTITY.md, USER.md, HEARTBEAT.md, BOOTSTRAP.md).
{
  agents: { defaults: { skipBootstrap: true } },
}

agents.defaults.contextInjection

Steuert, wann Workspace-Bootstrap-Dateien in den System-Prompt eingefügt werden. Standard: "always".
  • "continuation-skip": Sichere Fortsetzungs-Turns (nach einer abgeschlossenen Assistant-Antwort) überspringen das erneute Einfügen des Workspace-Bootstraps, wodurch die Prompt-Größe reduziert wird. Heartbeat-Läufe und Wiederholungen nach Kompaktierung bauen den Kontext weiterhin neu auf.
{
  agents: { defaults: { contextInjection: "continuation-skip" } },
}

agents.defaults.bootstrapMaxChars

Maximale Zeichenanzahl pro Workspace-Bootstrap-Datei vor dem Kürzen. Standard: 20000.
{
  agents: { defaults: { bootstrapMaxChars: 20000 } },
}

agents.defaults.bootstrapTotalMaxChars

Maximale Gesamtzahl an eingefügten Zeichen über alle Workspace-Bootstrap-Dateien hinweg. Standard: 150000.
{
  agents: { defaults: { bootstrapTotalMaxChars: 150000 } },
}

agents.defaults.bootstrapPromptTruncationWarning

Steuert den für den Agenten sichtbaren Warntext, wenn der Bootstrap-Kontext gekürzt wird. Standard: "once".
  • "off": Niemals Warntext in den System-Prompt einfügen.
  • "once": Warnung einmal pro eindeutiger Kürzungssignatur einfügen (empfohlen).
  • "always": Warnung bei jedem Lauf einfügen, wenn eine Kürzung vorliegt.
{
  agents: { defaults: { bootstrapPromptTruncationWarning: "once" } }, // off | once | always
}

agents.defaults.imageMaxDimensionPx

Maximale Pixelgröße der längsten Bildseite in Transkript-/Tool-Bildblöcken vor Provider-Aufrufen. Standard: 1200. Niedrigere Werte reduzieren in der Regel die Nutzung von Vision-Tokens und die Größe des Anforderungs-Payloads bei screenshotlastigen Läufen. Höhere Werte erhalten mehr visuelle Details.
{
  agents: { defaults: { imageMaxDimensionPx: 1200 } },
}

agents.defaults.userTimezone

Zeitzone für den Kontext des System-Prompts (nicht für Nachrichtentimestamps). Fällt auf die Zeitzone des Hosts zurück.
{
  agents: { defaults: { userTimezone: "America/Chicago" } },
}

agents.defaults.timeFormat

Zeitformat im System-Prompt. Standard: auto (Betriebssystemeinstellung).
{
  agents: { defaults: { timeFormat: "auto" } }, // auto | 12 | 24
}

agents.defaults.model

{
  agents: {
    defaults: {
      models: {
        "anthropic/claude-opus-4-6": { alias: "opus" },
        "minimax/MiniMax-M2.7": { alias: "minimax" },
      },
      model: {
        primary: "anthropic/claude-opus-4-6",
        fallbacks: ["minimax/MiniMax-M2.7"],
      },
      imageModel: {
        primary: "openrouter/qwen/qwen-2.5-vl-72b-instruct:free",
        fallbacks: ["openrouter/google/gemini-2.0-flash-vision:free"],
      },
      imageGenerationModel: {
        primary: "openai/gpt-image-1",
        fallbacks: ["google/gemini-3.1-flash-image-preview"],
      },
      videoGenerationModel: {
        primary: "qwen/wan2.6-t2v",
        fallbacks: ["qwen/wan2.6-i2v"],
      },
      pdfModel: {
        primary: "anthropic/claude-opus-4-6",
        fallbacks: ["openai/gpt-5.4-mini"],
      },
      params: { cacheRetention: "long" }, // globale Standard-Provider-Parameter
      pdfMaxBytesMb: 10,
      pdfMaxPages: 20,
      thinkingDefault: "low",
      verboseDefault: "off",
      elevatedDefault: "on",
      timeoutSeconds: 600,
      mediaMaxMb: 5,
      contextTokens: 200000,
      maxConcurrent: 3,
    },
  },
}
  • model: akzeptiert entweder eine Zeichenfolge ("provider/model") oder ein Objekt ({ primary, fallbacks }).
    • Die Zeichenfolgenform setzt nur das primäre Modell.
    • Die Objektform setzt das primäre Modell plus geordnete Failover-Modelle.
  • imageModel: akzeptiert entweder eine Zeichenfolge ("provider/model") oder ein Objekt ({ primary, fallbacks }).
    • Wird vom Tool-Pfad image als Vision-Modellkonfiguration verwendet.
    • Wird auch als Fallback-Routing verwendet, wenn das ausgewählte/standardmäßige Modell keine Bildeingaben akzeptieren kann.
  • imageGenerationModel: akzeptiert entweder eine Zeichenfolge ("provider/model") oder ein Objekt ({ primary, fallbacks }).
    • Wird von der gemeinsamen Bildgenerierungsfunktion und jeder zukünftigen Tool-/Plugin-Oberfläche verwendet, die Bilder generiert.
    • Typische Werte: google/gemini-3.1-flash-image-preview für native Gemini-Bildgenerierung, fal/fal-ai/flux/dev für fal oder openai/gpt-image-1 für OpenAI Images.
    • Wenn Sie direkt einen Provider/ein Modell auswählen, konfigurieren Sie auch die passende Provider-Authentifizierung bzw. den API-Schlüssel (zum Beispiel GEMINI_API_KEY oder GOOGLE_API_KEY für google/*, OPENAI_API_KEY für openai/*, FAL_KEY für fal/*).
    • Wenn weggelassen, kann image_generate dennoch einen authentifizierungsbasierten Provider-Standard ableiten. Es versucht zuerst den aktuellen Standard-Provider, dann die übrigen registrierten Bildgenerierungs-Provider in Provider-ID-Reihenfolge.
  • musicGenerationModel: akzeptiert entweder eine Zeichenfolge ("provider/model") oder ein Objekt ({ primary, fallbacks }).
    • Wird von der gemeinsamen Musikgenerierungsfunktion und dem integrierten Tool music_generate verwendet.
    • Typische Werte: google/lyria-3-clip-preview, google/lyria-3-pro-preview oder minimax/music-2.5+.
    • Wenn weggelassen, kann music_generate dennoch einen authentifizierungsbasierten Provider-Standard ableiten. Es versucht zuerst den aktuellen Standard-Provider, dann die übrigen registrierten Musikgenerierungs-Provider in Provider-ID-Reihenfolge.
    • Wenn Sie direkt einen Provider/ein Modell auswählen, konfigurieren Sie auch die passende Provider-Authentifizierung bzw. den API-Schlüssel.
  • videoGenerationModel: akzeptiert entweder eine Zeichenfolge ("provider/model") oder ein Objekt ({ primary, fallbacks }).
    • Wird von der gemeinsamen Videogenerierungsfunktion und dem integrierten Tool video_generate verwendet.
    • Typische Werte: qwen/wan2.6-t2v, qwen/wan2.6-i2v, qwen/wan2.6-r2v, qwen/wan2.6-r2v-flash oder qwen/wan2.7-r2v.
    • Wenn weggelassen, kann video_generate dennoch einen authentifizierungsbasierten Provider-Standard ableiten. Es versucht zuerst den aktuellen Standard-Provider, dann die übrigen registrierten Videogenerierungs-Provider in Provider-ID-Reihenfolge.
    • Wenn Sie direkt einen Provider/ein Modell auswählen, konfigurieren Sie auch die passende Provider-Authentifizierung bzw. den API-Schlüssel.
    • Der gebündelte Qwen-Provider für Videogenerierung unterstützt bis zu 1 Ausgabevideo, 1 Eingabebild, 4 Eingabevideos, 10 Sekunden Dauer sowie Provider-Level-Optionen size, aspectRatio, resolution, audio und watermark.
  • pdfModel: akzeptiert entweder eine Zeichenfolge ("provider/model") oder ein Objekt ({ primary, fallbacks }).
    • Wird vom Tool pdf für Modell-Routing verwendet.
    • Wenn weggelassen, fällt das PDF-Tool auf imageModel und dann auf das aufgelöste Sitzungs-/Standardmodell zurück.
  • pdfMaxBytesMb: Standardgrenze für die PDF-Größe für das Tool pdf, wenn maxBytesMb nicht zur Aufrufzeit übergeben wird.
  • pdfMaxPages: Standardmaximum an Seiten, die der Extraktions-Fallback-Modus im Tool pdf berücksichtigt.
  • verboseDefault: Standard-Verbose-Level für Agenten. Werte: "off", "on", "full". Standard: "off".
  • elevatedDefault: Standard-Level für erhöhte Ausgabe für Agenten. Werte: "off", "on", "ask", "full". Standard: "on".
  • model.primary: Format provider/model (z. B. openai/gpt-5.4). Wenn Sie den Provider weglassen, versucht OpenClaw zuerst einen Alias, dann eine eindeutige konfigurierte Provider-Übereinstimmung für genau diese Modell-ID und fällt erst dann auf den konfigurierten Standard-Provider zurück (veraltetes Kompatibilitätsverhalten, daher provider/model explizit bevorzugen). Wenn dieser Provider das konfigurierte Standardmodell nicht mehr anbietet, fällt OpenClaw auf das erste konfigurierte Provider-/Modellpaar zurück, statt einen veralteten entfernten Provider-Standard anzuzeigen.
  • models: der konfigurierte Modellkatalog und die Erlaubnisliste für /model. Jeder Eintrag kann alias (Kurzform) und params (providerbezogen, zum Beispiel temperature, maxTokens, cacheRetention, context1m) enthalten.
  • params: globale Standard-Provider-Parameter, die auf alle Modelle angewendet werden. Festgelegt unter agents.defaults.params (z. B. { cacheRetention: "long" }).
  • params-Merge-Priorität (Konfiguration): agents.defaults.params (globale Basis) wird von agents.defaults.models["provider/model"].params (pro Modell) überschrieben, dann überschreibt agents.list[].params (passende Agent-ID) schlüsselweise. Details siehe Prompt Caching.
  • Konfigurationsschreiber, die diese Felder ändern (zum Beispiel /models set, /models set-image und Befehle zum Hinzufügen/Entfernen von Fallbacks), speichern die kanonische Objektform und erhalten vorhandene Fallback-Listen nach Möglichkeit.
  • maxConcurrent: maximale Anzahl paralleler Agent-Läufe über Sitzungen hinweg (jede Sitzung bleibt weiterhin serialisiert). Standard: 4.
Integrierte Alias-Kurzformen (gelten nur, wenn das Modell in agents.defaults.models enthalten ist):
AliasModell
opusanthropic/claude-opus-4-6
sonnetanthropic/claude-sonnet-4-6
gptopenai/gpt-5.4
gpt-miniopenai/gpt-5.4-mini
gpt-nanoopenai/gpt-5.4-nano
geminigoogle/gemini-3.1-pro-preview
gemini-flashgoogle/gemini-3-flash-preview
gemini-flash-litegoogle/gemini-3.1-flash-lite-preview
Ihre konfigurierten Aliasse haben immer Vorrang vor den Standardwerten. Modelle Z.AI GLM-4.x aktivieren den Thinking-Modus automatisch, sofern Sie nicht --thinking off setzen oder agents.defaults.models["zai/<model>"].params.thinking selbst definieren. Z.AI-Modelle aktivieren standardmäßig tool_stream für Tool-Call-Streaming. Setzen Sie agents.defaults.models["zai/<model>"].params.tool_stream auf false, um dies zu deaktivieren. Anthropic-Claude-4.6-Modelle verwenden standardmäßig adaptive Thinking, wenn kein explizites Thinking-Level gesetzt ist.

agents.defaults.cliBackends

Optionale CLI-Backends für reine Text-Fallback-Läufe (ohne Tool-Calls). Nützlich als Backup, wenn API-Provider ausfallen.
{
  agents: {
    defaults: {
      cliBackends: {
        "codex-cli": {
          command: "/opt/homebrew/bin/codex",
        },
        "my-cli": {
          command: "my-cli",
          args: ["--json"],
          output: "json",
          modelArg: "--model",
          sessionArg: "--session",
          sessionMode: "existing",
          systemPromptArg: "--system",
          systemPromptWhen: "first",
          imageArg: "--image",
          imageMode: "repeat",
        },
      },
    },
  },
}
  • CLI-Backends sind textorientiert; Tools sind immer deaktiviert.
  • Sitzungen werden unterstützt, wenn sessionArg gesetzt ist.
  • Bilddurchreichung wird unterstützt, wenn imageArg Dateipfade akzeptiert.

agents.defaults.systemPromptOverride

Ersetzt den gesamten von OpenClaw zusammengestellten System-Prompt durch eine feste Zeichenfolge. Wird auf Standardebene (agents.defaults.systemPromptOverride) oder pro Agent (agents.list[].systemPromptOverride) gesetzt. Werte pro Agent haben Vorrang; ein leerer oder nur aus Leerraum bestehender Wert wird ignoriert. Nützlich für kontrollierte Prompt-Experimente.
{
  agents: {
    defaults: {
      systemPromptOverride: "You are a helpful assistant.",
    },
  },
}

agents.defaults.heartbeat

Periodische Heartbeat-Läufe.
{
  agents: {
    defaults: {
      heartbeat: {
        every: "30m", // 0m deaktiviert
        model: "openai/gpt-5.4-mini",
        includeReasoning: false,
        includeSystemPromptSection: true, // Standard: true; false lässt den Abschnitt Heartbeat im System-Prompt weg
        lightContext: false, // Standard: false; true behält nur HEARTBEAT.md aus den Workspace-Bootstrap-Dateien
        isolatedSession: false, // Standard: false; true führt jeden Heartbeat in einer neuen Sitzung aus (kein Gesprächsverlauf)
        session: "main",
        to: "+15555550123",
        directPolicy: "allow", // allow (Standard) | block
        target: "none", // Standard: none | Optionen: last | whatsapp | telegram | discord | ...
        prompt: "Read HEARTBEAT.md if it exists...",
        ackMaxChars: 300,
        suppressToolErrorWarnings: false,
      },
    },
  },
}
  • every: Dauerzeichenfolge (ms/s/m/h). Standard: 30m (API-Key-Authentifizierung) oder 1h (OAuth-Authentifizierung). Setzen Sie 0m, um zu deaktivieren.
  • includeSystemPromptSection: Wenn false, wird der Abschnitt Heartbeat aus dem System-Prompt weggelassen und das Einfügen von HEARTBEAT.md in den Bootstrap-Kontext übersprungen. Standard: true.
  • suppressToolErrorWarnings: Wenn true, werden Warn-Payloads für Tool-Fehler während Heartbeat-Läufen unterdrückt.
  • directPolicy: Richtlinie für direkte/DM-Zustellung. allow (Standard) erlaubt direkte Zielzustellung. block unterdrückt direkte Zielzustellung und gibt reason=dm-blocked aus.
  • lightContext: Wenn true, verwenden Heartbeat-Läufe einen leichtgewichtigen Bootstrap-Kontext und behalten nur HEARTBEAT.md aus den Workspace-Bootstrap-Dateien.
  • isolatedSession: Wenn true, wird jeder Heartbeat in einer neuen Sitzung ohne vorherigen Gesprächsverlauf ausgeführt. Dasselbe Isolationsmuster wie bei Cron sessionTarget: "isolated". Reduziert die Tokenkosten pro Heartbeat von ~100K auf ~2–5K Tokens.
  • Pro Agent: Setzen Sie agents.list[].heartbeat. Wenn ein Agent heartbeat definiert, führen nur diese Agenten Heartbeats aus.
  • Heartbeats führen vollständige Agent-Turns aus — kürzere Intervalle verbrauchen mehr Tokens.

agents.defaults.compaction

{
  agents: {
    defaults: {
      compaction: {
        mode: "safeguard", // default | safeguard
        provider: "my-provider", // ID eines registrierten Compaction-Provider-Plugins (optional)
        timeoutSeconds: 900,
        reserveTokensFloor: 24000,
        identifierPolicy: "strict", // strict | off | custom
        identifierInstructions: "Preserve deployment IDs, ticket IDs, and host:port pairs exactly.", // verwendet, wenn identifierPolicy=custom
        postCompactionSections: ["Session Startup", "Red Lines"], // [] deaktiviert erneutes Einfügen
        model: "openrouter/anthropic/claude-sonnet-4-6", // optionale nur für Compaction geltende Modellüberschreibung
        notifyUser: true, // sendet eine kurze Mitteilung, wenn Compaction beginnt (Standard: false)
        memoryFlush: {
          enabled: true,
          softThresholdTokens: 6000,
          systemPrompt: "Session nearing compaction. Store durable memories now.",
          prompt: "Write any lasting notes to memory/YYYY-MM-DD.md; reply with the exact silent token NO_REPLY if nothing to store.",
        },
      },
    },
  },
}
  • mode: default oder safeguard (stapelweise Zusammenfassung für lange Verläufe). Siehe Compaction.
  • provider: ID eines registrierten Compaction-Provider-Plugins. Wenn gesetzt, wird summarize() des Providers anstelle der integrierten LLM-Zusammenfassung aufgerufen. Bei Fehlern erfolgt ein Fallback auf die integrierte Zusammenfassung. Das Setzen eines Providers erzwingt mode: "safeguard". Siehe Compaction.
  • timeoutSeconds: maximale Anzahl an Sekunden für einen einzelnen Compaction-Vorgang, bevor OpenClaw ihn abbricht. Standard: 900.
  • identifierPolicy: strict (Standard), off oder custom. strict stellt der Compaction-Zusammenfassung integrierte Hinweise zur Beibehaltung opaker Bezeichner voran.
  • identifierInstructions: optionaler benutzerdefinierter Text zur Beibehaltung von Bezeichnern, verwendet bei identifierPolicy=custom.
  • postCompactionSections: optionale H2-/H3-Abschnittsnamen aus AGENTS.md, die nach der Compaction erneut eingefügt werden. Standard ist ["Session Startup", "Red Lines"]; setzen Sie [], um das erneute Einfügen zu deaktivieren. Wenn nicht gesetzt oder explizit auf dieses Standardpaar gesetzt, werden ältere Überschriften Every Session/Safety auch als Legacy-Fallback akzeptiert.
  • model: optionale Überschreibung provider/model-id nur für die Compaction-Zusammenfassung. Verwenden Sie dies, wenn die Hauptsitzung ein Modell beibehalten soll, Compaction-Zusammenfassungen aber auf einem anderen laufen sollen; wenn nicht gesetzt, verwendet Compaction das primäre Modell der Sitzung.
  • notifyUser: sendet bei true eine kurze Mitteilung an den Benutzer, wenn Compaction beginnt (zum Beispiel „Kontext wird komprimiert…“). Standardmäßig deaktiviert, damit Compaction still bleibt.
  • memoryFlush: stiller agentischer Turn vor der automatischen Compaction, um dauerhafte Memories zu speichern. Wird übersprungen, wenn der Workspace schreibgeschützt ist.

agents.defaults.contextPruning

Entfernt alte Tool-Ergebnisse aus dem In-Memory-Kontext, bevor er an das LLM gesendet wird. Ändert nicht den Sitzungsverlauf auf der Festplatte.
{
  agents: {
    defaults: {
      contextPruning: {
        mode: "cache-ttl", // off | cache-ttl
        ttl: "1h", // Dauer (ms/s/m/h), Standardeinheit: Minuten
        keepLastAssistants: 3,
        softTrimRatio: 0.3,
        hardClearRatio: 0.5,
        minPrunableToolChars: 50000,
        softTrim: { maxChars: 4000, headChars: 1500, tailChars: 1500 },
        hardClear: { enabled: true, placeholder: "[Alter Inhalt des Tool-Ergebnisses gelöscht]" },
        tools: { deny: ["browser", "canvas"] },
      },
    },
  },
}
  • mode: "cache-ttl" aktiviert Pruning-Durchläufe.
  • ttl steuert, wie oft Pruning erneut ausgeführt werden kann (nach der letzten Cache-Berührung).
  • Pruning kürzt zuerst übergroße Tool-Ergebnisse weich und löscht dann bei Bedarf ältere Tool-Ergebnisse hart.
Soft-Trim behält Anfang + Ende bei und fügt in der Mitte ... ein.Hard-Clear ersetzt das gesamte Tool-Ergebnis durch den Platzhalter.Hinweise:
  • Bildblöcke werden niemals gekürzt/gelöscht.
  • Verhältnisse basieren auf Zeichen (ungefähr), nicht auf exakten Token-Anzahlen.
  • Wenn weniger als keepLastAssistants Assistant-Nachrichten vorhanden sind, wird Pruning übersprungen.
Details zum Verhalten finden Sie unter Session Pruning.

Block-Streaming

{
  agents: {
    defaults: {
      blockStreamingDefault: "off", // on | off
      blockStreamingBreak: "text_end", // text_end | message_end
      blockStreamingChunk: { minChars: 800, maxChars: 1200 },
      blockStreamingCoalesce: { idleMs: 1000 },
      humanDelay: { mode: "natural" }, // off | natural | custom (verwenden Sie minMs/maxMs)
    },
  },
}
  • Nicht-Telegram-Kanäle erfordern explizit *.blockStreaming: true, um Block-Antworten zu aktivieren.
  • Kanalüberschreibungen: channels.<channel>.blockStreamingCoalesce (und Varianten pro Konto). Signal/Slack/Discord/Google Chat verwenden standardmäßig minChars: 1500.
  • humanDelay: zufällige Pause zwischen Block-Antworten. natural = 800–2500 ms. Überschreibung pro Agent: agents.list[].humanDelay.
Verhaltens- und Chunking-Details finden Sie unter Streaming.

Tippindikatoren

{
  agents: {
    defaults: {
      typingMode: "instant", // never | instant | thinking | message
      typingIntervalSeconds: 6,
    },
  },
}
  • Standardwerte: instant für Direktchats/Erwähnungen, message für nicht erwähnte Gruppenchats.
  • Überschreibungen pro Sitzung: session.typingMode, session.typingIntervalSeconds.
Siehe Typing Indicators.

agents.defaults.sandbox

Optionale Sandbox-Isolierung für den eingebetteten Agenten. Die vollständige Anleitung finden Sie unter Sandboxing.
{
  agents: {
    defaults: {
      sandbox: {
        mode: "non-main", // off | non-main | all
        backend: "docker", // docker | ssh | openshell
        scope: "agent", // session | agent | shared
        workspaceAccess: "none", // none | ro | rw
        workspaceRoot: "~/.openclaw/sandboxes",
        docker: {
          image: "openclaw-sandbox:bookworm-slim",
          containerPrefix: "openclaw-sbx-",
          workdir: "/workspace",
          readOnlyRoot: true,
          tmpfs: ["/tmp", "/var/tmp", "/run"],
          network: "none",
          user: "1000:1000",
          capDrop: ["ALL"],
          env: { LANG: "C.UTF-8" },
          setupCommand: "apt-get update && apt-get install -y git curl jq",
          pidsLimit: 256,
          memory: "1g",
          memorySwap: "2g",
          cpus: 1,
          ulimits: {
            nofile: { soft: 1024, hard: 2048 },
            nproc: 256,
          },
          seccompProfile: "/path/to/seccomp.json",
          apparmorProfile: "openclaw-sandbox",
          dns: ["1.1.1.1", "8.8.8.8"],
          extraHosts: ["internal.service:10.0.0.5"],
          binds: ["/home/user/source:/source:rw"],
        },
        ssh: {
          target: "user@gateway-host:22",
          command: "ssh",
          workspaceRoot: "/tmp/openclaw-sandboxes",
          strictHostKeyChecking: true,
          updateHostKeys: true,
          identityFile: "~/.ssh/id_ed25519",
          certificateFile: "~/.ssh/id_ed25519-cert.pub",
          knownHostsFile: "~/.ssh/known_hosts",
          // SecretRefs / Inline-Inhalte werden ebenfalls unterstützt:
          // identityData: { source: "env", provider: "default", id: "SSH_IDENTITY" },
          // certificateData: { source: "env", provider: "default", id: "SSH_CERTIFICATE" },
          // knownHostsData: { source: "env", provider: "default", id: "SSH_KNOWN_HOSTS" },
        },
        browser: {
          enabled: false,
          image: "openclaw-sandbox-browser:bookworm-slim",
          network: "openclaw-sandbox-browser",
          cdpPort: 9222,
          cdpSourceRange: "172.21.0.1/32",
          vncPort: 5900,
          noVncPort: 6080,
          headless: false,
          enableNoVnc: true,
          allowHostControl: false,
          autoStart: true,
          autoStartTimeoutMs: 12000,
        },
        prune: {
          idleHours: 24,
          maxAgeDays: 7,
        },
      },
    },
  },
  tools: {
    sandbox: {
      tools: {
        allow: [
          "exec",
          "process",
          "read",
          "write",
          "edit",
          "apply_patch",
          "sessions_list",
          "sessions_history",
          "sessions_send",
          "sessions_spawn",
          "session_status",
        ],
        deny: ["browser", "canvas", "nodes", "cron", "discord", "gateway"],
      },
    },
  },
}
Backend:
  • docker: lokale Docker-Laufzeit (Standard)
  • ssh: generische SSH-gestützte entfernte Laufzeit
  • openshell: OpenShell-Laufzeit
Wenn backend: "openshell" ausgewählt ist, werden laufzeitspezifische Einstellungen nach plugins.entries.openshell.config verschoben.SSH-Backend-Konfiguration:
  • target: SSH-Ziel im Format user@host[:port]
  • command: SSH-Client-Befehl (Standard: ssh)
  • workspaceRoot: absolutes entferntes Root, das für Workspaces pro Scope verwendet wird
  • identityFile / certificateFile / knownHostsFile: vorhandene lokale Dateien, die an OpenSSH übergeben werden
  • identityData / certificateData / knownHostsData: Inline-Inhalte oder SecretRefs, die OpenClaw zur Laufzeit in temporäre Dateien materialisiert
  • strictHostKeyChecking / updateHostKeys: OpenSSH-Einstellungen für die Host-Key-Richtlinie
Priorität der SSH-Authentifizierung:
  • identityData hat Vorrang vor identityFile
  • certificateData hat Vorrang vor certificateFile
  • knownHostsData hat Vorrang vor knownHostsFile
  • SecretRef-gestützte *Data-Werte werden aus dem aktiven Secrets-Laufzeit-Snapshot aufgelöst, bevor die Sandbox-Sitzung startet
Verhalten des SSH-Backends:
  • initialisiert den entfernten Workspace einmal nach Erstellung oder Neuerstellung
  • behält danach den entfernten SSH-Workspace als kanonisch bei
  • leitet exec, Dateitools und Medienpfade über SSH
  • synchronisiert entfernte Änderungen nicht automatisch zurück zum Host
  • unterstützt keine Sandbox-Browser-Container
Workspace-Zugriff:
  • none: Sandbox-Workspace pro Scope unter ~/.openclaw/sandboxes
  • ro: Sandbox-Workspace unter /workspace, Agent-Workspace schreibgeschützt unter /agent eingehängt
  • rw: Agent-Workspace schreib-/lesbar unter /workspace eingehängt
Scope:
  • session: Container + Workspace pro Sitzung
  • agent: ein Container + Workspace pro Agent (Standard)
  • shared: gemeinsamer Container und gemeinsamer Workspace (keine sitzungsübergreifende Isolierung)
OpenShell-Plugin-Konfiguration:
{
  plugins: {
    entries: {
      openshell: {
        enabled: true,
        config: {
          mode: "mirror", // mirror | remote
          from: "openclaw",
          remoteWorkspaceDir: "/sandbox",
          remoteAgentWorkspaceDir: "/agent",
          gateway: "lab", // optional
          gatewayEndpoint: "https://lab.example", // optional
          policy: "strict", // optionale OpenShell-Richtlinien-ID
          providers: ["openai"], // optional
          autoProviders: true,
          timeoutSeconds: 120,
        },
      },
    },
  },
}
OpenShell-Modus:
  • mirror: entferntes Ziel vor exec lokal spiegeln, nach exec zurücksynchronisieren; lokaler Workspace bleibt kanonisch
  • remote: entferntes Ziel einmal initialisieren, wenn die Sandbox erstellt wird, danach entfernten Workspace als kanonisch beibehalten
Im Modus remote werden hostlokale Bearbeitungen außerhalb von OpenClaw nach dem Initialisierungsschritt nicht automatisch in die Sandbox synchronisiert. Der Transport erfolgt per SSH in die OpenShell-Sandbox, aber das Plugin verwaltet den Sandbox-Lebenszyklus und die optionale Spiegelungssynchronisierung.setupCommand wird einmal nach der Container-Erstellung ausgeführt (über sh -lc). Benötigt ausgehenden Netzwerkzugriff, beschreibbares Root und Root-Benutzer.Container verwenden standardmäßig network: "none" — setzen Sie es auf "bridge" (oder ein benutzerdefiniertes Bridge-Netzwerk), wenn der Agent ausgehenden Zugriff benötigt. "host" ist blockiert. "container:<id>" ist standardmäßig blockiert, es sei denn, Sie setzen explizit sandbox.docker.dangerouslyAllowContainerNamespaceJoin: true (Break-Glass).Eingehende Anhänge werden in media/inbound/* im aktiven Workspace bereitgestellt.docker.binds hängt zusätzliche Host-Verzeichnisse ein; globale und agentbezogene Bindings werden zusammengeführt.Sandbox-Browser (sandbox.browser.enabled): Chromium + CDP in einem Container. Die noVNC-URL wird in den System-Prompt eingefügt. Erfordert kein browser.enabled in openclaw.json. noVNC-Beobachterzugriff verwendet standardmäßig VNC-Authentifizierung, und OpenClaw gibt eine URL mit kurzlebigem Token aus (anstatt das Passwort in der gemeinsam genutzten URL offenzulegen).
  • allowHostControl: false (Standard) blockiert, dass Sandbox-Sitzungen auf den Host-Browser zielen.
  • network verwendet standardmäßig openclaw-sandbox-browser (dediziertes Bridge-Netzwerk). Setzen Sie es nur dann auf bridge, wenn Sie ausdrücklich globale Bridge-Konnektivität möchten.
  • cdpSourceRange beschränkt optional eingehenden CDP-Zugriff an der Container-Grenze auf einen CIDR-Bereich (zum Beispiel 172.21.0.1/32).
  • sandbox.browser.binds hängt zusätzliche Host-Verzeichnisse nur in den Sandbox-Browser-Container ein. Wenn gesetzt (einschließlich []), ersetzt es docker.binds für den Browser-Container.
  • Start-Standardwerte sind in scripts/sandbox-browser-entrypoint.sh definiert und für Container-Hosts abgestimmt:
    • --remote-debugging-address=127.0.0.1
    • --remote-debugging-port=<derived from OPENCLAW_BROWSER_CDP_PORT>
    • --user-data-dir=${HOME}/.chrome
    • --no-first-run
    • --no-default-browser-check
    • --disable-3d-apis
    • --disable-gpu
    • --disable-software-rasterizer
    • --disable-dev-shm-usage
    • --disable-background-networking
    • --disable-features=TranslateUI
    • --disable-breakpad
    • --disable-crash-reporter
    • --renderer-process-limit=2
    • --no-zygote
    • --metrics-recording-only
    • --disable-extensions (standardmäßig aktiviert)
    • --disable-3d-apis, --disable-software-rasterizer und --disable-gpu sind standardmäßig aktiviert und können mit OPENCLAW_BROWSER_DISABLE_GRAPHICS_FLAGS=0 deaktiviert werden, falls die Nutzung von WebGL/3D dies erfordert.
    • OPENCLAW_BROWSER_DISABLE_EXTENSIONS=0 aktiviert Erweiterungen wieder, wenn Ihr Workflow davon abhängt.
    • --renderer-process-limit=2 kann mit OPENCLAW_BROWSER_RENDERER_PROCESS_LIMIT=<N> geändert werden; setzen Sie 0, um das Standard-Prozesslimit von Chromium zu verwenden.
    • plus --no-sandbox und --disable-setuid-sandbox, wenn noSandbox aktiviert ist.
    • Die Standardwerte sind die Container-Image-Basis; verwenden Sie ein benutzerdefiniertes Browser-Image mit einem benutzerdefinierten Entry-Point, um Container-Standardwerte zu ändern.
Browser-Sandboxing und sandbox.docker.binds sind nur für Docker verfügbar. Images bauen:
scripts/sandbox-setup.sh           # Haupt-Sandbox-Image
scripts/sandbox-browser-setup.sh   # optionales Browser-Image

agents.list (Überschreibungen pro Agent)

{
  agents: {
    list: [
      {
        id: "main",
        default: true,
        name: "Hauptagent",
        workspace: "~/.openclaw/workspace",
        agentDir: "~/.openclaw/agents/main/agent",
        model: "anthropic/claude-opus-4-6", // oder { primary, fallbacks }
        thinkingDefault: "high", // Überschreibung des Standard-Thinking-Levels pro Agent
        reasoningDefault: "on", // Überschreibung der Standard-Sichtbarkeit von Reasoning pro Agent
        fastModeDefault: false, // Überschreibung des Standard-Schnellmodus pro Agent
        params: { cacheRetention: "none" }, // überschreibt passende defaults.models-Parameter schlüsselweise
        skills: ["docs-search"], // ersetzt agents.defaults.skills, wenn gesetzt
        identity: {
          name: "Samantha",
          theme: "hilfreiches Faultier",
          emoji: "🦥",
          avatar: "avatars/samantha.png",
        },
        groupChat: { mentionPatterns: ["@openclaw"] },
        sandbox: { mode: "off" },
        runtime: {
          type: "acp",
          acp: {
            agent: "codex",
            backend: "acpx",
            mode: "persistent",
            cwd: "/workspace/openclaw",
          },
        },
        subagents: { allowAgents: ["*"] },
        tools: {
          profile: "coding",
          allow: ["browser"],
          deny: ["canvas"],
          elevated: { enabled: true },
        },
      },
    ],
  },
}
  • id: stabile Agent-ID (erforderlich).
  • default: wenn mehrere gesetzt sind, gewinnt der erste (Warnung wird protokolliert). Wenn keiner gesetzt ist, ist der erste Listeneintrag der Standard.
  • model: Die Zeichenfolgenform überschreibt nur primary; die Objektform { primary, fallbacks } überschreibt beide ([] deaktiviert globale Fallbacks). Cron-Jobs, die nur primary überschreiben, erben weiterhin Standard-Fallbacks, sofern Sie nicht fallbacks: [] setzen.
  • params: streambezogene Parameter pro Agent, die über dem ausgewählten Modelleintrag in agents.defaults.models zusammengeführt werden. Verwenden Sie dies für agentenspezifische Überschreibungen wie cacheRetention, temperature oder maxTokens, ohne den gesamten Modellkatalog zu duplizieren.
  • skills: optionale Skill-Erlaubnisliste pro Agent. Wenn weggelassen, erbt der Agent agents.defaults.skills, sofern gesetzt; eine explizite Liste ersetzt Standardwerte, anstatt sie zusammenzuführen, und [] bedeutet keine Skills.
  • thinkingDefault: optionales Standard-Thinking-Level pro Agent (off | minimal | low | medium | high | xhigh | adaptive). Überschreibt agents.defaults.thinkingDefault für diesen Agenten, wenn keine Überschreibung pro Nachricht oder Sitzung gesetzt ist.
  • reasoningDefault: optionale Standard-Sichtbarkeit von Reasoning pro Agent (on | off | stream). Gilt, wenn keine Überschreibung von Reasoning pro Nachricht oder Sitzung gesetzt ist.
  • fastModeDefault: optionaler Standardwert für den Schnellmodus pro Agent (true | false). Gilt, wenn keine Überschreibung des Schnellmodus pro Nachricht oder Sitzung gesetzt ist.
  • runtime: optionale Laufzeitbeschreibung pro Agent. Verwenden Sie type: "acp" mit den Standardwerten in runtime.acp (agent, backend, mode, cwd), wenn der Agent standardmäßig ACP-Harness-Sitzungen verwenden soll.
  • identity.avatar: workspace-relativer Pfad, http(s)-URL oder data:-URI.
  • identity leitet Standardwerte ab: ackReaction aus emoji, mentionPatterns aus name/emoji.
  • subagents.allowAgents: Erlaubnisliste von Agent-IDs für sessions_spawn (["*"] = beliebig; Standard: nur derselbe Agent).
  • Sandbox-Vererbungs-Schutz: Wenn die anfordernde Sitzung in einer Sandbox läuft, lehnt sessions_spawn Ziele ab, die ohne Sandbox laufen würden.
  • subagents.requireAgentId: Wenn true, blockiert sessions_spawn Aufrufe ohne agentId (erzwingt explizite Profilauswahl; Standard: false).

Routing mit mehreren Agenten

Führen Sie mehrere isolierte Agenten in einem Gateway aus. Siehe Multi-Agent.
{
  agents: {
    list: [
      { id: "home", default: true, workspace: "~/.openclaw/workspace-home" },
      { id: "work", workspace: "~/.openclaw/workspace-work" },
    ],
  },
  bindings: [
    { agentId: "home", match: { channel: "whatsapp", accountId: "personal" } },
    { agentId: "work", match: { channel: "whatsapp", accountId: "biz" } },
  ],
}

Binding-Match-Felder

  • type (optional): route für normales Routing (fehlender Typ bedeutet standardmäßig route), acp für persistente ACP-Unterhaltungs-Bindings.
  • match.channel (erforderlich)
  • match.accountId (optional; * = beliebiges Konto; weggelassen = Standardkonto)
  • match.peer (optional; { kind: direct|group|channel, id })
  • match.guildId / match.teamId (optional; kanalspezifisch)
  • acp (optional; nur für type: "acp"): { mode, label, cwd, backend }
Deterministische Match-Reihenfolge:
  1. match.peer
  2. match.guildId
  3. match.teamId
  4. match.accountId (exakt, ohne Peer/Guild/Team)
  5. match.accountId: "*" (kanalweit)
  6. Standard-Agent
Innerhalb jeder Ebene gewinnt der erste passende Eintrag in bindings. Für Einträge vom Typ type: "acp" löst OpenClaw nach exakter Unterhaltungsidentität auf (match.channel + Konto + match.peer.id) und verwendet nicht die obige Ebenenreihenfolge für Route-Bindings.

Zugriffsprofile pro Agent

{
  agents: {
    list: [
      {
        id: "personal",
        workspace: "~/.openclaw/workspace-personal",
        sandbox: { mode: "off" },
      },
    ],
  },
}
{
  agents: {
    list: [
      {
        id: "family",
        workspace: "~/.openclaw/workspace-family",
        sandbox: { mode: "all", scope: "agent", workspaceAccess: "ro" },
        tools: {
          allow: [
            "read",
            "sessions_list",
            "sessions_history",
            "sessions_send",
            "sessions_spawn",
            "session_status",
          ],
          deny: ["write", "edit", "apply_patch", "exec", "process", "browser"],
        },
      },
    ],
  },
}
{
  agents: {
    list: [
      {
        id: "public",
        workspace: "~/.openclaw/workspace-public",
        sandbox: { mode: "all", scope: "agent", workspaceAccess: "none" },
        tools: {
          allow: [
            "sessions_list",
            "sessions_history",
            "sessions_send",
            "sessions_spawn",
            "session_status",
            "whatsapp",
            "telegram",
            "slack",
            "discord",
            "gateway",
          ],
          deny: [
            "read",
            "write",
            "edit",
            "apply_patch",
            "exec",
            "process",
            "browser",
            "canvas",
            "nodes",
            "cron",
            "gateway",
            "image",
          ],
        },
      },
    ],
  },
}
Einzelheiten zur Priorität finden Sie unter Multi-Agent Sandbox & Tools.

Sitzung

{
  session: {
    scope: "per-sender",
    dmScope: "main", // main | per-peer | per-channel-peer | per-account-channel-peer
    identityLinks: {
      alice: ["telegram:123456789", "discord:987654321012345678"],
    },
    reset: {
      mode: "daily", // daily | idle
      atHour: 4,
      idleMinutes: 60,
    },
    resetByType: {
      thread: { mode: "daily", atHour: 4 },
      direct: { mode: "idle", idleMinutes: 240 },
      group: { mode: "idle", idleMinutes: 120 },
    },
    resetTriggers: ["/new", "/reset"],
    store: "~/.openclaw/agents/{agentId}/sessions/sessions.json",
    parentForkMaxTokens: 100000, // Parent-Thread-Fork oberhalb dieser Token-Anzahl überspringen (0 deaktiviert)
    maintenance: {
      mode: "warn", // warn | enforce
      pruneAfter: "30d",
      maxEntries: 500,
      rotateBytes: "10mb",
      resetArchiveRetention: "30d", // Dauer oder false
      maxDiskBytes: "500mb", // optionales hartes Budget
      highWaterBytes: "400mb", // optionales Bereinigungsziel
    },
    threadBindings: {
      enabled: true,
      idleHours: 24, // Standard für automatisches Entfokussieren bei Inaktivität in Stunden (`0` deaktiviert)
      maxAgeHours: 0, // Standard für hartes maximales Alter in Stunden (`0` deaktiviert)
    },
    mainKey: "main", // Legacy (Laufzeit verwendet immer "main")
    agentToAgent: { maxPingPongTurns: 5 },
    sendPolicy: {
      rules: [{ action: "deny", match: { channel: "discord", chatType: "group" } }],
      default: "allow",
    },
  },
}
  • scope: grundlegende Strategie zur Sitzungsgruppierung für Gruppenchats.
    • per-sender (Standard): Jeder Absender erhält innerhalb eines Kanalkontexts eine isolierte Sitzung.
    • global: Alle Teilnehmer in einem Kanalkontext teilen sich eine einzige Sitzung (nur verwenden, wenn gemeinsamer Kontext beabsichtigt ist).
  • dmScope: wie DMs gruppiert werden.
    • main: Alle DMs teilen sich die Hauptsitzung.
    • per-peer: isoliert nach Absender-ID kanalübergreifend.
    • per-channel-peer: isoliert pro Kanal + Absender (empfohlen für Posteingänge mit mehreren Benutzern).
    • per-account-channel-peer: isoliert pro Konto + Kanal + Absender (empfohlen für mehrere Konten).
  • identityLinks: ordnet kanonische IDs providerpräfixierten Peers zu, um kanalübergreifende gemeinsame Sitzungen zu ermöglichen.
  • reset: primäre Reset-Richtlinie. daily setzt um atHour lokaler Zeit zurück; idle setzt nach idleMinutes zurück. Wenn beide konfiguriert sind, gewinnt der zuerst ablaufende Wert.
  • resetByType: Überschreibungen pro Typ (direct, group, thread). Legacy-dm wird als Alias für direct akzeptiert.
  • parentForkMaxTokens: maximale totalTokens der übergeordneten Sitzung, die beim Erstellen einer geforkten Thread-Sitzung erlaubt sind (Standard 100000).
    • Wenn die übergeordnete Sitzung totalTokens über diesem Wert hat, startet OpenClaw eine neue Thread-Sitzung, statt den Verlauf des übergeordneten Transkripts zu übernehmen.
    • Setzen Sie 0, um diese Schutzfunktion zu deaktivieren und das Forken vom Parent immer zu erlauben.
  • mainKey: Legacy-Feld. Die Laufzeit verwendet immer "main" für den Haupt-Bucket für Direktchats.
  • agentToAgent.maxPingPongTurns: maximale Anzahl an Antwortzügen zwischen Agenten während Agent-zu-Agent-Austauschen (Ganzzahl, Bereich: 05). 0 deaktiviert Ping-Pong-Verkettung.
  • sendPolicy: Match über channel, chatType (direct|group|channel, mit Legacy-Alias dm), keyPrefix oder rawKeyPrefix. Die erste Ablehnung gewinnt.
  • maintenance: Bereinigung + Aufbewahrungskontrollen für den Sitzungsspeicher.
    • mode: warn gibt nur Warnungen aus; enforce wendet die Bereinigung an.
    • pruneAfter: Altersgrenze für veraltete Einträge (Standard 30d).
    • maxEntries: maximale Anzahl von Einträgen in sessions.json (Standard 500).
    • rotateBytes: rotiert sessions.json, wenn diese Größe überschritten wird (Standard 10mb).
    • resetArchiveRetention: Aufbewahrung für Transkriptarchive *.reset.<timestamp>. Standardmäßig wie pruneAfter; setzen Sie false, um dies zu deaktivieren.
    • maxDiskBytes: optionales Festplattenbudget für das Sitzungsverzeichnis. Im Modus warn werden Warnungen protokolliert; im Modus enforce werden zuerst die ältesten Artefakte/Sitzungen entfernt.
    • highWaterBytes: optionales Ziel nach der Bereinigung des Budgets. Standardmäßig 80% von maxDiskBytes.
  • threadBindings: globale Standardwerte für threadgebundene Sitzungsfunktionen.
    • enabled: globaler Standardschalter (Provider können überschreiben; Discord verwendet channels.discord.threadBindings.enabled)
    • idleHours: Standard für automatisches Entfokussieren bei Inaktivität in Stunden (0 deaktiviert; Provider können überschreiben)
    • maxAgeHours: Standard für hartes maximales Alter in Stunden (0 deaktiviert; Provider können überschreiben)

Nachrichten

{
  messages: {
    responsePrefix: "🦞", // oder "auto"
    ackReaction: "👀",
    ackReactionScope: "group-mentions", // group-mentions | group-all | direct | all
    removeAckAfterReply: false,
    queue: {
      mode: "collect", // steer | followup | collect | steer-backlog | steer+backlog | queue | interrupt
      debounceMs: 1000,
      cap: 20,
      drop: "summarize", // old | new | summarize
      byChannel: {
        whatsapp: "collect",
        telegram: "collect",
      },
    },
    inbound: {
      debounceMs: 2000, // 0 deaktiviert
      byChannel: {
        whatsapp: 5000,
        slack: 1500,
      },
    },
  },
}

Antwortpräfix

Überschreibungen pro Kanal/Konto: channels.<channel>.responsePrefix, channels.<channel>.accounts.<id>.responsePrefix. Auflösung (am spezifischsten gewinnt): Konto → Kanal → global. "" deaktiviert und stoppt die Kaskade. "auto" leitet [{identity.name}] ab. Template-Variablen:
VariableBeschreibungBeispiel
{model}Kurzer Modellnameclaude-opus-4-6
{modelFull}Vollständige Modellkennunganthropic/claude-opus-4-6
{provider}Provider-Nameanthropic
{thinkingLevel}Aktuelles Thinking-Levelhigh, low, off
{identity.name}Name der Agentenidentität(gleich wie "auto")
Variablen sind ohne Beachtung der Groß-/Kleinschreibung. {think} ist ein Alias für {thinkingLevel}.

Bestätigungsreaktion

  • Standardmäßig das identity.emoji des aktiven Agenten, andernfalls "👀". Setzen Sie "", um zu deaktivieren.
  • Überschreibungen pro Kanal: channels.<channel>.ackReaction, channels.<channel>.accounts.<id>.ackReaction.
  • Reihenfolge der Auflösung: Konto → Kanal → messages.ackReaction → Identity-Fallback.
  • Scope: group-mentions (Standard), group-all, direct, all.
  • removeAckAfterReply: entfernt die Bestätigungsreaktion nach der Antwort auf Slack, Discord und Telegram.
  • messages.statusReactions.enabled: aktiviert Lifecycle-Statusreaktionen auf Slack, Discord und Telegram. Auf Slack und Discord bleibt bei nicht gesetztem Wert die Statusreaktion aktiviert, wenn Bestätigungsreaktionen aktiv sind. Auf Telegram muss sie explizit auf true gesetzt werden, um Lifecycle-Statusreaktionen zu aktivieren.

Inbound-Debounce

Fasst schnelle reine Textnachrichten desselben Absenders zu einem einzigen Agent-Turn zusammen. Medien/Anhänge lösen sofortiges Flushen aus. Steuerbefehle umgehen Debouncing.

TTS (Text-to-Speech)

{
  messages: {
    tts: {
      auto: "always", // off | always | inbound | tagged
      mode: "final", // final | all
      provider: "elevenlabs",
      summaryModel: "openai/gpt-4.1-mini",
      modelOverrides: { enabled: true },
      maxTextLength: 4000,
      timeoutMs: 30000,
      prefsPath: "~/.openclaw/settings/tts.json",
      elevenlabs: {
        apiKey: "elevenlabs_api_key",
        baseUrl: "https://api.elevenlabs.io",
        voiceId: "voice_id",
        modelId: "eleven_multilingual_v2",
        seed: 42,
        applyTextNormalization: "auto",
        languageCode: "en",
        voiceSettings: {
          stability: 0.5,
          similarityBoost: 0.75,
          style: 0.0,
          useSpeakerBoost: true,
          speed: 1.0,
        },
      },
      openai: {
        apiKey: "openai_api_key",
        baseUrl: "https://api.openai.com/v1",
        model: "gpt-4o-mini-tts",
        voice: "alloy",
      },
    },
  },
}
  • auto steuert den Standardmodus für automatisches TTS: off, always, inbound oder tagged. /tts on|off kann lokale Einstellungen überschreiben, und /tts status zeigt den effektiven Status an.
  • summaryModel überschreibt agents.defaults.model.primary für die automatische Zusammenfassung.
  • modelOverrides ist standardmäßig aktiviert; modelOverrides.allowProvider ist standardmäßig false (Opt-in).
  • API-Schlüssel fallen auf ELEVENLABS_API_KEY/XI_API_KEY und OPENAI_API_KEY zurück.
  • openai.baseUrl überschreibt den OpenAI-TTS-Endpunkt. Auflösungsreihenfolge ist Konfiguration, dann OPENAI_TTS_BASE_URL, dann https://api.openai.com/v1.
  • Wenn openai.baseUrl auf einen Nicht-OpenAI-Endpunkt zeigt, behandelt OpenClaw ihn als OpenAI-kompatiblen TTS-Server und lockert die Modell-/Stimmenvalidierung.

Talk

Standardwerte für den Talk-Modus (macOS/iOS/Android).
{
  talk: {
    provider: "elevenlabs",
    providers: {
      elevenlabs: {
        voiceId: "elevenlabs_voice_id",
        voiceAliases: {
          Clawd: "EXAVITQu4vr4xnSDxMaL",
          Roger: "CwhRBWXzGAHq8TQ4Fs17",
        },
        modelId: "eleven_v3",
        outputFormat: "mp3_44100_128",
        apiKey: "elevenlabs_api_key",
      },
    },
    silenceTimeoutMs: 1500,
    interruptOnSpeech: true,
  },
}
  • talk.provider muss mit einem Schlüssel in talk.providers übereinstimmen, wenn mehrere Talk-Provider konfiguriert sind.
  • Veraltete flache Talk-Schlüssel (talk.voiceId, talk.voiceAliases, talk.modelId, talk.outputFormat, talk.apiKey) dienen nur der Kompatibilität und werden automatisch nach talk.providers.<provider> migriert.
  • Voice-IDs fallen auf ELEVENLABS_VOICE_ID oder SAG_VOICE_ID zurück.
  • providers.*.apiKey akzeptiert Klartextzeichenfolgen oder SecretRef-Objekte.
  • Der Fallback ELEVENLABS_API_KEY gilt nur, wenn kein Talk-API-Schlüssel konfiguriert ist.
  • providers.*.voiceAliases erlaubt es Talk-Direktiven, benutzerfreundliche Namen zu verwenden.
  • silenceTimeoutMs steuert, wie lange der Talk-Modus nach Benutzerschweigen wartet, bevor er das Transkript sendet. Wenn nicht gesetzt, bleibt das plattformspezifische Standard-Pausenfenster erhalten (700 ms auf macOS und Android, 900 ms auf iOS).

Tools

Tool-Profile

tools.profile setzt eine Basis-Erlaubnisliste vor tools.allow/tools.deny: Lokales Onboarding setzt neue lokale Konfigurationen standardmäßig auf tools.profile: "coding", wenn nichts gesetzt ist (bestehende explizite Profile bleiben erhalten).
ProfilEnthält
minimalnur session_status
codinggroup:fs, group:runtime, group:web, group:sessions, group:memory, cron, image, image_generate, video_generate
messaginggroup:messaging, sessions_list, sessions_history, sessions_send, session_status
fullKeine Einschränkung (wie nicht gesetzt)

Tool-Gruppen

GruppeTools
group:runtimeexec, process, code_execution (bash wird als Alias für exec akzeptiert)
group:fsread, write, edit, apply_patch
group:sessionssessions_list, sessions_history, sessions_send, sessions_spawn, sessions_yield, subagents, session_status
group:memorymemory_search, memory_get
group:webweb_search, x_search, web_fetch
group:uibrowser, canvas
group:automationcron, gateway
group:messagingmessage
group:nodesnodes
group:agentsagents_list
group:mediaimage, image_generate, video_generate, tts
group:openclawAlle integrierten Tools (ohne Provider-Plugins)

tools.allow / tools.deny

Globale Tool-Erlauben-/Verweigern-Richtlinie (Verweigerung gewinnt). Groß-/Kleinschreibung wird nicht beachtet, *-Wildcards werden unterstützt. Wird auch angewendet, wenn die Docker-Sandbox deaktiviert ist.
{
  tools: { deny: ["browser", "canvas"] },
}

tools.byProvider

Schränkt Tools für bestimmte Provider oder Modelle weiter ein. Reihenfolge: Basisprofil → Provider-Profil → allow/deny.
{
  tools: {
    profile: "coding",
    byProvider: {
      "google-antigravity": { profile: "minimal" },
      "openai/gpt-5.4": { allow: ["group:fs", "sessions_list"] },
    },
  },
}

tools.elevated

Steuert erhöhten exec-Zugriff außerhalb der Sandbox:
{
  tools: {
    elevated: {
      enabled: true,
      allowFrom: {
        whatsapp: ["+15555550123"],
        discord: ["1234567890123", "987654321098765432"],
      },
    },
  },
}
  • Überschreibungen pro Agent (agents.list[].tools.elevated) können nur weiter einschränken.
  • /elevated on|off|ask|full speichert den Status pro Sitzung; Inline-Direktiven gelten nur für eine einzelne Nachricht.
  • Erhöhtes exec umgeht die Sandbox und verwendet den konfigurierten Escape-Pfad (gateway standardmäßig oder node, wenn das exec-Ziel node ist).

tools.exec

{
  tools: {
    exec: {
      backgroundMs: 10000,
      timeoutSec: 1800,
      cleanupMs: 1800000,
      notifyOnExit: true,
      notifyOnExitEmptySuccess: false,
      applyPatch: {
        enabled: false,
        allowModels: ["gpt-5.4"],
      },
    },
  },
}

tools.loopDetection

Sicherheitsprüfungen für Tool-Schleifen sind standardmäßig deaktiviert. Setzen Sie enabled: true, um die Erkennung zu aktivieren. Einstellungen können global unter tools.loopDetection definiert und pro Agent unter agents.list[].tools.loopDetection überschrieben werden.
{
  tools: {
    loopDetection: {
      enabled: true,
      historySize: 30,
      warningThreshold: 10,
      criticalThreshold: 20,
      globalCircuitBreakerThreshold: 30,
      detectors: {
        genericRepeat: true,
        knownPollNoProgress: true,
        pingPong: true,
      },
    },
  },
}
  • historySize: maximale Historie von Tool-Aufrufen, die für die Schleifenanalyse aufbewahrt wird.
  • warningThreshold: Schwellenwert für Warnungen bei sich wiederholenden Mustern ohne Fortschritt.
  • criticalThreshold: höherer Wiederholungsschwellenwert für das Blockieren kritischer Schleifen.
  • globalCircuitBreakerThreshold: Schwellenwert für einen harten Stopp bei jedem Lauf ohne Fortschritt.
  • detectors.genericRepeat: warnt bei wiederholten Aufrufen desselben Tools mit denselben Argumenten.
  • detectors.knownPollNoProgress: warnt/blockiert bei bekannten Poll-Tools (process.poll, command_status usw.).
  • detectors.pingPong: warnt/blockiert bei alternierenden Musterpaaren ohne Fortschritt.
  • Wenn warningThreshold >= criticalThreshold oder criticalThreshold >= globalCircuitBreakerThreshold, schlägt die Validierung fehl.

tools.web

{
  tools: {
    web: {
      search: {
        enabled: true,
        apiKey: "brave_api_key", // oder BRAVE_API_KEY env
        maxResults: 5,
        timeoutSeconds: 30,
        cacheTtlMinutes: 15,
      },
      fetch: {
        enabled: true,
        provider: "firecrawl", // optional; für automatische Erkennung weglassen
        maxChars: 50000,
        maxCharsCap: 50000,
        maxResponseBytes: 2000000,
        timeoutSeconds: 30,
        cacheTtlMinutes: 15,
        maxRedirects: 3,
        readability: true,
        userAgent: "custom-ua",
      },
    },
  },
}

tools.media

Konfiguriert das Verständnis eingehender Medien (Bild/Audio/Video):
{
  tools: {
    media: {
      concurrency: 2,
      asyncCompletion: {
        directSend: false, // Opt-in: abgeschlossene asynchrone Musik/Videos direkt an den Kanal senden
      },
      audio: {
        enabled: true,
        maxBytes: 20971520,
        scope: {
          default: "deny",
          rules: [{ action: "allow", match: { chatType: "direct" } }],
        },
        models: [
          { provider: "openai", model: "gpt-4o-mini-transcribe" },
          { type: "cli", command: "whisper", args: ["--model", "base", "{{MediaPath}}"] },
        ],
      },
      video: {
        enabled: true,
        maxBytes: 52428800,
        models: [{ provider: "google", model: "gemini-3-flash-preview" }],
      },
    },
  },
}
Provider-Eintrag (type: "provider" oder weggelassen):
  • provider: API-Provider-ID (openai, anthropic, google/gemini, groq usw.)
  • model: Überschreibung der Modell-ID
  • profile / preferredProfile: Profilauswahl für auth-profiles.json
CLI-Eintrag (type: "cli"):
  • command: auszuführende ausführbare Datei
  • args: templatebasierte Argumente (unterstützt {{MediaPath}}, {{Prompt}}, {{MaxChars}} usw.)
Gemeinsame Felder:
  • capabilities: optionale Liste (image, audio, video). Standardwerte: openai/anthropic/minimax → Bild, google → Bild+Audio+Video, groq → Audio.
  • prompt, maxChars, maxBytes, timeoutSeconds, language: Überschreibungen pro Eintrag.
  • Bei Fehlern wird auf den nächsten Eintrag zurückgegriffen.
Die Provider-Authentifizierung folgt der Standardreihenfolge: auth-profiles.json → Env-Variablen → models.providers.*.apiKey.Felder für asynchrone Vervollständigung:
  • asyncCompletion.directSend: Wenn true, versuchen abgeschlossene asynchrone Aufgaben music_generate und video_generate zuerst die direkte Zustellung an den Kanal. Standard: false (Legacy-Pfad über Requester-Sitzungs-Wake/Modell-Zustellung).

tools.agentToAgent

{
  tools: {
    agentToAgent: {
      enabled: false,
      allow: ["home", "work"],
    },
  },
}

tools.sessions

Steuert, welche Sitzungen von den Sitzungs-Tools (sessions_list, sessions_history, sessions_send) angesprochen werden können. Standard: tree (aktuelle Sitzung + von ihr gestartete Sitzungen, zum Beispiel Subagenten).
{
  tools: {
    sessions: {
      // "self" | "tree" | "agent" | "all"
      visibility: "tree",
    },
  },
}
Hinweise:
  • self: nur der aktuelle Sitzungsschlüssel.
  • tree: aktuelle Sitzung + Sitzungen, die von der aktuellen Sitzung gestartet wurden (Subagenten).
  • agent: jede Sitzung, die zur aktuellen Agent-ID gehört (kann andere Benutzer einschließen, wenn Sie Per-Sender-Sitzungen unter derselben Agent-ID ausführen).
  • all: jede Sitzung. Kanalübergreifendes Targeting zwischen Agenten erfordert weiterhin tools.agentToAgent.
  • Sandbox-Begrenzung: Wenn die aktuelle Sitzung in einer Sandbox läuft und agents.defaults.sandbox.sessionToolsVisibility="spawned" gesetzt ist, wird die Sichtbarkeit auf tree erzwungen, selbst wenn tools.sessions.visibility="all" ist.

tools.sessions_spawn

Steuert die Unterstützung für Inline-Anhänge bei sessions_spawn.
{
  tools: {
    sessions_spawn: {
      attachments: {
        enabled: false, // Opt-in: auf true setzen, um Inline-Dateianhänge zu erlauben
        maxTotalBytes: 5242880, // insgesamt 5 MB über alle Dateien
        maxFiles: 50,
        maxFileBytes: 1048576, // 1 MB pro Datei
        retainOnSessionKeep: false, // Anhänge beibehalten, wenn cleanup="keep"
      },
    },
  },
}
Hinweise:
  • Anhänge werden nur für runtime: "subagent" unterstützt. ACP-Laufzeit lehnt sie ab.
  • Dateien werden im Child-Workspace unter .openclaw/attachments/<uuid>/ mit einer .manifest.json materialisiert.
  • Der Inhalt von Anhängen wird automatisch aus der Transkriptpersistenz entfernt.
  • Base64-Eingaben werden mit strikten Prüfungen für Alphabet/Padding und einer Größenprüfung vor dem Decoding validiert.
  • Dateiberechtigungen sind 0700 für Verzeichnisse und 0600 für Dateien.
  • Die Bereinigung folgt der Richtlinie cleanup: delete entfernt Anhänge immer; keep behält sie nur bei, wenn retainOnSessionKeep: true.

tools.experimental

Experimentelle integrierte Tool-Flags. Standardmäßig aus, sofern keine laufzeitspezifische Autoaktivierungsregel greift.
{
  tools: {
    experimental: {
      planTool: true, // experimentelles update_plan aktivieren
    },
  },
}
Hinweise:
  • planTool: aktiviert das strukturierte Tool update_plan für die Nachverfolgung nichttrivialer mehrstufiger Arbeiten.
  • Standard: false für Nicht-OpenAI-Provider. OpenAI- und OpenAI-Codex-Läufe aktivieren es automatisch, wenn es nicht gesetzt ist; setzen Sie false, um diese Autoaktivierung zu deaktivieren.
  • Wenn aktiviert, fügt der System-Prompt auch Nutzungshinweise hinzu, damit das Modell es nur für umfangreichere Arbeiten verwendet und höchstens einen Schritt in_progress hält.

agents.defaults.subagents

{
  agents: {
    defaults: {
      subagents: {
        allowAgents: ["research"],
        model: "minimax/MiniMax-M2.7",
        maxConcurrent: 8,
        runTimeoutSeconds: 900,
        archiveAfterMinutes: 60,
      },
    },
  },
}
  • model: Standardmodell für gestartete Subagenten. Wenn weggelassen, erben Subagenten das Modell des Aufrufers.
  • allowAgents: Standard-Erlaubnisliste zulässiger Ziel-Agent-IDs für sessions_spawn, wenn der anfordernde Agent nicht sein eigenes subagents.allowAgents setzt (["*"] = beliebig; Standard: nur derselbe Agent).
  • runTimeoutSeconds: Standard-Timeout (Sekunden) für sessions_spawn, wenn der Tool-Aufruf runTimeoutSeconds weglässt. 0 bedeutet kein Timeout.
  • Tool-Richtlinie pro Subagent: tools.subagents.tools.allow / tools.subagents.tools.deny.

Benutzerdefinierte Provider und Base-URLs

OpenClaw verwendet den integrierten Modellkatalog. Fügen Sie benutzerdefinierte Provider über models.providers in der Konfiguration oder ~/.openclaw/agents/<agentId>/agent/models.json hinzu.
{
  models: {
    mode: "merge", // merge (Standard) | replace
    providers: {
      "custom-proxy": {
        baseUrl: "http://localhost:4000/v1",
        apiKey: "LITELLM_KEY",
        api: "openai-completions", // openai-completions | openai-responses | anthropic-messages | google-generative-ai
        models: [
          {
            id: "llama-3.1-8b",
            name: "Llama 3.1 8B",
            reasoning: false,
            input: ["text"],
            cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
            contextWindow: 128000,
            contextTokens: 96000,
            maxTokens: 32000,
          },
        ],
      },
    },
  },
}
  • Verwenden Sie authHeader: true + headers für benutzerdefinierte Authentifizierungsanforderungen.
  • Überschreiben Sie das Agent-Konfigurations-Root mit OPENCLAW_AGENT_DIR (oder PI_CODING_AGENT_DIR, einem Legacy-Alias für Umgebungsvariablen).
  • Merge-Priorität für übereinstimmende Provider-IDs:
    • Nicht leere baseUrl-Werte aus agentbezogenem models.json haben Vorrang.
    • Nicht leere agentbezogene apiKey-Werte haben nur dann Vorrang, wenn dieser Provider im aktuellen Kontext von Konfiguration/Auth-Profil nicht über SecretRef verwaltet wird.
    • SecretRef-verwaltete Provider-apiKey-Werte werden aus Quellmarkierungen aktualisiert (ENV_VAR_NAME für Env-Refs, secretref-managed für Datei-/Exec-Refs), anstatt aufgelöste Secrets zu persistieren.
    • SecretRef-verwaltete Werte für Provider-Header werden aus Quellmarkierungen aktualisiert (secretref-env:ENV_VAR_NAME für Env-Refs, secretref-managed für Datei-/Exec-Refs).
    • Leere oder fehlende agentbezogene apiKey/baseUrl fallen auf models.providers in der Konfiguration zurück.
    • Übereinstimmende Modellwerte für contextWindow/maxTokens verwenden den höheren Wert zwischen expliziter Konfiguration und impliziten Katalogwerten.
    • Übereinstimmende Modellwerte für contextTokens behalten eine explizite Laufzeitbegrenzung bei, wenn vorhanden; verwenden Sie sie, um den effektiven Kontext zu begrenzen, ohne native Modellmetadaten zu ändern.
    • Verwenden Sie models.mode: "replace", wenn die Konfiguration models.json vollständig neu schreiben soll.
    • Marker-Persistenz ist quellenautoritativ: Marker werden aus dem aktiven Quellkonfigurations-Snapshot (vor der Auflösung) geschrieben, nicht aus aufgelösten Laufzeit-Secret-Werten.

Details zu Provider-Feldern

  • models.mode: Verhalten des Provider-Katalogs (merge oder replace).
  • models.providers: benutzerdefinierte Provider-Zuordnung, nach Provider-ID geschlüsselt.
  • models.providers.*.api: Request-Adapter (openai-completions, openai-responses, anthropic-messages, google-generative-ai usw.).
  • models.providers.*.apiKey: Provider-Anmeldedaten (SecretRef/Env-Substitution bevorzugt).
  • models.providers.*.auth: Authentifizierungsstrategie (api-key, token, oauth, aws-sdk).
  • models.providers.*.injectNumCtxForOpenAICompat: für Ollama + openai-completions, options.num_ctx in Requests einfügen (Standard: true).
  • models.providers.*.authHeader: erzwingt bei Bedarf die Übertragung der Anmeldedaten im Header Authorization.
  • models.providers.*.baseUrl: Base-URL der Upstream-API.
  • models.providers.*.headers: zusätzliche statische Header für Proxy-/Mandanten-Routing.
  • models.providers.*.request: Transportüberschreibungen für HTTP-Requests des Modell-Providers.
    • request.headers: zusätzliche Header (werden mit den Provider-Standardwerten zusammengeführt). Werte akzeptieren SecretRef.
    • request.auth: Überschreibung der Authentifizierungsstrategie. Modi: "provider-default" (integrierte Auth des Providers verwenden), "authorization-bearer" (mit token), "header" (mit headerName, value, optional prefix).
    • request.proxy: Überschreibung des HTTP-Proxys. Modi: "env-proxy" (Env-Variablen HTTP_PROXY/HTTPS_PROXY verwenden), "explicit-proxy" (mit url). Beide Modi akzeptieren optional ein Unterobjekt tls.
    • request.tls: TLS-Überschreibung für direkte Verbindungen. Felder: ca, cert, key, passphrase (alle akzeptieren SecretRef), serverName, insecureSkipVerify.
    • request.allowPrivateNetwork: wenn true, HTTPS zu baseUrl erlauben, wenn DNS zu privaten, CGNAT- oder ähnlichen Bereichen auflöst, über die HTTP-Fetch-Schutzfunktion des Providers (Opt-in des Operators für vertrauenswürdige selbstgehostete OpenAI-kompatible Endpunkte). WebSocket verwendet dasselbe request für Header/TLS, aber nicht diese SSRF-Schutzfunktion für Fetch. Standard false.
  • models.providers.*.models: explizite Katalogeinträge für Providermodelle.
  • models.providers.*.models.*.contextWindow: Metadaten zum nativen Kontextfenster des Modells.
  • models.providers.*.models.*.contextTokens: optionale Laufzeitgrenze für den Kontext. Verwenden Sie dies, wenn Sie ein kleineres effektives Kontextbudget als das native contextWindow des Modells möchten.
  • models.providers.*.models.*.compat.supportsDeveloperRole: optionaler Kompatibilitätshinweis. Für api: "openai-completions" mit einer nicht leeren, nicht nativen baseUrl (Host nicht api.openai.com) erzwingt OpenClaw dies zur Laufzeit auf false. Leere/weggelassene baseUrl behält das Standard-OpenAI-Verhalten bei.
  • models.providers.*.models.*.compat.requiresStringContent: optionaler Kompatibilitätshinweis für OpenAI-kompatible Chat-Endpunkte, die nur Zeichenfolgen unterstützen. Wenn true, flacht OpenClaw reine Text-Arrays in messages[].content vor dem Senden des Requests in einfache Zeichenfolgen ab.
  • plugins.entries.amazon-bedrock.config.discovery: Root der Bedrock-Auto-Discovery-Einstellungen.
  • plugins.entries.amazon-bedrock.config.discovery.enabled: implizite Discovery ein-/ausschalten.
  • plugins.entries.amazon-bedrock.config.discovery.region: AWS-Region für Discovery.
  • plugins.entries.amazon-bedrock.config.discovery.providerFilter: optionaler Filter nach Provider-ID für gezielte Discovery.
  • plugins.entries.amazon-bedrock.config.discovery.refreshInterval: Polling-Intervall für die Aktualisierung der Discovery.
  • plugins.entries.amazon-bedrock.config.discovery.defaultContextWindow: Fallback-Kontextfenster für entdeckte Modelle.
  • plugins.entries.amazon-bedrock.config.discovery.defaultMaxTokens: Fallback für maximale Ausgabetokens für entdeckte Modelle.

Provider-Beispiele

{
  env: { CEREBRAS_API_KEY: "sk-..." },
  agents: {
    defaults: {
      model: {
        primary: "cerebras/zai-glm-4.7",
        fallbacks: ["cerebras/zai-glm-4.6"],
      },
      models: {
        "cerebras/zai-glm-4.7": { alias: "GLM 4.7 (Cerebras)" },
        "cerebras/zai-glm-4.6": { alias: "GLM 4.6 (Cerebras)" },
      },
    },
  },
  models: {
    mode: "merge",
    providers: {
      cerebras: {
        baseUrl: "https://api.cerebras.ai/v1",
        apiKey: "${CEREBRAS_API_KEY}",
        api: "openai-completions",
        models: [
          { id: "zai-glm-4.7", name: "GLM 4.7 (Cerebras)" },
          { id: "zai-glm-4.6", name: "GLM 4.6 (Cerebras)" },
        ],
      },
    },
  },
}
Verwenden Sie cerebras/zai-glm-4.7 für Cerebras; zai/glm-4.7 für Z.AI direkt.
{
  agents: {
    defaults: {
      model: { primary: "opencode/claude-opus-4-6" },
      models: { "opencode/claude-opus-4-6": { alias: "Opus" } },
    },
  },
}
Setzen Sie OPENCODE_API_KEY (oder OPENCODE_ZEN_API_KEY). Verwenden Sie Referenzen opencode/... für den Zen-Katalog oder opencode-go/... für den Go-Katalog. Kurzform: openclaw onboard --auth-choice opencode-zen oder openclaw onboard --auth-choice opencode-go.
{
  agents: {
    defaults: {
      model: { primary: "zai/glm-4.7" },
      models: { "zai/glm-4.7": {} },
    },
  },
}
Setzen Sie ZAI_API_KEY. z.ai/* und z-ai/* sind akzeptierte Aliasse. Kurzform: openclaw onboard --auth-choice zai-api-key.
  • Allgemeiner Endpunkt: https://api.z.ai/api/paas/v4
  • Coding-Endpunkt (Standard): https://api.z.ai/api/coding/paas/v4
  • Für den allgemeinen Endpunkt definieren Sie einen benutzerdefinierten Provider mit Überschreibung der Base-URL.
{
  env: { MOONSHOT_API_KEY: "sk-..." },
  agents: {
    defaults: {
      model: { primary: "moonshot/kimi-k2.5" },
      models: { "moonshot/kimi-k2.5": { alias: "Kimi K2.5" } },
    },
  },
  models: {
    mode: "merge",
    providers: {
      moonshot: {
        baseUrl: "https://api.moonshot.ai/v1",
        apiKey: "${MOONSHOT_API_KEY}",
        api: "openai-completions",
        models: [
          {
            id: "kimi-k2.5",
            name: "Kimi K2.5",
            reasoning: false,
            input: ["text", "image"],
            cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
            contextWindow: 262144,
            maxTokens: 262144,
          },
        ],
      },
    },
  },
}
Für den China-Endpunkt: baseUrl: "https://api.moonshot.cn/v1" oder openclaw onboard --auth-choice moonshot-api-key-cn.Native Moonshot-Endpunkte melden Streaming-Nutzungskompatibilität auf dem gemeinsamen Transport openai-completions, und OpenClaw richtet sich dabei nach den Fähigkeiten des Endpunkts statt allein nach der integrierten Provider-ID.
{
  env: { KIMI_API_KEY: "sk-..." },
  agents: {
    defaults: {
      model: { primary: "kimi/kimi-code" },
      models: { "kimi/kimi-code": { alias: "Kimi Code" } },
    },
  },
}
Anthropic-kompatibel, integrierter Provider. Kurzform: openclaw onboard --auth-choice kimi-code-api-key.
{
  env: { SYNTHETIC_API_KEY: "sk-..." },
  agents: {
    defaults: {
      model: { primary: "synthetic/hf:MiniMaxAI/MiniMax-M2.5" },
      models: { "synthetic/hf:MiniMaxAI/MiniMax-M2.5": { alias: "MiniMax M2.5" } },
    },
  },
  models: {
    mode: "merge",
    providers: {
      synthetic: {
        baseUrl: "https://api.synthetic.new/anthropic",
        apiKey: "${SYNTHETIC_API_KEY}",
        api: "anthropic-messages",
        models: [
          {
            id: "hf:MiniMaxAI/MiniMax-M2.5",
            name: "MiniMax M2.5",
            reasoning: true,
            input: ["text"],
            cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
            contextWindow: 192000,
            maxTokens: 65536,
          },
        ],
      },
    },
  },
}
Die Base-URL sollte /v1 weglassen (der Anthropic-Client hängt dies an). Kurzform: openclaw onboard --auth-choice synthetic-api-key.
{
  agents: {
    defaults: {
      model: { primary: "minimax/MiniMax-M2.7" },
      models: {
        "minimax/MiniMax-M2.7": { alias: "Minimax" },
      },
    },
  },
  models: {
    mode: "merge",
    providers: {
      minimax: {
        baseUrl: "https://api.minimax.io/anthropic",
        apiKey: "${MINIMAX_API_KEY}",
        api: "anthropic-messages",
        models: [
          {
            id: "MiniMax-M2.7",
            name: "MiniMax M2.7",
            reasoning: true,
            input: ["text", "image"],
            cost: { input: 0.3, output: 1.2, cacheRead: 0.06, cacheWrite: 0.375 },
            contextWindow: 204800,
            maxTokens: 131072,
          },
        ],
      },
    },
  },
}
Setzen Sie MINIMAX_API_KEY. Kurzformen: openclaw onboard --auth-choice minimax-global-api oder openclaw onboard --auth-choice minimax-cn-api. Der Modellkatalog verwendet standardmäßig nur M2.7. Auf dem Anthropic-kompatiblen Streaming-Pfad deaktiviert OpenClaw MiniMax-Thinking standardmäßig, sofern Sie thinking nicht explizit selbst setzen. /fast on oder params.fastMode: true schreibt MiniMax-M2.7 in MiniMax-M2.7-highspeed um.
Siehe Local Models. Kurz gesagt: Führen Sie auf leistungsfähiger Hardware ein großes lokales Modell über die LM Studio Responses API aus; behalten Sie gehostete Modelle für den Fallback im Merge.

Skills

{
  skills: {
    allowBundled: ["gemini", "peekaboo"],
    load: {
      extraDirs: ["~/Projects/agent-scripts/skills"],
    },
    install: {
      preferBrew: true,
      nodeManager: "npm", // npm | pnpm | yarn | bun
    },
    entries: {
      "image-lab": {
        apiKey: { source: "env", provider: "default", id: "GEMINI_API_KEY" }, // oder Klartextzeichenfolge
        env: { GEMINI_API_KEY: "GEMINI_KEY_HERE" },
      },
      peekaboo: { enabled: true },
      sag: { enabled: false },
    },
  },
}
  • allowBundled: optionale Erlaubnisliste nur für gebündelte Skills (verwaltete/Workspace-Skills bleiben unberührt).
  • load.extraDirs: zusätzliche gemeinsame Skill-Roots (niedrigste Priorität).
  • install.preferBrew: wenn true, Homebrew-Installer bevorzugen, wenn brew verfügbar ist, bevor auf andere Installer-Arten zurückgegriffen wird.
  • install.nodeManager: bevorzugter Node-Installer für Spezifikationen in metadata.openclaw.install (npm | pnpm | yarn | bun).
  • entries.<skillKey>.enabled: false deaktiviert einen Skill, selbst wenn er gebündelt/installiert ist.
  • entries.<skillKey>.apiKey: Komfortfeld für Skills, die eine primäre Env-Variable deklarieren (Klartextzeichenfolge oder SecretRef-Objekt).

Plugins

{
  plugins: {
    enabled: true,
    allow: ["voice-call"],
    deny: [],
    load: {
      paths: ["~/Projects/oss/voice-call-extension"],
    },
    entries: {
      "voice-call": {
        enabled: true,
        hooks: {
          allowPromptInjection: false,
        },
        config: { provider: "twilio" },
      },
    },
  },
}
  • Geladen aus ~/.openclaw/extensions, <workspace>/.openclaw/extensions sowie plugins.load.paths.
  • Discovery akzeptiert native OpenClaw-Plugins sowie kompatible Codex-Bundles und Claude-Bundles, einschließlich manifestloser Claude-Bundles im Standardlayout.
  • Konfigurationsänderungen erfordern einen Gateway-Neustart.
  • allow: optionale Erlaubnisliste (nur aufgeführte Plugins werden geladen). deny gewinnt.
  • plugins.entries.<id>.apiKey: Komfortfeld für API-Schlüssel auf Plugin-Ebene (wenn vom Plugin unterstützt).
  • plugins.entries.<id>.env: pluginbezogene Zuordnung von Env-Variablen.
  • plugins.entries.<id>.hooks.allowPromptInjection: wenn false, blockiert der Core before_prompt_build und ignoriert promptverändernde Felder aus Legacy-before_agent_start, während Legacy-modelOverride und providerOverride erhalten bleiben. Gilt für native Plugin-Hooks und unterstützte von Bundles bereitgestellte Hook-Verzeichnisse.
  • plugins.entries.<id>.subagent.allowModelOverride: diesem Plugin explizit vertrauen, pro Lauf Überschreibungen für provider und model bei Hintergrund-Subagent-Läufen anzufordern.
  • plugins.entries.<id>.subagent.allowedModels: optionale Erlaubnisliste kanonischer Ziele provider/model für vertrauenswürdige Subagent-Überschreibungen. Verwenden Sie "*", nur wenn Sie absichtlich jedes Modell erlauben möchten.
  • plugins.entries.<id>.config: plugindefiniertes Konfigurationsobjekt (validiert gegen das native OpenClaw-Plugin-Schema, wenn verfügbar).
  • plugins.entries.firecrawl.config.webFetch: Firecrawl-Einstellungen für den Web-Fetch-Provider.
    • apiKey: Firecrawl-API-Schlüssel (akzeptiert SecretRef). Fällt auf plugins.entries.firecrawl.config.webSearch.apiKey, Legacy-tools.web.fetch.firecrawl.apiKey oder die Env-Variable FIRECRAWL_API_KEY zurück.
    • baseUrl: Firecrawl-API-Base-URL (Standard: https://api.firecrawl.dev).
    • onlyMainContent: nur den Hauptinhalt aus Seiten extrahieren (Standard: true).
    • maxAgeMs: maximales Cache-Alter in Millisekunden (Standard: 172800000 / 2 Tage).
    • timeoutSeconds: Timeout für Scrape-Requests in Sekunden (Standard: 60).
  • plugins.entries.xai.config.xSearch: xAI-X-Search-Einstellungen (Grok-Websuche).
    • enabled: den X-Search-Provider aktivieren.
    • model: zu verwendendes Grok-Modell für die Suche (z. B. "grok-4-1-fast").
  • plugins.entries.memory-core.config.dreaming: Einstellungen für Memory-Dreaming (experimentell). Siehe Dreaming für Phasen und Schwellenwerte.
    • enabled: globaler Schalter für Dreaming (Standard false).
    • frequency: Cron-Taktung für jeden vollständigen Dreaming-Durchlauf (standardmäßig "0 3 * * *").
    • Phasenrichtlinie und Schwellenwerte sind Implementierungsdetails (keine benutzerseitigen Konfigurationsschlüssel).
  • Die vollständige Memory-Konfiguration steht in der Memory-Konfigurationsreferenz:
    • agents.defaults.memorySearch.*
    • memory.backend
    • memory.citations
    • memory.qmd.*
    • plugins.entries.memory-core.config.dreaming
  • Aktivierte Claude-Bundle-Plugins können auch eingebettete Pi-Standardeinstellungen aus settings.json beisteuern; OpenClaw wendet diese als bereinigte Agent-Einstellungen an, nicht als rohe OpenClaw-Konfigurations-Patches.
  • plugins.slots.memory: aktive Speicher-Plugin-ID auswählen oder "none" setzen, um Speicher-Plugins zu deaktivieren.
  • plugins.slots.contextEngine: aktive Context-Engine-Plugin-ID auswählen; standardmäßig "legacy", sofern Sie keine andere Engine installieren und auswählen.
  • plugins.installs: von der CLI verwaltete Installationsmetadaten, verwendet von openclaw plugins update.
    • Enthält source, spec, sourcePath, installPath, version, resolvedName, resolvedVersion, resolvedSpec, integrity, shasum, resolvedAt, installedAt.
    • Behandeln Sie plugins.installs.* als verwalteten Zustand; bevorzugen Sie CLI-Befehle statt manueller Bearbeitungen.
Siehe Plugins.

Browser

{
  browser: {
    enabled: true,
    evaluateEnabled: true,
    defaultProfile: "user",
    ssrfPolicy: {
      dangerouslyAllowPrivateNetwork: true, // Standardmodell für vertrauenswürdige Netzwerke
      // allowPrivateNetwork: true, // Legacy-Alias
      // hostnameAllowlist: ["*.example.com", "example.com"],
      // allowedHostnames: ["localhost"],
    },
    profiles: {
      openclaw: { cdpPort: 18800, color: "#FF4500" },
      work: { cdpPort: 18801, color: "#0066CC" },
      user: { driver: "existing-session", attachOnly: true, color: "#00AA00" },
      brave: {
        driver: "existing-session",
        attachOnly: true,
        userDataDir: "~/Library/Application Support/BraveSoftware/Brave-Browser",
        color: "#FB542B",
      },
      remote: { cdpUrl: "http://10.0.0.42:9222", color: "#00AA00" },
    },
    color: "#FF4500",
    // headless: false,
    // noSandbox: false,
    // extraArgs: [],
    // executablePath: "/Applications/Brave Browser.app/Contents/MacOS/Brave Browser",
    // attachOnly: false,
  },
}
  • evaluateEnabled: false deaktiviert act:evaluate und wait --fn.
  • ssrfPolicy.dangerouslyAllowPrivateNetwork ist standardmäßig true, wenn es nicht gesetzt ist (Modell für vertrauenswürdige Netzwerke).
  • Setzen Sie ssrfPolicy.dangerouslyAllowPrivateNetwork: false für strikte öffentliche Browsernavigation ohne private Netzwerke.
  • Im strikten Modus unterliegen entfernte CDP-Profilendpunkte (profiles.*.cdpUrl) derselben Blockierung privater Netzwerke bei Erreichbarkeits-/Discovery-Prüfungen.
  • ssrfPolicy.allowPrivateNetwork bleibt als Legacy-Alias unterstützt.
  • Verwenden Sie im strikten Modus ssrfPolicy.hostnameAllowlist und ssrfPolicy.allowedHostnames für explizite Ausnahmen.
  • Entfernte Profile sind nur zum Anhängen gedacht (Start/Stopp/Reset deaktiviert).
  • profiles.*.cdpUrl akzeptiert http://, https://, ws:// und wss://. Verwenden Sie HTTP(S), wenn OpenClaw /json/version erkennen soll; verwenden Sie WS(S), wenn Ihr Provider Ihnen eine direkte DevTools-WebSocket-URL bereitstellt.
  • Profile vom Typ existing-session sind nur für den Host und verwenden Chrome MCP statt CDP.
  • Profile vom Typ existing-session können userDataDir setzen, um ein bestimmtes Chromium-basiertes Browserprofil wie Brave oder Edge anzusprechen.
  • Profile vom Typ existing-session behalten die aktuellen Routenbegrenzungen von Chrome MCP: Snapshot-/Ref-gesteuerte Aktionen statt CSS-Selektor-Targeting, Hooks für das Hochladen einer einzelnen Datei, keine Dialog-Timeout-Überschreibungen, kein wait --load networkidle und kein responsebody, PDF-Export, Download-Interception oder Batch-Aktionen.
  • Lokal verwaltete openclaw-Profile weisen cdpPort und cdpUrl automatisch zu; setzen Sie cdpUrl nur explizit für entferntes CDP.
  • Reihenfolge bei der automatischen Erkennung: Standardbrowser, wenn Chromium-basiert → Chrome → Brave → Edge → Chromium → Chrome Canary.
  • Control-Service: nur loopback (Port aus gateway.port abgeleitet, Standard 18791).
  • extraArgs hängt zusätzliche Start-Flags an den lokalen Chromium-Start an (zum Beispiel --disable-gpu, Fenstergröße oder Debug-Flags).

UI

{
  ui: {
    seamColor: "#FF4500",
    assistant: {
      name: "OpenClaw",
      avatar: "CB", // Emoji, kurzer Text, Bild-URL oder data-URI
    },
  },
}
  • seamColor: Akzentfarbe für das UI-Chrome der nativen App (Talk-Mode-Blasenfärbung usw.).
  • assistant: Identity-Überschreibung für die Control UI. Fällt auf die aktive Agentenidentität zurück.

Gateway

{
  gateway: {
    mode: "local", // local | remote
    port: 18789,
    bind: "loopback",
    auth: {
      mode: "token", // none | token | password | trusted-proxy
      token: "your-token",
      // password: "your-password", // oder OPENCLAW_GATEWAY_PASSWORD
      // trustedProxy: { userHeader: "x-forwarded-user" }, // für mode=trusted-proxy; siehe /gateway/trusted-proxy-auth
      allowTailscale: true,
      rateLimit: {
        maxAttempts: 10,
        windowMs: 60000,
        lockoutMs: 300000,
        exemptLoopback: true,
      },
    },
    tailscale: {
      mode: "off", // off | serve | funnel
      resetOnExit: false,
    },
    controlUi: {
      enabled: true,
      basePath: "/openclaw",
      // root: "dist/control-ui",
      // allowedOrigins: ["https://control.example.com"], // erforderlich für nicht-loopback Control UI
      // dangerouslyAllowHostHeaderOriginFallback: false, // gefährlicher Host-Header-Origin-Fallback-Modus
      // allowInsecureAuth: false,
      // dangerouslyDisableDeviceAuth: false,
    },
    remote: {
      url: "ws://gateway.tailnet:18789",
      transport: "ssh", // ssh | direct
      token: "your-token",
      // password: "your-password",
    },
    trustedProxies: ["10.0.0.1"],
    // Optional. Standard false.
    allowRealIpFallback: false,
    tools: {
      // Zusätzliche HTTP-Ablehnungen für /tools/invoke
      deny: ["browser"],
      // Tools aus der Standard-HTTP-Ablehnungsliste entfernen
      allow: ["gateway"],
    },
    push: {
      apns: {
        relay: {
          baseUrl: "https://relay.example.com",
          timeoutMs: 10000,
        },
      },
    },
  },
}
  • mode: local (Gateway ausführen) oder remote (mit entferntem Gateway verbinden). Das Gateway verweigert den Start, sofern nicht local.
  • port: einzelner multiplexierter Port für WS + HTTP. Priorität: --port > OPENCLAW_GATEWAY_PORT > gateway.port > 18789.
  • bind: auto, loopback (Standard), lan (0.0.0.0), tailnet (nur Tailscale-IP) oder custom.
  • Legacy-Bind-Aliasse: Verwenden Sie Bind-Modus-Werte in gateway.bind (auto, loopback, lan, tailnet, custom), nicht Host-Aliasse (0.0.0.0, 127.0.0.1, localhost, ::, ::1).
  • Docker-Hinweis: Das standardmäßige loopback-Binding lauscht innerhalb des Containers auf 127.0.0.1. Bei Docker-Bridge-Netzwerk (-p 18789:18789) kommt der Datenverkehr über eth0, daher ist das Gateway nicht erreichbar. Verwenden Sie --network host oder setzen Sie bind: "lan" (oder bind: "custom" mit customBindHost: "0.0.0.0"), um auf allen Schnittstellen zu lauschen.
  • Authentifizierung: standardmäßig erforderlich. Nicht-Loopback-Bindings erfordern Gateway-Authentifizierung. In der Praxis bedeutet das ein gemeinsames Token/Passwort oder einen identitätsbewussten Reverse-Proxy mit gateway.auth.mode: "trusted-proxy" (siehe Trusted Proxy Auth). Der Onboarding-Assistent erzeugt standardmäßig ein Token.
  • Wenn sowohl gateway.auth.token als auch gateway.auth.password konfiguriert sind (einschließlich SecretRefs), setzen Sie gateway.auth.mode explizit auf token oder password. Start- sowie Service-Installations-/Reparaturabläufe schlagen fehl, wenn beide konfiguriert sind und mode nicht gesetzt ist.
  • gateway.auth.mode: "none": expliziter Modus ohne Authentifizierung. Nur für vertrauenswürdige lokale loopback-Setups verwenden; dieser Modus wird in Onboarding-Prompts absichtlich nicht angeboten.
  • gateway.auth.mode: "trusted-proxy": delegiert Authentifizierung an einen identitätsbewussten Reverse-Proxy und vertraut Identitäts-Headern von gateway.trustedProxies (siehe Trusted Proxy Auth). Dieser Modus erwartet eine nicht-loopback Proxy-Quelle; Reverse-Proxys auf demselben Host über loopback erfüllen die Anforderungen für trusted-proxy auth nicht.
  • gateway.auth.allowTailscale: wenn true, können Tailscale-Serve-Identitäts-Header die Authentifizierung von Control UI/WebSocket erfüllen (über tailscale whois verifiziert). HTTP-API-Endpunkte verwenden nicht diese Tailscale-Header-Authentifizierung; sie folgen stattdessen dem normalen HTTP-Authentifizierungsmodus des Gateways. Dieser tokenlose Ablauf setzt voraus, dass der Gateway-Host vertrauenswürdig ist. Standardmäßig true, wenn tailscale.mode = "serve" ist.
  • gateway.auth.rateLimit: optionaler Limiter für fehlgeschlagene Authentifizierungen. Gilt pro Client-IP und pro Authentifizierungsbereich (Shared-Secret und Device-Token werden unabhängig verfolgt). Blockierte Versuche geben 429 + Retry-After zurück.
    • Auf dem asynchronen Tailscale-Serve-Control-UI-Pfad werden fehlgeschlagene Versuche für dieselbe {scope, clientIp} vor dem Schreiben des Fehlers serialisiert. Gleichzeitige fehlerhafte Versuche desselben Clients können den Limiter daher beim zweiten Request auslösen, statt dass beide als einfache Nichtübereinstimmungen durchrutschen.
    • gateway.auth.rateLimit.exemptLoopback ist standardmäßig true; setzen Sie es auf false, wenn Sie localhost-Datenverkehr absichtlich ebenfalls ratenbegrenzen möchten (für Test-Setups oder strikte Proxy-Deployments).
  • Browser-originierte WS-Authentifizierungsversuche werden immer mit deaktivierter Loopback-Ausnahme gedrosselt (Defense-in-Depth gegen browserbasierte Brute-Force-Angriffe auf localhost).
  • Auf loopback werden diese Sperren für browseroriginierte Versuche pro normalisiertem Origin-Wert isoliert, sodass wiederholte Fehlversuche von einer localhost-Origin nicht automatisch eine andere Origin aussperren.
  • tailscale.mode: serve (nur Tailnet, loopback-Bind) oder funnel (öffentlich, erfordert Authentifizierung).
  • controlUi.allowedOrigins: explizite Browser-Origin-Erlaubnisliste für Gateway-WebSocket-Verbindungen. Erforderlich, wenn Browser-Clients von nicht-loopback Origins erwartet werden.
  • controlUi.dangerouslyAllowHostHeaderOriginFallback: gefährlicher Modus, der Host-Header-Origin-Fallback für Deployments aktiviert, die absichtlich auf eine Host-Header-Origin-Richtlinie setzen.
  • remote.transport: ssh (Standard) oder direct (ws/wss). Für direct muss remote.url ws:// oder wss:// sein.
  • OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1: clientseitige Break-Glass-Überschreibung, die Klartext-ws:// zu vertrauenswürdigen privaten Netzwerk-IPs erlaubt; Standard bleibt loopback-only für Klartext.
  • gateway.remote.token / .password sind Anmeldedatenfelder des Remote-Clients. Sie konfigurieren Gateway-Authentifizierung nicht selbst.
  • gateway.push.apns.relay.baseUrl: Base-HTTPS-URL für das externe APNs-Relay, das offizielle/TestFlight-iOS-Builds verwenden, nachdem sie relaygestützte Registrierungen an das Gateway veröffentlicht haben. Diese URL muss mit der Relay-URL übereinstimmen, die in den iOS-Build kompiliert wurde.
  • gateway.push.apns.relay.timeoutMs: Timeout in Millisekunden für das Senden vom Gateway an das Relay. Standard ist 10000.
  • Relay-gestützte Registrierungen sind an eine bestimmte Gateway-Identität delegiert. Die gekoppelte iOS-App ruft gateway.identity.get ab, schließt diese Identität in die Relay-Registrierung ein und leitet eine registrierungsspezifische Sendeberechtigung an das Gateway weiter. Ein anderes Gateway kann diese gespeicherte Registrierung nicht wiederverwenden.
  • OPENCLAW_APNS_RELAY_BASE_URL / OPENCLAW_APNS_RELAY_TIMEOUT_MS: temporäre Env-Überschreibungen für die obige Relay-Konfiguration.
  • OPENCLAW_APNS_RELAY_ALLOW_HTTP=true: nur für Entwicklung gedachter Escape-Hatch für loopback-HTTP-Relay-URLs. Produktions-Relay-URLs sollten bei HTTPS bleiben.
  • gateway.channelHealthCheckMinutes: Intervall des Kanal-Gesundheitsmonitors in Minuten. Setzen Sie 0, um Neustarts durch den Gesundheitsmonitor global zu deaktivieren. Standard: 5.
  • gateway.channelStaleEventThresholdMinutes: Schwellenwert für veraltete Sockets in Minuten. Dieser Wert sollte größer oder gleich gateway.channelHealthCheckMinutes sein. Standard: 30.
  • gateway.channelMaxRestartsPerHour: maximale Anzahl an Neustarts durch den Gesundheitsmonitor pro Kanal/Konto innerhalb einer rollierenden Stunde. Standard: 10.
  • channels.<provider>.healthMonitor.enabled: kanalbezogenes Opt-out für Neustarts durch den Gesundheitsmonitor, während der globale Monitor aktiviert bleibt.
  • channels.<provider>.accounts.<accountId>.healthMonitor.enabled: kontoabhängige Überschreibung für Kanäle mit mehreren Konten. Wenn gesetzt, hat sie Vorrang vor der kanalbezogenen Überschreibung.
  • Lokale Gateway-Aufrufpfade können gateway.remote.* nur dann als Fallback verwenden, wenn gateway.auth.* nicht gesetzt ist.
  • Wenn gateway.auth.token / gateway.auth.password explizit über SecretRef konfiguriert und nicht auflösbar sind, schlägt die Auflösung fail-closed fehl (kein Remote-Fallback, der dies maskiert).
  • trustedProxies: Reverse-Proxy-IPs, die TLS terminieren oder weitergeleitete Client-Header injizieren. Listen Sie nur Proxys auf, die Sie kontrollieren. Loopback-Einträge sind weiterhin für Setups mit Proxy auf demselben Host/lokaler Erkennung gültig (zum Beispiel Tailscale Serve oder ein lokaler Reverse-Proxy), machen loopback-Requests jedoch nicht für gateway.auth.mode: "trusted-proxy" zulässig.
  • allowRealIpFallback: wenn true, akzeptiert das Gateway X-Real-IP, falls X-Forwarded-For fehlt. Standard false für Fail-Closed-Verhalten.
  • gateway.tools.deny: zusätzliche Tool-Namen, die für HTTP POST /tools/invoke blockiert werden (erweitert die Standard-Ablehnungsliste).
  • gateway.tools.allow: Tool-Namen aus der Standard-HTTP-Ablehnungsliste entfernen.

OpenAI-kompatible Endpunkte

  • Chat Completions: standardmäßig deaktiviert. Aktivieren mit gateway.http.endpoints.chatCompletions.enabled: true.
  • Responses API: gateway.http.endpoints.responses.enabled.
  • Härtung für URL-Eingaben bei Responses:
    • gateway.http.endpoints.responses.maxUrlParts
    • gateway.http.endpoints.responses.files.urlAllowlist
    • gateway.http.endpoints.responses.images.urlAllowlist Leere Erlaubnislisten werden wie nicht gesetzt behandelt; verwenden Sie gateway.http.endpoints.responses.files.allowUrl=false und/oder gateway.http.endpoints.responses.images.allowUrl=false, um das Abrufen von URLs zu deaktivieren.
  • Optionaler Header zur Härtung von Responses:
    • gateway.http.securityHeaders.strictTransportSecurity (nur für HTTPS-Origins setzen, die Sie kontrollieren; siehe Trusted Proxy Auth)

Isolation mehrerer Instanzen

Führen Sie mehrere Gateways auf einem Host mit eindeutigen Ports und Zustandsverzeichnissen aus:
OPENCLAW_CONFIG_PATH=~/.openclaw/a.json \
OPENCLAW_STATE_DIR=~/.openclaw-a \
openclaw gateway --port 19001
Komfort-Flags: --dev (verwendet ~/.openclaw-dev + Port 19001), --profile <name> (verwendet ~/.openclaw-<name>). Siehe Multiple Gateways.

gateway.tls

{
  gateway: {
    tls: {
      enabled: false,
      autoGenerate: false,
      certPath: "/etc/openclaw/tls/server.crt",
      keyPath: "/etc/openclaw/tls/server.key",
      caPath: "/etc/openclaw/tls/ca-bundle.crt",
    },
  },
}
  • enabled: aktiviert TLS-Terminierung am Gateway-Listener (HTTPS/WSS) (Standard: false).
  • autoGenerate: erzeugt automatisch ein lokales selbstsigniertes Zertifikat/Schlüsselpaar, wenn keine expliziten Dateien konfiguriert sind; nur für lokal/Entwicklung.
  • certPath: Dateisystempfad zur TLS-Zertifikatsdatei.
  • keyPath: Dateisystempfad zum privaten TLS-Schlüssel; mit eingeschränkten Berechtigungen schützen.
  • caPath: optionaler Pfad zu einem CA-Bundle für Client-Verifizierung oder benutzerdefinierte Vertrauenskette.

gateway.reload

{
  gateway: {
    reload: {
      mode: "hybrid", // off | restart | hot | hybrid
      debounceMs: 500,
      deferralTimeoutMs: 300000,
    },
  },
}
  • mode: steuert, wie Konfigurationsänderungen zur Laufzeit angewendet werden.
    • "off": Live-Bearbeitungen ignorieren; Änderungen erfordern einen expliziten Neustart.
    • "restart": Gateway-Prozess bei Konfigurationsänderungen immer neu starten.
    • "hot": Änderungen im Prozess anwenden, ohne neu zu starten.
    • "hybrid" (Standard): zuerst Hot-Reload versuchen; falls erforderlich auf Neustart zurückfallen.
  • debounceMs: Debounce-Fenster in ms, bevor Konfigurationsänderungen angewendet werden (nichtnegative Ganzzahl).
  • deferralTimeoutMs: maximale Zeit in ms, um auf laufende Operationen zu warten, bevor ein Neustart erzwungen wird (Standard: 300000 = 5 Minuten).

Hooks

{
  hooks: {
    enabled: true,
    token: "shared-secret",
    path: "/hooks",
    maxBodyBytes: 262144,
    defaultSessionKey: "hook:ingress",
    allowRequestSessionKey: false,
    allowedSessionKeyPrefixes: ["hook:"],
    allowedAgentIds: ["hooks", "main"],
    presets: ["gmail"],
    transformsDir: "~/.openclaw/hooks/transforms",
    mappings: [
      {
        match: { path: "gmail" },
        action: "agent",
        agentId: "hooks",
        wakeMode: "now",
        name: "Gmail",
        sessionKey: "hook:gmail:{{messages[0].id}}",
        messageTemplate: "From: {{messages[0].from}}\nSubject: {{messages[0].subject}}\n{{messages[0].snippet}}",
        deliver: true,
        channel: "last",
        model: "openai/gpt-5.4-mini",
      },
    ],
  },
}
Authentifizierung: Authorization: Bearer <token> oder x-openclaw-token: <token>. Hook-Token in Query-Strings werden abgelehnt. Validierungs- und Sicherheitshinweise:
  • hooks.enabled=true erfordert ein nicht leeres hooks.token.
  • hooks.token muss sich von gateway.auth.token unterscheiden; die Wiederverwendung des Gateway-Tokens wird abgelehnt.
  • hooks.path darf nicht / sein; verwenden Sie einen dedizierten Unterpfad wie /hooks.
  • Wenn hooks.allowRequestSessionKey=true, beschränken Sie hooks.allowedSessionKeyPrefixes (zum Beispiel ["hook:"]).
Endpunkte:
  • POST /hooks/wake{ text, mode?: "now"|"next-heartbeat" }
  • POST /hooks/agent{ message, name?, agentId?, sessionKey?, wakeMode?, deliver?, channel?, to?, model?, thinking?, timeoutSeconds? }
    • sessionKey aus dem Request-Payload wird nur akzeptiert, wenn hooks.allowRequestSessionKey=true (Standard: false).
  • POST /hooks/<name> → wird über hooks.mappings aufgelöst
  • match.path stimmt mit dem Unterpfad nach /hooks überein (z. B. /hooks/gmailgmail).
  • match.source stimmt mit einem Payload-Feld für generische Pfade überein.
  • Templates wie {{messages[0].subject}} lesen aus dem Payload.
  • transform kann auf ein JS-/TS-Modul zeigen, das eine Hook-Aktion zurückgibt.
    • transform.module muss ein relativer Pfad sein und innerhalb von hooks.transformsDir bleiben (absolute Pfade und Traversal werden abgelehnt).
  • agentId leitet an einen bestimmten Agenten weiter; unbekannte IDs fallen auf den Standard zurück.
  • allowedAgentIds: schränkt explizites Routing ein (* oder weggelassen = alle erlauben, [] = alle verweigern).
  • defaultSessionKey: optionaler fester Sitzungsschlüssel für Hook-Agent-Läufe ohne expliziten sessionKey.
  • allowRequestSessionKey: erlaubt Aufrufern von /hooks/agent, sessionKey zu setzen (Standard: false).
  • allowedSessionKeyPrefixes: optionale Erlaubnisliste für Präfixe expliziter sessionKey-Werte (Request + Mapping), z. B. ["hook:"].
  • deliver: true sendet die endgültige Antwort an einen Kanal; channel ist standardmäßig last.
  • model überschreibt das LLM für diesen Hook-Lauf (muss erlaubt sein, wenn ein Modellkatalog gesetzt ist).

Gmail-Integration

{
  hooks: {
    gmail: {
      account: "openclaw@gmail.com",
      topic: "projects/<project-id>/topics/gog-gmail-watch",
      subscription: "gog-gmail-watch-push",
      pushToken: "shared-push-token",
      hookUrl: "http://127.0.0.1:18789/hooks/gmail",
      includeBody: true,
      maxBytes: 20000,
      renewEveryMinutes: 720,
      serve: { bind: "127.0.0.1", port: 8788, path: "/" },
      tailscale: { mode: "funnel", path: "/gmail-pubsub" },
      model: "openrouter/meta-llama/llama-3.3-70b-instruct:free",
      thinking: "off",
    },
  },
}
  • Das Gateway startet gog gmail watch serve beim Booten automatisch, wenn es konfiguriert ist. Setzen Sie OPENCLAW_SKIP_GMAIL_WATCHER=1, um dies zu deaktivieren.
  • Führen Sie nicht zusätzlich zu dem Gateway ein separates gog gmail watch serve aus.

Canvas-Host

{
  canvasHost: {
    root: "~/.openclaw/workspace/canvas",
    liveReload: true,
    // enabled: false, // oder OPENCLAW_SKIP_CANVAS_HOST=1
  },
}
  • Stellt agentenbearbeitbares HTML/CSS/JS und A2UI über HTTP unter dem Gateway-Port bereit:
    • http://<gateway-host>:<gateway.port>/__openclaw__/canvas/
    • http://<gateway-host>:<gateway.port>/__openclaw__/a2ui/
  • Nur lokal: Behalten Sie gateway.bind: "loopback" bei (Standard).
  • Nicht-Loopback-Bindings: Canvas-Routen erfordern Gateway-Authentifizierung (Token/Passwort/trusted-proxy), genau wie andere HTTP-Oberflächen des Gateways.
  • Node-WebViews senden typischerweise keine Authentifizierungs-Header; nachdem ein Node gekoppelt und verbunden ist, kündigt das Gateway nodebezogene Capability-URLs für den Zugriff auf Canvas/A2UI an.
  • Capability-URLs sind an die aktive Node-WS-Sitzung gebunden und laufen schnell ab. Ein IP-basierter Fallback wird nicht verwendet.
  • Fügt bereitgestelltem HTML einen Live-Reload-Client hinzu.
  • Erstellt automatisch eine Starter-index.html, wenn leer.
  • Stellt A2UI auch unter /__openclaw__/a2ui/ bereit.
  • Änderungen erfordern einen Gateway-Neustart.
  • Deaktivieren Sie Live-Reload bei großen Verzeichnissen oder EMFILE-Fehlern.

Discovery

mDNS (Bonjour)

{
  discovery: {
    mdns: {
      mode: "minimal", // minimal | full | off
    },
  },
}
  • minimal (Standard): cliPath + sshPort aus TXT-Records weglassen.
  • full: cliPath + sshPort einschließen.
  • Der Hostname ist standardmäßig openclaw. Überschreiben mit OPENCLAW_MDNS_HOSTNAME.

Wide-Area (DNS-SD)

{
  discovery: {
    wideArea: { enabled: true },
  },
}
Schreibt eine Unicast-DNS-SD-Zone unter ~/.openclaw/dns/. Für netzwerkübergreifende Discovery mit einem DNS-Server (CoreDNS empfohlen) + Tailscale Split DNS kombinieren. Setup: openclaw dns setup --apply.

Umgebung

env (inline Env-Variablen)

{
  env: {
    OPENROUTER_API_KEY: "sk-or-...",
    vars: {
      GROQ_API_KEY: "gsk-...",
    },
    shellEnv: {
      enabled: true,
      timeoutMs: 15000,
    },
  },
}
  • Inline-Env-Variablen werden nur angewendet, wenn der Prozess-Env der Schlüssel fehlt.
  • .env-Dateien: CWD .env + ~/.openclaw/.env (keine von beiden überschreibt bestehende Variablen).
  • shellEnv: importiert fehlende erwartete Schlüssel aus Ihrem Login-Shell-Profil.
  • Die vollständige Priorität finden Sie unter Environment.

Env-Variablen-Substitution

Referenzieren Sie Env-Variablen in jeder Konfigurationszeichenfolge mit ${VAR_NAME}:
{
  gateway: {
    auth: { token: "${OPENCLAW_GATEWAY_TOKEN}" },
  },
}
  • Es werden nur Großbuchstabennamen gematcht: [A-Z_][A-Z0-9_]*.
  • Fehlende/leere Variablen werfen beim Laden der Konfiguration einen Fehler.
  • Mit $${VAR} für ein wörtliches ${VAR} escapen.
  • Funktioniert mit $include.

Secrets

SecretRefs sind additiv: Klartextwerte funktionieren weiterhin.

SecretRef

Verwenden Sie eine Objektform:
{ source: "env" | "file" | "exec", provider: "default", id: "..." }
Validierung:
  • Muster für provider: ^[a-z][a-z0-9_-]{0,63}$
  • Muster für source: "env" bei id: ^[A-Z][A-Z0-9_]{0,127}$
  • source: "file" bei id: absoluter JSON-Zeiger (zum Beispiel "/providers/openai/apiKey")
  • Muster für source: "exec" bei id: ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,255}$
  • source: "exec"-IDs dürfen keine slashgetrennten Pfadsegmente . oder .. enthalten (zum Beispiel wird a/../b abgelehnt)

Unterstützte Oberfläche für Anmeldedaten

  • Kanonische Matrix: SecretRef Credential Surface
  • secrets apply zielt auf unterstützte Anmeldedatenpfade in openclaw.json.
  • Referenzen in auth-profiles.json sind in der Laufzeitauflösung und Audit-Abdeckung enthalten.

Konfiguration von Secret-Providern

{
  secrets: {
    providers: {
      default: { source: "env" }, // optional expliziter Env-Provider
      filemain: {
        source: "file",
        path: "~/.openclaw/secrets.json",
        mode: "json",
        timeoutMs: 5000,
      },
      vault: {
        source: "exec",
        command: "/usr/local/bin/openclaw-vault-resolver",
        passEnv: ["PATH", "VAULT_ADDR"],
      },
    },
    defaults: {
      env: "default",
      file: "filemain",
      exec: "vault",
    },
  },
}
Hinweise:
  • Der Provider file unterstützt mode: "json" und mode: "singleValue" (id muss im Modus singleValue "value" sein).
  • Der Provider exec erfordert einen absoluten command-Pfad und verwendet Protokoll-Payloads über stdin/stdout.
  • Standardmäßig werden symbolische Linkpfade für Befehle abgelehnt. Setzen Sie allowSymlinkCommand: true, um Symlink-Pfade zu erlauben, während der aufgelöste Zielpfad validiert wird.
  • Wenn trustedDirs konfiguriert ist, gilt die Trusted-Dir-Prüfung für den aufgelösten Zielpfad.
  • Die Child-Umgebung von exec ist standardmäßig minimal; geben Sie erforderliche Variablen explizit mit passEnv weiter.
  • SecretRefs werden zur Aktivierungszeit in einen In-Memory-Snapshot aufgelöst; Request-Pfade lesen danach nur noch aus diesem Snapshot.
  • Active-Surface-Filtering gilt während der Aktivierung: Nicht aufgelöste Referenzen auf aktiven Oberflächen lassen Start/Reload fehlschlagen, während inaktive Oberflächen mit Diagnosen übersprungen werden.

Auth-Speicher

{
  auth: {
    profiles: {
      "anthropic:default": { provider: "anthropic", mode: "api_key" },
      "anthropic:work": { provider: "anthropic", mode: "api_key" },
      "openai-codex:personal": { provider: "openai-codex", mode: "oauth" },
    },
    order: {
      anthropic: ["anthropic:default", "anthropic:work"],
      "openai-codex": ["openai-codex:personal"],
    },
  },
}
  • Profile pro Agent werden unter <agentDir>/auth-profiles.json gespeichert.
  • auth-profiles.json unterstützt Referenzen auf Wertebene (keyRef für api_key, tokenRef für token) für statische Anmeldedatenmodi.
  • Profile im OAuth-Modus (auth.profiles.<id>.mode = "oauth") unterstützen keine SecretRef-gestützten Anmeldedaten für Auth-Profile.
  • Statische Laufzeit-Anmeldedaten stammen aus aufgelösten In-Memory-Snapshots; alte statische Einträge in auth.json werden beim Auffinden bereinigt.
  • Legacy-OAuth-Importe aus ~/.openclaw/credentials/oauth.json.
  • Siehe OAuth.
  • Secrets-Laufzeitverhalten und Tooling für audit/configure/apply: Secrets Management.

auth.cooldowns

{
  auth: {
    cooldowns: {
      billingBackoffHours: 5,
      billingBackoffHoursByProvider: { anthropic: 3, openai: 8 },
      billingMaxHours: 24,
      authPermanentBackoffMinutes: 10,
      authPermanentMaxMinutes: 60,
      failureWindowHours: 24,
      overloadedProfileRotations: 1,
      overloadedBackoffMs: 0,
      rateLimitedProfileRotations: 1,
    },
  },
}
  • billingBackoffHours: Basis-Backoff in Stunden, wenn ein Profil aufgrund echter Abrechnungs-/ungenügender-Guthaben-Fehler fehlschlägt (Standard: 5). Expliziter Abrechnungstext kann hier auch bei Antworten 401/403 landen, aber providerbezogene Textmatcher bleiben auf den Provider beschränkt, zu dem sie gehören (zum Beispiel OpenRouter Key limit exceeded). Wiederholbare 402-Meldungen zu Nutzungsfenstern oder Ausgabelimits von Organisation/Workspace bleiben stattdessen im Pfad rate_limit.
  • billingBackoffHoursByProvider: optionale providerbezogene Überschreibungen für Backoff-Stunden bei Abrechnungsfehlern.
  • billingMaxHours: Obergrenze in Stunden für exponentielles Wachstum des Backoffs bei Abrechnungsfehlern (Standard: 24).
  • authPermanentBackoffMinutes: Basis-Backoff in Minuten für hochzuverlässige Fehler auth_permanent (Standard: 10).
  • authPermanentMaxMinutes: Obergrenze in Minuten für das Wachstum des Backoffs von auth_permanent (Standard: 60).
  • failureWindowHours: rollierendes Fenster in Stunden, das für Backoff-Zähler verwendet wird (Standard: 24).
  • overloadedProfileRotations: maximale Rotationen von Auth-Profilen desselben Providers bei Überlastungsfehlern, bevor auf Modell-Fallback umgeschaltet wird (Standard: 1). Formen von Provider-Auslastung wie ModelNotReadyException landen hier.
  • overloadedBackoffMs: feste Verzögerung vor dem erneuten Versuch einer Rotation bei einem überlasteten Provider/Profil (Standard: 0).
  • rateLimitedProfileRotations: maximale Rotationen von Auth-Profilen desselben Providers bei Rate-Limit-Fehlern, bevor auf Modell-Fallback umgeschaltet wird (Standard: 1). Dieser Rate-Limit-Bucket enthält providergeformte Texte wie Too many concurrent requests, ThrottlingException, concurrency limit reached, workers_ai ... quota limit exceeded und resource exhausted.

Logging

{
  logging: {
    level: "info",
    file: "/tmp/openclaw/openclaw.log",
    consoleLevel: "info",
    consoleStyle: "pretty", // pretty | compact | json
    redactSensitive: "tools", // off | tools
    redactPatterns: ["\\bTOKEN\\b\\s*[=:]\\s*([\"']?)([^\\s\"']+)\\1"],
  },
}
  • Standard-Logdatei: /tmp/openclaw/openclaw-YYYY-MM-DD.log.
  • Setzen Sie logging.file für einen stabilen Pfad.
  • consoleLevel wird mit --verbose auf debug angehoben.
  • maxFileBytes: maximale Größe der Logdatei in Byte, bevor Schreibvorgänge unterdrückt werden (positive Ganzzahl; Standard: 524288000 = 500 MB). Verwenden Sie für Produktions-Deployments externe Logrotation.

Diagnose

{
  diagnostics: {
    enabled: true,
    flags: ["telegram.*"],
    stuckSessionWarnMs: 30000,

    otel: {
      enabled: false,
      endpoint: "https://otel-collector.example.com:4318",
      protocol: "http/protobuf", // http/protobuf | grpc
      headers: { "x-tenant-id": "my-org" },
      serviceName: "openclaw-gateway",
      traces: true,
      metrics: true,
      logs: false,
      sampleRate: 1.0,
      flushIntervalMs: 5000,
    },

    cacheTrace: {
      enabled: false,
      filePath: "~/.openclaw/logs/cache-trace.jsonl",
      includeMessages: true,
      includePrompt: true,
      includeSystem: true,
    },
  },
}
  • enabled: globaler Schalter für Instrumentierungsausgaben (Standard: true).
  • flags: Array von Flag-Zeichenfolgen zur Aktivierung gezielter Logausgaben (unterstützt Wildcards wie "telegram.*" oder "*").
  • stuckSessionWarnMs: Altersschwellenwert in ms für Warnungen zu hängenden Sitzungen, solange eine Sitzung im Verarbeitungszustand bleibt.
  • otel.enabled: aktiviert die OpenTelemetry-Exportpipeline (Standard: false).
  • otel.endpoint: Collector-URL für den OTel-Export.
  • otel.protocol: "http/protobuf" (Standard) oder "grpc".
  • otel.headers: zusätzliche HTTP-/gRPC-Metadaten-Header, die mit OTel-Export-Requests gesendet werden.
  • otel.serviceName: Dienstname für Resource-Attribute.
  • otel.traces / otel.metrics / otel.logs: Trace-, Metrics- oder Log-Export aktivieren.
  • otel.sampleRate: Trace-Sampling-Rate 01.
  • otel.flushIntervalMs: Intervall in ms für periodisches Flushen von Telemetriedaten.
  • cacheTrace.enabled: Cache-Trace-Snapshots für eingebettete Läufe protokollieren (Standard: false).
  • cacheTrace.filePath: Ausgabepfad für Cache-Trace-JSONL (Standard: $OPENCLAW_STATE_DIR/logs/cache-trace.jsonl).
  • cacheTrace.includeMessages / includePrompt / includeSystem: steuern, was in der Cache-Trace-Ausgabe enthalten ist (alle standardmäßig: true).

Update

{
  update: {
    channel: "stable", // stable | beta | dev
    checkOnStart: true,

    auto: {
      enabled: false,
      stableDelayHours: 6,
      stableJitterHours: 12,
      betaCheckIntervalHours: 1,
    },
  },
}
  • channel: Release-Kanal für npm-/Git-Installationen — "stable", "beta" oder "dev".
  • checkOnStart: beim Start des Gateways nach npm-Updates suchen (Standard: true).
  • auto.enabled: Hintergrund-Auto-Update für Paketinstallationen aktivieren (Standard: false).
  • auto.stableDelayHours: minimale Verzögerung in Stunden vor automatischer Anwendung im Stable-Kanal (Standard: 6; max: 168).
  • auto.stableJitterHours: zusätzliches Rollout-Streuungsfenster in Stunden für den Stable-Kanal (Standard: 12; max: 168).
  • auto.betaCheckIntervalHours: wie oft Prüfungen für den Beta-Kanal in Stunden ausgeführt werden (Standard: 1; max: 24).

ACP

{
  acp: {
    enabled: false,
    dispatch: { enabled: true },
    backend: "acpx",
    defaultAgent: "main",
    allowedAgents: ["main", "ops"],
    maxConcurrentSessions: 10,

    stream: {
      coalesceIdleMs: 50,
      maxChunkChars: 1000,
      repeatSuppression: true,
      deliveryMode: "live", // live | final_only
      hiddenBoundarySeparator: "paragraph", // none | space | newline | paragraph
      maxOutputChars: 50000,
      maxSessionUpdateChars: 500,
    },

    runtime: {
      ttlMinutes: 30,
    },
  },
}
  • enabled: globales ACP-Feature-Gate (Standard: false).
  • dispatch.enabled: unabhängiges Gate für das Dispatching von ACP-Sitzungsturns (Standard: true). Setzen Sie false, um ACP-Befehle verfügbar zu lassen, aber die Ausführung zu blockieren.
  • backend: Standard-ID des ACP-Laufzeit-Backends (muss mit einem registrierten ACP-Laufzeit-Plugin übereinstimmen).
  • defaultAgent: Fallback-Ziel-Agent-ID für ACP, wenn Spawns kein explizites Ziel angeben.
  • allowedAgents: Erlaubnisliste von Agent-IDs, die für ACP-Laufzeitsitzungen zulässig sind; leer bedeutet keine zusätzliche Einschränkung.
  • maxConcurrentSessions: maximale Anzahl gleichzeitig aktiver ACP-Sitzungen.
  • stream.coalesceIdleMs: Idle-Flush-Fenster in ms für gestreamten Text.
  • stream.maxChunkChars: maximale Chunk-Größe vor dem Aufteilen der gestreamten Blockprojektion.
  • stream.repeatSuppression: unterdrückt wiederholte Status-/Tool-Zeilen pro Turn (Standard: true).
  • stream.deliveryMode: "live" streamt inkrementell; "final_only" puffert bis zu terminalen Turn-Ereignissen.
  • stream.hiddenBoundarySeparator: Trennzeichen vor sichtbarem Text nach verborgenen Tool-Ereignissen (Standard: "paragraph").
  • stream.maxOutputChars: maximale Zeichenanzahl der Assistant-Ausgabe, die pro ACP-Turn projiziert wird.
  • stream.maxSessionUpdateChars: maximale Zeichenanzahl für projizierte ACP-Status-/Update-Zeilen.
  • stream.tagVisibility: Zuordnung von Tag-Namen zu booleschen Sichtbarkeitsüberschreibungen für gestreamte Ereignisse.
  • runtime.ttlMinutes: Idle-TTL in Minuten für ACP-Sitzungs-Worker, bevor sie für die Bereinigung infrage kommen.
  • runtime.installCommand: optionaler Installationsbefehl, der beim Bootstrap einer ACP-Laufzeitumgebung ausgeführt wird.

CLI

{
  cli: {
    banner: {
      taglineMode: "off", // random | default | off
    },
  },
}
  • cli.banner.taglineMode steuert den Stil des Banner-Slogans:
    • "random" (Standard): rotierende lustige/saisonale Slogans.
    • "default": fester neutraler Slogan (All your chats, one OpenClaw.).
    • "off": kein Slogantext (Banner-Titel/Version werden weiterhin angezeigt).
  • Um das gesamte Banner auszublenden (nicht nur Slogans), setzen Sie die Env-Variable OPENCLAW_HIDE_BANNER=1.

Wizard

Metadaten, die von geführten CLI-Setup-Abläufen geschrieben werden (onboard, configure, doctor):
{
  wizard: {
    lastRunAt: "2026-01-01T00:00:00.000Z",
    lastRunVersion: "2026.1.4",
    lastRunCommit: "abc1234",
    lastRunCommand: "configure",
    lastRunMode: "local",
  },
}

Identity

Siehe Identity-Felder in agents.list unter Agent-Standardeinstellungen.

Bridge (Legacy, entfernt)

Aktuelle Builds enthalten die TCP-Bridge nicht mehr. Nodes verbinden sich über den Gateway-WebSocket. Schlüssel bridge.* sind nicht mehr Teil des Konfigurationsschemas (die Validierung schlägt fehl, bis sie entfernt werden; openclaw doctor --fix kann unbekannte Schlüssel entfernen).
{
  "bridge": {
    "enabled": true,
    "port": 18790,
    "bind": "tailnet",
    "tls": {
      "enabled": true,
      "autoGenerate": true
    }
  }
}

Cron

{
  cron: {
    enabled: true,
    maxConcurrentRuns: 2,
    webhook: "https://example.invalid/legacy", // veralteter Fallback für gespeicherte Jobs mit notify:true
    webhookToken: "replace-with-dedicated-token", // optionaler Bearer-Token für ausgehende Webhook-Authentifizierung
    sessionRetention: "24h", // Dauerzeichenfolge oder false
    runLog: {
      maxBytes: "2mb", // Standard 2_000_000 Byte
      keepLines: 2000, // Standard 2000
    },
  },
}
  • sessionRetention: wie lange abgeschlossene isolierte Cron-Laufsitzungen aufbewahrt werden, bevor sie aus sessions.json entfernt werden. Steuert auch die Bereinigung archivierter gelöschter Cron-Transkripte. Standard: 24h; setzen Sie false, um zu deaktivieren.
  • runLog.maxBytes: maximale Größe pro Run-Log-Datei (cron/runs/<jobId>.jsonl) vor dem Bereinigen. Standard: 2_000_000 Byte.
  • runLog.keepLines: neueste Zeilen, die beibehalten werden, wenn die Bereinigung des Run-Logs ausgelöst wird. Standard: 2000.
  • webhookToken: Bearer-Token, der für die Cron-Webhook-POST-Zustellung verwendet wird (delivery.mode = "webhook"); wenn weggelassen, wird kein Authentifizierungs-Header gesendet.
  • webhook: veraltete Legacy-Fallback-Webhook-URL (http/https), die nur für gespeicherte Jobs verwendet wird, die noch notify: true haben.

cron.retry

{
  cron: {
    retry: {
      maxAttempts: 3,
      backoffMs: [30000, 60000, 300000],
      retryOn: ["rate_limit", "overloaded", "network", "timeout", "server_error"],
    },
  },
}
  • maxAttempts: maximale Wiederholungen für einmalige Jobs bei transienten Fehlern (Standard: 3; Bereich: 010).
  • backoffMs: Array von Backoff-Verzögerungen in ms für jeden Wiederholungsversuch (Standard: [30000, 60000, 300000]; 1–10 Einträge).
  • retryOn: Fehlertypen, die Wiederholungen auslösen — "rate_limit", "overloaded", "network", "timeout", "server_error". Weglassen, um alle transienten Typen zu wiederholen.
Gilt nur für einmalige Cron-Jobs. Wiederkehrende Jobs verwenden eine separate Fehlerbehandlung.

cron.failureAlert

{
  cron: {
    failureAlert: {
      enabled: false,
      after: 3,
      cooldownMs: 3600000,
      mode: "announce",
      accountId: "main",
    },
  },
}
  • enabled: Fehlerwarnungen für Cron-Jobs aktivieren (Standard: false).
  • after: aufeinanderfolgende Fehler, bevor eine Warnung ausgelöst wird (positive Ganzzahl, min: 1).
  • cooldownMs: minimale Millisekunden zwischen wiederholten Warnungen für denselben Job (nichtnegative Ganzzahl).
  • mode: Zustellmodus — "announce" sendet über eine Kanalnachricht; "webhook" postet an den konfigurierten Webhook.
  • accountId: optionale Konto- oder Kanal-ID, um die Warnzustellung einzugrenzen.

cron.failureDestination

{
  cron: {
    failureDestination: {
      mode: "announce",
      channel: "last",
      to: "channel:C1234567890",
      accountId: "main",
    },
  },
}
  • Standardziel für Benachrichtigungen über Cron-Fehler für alle Jobs.
  • mode: "announce" oder "webhook"; standardmäßig "announce", wenn genügend Zieldaten vorhanden sind.
  • channel: Kanalüberschreibung für Announce-Zustellung. "last" verwendet den zuletzt bekannten Zustellungskanal erneut.
  • to: explizites Announce-Ziel oder Webhook-URL. Erforderlich für den Webhook-Modus.
  • accountId: optionale Kontoüberschreibung für die Zustellung.
  • delivery.failureDestination pro Job überschreibt diesen globalen Standard.
  • Wenn weder global noch pro Job ein Fehlerziel gesetzt ist, fallen Jobs, die bereits per announce zustellen, bei Fehlern auf dieses primäre Announce-Ziel zurück.
  • delivery.failureDestination wird nur für Jobs mit sessionTarget="isolated" unterstützt, außer wenn der primäre delivery.mode des Jobs "webhook" ist.
Siehe Cron Jobs. Isolierte Cron-Ausführungen werden als Hintergrundaufgaben verfolgt.

Template-Variablen für Medienmodelle

Template-Platzhalter, die in tools.media.models[].args erweitert werden:
VariableBeschreibung
{{Body}}Vollständiger eingehender Nachrichtentext
{{RawBody}}Rohtext (ohne Verlaufs-/Absender-Wrapper)
{{BodyStripped}}Text mit entfernten Gruppenerwähnungen
{{From}}Absenderkennung
{{To}}Zielkennung
{{MessageSid}}Kanal-Nachrichten-ID
{{SessionId}}Aktuelle Sitzungs-UUID
{{IsNewSession}}"true", wenn eine neue Sitzung erstellt wurde
{{MediaUrl}}Pseudo-URL eingehender Medien
{{MediaPath}}Lokaler Medienpfad
{{MediaType}}Medientyp (Bild/Audio/Dokument/…)
{{Transcript}}Audiotranskript
{{Prompt}}Aufgelöster Medien-Prompt für CLI-Einträge
{{MaxChars}}Aufgelöste maximale Ausgabenzeichen für CLI-Einträge
{{ChatType}}"direct" oder "group"
{{GroupSubject}}Gruppenbetreff (nach bestem Bemühen)
{{GroupMembers}}Vorschau auf Gruppenmitglieder (nach bestem Bemühen)
{{SenderName}}Anzeigename des Absenders (nach bestem Bemühen)
{{SenderE164}}Telefonnummer des Absenders (nach bestem Bemühen)
{{Provider}}Provider-Hinweis (whatsapp, telegram, discord usw.)

Konfigurations-Includes ($include)

Konfiguration auf mehrere Dateien aufteilen:
// ~/.openclaw/openclaw.json
{
  gateway: { port: 18789 },
  agents: { $include: "./agents.json5" },
  broadcast: {
    $include: ["./clients/mueller.json5", "./clients/schmidt.json5"],
  },
}
Merge-Verhalten:
  • Einzelne Datei: ersetzt das enthaltende Objekt.
  • Array von Dateien: wird in Reihenfolge tief zusammengeführt (spätere überschreiben frühere).
  • Gleichrangige Schlüssel: werden nach Includes zusammengeführt (überschreiben inkludierte Werte).
  • Verschachtelte Includes: bis zu 10 Ebenen tief.
  • Pfade: werden relativ zur inkludierenden Datei aufgelöst, müssen aber innerhalb des Konfigurationsverzeichnisses der obersten Ebene bleiben (dirname von openclaw.json). Absolute Formen und ../ sind nur erlaubt, wenn sie weiterhin innerhalb dieser Grenze aufgelöst werden.
  • Fehler: klare Meldungen für fehlende Dateien, Parse-Fehler und zirkuläre Includes.

Verwandt: Konfiguration · Konfigurationsbeispiele · Doctor