Pular para o conteúdo principal

Referência de configuração

Referência principal de configuração para ~/.openclaw/openclaw.json. Para uma visão geral orientada a tarefas, consulte Configuration. Esta página cobre as principais superfícies de configuração do OpenClaw e aponta para links externos quando um subsistema tem sua própria referência mais detalhada. Ela não tenta embutir, em uma única página, todos os catálogos de comandos pertencentes a canais/plugins nem todos os ajustes profundos de memória/QMD. Fonte da verdade no código:
  • openclaw config schema imprime o JSON Schema em tempo real usado para validação e para a Control UI, com metadados de bundled/plugin/channel mesclados quando disponíveis
  • config.schema.lookup retorna um nó do schema com escopo de caminho para ferramentas de inspeção detalhada
  • pnpm config:docs:check / pnpm config:docs:gen validam o hash de baseline da documentação de configuração em relação à superfície atual do schema
Referências detalhadas dedicadas:
  • Referência de configuração de memória para agents.defaults.memorySearch.*, memory.qmd.*, memory.citations e configuração de Dreaming em plugins.entries.memory-core.config.dreaming
  • Comandos de barra para o catálogo atual de comandos internos + bundled
  • páginas do canal/plugin proprietário para superfícies de comando específicas de cada canal
O formato de configuração é JSON5 (comentários + vírgulas finais permitidos). Todos os campos são opcionais — o OpenClaw usa valores padrão seguros quando omitidos.

Canais

Cada canal inicia automaticamente quando sua seção de configuração existe (a menos que enabled: false).

Acesso a DM e grupos

Todos os canais oferecem suporte a políticas de DM e políticas de grupo:
Política de DMComportamento
pairing (padrão)Remetentes desconhecidos recebem um código de pareamento único; o proprietário deve aprovar
allowlistSomente remetentes em allowFrom (ou armazenamento de permissões pareadas)
openPermitir todas as DMs recebidas (requer allowFrom: ["*"])
disabledIgnorar todas as DMs recebidas
Política de grupoComportamento
allowlist (padrão)Somente grupos que correspondem à lista de permissões configurada
openIgnorar listas de permissões de grupo (o bloqueio por menção ainda se aplica)
disabledBloquear todas as mensagens de grupo/sala
channels.defaults.groupPolicy define o padrão quando groupPolicy de um provedor não está definido. Os códigos de pareamento expiram após 1 hora. As solicitações pendentes de pareamento por DM são limitadas a 3 por canal. Se um bloco de provedor estiver totalmente ausente (channels.<provider> ausente), a política de grupo em tempo de execução recorre a allowlist (fail-closed), com um aviso na inicialização.

Substituições de modelo por canal

Use channels.modelByChannel para fixar IDs de canais específicos a um modelo. Os valores aceitam provider/model ou aliases de modelo configurados. O mapeamento do canal é aplicado quando uma sessão ainda não tem uma substituição de modelo (por exemplo, definida por /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",
      },
    },
  },
}

Padrões de canal e Heartbeat

Use channels.defaults para o comportamento compartilhado de política de grupo e Heartbeat entre provedores:
{
  channels: {
    defaults: {
      groupPolicy: "allowlist", // open | allowlist | disabled
      contextVisibility: "all", // all | allowlist | allowlist_quote
      heartbeat: {
        showOk: false,
        showAlerts: true,
        useIndicator: true,
      },
    },
  },
}
  • channels.defaults.groupPolicy: política de grupo de fallback quando groupPolicy no nível do provedor não está definido.
  • channels.defaults.contextVisibility: modo padrão de visibilidade de contexto suplementar para todos os canais. Valores: all (padrão, inclui todo o contexto de citação/thread/histórico), allowlist (inclui contexto apenas de remetentes na lista de permissões), allowlist_quote (igual a allowlist, mas mantém contexto explícito de citação/resposta). Substituição por canal: channels.<channel>.contextVisibility.
  • channels.defaults.heartbeat.showOk: inclui status íntegros de canal na saída do Heartbeat.
  • channels.defaults.heartbeat.showAlerts: inclui status degradados/com erro na saída do Heartbeat.
  • channels.defaults.heartbeat.useIndicator: renderiza uma saída de Heartbeat compacta no estilo indicador.

WhatsApp

O WhatsApp é executado pelo canal web do gateway (Baileys Web). Ele inicia automaticamente quando existe uma sessão vinculada.
{
  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",
        },
      },
    },
  },
}
  • Os comandos de saída usam por padrão a conta default, se presente; caso contrário, o primeiro ID de conta configurado (ordenado).
  • O opcional channels.whatsapp.defaultAccount substitui essa seleção de conta padrão de fallback quando corresponde a um ID de conta configurado.
  • O diretório de autenticação legado de conta única do Baileys é migrado por openclaw doctor para whatsapp/default.
  • Substituições por conta: 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 do bot: channels.telegram.botToken ou channels.telegram.tokenFile (somente arquivo regular; symlinks são rejeitados), com TELEGRAM_BOT_TOKEN como fallback para a conta padrão.
  • O opcional channels.telegram.defaultAccount substitui a seleção de conta padrão quando corresponde a um ID de conta configurado.
  • Em configurações com várias contas (2+ IDs de conta), defina um padrão explícito (channels.telegram.defaultAccount ou channels.telegram.accounts.default) para evitar roteamento por fallback; openclaw doctor emite um aviso quando isso está ausente ou inválido.
  • configWrites: false bloqueia gravações de configuração iniciadas pelo Telegram (migrações de ID de supergrupo, /config set|unset).
  • Entradas de nível superior bindings[] com type: "acp" configuram vínculos persistentes de ACP para tópicos de fórum (use o formato canônico chatId:topic:topicId em match.peer.id). A semântica dos campos é compartilhada em ACP Agents.
  • As prévias de streaming do Telegram usam sendMessage + editMessageText (funciona em chats diretos e em grupo).
  • Política de retry: consulte Política de retry.

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, com DISCORD_BOT_TOKEN como fallback para a conta padrão.
  • Chamadas diretas de saída que fornecem um token explícito do Discord usam esse token para a chamada; as configurações de retry/política da conta ainda vêm da conta selecionada no snapshot ativo em tempo de execução.
  • O opcional channels.discord.defaultAccount substitui a seleção de conta padrão quando corresponde a um ID de conta configurado.
  • Use user:<id> (DM) ou channel:<id> (canal de guild) para alvos de entrega; IDs numéricos sem prefixo são rejeitados.
  • Os slugs de guild são em minúsculas com espaços substituídos por -; as chaves de canal usam o nome em slug (sem #). Prefira IDs de guild.
  • Mensagens criadas por bots são ignoradas por padrão. allowBots: true as habilita; use allowBots: "mentions" para aceitar apenas mensagens de bots que mencionem o bot (mensagens do próprio bot continuam filtradas).
  • channels.discord.guilds.<id>.ignoreOtherMentions (e substituições no nível do canal) descarta mensagens que mencionam outro usuário ou cargo, mas não o bot (excluindo @everyone/@here).
  • maxLinesPerMessage (padrão 17) divide mensagens altas mesmo quando estão abaixo de 2000 caracteres.
  • channels.discord.threadBindings controla o roteamento vinculado a threads do Discord:
    • enabled: substituição do Discord para recursos de sessão vinculados a thread (/focus, /unfocus, /agents, /session idle, /session max-age e entrega/roteamento vinculados)
    • idleHours: substituição do Discord para desfoco automático por inatividade em horas (0 desativa)
    • maxAgeHours: substituição do Discord para idade máxima rígida em horas (0 desativa)
    • spawnSubagentSessions: chave de ativação para criação/vinculação automática de thread em sessions_spawn({ thread: true })
  • Entradas de nível superior bindings[] com type: "acp" configuram vínculos persistentes de ACP para canais e threads (use o ID do canal/thread em match.peer.id). A semântica dos campos é compartilhada em ACP Agents.
  • channels.discord.ui.components.accentColor define a cor de destaque para contêineres de componentes v2 do Discord.
  • channels.discord.voice habilita conversas em canais de voz do Discord e substituições opcionais de entrada automática + TTS.
  • channels.discord.voice.daveEncryption e channels.discord.voice.decryptionFailureTolerance são repassados para as opções DAVE de @discordjs/voice (true e 24 por padrão).
  • O OpenClaw também tenta recuperar o recebimento de voz saindo e entrando novamente em uma sessão de voz após falhas repetidas de descriptografia.
  • channels.discord.streaming é a chave canônica do modo de streaming. Os valores legados streamMode e booleanos streaming são migrados automaticamente.
  • channels.discord.autoPresence mapeia a disponibilidade em tempo de execução para a presença do bot (healthy => online, degraded => idle, exhausted => dnd) e permite substituições opcionais de texto de status.
  • channels.discord.dangerouslyAllowNameMatching reabilita a correspondência mutável por nome/tag (modo de compatibilidade break-glass).
  • channels.discord.execApprovals: entrega nativa do Discord para aprovações de execução e autorização de aprovadores.
    • enabled: true, false ou "auto" (padrão). No modo automático, as aprovações de execução são ativadas quando os aprovadores podem ser resolvidos a partir de approvers ou commands.ownerAllowFrom.
    • approvers: IDs de usuário do Discord autorizados a aprovar solicitações de execução. Usa commands.ownerAllowFrom como fallback quando omitido.
    • agentFilter: lista de permissões opcional de IDs de agentes. Omita para encaminhar aprovações para todos os agentes.
    • sessionFilter: padrões opcionais de chave de sessão (substring ou regex).
    • target: onde enviar os prompts de aprovação. "dm" (padrão) envia para as DMs dos aprovadores, "channel" envia para o canal de origem, "both" envia para ambos. Quando o alvo inclui "channel", os botões só podem ser usados por aprovadores resolvidos.
    • cleanupAfterResolve: quando true, exclui as DMs de aprovação após aprovação, recusa ou timeout.
Modos de notificação de reação: off (nenhum), own (mensagens do bot, padrão), all (todas as mensagens), allowlist (de guilds.<id>.users em todas as mensagens).

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 da conta de serviço: embutido (serviceAccount) ou baseado em arquivo (serviceAccountFile).
  • SecretRef da conta de serviço também é compatível (serviceAccountRef).
  • Fallbacks por variável de ambiente: GOOGLE_CHAT_SERVICE_ACCOUNT ou GOOGLE_CHAT_SERVICE_ACCOUNT_FILE.
  • Use spaces/<spaceId> ou users/<userId> para alvos de entrega.
  • channels.googlechat.dangerouslyAllowNameMatching reabilita a correspondência mutável de principal de e-mail (modo de compatibilidade 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 requer botToken e appToken (SLACK_BOT_TOKEN + SLACK_APP_TOKEN para fallback por variável de ambiente da conta padrão).
  • HTTP mode requer botToken mais signingSecret (na raiz ou por conta).
  • botToken, appToken, signingSecret e userToken aceitam strings em texto simples ou objetos SecretRef.
  • Snapshots de conta do Slack expõem campos por credencial de origem/status, como botTokenSource, botTokenStatus, appTokenStatus e, em HTTP mode, signingSecretStatus. configured_unavailable significa que a conta está configurada por SecretRef, mas o caminho atual de comando/runtime não conseguiu resolver o valor do segredo.
  • configWrites: false bloqueia gravações de configuração iniciadas pelo Slack.
  • O opcional channels.slack.defaultAccount substitui a seleção de conta padrão quando corresponde a um ID de conta configurado.
  • channels.slack.streaming.mode é a chave canônica do modo de streaming do Slack. channels.slack.streaming.nativeTransport controla o transporte nativo de streaming do Slack. Os valores legados streamMode, booleanos streaming e nativeStreaming são migrados automaticamente.
  • Use user:<id> (DM) ou channel:<id> para alvos de entrega.
Modos de notificação de reação: off, own (padrão), all, allowlist (de reactionAllowlist). Isolamento de sessão por thread: thread.historyScope é por thread (padrão) ou compartilhado pelo canal. thread.inheritParent copia a transcrição do canal pai para novas threads.
  • O streaming nativo do Slack mais o status de thread no estilo “is typing…” do assistente do Slack requerem um alvo de resposta em thread. DMs de nível superior ficam fora de thread por padrão, então usam typingReaction ou entrega normal em vez da prévia no estilo thread.
  • typingReaction adiciona uma reação temporária à mensagem recebida no Slack enquanto uma resposta está em execução e a remove quando termina. Use um shortcode de emoji do Slack como "hourglass_flowing_sand".
  • channels.slack.execApprovals: entrega nativa do Slack para aprovações de execução e autorização de aprovadores. Mesmo schema do Discord: enabled (true/false/"auto"), approvers (IDs de usuário do Slack), agentFilter, sessionFilter e target ("dm", "channel" ou "both").
Grupo de açõesPadrãoObservações
reactionsativadoReagir + listar reações
messagesativadoLer/enviar/editar/excluir
pinsativadoFixar/desafixar/listar
memberInfoativadoInformações do membro
emojiListativadoLista de emojis personalizados

Mattermost

O Mattermost é distribuído como 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",
    },
  },
}
Modos de chat: oncall (responde em @mention, padrão), onmessage (toda mensagem), onchar (mensagens que começam com prefixo de gatilho). Quando os comandos nativos do Mattermost estão habilitados:
  • commands.callbackPath deve ser um caminho (por exemplo /api/channels/mattermost/command), não uma URL completa.
  • commands.callbackUrl deve resolver para o endpoint do Gateway do OpenClaw e ser acessível a partir do servidor Mattermost.
  • Callbacks nativos de slash são autenticados com os tokens por comando retornados pelo Mattermost durante o registro do comando de barra. Se o registro falhar ou nenhum comando for ativado, o OpenClaw rejeitará callbacks com Unauthorized: invalid command token.
  • Para hosts de callback privados/tailnet/internos, o Mattermost pode exigir que ServiceSettings.AllowedUntrustedInternalConnections inclua o host/domínio do callback. Use valores de host/domínio, não URLs completas.
  • channels.mattermost.configWrites: permite ou nega gravações de configuração iniciadas pelo Mattermost.
  • channels.mattermost.requireMention: exige @mention antes de responder em canais.
  • channels.mattermost.groups.<channelId>.requireMention: substituição de bloqueio por menção por canal ("*" para padrão).
  • O opcional channels.mattermost.defaultAccount substitui a seleção de conta padrão quando corresponde a um ID de conta configurado.

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,
    },
  },
}
Modos de notificação de reação: off, own (padrão), all, allowlist (de reactionAllowlist).
  • channels.signal.account: fixa a inicialização do canal a uma identidade específica de conta Signal.
  • channels.signal.configWrites: permite ou nega gravações de configuração iniciadas pelo Signal.
  • O opcional channels.signal.defaultAccount substitui a seleção de conta padrão quando corresponde a um ID de conta configurado.

BlueBubbles

BlueBubbles é o caminho recomendado para iMessage (baseado em Plugin, configurado em channels.bluebubbles).
{
  channels: {
    bluebubbles: {
      enabled: true,
      dmPolicy: "pairing",
      // serverUrl, password, webhookPath, group controls, and advanced actions:
      // see /channels/bluebubbles
    },
  },
}
  • Caminhos de chave principais cobertos aqui: channels.bluebubbles, channels.bluebubbles.dmPolicy.
  • O opcional channels.bluebubbles.defaultAccount substitui a seleção de conta padrão quando corresponde a um ID de conta configurado.
  • Entradas de nível superior bindings[] com type: "acp" podem vincular conversas do BlueBubbles a sessões persistentes de ACP. Use um identificador ou string de alvo do BlueBubbles (chat_id:*, chat_guid:*, chat_identifier:*) em match.peer.id. Semântica compartilhada dos campos: ACP Agents.
  • A configuração completa do canal BlueBubbles está documentada em BlueBubbles.

iMessage

