Vai al contenuto principale

Riferimento della configurazione

Riferimento della configurazione principale per ~/.openclaw/openclaw.json. Per una panoramica orientata alle attività, vedi Configuration. Questa pagina copre le principali superfici di configurazione di OpenClaw e rimanda ad altre pagine quando un sottosistema ha un proprio riferimento più approfondito. Non cerca di includere in linea ogni catalogo di comandi posseduto da canali/plugin o ogni impostazione avanzata di memoria/QMD in un’unica pagina. Verità del codice:
  • openclaw config schema stampa lo Schema JSON live usato per la convalida e per la Control UI, con i metadati bundled/plugin/canale uniti quando disponibili
  • config.schema.lookup restituisce un nodo dello schema limitato a un percorso per gli strumenti di analisi dettagliata
  • pnpm config:docs:check / pnpm config:docs:gen convalidano l’hash di baseline della documentazione di configurazione rispetto alla superficie dello schema corrente
Riferimenti dedicati approfonditi:
  • Riferimento della configurazione della memoria per agents.defaults.memorySearch.*, memory.qmd.*, memory.citations e la configurazione dreaming sotto plugins.entries.memory-core.config.dreaming
  • Comandi slash per il catalogo corrente dei comandi integrati + bundled
  • pagine del canale/plugin proprietario per le superfici di comando specifiche del canale
Il formato di configurazione è JSON5 (commenti + virgole finali consentiti). Tutti i campi sono facoltativi: OpenClaw usa valori predefiniti sicuri quando vengono omessi.

Canali

Ogni canale si avvia automaticamente quando esiste la sua sezione di configurazione (a meno che enabled: false).

Accesso DM e gruppi

Tutti i canali supportano criteri DM e criteri per i gruppi:
Criterio DMComportamento
pairing (default)I mittenti sconosciuti ricevono un codice di associazione monouso; il proprietario deve approvare
allowlistSolo i mittenti in allowFrom (o nell’archivio allow associato)
openConsenti tutti i DM in ingresso (richiede allowFrom: ["*"])
disabledIgnora tutti i DM in ingresso
Criterio gruppoComportamento
allowlist (default)Solo i gruppi che corrispondono alla allowlist configurata
openIgnora le allowlist dei gruppi (la limitazione tramite menzione si applica comunque)
disabledBlocca tutti i messaggi di gruppo/stanza
channels.defaults.groupPolicy imposta il valore predefinito quando groupPolicy di un provider non è impostato. I codici di associazione scadono dopo 1 ora. Le richieste DM di associazione in sospeso sono limitate a 3 per canale. Se un blocco provider manca completamente (channels.<provider> assente), il criterio gruppo a runtime torna a allowlist (fail-closed) con un avviso all’avvio.

Override del modello per canale

Usa channels.modelByChannel per fissare ID di canali specifici a un modello. I valori accettano provider/model o alias di modello configurati. La mappatura del canale si applica quando una sessione non ha già un override del modello (ad esempio impostato tramite /model).
{
  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",
      },
    },
  },
}

Valori predefiniti dei canali e heartbeat

Usa channels.defaults per il comportamento condiviso di criteri gruppo e heartbeat tra i provider:
{
  channels: {
    defaults: {
      groupPolicy: "allowlist", // open | allowlist | disabled
      contextVisibility: "all", // all | allowlist | allowlist_quote
      heartbeat: {
        showOk: false,
        showAlerts: true,
        useIndicator: true,
      },
    },
  },
}
  • channels.defaults.groupPolicy: criterio gruppo di fallback quando groupPolicy a livello provider non è impostato.
  • channels.defaults.contextVisibility: modalità predefinita di visibilità del contesto supplementare per tutti i canali. Valori: all (predefinito, include tutto il contesto citato/thread/cronologia), allowlist (include solo il contesto da mittenti presenti nella allowlist), allowlist_quote (come allowlist ma mantiene il contesto esplicito di citazione/risposta). Override per canale: channels.<channel>.contextVisibility.
  • channels.defaults.heartbeat.showOk: include gli stati dei canali integri nell’output heartbeat.
  • channels.defaults.heartbeat.showAlerts: include gli stati degradati/di errore nell’output heartbeat.
  • channels.defaults.heartbeat.useIndicator: mostra un output heartbeat compatto in stile indicatore.

WhatsApp

WhatsApp viene eseguito tramite il canale web del gateway (Baileys Web). Si avvia automaticamente quando esiste una sessione collegata.
{
  channels: {
    whatsapp: {
      dmPolicy: "pairing", // pairing | allowlist | open | disabled
      allowFrom: ["+15555550123", "+447700900123"],
      textChunkLimit: 4000,
      chunkMode: "length", // length | newline
      mediaMaxMb: 50,
      sendReadReceipts: true, // blue ticks (false in self-chat mode)
      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",
        },
      },
    },
  },
}
  • I comandi in uscita usano per impostazione predefinita l’account default se presente; altrimenti il primo ID account configurato (ordinato).
  • L’opzione facoltativa channels.whatsapp.defaultAccount sovrascrive quella selezione predefinita dell’account di fallback quando corrisponde a un ID account configurato.
  • La directory di autenticazione Baileys legacy a singolo account viene migrata da openclaw doctor in whatsapp/default.
  • Override per account: 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: "Keep answers brief.",
          topics: {
            "99": {
              requireMention: false,
              skills: ["search"],
              systemPrompt: "Stay on topic.",
            },
          },
        },
      },
      customCommands: [
        { command: "backup", description: "Git backup" },
        { command: "generate", description: "Create an image" },
      ],
      historyLimit: 50,
      replyToMode: "first", // off | first | all | batched
      linkPreview: true,
      streaming: "partial", // off | partial | block | progress (default: off; opt in explicitly to avoid preview-edit rate limits)
      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",
    },
  },
}
  • Token del bot: channels.telegram.botToken oppure channels.telegram.tokenFile (solo file regolari; i symlink vengono rifiutati), con TELEGRAM_BOT_TOKEN come fallback per l’account predefinito.
  • L’opzione facoltativa channels.telegram.defaultAccount sovrascrive la selezione dell’account predefinito quando corrisponde a un ID account configurato.
  • Nelle configurazioni multi-account (2+ ID account), imposta un valore predefinito esplicito (channels.telegram.defaultAccount oppure channels.telegram.accounts.default) per evitare il routing di fallback; openclaw doctor avvisa quando questo manca o non è valido.
  • configWrites: false blocca le scritture di configurazione avviate da Telegram (migrazioni ID supergruppo, /config set|unset).
  • Le voci bindings[] di primo livello con type: "acp" configurano binding ACP persistenti per gli argomenti del forum (usa il formato canonico chatId:topic:topicId in match.peer.id). La semantica dei campi è condivisa in ACP Agents.
  • Le anteprime di stream Telegram usano sendMessage + editMessageText (funziona nelle chat dirette e di gruppo).
  • Criterio di retry: vedi Retry policy.

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: "Short answers only.",
            },
          },
        },
      },
      historyLimit: 20,
      textChunkLimit: 2000,
      chunkMode: "length", // length | newline
      streaming: "off", // off | partial | block | progress (progress maps to partial on Discord)
      maxLinesPerMessage: 17,
      ui: {
        components: {
          accentColor: "#5865F2",
        },
      },
      threadBindings: {
        enabled: true,
        idleHours: 24,
        maxAgeHours: 0,
        spawnSubagentSessions: false, // opt-in for 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, con DISCORD_BOT_TOKEN come fallback per l’account predefinito.
  • Le chiamate dirette in uscita che forniscono un token Discord esplicito usano quel token per la chiamata; le impostazioni di retry/criterio dell’account provengono comunque dall’account selezionato nello snapshot runtime attivo.
  • L’opzione facoltativa channels.discord.defaultAccount sovrascrive la selezione dell’account predefinito quando corrisponde a un ID account configurato.
  • Usa user:<id> (DM) o channel:<id> (canale guild) per i target di consegna; gli ID numerici senza prefisso vengono rifiutati.
  • Gli slug delle guild sono in minuscolo con gli spazi sostituiti da -; le chiavi dei canali usano il nome in formato slug (senza #). Preferisci gli ID delle guild.
  • I messaggi creati dal bot vengono ignorati per impostazione predefinita. allowBots: true li abilita; usa allowBots: "mentions" per accettare solo i messaggi dei bot che menzionano il bot (i propri messaggi restano comunque filtrati).
  • channels.discord.guilds.<id>.ignoreOtherMentions (e gli override a livello canale) elimina i messaggi che menzionano un altro utente o ruolo ma non il bot (escludendo @everyone/@here).
  • maxLinesPerMessage (predefinito 17) divide i messaggi alti anche quando restano sotto 2000 caratteri.
  • channels.discord.threadBindings controlla il routing vincolato ai thread Discord:
    • enabled: override Discord per le funzionalità di sessione vincolate ai thread (/focus, /unfocus, /agents, /session idle, /session max-age e consegna/routing associati)
    • idleHours: override Discord per il disaccoppiamento automatico per inattività in ore (0 disabilita)
    • maxAgeHours: override Discord per l’età massima rigida in ore (0 disabilita)
    • spawnSubagentSessions: interruttore opt-in per la creazione/associazione automatica dei thread di sessions_spawn({ thread: true })
  • Le voci bindings[] di primo livello con type: "acp" configurano binding ACP persistenti per canali e thread (usa l’id del canale/thread in match.peer.id). La semantica dei campi è condivisa in ACP Agents.
  • channels.discord.ui.components.accentColor imposta il colore di accento per i contenitori Discord components v2.
  • channels.discord.voice abilita le conversazioni nei canali vocali Discord e gli override facoltativi di auto-join + TTS.
  • channels.discord.voice.daveEncryption e channels.discord.voice.decryptionFailureTolerance vengono passati a @discordjs/voice come opzioni DAVE (true e 24 per impostazione predefinita).
  • OpenClaw tenta inoltre il recupero della ricezione vocale uscendo e rientrando in una sessione vocale dopo ripetuti errori di decrittazione.
  • channels.discord.streaming è la chiave canonica della modalità di stream. I valori legacy streamMode e booleani streaming vengono migrati automaticamente.
  • channels.discord.autoPresence mappa la disponibilità runtime alla presenza del bot (healthy => online, degraded => idle, exhausted => dnd) e consente override facoltativi del testo di stato.
  • channels.discord.dangerouslyAllowNameMatching riabilita la corrispondenza per nome/tag modificabile (modalità di compatibilità break-glass).
  • channels.discord.execApprovals: consegna nativa Discord delle approvazioni exec e autorizzazione degli approvatori.
    • enabled: true, false o "auto" (predefinito). In modalità auto, le approvazioni exec si attivano quando gli approvatori possono essere risolti da approvers o commands.ownerAllowFrom.
    • approvers: ID utente Discord autorizzati ad approvare le richieste exec. Se omesso, usa commands.ownerAllowFrom come fallback.
    • agentFilter: allowlist facoltativa di ID agente. Omettila per inoltrare le approvazioni per tutti gli agenti.
    • sessionFilter: pattern facoltativi di chiavi sessione (sottostringa o regex).
    • target: dove inviare i prompt di approvazione. "dm" (predefinito) li invia ai DM degli approvatori, "channel" li invia al canale di origine, "both" li invia a entrambi. Quando il target include "channel", i pulsanti possono essere usati solo dagli approvatori risolti.
    • cleanupAfterResolve: quando true, elimina i DM di approvazione dopo approvazione, rifiuto o timeout.
Modalità di notifica delle reazioni: off (nessuna), own (messaggi del bot, predefinita), all (tutti i messaggi), allowlist (da guilds.<id>.users su tutti i messaggi).

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,
    },
  },
}
  • JSON dell’account di servizio: inline (serviceAccount) o basato su file (serviceAccountFile).
  • È supportato anche SecretRef dell’account di servizio (serviceAccountRef).
  • Fallback env: GOOGLE_CHAT_SERVICE_ACCOUNT o GOOGLE_CHAT_SERVICE_ACCOUNT_FILE.
  • Usa spaces/<spaceId> o users/<userId> per i target di consegna.
  • channels.googlechat.dangerouslyAllowNameMatching riabilita la corrispondenza modificabile del principal email (modalità di compatibilità break-glass).

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: "Short answers only.",
        },
      },
      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, // use Slack native streaming API when mode=partial
      },
      mediaMaxMb: 20,
      execApprovals: {
        enabled: "auto", // true | false | "auto"
        approvers: ["U123"],
        agentFilter: ["default"],
        sessionFilter: ["slack:"],
        target: "dm", // dm | channel | both
      },
    },
  },
}
  • Socket mode richiede sia botToken sia appToken (SLACK_BOT_TOKEN + SLACK_APP_TOKEN come fallback env dell’account predefinito).
  • HTTP mode richiede botToken più signingSecret (alla radice o per account).
  • botToken, appToken, signingSecret e userToken accettano stringhe in chiaro o oggetti SecretRef.
  • Gli snapshot degli account Slack espongono campi per origine/stato delle credenziali, come botTokenSource, botTokenStatus, appTokenStatus e, in modalità HTTP, signingSecretStatus. configured_unavailable significa che l’account è configurato tramite SecretRef ma il comando/percorso runtime corrente non ha potuto risolvere il valore del segreto.
  • configWrites: false blocca le scritture di configurazione avviate da Slack.
  • L’opzione facoltativa channels.slack.defaultAccount sovrascrive la selezione dell’account predefinito quando corrisponde a un ID account configurato.
  • channels.slack.streaming.mode è la chiave canonica della modalità di stream Slack. channels.slack.streaming.nativeTransport controlla il trasporto streaming nativo di Slack. I valori legacy streamMode, booleani streaming e nativeStreaming vengono migrati automaticamente.
  • Usa user:<id> (DM) o channel:<id> per i target di consegna.
Modalità di notifica delle reazioni: off, own (predefinita), all, allowlist (da reactionAllowlist). Isolamento della sessione del thread: thread.historyScope è per-thread (predefinito) o condiviso nel canale. thread.inheritParent copia la trascrizione del canale padre nei nuovi thread.
  • Lo streaming nativo di Slack, insieme allo stato del thread in stile assistente Slack “is typing…”, richiede un target di risposta nel thread. I DM di primo livello restano fuori thread per impostazione predefinita, quindi usano typingReaction o la consegna normale invece dell’anteprima in stile thread.
  • typingReaction aggiunge una reazione temporanea al messaggio Slack in ingresso mentre una risposta è in esecuzione, poi la rimuove al completamento. Usa uno shortcode emoji Slack come "hourglass_flowing_sand".
  • channels.slack.execApprovals: consegna nativa Slack delle approvazioni exec e autorizzazione degli approvatori. Stesso schema di Discord: enabled (true/false/"auto"), approvers (ID utente Slack), agentFilter, sessionFilter e target ("dm", "channel" o "both").
Gruppo di azioniPredefinitoNote
reactionsabilitatoReagire + elencare reazioni
messagesabilitatoLeggere/inviare/modificare/eliminare
pinsabilitatoFissare/rimuovere/elencare
memberInfoabilitatoInformazioni membro
emojiListabilitatoElenco emoji personalizzate

Mattermost

Mattermost viene distribuito come plugin: 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 explicit URL for reverse-proxy/public deployments
        callbackUrl: "https://gateway.example.com/api/channels/mattermost/command",
      },
      textChunkLimit: 4000,
      chunkMode: "length",
    },
  },
}
Modalità chat: oncall (risponde a @-mention, predefinita), onmessage (ogni messaggio), onchar (messaggi che iniziano con un prefisso trigger). Quando i comandi nativi Mattermost sono abilitati:
  • commands.callbackPath deve essere un percorso (ad esempio /api/channels/mattermost/command), non un URL completo.
  • commands.callbackUrl deve risolversi all’endpoint gateway OpenClaw ed essere raggiungibile dal server Mattermost.
  • I callback slash nativi sono autenticati con i token per comando restituiti da Mattermost durante la registrazione del comando slash. Se la registrazione fallisce o non viene attivato alcun comando, OpenClaw rifiuta i callback con Unauthorized: invalid command token.
  • Per host callback privati/tailnet/interni, Mattermost può richiedere che ServiceSettings.AllowedUntrustedInternalConnections includa l’host/dominio del callback. Usa valori host/dominio, non URL completi.
  • channels.mattermost.configWrites: consenti o nega le scritture di configurazione avviate da Mattermost.
  • channels.mattermost.requireMention: richiede @mention prima di rispondere nei canali.
  • channels.mattermost.groups.<channelId>.requireMention: override per canale della limitazione tramite menzione ("*" per il predefinito).
  • L’opzione facoltativa channels.mattermost.defaultAccount sovrascrive la selezione dell’account predefinito quando corrisponde a un ID account configurato.