O OpenClaw inicia imsg rpc (JSON-RPC por stdio). Nenhum daemon ou porta é necessário.
{
  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",
    },
  },
}
  • O opcional channels.imessage.defaultAccount substitui a seleção de conta padrão quando corresponde a um ID de conta configurado.
  • Requer Acesso Total ao Disco ao banco de dados do Messages.
  • Prefira alvos chat_id:<id>. Use imsg chats --limit 20 para listar conversas.
  • cliPath pode apontar para um wrapper SSH; defina remoteHost (host ou user@host) para buscar anexos via SCP.
  • attachmentRoots e remoteAttachmentRoots restringem caminhos de anexos recebidos (padrão: /Users/*/Library/Messages/Attachments).
  • O SCP usa verificação estrita de chave do host, então garanta que a chave do host de retransmissão já exista em ~/.ssh/known_hosts.
  • channels.imessage.configWrites: permite ou nega gravações de configuração iniciadas pelo iMessage.
  • Entradas de nível superior bindings[] com type: "acp" podem vincular conversas do iMessage a sessões persistentes de ACP. Use um identificador normalizado ou alvo explícito de conversa (chat_id:*, chat_guid:*, chat_identifier:*) em match.peer.id. Semântica compartilhada dos campos: ACP Agents.
#!/usr/bin/env bash
exec ssh -T gateway-host imsg "$@"

Matrix

O Matrix é baseado em extensão e configurado em 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",
        },
      },
    },
  },
}
  • A autenticação por token usa accessToken; a autenticação por senha usa userId + password.
  • channels.matrix.proxy roteia o tráfego HTTP do Matrix por um proxy HTTP(S) explícito. Contas nomeadas podem substituí-lo com channels.matrix.accounts.<id>.proxy.
  • channels.matrix.network.dangerouslyAllowPrivateNetwork permite homeservers privados/internos. proxy e essa ativação de rede são controles independentes.
  • channels.matrix.defaultAccount seleciona a conta preferida em configurações com várias contas.
  • channels.matrix.autoJoin usa off por padrão, então salas convidadas e novos convites em estilo DM são ignorados até que você defina autoJoin: "allowlist" com autoJoinAllowlist ou autoJoin: "always".
  • channels.matrix.execApprovals: entrega nativa do Matrix para aprovações de execução e autorização de aprovadores.
    • enabled: true, false ou "auto" (padrão). No modo automático, as aprovações de execução são ativadas quando os aprovadores podem ser resolvidos a partir de approvers ou commands.ownerAllowFrom.
    • approvers: IDs de usuário Matrix (por exemplo @owner:example.org) autorizados a aprovar solicitações de execução.
    • agentFilter: lista de permissões opcional de IDs de agentes. Omita para encaminhar aprovações para todos os agentes.
    • sessionFilter: padrões opcionais de chave de sessão (substring ou regex).
    • target: onde enviar os prompts de aprovação. "dm" (padrão), "channel" (sala de origem) ou "both".
    • Substituições por conta: channels.matrix.accounts.<id>.execApprovals.
  • channels.matrix.dm.sessionScope controla como DMs do Matrix são agrupadas em sessões: per-user (padrão) compartilha por peer roteado, enquanto per-room isola cada sala de DM.
  • Sondas de status do Matrix e pesquisas de diretório ao vivo usam a mesma política de proxy do tráfego de runtime.
  • A configuração completa do Matrix, regras de direcionamento e exemplos de configuração estão documentados em Matrix.

Microsoft Teams

O Microsoft Teams é baseado em extensão e configurado em channels.msteams.
{
  channels: {
    msteams: {
      enabled: true,
      configWrites: true,
      // appId, appPassword, tenantId, webhook, team/channel policies:
      // see /channels/msteams
    },
  },
}
  • Caminhos de chave principais cobertos aqui: channels.msteams, channels.msteams.configWrites.
  • A configuração completa do Teams (credenciais, webhook, política de DM/grupo, substituições por equipe/por canal) está documentada em Microsoft Teams.

IRC

O IRC é baseado em extensão e configurado em 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",
      },
    },
  },
}
  • Caminhos de chave principais cobertos aqui: channels.irc, channels.irc.dmPolicy, channels.irc.configWrites, channels.irc.nickserv.*.
  • O opcional channels.irc.defaultAccount substitui a seleção de conta padrão quando corresponde a um ID de conta configurado.
  • A configuração completa do canal IRC (host/porta/TLS/canais/listas de permissões/bloqueio por menção) está documentada em IRC.

Várias contas (todos os canais)

Execute várias contas por canal (cada uma com seu próprio accountId):
{
  channels: {
    telegram: {
      accounts: {
        default: {
          name: "Primary bot",
          botToken: "123456:ABC...",
        },
        alerts: {
          name: "Alerts bot",
          botToken: "987654:XYZ...",
        },
      },
    },
  },
}
  • default é usado quando accountId é omitido (CLI + roteamento).
  • Tokens de ambiente se aplicam apenas à conta default.
  • As configurações básicas do canal se aplicam a todas as contas, a menos que sejam substituídas por conta.
  • Use bindings[].match.accountId para rotear cada conta para um agente diferente.
  • Se você adicionar uma conta não padrão via openclaw channels add (ou onboarding de canal) enquanto ainda estiver em uma configuração de canal de conta única no nível superior, o OpenClaw primeiro promove os valores de conta única no nível superior com escopo de conta para o mapa de contas do canal, para que a conta original continue funcionando. A maioria dos canais os move para channels.<channel>.accounts.default; o Matrix pode preservar um alvo nomeado/padrão correspondente já existente.
  • Os vínculos existentes apenas de canal (sem accountId) continuam correspondendo à conta padrão; vínculos com escopo de conta continuam opcionais.
  • openclaw doctor --fix também corrige formatos mistos movendo valores de conta única no nível superior com escopo de conta para a conta promovida escolhida para esse canal. A maioria dos canais usa accounts.default; o Matrix pode preservar um alvo nomeado/padrão correspondente já existente.

Outros canais de extensão

Muitos canais de extensão são configurados como channels.<id> e documentados em suas páginas dedicadas de canal (por exemplo Feishu, Matrix, LINE, Nostr, Zalo, Nextcloud Talk, Synology Chat e Twitch). Consulte o índice completo de canais: Channels.

Bloqueio por menção em conversas de grupo

Mensagens de grupo usam exigir menção por padrão (menção por metadados ou padrões regex seguros). Aplica-se a conversas em grupo de WhatsApp, Telegram, Discord, Google Chat e iMessage. Tipos de menção:
  • Menções por metadados: @-mentions nativas da plataforma. Ignoradas no modo de conversa consigo mesmo do WhatsApp.
  • Padrões de texto: padrões regex seguros em agents.list[].groupChat.mentionPatterns. Padrões inválidos e repetições aninhadas inseguras são ignorados.
  • O bloqueio por menção é aplicado apenas quando a detecção é possível (menções nativas ou pelo menos um padrão).
{
  messages: {
    groupChat: { historyLimit: 50 },
  },
  agents: {
    list: [{ id: "main", groupChat: { mentionPatterns: ["@openclaw", "openclaw"] } }],
  },
}
messages.groupChat.historyLimit define o padrão global. Os canais podem substituir com channels.<channel>.historyLimit (ou por conta). Defina 0 para desativar.

Limites de histórico de DM

{
  channels: {
    telegram: {
      dmHistoryLimit: 30,
      dms: {
        "123456789": { historyLimit: 50 },
      },
    },
  },
}
Resolução: substituição por DM → padrão do provedor → sem limite (tudo é mantido). Compatível com: telegram, whatsapp, discord, slack, signal, imessage, msteams.

Modo de conversa consigo mesmo

Inclua seu próprio número em allowFrom para habilitar o modo de conversa consigo mesmo (ignora @-mentions nativas, responde apenas a padrões de texto):
{
  channels: {
    whatsapp: {
      allowFrom: ["+15555550123"],
      groups: { "*": { requireMention: true } },
    },
  },
  agents: {
    list: [
      {
        id: "main",
        groupChat: { mentionPatterns: ["reisponde", "@openclaw"] },
      },
    ],
  },
}

Comandos (tratamento de comandos de 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,
  },
}
  • Este bloco configura superfícies de comando. Para o catálogo atual de comandos internos + bundled, consulte Comandos de barra.
  • Esta página é uma referência de chaves de configuração, não o catálogo completo de comandos. Comandos pertencentes a canais/plugins como QQ Bot /bot-ping /bot-help /bot-logs, LINE /card, device-pair /pair, memory /dreaming, phone-control /phone e Talk /voice estão documentados em suas páginas de canal/plugin, além de Comandos de barra.
  • Comandos de texto devem ser mensagens independentes com / no início.
  • native: "auto" ativa comandos nativos para Discord/Telegram e deixa o Slack desativado.
  • nativeSkills: "auto" ativa comandos nativos de Skills para Discord/Telegram e deixa o Slack desativado.
  • Substituição por canal: channels.discord.commands.native (bool ou "auto"). false limpa comandos registrados anteriormente.
  • Substitua o registro nativo de Skills por canal com channels.<provider>.commands.nativeSkills.
  • channels.telegram.customCommands adiciona entradas extras ao menu do bot do Telegram.
  • bash: true habilita ! <cmd> para o shell do host. Requer tools.elevated.enabled e remetente em tools.elevated.allowFrom.<channel>.
  • config: true habilita /config (lê/grava openclaw.json). Para clientes chat.send do gateway, gravações persistentes de /config set|unset também exigem operator.admin; /config show somente leitura continua disponível para clientes normais de operador com escopo de gravação.
  • mcp: true habilita /mcp para a configuração de servidor MCP gerenciada pelo OpenClaw em mcp.servers.
  • plugins: true habilita /plugins para descoberta de Plugin, instalação e controles de ativação/desativação.
  • channels.<provider>.configWrites controla mutações de configuração por canal (padrão: true).
  • Para canais com várias contas, channels.<provider>.accounts.<id>.configWrites também controla gravações que têm essa conta como alvo (por exemplo /allowlist --config --account <id> ou /config set channels.<provider>.accounts.<id>...).
  • restart: false desativa /restart e ações da ferramenta de reinicialização do gateway. Padrão: true.
  • ownerAllowFrom é a lista explícita de permissões do proprietário para comandos/ferramentas exclusivos do proprietário. Ela é separada de allowFrom.
  • ownerDisplay: "hash" aplica hash aos IDs do proprietário no prompt do sistema. Defina ownerDisplaySecret para controlar o hash.
  • allowFrom é por provedor. Quando definido, é a única fonte de autorização (listas de permissões/pareamento do canal e useAccessGroups são ignorados).
  • useAccessGroups: false permite que comandos ignorem políticas de grupos de acesso quando allowFrom não está definido.
  • Mapa da documentação de comandos:

Padrões do agente

agents.defaults.workspace

Padrão: ~/.openclaw/workspace.
{
  agents: { defaults: { workspace: "~/.openclaw/workspace" } },
}

agents.defaults.repoRoot

Raiz opcional do repositório mostrada na linha Runtime do prompt do sistema. Se não estiver definida, o OpenClaw detecta automaticamente subindo a partir do workspace.
{
  agents: { defaults: { repoRoot: "~/Projects/openclaw" } },
}

agents.defaults.skills

Lista opcional padrão de permissões de Skills para agentes que não definem agents.list[].skills.
{
  agents: {
    defaults: { skills: ["github", "weather"] },
    list: [
      { id: "writer" }, // herda github, weather
      { id: "docs", skills: ["docs-search"] }, // substitui os padrões
      { id: "locked-down", skills: [] }, // sem Skills
    ],
  },
}
  • Omita agents.defaults.skills para Skills irrestritas por padrão.
  • Omita agents.list[].skills para herdar os padrões.
  • Defina agents.list[].skills: [] para nenhuma Skills.
  • Uma lista não vazia em agents.list[].skills é o conjunto final para aquele agente; ela não é mesclada com os padrões.

agents.defaults.skipBootstrap

Desativa a criação automática de arquivos bootstrap do workspace (AGENTS.md, SOUL.md, TOOLS.md, IDENTITY.md, USER.md, HEARTBEAT.md, BOOTSTRAP.md).
{
  agents: { defaults: { skipBootstrap: true } },
}

agents.defaults.contextInjection

Controla quando os arquivos bootstrap do workspace são injetados no prompt do sistema. Padrão: "always".
  • "continuation-skip": turnos seguros de continuação (após uma resposta concluída do assistente) ignoram a reinjeção do bootstrap do workspace, reduzindo o tamanho do prompt. Execuções de Heartbeat e novas tentativas após Compaction ainda recriam o contexto.
{
  agents: { defaults: { contextInjection: "continuation-skip" } },
}

agents.defaults.bootstrapMaxChars

Máximo de caracteres por arquivo bootstrap do workspace antes do truncamento. Padrão: 12000.
{
  agents: { defaults: { bootstrapMaxChars: 12000 } },
}

agents.defaults.bootstrapTotalMaxChars

Máximo total de caracteres injetados em todos os arquivos bootstrap do workspace. Padrão: 60000.
{
  agents: { defaults: { bootstrapTotalMaxChars: 60000 } },
}

agents.defaults.bootstrapPromptTruncationWarning

Controla o texto de aviso visível ao agente quando o contexto bootstrap é truncado. Padrão: "once".
  • "off": nunca injeta texto de aviso no prompt do sistema.
  • "once": injeta o aviso uma vez por assinatura única de truncamento (recomendado).
  • "always": injeta o aviso em toda execução quando houver truncamento.
{
  agents: { defaults: { bootstrapPromptTruncationWarning: "once" } }, // off | once | always
}

Mapa de propriedade do orçamento de contexto

O OpenClaw tem vários orçamentos de prompt/contexto de alto volume, e eles são intencionalmente divididos por subsistema em vez de passarem todos por um único ajuste genérico.
  • agents.defaults.bootstrapMaxChars / agents.defaults.bootstrapTotalMaxChars: injeção normal de bootstrap do workspace.
  • agents.defaults.startupContext.*: prelúdio de inicialização único de /new e /reset, incluindo arquivos recentes memory/*.md diários.
  • skills.limits.*: a lista compacta de Skills injetada no prompt do sistema.
  • agents.defaults.contextLimits.*: trechos limitados em runtime e blocos injetados pertencentes ao runtime.
  • memory.qmd.limits.*: dimensionamento de snippets e injeção de busca de memória indexada.
Use a substituição correspondente por agente somente quando um agente precisar de um orçamento diferente:
  • agents.list[].skillsLimits.maxSkillsPromptChars
  • agents.list[].contextLimits.*

agents.defaults.startupContext

Controla o prelúdio de inicialização do primeiro turno injetado em execuções simples de /new e /reset.
{
  agents: {
    defaults: {
      startupContext: {
        enabled: true,
        applyOn: ["new", "reset"],
        dailyMemoryDays: 2,
        maxFileBytes: 16384,
        maxFileChars: 1200,
        maxTotalChars: 2800,
      },
    },
  },
}

agents.defaults.contextLimits

Padrões compartilhados para superfícies de contexto limitadas em runtime.
{
  agents: {
    defaults: {
      contextLimits: {
        memoryGetMaxChars: 12000,
        memoryGetDefaultLines: 120,
        toolResultMaxChars: 16000,
        postCompactionMaxChars: 1800,
      },
    },
  },
}
  • memoryGetMaxChars: limite padrão de trecho de memory_get antes que metadados de truncamento e aviso de continuação sejam adicionados.
  • memoryGetDefaultLines: janela padrão de linhas de memory_get quando lines é omitido.
  • toolResultMaxChars: limite em tempo real de resultado de ferramenta usado para resultados persistidos e recuperação de overflow.
  • postCompactionMaxChars: limite de trecho de AGENTS.md usado durante a injeção de atualização pós-Compaction.

agents.list[].contextLimits

Substituição por agente para os ajustes compartilhados de contextLimits. Campos omitidos herdam de agents.defaults.contextLimits.
{
  agents: {
    defaults: {
      contextLimits: {
        memoryGetMaxChars: 12000,
        toolResultMaxChars: 16000,
      },
    },
    list: [
      {
        id: "tiny-local",
        contextLimits: {
          memoryGetMaxChars: 6000,
          toolResultMaxChars: 8000,
        },
      },
    ],
  },
}

skills.limits.maxSkillsPromptChars

Limite global para a lista compacta de Skills injetada no prompt do sistema. Isso não afeta a leitura de arquivos SKILL.md sob demanda.
{
  skills: {
    limits: {
      maxSkillsPromptChars: 18000,
    },
  },
}

agents.list[].skillsLimits.maxSkillsPromptChars

Substituição por agente para o orçamento de prompt de Skills.
{
  agents: {
    list: [
      {
        id: "tiny-local",
        skillsLimits: {
          maxSkillsPromptChars: 6000,
        },
      },
    ],
  },
}

agents.defaults.imageMaxDimensionPx

Tamanho máximo em pixels do lado mais longo da imagem em blocos de imagem de transcript/ferramenta antes de chamadas ao provedor. Padrão: 1200. Valores menores geralmente reduzem o uso de tokens de visão e o tamanho da carga da solicitação em execuções com muitas capturas de tela. Valores maiores preservam mais detalhes visuais.
{
  agents: { defaults: { imageMaxDimensionPx: 1200 } },
}

agents.defaults.userTimezone

Fuso horário para o contexto do prompt do sistema (não os timestamps das mensagens). Usa o fuso horário do host como fallback.
{
  agents: { defaults: { userTimezone: "America/Chicago" } },
}

agents.defaults.timeFormat

Formato de hora no prompt do sistema. Padrão: auto (preferência do SO).
{
  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" }, // parâmetros globais padrão do provedor
      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: aceita uma string ("provider/model") ou um objeto ({ primary, fallbacks }).
    • A forma string define apenas o modelo principal.
    • A forma objeto define o principal mais modelos ordenados de failover.
  • imageModel: aceita uma string ("provider/model") ou um objeto ({ primary, fallbacks }).
    • Usado pelo caminho da ferramenta image como sua configuração de modelo de visão.
    • Também usado como roteamento de fallback quando o modelo selecionado/padrão não aceita entrada de imagem.
  • imageGenerationModel: aceita uma string ("provider/model") ou um objeto ({ primary, fallbacks }).
    • Usado pela capacidade compartilhada de geração de imagem e por qualquer futura superfície de ferramenta/Plugin que gere imagens.
    • Valores típicos: google/gemini-3.1-flash-image-preview para geração nativa de imagem do Gemini, fal/fal-ai/flux/dev para fal, ou openai/gpt-image-1 para OpenAI Images.
    • Se você selecionar diretamente um provider/model, configure também a autenticação/chave de API correspondente do provedor (por exemplo GEMINI_API_KEY ou GOOGLE_API_KEY para google/*, OPENAI_API_KEY para openai/*, FAL_KEY para fal/*).
    • Se omitido, image_generate ainda pode inferir um padrão de provedor com autenticação. Ele tenta primeiro o provedor padrão atual, depois os provedores restantes de geração de imagem registrados na ordem do ID do provedor.
  • musicGenerationModel: aceita uma string ("provider/model") ou um objeto ({ primary, fallbacks }).
    • Usado pela capacidade compartilhada de geração de música e pela ferramenta interna music_generate.
    • Valores típicos: google/lyria-3-clip-preview, google/lyria-3-pro-preview ou minimax/music-2.5+.
    • Se omitido, music_generate ainda pode inferir um padrão de provedor com autenticação. Ele tenta primeiro o provedor padrão atual, depois os provedores restantes de geração de música registrados na ordem do ID do provedor.
    • Se você selecionar diretamente um provider/model, configure também a autenticação/chave de API correspondente do provedor.
  • videoGenerationModel: aceita uma string ("provider/model") ou um objeto ({ primary, fallbacks }).
    • Usado pela capacidade compartilhada de geração de vídeo e pela ferramenta interna video_generate.
    • Valores típicos: qwen/wan2.6-t2v, qwen/wan2.6-i2v, qwen/wan2.6-r2v, qwen/wan2.6-r2v-flash ou qwen/wan2.7-r2v.
    • Se omitido, video_generate ainda pode inferir um padrão de provedor com autenticação. Ele tenta primeiro o provedor padrão atual, depois os provedores restantes de geração de vídeo registrados na ordem do ID do provedor.
    • Se você selecionar diretamente um provider/model, configure também a autenticação/chave de API correspondente do provedor.
    • O provedor bundled de geração de vídeo Qwen oferece suporte a até 1 vídeo de saída, 1 imagem de entrada, 4 vídeos de entrada, duração de 10 segundos e opções no nível do provedor size, aspectRatio, resolution, audio e watermark.
  • pdfModel: aceita uma string ("provider/model") ou um objeto ({ primary, fallbacks }).
    • Usado pela ferramenta pdf para roteamento de modelo.
    • Se omitido, a ferramenta PDF recorre a imageModel e depois ao modelo padrão/de sessão resolvido.
  • pdfMaxBytesMb: limite padrão de tamanho de PDF para a ferramenta pdf quando maxBytesMb não é passado no momento da chamada.
  • pdfMaxPages: máximo padrão de páginas consideradas pelo modo de fallback de extração na ferramenta pdf.
  • verboseDefault: nível verbose padrão para agentes. Valores: "off", "on", "full". Padrão: "off".
  • elevatedDefault: nível padrão de saída elevada para agentes. Valores: "off", "on", "ask", "full". Padrão: "on".
  • model.primary: formato provider/model (por exemplo openai/gpt-5.4). Se você omitir o provedor, o OpenClaw primeiro tenta um alias, depois uma correspondência exclusiva de provedor configurado para esse ID de modelo exato e só então recorre ao provedor padrão configurado (comportamento de compatibilidade obsoleto, então prefira provider/model explícito). Se esse provedor não expuser mais o modelo padrão configurado, o OpenClaw recorre ao primeiro provider/model configurado em vez de expor um padrão obsoleto de provedor removido.
  • models: o catálogo de modelos configurado e a lista de permissões para /model. Cada entrada pode incluir alias (atalho) e params (específicos do provedor, por exemplo temperature, maxTokens, cacheRetention, context1m).
  • params: parâmetros globais padrão do provedor aplicados a todos os modelos. Defina em agents.defaults.params (por exemplo { cacheRetention: "long" }).
  • Precedência de mesclagem de params (configuração): agents.defaults.params (base global) é substituído por agents.defaults.models["provider/model"].params (por modelo), então agents.list[].params (ID do agente correspondente) substitui por chave. Consulte Prompt Caching para detalhes.
  • embeddedHarness: política padrão do runtime incorporado de baixo nível do agente. Use runtime: "auto" para permitir que harnesses de Plugin registrados assumam modelos compatíveis, runtime: "pi" para forçar o harness PI interno, ou um ID de harness registrado como runtime: "codex". Defina fallback: "none" para desativar o fallback automático para PI.
  • Gravadores de configuração que alteram esses campos (por exemplo /models set, /models set-image e comandos de adicionar/remover fallback) salvam a forma canônica de objeto e preservam listas de fallback existentes quando possível.
  • maxConcurrent: máximo de execuções paralelas de agentes entre sessões (cada sessão ainda é serializada). Padrão: 4.

agents.defaults.embeddedHarness

embeddedHarness controla qual executor de baixo nível executa turnos de agentes incorporados. A maioria das implantações deve manter o padrão { runtime: "auto", fallback: "pi" }. Use isso quando um Plugin confiável fornecer um harness nativo, como o harness bundled Codex app-server.
{
  agents: {
    defaults: {
      model: "codex/gpt-5.4",
      embeddedHarness: {
        runtime: "codex",
        fallback: "none",
      },
    },
  },
}
  • runtime: "auto", "pi" ou um ID de harness de Plugin registrado. O Plugin bundled Codex registra codex.
  • fallback: "pi" ou "none". "pi" mantém o harness PI interno como fallback de compatibilidade. "none" faz com que a seleção ausente ou não compatível de harness de Plugin falhe em vez de usar PI silenciosamente.
  • Substituições por ambiente: OPENCLAW_AGENT_RUNTIME=<id|auto|pi> substitui runtime; OPENCLAW_AGENT_HARNESS_FALLBACK=none desativa o fallback para PI nesse processo.
  • Para implantações somente Codex, defina model: "codex/gpt-5.4", embeddedHarness.runtime: "codex" e embeddedHarness.fallback: "none".
  • Isso controla apenas o harness de chat incorporado. Geração de mídia, visão, PDF, música, vídeo e TTS ainda usam suas configurações de provider/model.
Atalhos internos de alias (aplicam-se apenas quando o modelo está em agents.defaults.models):
AliasModelo
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
Seus aliases configurados sempre prevalecem sobre os padrões. Modelos GLM-4.x da Z.AI ativam automaticamente o modo thinking, a menos que você defina --thinking off ou configure agents.defaults.models["zai/<model>"].params.thinking por conta própria. Modelos Z.AI ativam tool_stream por padrão para streaming de chamadas de ferramenta. Defina agents.defaults.models["zai/<model>"].params.tool_stream como false para desativá-lo. Modelos Claude 4.6 da Anthropic usam adaptive como padrão para thinking quando nenhum nível explícito é definido.

agents.defaults.cliBackends

Backends CLI opcionais para execuções de fallback somente texto (sem chamadas de ferramenta). Úteis como backup quando provedores de API falham.
{
  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",
        },
      },
    },
  },
}
  • Backends CLI são voltados principalmente para texto; ferramentas sempre ficam desativadas.
  • Sessões são compatíveis quando sessionArg está definido.
  • Pass-through de imagem é compatível quando imageArg aceita caminhos de arquivo.

agents.defaults.systemPromptOverride

Substitui todo o prompt do sistema montado pelo OpenClaw por uma string fixa. Defina no nível padrão (agents.defaults.systemPromptOverride) ou por agente (agents.list[].systemPromptOverride). Valores por agente têm precedência; um valor vazio ou apenas com espaços em branco é ignorado. Útil para experimentos controlados de prompt.
{
  agents: {
    defaults: {
      systemPromptOverride: "You are a helpful assistant.",
    },
  },
}

agents.defaults.heartbeat

Execuções periódicas de Heartbeat.
{
  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: string de duração (ms/s/m/h). Padrão: 30m (autenticação por chave de API) ou 1h (autenticação OAuth). Defina 0m para desativar.
  • includeSystemPromptSection: quando false, omite a seção Heartbeat do prompt do sistema e ignora a injeção de HEARTBEAT.md no contexto bootstrap. Padrão: true.
  • suppressToolErrorWarnings: quando true, suprime cargas de aviso de erro de ferramenta durante execuções de Heartbeat.
  • timeoutSeconds: tempo máximo em segundos permitido para um turno de agente de Heartbeat antes de ser abortado. Deixe sem definir para usar agents.defaults.timeoutSeconds.
  • directPolicy: política de entrega direta/DM. allow (padrão) permite entrega a alvo direto. block suprime entrega a alvo direto e emite reason=dm-blocked.
  • lightContext: quando true, execuções de Heartbeat usam contexto bootstrap leve e mantêm apenas HEARTBEAT.md dos arquivos bootstrap do workspace.
  • isolatedSession: quando true, cada Heartbeat é executado em uma sessão nova sem histórico prévio de conversa. Mesmo padrão de isolamento de Cron sessionTarget: "isolated". Reduz o custo de tokens por Heartbeat de ~100K para ~2-5K tokens.
  • Por agente: defina agents.list[].heartbeat. Quando qualquer agente define heartbeat, somente esses agentes executam Heartbeat.
  • Heartbeats executam turnos completos de agente — intervalos mais curtos consomem mais tokens.

agents.defaults.compaction

{
  agents: {
    defaults: {
      compaction: {
        mode: "safeguard", // default | safeguard
        provider: "my-provider", // id of a registered compaction provider plugin (optional)
        timeoutSeconds: 900,
        reserveTokensFloor: 24000,
        identifierPolicy: "strict", // strict | off | custom
        identifierInstructions: "Preserve deployment IDs, ticket IDs, and host:port pairs exactly.", // used when identifierPolicy=custom
        postCompactionSections: ["Session Startup", "Red Lines"], // [] disables reinjection
        model: "openrouter/anthropic/claude-sonnet-4-6", // optional compaction-only model override
        notifyUser: true, // send a brief notice when compaction starts (default: false)
        memoryFlush: {
          enabled: true,
          softThresholdTokens: 6000,
          systemPrompt: "Session nearing compaction. Store durable memories now.",
          prompt: "Write any lasting notes to memory/YYYY-MM-DD.md; reply with the exact silent token NO_REPLY if nothing to store.",
        },
      },
    },
  },
}
  • mode: default ou safeguard (resumo em partes para históricos longos). Consulte Compaction.
  • provider: ID de um Plugin de provedor de Compaction registrado. Quando definido, summarize() do provedor é chamado em vez do resumo LLM interno. Em caso de falha, recorre ao interno. Definir um provedor força mode: "safeguard". Consulte Compaction.
  • timeoutSeconds: máximo de segundos permitidos para uma única operação de Compaction antes que o OpenClaw a interrompa. Padrão: 900.
  • identifierPolicy: strict (padrão), off ou custom. strict adiciona instruções internas de preservação de identificadores opacos durante o resumo de Compaction.
  • identifierInstructions: texto opcional personalizado de preservação de identificadores usado quando identifierPolicy=custom.
  • postCompactionSections: nomes opcionais de seções H2/H3 de AGENTS.md para reinjetar após Compaction. O padrão é ["Session Startup", "Red Lines"]; defina [] para desativar a reinjeção. Quando não definido ou explicitamente definido para esse par padrão, cabeçalhos antigos Every Session/Safety também são aceitos como fallback legado.
  • model: substituição opcional de provider/model-id apenas para resumo de Compaction. Use isso quando a sessão principal deve manter um modelo, mas os resumos de Compaction devem executar em outro; quando não definido, a Compaction usa o modelo principal da sessão.
  • notifyUser: quando true, envia um breve aviso ao usuário quando a Compaction começa (por exemplo, “Compactando contexto…”). Desativado por padrão para manter a Compaction silenciosa.
  • memoryFlush: turno agentic silencioso antes da auto-Compaction para armazenar memórias duráveis. Ignorado quando o workspace é somente leitura.

agents.defaults.contextPruning

Remove resultados antigos de ferramentas do contexto em memória antes de enviar ao LLM. Não modifica o histórico da sessão em disco.
{
  agents: {
    defaults: {
      contextPruning: {
        mode: "cache-ttl", // off | cache-ttl
        ttl: "1h", // duration (ms/s/m/h), default unit: minutes
        keepLastAssistants: 3,
        softTrimRatio: 0.3,
        hardClearRatio: 0.5,
        minPrunableToolChars: 50000,
        softTrim: { maxChars: 4000, headChars: 1500, tailChars: 1500 },
        hardClear: { enabled: true, placeholder: "[Old tool result content cleared]" },
        tools: { deny: ["browser", "canvas"] },
      },
    },
  },
}
  • mode: "cache-ttl" habilita passagens de poda.
  • ttl controla com que frequência a poda pode ser executada novamente (após o último toque no cache).
  • A poda primeiro faz um corte suave em resultados de ferramentas superdimensionados e depois limpa completamente resultados mais antigos, se necessário.
Corte suave mantém o início + o fim e insere ... no meio.Limpeza completa substitui todo o resultado da ferramenta pelo placeholder.Observações:
  • Blocos de imagem nunca são cortados/limpos.
  • As proporções são baseadas em caracteres (aproximadas), não em contagens exatas de tokens.
  • Se existirem menos de keepLastAssistants mensagens do assistente, a poda é ignorada.
Consulte Session Pruning para detalhes de comportamento.

Streaming em blocos

{
  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 (use minMs/maxMs)
    },
  },
}
  • Canais que não sejam Telegram exigem *.blockStreaming: true explícito para habilitar respostas em bloco.
  • Substituições por canal: channels.<channel>.blockStreamingCoalesce (e variantes por conta). Signal/Slack/Discord/Google Chat usam por padrão minChars: 1500.
  • humanDelay: pausa aleatória entre respostas em bloco. natural = 800–2500ms. Substituição por agente: agents.list[].humanDelay.
Consulte Streaming para detalhes de comportamento + fragmentação.

Indicadores de digitação

{
  agents: {
    defaults: {
      typingMode: "instant", // never | instant | thinking | message
      typingIntervalSeconds: 6,
    },
  },
}
  • Padrões: instant para conversas diretas/menções, message para conversas em grupo sem menção.
  • Substituições por sessão: session.typingMode, session.typingIntervalSeconds.
Consulte Typing Indicators.

agents.defaults.sandbox

Sandbox opcional para o agente incorporado. Consulte Sandboxing para o guia completo.
{
  agents: {
    defaults: {
      sandbox: {
        mode: "non-main", // off | non-main | all
        backend: "docker", // docker | ssh | openshell
        scope: "agent", // session | agent | shared
        workspaceAccess: "none", // none | ro | rw
        workspaceRoot: "~/.openclaw/sandboxes",
        docker: {
          image: "openclaw-sandbox:bookworm-slim",
          containerPrefix: "openclaw-sbx-",
          workdir: "/workspace",
          readOnlyRoot: true,
          tmpfs: ["/tmp", "/var/tmp", "/run"],
          network: "none",
          user: "1000:1000",
          capDrop: ["ALL"],
          env: { LANG: "C.UTF-8" },
          setupCommand: "apt-get update && apt-get install -y git curl jq",
          pidsLimit: 256,
          memory: "1g",
          memorySwap: "2g",
          cpus: 1,
          ulimits: {
            nofile: { soft: 1024, hard: 2048 },
            nproc: 256,
          },
          seccompProfile: "/path/to/seccomp.json",
          apparmorProfile: "openclaw-sandbox",
          dns: ["1.1.1.1", "8.8.8.8"],
          extraHosts: ["internal.service:10.0.0.5"],
          binds: ["/home/user/source:/source:rw"],
        },
        ssh: {
          target: "user@gateway-host:22",
          command: "ssh",
          workspaceRoot: "/tmp/openclaw-sandboxes",
          strictHostKeyChecking: true,
          updateHostKeys: true,
          identityFile: "~/.ssh/id_ed25519",
          certificateFile: "~/.ssh/id_ed25519-cert.pub",
          knownHostsFile: "~/.ssh/known_hosts",
          // SecretRefs / inline contents also supported:
          // 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 local (padrão)
  • ssh: runtime remoto genérico baseado em SSH
  • openshell: runtime OpenShell
Quando backend: "openshell" é selecionado, as configurações específicas do runtime vão para plugins.entries.openshell.config.Configuração do backend SSH:
  • target: destino SSH no formato user@host[:port]
  • command: comando do cliente SSH (padrão: ssh)
  • workspaceRoot: raiz remota absoluta usada para workspaces por escopo
  • identityFile / certificateFile / knownHostsFile: arquivos locais existentes passados ao OpenSSH
  • identityData / certificateData / knownHostsData: conteúdo embutido ou SecretRefs que o OpenClaw materializa em arquivos temporários em runtime
  • strictHostKeyChecking / updateHostKeys: ajustes de política de chave de host do OpenSSH
Precedência de autenticação SSH:
  • identityData prevalece sobre identityFile
  • certificateData prevalece sobre certificateFile
  • knownHostsData prevalece sobre knownHostsFile
  • Valores *Data baseados em SecretRef são resolvidos a partir do snapshot ativo do runtime de segredos antes do início da sessão do sandbox
Comportamento do backend SSH:
  • inicializa o workspace remoto uma vez após criar ou recriar
  • depois mantém o workspace SSH remoto como canônico
  • roteia exec, ferramentas de arquivo e caminhos de mídia por SSH
  • não sincroniza automaticamente mudanças remotas de volta para o host
  • não oferece suporte a contêineres de navegador no sandbox
Acesso ao workspace:
  • none: workspace do sandbox por escopo em ~/.openclaw/sandboxes
  • ro: workspace do sandbox em /workspace, workspace do agente montado como somente leitura em /agent
  • rw: workspace do agente montado em leitura/gravação em /workspace
Escopo:
  • session: contêiner + workspace por sessão
  • agent: um contêiner + workspace por agente (padrão)
  • shared: contêiner e workspace compartilhados (sem isolamento entre sessões)
Configuração do Plugin OpenShell:
{
  plugins: {
    entries: {
      openshell: {
        enabled: true,
        config: {
          mode: "mirror", // mirror | remote
          from: "openclaw",
          remoteWorkspaceDir: "/sandbox",
          remoteAgentWorkspaceDir: "/agent",
          gateway: "lab", // optional
          gatewayEndpoint: "https://lab.example", // optional
          policy: "strict", // optional OpenShell policy id
          providers: ["openai"], // optional
          autoProviders: true,
          timeoutSeconds: 120,
        },
      },
    },
  },
}
Modo OpenShell:
  • mirror: inicializa o remoto a partir do local antes de exec, sincroniza de volta após exec; o workspace local continua sendo o canônico
  • remote: inicializa o remoto uma vez quando o sandbox é criado e depois mantém o workspace remoto como canônico
No modo remote, edições locais no host feitas fora do OpenClaw não são sincronizadas automaticamente para o sandbox após a etapa de inicialização. O transporte é SSH para dentro do sandbox OpenShell, mas o Plugin controla o ciclo de vida do sandbox e a sincronização opcional de espelho.setupCommand é executado uma vez após a criação do contêiner (via sh -lc). Precisa de saída de rede, raiz gravável e usuário root.Os contêineres usam network: "none" por padrão — defina como "bridge" (ou uma rede bridge personalizada) se o agente precisar de acesso de saída. "host" é bloqueado. "container:<id>" é bloqueado por padrão, a menos que você defina explicitamente sandbox.docker.dangerouslyAllowContainerNamespaceJoin: true (break-glass).Anexos recebidos são preparados em media/inbound/* no workspace ativo.docker.binds monta diretórios adicionais do host; montagens globais e por agente são mescladas.Navegador em sandbox (sandbox.browser.enabled): Chromium + CDP em um contêiner. URL do noVNC injetada no prompt do sistema. Não requer browser.enabled em openclaw.json. O acesso de observador no noVNC usa autenticação VNC por padrão, e o OpenClaw emite uma URL com token de curta duração (em vez de expor a senha na URL compartilhada).
  • allowHostControl: false (padrão) bloqueia sessões em sandbox de terem como alvo o navegador do host.
  • network usa openclaw-sandbox-browser por padrão (rede bridge dedicada). Defina como bridge apenas quando você quiser explicitamente conectividade global de bridge.
  • cdpSourceRange restringe opcionalmente a entrada de CDP na borda do contêiner a um intervalo CIDR (por exemplo 172.21.0.1/32).
  • sandbox.browser.binds monta diretórios adicionais do host apenas no contêiner do navegador em sandbox. Quando definido (incluindo []), substitui docker.binds para o contêiner do navegador.
  • Os padrões de inicialização são definidos em scripts/sandbox-browser-entrypoint.sh e ajustados para hosts com contêiner:
    • --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 (ativado por padrão)
    • --disable-3d-apis, --disable-software-rasterizer e --disable-gpu são ativados por padrão e podem ser desativados com OPENCLAW_BROWSER_DISABLE_GRAPHICS_FLAGS=0 se o uso de WebGL/3D exigir isso.
    • OPENCLAW_BROWSER_DISABLE_EXTENSIONS=0 reabilita extensões se seu fluxo de trabalho depender delas.
    • --renderer-process-limit=2 pode ser alterado com OPENCLAW_BROWSER_RENDERER_PROCESS_LIMIT=<N>; defina 0 para usar o limite de processos padrão do Chromium.
    • mais --no-sandbox e --disable-setuid-sandbox quando noSandbox estiver ativado.
    • Os padrões são a linha de base da imagem do contêiner; use uma imagem de navegador personalizada com um entrypoint personalizado para alterar os padrões do contêiner.
O sandbox de navegador e sandbox.docker.binds são compatíveis apenas com Docker. Criar imagens:
scripts/sandbox-setup.sh           # imagem principal do sandbox
scripts/sandbox-browser-setup.sh   # imagem opcional do navegador

agents.list (substituições por agente)

{
  agents: {
    list: [
      {
        id: "main",
        default: true,
        name: "Main Agent",
        workspace: "~/.openclaw/workspace",
        agentDir: "~/.openclaw/agents/main/agent",
        model: "anthropic/claude-opus-4-6", // or { primary, fallbacks }
        thinkingDefault: "high", // per-agent thinking level override
        reasoningDefault: "on", // per-agent reasoning visibility override
        fastModeDefault: false, // per-agent fast mode override
        embeddedHarness: { runtime: "auto", fallback: "pi" },
        params: { cacheRetention: "none" }, // overrides matching defaults.models params by key
        skills: ["docs-search"], // replaces agents.defaults.skills when set
        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 estável do agente (obrigatório).
  • default: quando vários são definidos, o primeiro prevalece (aviso registrado). Se nenhum for definido, a primeira entrada da lista é o padrão.
  • model: a forma string substitui apenas primary; a forma objeto { primary, fallbacks } substitui ambos ([] desativa fallbacks globais). Jobs Cron que substituem apenas primary ainda herdam os fallbacks padrão, a menos que você defina fallbacks: [].
  • params: parâmetros de stream por agente mesclados sobre a entrada de modelo selecionada em agents.defaults.models. Use isto para substituições específicas do agente, como cacheRetention, temperature ou maxTokens, sem duplicar todo o catálogo de modelos.
  • skills: lista opcional de permissões de Skills por agente. Se omitida, o agente herda agents.defaults.skills quando definido; uma lista explícita substitui os padrões em vez de mesclar, e [] significa nenhuma Skills.
  • thinkingDefault: nível thinking padrão opcional por agente (off | minimal | low | medium | high | xhigh | adaptive). Substitui agents.defaults.thinkingDefault para este agente quando nenhuma substituição por mensagem ou sessão estiver definida.
  • reasoningDefault: visibilidade reasoning padrão opcional por agente (on | off | stream). Aplica-se quando nenhuma substituição de reasoning por mensagem ou sessão estiver definida.
  • fastModeDefault: padrão opcional por agente para modo rápido (true | false). Aplica-se quando nenhuma substituição de modo rápido por mensagem ou sessão estiver definida.
  • embeddedHarness: substituição opcional por agente para a política de harness de baixo nível. Use { runtime: "codex", fallback: "none" } para tornar um agente exclusivo do Codex enquanto outros agentes mantêm o fallback PI padrão.
  • runtime: descritor opcional de runtime por agente. Use type: "acp" com padrões de runtime.acp (agent, backend, mode, cwd) quando o agente deve usar sessões de harness ACP por padrão.
  • identity.avatar: caminho relativo ao workspace, URL http(s) ou URI data:.
  • identity deriva padrões: ackReaction de emoji, mentionPatterns de name/emoji.
  • subagents.allowAgents: lista de permissões de IDs de agentes para sessions_spawn (["*"] = qualquer; padrão: apenas o mesmo agente).
  • Proteção de herança de sandbox: se a sessão solicitante estiver em sandbox, sessions_spawn rejeita alvos que seriam executados sem sandbox.
  • subagents.requireAgentId: quando true, bloqueia chamadas sessions_spawn que omitem agentId (força seleção explícita de perfil; padrão: false).

Roteamento multiagente

Execute vários agentes isolados dentro de um Gateway. Consulte 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" } },
  ],
}

Campos de correspondência de binding

  • type (opcional): route para roteamento normal (tipo ausente assume route), acp para vínculos persistentes de conversa ACP.
  • match.channel (obrigatório)
  • match.accountId (opcional; * = qualquer conta; omitido = conta padrão)
  • match.peer (opcional; { kind: direct|group|channel, id })
  • match.guildId / match.teamId (opcional; específico do canal)
  • acp (opcional; apenas para entradas type: "acp"): { mode, label, cwd, backend }
Ordem determinística de correspondência:
  1. match.peer
  2. match.guildId
  3. match.teamId
  4. match.accountId (exato, sem peer/guild/team)
  5. match.accountId: "*" (em todo o canal)
  6. Agente padrão
Dentro de cada nível, a primeira entrada correspondente em bindings prevalece. Para entradas type: "acp", o OpenClaw resolve por identidade exata da conversa (match.channel + conta + match.peer.id) e não usa a ordem de níveis de binding de rota acima.

Perfis de acesso por 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",
          ],
        },
      },
    ],
  },
}
Consulte Multi-Agent Sandbox & Tools para detalhes de precedência.

Sessão

{
  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, // skip parent-thread fork above this token count (0 disables)
    maintenance: {
      mode: "warn", // warn | enforce
      pruneAfter: "30d",
      maxEntries: 500,
      rotateBytes: "10mb",
      resetArchiveRetention: "30d", // duration or false
      maxDiskBytes: "500mb", // optional hard budget
      highWaterBytes: "400mb", // optional cleanup target
    },
    threadBindings: {
      enabled: true,
      idleHours: 24, // default inactivity auto-unfocus in hours (`0` disables)
      maxAgeHours: 0, // default hard max age in hours (`0` disables)
    },
    mainKey: "main", // legacy (runtime always uses "main")
    agentToAgent: { maxPingPongTurns: 5 },
    sendPolicy: {
      rules: [{ action: "deny", match: { channel: "discord", chatType: "group" } }],
      default: "allow",
    },
  },
}
  • scope: estratégia base de agrupamento de sessões para contextos de conversa em grupo.
    • per-sender (padrão): cada remetente recebe uma sessão isolada dentro de um contexto de canal.
    • global: todos os participantes em um contexto de canal compartilham uma única sessão (use apenas quando o contexto compartilhado for intencional).
  • dmScope: como DMs são agrupadas.
    • main: todas as DMs compartilham a sessão principal.
    • per-peer: isola por ID do remetente entre canais.
    • per-channel-peer: isola por canal + remetente (recomendado para caixas de entrada com vários usuários).
    • per-account-channel-peer: isola por conta + canal + remetente (recomendado para várias contas).
  • identityLinks: mapeia IDs canônicos para peers com prefixo de provedor para compartilhamento de sessão entre canais.
  • reset: política principal de redefinição. daily redefine em atHour no horário local; idle redefine após idleMinutes. Quando ambos estão configurados, o que expirar primeiro prevalece.
  • resetByType: substituições por tipo (direct, group, thread). O legado dm é aceito como alias para direct.
  • parentForkMaxTokens: totalTokens máximo permitido na sessão pai ao criar uma sessão de thread bifurcada (padrão 100000).
    • Se totalTokens da sessão pai estiver acima desse valor, o OpenClaw inicia uma nova sessão de thread em vez de herdar o histórico da transcrição da sessão pai.
    • Defina 0 para desativar essa proteção e sempre permitir bifurcação da sessão pai.
  • mainKey: campo legado. O runtime sempre usa "main" para o bucket principal de chat direto.
  • agentToAgent.maxPingPongTurns: número máximo de turnos de resposta entre agentes durante trocas entre agentes (inteiro, intervalo: 05). 0 desativa o encadeamento ping-pong.
  • sendPolicy: correspondência por channel, chatType (direct|group|channel, com alias legado dm), keyPrefix ou rawKeyPrefix. A primeira negação prevalece.
  • maintenance: controles de limpeza + retenção do armazenamento de sessões.
    • mode: warn emite apenas avisos; enforce aplica a limpeza.
    • pruneAfter: limite de idade para entradas obsoletas (padrão 30d).
    • maxEntries: número máximo de entradas em sessions.json (padrão 500).
    • rotateBytes: rotaciona sessions.json quando ele excede esse tamanho (padrão 10mb).
    • resetArchiveRetention: retenção para arquivos de transcrição *.reset.<timestamp>. Usa pruneAfter por padrão; defina false para desativar.
    • maxDiskBytes: orçamento opcional de disco para o diretório de sessões. No modo warn, registra avisos; no modo enforce, remove primeiro os artefatos/sessões mais antigos.
    • highWaterBytes: alvo opcional após a limpeza do orçamento. O padrão é 80% de maxDiskBytes.
  • threadBindings: padrões globais para recursos de sessão vinculados a thread.
    • enabled: chave mestre padrão (provedores podem substituir; o Discord usa channels.discord.threadBindings.enabled)
    • idleHours: desfoco automático padrão por inatividade em horas (0 desativa; provedores podem substituir)
    • maxAgeHours: idade máxima rígida padrão em horas (0 desativa; provedores podem substituir)

Mensagens

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

Prefixo de resposta

Substituições por canal/conta: channels.<channel>.responsePrefix, channels.<channel>.accounts.<id>.responsePrefix. Resolução (a mais específica prevalece): conta → canal → global. "" desativa e interrompe a cascata. "auto" deriva [{identity.name}]. Variáveis de template:
VariávelDescriçãoExemplo
{model}Nome curto do modeloclaude-opus-4-6
{modelFull}Identificador completo do modeloanthropic/claude-opus-4-6
{provider}Nome do provedoranthropic
{thinkingLevel}Nível atual de thinkinghigh, low, off
{identity.name}Nome de identidade do agente(igual a "auto")
As variáveis não diferenciam maiúsculas de minúsculas. {think} é um alias de {thinkingLevel}.

Reação de confirmação

  • Usa por padrão identity.emoji do agente ativo; caso contrário, "👀". Defina "" para desativar.
  • Substituições por canal: channels.<channel>.ackReaction, channels.<channel>.accounts.<id>.ackReaction.
  • Ordem de resolução: conta → canal → messages.ackReaction → fallback de identidade.
  • Escopo: group-mentions (padrão), group-all, direct, all.
  • removeAckAfterReply: remove a confirmação após a resposta no Slack, Discord e Telegram.
  • messages.statusReactions.enabled: habilita reações de status do ciclo de vida no Slack, Discord e Telegram. No Slack e no Discord, se não estiver definido, mantém reações de status habilitadas quando reações de confirmação estão ativas. No Telegram, defina explicitamente como true para habilitar reações de status do ciclo de vida.

Debounce de entrada

Agrupa mensagens rápidas somente de texto do mesmo remetente em um único turno do agente. Mídia/anexos são descarregados imediatamente. Comandos de controle ignoram o debounce.

TTS (texto para fala)

{
  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 controla o modo padrão de auto-TTS: off, always, inbound ou tagged. /tts on|off pode substituir preferências locais, e /tts status mostra o estado efetivo.
  • summaryModel substitui agents.defaults.model.primary para resumo automático.
  • modelOverrides é habilitado por padrão; modelOverrides.allowProvider usa false por padrão (opt-in).
  • As chaves de API usam ELEVENLABS_API_KEY/XI_API_KEY e OPENAI_API_KEY como fallback.
  • openai.baseUrl substitui o endpoint TTS do OpenAI. A ordem de resolução é configuração, depois OPENAI_TTS_BASE_URL, depois https://api.openai.com/v1.
  • Quando openai.baseUrl aponta para um endpoint que não é da OpenAI, o OpenClaw o trata como um servidor TTS compatível com OpenAI e flexibiliza a validação de modelo/voz.

Talk

Padrões para o modo 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 corresponder a uma chave em talk.providers quando vários provedores de Talk estiverem configurados.
  • Chaves legadas planas de Talk (talk.voiceId, talk.voiceAliases, talk.modelId, talk.outputFormat, talk.apiKey) são apenas para compatibilidade e são migradas automaticamente para talk.providers.<provider>.
  • IDs de voz usam ELEVENLABS_VOICE_ID ou SAG_VOICE_ID como fallback.
  • providers.*.apiKey aceita strings em texto simples ou objetos SecretRef.
  • O fallback ELEVENLABS_API_KEY se aplica apenas quando nenhuma chave de API de Talk está configurada.
  • providers.*.voiceAliases permite que diretivas de Talk usem nomes amigáveis.
  • silenceTimeoutMs controla quanto tempo o modo Talk espera após o silêncio do usuário antes de enviar a transcrição. Se não estiver definido, mantém a janela de pausa padrão da plataforma (700 ms no macOS e Android, 900 ms no iOS).

Ferramentas

Perfis de ferramentas

tools.profile define uma lista base de permissões antes de tools.allow/tools.deny: O onboarding local define novas configurações locais por padrão como tools.profile: "coding" quando não definido (perfis explícitos existentes são preservados).
PerfilInclui
minimalsomente 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
fullSem restrição (igual a não definido)

Grupos de ferramentas

GrupoFerramentas
group:runtimeexec, process, code_execution (bash é aceito como alias de 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:openclawTodas as ferramentas internas (exclui plugins de provedor)

tools.allow / tools.deny

Política global de permitir/negar ferramentas (negação prevalece). Não diferencia maiúsculas de minúsculas, oferece suporte a curingas *. Aplicada mesmo quando o sandbox Docker está desativado.
{
  tools: { deny: ["browser", "canvas"] },
}

tools.byProvider

Restringe ainda mais ferramentas para provedores ou modelos específicos. Ordem: perfil base → perfil do provedor → permitir/negar.
{
  tools: {
    profile: "coding",
    byProvider: {
      "google-antigravity": { profile: "minimal" },
      "openai/gpt-5.4": { allow: ["group:fs", "sessions_list"] },
    },
  },
}

tools.elevated

Controla acesso elevado de exec fora do sandbox:
{
  tools: {
    elevated: {
      enabled: true,
      allowFrom: {
        whatsapp: ["+15555550123"],
        discord: ["1234567890123", "987654321098765432"],
      },
    },
  },
}
  • A substituição por agente (agents.list[].tools.elevated) só pode restringir ainda mais.
  • /elevated on|off|ask|full armazena o estado por sessão; diretivas inline se aplicam a uma única mensagem.
  • exec elevado ignora o sandbox e usa o caminho de escape configurado (gateway por padrão ou node quando o alvo de execução é node).

tools.exec

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

tools.loopDetection

As verificações de segurança de loop de ferramenta são desativadas por padrão. Defina enabled: true para ativar a detecção. As configurações podem ser definidas globalmente em tools.loopDetection e substituídas por agente em agents.list[].tools.loopDetection.
{
  tools: {
    loopDetection: {
      enabled: true,
      historySize: 30,
      warningThreshold: 10,
      criticalThreshold: 20,
      globalCircuitBreakerThreshold: 30,
      detectors: {
        genericRepeat: true,
        knownPollNoProgress: true,
        pingPong: true,
      },
    },
  },
}
  • historySize: máximo de histórico de chamadas de ferramenta mantido para análise de loop.
  • warningThreshold: limite de padrão repetitivo sem progresso para avisos.
  • criticalThreshold: limite repetitivo mais alto para bloquear loops críticos.
  • globalCircuitBreakerThreshold: limite de interrupção rígida para qualquer execução sem progresso.
  • detectors.genericRepeat: avisa sobre chamadas repetidas da mesma ferramenta/com os mesmos argumentos.
  • detectors.knownPollNoProgress: avisa/bloqueia ferramentas de polling conhecidas (process.poll, command_status etc.).
  • detectors.pingPong: avisa/bloqueia padrões alternados em par sem progresso.
  • Se warningThreshold >= criticalThreshold ou criticalThreshold >= globalCircuitBreakerThreshold, a validação falha.

tools.web

{
  tools: {
    web: {
      search: {
        enabled: true,
        apiKey: "brave_api_key", // or BRAVE_API_KEY env
        maxResults: 5,
        timeoutSeconds: 30,
        cacheTtlMinutes: 15,
      },
      fetch: {
        enabled: true,
        provider: "firecrawl", // optional; omit for auto-detect
        maxChars: 50000,
        maxCharsCap: 50000,
        maxResponseBytes: 2000000,
        timeoutSeconds: 30,
        cacheTtlMinutes: 15,
        maxRedirects: 3,
        readability: true,
        userAgent: "custom-ua",
      },
    },
  },
}

tools.media

Configura o entendimento de mídia recebida (imagem/áudio/vídeo):
{
  tools: {
    media: {
      concurrency: 2,
      asyncCompletion: {
        directSend: false, // opt-in: send finished async music/video directly to the channel
      },
      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" }],
      },
    },
  },
}
Entrada de provedor (type: "provider" ou omitido):
  • provider: ID do provedor de API (openai, anthropic, google/gemini, groq etc.)
  • model: substituição de ID de modelo
  • profile / preferredProfile: seleção de perfil em auth-profiles.json
Entrada CLI (type: "cli"):
  • command: executável a ser executado
  • args: argumentos com template (compatível com {{MediaPath}}, {{Prompt}}, {{MaxChars}} etc.)
Campos comuns:
  • capabilities: lista opcional (image, audio, video). Padrões: openai/anthropic/minimax → imagem, google → imagem+áudio+vídeo, groq → áudio.
  • prompt, maxChars, maxBytes, timeoutSeconds, language: substituições por entrada.
  • Falhas recorrem à próxima entrada.
A autenticação do provedor segue a ordem padrão: auth-profiles.json → variáveis de ambiente → models.providers.*.apiKey.Campos de conclusão assíncrona:
  • asyncCompletion.directSend: quando true, tarefas assíncronas concluídas de music_generate e video_generate tentam primeiro entrega direta no canal. Padrão: false (caminho legado de despertar da sessão solicitante/entrega pelo modelo).

tools.agentToAgent

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

tools.sessions

Controla quais sessões podem ser alvo das ferramentas de sessão (sessions_list, sessions_history, sessions_send). Padrão: tree (sessão atual + sessões geradas por ela, como subagentes).
{
  tools: {
    sessions: {
      // "self" | "tree" | "agent" | "all"
      visibility: "tree",
    },
  },
}
Observações:
  • self: apenas a chave da sessão atual.
  • tree: sessão atual + sessões geradas pela sessão atual (subagentes).
  • agent: qualquer sessão pertencente ao ID do agente atual (pode incluir outros usuários se você executar sessões por remetente sob o mesmo ID de agente).
  • all: qualquer sessão. O direcionamento entre agentes ainda exige tools.agentToAgent.
  • Limitação por sandbox: quando a sessão atual está em sandbox e agents.defaults.sandbox.sessionToolsVisibility="spawned", a visibilidade é forçada para tree mesmo se tools.sessions.visibility="all".

tools.sessions_spawn

Controla o suporte a anexos inline para sessions_spawn.
{
  tools: {
    sessions_spawn: {
      attachments: {
        enabled: false, // opt-in: set true to allow inline file attachments
        maxTotalBytes: 5242880, // 5 MB total across all files
        maxFiles: 50,
        maxFileBytes: 1048576, // 1 MB per file
        retainOnSessionKeep: false, // keep attachments when cleanup="keep"
      },
    },
  },
}
Observações:
  • Anexos são compatíveis apenas com runtime: "subagent". O runtime ACP os rejeita.
  • Os arquivos são materializados no workspace filho em .openclaw/attachments/<uuid>/ com um .manifest.json.
  • O conteúdo do anexo é automaticamente redigido da persistência da transcrição.
  • Entradas Base64 são validadas com verificações estritas de alfabeto/preenchimento e uma proteção de tamanho antes da decodificação.
  • As permissões de arquivo são 0700 para diretórios e 0600 para arquivos.
  • A limpeza segue a política cleanup: delete sempre remove anexos; keep os mantém somente quando retainOnSessionKeep: true.

tools.experimental

Sinalizadores experimentais de ferramentas internas. Padrão desativado, a menos que uma regra de ativação automática rígida agentic do GPT-5 se aplique.
{
  tools: {
    experimental: {
      planTool: true, // enable experimental update_plan
    },
  },
}
Observações:
  • planTool: habilita a ferramenta estruturada experimental update_plan para acompanhamento de trabalho não trivial em várias etapas.
  • Padrão: false, a menos que agents.defaults.embeddedPi.executionContract (ou uma substituição por agente) esteja definido como "strict-agentic" para uma execução da família GPT-5 da OpenAI ou OpenAI Codex. Defina true para forçar a ativação da ferramenta fora desse escopo, ou false para mantê-la desativada mesmo para execuções GPT-5 strict-agentic.
  • Quando habilitado, o prompt do sistema também adiciona orientação de uso para que o modelo só a use em trabalho substancial e mantenha no máximo uma etapa in_progress.

agents.defaults.subagents

{
  agents: {
    defaults: {
      subagents: {
        allowAgents: ["research"],
        model: "minimax/MiniMax-M2.7",
        maxConcurrent: 8,
        runTimeoutSeconds: 900,
        archiveAfterMinutes: 60,
      },
    },
  },
}
  • model: modelo padrão para subagentes gerados. Se omitido, os subagentes herdam o modelo do chamador.
  • allowAgents: lista de permissões padrão de IDs de agentes de destino para sessions_spawn quando o agente solicitante não define seu próprio subagents.allowAgents (["*"] = qualquer; padrão: apenas o mesmo agente).
  • runTimeoutSeconds: timeout padrão (segundos) para sessions_spawn quando a chamada da ferramenta omite runTimeoutSeconds. 0 significa sem timeout.
  • Política de ferramenta por subagente: tools.subagents.tools.allow / tools.subagents.tools.deny.

Provedores personalizados e URLs base

O OpenClaw usa o catálogo interno de modelos. Adicione provedores personalizados via models.providers na configuração ou ~/.openclaw/agents/<agentId>/agent/models.json.
{
  models: {
    mode: "merge", // merge (default) | 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,
          },
        ],
      },
    },
  },
}
  • Use authHeader: true + headers para necessidades de autenticação personalizadas.
  • Substitua a raiz de configuração do agente com OPENCLAW_AGENT_DIR (ou PI_CODING_AGENT_DIR, um alias legado de variável de ambiente).
  • Precedência de mesclagem para IDs de provedor correspondentes:
    • Valores não vazios de baseUrl em models.json do agente prevalecem.
    • Valores não vazios de apiKey do agente prevalecem apenas quando esse provedor não é gerenciado por SecretRef no contexto atual de configuração/perfil de autenticação.
    • Valores apiKey de provedores gerenciados por SecretRef são atualizados a partir de marcadores de origem (ENV_VAR_NAME para refs de ambiente, secretref-managed para refs de arquivo/exec) em vez de persistir segredos resolvidos.
    • Valores de cabeçalho de provedores gerenciados por SecretRef são atualizados a partir de marcadores de origem (secretref-env:ENV_VAR_NAME para refs de ambiente, secretref-managed para refs de arquivo/exec).
    • apiKey/baseUrl vazios ou ausentes no agente recorrem a models.providers na configuração.
    • contextWindow/maxTokens de modelo correspondentes usam o valor mais alto entre a configuração explícita e os valores implícitos do catálogo.
    • contextTokens de modelo correspondente preserva um limite explícito de runtime quando presente; use-o para limitar o contexto efetivo sem alterar os metadados nativos do modelo.
    • Use models.mode: "replace" quando quiser que a configuração reescreva totalmente models.json.
    • A persistência de marcadores é autoritativa à origem: os marcadores são gravados a partir do snapshot ativo da configuração de origem (pré-resolução), não a partir de valores secretos resolvidos em runtime.

Detalhes dos campos do provedor

  • models.mode: comportamento do catálogo de provedores (merge ou replace).
  • models.providers: mapa de provedores personalizados indexado por ID de provedor.
  • models.providers.*.api: adaptador de requisição (openai-completions, openai-responses, anthropic-messages, google-generative-ai etc.).
  • models.providers.*.apiKey: credencial do provedor (prefira SecretRef/substituição por ambiente).
  • models.providers.*.auth: estratégia de autenticação (api-key, token, oauth, aws-sdk).
  • models.providers.*.injectNumCtxForOpenAICompat: para Ollama + openai-completions, injeta options.num_ctx nas requisições (padrão: true).
  • models.providers.*.authHeader: força o transporte da credencial no cabeçalho Authorization quando necessário.
  • models.providers.*.baseUrl: URL base da API upstream.
  • models.providers.*.headers: cabeçalhos estáticos extras para roteamento de proxy/tenant.
  • models.providers.*.request: substituições de transporte para requisições HTTP do provedor de modelos.
    • request.headers: cabeçalhos extras (mesclados com os padrões do provedor). Os valores aceitam SecretRef.
    • request.auth: substituição da estratégia de autenticação. Modos: "provider-default" (usa a autenticação interna do provedor), "authorization-bearer" (com token), "header" (com headerName, value, prefix opcional).
    • request.proxy: substituição de proxy HTTP. Modos: "env-proxy" (usa variáveis de ambiente HTTP_PROXY/HTTPS_PROXY), "explicit-proxy" (com url). Ambos os modos aceitam um subobjeto tls opcional.
    • request.tls: substituição TLS para conexões diretas. Campos: ca, cert, key, passphrase (todos aceitam SecretRef), serverName, insecureSkipVerify.
    • request.allowPrivateNetwork: quando true, permite HTTPS para baseUrl quando o DNS resolve para faixas privadas, CGNAT ou similares, por meio da proteção SSRF de fetch HTTP do provedor (opt-in do operador para endpoints OpenAI-compatíveis auto-hospedados confiáveis). O WebSocket usa o mesmo request para cabeçalhos/TLS, mas não essa proteção SSRF de fetch. Padrão false.
  • models.providers.*.models: entradas explícitas do catálogo de modelos do provedor.
  • models.providers.*.models.*.contextWindow: metadados nativos da janela de contexto do modelo.
  • models.providers.*.models.*.contextTokens: limite opcional de contexto em runtime. Use isso quando quiser um orçamento efetivo de contexto menor que contextWindow nativo do modelo.
  • models.providers.*.models.*.compat.supportsDeveloperRole: dica opcional de compatibilidade. Para api: "openai-completions" com baseUrl não nativo não vazio (host diferente de api.openai.com), o OpenClaw força isso para false em runtime. baseUrl vazio/omitido mantém o comportamento padrão da OpenAI.
  • models.providers.*.models.*.compat.requiresStringContent: dica opcional de compatibilidade para endpoints de chat OpenAI-compatíveis que aceitam somente string. Quando true, o OpenClaw transforma arrays messages[].content de texto puro em strings simples antes de enviar a requisição.
  • plugins.entries.amazon-bedrock.config.discovery: raiz das configurações de descoberta automática do Bedrock.
  • plugins.entries.amazon-bedrock.config.discovery.enabled: liga/desliga a descoberta implícita.
  • plugins.entries.amazon-bedrock.config.discovery.region: região AWS para descoberta.
  • plugins.entries.amazon-bedrock.config.discovery.providerFilter: filtro opcional por ID de provedor para descoberta direcionada.
  • plugins.entries.amazon-bedrock.config.discovery.refreshInterval: intervalo de polling para atualização da descoberta.
  • plugins.entries.amazon-bedrock.config.discovery.defaultContextWindow: janela de contexto de fallback para modelos descobertos.
  • plugins.entries.amazon-bedrock.config.discovery.defaultMaxTokens: máximo de tokens de saída de fallback para modelos descobertos.

Exemplos de provedores

{
  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)" },
        ],
      },
    },
  },
}
Use cerebras/zai-glm-4.7 para Cerebras; zai/glm-4.7 para Z.AI direto.
{
  agents: {
    defaults: {
      model: { primary: "opencode/claude-opus-4-6" },
      models: { "opencode/claude-opus-4-6": { alias: "Opus" } },
    },
  },
}
Defina OPENCODE_API_KEY (ou OPENCODE_ZEN_API_KEY). Use referências opencode/... para o catálogo Zen ou referências opencode-go/... para o catálogo Go. Atalho: openclaw onboard --auth-choice opencode-zen ou openclaw onboard --auth-choice opencode-go.
{
  agents: {
    defaults: {
      model: { primary: "zai/glm-4.7" },
      models: { "zai/glm-4.7": {} },
    },
  },
}
Defina ZAI_API_KEY. z.ai/* e z-ai/* são aliases aceitos. Atalho: openclaw onboard --auth-choice zai-api-key.
  • Endpoint geral: https://api.z.ai/api/paas/v4
  • Endpoint de código (padrão): https://api.z.ai/api/coding/paas/v4
  • Para o endpoint geral, defina um provedor personalizado com substituição de URL base.
{
  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,
          },
        ],
      },
    },
  },
}
Para o endpoint da China: baseUrl: "https://api.moonshot.cn/v1" ou openclaw onboard --auth-choice moonshot-api-key-cn.Os endpoints nativos da Moonshot anunciam compatibilidade de uso de streaming no transporte compartilhado openai-completions, e o OpenClaw baseia isso nas capacidades do endpoint em vez de apenas no ID interno do provedor.
{
  env: { KIMI_API_KEY: "sk-..." },
  agents: {
    defaults: {
      model: { primary: "kimi/kimi-code" },
      models: { "kimi/kimi-code": { alias: "Kimi Code" } },
    },
  },
}
Compatível com Anthropic, provedor interno. Atalho: 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,
          },
        ],
      },
    },
  },
}
A URL base deve omitir /v1 (o cliente Anthropic a acrescenta). Atalho: 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,
          },
        ],
      },
    },
  },
}
Defina MINIMAX_API_KEY. Atalhos: openclaw onboard --auth-choice minimax-global-api ou openclaw onboard --auth-choice minimax-cn-api. O catálogo de modelos usa por padrão apenas M2.7. No caminho de streaming compatível com Anthropic, o OpenClaw desativa o thinking do MiniMax por padrão, a menos que você defina thinking explicitamente. /fast on ou params.fastMode: true reescreve MiniMax-M2.7 para MiniMax-M2.7-highspeed.
Consulte Modelos locais. Resumindo: execute um modelo local grande via API Responses do LM Studio em hardware robusto; mantenha modelos hospedados mesclados para 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" }, // or plaintext string
        env: { GEMINI_API_KEY: "GEMINI_KEY_HERE" },
      },
      peekaboo: { enabled: true },
      sag: { enabled: false },
    },
  },
}
  • allowBundled: lista opcional de permissões apenas para Skills bundled (Skills gerenciadas/do workspace não são afetadas).
  • load.extraDirs: raízes extras compartilhadas de Skills (menor precedência).
  • install.preferBrew: quando true, prefere instaladores Homebrew quando brew está disponível antes de recorrer a outros tipos de instalador.
  • install.nodeManager: preferência de gerenciador Node para specs metadata.openclaw.install (npm | pnpm | yarn | bun).
  • entries.<skillKey>.enabled: false desativa uma Skill mesmo se estiver bundled/instalada.
  • entries.<skillKey>.apiKey: conveniência para Skills que declaram uma variável de ambiente primária (string em texto simples ou objeto 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" },
      },
    },
  },
}
  • Carregado de ~/.openclaw/extensions, <workspace>/.openclaw/extensions, além de plugins.load.paths.
  • A descoberta aceita plugins nativos do OpenClaw, além de bundles compatíveis do Codex e bundles do Claude, incluindo bundles do Claude sem manifesto no layout padrão.
  • Mudanças de configuração exigem reinicialização do gateway.
  • allow: lista opcional de permissões (somente os plugins listados são carregados). deny prevalece.
  • plugins.entries.<id>.apiKey: campo de conveniência de chave de API no nível do plugin (quando compatível com o plugin).
  • plugins.entries.<id>.env: mapa de variáveis de ambiente com escopo do plugin.
  • plugins.entries.<id>.hooks.allowPromptInjection: quando false, o core bloqueia before_prompt_build e ignora campos de mutação de prompt do legado before_agent_start, enquanto preserva modelOverride e providerOverride legados. Aplica-se a hooks de plugins nativos e diretórios de hook fornecidos por bundle compatíveis.
  • plugins.entries.<id>.subagent.allowModelOverride: confia explicitamente neste plugin para solicitar substituições por execução de provider e model para execuções em segundo plano de subagentes.
  • plugins.entries.<id>.subagent.allowedModels: lista opcional de permissões de alvos canônicos provider/model para substituições confiáveis de subagentes. Use "*" apenas quando quiser intencionalmente permitir qualquer modelo.
  • plugins.entries.<id>.config: objeto de configuração definido pelo plugin (validado pelo schema de plugin nativo do OpenClaw quando disponível).
  • plugins.entries.firecrawl.config.webFetch: configurações do provedor de busca web Firecrawl.
    • apiKey: chave de API do Firecrawl (aceita SecretRef). Usa como fallback plugins.entries.firecrawl.config.webSearch.apiKey, o legado tools.web.fetch.firecrawl.apiKey ou a variável de ambiente FIRECRAWL_API_KEY.
    • baseUrl: URL base da API Firecrawl (padrão: https://api.firecrawl.dev).
    • onlyMainContent: extrai somente o conteúdo principal das páginas (padrão: true).
    • maxAgeMs: idade máxima do cache em milissegundos (padrão: 172800000 / 2 dias).
    • timeoutSeconds: timeout da requisição de scraping em segundos (padrão: 60).
  • plugins.entries.xai.config.xSearch: configurações do X Search da xAI (busca web do Grok).
    • enabled: habilita o provedor X Search.
    • model: modelo Grok a usar para busca (por exemplo "grok-4-1-fast").
  • plugins.entries.memory-core.config.dreaming: configurações de dreaming de memória. Consulte Dreaming para fases e limites.
    • enabled: chave mestre de dreaming (padrão false).
    • frequency: cadência Cron para cada varredura completa de dreaming ("0 3 * * *" por padrão).
    • política de fase e limites são detalhes de implementação (não são chaves de configuração voltadas ao usuário).
  • A configuração completa de memória está em Referência de configuração de memória:
    • agents.defaults.memorySearch.*
    • memory.backend
    • memory.citations
    • memory.qmd.*
    • plugins.entries.memory-core.config.dreaming
  • Plugins de bundle do Claude habilitados também podem contribuir com padrões embutidos de Pi a partir de settings.json; o OpenClaw os aplica como configurações de agente sanitizadas, não como patches brutos da configuração do OpenClaw.
  • plugins.slots.memory: escolhe o ID do plugin de memória ativo ou "none" para desativar plugins de memória.
  • plugins.slots.contextEngine: escolhe o ID do plugin ativo de engine de contexto; usa "legacy" por padrão, a menos que você instale e selecione outro engine.
  • plugins.installs: metadados de instalação gerenciados pela CLI usados por openclaw plugins update.
    • Inclui source, spec, sourcePath, installPath, version, resolvedName, resolvedVersion, resolvedSpec, integrity, shasum, resolvedAt, installedAt.
    • Trate plugins.installs.* como estado gerenciado; prefira comandos da CLI em vez de edições manuais.
Consulte Plugins.
{
  browser: {
    enabled: true,
    evaluateEnabled: true,
    defaultProfile: "user",
    ssrfPolicy: {
      // dangerouslyAllowPrivateNetwork: true, // opt in only for trusted private-network access
      // allowPrivateNetwork: true, // legacy alias
      // hostnameAllowlist: ["*.example.com", "example.com"],
      // allowedHostnames: ["localhost"],
    },
    profiles: {
      openclaw: { cdpPort: 18800, color: "#FF4500" },
      work: { cdpPort: 18801, color: "#0066CC" },
      user: { driver: "existing-session", attachOnly: true, color: "#00AA00" },
      brave: {
        driver: "existing-session",
        attachOnly: true,
        userDataDir: "~/Library/Application Support/BraveSoftware/Brave-Browser",
        color: "#FB542B",
      },
      remote: { cdpUrl: "http://10.0.0.42:9222", color: "#00AA00" },
    },
    color: "#FF4500",
    // headless: false,
    // noSandbox: false,
    // extraArgs: [],
    // executablePath: "/Applications/Brave Browser.app/Contents/MacOS/Brave Browser",
    // attachOnly: false,
  },
}
  • evaluateEnabled: false desativa act:evaluate e wait --fn.
  • ssrfPolicy.dangerouslyAllowPrivateNetwork fica desativado quando não definido, então a navegação do navegador permanece estrita por padrão.
  • Defina ssrfPolicy.dangerouslyAllowPrivateNetwork: true apenas quando você confiar intencionalmente na navegação do navegador em rede privada.
  • No modo estrito, endpoints remotos de perfil CDP (profiles.*.cdpUrl) estão sujeitos ao mesmo bloqueio de rede privada durante verificações de alcance/descoberta.
  • ssrfPolicy.allowPrivateNetwork continua compatível como alias legado.
  • No modo estrito, use ssrfPolicy.hostnameAllowlist e ssrfPolicy.allowedHostnames para exceções explícitas.
  • Perfis remotos são somente de anexação (iniciar/parar/redefinir desativado).
  • profiles.*.cdpUrl aceita http://, https://, ws:// e wss://. Use HTTP(S) quando quiser que o OpenClaw descubra /json/version; use WS(S) quando seu provedor fornecer uma URL WebSocket direta do DevTools.
  • Perfis existing-session usam Chrome MCP em vez de CDP e podem se anexar no host selecionado ou por meio de um Node de navegador conectado.
  • Perfis existing-session podem definir userDataDir para ter como alvo um perfil específico de navegador baseado em Chromium, como Brave ou Edge.
  • Perfis existing-session mantêm os limites atuais de rota do Chrome MCP: ações dirigidas por snapshot/ref em vez de direcionamento por seletor CSS, hooks de upload de arquivo único, sem substituições de timeout de diálogo, sem wait --load networkidle, e sem responsebody, exportação de PDF, interceptação de download ou ações em lote.
  • Perfis locais gerenciados openclaw atribuem automaticamente cdpPort e cdpUrl; defina cdpUrl explicitamente apenas para CDP remoto.
  • Ordem de detecção automática: navegador padrão se for baseado em Chromium → Chrome → Brave → Edge → Chromium → Chrome Canary.
  • Serviço de controle: somente loopback (porta derivada de gateway.port, padrão 18791).
  • extraArgs acrescenta flags extras de inicialização ao Chromium local (por exemplo --disable-gpu, dimensionamento de janela ou flags de depuração).

UI

{
  ui: {
    seamColor: "#FF4500",
    assistant: {
      name: "OpenClaw",
      avatar: "CB", // emoji, short text, image URL, or data URI
    },
  },
}
  • seamColor: cor de destaque para o chrome da UI do app nativo (tom da bolha do Modo Talk etc.).
  • assistant: substituição de identidade da Control UI. Usa a identidade do agente ativo como fallback.

Gateway

{
  gateway: {
    mode: "local", // local | remote
    port: 18789,
    bind: "loopback",
    auth: {
      mode: "token", // none | token | password | trusted-proxy
      token: "your-token",
      // password: "your-password", // or OPENCLAW_GATEWAY_PASSWORD
      // trustedProxy: { userHeader: "x-forwarded-user" }, // for mode=trusted-proxy; see /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, // dangerous: allow absolute external http(s) embed URLs
      // allowedOrigins: ["https://control.example.com"], // required for non-loopback Control UI
      // dangerouslyAllowHostHeaderOriginFallback: false, // dangerous Host-header origin fallback mode
      // allowInsecureAuth: false,
      // dangerouslyDisableDeviceAuth: false,
    },
    remote: {
      url: "ws://gateway.tailnet:18789",
      transport: "ssh", // ssh | direct
      token: "your-token",
      // password: "your-password",
    },
    trustedProxies: ["10.0.0.1"],
    // Optional. Default false.
    allowRealIpFallback: false,
    tools: {
      // Additional /tools/invoke HTTP denies
      deny: ["browser"],
      // Remove tools from the default HTTP deny list
      allow: ["gateway"],
    },
    push: {
      apns: {
        relay: {
          baseUrl: "https://relay.example.com",
          timeoutMs: 10000,
        },
      },
    },
  },
}
  • mode: local (executa o gateway) ou remote (conecta a um gateway remoto). O Gateway se recusa a iniciar a menos que esteja em local.
  • port: porta única multiplexada para WS + HTTP. Precedência: --port > OPENCLAW_GATEWAY_PORT > gateway.port > 18789.
  • bind: auto, loopback (padrão), lan (0.0.0.0), tailnet (somente IP do Tailscale) ou custom.
  • Aliases legados de bind: use valores de modo de bind em gateway.bind (auto, loopback, lan, tailnet, custom), não aliases de host (0.0.0.0, 127.0.0.1, localhost, ::, ::1).
  • Observação sobre Docker: o bind padrão loopback escuta em 127.0.0.1 dentro do contêiner. Com rede bridge do Docker (-p 18789:18789), o tráfego chega em eth0, então o gateway fica inacessível. Use --network host ou defina bind: "lan" (ou bind: "custom" com customBindHost: "0.0.0.0") para escutar em todas as interfaces.
  • Auth: exigida por padrão. Binds fora de loopback exigem autenticação do gateway. Na prática, isso significa um token/senha compartilhado ou um proxy reverso com reconhecimento de identidade com gateway.auth.mode: "trusted-proxy". O assistente de onboarding gera um token por padrão.
  • Se gateway.auth.token e gateway.auth.password estiverem configurados ao mesmo tempo (incluindo SecretRefs), defina gateway.auth.mode explicitamente como token ou password. Fluxos de inicialização e de instalação/reparo do serviço falham quando ambos estão configurados e o modo não está definido.
  • gateway.auth.mode: "none": modo explícito sem autenticação. Use apenas em configurações confiáveis de loopback local; isso intencionalmente não é oferecido nos prompts de onboarding.
  • gateway.auth.mode: "trusted-proxy": delega a autenticação a um proxy reverso com reconhecimento de identidade e confia em cabeçalhos de identidade de gateway.trustedProxies (consulte Trusted Proxy Auth). Esse modo espera uma origem de proxy fora de loopback; proxies reversos de loopback no mesmo host não satisfazem a autenticação trusted-proxy.
  • gateway.auth.allowTailscale: quando true, cabeçalhos de identidade do Tailscale Serve podem satisfazer a autenticação da Control UI/WebSocket (verificados via tailscale whois). Endpoints da API HTTP não usam essa autenticação por cabeçalho do Tailscale; eles seguem o modo normal de autenticação HTTP do gateway. Esse fluxo sem token assume que o host do gateway é confiável. Usa true por padrão quando tailscale.mode = "serve".
  • gateway.auth.rateLimit: limitador opcional de falhas de autenticação. Aplica-se por IP de cliente e por escopo de autenticação (segredo compartilhado e token de dispositivo são rastreados independentemente). Tentativas bloqueadas retornam 429 + Retry-After.
    • No caminho assíncrono da Control UI do Tailscale Serve, tentativas falhas para o mesmo {scope, clientIp} são serializadas antes do registro da falha. Assim, tentativas ruins concorrentes do mesmo cliente podem disparar o limitador na segunda requisição em vez de ambas passarem em corrida como simples incompatibilidades.
    • gateway.auth.rateLimit.exemptLoopback usa true por padrão; defina false quando quiser intencionalmente limitar também o tráfego localhost (para ambientes de teste ou implantações estritas com proxy).
  • Tentativas de autenticação WS originadas do navegador são sempre limitadas com a isenção de loopback desativada (defesa em profundidade contra força bruta em localhost a partir do navegador).
  • Em loopback, esses bloqueios de origem do navegador são isolados por valor Origin normalizado, então falhas repetidas de uma origem localhost não bloqueiam automaticamente uma origem diferente.
  • tailscale.mode: serve (somente tailnet, bind loopback) ou funnel (público, requer auth).
  • controlUi.allowedOrigins: lista explícita de permissões de origem do navegador para conexões WebSocket do Gateway. Obrigatória quando clientes do navegador são esperados de origens fora de loopback.
  • controlUi.dangerouslyAllowHostHeaderOriginFallback: modo perigoso que habilita fallback de origem por cabeçalho Host para implantações que dependem intencionalmente de política de origem baseada em Host.
  • remote.transport: ssh (padrão) ou direct (ws/wss). Para direct, remote.url deve ser ws:// ou wss://.
  • OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1: substituição break-glass no lado do cliente que permite ws:// em texto simples para IPs confiáveis de rede privada; o padrão continua sendo somente loopback para texto simples.
  • gateway.remote.token / .password são campos de credenciais do cliente remoto. Eles não configuram a autenticação do gateway por si só.
  • gateway.push.apns.relay.baseUrl: URL base HTTPS para o relay APNs externo usado por builds oficiais/TestFlight do iOS depois que publicam registros baseados em relay no gateway. Essa URL deve corresponder à URL do relay compilada no build do iOS.
  • gateway.push.apns.relay.timeoutMs: timeout em milissegundos para envio do gateway ao relay. Padrão: 10000.
  • Registros baseados em relay são delegados a uma identidade específica de gateway. O app iOS pareado busca gateway.identity.get, inclui essa identidade no registro do relay e encaminha ao gateway uma concessão de envio com escopo do registro. Outro gateway não pode reutilizar esse registro armazenado.
  • OPENCLAW_APNS_RELAY_BASE_URL / OPENCLAW_APNS_RELAY_TIMEOUT_MS: substituições temporárias por ambiente para a configuração de relay acima.
  • OPENCLAW_APNS_RELAY_ALLOW_HTTP=true: escape hatch somente para desenvolvimento para URLs HTTP de relay em loopback. URLs de relay de produção devem permanecer em HTTPS.
  • gateway.channelHealthCheckMinutes: intervalo do monitor de saúde de canais em minutos. Defina 0 para desativar globalmente reinicializações do monitor de saúde. Padrão: 5.
  • gateway.channelStaleEventThresholdMinutes: limite de socket obsoleto em minutos. Mantenha isso maior ou igual a gateway.channelHealthCheckMinutes. Padrão: 30.
  • gateway.channelMaxRestartsPerHour: máximo de reinicializações do monitor de saúde por canal/conta em uma hora contínua. Padrão: 10.
  • channels.<provider>.healthMonitor.enabled: opt-out por canal para reinicializações do monitor de saúde, mantendo o monitor global habilitado.
  • channels.<provider>.accounts.<accountId>.healthMonitor.enabled: substituição por conta para canais com várias contas. Quando definido, tem precedência sobre a substituição no nível do canal.
  • Caminhos locais de chamada do gateway podem usar gateway.remote.* como fallback somente quando gateway.auth.* não está definido.
  • Se gateway.auth.token / gateway.auth.password estiver configurado explicitamente via SecretRef e não for resolvido, a resolução falha em modo fechado (sem fallback remoto mascarando).
  • trustedProxies: IPs de proxies reversos que encerram TLS ou injetam cabeçalhos do cliente encaminhado. Liste apenas proxies sob seu controle. Entradas de loopback ainda são válidas para configurações de proxy local/detecção local no mesmo host (por exemplo Tailscale Serve ou um proxy reverso local), mas não tornam requisições de loopback elegíveis para gateway.auth.mode: "trusted-proxy".
  • allowRealIpFallback: quando true, o gateway aceita X-Real-IP se X-Forwarded-For estiver ausente. Padrão false para comportamento fail-closed.
  • gateway.tools.deny: nomes extras de ferramentas bloqueados para HTTP POST /tools/invoke (estende a lista padrão de negação).
  • gateway.tools.allow: remove nomes de ferramentas da lista padrão de negação HTTP.

Endpoints compatíveis com OpenAI

  • Chat Completions: desativado por padrão. Habilite com gateway.http.endpoints.chatCompletions.enabled: true.
  • API Responses: gateway.http.endpoints.responses.enabled.
  • Endurecimento de entrada de URL em Responses:
    • gateway.http.endpoints.responses.maxUrlParts
    • gateway.http.endpoints.responses.files.urlAllowlist
    • gateway.http.endpoints.responses.images.urlAllowlist Listas de permissões vazias são tratadas como não definidas; use gateway.http.endpoints.responses.files.allowUrl=false e/ou gateway.http.endpoints.responses.images.allowUrl=false para desativar busca por URL.
  • Cabeçalho opcional de endurecimento de resposta:
    • gateway.http.securityHeaders.strictTransportSecurity (defina apenas para origens HTTPS sob seu controle; consulte Trusted Proxy Auth)

Isolamento de várias instâncias

Execute vários gateways em um host com portas e diretórios de estado exclusivos:
OPENCLAW_CONFIG_PATH=~/.openclaw/a.json \
OPENCLAW_STATE_DIR=~/.openclaw-a \
openclaw gateway --port 19001
Flags de conveniência: --dev (usa ~/.openclaw-dev + porta 19001), --profile <name> (usa ~/.openclaw-<name>). Consulte 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: habilita encerramento TLS no listener do gateway (HTTPS/WSS) (padrão: false).
  • autoGenerate: gera automaticamente um par local de certificado/chave autoassinado quando arquivos explícitos não estão configurados; apenas para uso local/dev.
  • certPath: caminho no sistema de arquivos para o arquivo de certificado TLS.
  • keyPath: caminho no sistema de arquivos para o arquivo de chave privada TLS; mantenha permissões restritas.
  • caPath: caminho opcional para bundle de CA para verificação de cliente ou cadeias de confiança personalizadas.

gateway.reload

{
  gateway: {
    reload: {
      mode: "hybrid", // off | restart | hot | hybrid
      debounceMs: 500,
      deferralTimeoutMs: 300000,
    },
  },
}
  • mode: controla como edições de configuração são aplicadas em runtime.
    • "off": ignora edições em tempo real; mudanças exigem reinicialização explícita.
    • "restart": sempre reinicia o processo do gateway ao mudar a configuração.
    • "hot": aplica mudanças no processo sem reiniciar.
    • "hybrid" (padrão): tenta hot reload primeiro; recorre à reinicialização se necessário.
  • debounceMs: janela de debounce em ms antes de aplicar mudanças de configuração (inteiro não negativo).
  • deferralTimeoutMs: tempo máximo em ms para esperar operações em andamento antes de forçar uma reinicialização (padrão: 300000 = 5 minutos).

Hooks

{
  hooks: {
    enabled: true,
    token: "shared-secret",
    path: "/hooks",
    maxBodyBytes: 262144,
    defaultSessionKey: "hook:ingress",
    allowRequestSessionKey: false,
    allowedSessionKeyPrefixes: ["hook:"],
    allowedAgentIds: ["hooks", "main"],
    presets: ["gmail"],
    transformsDir: "~/.openclaw/hooks/transforms",
    mappings: [
      {
        match: { path: "gmail" },
        action: "agent",
        agentId: "hooks",
        wakeMode: "now",
        name: "Gmail",
        sessionKey: "hook:gmail:{{messages[0].id}}",
        messageTemplate: "From: {{messages[0].from}}\nSubject: {{messages[0].subject}}\n{{messages[0].snippet}}",
        deliver: true,
        channel: "last",
        model: "openai/gpt-5.4-mini",
      },
    ],
  },
}
Auth: Authorization: Bearer <token> ou x-openclaw-token: <token>. Tokens de hook em query string são rejeitados. Observações de validação e segurança:
  • hooks.enabled=true exige hooks.token não vazio.
  • hooks.token deve ser diferente de gateway.auth.token; reutilizar o token do Gateway é rejeitado.
  • hooks.path não pode ser /; use um subcaminho dedicado como /hooks.
  • Se hooks.allowRequestSessionKey=true, restrinja hooks.allowedSessionKeyPrefixes (por exemplo ["hook:"]).
Endpoints:
  • POST /hooks/wake{ text, mode?: "now"|"next-heartbeat" }
  • POST /hooks/agent{ message, name?, agentId?, sessionKey?, wakeMode?, deliver?, channel?, to?, model?, thinking?, timeoutSeconds? }
    • sessionKey da carga da requisição é aceito apenas quando hooks.allowRequestSessionKey=true (padrão: false).
  • POST /hooks/<name> → resolvido via hooks.mappings
  • match.path corresponde ao subcaminho após /hooks (por exemplo /hooks/gmailgmail).
  • match.source corresponde a um campo da carga para caminhos genéricos.
  • Templates como {{messages[0].subject}} leem da carga.
  • transform pode apontar para um módulo JS/TS que retorna uma ação de hook.
    • transform.module deve ser um caminho relativo e permanecer dentro de hooks.transformsDir (caminhos absolutos e travessia são rejeitados).
  • agentId roteia para um agente específico; IDs desconhecidos recorrem ao padrão.
  • allowedAgentIds: restringe roteamento explícito (* ou omitido = permite todos, [] = nega todos).
  • defaultSessionKey: chave de sessão fixa opcional para execuções de agente por hook sem sessionKey explícito.
  • allowRequestSessionKey: permite que chamadores de /hooks/agent definam sessionKey (padrão: false).
  • allowedSessionKeyPrefixes: lista opcional de permissões de prefixo para valores explícitos de sessionKey (requisição + mapeamento), por exemplo ["hook:"].
  • deliver: true envia a resposta final para um canal; channel usa last por padrão.
  • model substitui o LLM para esta execução de hook (deve ser permitido se o catálogo de modelos estiver definido).

Integração com 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",
    },
  },
}
  • O Gateway inicia automaticamente gog gmail watch serve na inicialização quando configurado. Defina OPENCLAW_SKIP_GMAIL_WATCHER=1 para desativar.
  • Não execute um gog gmail watch serve separado junto com o Gateway.

Canvas host

{
  canvasHost: {
    root: "~/.openclaw/workspace/canvas",
    liveReload: true,
    // enabled: false, // or OPENCLAW_SKIP_CANVAS_HOST=1
  },
}
  • Serve HTML/CSS/JS editáveis pelo agente e A2UI por HTTP sob a porta do Gateway:
    • http://<gateway-host>:<gateway.port>/__openclaw__/canvas/
    • http://<gateway-host>:<gateway.port>/__openclaw__/a2ui/
  • Somente local: mantenha gateway.bind: "loopback" (padrão).
  • Binds fora de loopback: rotas do canvas exigem autenticação do Gateway (token/senha/trusted-proxy), igual a outras superfícies HTTP do Gateway.
  • Node WebViews normalmente não enviam cabeçalhos de autenticação; depois que um node é pareado e conectado, o Gateway anuncia URLs de capacidade com escopo de node para acesso a canvas/A2UI.
  • URLs de capacidade são vinculadas à sessão WS ativa do node e expiram rapidamente. Não é usado fallback baseado em IP.
  • Injeta cliente de live reload no HTML servido.
  • Cria automaticamente um index.html inicial quando vazio.
  • Também serve A2UI em /__openclaw__/a2ui/.
  • Alterações exigem reinicialização do gateway.
  • Desative live reload para diretórios grandes ou erros EMFILE.

Descoberta

mDNS (Bonjour)

{
  discovery: {
    mdns: {
      mode: "minimal", // minimal | full | off
    },
  },
}
  • minimal (padrão): omite cliPath + sshPort dos registros TXT.
  • full: inclui cliPath + sshPort.
  • O hostname usa openclaw por padrão. Substitua com OPENCLAW_MDNS_HOSTNAME.

Wide-area (DNS-SD)

{
  discovery: {
    wideArea: { enabled: true },
  },
}
Grava uma zona DNS-SD unicast em ~/.openclaw/dns/. Para descoberta entre redes, combine com um servidor DNS (CoreDNS recomendado) + DNS dividido do Tailscale. Configuração: openclaw dns setup --apply.

Ambiente

env (variáveis de ambiente inline)

{
  env: {
    OPENROUTER_API_KEY: "sk-or-...",
    vars: {
      GROQ_API_KEY: "gsk-...",
    },
    shellEnv: {
      enabled: true,
      timeoutMs: 15000,
    },
  },
}
  • Variáveis de ambiente inline são aplicadas apenas se o ambiente do processo não tiver a chave.
  • Arquivos .env: .env do CWD + ~/.openclaw/.env (nenhum substitui variáveis existentes).
  • shellEnv: importa chaves esperadas ausentes do perfil do seu shell de login.
  • Consulte Environment para a precedência completa.

Substituição de variável de ambiente

Faça referência a variáveis de ambiente em qualquer string de configuração com ${VAR_NAME}:
{
  gateway: {
    auth: { token: "${OPENCLAW_GATEWAY_TOKEN}" },
  },
}
  • Apenas nomes em maiúsculas são reconhecidos: [A-Z_][A-Z0-9_]*.
  • Variáveis ausentes/vazias geram erro no carregamento da configuração.
  • Escape com $${VAR} para um literal ${VAR}.
  • Funciona com $include.

Segredos

Referências de segredos são aditivas: valores em texto simples ainda funcionam.

SecretRef

Use um formato único de objeto:
{ source: "env" | "file" | "exec", provider: "default", id: "..." }
Validação:
  • padrão de provider: ^[a-z][a-z0-9_-]{0,63}$
  • padrão de id para source: "env": ^[A-Z][A-Z0-9_]{0,127}$
  • id para source: "file": ponteiro JSON absoluto (por exemplo "/providers/openai/apiKey")
  • padrão de id para source: "exec": ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,255}$
  • IDs de source: "exec" não devem conter segmentos de caminho delimitados por / iguais a . ou .. (por exemplo a/../b é rejeitado)

Superfície de credenciais compatível

  • Matriz canônica: Superfície de credenciais SecretRef
  • secrets apply tem como alvo caminhos de credenciais compatíveis em openclaw.json.
  • Referências de auth-profiles.json estão incluídas na resolução de runtime e na cobertura de auditoria.

Configuração de provedores de segredos

{
  secrets: {
    providers: {
      default: { source: "env" }, // optional explicit env provider
      filemain: {
        source: "file",
        path: "~/.openclaw/secrets.json",
        mode: "json",
        timeoutMs: 5000,
      },
      vault: {
        source: "exec",
        command: "/usr/local/bin/openclaw-vault-resolver",
        passEnv: ["PATH", "VAULT_ADDR"],
      },
    },
    defaults: {
      env: "default",
      file: "filemain",
      exec: "vault",
    },
  },
}
Observações:
  • O provedor file é compatível com mode: "json" e mode: "singleValue" (id deve ser "value" no modo singleValue).
  • O provedor exec exige um caminho command absoluto e usa cargas de protocolo em stdin/stdout.
  • Por padrão, caminhos de comando com symlink são rejeitados. Defina allowSymlinkCommand: true para permitir caminhos com symlink enquanto valida o caminho do destino resolvido.
  • Se trustedDirs estiver configurado, a verificação de diretório confiável se aplica ao caminho do destino resolvido.
  • O ambiente do processo filho de exec é mínimo por padrão; passe explicitamente as variáveis necessárias com passEnv.
  • Referências de segredos são resolvidas no momento da ativação em um snapshot em memória, depois os caminhos de requisição leem apenas esse snapshot.
  • A filtragem de superfície ativa se aplica durante a ativação: referências não resolvidas em superfícies habilitadas falham a inicialização/reload, enquanto superfícies inativas são ignoradas com diagnósticos.

Armazenamento de autenticação

{
  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"],
    },
  },
}
  • Perfis por agente são armazenados em <agentDir>/auth-profiles.json.
  • auth-profiles.json é compatível com referências em nível de valor (keyRef para api_key, tokenRef para token) para modos estáticos de credencial.
  • Perfis em modo OAuth (auth.profiles.<id>.mode = "oauth") não oferecem suporte a credenciais de perfil de autenticação baseadas em SecretRef.
  • Credenciais estáticas de runtime vêm de snapshots em memória já resolvidos; entradas estáticas legadas de auth.json são removidas quando descobertas.
  • Importações legadas de OAuth de ~/.openclaw/credentials/oauth.json.
  • Consulte OAuth.
  • Comportamento do runtime de segredos e ferramentas audit/configure/apply: Gerenciamento de segredos.

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 base em horas quando um perfil falha por erros reais de cobrança/crédito insuficiente (padrão: 5). Texto explícito de cobrança ainda pode cair aqui mesmo em respostas 401/403, mas correspondências de texto específicas do provedor continuam limitadas ao provedor ao qual pertencem (por exemplo OpenRouter Key limit exceeded). Mensagens 402 de janela de uso ou de limite de gasto de organização/workspace que são passíveis de nova tentativa permanecem no caminho rate_limit.
  • billingBackoffHoursByProvider: substituições opcionais por provedor para horas de backoff de cobrança.
  • billingMaxHours: limite máximo em horas para crescimento exponencial do backoff de cobrança (padrão: 24).
  • authPermanentBackoffMinutes: backoff base em minutos para falhas auth_permanent de alta confiança (padrão: 10).
  • authPermanentMaxMinutes: limite máximo em minutos para crescimento do backoff de auth_permanent (padrão: 60).
  • failureWindowHours: janela contínua em horas usada para contadores de backoff (padrão: 24).
  • overloadedProfileRotations: máximo de rotações de auth-profile do mesmo provedor para erros de sobrecarga antes de mudar para fallback de modelo (padrão: 1). Formatos de provedor ocupado como ModelNotReadyException caem aqui.
  • overloadedBackoffMs: atraso fixo antes de tentar novamente uma rotação de provedor/perfil sobrecarregado (padrão: 0).
  • rateLimitedProfileRotations: máximo de rotações de auth-profile do mesmo provedor para erros de limite de taxa antes de mudar para fallback de modelo (padrão: 1). Esse grupo de limite de taxa inclui textos típicos de provedores como 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"],
  },
}
  • Arquivo de log padrão: /tmp/openclaw/openclaw-YYYY-MM-DD.log.
  • Defina logging.file para um caminho estável.
  • consoleLevel sobe para debug com --verbose.
  • maxFileBytes: tamanho máximo do arquivo de log em bytes antes que gravações sejam suprimidas (inteiro positivo; padrão: 524288000 = 500 MB). Use rotação externa de logs para implantações de produção.

Diagnósticos

{
  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: chave mestre para saída de instrumentação (padrão: true).
  • flags: array de strings de flag que habilitam saída de log direcionada (compatível com curingas como "telegram.*" ou "*").
  • stuckSessionWarnMs: limite de idade em ms para emitir avisos de sessão travada enquanto uma sessão permanece em estado de processamento.
  • otel.enabled: habilita o pipeline de exportação OpenTelemetry (padrão: false).
  • otel.endpoint: URL do coletor para exportação OTel.
  • otel.protocol: "http/protobuf" (padrão) ou "grpc".
  • otel.headers: cabeçalhos extras de metadados HTTP/gRPC enviados com requisições de exportação OTel.
  • otel.serviceName: nome do serviço para atributos de recurso.
  • otel.traces / otel.metrics / otel.logs: habilitam exportação de traces, métricas ou logs.
  • otel.sampleRate: taxa de amostragem de traces 01.
  • otel.flushIntervalMs: intervalo periódico em ms para flush de telemetria.
  • cacheTrace.enabled: registra snapshots de rastreamento de cache para execuções incorporadas (padrão: false).
  • cacheTrace.filePath: caminho de saída para o JSONL de rastreamento de cache (padrão: $OPENCLAW_STATE_DIR/logs/cache-trace.jsonl).
  • cacheTrace.includeMessages / includePrompt / includeSystem: controlam o que é incluído na saída de rastreamento de cache (todos usam true por padrão).

Atualização

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

    auto: {
      enabled: false,
      stableDelayHours: 6,
      stableJitterHours: 12,
      betaCheckIntervalHours: 1,
    },
  },
}
  • channel: canal de release para instalações npm/git — "stable", "beta" ou "dev".
  • checkOnStart: verifica atualizações npm quando o gateway inicia (padrão: true).
  • auto.enabled: habilita atualização automática em segundo plano para instalações de pacote (padrão: false).
  • auto.stableDelayHours: atraso mínimo em horas antes da aplicação automática no canal estável (padrão: 6; máximo: 168).
  • auto.stableJitterHours: janela extra em horas para distribuir o rollout do canal estável (padrão: 12; máximo: 168).
  • auto.betaCheckIntervalHours: frequência em horas das verificações do canal beta (padrão: 1; máximo: 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: feature gate global do ACP (padrão: false).
  • dispatch.enabled: gate independente para despacho de turnos de sessão ACP (padrão: true). Defina false para manter comandos ACP disponíveis enquanto bloqueia a execução.
  • backend: ID padrão de backend de runtime ACP (deve corresponder a um Plugin de runtime ACP registrado).
  • defaultAgent: ID de agente ACP de fallback quando spawns não especificam um alvo explícito.
  • allowedAgents: lista de permissões de IDs de agentes permitidos para sessões de runtime ACP; vazio significa sem restrição adicional.
  • maxConcurrentSessions: máximo de sessões ACP ativas simultaneamente.
  • stream.coalesceIdleMs: janela de flush ocioso em ms para texto em streaming.
  • stream.maxChunkChars: tamanho máximo do chunk antes de dividir a projeção do bloco em streaming.
  • stream.repeatSuppression: suprime linhas repetidas de status/ferramenta por turno (padrão: true).
  • stream.deliveryMode: "live" transmite incrementalmente; "final_only" mantém em buffer até eventos terminais do turno.
  • stream.hiddenBoundarySeparator: separador antes do texto visível após eventos ocultos de ferramenta (padrão: "paragraph").
  • stream.maxOutputChars: máximo de caracteres de saída do assistente projetados por turno ACP.
  • stream.maxSessionUpdateChars: máximo de caracteres para linhas projetadas de status/atualização ACP.
  • stream.tagVisibility: registro de nomes de tags para substituições booleanas de visibilidade em eventos transmitidos.
  • runtime.ttlMinutes: TTL ocioso em minutos para workers de sessão ACP antes de elegibilidade para limpeza.
  • runtime.installCommand: comando de instalação opcional a ser executado ao inicializar um ambiente de runtime ACP.

CLI

{
  cli: {
    banner: {
      taglineMode: "off", // random | default | off
    },
  },
}
  • cli.banner.taglineMode controla o estilo da tagline do banner:
    • "random" (padrão): taglines rotativas engraçadas/sazonais.
    • "default": tagline neutra fixa (All your chats, one OpenClaw.).
    • "off": sem texto de tagline (o título/versão do banner ainda é exibido).
  • Para ocultar o banner inteiro (não apenas as taglines), defina a variável de ambiente OPENCLAW_HIDE_BANNER=1.

Wizard

Metadados gravados por fluxos de configuração guiada da CLI (onboard, configure, doctor):
{
  wizard: {
    lastRunAt: "2026-01-01T00:00:00.000Z",
    lastRunVersion: "2026.1.4",
    lastRunCommit: "abc1234",
    lastRunCommand: "configure",
    lastRunMode: "local",
  },
}

Identidade

Consulte os campos de identidade de agents.list em Padrões do agente.

Bridge (legado, removido)

As compilações atuais não incluem mais a bridge TCP. Nodes se conectam pelo WebSocket do Gateway. Chaves bridge.* não fazem mais parte do schema de configuração (a validação falha até serem removidas; openclaw doctor --fix pode remover chaves desconhecidas).
{
  "bridge": {
    "enabled": true,
    "port": 18790,
    "bind": "tailnet",
    "tls": {
      "enabled": true,
      "autoGenerate": true
    }
  }
}

Cron

{
  cron: {
    enabled: true,
    maxConcurrentRuns: 2,
    webhook: "https://example.invalid/legacy", // deprecated fallback for stored notify:true jobs
    webhookToken: "replace-with-dedicated-token", // optional bearer token for outbound webhook auth
    sessionRetention: "24h", // duration string or false
    runLog: {
      maxBytes: "2mb", // default 2_000_000 bytes
      keepLines: 2000, // default 2000
    },
  },
}
  • sessionRetention: por quanto tempo manter sessões concluídas de execuções Cron isoladas antes de removê-las de sessions.json. Também controla a limpeza de transcrições arquivadas excluídas do Cron. Padrão: 24h; defina false para desativar.
  • runLog.maxBytes: tamanho máximo por arquivo de log de execução (cron/runs/<jobId>.jsonl) antes da poda. Padrão: 2_000_000 bytes.
  • runLog.keepLines: linhas mais recentes mantidas quando a poda do log de execução é disparada. Padrão: 2000.
  • webhookToken: token bearer usado para entrega POST de Webhook do Cron (delivery.mode = "webhook"); se omitido, nenhum cabeçalho de autenticação é enviado.
  • webhook: URL de Webhook legada obsoleta (http/https) usada apenas para jobs armazenados que ainda têm notify: true.

cron.retry

{
  cron: {
    retry: {
      maxAttempts: 3,
      backoffMs: [30000, 60000, 300000],
      retryOn: ["rate_limit", "overloaded", "network", "timeout", "server_error"],
    },
  },
}
  • maxAttempts: máximo de tentativas para jobs únicos em erros transitórios (padrão: 3; intervalo: 010).
  • backoffMs: array de atrasos de backoff em ms para cada tentativa (padrão: [30000, 60000, 300000]; 1–10 entradas).
  • retryOn: tipos de erro que disparam nova tentativa — "rate_limit", "overloaded", "network", "timeout", "server_error". Omita para tentar novamente todos os tipos transitórios.
Aplica-se apenas a jobs Cron únicos. Jobs recorrentes usam tratamento separado de falhas.

cron.failureAlert

{
  cron: {
    failureAlert: {
      enabled: false,
      after: 3,
      cooldownMs: 3600000,
      mode: "announce",
      accountId: "main",
    },
  },
}
  • enabled: habilita alertas de falha para jobs Cron (padrão: false).
  • after: falhas consecutivas antes de disparar um alerta (inteiro positivo, mín.: 1).
  • cooldownMs: milissegundos mínimos entre alertas repetidos para o mesmo job (inteiro não negativo).
  • mode: modo de entrega — "announce" envia por mensagem de canal; "webhook" faz POST para o Webhook configurado.
  • accountId: ID opcional de conta ou canal para delimitar a entrega do alerta.

cron.failureDestination

{
  cron: {
    failureDestination: {
      mode: "announce",
      channel: "last",
      to: "channel:C1234567890",
      accountId: "main",
    },
  },
}
  • Destino padrão para notificações de falha de Cron em todos os jobs.
  • mode: "announce" ou "webhook"; usa "announce" por padrão quando existem dados de destino suficientes.
  • channel: substituição de canal para entrega announce. "last" reutiliza o último canal de entrega conhecido.
  • to: alvo explícito de announce ou URL de Webhook. Obrigatório para o modo Webhook.
  • accountId: substituição opcional de conta para entrega.
  • delivery.failureDestination por job substitui esse padrão global.
  • Quando não há destino de falha global nem por job, jobs que já entregam via announce recorrem a esse alvo principal de announce em caso de falha.
  • delivery.failureDestination é compatível apenas com jobs sessionTarget="isolated", a menos que delivery.mode principal do job seja "webhook".
Consulte Jobs Cron. Execuções Cron isoladas são rastreadas como tarefas em segundo plano.

Variáveis de template do modelo de mídia

Placeholders de template expandidos em tools.media.models[].args:
VariávelDescrição
{{Body}}Corpo completo da mensagem recebida
{{RawBody}}Corpo bruto (sem wrappers de histórico/remetente)
{{BodyStripped}}Corpo com menções de grupo removidas
{{From}}Identificador do remetente
{{To}}Identificador de destino
{{MessageSid}}ID da mensagem do canal
{{SessionId}}UUID da sessão atual
{{IsNewSession}}"true" quando uma nova sessão é criada
{{MediaUrl}}pseudo-URL da mídia recebida
{{MediaPath}}caminho local da mídia
{{MediaType}}tipo de mídia (image/audio/document/…)
{{Transcript}}transcrição do áudio
{{Prompt}}prompt de mídia resolvido para entradas CLI
{{MaxChars}}máximo de caracteres de saída resolvido para entradas CLI
{{ChatType}}"direct" ou "group"
{{GroupSubject}}assunto do grupo (melhor esforço)
{{GroupMembers}}prévia de membros do grupo (melhor esforço)
{{SenderName}}nome de exibição do remetente (melhor esforço)
{{SenderE164}}número de telefone do remetente (melhor esforço)
{{Provider}}dica de provedor (whatsapp, telegram, discord etc.)

Inclusões de configuração ($include)

Divida a configuração em vários arquivos:
// ~/.openclaw/openclaw.json
{
  gateway: { port: 18789 },
  agents: { $include: "./agents.json5" },
  broadcast: {
    $include: ["./clients/mueller.json5", "./clients/schmidt.json5"],
  },
}
Comportamento de mesclagem:
  • Arquivo único: substitui o objeto que o contém.
  • Array de arquivos: mesclado profundamente em ordem (os posteriores substituem os anteriores).
  • Chaves irmãs: mescladas após as inclusões (substituem valores incluídos).
  • Inclusões aninhadas: até 10 níveis de profundidade.
  • Caminhos: resolvidos em relação ao arquivo que inclui, mas devem permanecer dentro do diretório de configuração de nível superior (dirname de openclaw.json). Formas absolutas/../ são permitidas apenas quando ainda são resolvidas dentro desse limite.
  • Erros: mensagens claras para arquivos ausentes, erros de parse e inclusões circulares.

Relacionado: Configuration · Exemplos de configuração · Doctor