Signal

{
  channels: {
    signal: {
      enabled: true,
      account: "+15555550123", // optional account binding
      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,
    },
  },
}
Modalità di notifica delle reazioni: off, own (predefinita), all, allowlist (da reactionAllowlist).
  • channels.signal.account: vincola l’avvio del canale a una specifica identità account Signal.
  • channels.signal.configWrites: consenti o nega le scritture di configurazione avviate da Signal.
  • L’opzione facoltativa channels.signal.defaultAccount sovrascrive la selezione dell’account predefinito quando corrisponde a un ID account configurato.

BlueBubbles

BlueBubbles è il percorso iMessage consigliato (supportato da plugin, configurato sotto channels.bluebubbles).
{
  channels: {
    bluebubbles: {
      enabled: true,
      dmPolicy: "pairing",
      // serverUrl, password, webhookPath, group controls, and advanced actions:
      // see /channels/bluebubbles
    },
  },
}
  • I percorsi chiave principali trattati qui: channels.bluebubbles, channels.bluebubbles.dmPolicy.
  • L’opzione facoltativa channels.bluebubbles.defaultAccount sovrascrive la selezione dell’account predefinito quando corrisponde a un ID account configurato.
  • Le voci bindings[] di primo livello con type: "acp" possono associare conversazioni BlueBubbles a sessioni ACP persistenti. Usa un handle BlueBubbles o una stringa target (chat_id:*, chat_guid:*, chat_identifier:*) in match.peer.id. Semantica condivisa dei campi: ACP Agents.
  • La configurazione completa del canale BlueBubbles è documentata in BlueBubbles.

iMessage

OpenClaw avvia imsg rpc (JSON-RPC su stdio). Non è richiesto alcun demone o porta.
{
  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",
    },
  },
}
  • L’opzione facoltativa channels.imessage.defaultAccount sovrascrive la selezione dell’account predefinito quando corrisponde a un ID account configurato.
  • Richiede Full Disk Access al database Messaggi.
  • Preferisci target chat_id:<id>. Usa imsg chats --limit 20 per elencare le chat.
  • cliPath può puntare a un wrapper SSH; imposta remoteHost (host o user@host) per il recupero degli allegati tramite SCP.
  • attachmentRoots e remoteAttachmentRoots limitano i percorsi degli allegati in ingresso (predefinito: /Users/*/Library/Messages/Attachments).
  • SCP usa il controllo rigoroso della chiave host, quindi assicurati che la chiave host del relay esista già in ~/.ssh/known_hosts.
  • channels.imessage.configWrites: consenti o nega le scritture di configurazione avviate da iMessage.
  • Le voci bindings[] di primo livello con type: "acp" possono associare conversazioni iMessage a sessioni ACP persistenti. Usa un handle normalizzato o un target chat esplicito (chat_id:*, chat_guid:*, chat_identifier:*) in match.peer.id. Semantica condivisa dei campi: ACP Agents.
#!/usr/bin/env bash
exec ssh -T gateway-host imsg "$@"

Matrix

Matrix è supportato da estensione ed è configurato sotto channels.matrix.
{
  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",
        },
      },
    },
  },
}
  • L’autenticazione tramite token usa accessToken; l’autenticazione tramite password usa userId + password.
  • channels.matrix.proxy instrada il traffico HTTP Matrix attraverso un proxy HTTP(S) esplicito. Gli account nominati possono sovrascriverlo con channels.matrix.accounts.<id>.proxy.
  • channels.matrix.network.dangerouslyAllowPrivateNetwork consente homeserver privati/interni. proxy e questo opt-in di rete sono controlli indipendenti.
  • channels.matrix.defaultAccount seleziona l’account preferito nelle configurazioni multi-account.
  • channels.matrix.autoJoin ha valore predefinito off, quindi le stanze invitate e i nuovi inviti in stile DM vengono ignorati finché non imposti autoJoin: "allowlist" con autoJoinAllowlist o autoJoin: "always".
  • channels.matrix.execApprovals: consegna nativa Matrix delle approvazioni exec e autorizzazione degli approvatori.
    • enabled: true, false o "auto" (predefinito). In modalità auto, le approvazioni exec si attivano quando gli approvatori possono essere risolti da approvers o commands.ownerAllowFrom.
    • approvers: ID utente Matrix (ad es. @owner:example.org) autorizzati ad approvare richieste exec.
    • agentFilter: allowlist facoltativa di ID agente. Omettila per inoltrare le approvazioni per tutti gli agenti.
    • sessionFilter: pattern facoltativi di chiavi sessione (sottostringa o regex).
    • target: dove inviare i prompt di approvazione. "dm" (predefinito), "channel" (stanza di origine) o "both".
    • Override per account: channels.matrix.accounts.<id>.execApprovals.
  • channels.matrix.dm.sessionScope controlla come i DM Matrix vengono raggruppati in sessioni: per-user (predefinito) condivide per peer instradato, mentre per-room isola ogni stanza DM.
  • I probe di stato Matrix e le ricerche live nella directory usano lo stesso criterio proxy del traffico runtime.
  • La configurazione completa di Matrix, le regole di targeting e gli esempi di configurazione sono documentati in Matrix.

Microsoft Teams

Microsoft Teams è supportato da estensione ed è configurato sotto channels.msteams.
{
  channels: {
    msteams: {
      enabled: true,
      configWrites: true,
      // appId, appPassword, tenantId, webhook, team/channel policies:
      // see /channels/msteams
    },
  },
}
  • I percorsi chiave principali trattati qui: channels.msteams, channels.msteams.configWrites.
  • La configurazione completa di Teams (credenziali, webhook, criterio DM/gruppi, override per team/per canale) è documentata in Microsoft Teams.

IRC

IRC è supportato da estensione ed è configurato sotto channels.irc.
{
  channels: {
    irc: {
      enabled: true,
      dmPolicy: "pairing",
      configWrites: true,
      nickserv: {
        enabled: true,
        service: "NickServ",
        password: "${IRC_NICKSERV_PASSWORD}",
        register: false,
        registerEmail: "bot@example.com",
      },
    },
  },
}
  • I percorsi chiave principali trattati qui: channels.irc, channels.irc.dmPolicy, channels.irc.configWrites, channels.irc.nickserv.*.
  • L’opzione facoltativa channels.irc.defaultAccount sovrascrive la selezione dell’account predefinito quando corrisponde a un ID account configurato.
  • La configurazione completa del canale IRC (host/porta/TLS/canali/allowlist/limitazione tramite menzione) è documentata in IRC.

Multi-account (tutti i canali)

Esegui più account per canale (ognuno con il proprio accountId):
{
  channels: {
    telegram: {
      accounts: {
        default: {
          name: "Primary bot",
          botToken: "123456:ABC...",
        },
        alerts: {
          name: "Alerts bot",
          botToken: "987654:XYZ...",
        },
      },
    },
  },
}
  • default viene usato quando accountId viene omesso (CLI + routing).
  • I token env si applicano solo all’account default.
  • Le impostazioni base del canale si applicano a tutti gli account salvo override per account.
  • Usa bindings[].match.accountId per instradare ogni account a un agente diverso.
  • Se aggiungi un account non predefinito tramite openclaw channels add (o onboarding del canale) mentre sei ancora su una configurazione di canale top-level a singolo account, OpenClaw promuove prima i valori top-level a singolo account con ambito account nella mappa account del canale, così l’account originale continua a funzionare. La maggior parte dei canali li sposta in channels.<channel>.accounts.default; Matrix può invece preservare un target nominato/predefinito esistente corrispondente.
  • I binding esistenti solo-canale (senza accountId) continuano a corrispondere all’account predefinito; i binding con ambito account restano facoltativi.
  • openclaw doctor --fix ripara anche le forme miste spostando i valori top-level a singolo account con ambito account nell’account promosso scelto per quel canale. La maggior parte dei canali usa accounts.default; Matrix può preservare un target nominato/predefinito esistente corrispondente.

Altri canali di estensione

Molti canali di estensione sono configurati come channels.<id> e documentati nelle rispettive pagine dedicate ai canali (ad esempio Feishu, Matrix, LINE, Nostr, Zalo, Nextcloud Talk, Synology Chat e Twitch). Vedi l’indice completo dei canali: Channels.

Limitazione tramite menzione nelle chat di gruppo

I messaggi di gruppo richiedono per impostazione predefinita una menzione obbligatoria (metadati di menzione o pattern regex sicuri). Si applica a WhatsApp, Telegram, Discord, Google Chat e chat di gruppo iMessage. Tipi di menzione:
  • Menzioni nei metadati: @-mention native della piattaforma. Ignorate nella modalità self-chat di WhatsApp.
  • Pattern di testo: pattern regex sicuri in agents.list[].groupChat.mentionPatterns. I pattern non validi e le ripetizioni annidate non sicure vengono ignorati.
  • La limitazione tramite menzione viene applicata solo quando il rilevamento è possibile (menzioni native o almeno un pattern).
{
  messages: {
    groupChat: { historyLimit: 50 },
  },
  agents: {
    list: [{ id: "main", groupChat: { mentionPatterns: ["@openclaw", "openclaw"] } }],
  },
}
messages.groupChat.historyLimit imposta il valore predefinito globale. I canali possono sovrascriverlo con channels.<channel>.historyLimit (o per account). Imposta 0 per disabilitarlo.

Limiti della cronologia DM

{
  channels: {
    telegram: {
      dmHistoryLimit: 30,
      dms: {
        "123456789": { historyLimit: 50 },
      },
    },
  },
}
Risoluzione: override per DM → valore predefinito del provider → nessun limite (tutto conservato). Supportati: telegram, whatsapp, discord, slack, signal, imessage, msteams.

Modalità self-chat

Includi il tuo numero in allowFrom per abilitare la modalità self-chat (ignora le @-mention native, risponde solo ai pattern di testo):
{
  channels: {
    whatsapp: {
      allowFrom: ["+15555550123"],
      groups: { "*": { requireMention: true } },
    },
  },
  agents: {
    list: [
      {
        id: "main",
        groupChat: { mentionPatterns: ["reisponde", "@openclaw"] },
      },
    ],
  },
}

Comandi (gestione dei comandi chat)

{
  commands: {
    native: "auto", // register native commands when supported
    nativeSkills: "auto", // register native skill commands when supported
    text: true, // parse /commands in chat messages
    bash: false, // allow ! (alias: /bash)
    bashForegroundMs: 2000,
    config: false, // allow /config
    mcp: false, // allow /mcp
    plugins: false, // allow /plugins
    debug: false, // allow /debug
    restart: true, // allow /restart + gateway restart tool
    ownerAllowFrom: ["discord:123456789012345678"],
    ownerDisplay: "raw", // raw | hash
    ownerDisplaySecret: "${OWNER_ID_HASH_SECRET}",
    allowFrom: {
      "*": ["user1"],
      discord: ["user:123"],
    },
    useAccessGroups: true,
  },
}
  • Questo blocco configura le superfici dei comandi. Per il catalogo corrente dei comandi integrati + bundled, vedi Slash Commands.
  • Questa pagina è un riferimento delle chiavi di configurazione, non il catalogo completo dei comandi. I comandi posseduti da canali/plugin come QQ Bot /bot-ping /bot-help /bot-logs, LINE /card, device-pair /pair, memory /dreaming, phone-control /phone e Talk /voice sono documentati nelle rispettive pagine di canale/plugin e in Slash Commands.
  • I comandi di testo devono essere messaggi autonomi con / iniziale.
  • native: "auto" attiva i comandi nativi per Discord/Telegram, lascia Slack disattivato.
  • nativeSkills: "auto" attiva i comandi nativi delle Skills per Discord/Telegram, lascia Slack disattivato.
  • Override per canale: channels.discord.commands.native (bool o "auto"). false cancella i comandi registrati in precedenza.
  • Sovrascrivi la registrazione nativa delle Skills per canale con channels.<provider>.commands.nativeSkills.
  • channels.telegram.customCommands aggiunge voci extra al menu del bot Telegram.
  • bash: true abilita ! <cmd> per la shell host. Richiede tools.elevated.enabled e il mittente in tools.elevated.allowFrom.<channel>.
  • config: true abilita /config (legge/scrive openclaw.json). Per i client gateway chat.send, le scritture persistenti /config set|unset richiedono anche operator.admin; il comando in sola lettura /config show resta disponibile ai normali client operatore con ambito di scrittura.
  • mcp: true abilita /mcp per la configurazione del server MCP gestito da OpenClaw sotto mcp.servers.
  • plugins: true abilita /plugins per rilevamento plugin, installazione e controlli di abilitazione/disabilitazione.
  • channels.<provider>.configWrites controlla le mutazioni di configurazione per canale (predefinito: true).
  • Per i canali multi-account, channels.<provider>.accounts.<id>.configWrites controlla anche le scritture che puntano a quell’account (ad esempio /allowlist --config --account <id> o /config set channels.<provider>.accounts.<id>...).
  • restart: false disabilita /restart e le azioni dello strumento di riavvio del gateway. Predefinito: true.
  • ownerAllowFrom è la allowlist esplicita del proprietario per comandi/strumenti solo proprietario. È separata da allowFrom.
  • ownerDisplay: "hash" applica l’hash agli ID del proprietario nel prompt di sistema. Imposta ownerDisplaySecret per controllare l’hashing.
  • allowFrom è per-provider. Quando è impostato, è l’unica fonte di autorizzazione (le allowlist/associazioni del canale e useAccessGroups vengono ignorati).
  • useAccessGroups: false consente ai comandi di bypassare i criteri dei gruppi di accesso quando allowFrom non è impostato.
  • Mappa della documentazione dei comandi:

Valori predefiniti degli agenti

agents.defaults.workspace

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

agents.defaults.repoRoot

Radice del repository facoltativa mostrata nella riga Runtime del prompt di sistema. Se non impostata, OpenClaw la rileva automaticamente risalendo dalla workspace.
{
  agents: { defaults: { repoRoot: "~/Projects/openclaw" } },
}

agents.defaults.skills

Allowlist predefinita facoltativa delle Skills per gli agenti che non impostano agents.list[].skills.
{
  agents: {
    defaults: { skills: ["github", "weather"] },
    list: [
      { id: "writer" }, // inherits github, weather
      { id: "docs", skills: ["docs-search"] }, // replaces defaults
      { id: "locked-down", skills: [] }, // no skills
    ],
  },
}
  • Ometti agents.defaults.skills per avere Skills senza restrizioni per impostazione predefinita.
  • Ometti agents.list[].skills per ereditare i valori predefiniti.
  • Imposta agents.list[].skills: [] per non avere Skills.
  • Un elenco non vuoto agents.list[].skills è l’insieme finale per quell’agente; non viene unito ai valori predefiniti.

agents.defaults.skipBootstrap

Disabilita la creazione automatica dei file bootstrap della workspace (AGENTS.md, SOUL.md, TOOLS.md, IDENTITY.md, USER.md, HEARTBEAT.md, BOOTSTRAP.md).
{
  agents: { defaults: { skipBootstrap: true } },
}

agents.defaults.contextInjection

Controlla quando i file bootstrap della workspace vengono iniettati nel prompt di sistema. Predefinito: "always".
  • "continuation-skip": i turni di continuazione sicura (dopo una risposta completata dell’assistente) saltano la reiniezione del bootstrap della workspace, riducendo la dimensione del prompt. Le esecuzioni heartbeat e i tentativi successivi alla compattazione ricostruiscono comunque il contesto.
{
  agents: { defaults: { contextInjection: "continuation-skip" } },
}

agents.defaults.bootstrapMaxChars

Numero massimo di caratteri per file bootstrap della workspace prima del troncamento. Predefinito: 20000.
{
  agents: { defaults: { bootstrapMaxChars: 20000 } },
}

agents.defaults.bootstrapTotalMaxChars

Numero massimo totale di caratteri iniettati in tutti i file bootstrap della workspace. Predefinito: 150000.
{
  agents: { defaults: { bootstrapTotalMaxChars: 150000 } },
}

agents.defaults.bootstrapPromptTruncationWarning

Controlla il testo di avviso visibile all’agente quando il contesto bootstrap viene troncato. Predefinito: "once".
  • "off": non iniettare mai testo di avviso nel prompt di sistema.
  • "once": inietta l’avviso una sola volta per ogni firma di troncamento univoca (consigliato).
  • "always": inietta l’avviso a ogni esecuzione quando esiste un troncamento.
{
  agents: { defaults: { bootstrapPromptTruncationWarning: "once" } }, // off | once | always
}

agents.defaults.imageMaxDimensionPx

Dimensione massima in pixel del lato più lungo dell’immagine nei blocchi immagine di transcript/strumenti prima delle chiamate al provider. Predefinito: 1200. Valori più bassi riducono di solito l’uso di vision token e la dimensione del payload della richiesta per esecuzioni ricche di screenshot. Valori più alti preservano più dettaglio visivo.
{
  agents: { defaults: { imageMaxDimensionPx: 1200 } },
}

agents.defaults.userTimezone

Fuso orario per il contesto del prompt di sistema (non per i timestamp dei messaggi). Usa come fallback il fuso orario dell’host.
{
  agents: { defaults: { userTimezone: "America/Chicago" } },
}

agents.defaults.timeFormat

Formato orario nel prompt di sistema. Predefinito: auto (preferenza del sistema operativo).
{
  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" }, // global default provider params
      embeddedHarness: {
        runtime: "auto", // auto | pi | registered harness id, e.g. codex
        fallback: "pi", // pi | none
      },
      pdfMaxBytesMb: 10,
      pdfMaxPages: 20,
      thinkingDefault: "low",
      verboseDefault: "off",
      elevatedDefault: "on",
      timeoutSeconds: 600,
      mediaMaxMb: 5,
      contextTokens: 200000,
      maxConcurrent: 3,
    },
  },
}
  • model: accetta sia una stringa ("provider/model") sia un oggetto ({ primary, fallbacks }).
    • La forma stringa imposta solo il modello primario.
    • La forma oggetto imposta il primario più i modelli di failover ordinati.
  • imageModel: accetta sia una stringa ("provider/model") sia un oggetto ({ primary, fallbacks }).
    • Usato dal percorso dello strumento image come configurazione del modello di visione.
    • Usato anche come routing di fallback quando il modello selezionato/predefinito non può accettare input immagine.
  • imageGenerationModel: accetta sia una stringa ("provider/model") sia un oggetto ({ primary, fallbacks }).
    • Usato dalla capacità condivisa di generazione immagini e da qualsiasi futura superficie di strumento/plugin che generi immagini.
    • Valori tipici: google/gemini-3.1-flash-image-preview per la generazione immagini Gemini nativa, fal/fal-ai/flux/dev per fal, oppure openai/gpt-image-1 per OpenAI Images.
    • Se selezioni direttamente un provider/modello, configura anche l’autenticazione/la chiave API del provider corrispondente (ad esempio GEMINI_API_KEY o GOOGLE_API_KEY per google/*, OPENAI_API_KEY per openai/*, FAL_KEY per fal/*).
    • Se omesso, image_generate può comunque dedurre un provider predefinito supportato da autenticazione. Prova prima il provider predefinito corrente, poi i restanti provider di generazione immagini registrati in ordine di ID provider.
  • musicGenerationModel: accetta sia una stringa ("provider/model") sia un oggetto ({ primary, fallbacks }).
    • Usato dalla capacità condivisa di generazione musicale e dallo strumento integrato music_generate.
    • Valori tipici: google/lyria-3-clip-preview, google/lyria-3-pro-preview o minimax/music-2.5+.
    • Se omesso, music_generate può comunque dedurre un provider predefinito supportato da autenticazione. Prova prima il provider predefinito corrente, poi i restanti provider di generazione musicale registrati in ordine di ID provider.
    • Se selezioni direttamente un provider/modello, configura anche l’autenticazione/la chiave API del provider corrispondente.
  • videoGenerationModel: accetta sia una stringa ("provider/model") sia un oggetto ({ primary, fallbacks }).
    • Usato dalla capacità condivisa di generazione video e dallo strumento integrato video_generate.
    • Valori tipici: qwen/wan2.6-t2v, qwen/wan2.6-i2v, qwen/wan2.6-r2v, qwen/wan2.6-r2v-flash o qwen/wan2.7-r2v.
    • Se omesso, video_generate può comunque dedurre un provider predefinito supportato da autenticazione. Prova prima il provider predefinito corrente, poi i restanti provider di generazione video registrati in ordine di ID provider.
    • Se selezioni direttamente un provider/modello, configura anche l’autenticazione/la chiave API del provider corrispondente.
    • Il provider bundled di generazione video Qwen supporta fino a 1 video in uscita, 1 immagine in ingresso, 4 video in ingresso, durata di 10 secondi e opzioni a livello provider size, aspectRatio, resolution, audio e watermark.
  • pdfModel: accetta sia una stringa ("provider/model") sia un oggetto ({ primary, fallbacks }).
    • Usato dallo strumento pdf per il routing del modello.
    • Se omesso, lo strumento PDF usa come fallback imageModel, poi il modello di sessione/predefinito risolto.
  • pdfMaxBytesMb: limite predefinito della dimensione PDF per lo strumento pdf quando maxBytesMb non viene passato al momento della chiamata.
  • pdfMaxPages: numero massimo predefinito di pagine considerate dalla modalità fallback di estrazione nello strumento pdf.
  • verboseDefault: livello verboso predefinito per gli agenti. Valori: "off", "on", "full". Predefinito: "off".
  • elevatedDefault: livello predefinito di output elevato per gli agenti. Valori: "off", "on", "ask", "full". Predefinito: "on".
  • model.primary: formato provider/model (ad esempio openai/gpt-5.4). Se ometti il provider, OpenClaw prova prima un alias, poi una corrispondenza univoca del provider configurato per quell’esatto ID modello e solo dopo usa come fallback il provider predefinito configurato (comportamento di compatibilità deprecato, quindi preferisci provider/model esplicito). Se quel provider non espone più il modello predefinito configurato, OpenClaw usa come fallback il primo provider/modello configurato invece di mostrare un valore predefinito obsoleto di un provider rimosso.
  • models: il catalogo e la allowlist dei modelli configurati per /model. Ogni voce può includere alias (scorciatoia) e params (specifici del provider, ad esempio temperature, maxTokens, cacheRetention, context1m).
  • params: parametri globali predefiniti del provider applicati a tutti i modelli. Impostati in agents.defaults.params (ad es. { cacheRetention: "long" }).
  • Precedenza di unione di params (config): agents.defaults.params (base globale) viene sovrascritto da agents.defaults.models["provider/model"].params (per modello), quindi agents.list[].params (ID agente corrispondente) sovrascrive per chiave. Vedi Prompt Caching per i dettagli.
  • embeddedHarness: criterio predefinito del runtime embedded a basso livello dell’agente. Usa runtime: "auto" per lasciare che gli harness plugin registrati rivendichino i modelli supportati, runtime: "pi" per forzare l’harness PI integrato, oppure un ID harness registrato come runtime: "codex". Imposta fallback: "none" per disabilitare il fallback automatico a PI.
  • I writer di configurazione che modificano questi campi (ad esempio /models set, /models set-image e i comandi di aggiunta/rimozione fallback) salvano la forma canonica a oggetto e preservano gli elenchi fallback esistenti quando possibile.
  • maxConcurrent: numero massimo di esecuzioni parallele di agenti tra le sessioni (ogni sessione resta comunque serializzata). Predefinito: 4.

agents.defaults.embeddedHarness

embeddedHarness controlla quale esecutore a basso livello esegue i turni degli agenti embedded. La maggior parte delle distribuzioni dovrebbe mantenere il valore predefinito { runtime: "auto", fallback: "pi" }. Usalo quando un plugin attendibile fornisce un harness nativo, come l’harness bundled dell’app-server Codex.
{
  agents: {
    defaults: {
      model: "codex/gpt-5.4",
      embeddedHarness: {
        runtime: "codex",
        fallback: "none",
      },
    },
  },
}
  • runtime: "auto", "pi" o un ID harness plugin registrato. Il plugin bundled Codex registra codex.
  • fallback: "pi" o "none". "pi" mantiene l’harness PI integrato come fallback di compatibilità. "none" fa fallire la selezione di un harness plugin mancante o non supportato invece di usare silenziosamente PI.
  • Override d’ambiente: OPENCLAW_AGENT_RUNTIME=<id|auto|pi> sovrascrive runtime; OPENCLAW_AGENT_HARNESS_FALLBACK=none disabilita il fallback a PI per quel processo.
  • Per distribuzioni solo Codex, imposta model: "codex/gpt-5.4", embeddedHarness.runtime: "codex" e embeddedHarness.fallback: "none".
  • Questo controlla solo l’harness della chat embedded. Generazione media, visione, PDF, musica, video e TTS usano comunque le rispettive impostazioni provider/modello.
Scorciatoie alias integrate (si applicano solo quando il modello è in agents.defaults.models):
AliasModello
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
Gli alias da te configurati hanno sempre la precedenza su quelli predefiniti. I modelli Z.AI GLM-4.x abilitano automaticamente la modalità thinking a meno che tu non imposti --thinking off o definisca tu stesso agents.defaults.models["zai/<model>"].params.thinking. I modelli Z.AI abilitano tool_stream per impostazione predefinita per lo streaming delle chiamate agli strumenti. Imposta agents.defaults.models["zai/<model>"].params.tool_stream su false per disabilitarlo. I modelli Anthropic Claude 4.6 usano per impostazione predefinita il thinking adaptive quando non è impostato alcun livello di thinking esplicito.

agents.defaults.cliBackends

Backend CLI facoltativi per esecuzioni di fallback solo testo (senza chiamate agli strumenti). Utili come backup quando i provider API falliscono.
{
  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",
        },
      },
    },
  },
}
  • I backend CLI sono orientati prima di tutto al testo; gli strumenti sono sempre disabilitati.
  • Le sessioni sono supportate quando sessionArg è impostato.
  • Il pass-through delle immagini è supportato quando imageArg accetta percorsi di file.

agents.defaults.systemPromptOverride

Sostituisce l’intero prompt di sistema assemblato da OpenClaw con una stringa fissa. Impostalo a livello predefinito (agents.defaults.systemPromptOverride) o per agente (agents.list[].systemPromptOverride). I valori per agente hanno la precedenza; un valore vuoto o composto solo da spazi viene ignorato. Utile per esperimenti controllati sui prompt.
{
  agents: {
    defaults: {
      systemPromptOverride: "You are a helpful assistant.",
    },
  },
}

agents.defaults.heartbeat

Esecuzioni heartbeat periodiche.
{
  agents: {
    defaults: {
      heartbeat: {
        every: "30m", // 0m disables
        model: "openai/gpt-5.4-mini",
        includeReasoning: false,
        includeSystemPromptSection: true, // default: true; false omits the Heartbeat section from the system prompt
        lightContext: false, // default: false; true keeps only HEARTBEAT.md from workspace bootstrap files
        isolatedSession: false, // default: false; true runs each heartbeat in a fresh session (no conversation history)
        session: "main",
        to: "+15555550123",
        directPolicy: "allow", // allow (default) | block
        target: "none", // default: none | options: last | whatsapp | telegram | discord | ...
        prompt: "Read HEARTBEAT.md if it exists...",
        ackMaxChars: 300,
        suppressToolErrorWarnings: false,
        timeoutSeconds: 45,
      },
    },
  },
}
  • every: stringa di durata (ms/s/m/h). Predefinito: 30m (autenticazione con chiave API) o 1h (autenticazione OAuth). Imposta 0m per disabilitare.
  • includeSystemPromptSection: quando è false, omette la sezione Heartbeat dal prompt di sistema e salta l’iniezione di HEARTBEAT.md nel contesto bootstrap. Predefinito: true.
  • suppressToolErrorWarnings: quando è true, sopprime i payload di avviso degli errori degli strumenti durante le esecuzioni heartbeat.
  • timeoutSeconds: tempo massimo in secondi consentito per un turno agente heartbeat prima che venga interrotto. Lascialo non impostato per usare agents.defaults.timeoutSeconds.
  • directPolicy: criterio di consegna diretta/DM. allow (predefinito) consente la consegna a target diretto. block sopprime la consegna a target diretto ed emette reason=dm-blocked.
  • lightContext: quando è true, le esecuzioni heartbeat usano un contesto bootstrap leggero e mantengono solo HEARTBEAT.md tra i file bootstrap della workspace.
  • isolatedSession: quando è true, ogni heartbeat viene eseguito in una sessione nuova senza cronologia conversazionale precedente. Stesso schema di isolamento di cron sessionTarget: "isolated". Riduce il costo in token per heartbeat da circa 100K a circa 2-5K token.
  • Per agente: imposta agents.list[].heartbeat. Quando un qualsiasi agente definisce heartbeat, gli heartbeat vengono eseguiti solo da quegli agenti.
  • Gli heartbeat eseguono turni agente completi: intervalli più brevi consumano più token.

agents.defaults.compaction

{
  agents: {
    defaults: {
      compaction: {
        mode: "safeguard", // default | safeguard
        provider: "my-provider", // id di un plugin provider di compattazione registrato (opzionale)
        timeoutSeconds: 900,
        reserveTokensFloor: 24000,
        identifierPolicy: "strict", // strict | off | custom
        identifierInstructions: "Preserva esattamente gli ID di deployment, gli ID dei ticket e le coppie host:port.", // usato quando identifierPolicy=custom
        postCompactionSections: ["Session Startup", "Red Lines"], // [] disabilita la reiniezione
        model: "openrouter/anthropic/claude-sonnet-4-6", // override opzionale del modello solo per la compattazione
        notifyUser: true, // invia un breve avviso quando inizia la compattazione (predefinito: false)
        memoryFlush: {
          enabled: true,
          softThresholdTokens: 6000,
          systemPrompt: "La sessione si sta avvicinando alla compattazione. Archivia ora i ricordi durevoli.",
          prompt: "Scrivi eventuali note durature in memory/YYYY-MM-DD.md; rispondi con l'esatto token silenzioso NO_REPLY se non c'è nulla da archiviare.",
        },
      },
    },
  },
}
  • mode: default o safeguard (riepilogo suddiviso in blocchi per cronologie lunghe). Vedi Compaction.
  • provider: id di un plugin provider di compattazione registrato. Quando impostato, viene chiamato summarize() del provider invece del riepilogo LLM integrato. In caso di errore, torna a quello integrato. Impostare un provider forza mode: "safeguard". Vedi Compaction.
  • timeoutSeconds: numero massimo di secondi consentiti per una singola operazione di compattazione prima che OpenClaw la interrompa. Predefinito: 900.
  • identifierPolicy: strict (predefinito), off o custom. strict antepone linee guida integrate per la conservazione di identificatori opachi durante il riepilogo della compattazione.
  • identifierInstructions: testo personalizzato facoltativo per la conservazione degli identificatori usato quando identifierPolicy=custom.
  • postCompactionSections: nomi facoltativi di sezioni H2/H3 di AGENTS.md da reiniettare dopo la compattazione. Il valore predefinito è ["Session Startup", "Red Lines"]; imposta [] per disabilitare la reiniezione. Se non è impostato o viene impostato esplicitamente a quella coppia predefinita, anche le intestazioni meno recenti Every Session/Safety sono accettate come fallback legacy.
  • model: override facoltativo provider/model-id solo per il riepilogo della compattazione. Usalo quando la sessione principale deve mantenere un modello ma i riepiloghi di compattazione devono essere eseguiti con un altro; se non impostato, la compattazione usa il modello primario della sessione.
  • notifyUser: quando true, invia un breve avviso all’utente quando inizia la compattazione (per esempio, “Compattazione del contesto in corso…”). Disabilitato per impostazione predefinita per mantenere la compattazione silenziosa.
  • memoryFlush: turno agentico silenzioso prima della compattazione automatica per archiviare ricordi durevoli. Saltato quando il workspace è in sola lettura.

agents.defaults.contextPruning

Elimina i vecchi risultati degli strumenti dal contesto in memoria prima dell’invio all’LLM. Non modifica la cronologia della sessione su disco.
{
  agents: {
    defaults: {
      contextPruning: {
        mode: "cache-ttl", // off | cache-ttl
        ttl: "1h", // durata (ms/s/m/h), unità predefinita: minuti
        keepLastAssistants: 3,
        softTrimRatio: 0.3,
        hardClearRatio: 0.5,
        minPrunableToolChars: 50000,
        softTrim: { maxChars: 4000, headChars: 1500, tailChars: 1500 },
        hardClear: { enabled: true, placeholder: "[Contenuto del vecchio risultato dello strumento cancellato]" },
        tools: { deny: ["browser", "canvas"] },
      },
    },
  },
}
  • mode: "cache-ttl" abilita i passaggi di eliminazione.
  • ttl controlla con quale frequenza l’eliminazione può essere eseguita di nuovo (dopo l’ultimo accesso alla cache).
  • L’eliminazione prima riduce in modo parziale i risultati degli strumenti troppo grandi, poi cancella completamente i risultati più vecchi degli strumenti se necessario.
Soft-trim mantiene l’inizio e la fine e inserisce ... nel mezzo.Hard-clear sostituisce l’intero risultato dello strumento con il segnaposto.Note:
  • I blocchi di immagini non vengono mai ridotti né cancellati.
  • I rapporti sono basati sui caratteri (approssimativi), non su conteggi esatti di token.
  • Se esistono meno di keepLastAssistants messaggi assistant, l’eliminazione viene saltata.
Vedi Session Pruning per i dettagli sul comportamento.

Streaming a blocchi

{
  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 (usa minMs/maxMs)
    },
  },
}
  • I canali non Telegram richiedono *.blockStreaming: true esplicito per abilitare le risposte a blocchi.
  • Override per canale: channels.<channel>.blockStreamingCoalesce (e varianti per account). Signal/Slack/Discord/Google Chat usano per impostazione predefinita minChars: 1500.
  • humanDelay: pausa casuale tra le risposte a blocchi. natural = 800–2500 ms. Override per agente: agents.list[].humanDelay.
Vedi Streaming per i dettagli su comportamento e suddivisione in blocchi.

Indicatori di digitazione

{
  agents: {
    defaults: {
      typingMode: "instant", // never | instant | thinking | message
      typingIntervalSeconds: 6,
    },
  },
}
  • Valori predefiniti: instant per chat dirette/menzioni, message per chat di gruppo senza menzione.
  • Override per sessione: session.typingMode, session.typingIntervalSeconds.
Vedi Typing Indicators.

agents.defaults.sandbox

Sandboxing facoltativo per l’agente incorporato. Vedi Sandboxing per la guida completa.
{
  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",
          // Sono supportati anche SecretRef / contenuti inline:
          // 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: runtime Docker locale (predefinito)
  • ssh: runtime remoto generico basato su SSH
  • openshell: runtime OpenShell
Quando viene selezionato backend: "openshell", le impostazioni specifiche del runtime vengono spostate in plugins.entries.openshell.config.Configurazione del backend SSH:
  • target: destinazione SSH nel formato user@host[:port]
  • command: comando del client SSH (predefinito: ssh)
  • workspaceRoot: radice remota assoluta usata per workspace per ambito
  • identityFile / certificateFile / knownHostsFile: file locali esistenti passati a OpenSSH
  • identityData / certificateData / knownHostsData: contenuti inline o SecretRef che OpenClaw materializza in file temporanei in fase di esecuzione
  • strictHostKeyChecking / updateHostKeys: opzioni del criterio delle chiavi host di OpenSSH
Precedenza di autenticazione SSH:
  • identityData ha priorità su identityFile
  • certificateData ha priorità su certificateFile
  • knownHostsData ha priorità su knownHostsFile
  • I valori *Data basati su SecretRef vengono risolti dall’istantanea attiva del runtime dei segreti prima dell’avvio della sessione sandbox
Comportamento del backend SSH:
  • inizializza il workspace remoto una volta dopo la creazione o ricreazione
  • poi mantiene canonico il workspace SSH remoto
  • instrada exec, gli strumenti per i file e i percorsi dei contenuti multimediali tramite SSH
  • non sincronizza automaticamente sul host le modifiche remote
  • non supporta container browser sandbox
Accesso al workspace:
  • none: workspace sandbox per ambito sotto ~/.openclaw/sandboxes
  • ro: workspace sandbox in /workspace, workspace dell’agente montato in sola lettura in /agent
  • rw: workspace dell’agente montato in lettura/scrittura in /workspace
Ambito:
  • session: container + workspace per sessione
  • agent: un container + workspace per agente (predefinito)
  • shared: container e workspace condivisi (nessun isolamento tra sessioni)
Configurazione del plugin OpenShell:
{
  plugins: {
    entries: {
      openshell: {
        enabled: true,
        config: {
          mode: "mirror", // mirror | remote
          from: "openclaw",
          remoteWorkspaceDir: "/sandbox",
          remoteAgentWorkspaceDir: "/agent",
          gateway: "lab", // opzionale
          gatewayEndpoint: "https://lab.example", // opzionale
          policy: "strict", // id criterio OpenShell opzionale
          providers: ["openai"], // opzionale
          autoProviders: true,
          timeoutSeconds: 120,
        },
      },
    },
  },
}
Modalità OpenShell:
  • mirror: inizializza il remoto dal locale prima di exec, sincronizza indietro dopo exec; il workspace locale resta canonico
  • remote: inizializza il remoto una volta quando la sandbox viene creata, poi mantiene canonico il workspace remoto
In modalità remote, le modifiche locali sull’host effettuate fuori da OpenClaw non vengono sincronizzate automaticamente nella sandbox dopo il passaggio di inizializzazione. Il trasporto avviene tramite SSH nella sandbox OpenShell, ma il plugin gestisce il ciclo di vita della sandbox e l’eventuale sincronizzazione mirror.setupCommand viene eseguito una volta dopo la creazione del container (tramite sh -lc). Richiede uscita di rete, root scrivibile, utente root.I container usano per impostazione predefinita network: "none" — imposta "bridge" (o una rete bridge personalizzata) se l’agente necessita di accesso in uscita. "host" è bloccato. "container:<id>" è bloccato per impostazione predefinita a meno che tu non imposti esplicitamente sandbox.docker.dangerouslyAllowContainerNamespaceJoin: true (uso di emergenza).Gli allegati in ingresso vengono preparati in media/inbound/* nel workspace attivo.docker.binds monta directory host aggiuntive; i bind globali e per agente vengono uniti.Browser sandbox (sandbox.browser.enabled): Chromium + CDP in un container. L’URL di noVNC viene inserito nel prompt di sistema. Non richiede browser.enabled in openclaw.json. L’accesso osservatore a noVNC usa l’autenticazione VNC per impostazione predefinita e OpenClaw emette un URL con token di breve durata (invece di esporre la password nell’URL condiviso).
  • allowHostControl: false (predefinito) impedisce alle sessioni sandbox di puntare al browser host.
  • network usa per impostazione predefinita openclaw-sandbox-browser (rete bridge dedicata). Imposta bridge solo quando vuoi esplicitamente una connettività bridge globale.
  • cdpSourceRange limita facoltativamente l’ingresso CDP al bordo del container a un intervallo CIDR (per esempio 172.21.0.1/32).
  • sandbox.browser.binds monta directory host aggiuntive solo nel container del browser sandbox. Quando impostato (incluso []), sostituisce docker.binds per il container del browser.
  • I valori predefiniti di avvio sono definiti in scripts/sandbox-browser-entrypoint.sh e ottimizzati per host container:
    • --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 (abilitato per impostazione predefinita)
    • --disable-3d-apis, --disable-software-rasterizer e --disable-gpu sono abilitati per impostazione predefinita e possono essere disabilitati con OPENCLAW_BROWSER_DISABLE_GRAPHICS_FLAGS=0 se l’uso di WebGL/3D lo richiede.
    • OPENCLAW_BROWSER_DISABLE_EXTENSIONS=0 riabilita le estensioni se il tuo flusso di lavoro dipende da esse.
    • --renderer-process-limit=2 può essere modificato con OPENCLAW_BROWSER_RENDERER_PROCESS_LIMIT=<N>; imposta 0 per usare il limite di processi predefinito di Chromium.
    • più --no-sandbox e --disable-setuid-sandbox quando noSandbox è abilitato.
    • I valori predefiniti sono la baseline dell’immagine container; usa un’immagine browser personalizzata con un entrypoint personalizzato per modificare i valori predefiniti del container.
Il sandboxing del browser e sandbox.docker.binds sono disponibili solo con Docker. Crea le immagini:
scripts/sandbox-setup.sh           # immagine sandbox principale
scripts/sandbox-browser-setup.sh   # immagine browser opzionale

agents.list (override per agente)

{
  agents: {
    list: [
      {
        id: "main",
        default: true,
        name: "Main Agent",
        workspace: "~/.openclaw/workspace",
        agentDir: "~/.openclaw/agents/main/agent",
        model: "anthropic/claude-opus-4-6", // oppure { primary, fallbacks }
        thinkingDefault: "high", // override del livello di thinking per agente
        reasoningDefault: "on", // override della visibilità del ragionamento per agente
        fastModeDefault: false, // override della modalità rapida per agente
        embeddedHarness: { runtime: "auto", fallback: "pi" },
        params: { cacheRetention: "none" }, // sostituisce per chiave i params corrispondenti in defaults.models
        skills: ["docs-search"], // sostituisce agents.defaults.skills quando impostato
        identity: {
          name: "Samantha",
          theme: "helpful sloth",
          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: id agente stabile (obbligatorio).
  • default: quando ne sono impostati più di uno, vince il primo (viene registrato un avviso). Se non ne è impostato nessuno, la prima voce della lista è quella predefinita.
  • model: la forma stringa sostituisce solo primary; la forma oggetto { primary, fallbacks } sostituisce entrambi ([] disabilita i fallback globali). I job cron che sostituiscono solo primary continuano a ereditare i fallback predefiniti, a meno che tu non imposti fallbacks: [].
  • params: parametri stream per agente fusi sopra la voce di modello selezionata in agents.defaults.models. Usalo per override specifici dell’agente come cacheRetention, temperature o maxTokens senza duplicare l’intero catalogo modelli.
  • skills: allowlist facoltativa di Skills per agente. Se omesso, l’agente eredita agents.defaults.skills quando impostato; una lista esplicita sostituisce i valori predefiniti invece di fonderli, e [] significa nessuna Skills.
  • thinkingDefault: valore predefinito facoltativo del livello di thinking per agente (off | minimal | low | medium | high | xhigh | adaptive). Sostituisce agents.defaults.thinkingDefault per questo agente quando non è impostato alcun override per messaggio o per sessione.
  • reasoningDefault: valore predefinito facoltativo della visibilità del ragionamento per agente (on | off | stream). Si applica quando non è impostato alcun override del ragionamento per messaggio o per sessione.
  • fastModeDefault: valore predefinito facoltativo per agente per la modalità rapida (true | false). Si applica quando non è impostato alcun override della modalità rapida per messaggio o per sessione.
  • embeddedHarness: override facoltativo del criterio harness di basso livello per agente. Usa { runtime: "codex", fallback: "none" } per rendere un agente solo Codex mentre gli altri agenti mantengono il fallback PI predefinito.
  • runtime: descrittore runtime facoltativo per agente. Usa type: "acp" con i valori predefiniti di runtime.acp (agent, backend, mode, cwd) quando l’agente deve usare per impostazione predefinita sessioni harness ACP.
  • identity.avatar: percorso relativo al workspace, URL http(s) o URI data:.
  • identity deriva i valori predefiniti: ackReaction da emoji, mentionPatterns da name/emoji.
  • subagents.allowAgents: allowlist di id agente per sessions_spawn (["*"] = qualsiasi; predefinito: solo lo stesso agente).
  • Protezione di ereditarietà sandbox: se la sessione richiedente è in sandbox, sessions_spawn rifiuta le destinazioni che verrebbero eseguite senza sandbox.
  • subagents.requireAgentId: quando è true, blocca le chiamate sessions_spawn che omettono agentId (forza la selezione esplicita del profilo; predefinito: false).

Routing multi-agente

Esegui più agenti isolati all’interno di un unico Gateway. Vedi 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" } },
  ],
}

Campi di corrispondenza del binding

  • type (facoltativo): route per il routing normale (se manca, il tipo predefinito è route), acp per binding persistenti di conversazioni ACP.
  • match.channel (obbligatorio)
  • match.accountId (facoltativo; * = qualsiasi account; omesso = account predefinito)
  • match.peer (facoltativo; { kind: direct|group|channel, id })
  • match.guildId / match.teamId (facoltativo; specifico del canale)
  • acp (facoltativo; solo per type: "acp"): { mode, label, cwd, backend }
Ordine di corrispondenza deterministico:
  1. match.peer
  2. match.guildId
  3. match.teamId
  4. match.accountId (esatto, senza peer/guild/team)
  5. match.accountId: "*" (esteso all’intero canale)
  6. Agente predefinito
All’interno di ciascun livello, vince la prima voce bindings corrispondente. Per le voci type: "acp", OpenClaw risolve in base all’identità esatta della conversazione (match.channel + account + match.peer.id) e non usa l’ordine per livelli del route binding descritto sopra.

Profili di accesso per agente

{
  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",
          ],
        },
      },
    ],
  },
}
Vedi Multi-Agent Sandbox & Tools per i dettagli sulla precedenza.

Sessione

{
  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, // salta il fork del thread padre sopra questo conteggio di token (0 disabilita)
    maintenance: {
      mode: "warn", // warn | enforce
      pruneAfter: "30d",
      maxEntries: 500,
      rotateBytes: "10mb",
      resetArchiveRetention: "30d", // durata oppure false
      maxDiskBytes: "500mb", // budget rigido facoltativo
      highWaterBytes: "400mb", // obiettivo di pulizia facoltativo
    },
    threadBindings: {
      enabled: true,
      idleHours: 24, // autofocus off predefinito per inattività in ore (`0` disabilita)
      maxAgeHours: 0, // età massima rigida predefinita in ore (`0` disabilita)
    },
    mainKey: "main", // legacy (il runtime usa sempre "main")
    agentToAgent: { maxPingPongTurns: 5 },
    sendPolicy: {
      rules: [{ action: "deny", match: { channel: "discord", chatType: "group" } }],
      default: "allow",
    },
  },
}
  • scope: strategia di raggruppamento delle sessioni di base per i contesti di chat di gruppo.
    • per-sender (predefinito): ogni mittente ottiene una sessione isolata all’interno di un contesto di canale.
    • global: tutti i partecipanti in un contesto di canale condividono una singola sessione (usalo solo quando è previsto un contesto condiviso).
  • dmScope: come vengono raggruppati i messaggi diretti.
    • main: tutti i messaggi diretti condividono la sessione principale.
    • per-peer: isola per id mittente tra i canali.
    • per-channel-peer: isola per canale + mittente (consigliato per inbox multiutente).
    • per-account-channel-peer: isola per account + canale + mittente (consigliato per multi-account).
  • identityLinks: mappa gli id canonici ai peer con prefisso provider per la condivisione delle sessioni tra canali.
  • reset: criterio di reset principale. daily esegue il reset a atHour nell’ora locale; idle esegue il reset dopo idleMinutes. Quando sono configurati entrambi, prevale quello che scade per primo.
  • resetByType: override per tipo (direct, group, thread). Il vecchio dm è accettato come alias di direct.
  • parentForkMaxTokens: valore massimo di totalTokens della sessione padre consentito quando si crea una sessione thread derivata (predefinito 100000).
    • Se totalTokens del padre è superiore a questo valore, OpenClaw avvia una nuova sessione thread invece di ereditare la cronologia della trascrizione del padre.
    • Imposta 0 per disabilitare questa protezione e consentire sempre il fork dal padre.
  • mainKey: campo legacy. Il runtime usa sempre "main" per il bucket principale delle chat dirette.
  • agentToAgent.maxPingPongTurns: numero massimo di turni di risposta reciproca tra agenti durante gli scambi agente-agente (intero, intervallo: 05). 0 disabilita la catena ping-pong.
  • sendPolicy: corrisponde in base a channel, chatType (direct|group|channel, con alias legacy dm), keyPrefix o rawKeyPrefix. La prima regola di rifiuto corrispondente prevale.
  • maintenance: controlli di pulizia e conservazione dell’archivio sessioni.
    • mode: warn emette solo avvisi; enforce applica la pulizia.
    • pruneAfter: soglia di età per le voci obsolete (predefinito 30d).
    • maxEntries: numero massimo di voci in sessions.json (predefinito 500).
    • rotateBytes: ruota sessions.json quando supera questa dimensione (predefinito 10mb).
    • resetArchiveRetention: conservazione per gli archivi di trascrizione *.reset.<timestamp>. Per impostazione predefinita usa pruneAfter; imposta false per disabilitarla.
    • maxDiskBytes: budget disco facoltativo per la directory delle sessioni. In modalità warn registra avvisi; in modalità enforce rimuove prima gli artefatti/sessioni più vecchi.
    • highWaterBytes: obiettivo facoltativo dopo la pulizia del budget. Per impostazione predefinita è l’80% di maxDiskBytes.
  • threadBindings: valori predefiniti globali per le funzionalità di sessione legate ai thread.
    • enabled: interruttore predefinito principale (i provider possono fare override; Discord usa channels.discord.threadBindings.enabled)
    • idleHours: autofocus off predefinito per inattività in ore (0 disabilita; i provider possono fare override)
    • maxAgeHours: età massima rigida predefinita in ore (0 disabilita; i provider possono fare override)

Messaggi

{
  messages: {
    responsePrefix: "🦞", // oppure "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 disabilita
      byChannel: {
        whatsapp: 5000,
        slack: 1500,
      },
    },
  },
}

Prefisso della risposta

Override per canale/account: channels.<channel>.responsePrefix, channels.<channel>.accounts.<id>.responsePrefix. Risoluzione (vince il più specifico): account → canale → globale. "" disabilita e interrompe la cascata. "auto" deriva [{identity.name}]. Variabili del template:
VariabileDescrizioneEsempio
{model}Nome breve del modelloclaude-opus-4-6
{modelFull}Identificatore completo del modelloanthropic/claude-opus-4-6
{provider}Nome del provideranthropic
{thinkingLevel}Livello di thinking correntehigh, low, off
{identity.name}Nome dell’identità agente(uguale a "auto")
Le variabili non distinguono tra maiuscole e minuscole. {think} è un alias di {thinkingLevel}.

Reazione di conferma

  • Per impostazione predefinita usa identity.emoji dell’agente attivo, altrimenti "👀". Imposta "" per disabilitare.
  • Override per canale: channels.<channel>.ackReaction, channels.<channel>.accounts.<id>.ackReaction.
  • Ordine di risoluzione: account → canale → messages.ackReaction → fallback identity.
  • Ambito: group-mentions (predefinito), group-all, direct, all.
  • removeAckAfterReply: rimuove la conferma dopo la risposta su Slack, Discord e Telegram.
  • messages.statusReactions.enabled: abilita le reazioni di stato del ciclo di vita su Slack, Discord e Telegram. Su Slack e Discord, se non impostato mantiene abilitate le reazioni di stato quando le reazioni di conferma sono attive. Su Telegram, impostalo esplicitamente su true per abilitare le reazioni di stato del ciclo di vita.

Debounce in ingresso

Raggruppa rapidi messaggi di solo testo dello stesso mittente in un singolo turno dell’agente. I media/allegati scaricano immediatamente. I comandi di controllo ignorano il debounce.

TTS (sintesi vocale)

{
  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 controlla la modalità predefinita di auto-TTS: off, always, inbound o tagged. /tts on|off può sostituire le preferenze locali e /tts status mostra lo stato effettivo.
  • summaryModel sostituisce agents.defaults.model.primary per il riepilogo automatico.
  • modelOverrides è abilitato per impostazione predefinita; modelOverrides.allowProvider è false per impostazione predefinita (attivazione esplicita).
  • Le chiavi API usano come fallback ELEVENLABS_API_KEY/XI_API_KEY e OPENAI_API_KEY.
  • openai.baseUrl sostituisce l’endpoint TTS di OpenAI. L’ordine di risoluzione è configurazione, poi OPENAI_TTS_BASE_URL, poi https://api.openai.com/v1.
  • Quando openai.baseUrl punta a un endpoint non OpenAI, OpenClaw lo tratta come un server TTS compatibile con OpenAI e allenta la convalida di modello/voce.

Talk

Valori predefiniti per la modalità Talk (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 deve corrispondere a una chiave in talk.providers quando sono configurati più provider Talk.
  • Le vecchie chiavi flat di Talk (talk.voiceId, talk.voiceAliases, talk.modelId, talk.outputFormat, talk.apiKey) sono solo per compatibilità e vengono migrate automaticamente in talk.providers.<provider>.
  • Gli ID voce usano come fallback ELEVENLABS_VOICE_ID o SAG_VOICE_ID.
  • providers.*.apiKey accetta stringhe in chiaro o oggetti SecretRef.
  • Il fallback ELEVENLABS_API_KEY si applica solo quando non è configurata alcuna chiave API Talk.
  • providers.*.voiceAliases consente alle direttive Talk di usare nomi intuitivi.
  • silenceTimeoutMs controlla per quanto tempo la modalità Talk attende dopo il silenzio dell’utente prima di inviare la trascrizione. Se non impostato, mantiene la finestra di pausa predefinita della piattaforma (700 ms su macOS e Android, 900 ms su iOS).

Strumenti

Profili degli strumenti

tools.profile imposta una allowlist di base prima di tools.allow/tools.deny: L’onboarding locale imposta per impostazione predefinita le nuove configurazioni locali su tools.profile: "coding" quando non è impostato (i profili espliciti esistenti vengono mantenuti).
ProfiloInclude
minimalsolo 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
fullNessuna restrizione (uguale a non impostato)

Gruppi di strumenti

GruppoStrumenti
group:runtimeexec, process, code_execution (bash è accettato come alias di exec)
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:openclawTutti gli strumenti integrati (esclude i plugin provider)

tools.allow / tools.deny

Criterio globale di autorizzazione/rifiuto degli strumenti (il rifiuto prevale). Non distingue tra maiuscole e minuscole, supporta wildcard *. Applicato anche quando la sandbox Docker è disattivata.
{
  tools: { deny: ["browser", "canvas"] },
}

tools.byProvider

Limita ulteriormente gli strumenti per provider o modelli specifici. Ordine: profilo di base → profilo provider → allow/deny.
{
  tools: {
    profile: "coding",
    byProvider: {
      "google-antigravity": { profile: "minimal" },
      "openai/gpt-5.4": { allow: ["group:fs", "sessions_list"] },
    },
  },
}

tools.elevated

Controlla l’accesso exec elevato fuori dalla sandbox:
{
  tools: {
    elevated: {
      enabled: true,
      allowFrom: {
        whatsapp: ["+15555550123"],
        discord: ["1234567890123", "987654321098765432"],
      },
    },
  },
}
  • L’override per agente (agents.list[].tools.elevated) può solo limitare ulteriormente.
  • /elevated on|off|ask|full memorizza lo stato per sessione; le direttive inline si applicano a un singolo messaggio.
  • exec elevato bypassa la sandbox e usa il percorso di escape configurato (gateway per impostazione predefinita, oppure node quando la destinazione exec è node).

tools.exec

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

tools.loopDetection

I controlli di sicurezza per i loop degli strumenti sono disabilitati per impostazione predefinita. Imposta enabled: true per attivare il rilevamento. Le impostazioni possono essere definite globalmente in tools.loopDetection e sostituite per agente in agents.list[].tools.loopDetection.
{
  tools: {
    loopDetection: {
      enabled: true,
      historySize: 30,
      warningThreshold: 10,
      criticalThreshold: 20,
      globalCircuitBreakerThreshold: 30,
      detectors: {
        genericRepeat: true,
        knownPollNoProgress: true,
        pingPong: true,
      },
    },
  },
}
  • historySize: cronologia massima delle chiamate agli strumenti conservata per l’analisi dei loop.
  • warningThreshold: soglia di pattern ripetuti senza avanzamento per gli avvisi.
  • criticalThreshold: soglia ripetuta più alta per bloccare i loop critici.
  • globalCircuitBreakerThreshold: soglia di arresto rigido per qualsiasi esecuzione senza avanzamento.
  • detectors.genericRepeat: avvisa in caso di chiamate ripetute con stesso strumento/stessi argomenti.
  • detectors.knownPollNoProgress: avvisa/blocca gli strumenti di polling noti (process.poll, command_status, ecc.) senza avanzamento.
  • detectors.pingPong: avvisa/blocca pattern alternati a coppie senza avanzamento.
  • Se warningThreshold >= criticalThreshold o criticalThreshold >= globalCircuitBreakerThreshold, la convalida fallisce.

tools.web

{
  tools: {
    web: {
      search: {
        enabled: true,
        apiKey: "brave_api_key", // oppure env BRAVE_API_KEY
        maxResults: 5,
        timeoutSeconds: 30,
        cacheTtlMinutes: 15,
      },
      fetch: {
        enabled: true,
        provider: "firecrawl", // facoltativo; ometti per il rilevamento automatico
        maxChars: 50000,
        maxCharsCap: 50000,
        maxResponseBytes: 2000000,
        timeoutSeconds: 30,
        cacheTtlMinutes: 15,
        maxRedirects: 3,
        readability: true,
        userAgent: "custom-ua",
      },
    },
  },
}

tools.media

Configura la comprensione dei media in ingresso (immagine/audio/video):
{
  tools: {
    media: {
      concurrency: 2,
      asyncCompletion: {
        directSend: false, // attivazione esplicita: invia musica/video asincroni completati direttamente al canale
      },
      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" }],
      },
    },
  },
}
Voce provider (type: "provider" o omesso):
  • provider: id del provider API (openai, anthropic, google/gemini, groq, ecc.)
  • model: override dell’id modello
  • profile / preferredProfile: selezione del profilo auth-profiles.json
Voce CLI (type: "cli"):
  • command: eseguibile da avviare
  • args: argomenti templati (supporta {{MediaPath}}, {{Prompt}}, {{MaxChars}}, ecc.)
Campi comuni:
  • capabilities: elenco facoltativo (image, audio, video). Valori predefiniti: openai/anthropic/minimax → image, google → image+audio+video, groq → audio.
  • prompt, maxChars, maxBytes, timeoutSeconds, language: override per voce.
  • In caso di errore, passa alla voce successiva.
L’autenticazione del provider segue l’ordine standard: auth-profiles.json → variabili d’ambiente → models.providers.*.apiKey.Campi di completamento asincrono:
  • asyncCompletion.directSend: quando true, i task asincroni completati music_generate e video_generate provano prima la consegna diretta al canale. Valore predefinito: false (vecchio percorso di attivazione della sessione richiedente/consegna modello).

tools.agentToAgent

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

tools.sessions

Controlla quali sessioni possono essere usate come destinazione dagli strumenti di sessione (sessions_list, sessions_history, sessions_send). Predefinito: tree (sessione corrente + sessioni generate da essa, come i subagent).
{
  tools: {
    sessions: {
      // "self" | "tree" | "agent" | "all"
      visibility: "tree",
    },
  },
}
Note:
  • self: solo la chiave della sessione corrente.
  • tree: sessione corrente + sessioni generate dalla sessione corrente (subagent).
  • agent: qualsiasi sessione appartenente all’id agente corrente (può includere altri utenti se esegui sessioni per mittente sotto lo stesso id agente).
  • all: qualsiasi sessione. Il targeting tra agenti richiede comunque tools.agentToAgent.
  • Limite sandbox: quando la sessione corrente è in sandbox e agents.defaults.sandbox.sessionToolsVisibility="spawned", la visibilità viene forzata a tree anche se tools.sessions.visibility="all".

tools.sessions_spawn

Controlla il supporto agli allegati inline per sessions_spawn.
{
  tools: {
    sessions_spawn: {
      attachments: {
        enabled: false, // attivazione esplicita: imposta true per consentire allegati file inline
        maxTotalBytes: 5242880, // 5 MB totali su tutti i file
        maxFiles: 50,
        maxFileBytes: 1048576, // 1 MB per file
        retainOnSessionKeep: false, // conserva gli allegati quando cleanup="keep"
      },
    },
  },
}
Note:
  • Gli allegati sono supportati solo per runtime: "subagent". Il runtime ACP li rifiuta.
  • I file vengono materializzati nel workspace figlio in .openclaw/attachments/<uuid>/ con un .manifest.json.
  • Il contenuto degli allegati viene automaticamente oscurato nella persistenza della trascrizione.
  • Gli input Base64 vengono convalidati con controlli rigorosi su alfabeto/padding e una protezione sulla dimensione prima della decodifica.
  • I permessi dei file sono 0700 per le directory e 0600 per i file.
  • La pulizia segue il criterio cleanup: delete rimuove sempre gli allegati; keep li conserva solo quando retainOnSessionKeep: true.

tools.experimental

Flag sperimentali degli strumenti integrati. Disattivati per impostazione predefinita, salvo quando si applica una regola di auto-attivazione strict-agentic GPT-5.
{
  tools: {
    experimental: {
      planTool: true, // abilita `update_plan` sperimentale
    },
  },
}
Note:
  • planTool: abilita lo strumento strutturato update_plan per il tracciamento di lavori non banali in più passaggi.
  • Predefinito: false a meno che agents.defaults.embeddedPi.executionContract (o un override per agente) non sia impostato su "strict-agentic" per un’esecuzione OpenAI o OpenAI Codex della famiglia GPT-5. Imposta true per forzare l’attivazione dello strumento fuori da tale ambito, oppure false per mantenerlo disattivato anche per esecuzioni strict-agentic GPT-5.
  • Quando abilitato, il prompt di sistema aggiunge anche linee guida d’uso così che il modello lo usi solo per lavori sostanziali e mantenga al massimo un solo passaggio in_progress.

agents.defaults.subagents

{
  agents: {
    defaults: {
      subagents: {
        allowAgents: ["research"],
        model: "minimax/MiniMax-M2.7",
        maxConcurrent: 8,
        runTimeoutSeconds: 900,
        archiveAfterMinutes: 60,
      },
    },
  },
}
  • model: modello predefinito per i subagent generati. Se omesso, i subagent ereditano il modello del chiamante.
  • allowAgents: allowlist predefinita degli id agente di destinazione per sessions_spawn quando l’agente richiedente non imposta il proprio subagents.allowAgents (["*"] = qualsiasi; predefinito: solo lo stesso agente).
  • runTimeoutSeconds: timeout predefinito (secondi) per sessions_spawn quando la chiamata allo strumento omette runTimeoutSeconds. 0 significa nessun timeout.
  • Criterio strumenti per subagent: tools.subagents.tools.allow / tools.subagents.tools.deny.

Provider personalizzati e URL di base

OpenClaw usa il catalogo modelli integrato. Aggiungi provider personalizzati tramite models.providers nella configurazione o ~/.openclaw/agents/<agentId>/agent/models.json.
{
  models: {
    mode: "merge", // merge (predefinito) | 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,
          },
        ],
      },
    },
  },
}
  • Usa authHeader: true + headers per esigenze di autenticazione personalizzate.
  • Sostituisci la radice di configurazione dell’agente con OPENCLAW_AGENT_DIR (o PI_CODING_AGENT_DIR, alias legacy della variabile d’ambiente).
  • Precedenza di unione per id provider corrispondenti:
    • I valori baseUrl non vuoti di models.json dell’agente prevalgono.
    • I valori apiKey non vuoti dell’agente prevalgono solo quando quel provider non è gestito da SecretRef nel contesto attuale di configurazione/profilo auth.
    • I valori apiKey del provider gestiti da SecretRef vengono aggiornati dai marcatori sorgente (ENV_VAR_NAME per riferimenti env, secretref-managed per riferimenti file/exec) invece di mantenere i segreti risolti.
    • I valori header del provider gestiti da SecretRef vengono aggiornati dai marcatori sorgente (secretref-env:ENV_VAR_NAME per riferimenti env, secretref-managed per riferimenti file/exec).
    • apiKey/baseUrl dell’agente vuoti o mancanti usano come fallback models.providers nella configurazione.
    • contextWindow/maxTokens del modello corrispondente usano il valore più alto tra configurazione esplicita e valori impliciti del catalogo.
    • contextTokens del modello corrispondente conserva un limite runtime esplicito quando presente; usalo per limitare il contesto effettivo senza modificare i metadati nativi del modello.
    • Usa models.mode: "replace" quando vuoi che la configurazione riscriva completamente models.json.
    • La persistenza dei marcatori è autorevole rispetto alla sorgente: i marcatori vengono scritti dall’istantanea di configurazione sorgente attiva (prima della risoluzione), non dai valori segreti runtime risolti.

Dettagli dei campi del provider

  • models.mode: comportamento del catalogo provider (merge o replace).
  • models.providers: mappa dei provider personalizzati indicizzata per id provider.
  • models.providers.*.api: adattatore di richiesta (openai-completions, openai-responses, anthropic-messages, google-generative-ai, ecc.).
  • models.providers.*.apiKey: credenziale del provider (preferisci SecretRef/sostituzione env).
  • models.providers.*.auth: strategia di autenticazione (api-key, token, oauth, aws-sdk).
  • models.providers.*.injectNumCtxForOpenAICompat: per Ollama + openai-completions, inserisce options.num_ctx nelle richieste (predefinito: true).
  • models.providers.*.authHeader: forza il trasporto della credenziale nell’header Authorization quando richiesto.
  • models.providers.*.baseUrl: URL di base dell’API upstream.
  • models.providers.*.headers: header statici aggiuntivi per il routing proxy/tenant.
  • models.providers.*.request: override di trasporto per le richieste HTTP del model provider.
    • request.headers: header aggiuntivi (fusi con i valori predefiniti del provider). I valori accettano SecretRef.
    • request.auth: override della strategia di autenticazione. Modalità: "provider-default" (usa l’autenticazione integrata del provider), "authorization-bearer" (con token), "header" (con headerName, value, prefix facoltativo).
    • request.proxy: override del proxy HTTP. Modalità: "env-proxy" (usa le variabili d’ambiente HTTP_PROXY/HTTPS_PROXY), "explicit-proxy" (con url). Entrambe le modalità accettano un sotto-oggetto tls facoltativo.
    • request.tls: override TLS per connessioni dirette. Campi: ca, cert, key, passphrase (tutti accettano SecretRef), serverName, insecureSkipVerify.
    • request.allowPrivateNetwork: quando true, consente HTTPS verso baseUrl quando il DNS si risolve in intervalli privati, CGNAT o simili, tramite la protezione fetch HTTP del provider (attivazione esplicita dell’operatore per endpoint OpenAI-compatibili self-hosted attendibili). WebSocket usa la stessa request per header/TLS ma non quella protezione SSRF di fetch. Predefinito false.
  • models.providers.*.models: voci esplicite del catalogo modelli del provider.
  • models.providers.*.models.*.contextWindow: metadati della finestra di contesto nativa del modello.
  • models.providers.*.models.*.contextTokens: limite di contesto runtime facoltativo. Usalo quando vuoi un budget di contesto effettivo più piccolo di contextWindow nativo del modello.
  • models.providers.*.models.*.compat.supportsDeveloperRole: suggerimento facoltativo di compatibilità. Per api: "openai-completions" con un baseUrl non nativo non vuoto (host diverso da api.openai.com), OpenClaw lo forza a false in fase di esecuzione. Un baseUrl vuoto/omesso mantiene il comportamento OpenAI predefinito.
  • models.providers.*.models.*.compat.requiresStringContent: suggerimento facoltativo di compatibilità per endpoint chat OpenAI-compatibili che accettano solo stringhe. Quando true, OpenClaw appiattisce gli array messages[].content di puro testo in stringhe semplici prima di inviare la richiesta.
  • plugins.entries.amazon-bedrock.config.discovery: radice delle impostazioni di auto-discovery Bedrock.
  • plugins.entries.amazon-bedrock.config.discovery.enabled: attiva/disattiva la discovery implicita.
  • plugins.entries.amazon-bedrock.config.discovery.region: regione AWS per la discovery.
  • plugins.entries.amazon-bedrock.config.discovery.providerFilter: filtro facoltativo dell’id provider per discovery mirata.
  • plugins.entries.amazon-bedrock.config.discovery.refreshInterval: intervallo di polling per l’aggiornamento della discovery.
  • plugins.entries.amazon-bedrock.config.discovery.defaultContextWindow: finestra di contesto di fallback per i modelli individuati.
  • plugins.entries.amazon-bedrock.config.discovery.defaultMaxTokens: numero massimo di token in output di fallback per i modelli individuati.

Esempi di provider

{
  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)" },
        ],
      },
    },
  },
}
Usa cerebras/zai-glm-4.7 per Cerebras; zai/glm-4.7 per Z.AI diretto.
{
  agents: {
    defaults: {
      model: { primary: "opencode/claude-opus-4-6" },
      models: { "opencode/claude-opus-4-6": { alias: "Opus" } },
    },
  },
}
Imposta OPENCODE_API_KEY (o OPENCODE_ZEN_API_KEY). Usa riferimenti opencode/... per il catalogo Zen o riferimenti opencode-go/... per il catalogo Go. Scorciatoia: openclaw onboard --auth-choice opencode-zen o openclaw onboard --auth-choice opencode-go.
{
  agents: {
    defaults: {
      model: { primary: "zai/glm-4.7" },
      models: { "zai/glm-4.7": {} },
    },
  },
}
Imposta ZAI_API_KEY. z.ai/* e z-ai/* sono alias accettati. Scorciatoia: openclaw onboard --auth-choice zai-api-key.
  • Endpoint generale: https://api.z.ai/api/paas/v4
  • Endpoint coding (predefinito): https://api.z.ai/api/coding/paas/v4
  • Per l’endpoint generale, definisci un provider personalizzato con l’override del 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,
          },
        ],
      },
    },
  },
}
Per l’endpoint Cina: baseUrl: "https://api.moonshot.cn/v1" oppure openclaw onboard --auth-choice moonshot-api-key-cn.Gli endpoint Moonshot nativi dichiarano la compatibilità d’uso dello streaming sul trasporto condiviso openai-completions, e OpenClaw la determina in base alle capacità dell’endpoint piuttosto che solo all’id provider integrato.
{
  env: { KIMI_API_KEY: "sk-..." },
  agents: {
    defaults: {
      model: { primary: "kimi/kimi-code" },
      models: { "kimi/kimi-code": { alias: "Kimi Code" } },
    },
  },
}
Compatibile con Anthropic, provider integrato. Scorciatoia: 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,
          },
        ],
      },
    },
  },
}
Il base URL deve omettere /v1 (il client Anthropic lo aggiunge). Scorciatoia: 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,
          },
        ],
      },
    },
  },
}
Imposta MINIMAX_API_KEY. Scorciatoie: openclaw onboard --auth-choice minimax-global-api oppure openclaw onboard --auth-choice minimax-cn-api. Il catalogo modelli usa per impostazione predefinita solo M2.7. Nel percorso di streaming compatibile con Anthropic, OpenClaw disabilita il thinking di MiniMax per impostazione predefinita a meno che tu non imposti esplicitamente thinking. /fast on o params.fastMode: true riscrivono MiniMax-M2.7 in MiniMax-M2.7-highspeed.
Vedi Local Models. In breve: esegui un grande modello locale tramite LM Studio Responses API su hardware serio; mantieni uniti i modelli ospitati per il fallback.

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" }, // oppure stringa in chiaro
        env: { GEMINI_API_KEY: "GEMINI_KEY_HERE" },
      },
      peekaboo: { enabled: true },
      sag: { enabled: false },
    },
  },
}
  • allowBundled: allowlist facoltativa solo per le Skills integrate (le Skills gestite/workspace non sono interessate).
  • load.extraDirs: radici aggiuntive di Skills condivise (precedenza più bassa).
  • install.preferBrew: quando è true, preferisce gli installer Homebrew quando brew è disponibile, prima di passare ad altri tipi di installer.
  • install.nodeManager: preferenza dell’installer Node per le specifiche metadata.openclaw.install (npm | pnpm | yarn | bun).
  • entries.<skillKey>.enabled: false disabilita una Skills anche se è integrata/installata.
  • entries.<skillKey>.apiKey: scorciatoia per le Skills che dichiarano una variabile env primaria (stringa in chiaro o oggetto SecretRef).

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" },
      },
    },
  },
}
  • Caricati da ~/.openclaw/extensions, <workspace>/.openclaw/extensions, più plugins.load.paths.
  • La discovery accetta plugin OpenClaw nativi più bundle Codex compatibili e bundle Claude, inclusi bundle Claude senza manifest con layout predefinito.
  • Le modifiche alla configurazione richiedono un riavvio del gateway.
  • allow: allowlist facoltativa (vengono caricati solo i plugin elencati). deny prevale.
  • plugins.entries.<id>.apiKey: campo di comodità per la chiave API a livello di plugin (quando supportato dal plugin).
  • plugins.entries.<id>.env: mappa di variabili d’ambiente con ambito plugin.
  • plugins.entries.<id>.hooks.allowPromptInjection: quando false, il core blocca before_prompt_build e ignora i campi che modificano il prompt dal vecchio before_agent_start, preservando però i vecchi modelOverride e providerOverride. Si applica agli hook dei plugin nativi e alle directory hook fornite dai bundle supportati.
  • plugins.entries.<id>.subagent.allowModelOverride: considera esplicitamente attendibile questo plugin per richiedere override per esecuzione di provider e model per esecuzioni di subagent in background.
  • plugins.entries.<id>.subagent.allowedModels: allowlist facoltativa di destinazioni canoniche provider/model per override attendibili dei subagent. Usa "*" solo quando vuoi intenzionalmente consentire qualsiasi modello.
  • plugins.entries.<id>.config: oggetto di configurazione definito dal plugin (convalidato dallo schema del plugin OpenClaw nativo quando disponibile).
  • plugins.entries.firecrawl.config.webFetch: impostazioni del provider Firecrawl per web fetch.
    • apiKey: chiave API Firecrawl (accetta SecretRef). Usa come fallback plugins.entries.firecrawl.config.webSearch.apiKey, il vecchio tools.web.fetch.firecrawl.apiKey o la variabile d’ambiente FIRECRAWL_API_KEY.
    • baseUrl: URL di base dell’API Firecrawl (predefinito: https://api.firecrawl.dev).
    • onlyMainContent: estrae solo il contenuto principale dalle pagine (predefinito: true).
    • maxAgeMs: età massima della cache in millisecondi (predefinito: 172800000 / 2 giorni).
    • timeoutSeconds: timeout della richiesta di scraping in secondi (predefinito: 60).
  • plugins.entries.xai.config.xSearch: impostazioni xAI X Search (ricerca web Grok).
    • enabled: abilita il provider X Search.
    • model: modello Grok da usare per la ricerca (ad esempio "grok-4-1-fast").
  • plugins.entries.memory-core.config.dreaming: impostazioni del dreaming della memoria (sperimentale). Vedi Dreaming per fasi e soglie.
    • enabled: interruttore principale del dreaming (predefinito false).
    • frequency: cadenza cron per ogni passaggio completo di dreaming (predefinita "0 3 * * *").
    • i criteri di fase e le soglie sono dettagli implementativi (non chiavi di configurazione rivolte all’utente).
  • La configurazione completa della memoria si trova in Memory configuration reference:
    • agents.defaults.memorySearch.*
    • memory.backend
    • memory.citations
    • memory.qmd.*
    • plugins.entries.memory-core.config.dreaming
  • I plugin bundle Claude abilitati possono anche contribuire con valori predefiniti di Pi incorporati da settings.json; OpenClaw li applica come impostazioni dell’agente sanificate, non come patch grezze della configurazione OpenClaw.
  • plugins.slots.memory: scegli l’id del plugin memoria attivo, oppure "none" per disabilitare i plugin memoria.
  • plugins.slots.contextEngine: scegli l’id del plugin motore di contesto attivo; il valore predefinito è "legacy" a meno che tu non installi e selezioni un altro motore.
  • plugins.installs: metadati di installazione gestiti dalla CLI usati da openclaw plugins update.
    • Include source, spec, sourcePath, installPath, version, resolvedName, resolvedVersion, resolvedSpec, integrity, shasum, resolvedAt, installedAt.
    • Tratta plugins.installs.* come stato gestito; preferisci i comandi CLI alle modifiche manuali.
Vedi Plugins.

Browser

{
  browser: {
    enabled: true,
    evaluateEnabled: true,
    defaultProfile: "user",
    ssrfPolicy: {
      // dangerouslyAllowPrivateNetwork: true, // attiva solo per accesso attendibile a reti private
      // allowPrivateNetwork: true, // alias legacy
      // 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 disabilita act:evaluate e wait --fn.
  • ssrfPolicy.dangerouslyAllowPrivateNetwork è disabilitato quando non impostato, quindi la navigazione del browser resta rigorosa per impostazione predefinita.
  • Imposta ssrfPolicy.dangerouslyAllowPrivateNetwork: true solo quando ti fidi intenzionalmente della navigazione del browser su reti private.
  • In modalità rigorosa, gli endpoint dei profili CDP remoti (profiles.*.cdpUrl) sono soggetti allo stesso blocco delle reti private durante i controlli di raggiungibilità/discovery.
  • ssrfPolicy.allowPrivateNetwork resta supportato come alias legacy.
  • In modalità rigorosa, usa ssrfPolicy.hostnameAllowlist e ssrfPolicy.allowedHostnames per eccezioni esplicite.
  • I profili remoti sono solo attach-only (avvio/arresto/reset disabilitati).
  • profiles.*.cdpUrl accetta http://, https://, ws:// e wss://. Usa HTTP(S) quando vuoi che OpenClaw rilevi /json/version; usa WS(S) quando il tuo provider ti fornisce un URL WebSocket DevTools diretto.
  • I profili existing-session sono solo host e usano Chrome MCP invece di CDP.
  • I profili existing-session possono impostare userDataDir per puntare a un profilo specifico di browser basato su Chromium come Brave o Edge.
  • I profili existing-session mantengono gli attuali limiti del percorso Chrome MCP: azioni basate su snapshot/riferimenti invece del targeting con selettori CSS, hook di upload di un solo file, nessun override del timeout delle finestre di dialogo, nessun wait --load networkidle, e nessun responsebody, esportazione PDF, intercettazione dei download o azioni batch.
  • I profili openclaw gestiti localmente assegnano automaticamente cdpPort e cdpUrl; imposta cdpUrl esplicitamente solo per CDP remoto.
  • Ordine di rilevamento automatico: browser predefinito se basato su Chromium → Chrome → Brave → Edge → Chromium → Chrome Canary.
  • Servizio di controllo: solo loopback (porta derivata da gateway.port, predefinita 18791).
  • extraArgs aggiunge flag di avvio extra all’avvio locale di Chromium (per esempio --disable-gpu, dimensionamento finestra o flag di debug).

UI

{
  ui: {
    seamColor: "#FF4500",
    assistant: {
      name: "OpenClaw",
      avatar: "CB", // emoji, testo breve, URL immagine o URI data
    },
  },
}
  • seamColor: colore di accento per il chrome della UI dell’app nativa (tinta del fumetto della modalità Talk, ecc.).
  • assistant: override dell’identità della Control UI. Usa come fallback l’identità dell’agente attivo.

Gateway

{
  gateway: {
    mode: "local", // local | remote
    port: 18789,
    bind: "loopback",
    auth: {
      mode: "token", // none | token | password | trusted-proxy
      token: "your-token",
      // password: "your-password", // oppure OPENCLAW_GATEWAY_PASSWORD
      // trustedProxy: { userHeader: "x-forwarded-user" }, // per mode=trusted-proxy; vedi /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",
      // embedSandbox: "scripts", // strict | scripts | trusted
      // allowExternalEmbedUrls: false, // pericoloso: consenti URL embed http(s) esterni assoluti
      // allowedOrigins: ["https://control.example.com"], // richiesto per Control UI non loopback
      // dangerouslyAllowHostHeaderOriginFallback: false, // modalità pericolosa di fallback origine Host-header
      // 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"],
    // Facoltativo. Predefinito false.
    allowRealIpFallback: false,
    tools: {
      // Ulteriori rifiuti HTTP per /tools/invoke
      deny: ["browser"],
      // Rimuove strumenti dalla deny list HTTP predefinita
      allow: ["gateway"],
    },
    push: {
      apns: {
        relay: {
          baseUrl: "https://relay.example.com",
          timeoutMs: 10000,
        },
      },
    },
  },
}
  • mode: local (esegue il gateway) o remote (si connette a un gateway remoto). Il gateway rifiuta di avviarsi a meno che non sia local.
  • port: porta singola multiplexata per WS + HTTP. Precedenza: --port > OPENCLAW_GATEWAY_PORT > gateway.port > 18789.
  • bind: auto, loopback (predefinito), lan (0.0.0.0), tailnet (solo IP Tailscale) o custom.
  • Alias bind legacy: usa i valori della modalità bind in gateway.bind (auto, loopback, lan, tailnet, custom), non gli alias host (0.0.0.0, 127.0.0.1, localhost, ::, ::1).
  • Nota Docker: il bind predefinito loopback ascolta su 127.0.0.1 dentro il container. Con il networking bridge Docker (-p 18789:18789), il traffico arriva su eth0, quindi il gateway non è raggiungibile. Usa --network host, oppure imposta bind: "lan" (o bind: "custom" con customBindHost: "0.0.0.0") per ascoltare su tutte le interfacce.
  • Auth: richiesta per impostazione predefinita. I bind non loopback richiedono l’autenticazione del gateway. In pratica ciò significa un token/password condiviso oppure un reverse proxy identity-aware con gateway.auth.mode: "trusted-proxy". La procedura guidata di onboarding genera un token per impostazione predefinita.
  • Se sono configurati sia gateway.auth.token sia gateway.auth.password (inclusi SecretRef), imposta esplicitamente gateway.auth.mode su token o password. L’avvio e i flussi di installazione/riparazione del servizio falliscono quando entrambi sono configurati e la modalità non è impostata.
  • gateway.auth.mode: "none": modalità esplicita senza autenticazione. Usala solo per configurazioni attendibili su local loopback; intenzionalmente questa opzione non viene proposta dai prompt di onboarding.
  • gateway.auth.mode: "trusted-proxy": delega l’autenticazione a un reverse proxy identity-aware e si fida degli header di identità da gateway.trustedProxies (vedi Trusted Proxy Auth). Questa modalità si aspetta una sorgente proxy non loopback; i reverse proxy loopback sullo stesso host non soddisfano l’autenticazione trusted-proxy.
  • gateway.auth.allowTailscale: quando true, gli header di identità di Tailscale Serve possono soddisfare l’autenticazione di Control UI/WebSocket (verificata tramite tailscale whois). Gli endpoint API HTTP non usano quell’autenticazione tramite header Tailscale; seguono invece la normale modalità HTTP auth del gateway. Questo flusso senza token presuppone che l’host del gateway sia attendibile. Il valore predefinito è true quando tailscale.mode = "serve".
  • gateway.auth.rateLimit: limitatore facoltativo per autenticazioni fallite. Si applica per IP client e per ambito auth (segreto condiviso e token dispositivo vengono tracciati indipendentemente). I tentativi bloccati restituiscono 429 + Retry-After.
    • Sul percorso asincrono Tailscale Serve Control UI, i tentativi falliti per lo stesso {scope, clientIp} vengono serializzati prima della scrittura del fallimento. Tentativi errati concorrenti dello stesso client possono quindi attivare il limitatore alla seconda richiesta invece di passare entrambi come semplici mancati match.
    • gateway.auth.rateLimit.exemptLoopback è true per impostazione predefinita; imposta false quando vuoi intenzionalmente limitare anche il traffico localhost (per setup di test o deployment proxy rigorosi).
  • I tentativi di autenticazione WS con origine browser vengono sempre limitati con l’esenzione loopback disabilitata (difesa in profondità contro brute force localhost basato su browser).
  • Su loopback, quei blocchi di origine browser sono isolati per valore Origin normalizzato, così fallimenti ripetuti da un’origine localhost non bloccano automaticamente un’origine diversa.
  • tailscale.mode: serve (solo tailnet, bind loopback) o funnel (pubblico, richiede auth).
  • controlUi.allowedOrigins: allowlist esplicita delle origini browser per le connessioni WebSocket al Gateway. Richiesta quando ci si aspettano client browser da origini non loopback.
  • controlUi.dangerouslyAllowHostHeaderOriginFallback: modalità pericolosa che abilita il fallback dell’origine dall’header Host per deployment che si basano intenzionalmente su una policy di origine basata su Host-header.
  • remote.transport: ssh (predefinito) o direct (ws/wss). Per direct, remote.url deve essere ws:// o wss://.
  • OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1: override break-glass lato client che consente ws:// in chiaro verso IP attendibili di rete privata; il valore predefinito resta solo loopback per il traffico in chiaro.
  • gateway.remote.token / .password sono campi credenziali del client remoto. Non configurano da soli l’autenticazione del gateway.
  • gateway.push.apns.relay.baseUrl: URL HTTPS di base per il relay APNs esterno usato dalle build iOS ufficiali/TestFlight dopo che pubblicano registrazioni relay-backed sul gateway. Questo URL deve corrispondere all’URL relay compilato nella build iOS.
  • gateway.push.apns.relay.timeoutMs: timeout in millisecondi per l’invio dal gateway al relay. Predefinito 10000.
  • Le registrazioni relay-backed sono delegate a una specifica identità gateway. L’app iOS associata recupera gateway.identity.get, include quell’identità nella registrazione relay e inoltra al gateway una concessione di invio con ambito di registrazione. Un altro gateway non può riutilizzare quella registrazione memorizzata.
  • OPENCLAW_APNS_RELAY_BASE_URL / OPENCLAW_APNS_RELAY_TIMEOUT_MS: override env temporanei per la configurazione relay sopra indicata.
  • OPENCLAW_APNS_RELAY_ALLOW_HTTP=true: escape hatch solo per sviluppo per URL relay HTTP loopback. Gli URL relay di produzione devono restare su HTTPS.
  • gateway.channelHealthCheckMinutes: intervallo in minuti del monitor di salute dei canali. Imposta 0 per disabilitare globalmente i riavvii del monitor di salute. Predefinito: 5.
  • gateway.channelStaleEventThresholdMinutes: soglia in minuti per socket obsoleti. Mantienila maggiore o uguale a gateway.channelHealthCheckMinutes. Predefinito: 30.
  • gateway.channelMaxRestartsPerHour: numero massimo di riavvii del monitor di salute per canale/account in un’ora mobile. Predefinito: 10.
  • channels.<provider>.healthMonitor.enabled: opt-out per canale dei riavvii del monitor di salute mantenendo attivo il monitor globale.
  • channels.<provider>.accounts.<accountId>.healthMonitor.enabled: override per account per canali multi-account. Quando impostato, ha precedenza sull’override a livello canale.
  • I percorsi di chiamata del gateway locale possono usare gateway.remote.* come fallback solo quando gateway.auth.* non è impostato.
  • Se gateway.auth.token / gateway.auth.password è configurato esplicitamente tramite SecretRef e non risolto, la risoluzione fallisce in modalità chiusa (nessun fallback remoto che mascheri il problema).
  • trustedProxies: IP dei reverse proxy che terminano TLS o inseriscono header del client inoltrato. Elenca solo proxy che controlli. Le voci loopback restano valide per setup con proxy sullo stesso host/rilevamento locale (per esempio Tailscale Serve o un reverse proxy locale), ma non rendono le richieste loopback idonee a gateway.auth.mode: "trusted-proxy".
  • allowRealIpFallback: quando true, il gateway accetta X-Real-IP se manca X-Forwarded-For. Predefinito false per comportamento fail-closed.
  • gateway.tools.deny: nomi di strumenti aggiuntivi bloccati per HTTP POST /tools/invoke (estende la deny list predefinita).
  • gateway.tools.allow: rimuove nomi di strumenti dalla deny list HTTP predefinita.

Endpoint compatibili con OpenAI

  • Chat Completions: disabilitato per impostazione predefinita. Abilitalo con gateway.http.endpoints.chatCompletions.enabled: true.
  • API Responses: gateway.http.endpoints.responses.enabled.
  • Hardened URL-input per Responses:
    • gateway.http.endpoints.responses.maxUrlParts
    • gateway.http.endpoints.responses.files.urlAllowlist
    • gateway.http.endpoints.responses.images.urlAllowlist Le allowlist vuote vengono trattate come non impostate; usa gateway.http.endpoints.responses.files.allowUrl=false e/o gateway.http.endpoints.responses.images.allowUrl=false per disabilitare il recupero tramite URL.
  • Header facoltativo di hardening della risposta:
    • gateway.http.securityHeaders.strictTransportSecurity (impostalo solo per origini HTTPS che controlli; vedi Trusted Proxy Auth)

Isolamento multiistanza

Esegui più gateway su un host con porte e directory di stato uniche:
OPENCLAW_CONFIG_PATH=~/.openclaw/a.json \
OPENCLAW_STATE_DIR=~/.openclaw-a \
openclaw gateway --port 19001
Flag di comodità: --dev (usa ~/.openclaw-dev + porta 19001), --profile <name> (usa ~/.openclaw-<name>). Vedi 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: abilita la terminazione TLS sul listener gateway (HTTPS/WSS) (predefinito: false).
  • autoGenerate: genera automaticamente una coppia locale certificato/chiave self-signed quando non sono configurati file espliciti; solo per uso locale/dev.
  • certPath: percorso filesystem del file certificato TLS.
  • keyPath: percorso filesystem del file chiave privata TLS; mantienilo con permessi limitati.
  • caPath: percorso facoltativo del bundle CA per verifica client o catene di trust personalizzate.

gateway.reload

{
  gateway: {
    reload: {
      mode: "hybrid", // off | restart | hot | hybrid
      debounceMs: 500,
      deferralTimeoutMs: 300000,
    },
  },
}
  • mode: controlla come vengono applicate in fase di esecuzione le modifiche alla configurazione.
    • "off": ignora le modifiche live; i cambiamenti richiedono un riavvio esplicito.
    • "restart": riavvia sempre il processo gateway in caso di modifica della configurazione.
    • "hot": applica le modifiche nel processo senza riavvio.
    • "hybrid" (predefinito): prova prima l’hot reload; se necessario, passa al riavvio.
  • debounceMs: finestra di debounce in ms prima che le modifiche alla configurazione vengano applicate (intero non negativo).
  • deferralTimeoutMs: tempo massimo in ms di attesa per le operazioni in corso prima di forzare un riavvio (predefinito: 300000 = 5 minuti).

Hook

{
  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: "Da: {{messages[0].from}}\nOggetto: {{messages[0].subject}}\n{{messages[0].snippet}}",
        deliver: true,
        channel: "last",
        model: "openai/gpt-5.4-mini",
      },
    ],
  },
}
Auth: Authorization: Bearer <token> oppure x-openclaw-token: <token>. I token hook nella query string vengono rifiutati. Note su convalida e sicurezza:
  • hooks.enabled=true richiede un hooks.token non vuoto.
  • hooks.token deve essere distinto da gateway.auth.token; il riutilizzo del token Gateway viene rifiutato.
  • hooks.path non può essere /; usa un sottopercorso dedicato come /hooks.
  • Se hooks.allowRequestSessionKey=true, limita hooks.allowedSessionKeyPrefixes (per esempio ["hook:"]).
Endpoint:
  • POST /hooks/wake{ text, mode?: "now"|"next-heartbeat" }
  • POST /hooks/agent{ message, name?, agentId?, sessionKey?, wakeMode?, deliver?, channel?, to?, model?, thinking?, timeoutSeconds? }
    • sessionKey dal payload della richiesta è accettato solo quando hooks.allowRequestSessionKey=true (predefinito: false).
  • POST /hooks/<name> → risolto tramite hooks.mappings
  • match.path corrisponde al sottopercorso dopo /hooks (ad esempio /hooks/gmailgmail).
  • match.source corrisponde a un campo del payload per percorsi generici.
  • I template come {{messages[0].subject}} leggono dal payload.
  • transform può puntare a un modulo JS/TS che restituisce un’azione hook.
    • transform.module deve essere un percorso relativo e restare entro hooks.transformsDir (i percorsi assoluti e l’attraversamento vengono rifiutati).
  • agentId instrada a un agente specifico; gli ID sconosciuti usano come fallback il predefinito.
  • allowedAgentIds: limita l’instradamento esplicito (* o omesso = consenti tutti, [] = nega tutti).
  • defaultSessionKey: chiave sessione fissa facoltativa per esecuzioni dell’agente hook senza sessionKey esplicito.
  • allowRequestSessionKey: consente ai chiamanti di /hooks/agent di impostare sessionKey (predefinito: false).
  • allowedSessionKeyPrefixes: allowlist facoltativa di prefissi per valori sessionKey espliciti (richiesta + mappatura), ad esempio ["hook:"].
  • deliver: true invia la risposta finale a un canale; channel usa come predefinito last.
  • model sostituisce l’LLM per questa esecuzione hook (deve essere consentito se è impostato il catalogo modelli).

Integrazione Gmail

{
  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",
    },
  },
}
  • Il gateway avvia automaticamente gog gmail watch serve all’avvio quando è configurato. Imposta OPENCLAW_SKIP_GMAIL_WATCHER=1 per disabilitarlo.
  • Non eseguire un gog gmail watch serve separato insieme al Gateway.

Host canvas

{
  canvasHost: {
    root: "~/.openclaw/workspace/canvas",
    liveReload: true,
    // enabled: false, // oppure OPENCLAW_SKIP_CANVAS_HOST=1
  },
}
  • Serve HTML/CSS/JS modificabili dall’agente e A2UI tramite HTTP sotto la porta del Gateway:
    • http://<gateway-host>:<gateway.port>/__openclaw__/canvas/
    • http://<gateway-host>:<gateway.port>/__openclaw__/a2ui/
  • Solo locale: mantieni gateway.bind: "loopback" (predefinito).
  • Bind non loopback: le route canvas richiedono l’autenticazione Gateway (token/password/trusted-proxy), come le altre superfici HTTP del Gateway.
  • I WebView Node in genere non inviano header di autenticazione; dopo che un node è associato e connesso, il Gateway pubblicizza URL di capability con ambito node per l’accesso a canvas/A2UI.
  • Gli URL di capability sono associati alla sessione WS attiva del node e scadono rapidamente. Non viene usato alcun fallback basato su IP.
  • Inserisce il client di live reload nell’HTML servito.
  • Crea automaticamente un index.html iniziale quando è vuoto.
  • Serve anche A2UI in /__openclaw__/a2ui/.
  • Le modifiche richiedono un riavvio del gateway.
  • Disabilita il live reload per directory grandi o errori EMFILE.

Discovery

mDNS (Bonjour)

{
  discovery: {
    mdns: {
      mode: "minimal", // minimal | full | off
    },
  },
}
  • minimal (predefinito): omette cliPath + sshPort dai record TXT.
  • full: include cliPath + sshPort.
  • L’hostname usa come predefinito openclaw. Sostituiscilo con OPENCLAW_MDNS_HOSTNAME.

Wide-area (DNS-SD)

{
  discovery: {
    wideArea: { enabled: true },
  },
}
Scrive una zona DNS-SD unicast sotto ~/.openclaw/dns/. Per la discovery tra reti, abbinalo a un server DNS (CoreDNS consigliato) + split DNS Tailscale. Configurazione: openclaw dns setup --apply.

Ambiente

env (variabili env inline)

{
  env: {
    OPENROUTER_API_KEY: "sk-or-...",
    vars: {
      GROQ_API_KEY: "gsk-...",
    },
    shellEnv: {
      enabled: true,
      timeoutMs: 15000,
    },
  },
}
  • Le variabili env inline vengono applicate solo se nell’env del processo manca la chiave.
  • File .env: .env della CWD + ~/.openclaw/.env (nessuno dei due sostituisce variabili esistenti).
  • shellEnv: importa le chiavi previste mancanti dal profilo della tua shell di login.
  • Vedi Environment per la precedenza completa.

Sostituzione delle variabili env

Fai riferimento alle variabili env in qualsiasi stringa di configurazione con ${VAR_NAME}:
{
  gateway: {
    auth: { token: "${OPENCLAW_GATEWAY_TOKEN}" },
  },
}
  • Vengono corrisposti solo nomi in maiuscolo: [A-Z_][A-Z0-9_]*.
  • Variabili mancanti/vuote generano un errore durante il caricamento della configurazione.
  • Escape con $${VAR} per un letterale ${VAR}.
  • Funziona con $include.

Segreti

I riferimenti ai segreti sono additivi: i valori in chiaro continuano a funzionare.

SecretRef

Usa una forma oggetto:
{ source: "env" | "file" | "exec", provider: "default", id: "..." }
Convalida:
  • pattern provider: ^[a-z][a-z0-9_-]{0,63}$
  • pattern id source: "env": ^[A-Z][A-Z0-9_]{0,127}$
  • id source: "file": puntatore JSON assoluto (per esempio "/providers/openai/apiKey")
  • pattern id source: "exec": ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,255}$
  • gli id source: "exec" non devono contenere segmenti di percorso delimitati da slash . o .. (per esempio a/../b viene rifiutato)

Superficie credenziali supportata

  • Matrice canonica: SecretRef Credential Surface
  • secrets apply usa come destinazione i percorsi credenziali supportati di openclaw.json.
  • I riferimenti auth-profiles.json sono inclusi nella risoluzione runtime e nella copertura di audit.

Configurazione dei provider di segreti

{
  secrets: {
    providers: {
      default: { source: "env" }, // provider env esplicito facoltativo
      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",
    },
  },
}
Note:
  • Il provider file supporta mode: "json" e mode: "singleValue" (id deve essere "value" in modalità singleValue).
  • Il provider exec richiede un percorso command assoluto e usa payload di protocollo su stdin/stdout.
  • Per impostazione predefinita, i percorsi di comando symlink vengono rifiutati. Imposta allowSymlinkCommand: true per consentire percorsi symlink validando però il percorso target risolto.
  • Se trustedDirs è configurato, il controllo delle directory attendibili si applica al percorso target risolto.
  • L’ambiente figlio exec è minimo per impostazione predefinita; passa esplicitamente le variabili richieste con passEnv.
  • I riferimenti ai segreti vengono risolti al momento dell’attivazione in un’istantanea in memoria, poi i percorsi di richiesta leggono solo l’istantanea.
  • Il filtraggio della superficie attiva si applica durante l’attivazione: i riferimenti non risolti sulle superfici abilitate fanno fallire avvio/reload, mentre le superfici inattive vengono saltate con diagnostica.

Archiviazione auth

{
  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"],
    },
  },
}
  • I profili per agente sono archiviati in <agentDir>/auth-profiles.json.
  • auth-profiles.json supporta riferimenti a livello di valore (keyRef per api_key, tokenRef per token) per modalità di credenziali statiche.
  • I profili in modalità OAuth (auth.profiles.<id>.mode = "oauth") non supportano credenziali di profilo auth basate su SecretRef.
  • Le credenziali runtime statiche provengono da istantanee risolte in memoria; le vecchie voci statiche auth.json vengono ripulite quando rilevate.
  • Importazioni OAuth legacy da ~/.openclaw/credentials/oauth.json.
  • Vedi OAuth.
  • Comportamento runtime dei segreti e strumenti 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: backoff di base in ore quando un profilo fallisce per veri errori di fatturazione/credito insufficiente (predefinito: 5). Testi espliciti di fatturazione possono comunque finire qui anche su risposte 401/403, ma i matcher di testo specifici del provider restano limitati al provider che li possiede (per esempio OpenRouter Key limit exceeded). I messaggi 402 ritentabili relativi a finestra d’uso o limiti di spesa di organizzazione/workspace restano invece nel percorso rate_limit.
  • billingBackoffHoursByProvider: override facoltativi per provider delle ore di backoff di fatturazione.
  • billingMaxHours: limite massimo in ore per la crescita esponenziale del backoff di fatturazione (predefinito: 24).
  • authPermanentBackoffMinutes: backoff di base in minuti per errori auth_permanent ad alta confidenza (predefinito: 10).
  • authPermanentMaxMinutes: limite massimo in minuti per la crescita del backoff auth_permanent (predefinito: 60).
  • failureWindowHours: finestra mobile in ore usata per i contatori di backoff (predefinito: 24).
  • overloadedProfileRotations: massimo numero di rotazioni dello stesso provider auth-profile per errori di sovraccarico prima di passare al fallback del modello (predefinito: 1). Le forme di provider occupato come ModelNotReadyException finiscono qui.
  • overloadedBackoffMs: ritardo fisso prima di ritentare una rotazione di provider/profilo sovraccarico (predefinito: 0).
  • rateLimitedProfileRotations: massimo numero di rotazioni dello stesso provider auth-profile per errori di rate limit prima di passare al fallback del modello (predefinito: 1). Quel bucket di rate limit include testo tipico del provider come Too many concurrent requests, ThrottlingException, concurrency limit reached, workers_ai ... quota limit exceeded e 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"],
  },
}
  • File di log predefinito: /tmp/openclaw/openclaw-YYYY-MM-DD.log.
  • Imposta logging.file per un percorso stabile.
  • consoleLevel passa a debug con --verbose.
  • maxFileBytes: dimensione massima del file di log in byte prima che le scritture vengano soppresse (intero positivo; predefinito: 524288000 = 500 MB). Usa una rotazione esterna dei log per i deployment di produzione.

Diagnostica

{
  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: interruttore principale per l’output di strumentazione (predefinito: true).
  • flags: array di stringhe flag che abilita output di log mirati (supporta wildcard come "telegram.*" o "*").
  • stuckSessionWarnMs: soglia di età in ms per emettere avvisi di sessione bloccata mentre una sessione resta nello stato di elaborazione.
  • otel.enabled: abilita la pipeline di esportazione OpenTelemetry (predefinito: false).
  • otel.endpoint: URL del collector per l’esportazione OTel.
  • otel.protocol: "http/protobuf" (predefinito) o "grpc".
  • otel.headers: header di metadati HTTP/gRPC aggiuntivi inviati con le richieste di esportazione OTel.
  • otel.serviceName: nome del servizio per gli attributi della risorsa.
  • otel.traces / otel.metrics / otel.logs: abilita l’esportazione di trace, metriche o log.
  • otel.sampleRate: frequenza di campionamento delle trace 01.
  • otel.flushIntervalMs: intervallo periodico di flush della telemetria in ms.
  • cacheTrace.enabled: registra snapshot del trace della cache per esecuzioni incorporate (predefinito: false).
  • cacheTrace.filePath: percorso di output per il JSONL del trace della cache (predefinito: $OPENCLAW_STATE_DIR/logs/cache-trace.jsonl).
  • cacheTrace.includeMessages / includePrompt / includeSystem: controlla cosa è incluso nell’output del trace della cache (tutti predefiniti: true).

Aggiornamento

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

    auto: {
      enabled: false,
      stableDelayHours: 6,
      stableJitterHours: 12,
      betaCheckIntervalHours: 1,
    },
  },
}
  • channel: canale di rilascio per installazioni npm/git — "stable", "beta" o "dev".
  • checkOnStart: verifica aggiornamenti npm all’avvio del gateway (predefinito: true).
  • auto.enabled: abilita l’aggiornamento automatico in background per le installazioni di pacchetti (predefinito: false).
  • auto.stableDelayHours: ritardo minimo in ore prima dell’applicazione automatica sul canale stable (predefinito: 6; max: 168).
  • auto.stableJitterHours: finestra aggiuntiva di distribuzione graduale del canale stable in ore (predefinito: 12; max: 168).
  • auto.betaCheckIntervalHours: frequenza in ore dei controlli sul canale beta (predefinito: 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: gate globale della funzionalità ACP (predefinito: false).
  • dispatch.enabled: gate indipendente per il dispatch dei turni di sessione ACP (predefinito: true). Imposta false per mantenere disponibili i comandi ACP bloccandone però l’esecuzione.
  • backend: id backend runtime ACP predefinito (deve corrispondere a un plugin runtime ACP registrato).
  • defaultAgent: id agente ACP di fallback quando gli spawn non specificano una destinazione esplicita.
  • allowedAgents: allowlist di id agente consentiti per le sessioni runtime ACP; vuoto significa nessuna restrizione aggiuntiva.
  • maxConcurrentSessions: numero massimo di sessioni ACP attive contemporaneamente.
  • stream.coalesceIdleMs: finestra di flush per inattività in ms per il testo in streaming.
  • stream.maxChunkChars: dimensione massima del blocco prima della suddivisione della proiezione dei blocchi in streaming.
  • stream.repeatSuppression: sopprime righe di stato/strumenti ripetute per turno (predefinito: true).
  • stream.deliveryMode: "live" trasmette incrementalmente; "final_only" bufferizza fino agli eventi terminali del turno.
  • stream.hiddenBoundarySeparator: separatore prima del testo visibile dopo eventi di strumenti nascosti (predefinito: "paragraph").
  • stream.maxOutputChars: numero massimo di caratteri di output dell’assistente proiettati per turno ACP.
  • stream.maxSessionUpdateChars: numero massimo di caratteri per righe di stato/aggiornamento ACP proiettate.
  • stream.tagVisibility: record dei nomi dei tag con override booleani di visibilità per eventi in streaming.
  • runtime.ttlMinutes: TTL di inattività in minuti per i worker di sessione ACP prima che possano essere ripuliti.
  • runtime.installCommand: comando di installazione facoltativo da eseguire durante il bootstrap di un ambiente runtime ACP.

CLI

{
  cli: {
    banner: {
      taglineMode: "off", // random | default | off
    },
  },
}
  • cli.banner.taglineMode controlla lo stile del tagline del banner:
    • "random" (predefinito): tagline a rotazione divertenti/stagionali.
    • "default": tagline neutro fisso (All your chats, one OpenClaw.).
    • "off": nessun testo tagline (titolo/versione del banner ancora mostrati).
  • Per nascondere l’intero banner (non solo i tagline), imposta la variabile env OPENCLAW_HIDE_BANNER=1.

Wizard

Metadati scritti dai flussi di configurazione guidata della CLI (onboard, configure, doctor):
{
  wizard: {
    lastRunAt: "2026-01-01T00:00:00.000Z",
    lastRunVersion: "2026.1.4",
    lastRunCommit: "abc1234",
    lastRunCommand: "configure",
    lastRunMode: "local",
  },
}

Identità

Vedi i campi identity di agents.list in Valori predefiniti dell’agente.

Bridge (legacy, rimosso)

Le build correnti non includono più il bridge TCP. I node si connettono tramite il Gateway WebSocket. Le chiavi bridge.* non fanno più parte dello schema di configurazione (la convalida fallisce finché non vengono rimosse; openclaw doctor --fix può eliminare le chiavi sconosciute).
{
  "bridge": {
    "enabled": true,
    "port": 18790,
    "bind": "tailnet",
    "tls": {
      "enabled": true,
      "autoGenerate": true
    }
  }
}

Cron

{
  cron: {
    enabled: true,
    maxConcurrentRuns: 2,
    webhook: "https://example.invalid/legacy", // fallback deprecato per job archiviati con notify:true
    webhookToken: "replace-with-dedicated-token", // token bearer facoltativo per l'autenticazione webhook in uscita
    sessionRetention: "24h", // stringa di durata oppure false
    runLog: {
      maxBytes: "2mb", // predefinito 2_000_000 byte
      keepLines: 2000, // predefinito 2000
    },
  },
}
  • sessionRetention: per quanto tempo mantenere le sessioni completate delle esecuzioni cron isolate prima di eliminarle da sessions.json. Controlla anche la pulizia delle trascrizioni cron eliminate archiviate. Predefinito: 24h; imposta false per disabilitare.
  • runLog.maxBytes: dimensione massima per file di log di esecuzione (cron/runs/<jobId>.jsonl) prima della pulizia. Predefinito: 2_000_000 byte.
  • runLog.keepLines: righe più recenti conservate quando viene attivata la pulizia del log di esecuzione. Predefinito: 2000.
  • webhookToken: token bearer usato per la consegna POST del webhook cron (delivery.mode = "webhook"); se omesso non viene inviato alcun header auth.
  • webhook: URL webhook legacy deprecato di fallback (http/https) usato solo per i job archiviati che hanno ancora notify: true.

cron.retry

{
  cron: {
    retry: {
      maxAttempts: 3,
      backoffMs: [30000, 60000, 300000],
      retryOn: ["rate_limit", "overloaded", "network", "timeout", "server_error"],
    },
  },
}
  • maxAttempts: numero massimo di tentativi per job one-shot in caso di errori transitori (predefinito: 3; intervallo: 010).
  • backoffMs: array di ritardi di backoff in ms per ogni tentativo di retry (predefinito: [30000, 60000, 300000]; 1–10 voci).
  • retryOn: tipi di errore che attivano i retry — "rate_limit", "overloaded", "network", "timeout", "server_error". Ometti per ritentare tutti i tipi transitori.
Si applica solo ai job cron one-shot. I job ricorrenti usano una gestione degli errori separata.

cron.failureAlert

{
  cron: {
    failureAlert: {
      enabled: false,
      after: 3,
      cooldownMs: 3600000,
      mode: "announce",
      accountId: "main",
    },
  },
}
  • enabled: abilita gli avvisi di errore per i job cron (predefinito: false).
  • after: errori consecutivi prima che venga attivato un avviso (intero positivo, min: 1).
  • cooldownMs: millisecondi minimi tra avvisi ripetuti per lo stesso job (intero non negativo).
  • mode: modalità di consegna — "announce" invia tramite un messaggio di canale; "webhook" pubblica sul webhook configurato.
  • accountId: id account o canale facoltativo per definire l’ambito della consegna dell’avviso.

cron.failureDestination

{
  cron: {
    failureDestination: {
      mode: "announce",
      channel: "last",
      to: "channel:C1234567890",
      accountId: "main",
    },
  },
}
  • Destinazione predefinita per le notifiche di errore cron per tutti i job.
  • mode: "announce" o "webhook"; usa come predefinito "announce" quando esistono dati di destinazione sufficienti.
  • channel: override del canale per la consegna announce. "last" riutilizza l’ultimo canale di consegna noto.
  • to: destinazione announce esplicita o URL webhook. Obbligatorio per la modalità webhook.
  • accountId: override facoltativo dell’account per la consegna.
  • delivery.failureDestination per job sostituisce questo valore predefinito globale.
  • Quando non è impostata né una destinazione di errore globale né una per job, i job che già consegnano tramite announce usano come fallback quella destinazione announce primaria in caso di errore.
  • delivery.failureDestination è supportato solo per job sessionTarget="isolated" a meno che delivery.mode primario del job non sia "webhook".
Vedi Cron Jobs. Le esecuzioni cron isolate sono tracciate come background tasks.

Variabili template del modello media

Segnaposto del template espansi in tools.media.models[].args:
VariabileDescrizione
{{Body}}Corpo completo del messaggio in ingresso
{{RawBody}}Corpo grezzo (senza wrapper cronologia/mittente)
{{BodyStripped}}Corpo con le menzioni di gruppo rimosse
{{From}}Identificatore del mittente
{{To}}Identificatore della destinazione
{{MessageSid}}ID del messaggio del canale
{{SessionId}}UUID della sessione corrente
{{IsNewSession}}"true" quando viene creata una nuova sessione
{{MediaUrl}}pseudo-URL del media in ingresso
{{MediaPath}}percorso locale del media
{{MediaType}}tipo di media (image/audio/document/…)
{{Transcript}}trascrizione audio
{{Prompt}}prompt media risolto per le voci CLI
{{MaxChars}}max caratteri di output risolti per le voci CLI
{{ChatType}}"direct" o "group"
{{GroupSubject}}oggetto del gruppo (best effort)
{{GroupMembers}}anteprima dei membri del gruppo (best effort)
{{SenderName}}nome visualizzato del mittente (best effort)
{{SenderE164}}numero di telefono del mittente (best effort)
{{Provider}}suggerimento provider (whatsapp, telegram, discord, ecc.)

Include di configurazione ($include)

Suddividi la configurazione in più file:
// ~/.openclaw/openclaw.json
{
  gateway: { port: 18789 },
  agents: { $include: "./agents.json5" },
  broadcast: {
    $include: ["./clients/mueller.json5", "./clients/schmidt.json5"],
  },
}
Comportamento di merge:
  • File singolo: sostituisce l’oggetto contenitore.
  • Array di file: merge profondo in ordine (gli ultimi sostituiscono i precedenti).
  • Chiavi sibling: unite dopo gli include (sostituiscono i valori inclusi).
  • Include nidificati: fino a 10 livelli di profondità.
  • Percorsi: risolti relativamente al file che include, ma devono restare all’interno della directory di configurazione di livello superiore (dirname di openclaw.json). Le forme assolute/../ sono consentite solo se si risolvono comunque entro quel confine.
  • Errori: messaggi chiari per file mancanti, errori di parsing e include circolari.

Correlati: Configuration · Configuration Examples · Doctor