Przejdź do głównej treści

Dokumentacja konfiguracji

Podstawowa dokumentacja konfiguracji dla ~/.openclaw/openclaw.json. Aby zobaczyć omówienie zorientowane na zadania, przejdź do Konfiguracja. Ta strona obejmuje główne powierzchnie konfiguracji OpenClaw i odsyła dalej, gdy podsystem ma własną, bardziej szczegółową dokumentację. Nie próbuje umieszczać na jednej stronie każdego katalogu poleceń należącego do kanału/Plugin ani każdego zaawansowanego ustawienia pamięci/QMD. Źródło prawdy w kodzie:
  • openclaw config schema wypisuje bieżący schemat JSON używany do walidacji i Control UI, z dołączonymi metadanymi bundled/Plugin/kanałów, gdy są dostępne
  • config.schema.lookup zwraca jeden węzeł schematu o zakresie jednej ścieżki dla narzędzi do szczegółowej analizy
  • pnpm config:docs:check / pnpm config:docs:gen weryfikują hash bazowy dokumentacji konfiguracji względem bieżącej powierzchni schematu
Dedykowane szczegółowe dokumentacje:
  • Dokumentacja konfiguracji pamięci dla agents.defaults.memorySearch.*, memory.qmd.*, memory.citations oraz konfiguracji Dreaming w plugins.entries.memory-core.config.dreaming
  • Slash Commands dla bieżącego katalogu wbudowanych + bundled poleceń
  • strony właścicieli kanałów/Pluginów dla powierzchni poleceń specyficznych dla kanału
Format konfiguracji to JSON5 (dozwolone komentarze i końcowe przecinki). Wszystkie pola są opcjonalne — OpenClaw używa bezpiecznych wartości domyślnych, gdy są pominięte.

Kanały

Każdy kanał uruchamia się automatycznie, gdy istnieje jego sekcja konfiguracji (chyba że enabled: false).

Dostęp do DM i grup

Wszystkie kanały obsługują zasady dla DM i zasady dla grup:
Zasada DMZachowanie
pairing (domyślna)Nieznani nadawcy otrzymują jednorazowy kod parowania; właściciel musi zatwierdzić
allowlistTylko nadawcy z allowFrom (lub sparowanego magazynu dozwolonych)
openZezwala na wszystkie przychodzące DM (wymaga allowFrom: ["*"])
disabledIgnoruje wszystkie przychodzące DM
Zasada grupZachowanie
allowlist (domyślna)Tylko grupy pasujące do skonfigurowanej listy dozwolonych
openPomija listy dozwolonych grup (nadal obowiązuje wymaganie wzmianki)
disabledBlokuje wszystkie wiadomości grupowe/pokojowe
channels.defaults.groupPolicy ustawia wartość domyślną, gdy groupPolicy dostawcy nie jest ustawione. Kody parowania wygasają po 1 godzinie. Oczekujące żądania parowania DM są ograniczone do 3 na kanał. Jeśli blok dostawcy całkowicie nie istnieje (channels.<provider> jest nieobecne), zasada grup w czasie działania wraca do allowlist (fail-closed) z ostrzeżeniem przy uruchamianiu.

Nadpisania modeli dla kanałów

Użyj channels.modelByChannel, aby przypiąć określone identyfikatory kanałów do modelu. Wartości akceptują provider/model lub skonfigurowane aliasy modeli. Mapowanie kanałów ma zastosowanie wtedy, gdy sesja nie ma już nadpisania modelu (na przykład ustawionego przez /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",
      },
    },
  },
}

Domyślne ustawienia kanałów i Heartbeat

Użyj channels.defaults dla współdzielonych zasad grup i zachowania Heartbeat we wszystkich dostawcach:
{
  channels: {
    defaults: {
      groupPolicy: "allowlist", // open | allowlist | disabled
      contextVisibility: "all", // all | allowlist | allowlist_quote
      heartbeat: {
        showOk: false,
        showAlerts: true,
        useIndicator: true,
      },
    },
  },
}
  • channels.defaults.groupPolicy: zapasowa zasada grup, gdy groupPolicy na poziomie dostawcy nie jest ustawione.
  • channels.defaults.contextVisibility: domyślny tryb widoczności dodatkowego kontekstu dla wszystkich kanałów. Wartości: all (domyślna, uwzględnia cały kontekst cytatu/wątku/historii), allowlist (uwzględnia tylko kontekst od nadawców z listy dozwolonych), allowlist_quote (tak samo jak allowlist, ale zachowuje jawny kontekst cytatu/odpowiedzi). Nadpisanie per kanał: channels.<channel>.contextVisibility.
  • channels.defaults.heartbeat.showOk: uwzględnia zdrowe stany kanałów w wyjściu Heartbeat.
  • channels.defaults.heartbeat.showAlerts: uwzględnia stany pogorszone/błędów w wyjściu Heartbeat.
  • channels.defaults.heartbeat.useIndicator: renderuje kompaktowe wyjście Heartbeat w stylu wskaźnika.

WhatsApp

WhatsApp działa przez kanał web Gateway (Baileys Web). Uruchamia się automatycznie, gdy istnieje połączona sesja.
{
  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",
        },
      },
    },
  },
}
  • Polecenia wychodzące domyślnie używają konta default, jeśli istnieje; w przeciwnym razie pierwszego skonfigurowanego identyfikatora konta (posortowanego).
  • Opcjonalne channels.whatsapp.defaultAccount nadpisuje ten zapasowy wybór konta domyślnego, jeśli pasuje do skonfigurowanego identyfikatora konta.
  • Starszy katalog uwierzytelniania Baileys dla pojedynczego konta jest migrowany przez openclaw doctor do whatsapp/default.
  • Nadpisania per konto: channels.whatsapp.accounts.<id>.sendReadReceipts, channels.whatsapp.accounts.<id>.dmPolicy, channels.whatsapp.accounts.<id>.allowFrom.

Telegram

{
  channels: {
    telegram: {
      enabled: true,
      botToken: "your-bot-token",
      dmPolicy: "pairing",
      allowFrom: ["tg:123456789"],
      groups: {
        "*": { requireMention: true },
        "-1001234567890": {
          allowFrom: ["@admin"],
          systemPrompt: "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 bota: channels.telegram.botToken lub channels.telegram.tokenFile (tylko zwykły plik; dowiązania symboliczne są odrzucane), z TELEGRAM_BOT_TOKEN jako wartością zapasową dla konta domyślnego.
  • Opcjonalne channels.telegram.defaultAccount nadpisuje wybór konta domyślnego, jeśli pasuje do skonfigurowanego identyfikatora konta.
  • W konfiguracjach z wieloma kontami (2+ identyfikatory kont) ustaw jawne konto domyślne (channels.telegram.defaultAccount lub channels.telegram.accounts.default), aby uniknąć routingu zapasowego; openclaw doctor ostrzega, gdy tego brakuje lub jest nieprawidłowe.
  • configWrites: false blokuje zapisy konfiguracji inicjowane z Telegrama (migracje identyfikatorów supergrup, /config set|unset).
  • Wpisy najwyższego poziomu bindings[] z type: "acp" konfigurują trwałe powiązania ACP dla tematów forum (użyj kanonicznego chatId:topic:topicId w match.peer.id). Semantyka pól jest współdzielona z ACP Agents.
  • Podglądy strumieniowe Telegram używają sendMessage + editMessageText (działa w czatach bezpośrednich i grupowych).
  • Zasady ponawiania: zobacz Retry policy.

Discord

{
  channels: {
    discord: {
      enabled: true,
      token: "your-bot-token",
      mediaMaxMb: 100,
      allowBots: false,
      actions: {
        reactions: true,
        stickers: true,
        polls: true,
        permissions: true,
        messages: true,
        threads: true,
        pins: true,
        search: true,
        memberInfo: true,
        roleInfo: true,
        roles: false,
        channelInfo: true,
        voiceStatus: true,
        events: true,
        moderation: false,
      },
      replyToMode: "off", // off | first | all | batched
      dmPolicy: "pairing",
      allowFrom: ["1234567890", "123456789012345678"],
      dm: { enabled: true, groupEnabled: false, groupChannels: ["openclaw-dm"] },
      guilds: {
        "123456789012345678": {
          slug: "friends-of-openclaw",
          requireMention: false,
          ignoreOtherMentions: true,
          reactionNotifications: "own",
          users: ["987654321098765432"],
          channels: {
            general: { allow: true },
            help: {
              allow: true,
              requireMention: true,
              users: ["987654321098765432"],
              skills: ["docs"],
              systemPrompt: "Short answers only.",
            },
          },
        },
      },
      historyLimit: 20,
      textChunkLimit: 2000,
      chunkMode: "length", // length | newline
      streaming: "off", // off | partial | block | progress (progress maps to partial on Discord)
      maxLinesPerMessage: 17,
      ui: {
        components: {
          accentColor: "#5865F2",
        },
      },
      threadBindings: {
        enabled: true,
        idleHours: 24,
        maxAgeHours: 0,
        spawnSubagentSessions: false, // opt-in for sessions_spawn({ thread: true })
      },
      voice: {
        enabled: true,
        autoJoin: [
          {
            guildId: "123456789012345678",
            channelId: "234567890123456789",
          },
        ],
        daveEncryption: true,
        decryptionFailureTolerance: 24,
        tts: {
          provider: "openai",
          openai: { voice: "alloy" },
        },
      },
      execApprovals: {
        enabled: "auto", // true | false | "auto"
        approvers: ["987654321098765432"],
        agentFilter: ["default"],
        sessionFilter: ["discord:"],
        target: "dm", // dm | channel | both
        cleanupAfterResolve: false,
      },
      retry: {
        attempts: 3,
        minDelayMs: 500,
        maxDelayMs: 30000,
        jitter: 0.1,
      },
    },
  },
}
  • Token: channels.discord.token, z DISCORD_BOT_TOKEN jako wartością zapasową dla konta domyślnego.
  • Bezpośrednie wywołania wychodzące, które przekazują jawny token Discorda, używają tego tokena do wywołania; ustawienia ponawiania/zasad konta nadal pochodzą z wybranego konta w aktywnej migawce środowiska uruchomieniowego.
  • Opcjonalne channels.discord.defaultAccount nadpisuje wybór konta domyślnego, jeśli pasuje do skonfigurowanego identyfikatora konta.
  • Używaj user:<id> (DM) lub channel:<id> (kanał serwera) jako celów dostarczenia; same numeryczne identyfikatory są odrzucane.
  • Slugi serwerów są pisane małymi literami, a spacje są zastępowane przez -; klucze kanałów używają nazwy w postaci slugu (bez #). Preferuj identyfikatory serwerów.
  • Wiadomości napisane przez bota są domyślnie ignorowane. allowBots: true je włącza; użyj allowBots: "mentions", aby akceptować tylko wiadomości botów, które wspominają bota (własne wiadomości nadal są filtrowane).
  • channels.discord.guilds.<id>.ignoreOtherMentions (oraz nadpisania na poziomie kanału) odrzuca wiadomości, które wspominają innego użytkownika lub rolę, ale nie bota (z wyłączeniem @everyone/@here).
  • maxLinesPerMessage (domyślnie 17) dzieli wysokie wiadomości nawet wtedy, gdy mają mniej niż 2000 znaków.
  • channels.discord.threadBindings steruje routowaniem związanym z wątkami Discorda:
    • enabled: nadpisanie Discorda dla funkcji sesji związanych z wątkami (/focus, /unfocus, /agents, /session idle, /session max-age oraz dostarczanie/routowanie związane z powiązaniem)
    • idleHours: nadpisanie Discorda dla automatycznego zdejmowania fokusu po bezczynności w godzinach (0 wyłącza)
    • maxAgeHours: nadpisanie Discorda dla twardego maksymalnego wieku w godzinach (0 wyłącza)
    • spawnSubagentSessions: przełącznik opt-in dla automatycznego tworzenia/powiązania wątków przez sessions_spawn({ thread: true })
  • Wpisy najwyższego poziomu bindings[] z type: "acp" konfigurują trwałe powiązania ACP dla kanałów i wątków (użyj identyfikatora kanału/wątku w match.peer.id). Semantyka pól jest współdzielona z ACP Agents.
  • channels.discord.ui.components.accentColor ustawia kolor akcentu dla kontenerów komponentów Discord v2.
  • channels.discord.voice włącza rozmowy w kanałach głosowych Discorda oraz opcjonalne automatyczne dołączanie i nadpisania TTS.
  • channels.discord.voice.daveEncryption oraz channels.discord.voice.decryptionFailureTolerance są przekazywane do opcji DAVE @discordjs/voice (true i 24 domyślnie).
  • OpenClaw dodatkowo próbuje odzyskać odbiór głosu przez opuszczenie i ponowne dołączenie do sesji głosowej po powtarzających się błędach odszyfrowywania.
  • channels.discord.streaming jest kanonicznym kluczem trybu strumieniowania. Starsze wartości streamMode i logiczne streaming są automatycznie migrowane.
  • channels.discord.autoPresence mapuje dostępność środowiska uruchomieniowego na status obecności bota (healthy => online, degraded => idle, exhausted => dnd) i pozwala na opcjonalne nadpisania tekstu statusu.
  • channels.discord.dangerouslyAllowNameMatching ponownie włącza dopasowywanie po zmiennej nazwie/tagu (awaryjny tryb zgodności).
  • channels.discord.execApprovals: natywne dla Discorda dostarczanie zatwierdzeń exec i autoryzacja zatwierdzających.
    • enabled: true, false lub "auto" (domyślnie). W trybie auto zatwierdzenia exec aktywują się, gdy zatwierdzających można rozwiązać z approvers lub commands.ownerAllowFrom.
    • approvers: identyfikatory użytkowników Discorda, którym wolno zatwierdzać żądania exec. Gdy pominięte, używa wartości zapasowej z commands.ownerAllowFrom.
    • agentFilter: opcjonalna lista dozwolonych identyfikatorów agentów. Pomiń, aby przekazywać zatwierdzenia dla wszystkich agentów.
    • sessionFilter: opcjonalne wzorce kluczy sesji (podciąg lub regex).
    • target: gdzie wysyłać prośby o zatwierdzenie. "dm" (domyślnie) wysyła do DM zatwierdzających, "channel" wysyła do kanału źródłowego, "both" wysyła do obu. Gdy target zawiera "channel", przycisków mogą używać tylko rozwiązani zatwierdzający.
    • cleanupAfterResolve: gdy true, usuwa DM z zatwierdzeniem po zatwierdzeniu, odrzuceniu lub przekroczeniu limitu czasu.
Tryby powiadomień o reakcjach: off (brak), own (wiadomości bota, domyślnie), all (wszystkie wiadomości), allowlist (od guilds.<id>.users dla wszystkich wiadomości).

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 konta usługi: osadzony (serviceAccount) lub oparty na pliku (serviceAccountFile).
  • SecretRef konta usługi jest również obsługiwany (serviceAccountRef).
  • Wartości zapasowe ze środowiska: GOOGLE_CHAT_SERVICE_ACCOUNT lub GOOGLE_CHAT_SERVICE_ACCOUNT_FILE.
  • Używaj spaces/<spaceId> lub users/<userId> jako celów dostarczenia.
  • channels.googlechat.dangerouslyAllowNameMatching ponownie włącza dopasowywanie po zmiennym adresie e-mail principal (awaryjny tryb zgodności).

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
      },
    },
  },
}
  • Tryb socket wymaga zarówno botToken, jak i appToken (SLACK_BOT_TOKEN + SLACK_APP_TOKEN jako zapasowe wartości środowiskowe dla konta domyślnego).
  • Tryb HTTP wymaga botToken oraz signingSecret (w korzeniu lub per konto).
  • botToken, appToken, signingSecret i userToken akceptują jawne ciągi znaków lub obiekty SecretRef.
  • Migawki kont Slacka udostępniają pola źródła/statusu per poświadczenie, takie jak botTokenSource, botTokenStatus, appTokenStatus oraz, w trybie HTTP, signingSecretStatus. configured_unavailable oznacza, że konto jest skonfigurowane przez SecretRef, ale bieżąca ścieżka polecenia/środowiska uruchomieniowego nie mogła rozwiązać wartości sekretu.
  • configWrites: false blokuje zapisy konfiguracji inicjowane ze Slacka.
  • Opcjonalne channels.slack.defaultAccount nadpisuje wybór konta domyślnego, jeśli pasuje do skonfigurowanego identyfikatora konta.
  • channels.slack.streaming.mode jest kanonicznym kluczem trybu strumieniowania Slacka. channels.slack.streaming.nativeTransport kontroluje natywny transport strumieniowania Slacka. Starsze wartości streamMode, logiczne streaming i nativeStreaming są automatycznie migrowane.
  • Używaj user:<id> (DM) lub channel:<id> jako celów dostarczenia.
Tryby powiadomień o reakcjach: off, own (domyślnie), all, allowlist (z reactionAllowlist). Izolacja sesji wątków: thread.historyScope jest per wątek (domyślnie) lub współdzielone w całym kanale. thread.inheritParent kopiuje transkrypt kanału nadrzędnego do nowych wątków.
  • Natywne strumieniowanie Slacka oraz status w stylu asystenta Slacka „is typing…” w wątku wymagają celu odpowiedzi będącego wątkiem. DM najwyższego poziomu domyślnie pozostają poza wątkiem, więc używają typingReaction lub zwykłego dostarczania zamiast podglądu w stylu wątku.
  • typingReaction dodaje tymczasową reakcję do przychodzącej wiadomości Slacka, gdy odpowiedź jest w trakcie generowania, a następnie usuwa ją po zakończeniu. Użyj skrótu emoji Slacka, takiego jak "hourglass_flowing_sand".
  • channels.slack.execApprovals: natywne dla Slacka dostarczanie zatwierdzeń exec i autoryzacja zatwierdzających. Ten sam schemat co w Discordzie: enabled (true/false/"auto"), approvers (identyfikatory użytkowników Slacka), agentFilter, sessionFilter i target ("dm", "channel" lub "both").
Grupa akcjiDomyślnieUwagi
reactionswłączoneReagowanie + lista reakcji
messageswłączoneOdczyt/wysyłanie/edycja/usuwanie
pinswłączonePrzypinanie/odpinanie/lista
memberInfowłączoneInformacje o członku
emojiListwłączoneLista niestandardowych emoji

Mattermost

Mattermost jest dostarczany jako 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",
    },
  },
}
Tryby czatu: oncall (odpowiada na wzmiankę @, domyślnie), onmessage (każda wiadomość), onchar (wiadomości zaczynające się od prefiksu wyzwalacza). Gdy natywne polecenia Mattermost są włączone:
  • commands.callbackPath musi być ścieżką (na przykład /api/channels/mattermost/command), a nie pełnym URL-em.
  • commands.callbackUrl musi wskazywać na punkt końcowy Gateway OpenClaw i być osiągalny z serwera Mattermost.
  • Natywne wywołania zwrotne slash są uwierzytelniane tokenami per polecenie zwracanymi przez Mattermost podczas rejestracji poleceń slash. Jeśli rejestracja się nie powiedzie lub żadne polecenia nie zostaną aktywowane, OpenClaw odrzuci wywołania zwrotne z komunikatem Unauthorized: invalid command token.
  • Dla prywatnych/tailnet/wewnętrznych hostów callbacków Mattermost może wymagać, aby ServiceSettings.AllowedUntrustedInternalConnections zawierało host/domenę callbacku. Używaj wartości hosta/domeny, a nie pełnych URL-i.
  • channels.mattermost.configWrites: zezwala lub zabrania zapisów konfiguracji inicjowanych z Mattermost.
  • channels.mattermost.requireMention: wymaga @mention przed odpowiedzią w kanałach.
  • channels.mattermost.groups.<channelId>.requireMention: nadpisanie wymagania wzmianki per kanał ("*" dla wartości domyślnej).
  • Opcjonalne channels.mattermost.defaultAccount nadpisuje wybór konta domyślnego, jeśli pasuje do skonfigurowanego identyfikatora konta.

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,
    },
  },
}
Tryby powiadomień o reakcjach: off, own (domyślnie), all, allowlist (z reactionAllowlist).
  • channels.signal.account: przypina uruchamianie kanału do określonej tożsamości konta Signal.
  • channels.signal.configWrites: zezwala lub zabrania zapisów konfiguracji inicjowanych z Signal.
  • Opcjonalne channels.signal.defaultAccount nadpisuje wybór konta domyślnego, jeśli pasuje do skonfigurowanego identyfikatora konta.

BlueBubbles

BlueBubbles to zalecana ścieżka dla iMessage (oparta na Plugin, konfigurowana w channels.bluebubbles).
{
  channels: {
    bluebubbles: {
      enabled: true,
      dmPolicy: "pairing",
      // serverUrl, password, webhookPath, group controls, and advanced actions:
      // see /channels/bluebubbles
    },
  },
}
  • Główne ścieżki kluczy omawiane tutaj: channels.bluebubbles, channels.bluebubbles.dmPolicy.
  • Opcjonalne channels.bluebubbles.defaultAccount nadpisuje wybór konta domyślnego, jeśli pasuje do skonfigurowanego identyfikatora konta.
  • Wpisy najwyższego poziomu bindings[] z type: "acp" mogą wiązać rozmowy BlueBubbles z trwałymi sesjami ACP. Użyj uchwytu BlueBubbles lub ciągu docelowego (chat_id:*, chat_guid:*, chat_identifier:*) w match.peer.id. Współdzielona semantyka pól: ACP Agents.
  • Pełna konfiguracja kanału BlueBubbles jest opisana w BlueBubbles.

iMessage

OpenClaw uruchamia imsg rpc (JSON-RPC przez stdio). Nie jest wymagany daemon ani port.
{
  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",
    },
  },
}
  • Opcjonalne channels.imessage.defaultAccount nadpisuje wybór konta domyślnego, jeśli pasuje do skonfigurowanego identyfikatora konta.
  • Wymaga Full Disk Access do bazy danych Messages.
  • Preferuj cele chat_id:<id>. Użyj imsg chats --limit 20, aby wyświetlić listę czatów.
  • cliPath może wskazywać na wrapper SSH; ustaw remoteHost (host lub user@host) dla pobierania załączników przez SCP.
  • attachmentRoots i remoteAttachmentRoots ograniczają ścieżki przychodzących załączników (domyślnie: /Users/*/Library/Messages/Attachments).
  • SCP używa ścisłego sprawdzania klucza hosta, więc upewnij się, że klucz hosta przekaźnika już istnieje w ~/.ssh/known_hosts.
  • channels.imessage.configWrites: zezwala lub zabrania zapisów konfiguracji inicjowanych z iMessage.
  • Wpisy najwyższego poziomu bindings[] z type: "acp" mogą wiązać rozmowy iMessage z trwałymi sesjami ACP. Użyj znormalizowanego uchwytu lub jawnego celu czatu (chat_id:*, chat_guid:*, chat_identifier:*) w match.peer.id. Współdzielona semantyka pól: ACP Agents.
#!/usr/bin/env bash
exec ssh -T gateway-host imsg "$@"

Matrix

Matrix jest wspierany przez rozszerzenie i konfigurowany w 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",
        },
      },
    },
  },
}
  • Uwierzytelnianie tokenem używa accessToken; uwierzytelnianie hasłem używa userId + password.
  • channels.matrix.proxy kieruje ruch HTTP Matrix przez jawny serwer proxy HTTP(S). Nazwane konta mogą to nadpisać przez channels.matrix.accounts.<id>.proxy.
  • channels.matrix.network.dangerouslyAllowPrivateNetwork zezwala na prywatne/wewnętrzne homeservery. proxy i to sieciowe opt-in są niezależnymi mechanizmami kontroli.
  • channels.matrix.defaultAccount wybiera preferowane konto w konfiguracjach z wieloma kontami.
  • channels.matrix.autoJoin domyślnie ma wartość off, więc zaproszone pokoje i nowe zaproszenia w stylu DM są ignorowane, dopóki nie ustawisz autoJoin: "allowlist" z autoJoinAllowlist albo autoJoin: "always".
  • channels.matrix.execApprovals: natywne dla Matrix dostarczanie zatwierdzeń exec i autoryzacja zatwierdzających.
    • enabled: true, false lub "auto" (domyślnie). W trybie auto zatwierdzenia exec aktywują się, gdy zatwierdzających można rozwiązać z approvers lub commands.ownerAllowFrom.
    • approvers: identyfikatory użytkowników Matrix (np. @owner:example.org) uprawnione do zatwierdzania żądań exec.
    • agentFilter: opcjonalna lista dozwolonych identyfikatorów agentów. Pomiń, aby przekazywać zatwierdzenia dla wszystkich agentów.
    • sessionFilter: opcjonalne wzorce kluczy sesji (podciąg lub regex).
    • target: gdzie wysyłać prośby o zatwierdzenie. "dm" (domyślnie), "channel" (pokój źródłowy) lub "both".
    • Nadpisania per konto: channels.matrix.accounts.<id>.execApprovals.
  • channels.matrix.dm.sessionScope kontroluje, jak DM Matrix są grupowane w sesje: per-user (domyślnie) współdzieli według kierowanego peera, a per-room izoluje każdy pokój DM.
  • Sondy statusu Matrix i wyszukiwania w katalogu na żywo używają tej samej polityki proxy co ruch środowiska uruchomieniowego.
  • Pełna konfiguracja Matrix, reguły targetowania i przykłady konfiguracji są opisane w Matrix.

Microsoft Teams

Microsoft Teams jest wspierany przez rozszerzenie i konfigurowany w channels.msteams.
{
  channels: {
    msteams: {
      enabled: true,
      configWrites: true,
      // appId, appPassword, tenantId, webhook, team/channel policies:
      // see /channels/msteams
    },
  },
}
  • Główne ścieżki kluczy omawiane tutaj: channels.msteams, channels.msteams.configWrites.
  • Pełna konfiguracja Teams (poświadczenia, webhook, zasady DM/grup, nadpisania per zespół/per kanał) jest opisana w Microsoft Teams.

IRC

IRC jest wspierany przez rozszerzenie i konfigurowany w 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",
      },
    },
  },
}
  • Główne ścieżki kluczy omawiane tutaj: channels.irc, channels.irc.dmPolicy, channels.irc.configWrites, channels.irc.nickserv.*.
  • Opcjonalne channels.irc.defaultAccount nadpisuje wybór konta domyślnego, jeśli pasuje do skonfigurowanego identyfikatora konta.
  • Pełna konfiguracja kanału IRC (host/port/TLS/kanały/listy dozwolonych/wymaganie wzmianki) jest opisana w IRC.

Wiele kont (wszystkie kanały)

Uruchamiaj wiele kont na kanał (każde z własnym accountId):
{
  channels: {
    telegram: {
      accounts: {
        default: {
          name: "Primary bot",
          botToken: "123456:ABC...",
        },
        alerts: {
          name: "Alerts bot",
          botToken: "987654:XYZ...",
        },
      },
    },
  },
}
  • default jest używane, gdy accountId jest pominięte (CLI + routing).
  • Tokeny środowiskowe mają zastosowanie tylko do konta default.
  • Bazowe ustawienia kanału mają zastosowanie do wszystkich kont, chyba że zostaną nadpisane per konto.
  • Użyj bindings[].match.accountId, aby kierować każde konto do innego agenta.
  • Jeśli dodasz konto inne niż domyślne przez openclaw channels add (lub onboarding kanału), gdy nadal używasz jednokontowej konfiguracji najwyższego poziomu dla kanału, OpenClaw najpierw promuje jednokontowe wartości najwyższego poziomu o zakresie konta do mapy kont kanału, aby oryginalne konto nadal działało. Większość kanałów przenosi je do channels.<channel>.accounts.default; Matrix może zamiast tego zachować istniejący pasujący nazwany/domyslny cel.
  • Istniejące powiązania tylko-kanałowe (bez accountId) nadal dopasowują się do konta domyślnego; powiązania o zakresie konta pozostają opcjonalne.
  • openclaw doctor --fix również naprawia mieszane kształty, przenosząc jednokontowe wartości najwyższego poziomu o zakresie konta do promowanego konta wybranego dla tego kanału. Większość kanałów używa accounts.default; Matrix może zamiast tego zachować istniejący pasujący nazwany/domyslny cel.

Inne kanały rozszerzeń

Wiele kanałów rozszerzeń jest konfigurowanych jako channels.<id> i opisanych na ich dedykowanych stronach kanałów (na przykład Feishu, Matrix, LINE, Nostr, Zalo, Nextcloud Talk, Synology Chat i Twitch). Zobacz pełny indeks kanałów: Channels.

Wymaganie wzmianki w czatach grupowych

Wiadomości grupowe domyślnie wymagają wzmianki (wzmianka z metadanych lub bezpieczne wzorce regex). Dotyczy czatów grupowych WhatsApp, Telegram, Discord, Google Chat i iMessage. Typy wzmianek:
  • Wzmianki z metadanych: natywne wzmianki @ platformy. Ignorowane w trybie self-chat WhatsApp.
  • Wzorce tekstowe: bezpieczne wzorce regex w agents.list[].groupChat.mentionPatterns. Nieprawidłowe wzorce i niebezpieczne zagnieżdżone powtórzenia są ignorowane.
  • Wymaganie wzmianki jest egzekwowane tylko wtedy, gdy wykrycie jest możliwe (natywne wzmianki lub co najmniej jeden wzorzec).
{
  messages: {
    groupChat: { historyLimit: 50 },
  },
  agents: {
    list: [{ id: "main", groupChat: { mentionPatterns: ["@openclaw", "openclaw"] } }],
  },
}
messages.groupChat.historyLimit ustawia globalną wartość domyślną. Kanały mogą ją nadpisać przez channels.<channel>.historyLimit (lub per konto). Ustaw 0, aby wyłączyć.

Limity historii DM

{
  channels: {
    telegram: {
      dmHistoryLimit: 30,
      dms: {
        "123456789": { historyLimit: 50 },
      },
    },
  },
}
Rozwiązywanie: nadpisanie per DM → domyślna wartość dostawcy → brak limitu (zachowywane wszystko). Obsługiwane: telegram, whatsapp, discord, slack, signal, imessage, msteams.

Tryb self-chat

Uwzględnij własny numer w allowFrom, aby włączyć tryb self-chat (ignoruje natywne wzmianki @, odpowiada tylko na wzorce tekstowe):
{
  channels: {
    whatsapp: {
      allowFrom: ["+15555550123"],
      groups: { "*": { requireMention: true } },
    },
  },
  agents: {
    list: [
      {
        id: "main",
        groupChat: { mentionPatterns: ["reisponde", "@openclaw"] },
      },
    ],
  },
}

Polecenia (obsługa poleceń czatu)

{
  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,
  },
}
  • Ten blok konfiguruje powierzchnie poleceń. Bieżący katalog wbudowanych + bundled poleceń znajdziesz w Slash Commands.
  • Ta strona jest dokumentacją kluczy konfiguracji, a nie pełnym katalogiem poleceń. Polecenia należące do kanałów/Pluginów, takie jak QQ Bot /bot-ping /bot-help /bot-logs, LINE /card, device-pair /pair, memory /dreaming, phone-control /phone i Talk /voice, są opisane na stronach ich kanałów/Pluginów oraz w Slash Commands.
  • Polecenia tekstowe muszą być samodzielnymi wiadomościami zaczynającymi się od /.
  • native: "auto" włącza natywne polecenia dla Discorda/Telegrama, pozostawia Slack wyłączony.
  • nativeSkills: "auto" włącza natywne polecenia Skills dla Discorda/Telegrama, pozostawia Slack wyłączony.
  • Nadpisanie per kanał: channels.discord.commands.native (bool lub "auto"). false czyści wcześniej zarejestrowane polecenia.
  • Nadpisz rejestrację natywnych Skills per kanał przez channels.<provider>.commands.nativeSkills.
  • channels.telegram.customCommands dodaje dodatkowe wpisy menu bota Telegram.
  • bash: true włącza ! <cmd> dla powłoki hosta. Wymaga tools.elevated.enabled oraz nadawcy w tools.elevated.allowFrom.<channel>.
  • config: true włącza /config (odczytuje/zapisuje openclaw.json). Dla klientów Gateway chat.send trwałe zapisy /config set|unset wymagają także operator.admin; tylko do odczytu /config show pozostaje dostępne dla zwykłych klientów operatora z zakresem zapisu.
  • mcp: true włącza /mcp dla zarządzanej przez OpenClaw konfiguracji serwera MCP w mcp.servers.
  • plugins: true włącza /plugins do wykrywania Pluginów, instalacji oraz sterowania włączaniem/wyłączaniem.
  • channels.<provider>.configWrites ogranicza mutacje konfiguracji per kanał (domyślnie: true).
  • Dla kanałów z wieloma kontami channels.<provider>.accounts.<id>.configWrites również ogranicza zapisy kierowane do tego konta (na przykład /allowlist --config --account <id> lub /config set channels.<provider>.accounts.<id>...).
  • restart: false wyłącza /restart i działania narzędzia restartu Gateway. Domyślnie: true.
  • ownerAllowFrom to jawna lista dozwolonych właściciela dla poleceń/narzędzi tylko dla właściciela. Jest oddzielna od allowFrom.
  • ownerDisplay: "hash" hashuje identyfikatory właściciela w system prompt. Ustaw ownerDisplaySecret, aby sterować haszowaniem.
  • allowFrom jest per dostawca. Gdy jest ustawione, jest jedynym źródłem autoryzacji (listy dozwolonych/parowanie kanału i useAccessGroups są ignorowane).
  • useAccessGroups: false pozwala poleceniom omijać zasady grup dostępu, gdy allowFrom nie jest ustawione.
  • Mapa dokumentacji poleceń:

Domyślne ustawienia agenta

agents.defaults.workspace

Domyślnie: ~/.openclaw/workspace.
{
  agents: { defaults: { workspace: "~/.openclaw/workspace" } },
}

agents.defaults.repoRoot

Opcjonalny katalog główny repozytorium wyświetlany w wierszu Runtime system prompt. Jeśli nie jest ustawiony, OpenClaw wykrywa go automatycznie, przechodząc w górę od workspace.
{
  agents: { defaults: { repoRoot: "~/Projects/openclaw" } },
}

agents.defaults.skills

Opcjonalna domyślna lista dozwolonych Skills dla agentów, które nie ustawiają agents.list[].skills.
{
  agents: {
    defaults: { skills: ["github", "weather"] },
    list: [
      { id: "writer" }, // inherits github, weather
      { id: "docs", skills: ["docs-search"] }, // replaces defaults
      { id: "locked-down", skills: [] }, // no skills
    ],
  },
}
  • Pomiń agents.defaults.skills, aby domyślnie nie ograniczać Skills.
  • Pomiń agents.list[].skills, aby dziedziczyć wartości domyślne.
  • Ustaw agents.list[].skills: [], aby nie mieć żadnych Skills.
  • Niepusta lista agents.list[].skills jest końcowym zestawem dla tego agenta; nie łączy się z wartościami domyślnymi.

agents.defaults.skipBootstrap

Wyłącza automatyczne tworzenie plików bootstrap workspace (AGENTS.md, SOUL.md, TOOLS.md, IDENTITY.md, USER.md, HEARTBEAT.md, BOOTSTRAP.md).
{
  agents: { defaults: { skipBootstrap: true } },
}

agents.defaults.contextInjection

Steruje tym, kiedy pliki bootstrap workspace są wstrzykiwane do system prompt. Domyślnie: "always".
  • "continuation-skip": bezpieczne tury kontynuacji (po zakończonej odpowiedzi asystenta) pomijają ponowne wstrzyknięcie bootstrap workspace, zmniejszając rozmiar prompt. Uruchomienia Heartbeat i ponowne próby po Compaction nadal przebudowują kontekst.
{
  agents: { defaults: { contextInjection: "continuation-skip" } },
}

agents.defaults.bootstrapMaxChars

Maksymalna liczba znaków na plik bootstrap workspace przed obcięciem. Domyślnie: 20000.
{
  agents: { defaults: { bootstrapMaxChars: 20000 } },
}

agents.defaults.bootstrapTotalMaxChars

Maksymalna łączna liczba znaków wstrzykiwanych we wszystkich plikach bootstrap workspace. Domyślnie: 150000.
{
  agents: { defaults: { bootstrapTotalMaxChars: 150000 } },
}

agents.defaults.bootstrapPromptTruncationWarning

Steruje widocznym dla agenta tekstem ostrzeżenia, gdy kontekst bootstrap jest obcinany. Domyślnie: "once".
  • "off": nigdy nie wstrzykuje tekstu ostrzeżenia do system prompt.
  • "once": wstrzykuje ostrzeżenie raz dla każdego unikalnego podpisu obcięcia (zalecane).
  • "always": wstrzykuje ostrzeżenie przy każdym uruchomieniu, gdy istnieje obcięcie.
{
  agents: { defaults: { bootstrapPromptTruncationWarning: "once" } }, // off | once | always
}

Mapa właścicieli budżetu kontekstu

OpenClaw ma wiele budżetów prompt/kontekstu o dużej objętości i są one celowo podzielone według podsystemów zamiast kierowania wszystkiego przez jedno ogólne ustawienie.
  • agents.defaults.bootstrapMaxChars / agents.defaults.bootstrapTotalMaxChars: zwykłe wstrzykiwanie bootstrap workspace.
  • agents.defaults.startupContext.*: jednorazowe preludium startowe /new i /reset, w tym ostatnie dzienne pliki memory/*.md.
  • skills.limits.*: kompaktowa lista Skills wstrzykiwana do system prompt.
  • agents.defaults.contextLimits.*: ograniczone wycinki środowiska uruchomieniowego i wstrzykiwane bloki należące do runtime.
  • memory.qmd.limits.*: rozmiar fragmentów wyszukiwania zaindeksowanej pamięci i wstrzyknięć.
Użyj pasującego nadpisania per agent tylko wtedy, gdy jeden agent potrzebuje innego budżetu:
  • agents.list[].skillsLimits.maxSkillsPromptChars
  • agents.list[].contextLimits.*

agents.defaults.startupContext

Steruje preludium startowym pierwszej tury wstrzykiwanym przy pustych uruchomieniach /new i /reset.
{
  agents: {
    defaults: {
      startupContext: {
        enabled: true,
        applyOn: ["new", "reset"],
        dailyMemoryDays: 2,
        maxFileBytes: 16384,
        maxFileChars: 1200,
        maxTotalChars: 2800,
      },
    },
  },
}

agents.defaults.contextLimits

Współdzielone wartości domyślne dla ograniczonych powierzchni kontekstu runtime.
{
  agents: {
    defaults: {
      contextLimits: {
        memoryGetMaxChars: 12000,
        memoryGetDefaultLines: 120,
        toolResultMaxChars: 16000,
        postCompactionMaxChars: 1800,
      },
    },
  },
}
  • memoryGetMaxChars: domyślny limit wycinka memory_get przed dodaniem metadanych obcięcia i informacji o kontynuacji.
  • memoryGetDefaultLines: domyślne okno wierszy memory_get, gdy lines jest pominięte.
  • toolResultMaxChars: limit wyników narzędzi na żywo używany dla utrwalonych wyników i odzyskiwania po przepełnieniu.
  • postCompactionMaxChars: limit wycinka AGENTS.md używany podczas wstrzykiwania odświeżenia po Compaction.

agents.list[].contextLimits

Nadpisanie per agent dla współdzielonych ustawień contextLimits. Pominięte pola dziedziczą z agents.defaults.contextLimits.
{
  agents: {
    defaults: {
      contextLimits: {
        memoryGetMaxChars: 12000,
        toolResultMaxChars: 16000,
      },
    },
    list: [
      {
        id: "tiny-local",
        contextLimits: {
          memoryGetMaxChars: 6000,
          toolResultMaxChars: 8000,
        },
      },
    ],
  },
}

skills.limits.maxSkillsPromptChars

Globalny limit dla kompaktowej listy Skills wstrzykiwanej do system prompt. To nie wpływa na odczyt plików SKILL.md na żądanie.
{
  skills: {
    limits: {
      maxSkillsPromptChars: 18000,
    },
  },
}

agents.list[].skillsLimits.maxSkillsPromptChars

Nadpisanie per agent dla budżetu prompt Skills.
{
  agents: {
    list: [
      {
        id: "tiny-local",
        skillsLimits: {
          maxSkillsPromptChars: 6000,
        },
      },
    ],
  },
}

agents.defaults.imageMaxDimensionPx

Maksymalny rozmiar w pikselach dla dłuższego boku obrazu w blokach obrazów transkryptu/narzędzi przed wywołaniami dostawcy. Domyślnie: 1200. Niższe wartości zwykle zmniejszają użycie tokenów vision i rozmiar ładunku żądania przy przebiegach z dużą liczbą zrzutów ekranu. Wyższe wartości zachowują więcej szczegółów wizualnych.
{
  agents: { defaults: { imageMaxDimensionPx: 1200 } },
}

agents.defaults.userTimezone

Strefa czasowa dla kontekstu system prompt (nie znaczników czasu wiadomości). Wartość zapasowa pochodzi ze strefy czasowej hosta.
{
  agents: { defaults: { userTimezone: "America/Chicago" } },
}

agents.defaults.timeFormat

Format czasu w system prompt. Domyślnie: auto (preferencja systemu operacyjnego).
{
  agents: { defaults: { timeFormat: "auto" } }, // auto | 12 | 24
}

agents.defaults.model

{
  agents: {
    defaults: {
      models: {
        "anthropic/claude-opus-4-6": { alias: "opus" },
        "minimax/MiniMax-M2.7": { alias: "minimax" },
      },
      model: {
        primary: "anthropic/claude-opus-4-6",
        fallbacks: ["minimax/MiniMax-M2.7"],
      },
      imageModel: {
        primary: "openrouter/qwen/qwen-2.5-vl-72b-instruct:free",
        fallbacks: ["openrouter/google/gemini-2.0-flash-vision:free"],
      },
      imageGenerationModel: {
        primary: "openai/gpt-image-1",
        fallbacks: ["google/gemini-3.1-flash-image-preview"],
      },
      videoGenerationModel: {
        primary: "qwen/wan2.6-t2v",
        fallbacks: ["qwen/wan2.6-i2v"],
      },
      pdfModel: {
        primary: "anthropic/claude-opus-4-6",
        fallbacks: ["openai/gpt-5.4-mini"],
      },
      params: { cacheRetention: "long" }, // global default provider params
      embeddedHarness: {
        runtime: "auto", // auto | pi | registered harness id, e.g. codex
        fallback: "pi", // pi | none
      },
      pdfMaxBytesMb: 10,
      pdfMaxPages: 20,
      thinkingDefault: "low",
      verboseDefault: "off",
      elevatedDefault: "on",
      timeoutSeconds: 600,
      mediaMaxMb: 5,
      contextTokens: 200000,
      maxConcurrent: 3,
    },
  },
}
  • model: akceptuje albo ciąg znaków ("provider/model"), albo obiekt ({ primary, fallbacks }).
    • Forma ciągu ustawia tylko model podstawowy.
    • Forma obiektu ustawia model podstawowy oraz uporządkowane modele przełączania awaryjnego.
  • imageModel: akceptuje albo ciąg znaków ("provider/model"), albo obiekt ({ primary, fallbacks }).
    • Używany przez ścieżkę narzędzia image jako konfiguracja modelu vision.
    • Używany także jako routing zapasowy, gdy wybrany/domyslny model nie może przyjąć wejścia obrazu.
  • imageGenerationModel: akceptuje albo ciąg znaków ("provider/model"), albo obiekt ({ primary, fallbacks }).
    • Używany przez współdzieloną funkcję generowania obrazów i każdą przyszłą powierzchnię narzędzia/Pluginu generującą obrazy.
    • Typowe wartości: google/gemini-3.1-flash-image-preview dla natywnego generowania obrazów Gemini, fal/fal-ai/flux/dev dla fal lub openai/gpt-image-1 dla OpenAI Images.
    • Jeśli wybierzesz bezpośrednio provider/model, skonfiguruj również pasujące uwierzytelnianie/klucz API dostawcy (na przykład GEMINI_API_KEY lub GOOGLE_API_KEY dla google/*, OPENAI_API_KEY dla openai/*, FAL_KEY dla fal/*).
    • Jeśli pominięte, image_generate nadal może wywnioskować domyślną wartość dostawcy opartą na uwierzytelnieniu. Najpierw próbuje bieżącego domyślnego dostawcy, a potem pozostałych zarejestrowanych dostawców generowania obrazów w kolejności identyfikatorów dostawców.
  • musicGenerationModel: akceptuje albo ciąg znaków ("provider/model"), albo obiekt ({ primary, fallbacks }).
    • Używany przez współdzieloną funkcję generowania muzyki i wbudowane narzędzie music_generate.
    • Typowe wartości: google/lyria-3-clip-preview, google/lyria-3-pro-preview lub minimax/music-2.5+.
    • Jeśli pominięte, music_generate nadal może wywnioskować domyślną wartość dostawcy opartą na uwierzytelnieniu. Najpierw próbuje bieżącego domyślnego dostawcy, a potem pozostałych zarejestrowanych dostawców generowania muzyki w kolejności identyfikatorów dostawców.
    • Jeśli wybierzesz bezpośrednio provider/model, skonfiguruj również pasujące uwierzytelnianie/klucz API dostawcy.
  • videoGenerationModel: akceptuje albo ciąg znaków ("provider/model"), albo obiekt ({ primary, fallbacks }).
    • Używany przez współdzieloną funkcję generowania wideo i wbudowane narzędzie video_generate.
    • Typowe wartości: qwen/wan2.6-t2v, qwen/wan2.6-i2v, qwen/wan2.6-r2v, qwen/wan2.6-r2v-flash lub qwen/wan2.7-r2v.
    • Jeśli pominięte, video_generate nadal może wywnioskować domyślną wartość dostawcy opartą na uwierzytelnieniu. Najpierw próbuje bieżącego domyślnego dostawcy, a potem pozostałych zarejestrowanych dostawców generowania wideo w kolejności identyfikatorów dostawców.
    • Jeśli wybierzesz bezpośrednio provider/model, skonfiguruj również pasujące uwierzytelnianie/klucz API dostawcy.
    • Bundled dostawca generowania wideo Qwen obsługuje maksymalnie 1 wyjściowe wideo, 1 wejściowy obraz, 4 wejściowe filmy, czas trwania do 10 sekund oraz opcje na poziomie dostawcy size, aspectRatio, resolution, audio i watermark.
  • pdfModel: akceptuje albo ciąg znaków ("provider/model"), albo obiekt ({ primary, fallbacks }).
    • Używany przez narzędzie pdf do routingu modelu.
    • Jeśli pominięty, narzędzie PDF przechodzi awaryjnie do imageModel, a następnie do rozwiązanego modelu sesji/domyslnego.
  • pdfMaxBytesMb: domyślny limit rozmiaru PDF dla narzędzia pdf, gdy maxBytesMb nie jest przekazane w czasie wywołania.
  • pdfMaxPages: domyślna maksymalna liczba stron uwzględnianych przez tryb awaryjnej ekstrakcji w narzędziu pdf.
  • verboseDefault: domyślny poziom verbose dla agentów. Wartości: "off", "on", "full". Domyślnie: "off".
  • elevatedDefault: domyślny poziom wyjścia elevated dla agentów. Wartości: "off", "on", "ask", "full". Domyślnie: "on".
  • model.primary: format provider/model (np. openai/gpt-5.4). Jeśli pominiesz dostawcę, OpenClaw najpierw próbuje aliasu, potem unikalnego dopasowania dokładnego identyfikatora modelu w skonfigurowanych dostawcach, a dopiero potem wraca do skonfigurowanego domyślnego dostawcy (przestarzałe zachowanie zgodności, więc preferuj jawne provider/model). Jeśli ten dostawca nie udostępnia już skonfigurowanego modelu domyślnego, OpenClaw przechodzi awaryjnie do pierwszego skonfigurowanego dostawcy/modelu zamiast ujawniać przestarzałą wartość domyślną usuniętego dostawcy.
  • models: skonfigurowany katalog modeli i lista dozwolonych dla /model. Każdy wpis może zawierać alias (skrót) i params (specyficzne dla dostawcy, na przykład temperature, maxTokens, cacheRetention, context1m).
  • params: globalne domyślne parametry dostawcy stosowane do wszystkich modeli. Ustawiane w agents.defaults.params (np. { cacheRetention: "long" }).
  • Priorytet scalania params (konfiguracja): agents.defaults.params (globalna baza) jest nadpisywane przez agents.defaults.models["provider/model"].params (per model), a następnie agents.list[].params (pasujący identyfikator agenta) nadpisuje po kluczu. Szczegóły znajdziesz w Prompt Caching.
  • embeddedHarness: domyślna polityka niskopoziomowego runtime wbudowanego agenta. Użyj runtime: "auto", aby pozwolić zarejestrowanym harnessom Pluginów przejmować obsługiwane modele, runtime: "pi", aby wymusić wbudowany harness PI, albo zarejestrowanego identyfikatora harnessu, np. runtime: "codex". Ustaw fallback: "none", aby wyłączyć automatyczny zapasowy fallback PI.
  • Pisarze konfiguracji, którzy mutują te pola (na przykład /models set, /models set-image oraz polecenia dodawania/usuwania fallbacków), zapisują kanoniczną formę obiektu i w miarę możliwości zachowują istniejące listy fallbacków.
  • maxConcurrent: maksymalna liczba równoległych uruchomień agentów między sesjami (każda sesja nadal jest serializowana). Domyślnie: 4.

agents.defaults.embeddedHarness

embeddedHarness kontroluje, który niskopoziomowy executor uruchamia tury wbudowanego agenta. Większość wdrożeń powinna zachować wartość domyślną { runtime: "auto", fallback: "pi" }. Użyj tego, gdy zaufany Plugin udostępnia natywny harness, taki jak bundled harness serwera aplikacji Codex.
{
  agents: {
    defaults: {
      model: "codex/gpt-5.4",
      embeddedHarness: {
        runtime: "codex",
        fallback: "none",
      },
    },
  },
}
  • runtime: "auto", "pi" lub identyfikator zarejestrowanego harnessu Pluginu. Bundled Plugin Codex rejestruje codex.
  • fallback: "pi" lub "none". "pi" zachowuje wbudowany harness PI jako fallback zgodności. "none" powoduje, że brakujący lub nieobsługiwany wybór harnessu Pluginu kończy się błędem zamiast cichego użycia PI.
  • Nadpisania środowiskowe: OPENCLAW_AGENT_RUNTIME=<id|auto|pi> nadpisuje runtime; OPENCLAW_AGENT_HARNESS_FALLBACK=none wyłącza fallback PI dla tego procesu.
  • Dla wdrożeń tylko z Codex ustaw model: "codex/gpt-5.4", embeddedHarness.runtime: "codex" i embeddedHarness.fallback: "none".
  • To kontroluje tylko wbudowany harness czatu. Generowanie mediów, vision, PDF, muzyka, wideo i TTS nadal używają swoich ustawień dostawcy/modelu.
Wbudowane skróty aliasów (mają zastosowanie tylko wtedy, gdy model jest w agents.defaults.models):
AliasModel
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
Skonfigurowane przez Ciebie aliasy zawsze mają pierwszeństwo przed domyślnymi. Modele Z.AI GLM-4.x automatycznie włączają tryb thinking, chyba że ustawisz --thinking off lub samodzielnie zdefiniujesz agents.defaults.models["zai/<model>"].params.thinking. Modele Z.AI domyślnie włączają tool_stream do strumieniowania wywołań narzędzi. Ustaw agents.defaults.models["zai/<model>"].params.tool_stream na false, aby to wyłączyć. Modele Anthropic Claude 4.6 domyślnie używają thinking adaptive, gdy nie ustawiono jawnego poziomu thinking.

agents.defaults.cliBackends

Opcjonalne backendy CLI dla tekstowych przebiegów awaryjnych (bez wywołań narzędzi). Przydatne jako kopia zapasowa, gdy dostawcy API zawodzą.
{
  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",
        },
      },
    },
  },
}
  • Backendy CLI są przede wszystkim tekstowe; narzędzia są zawsze wyłączone.
  • Sesje są obsługiwane, gdy ustawione jest sessionArg.
  • Przekazywanie obrazów jest obsługiwane, gdy imageArg akceptuje ścieżki plików.

agents.defaults.systemPromptOverride

Zastępuje cały system prompt złożony przez OpenClaw stałym ciągiem znaków. Ustawiane na poziomie domyślnym (agents.defaults.systemPromptOverride) lub per agent (agents.list[].systemPromptOverride). Wartości per agent mają pierwszeństwo; wartość pusta lub zawierająca tylko białe znaki jest ignorowana. Przydatne do kontrolowanych eksperymentów z promptami.
{
  agents: {
    defaults: {
      systemPromptOverride: "You are a helpful assistant.",
    },
  },
}

agents.defaults.heartbeat

Okresowe uruchomienia 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: ciąg czasu trwania (ms/s/m/h). Domyślnie: 30m (uwierzytelnianie kluczem API) lub 1h (uwierzytelnianie OAuth). Ustaw 0m, aby wyłączyć.
  • includeSystemPromptSection: gdy ma wartość false, pomija sekcję Heartbeat w system prompt i pomija wstrzykiwanie HEARTBEAT.md do kontekstu bootstrap. Domyślnie: true.
  • suppressToolErrorWarnings: gdy ma wartość true, ukrywa ładunki ostrzeżeń o błędach narzędzi podczas uruchomień Heartbeat.
  • timeoutSeconds: maksymalny czas w sekundach dozwolony dla tury agenta Heartbeat przed jej przerwaniem. Pozostaw nieustawione, aby użyć agents.defaults.timeoutSeconds.
  • directPolicy: zasada dostarczania bezpośredniego/DM. allow (domyślnie) zezwala na dostarczanie do celu bezpośredniego. block blokuje dostarczanie do celu bezpośredniego i emituje reason=dm-blocked.
  • lightContext: gdy ma wartość true, uruchomienia Heartbeat używają lekkiego kontekstu bootstrap i zachowują tylko HEARTBEAT.md z plików bootstrap workspace.
  • isolatedSession: gdy ma wartość true, każde uruchomienie Heartbeat odbywa się w świeżej sesji bez wcześniejszej historii rozmowy. Ten sam wzorzec izolacji co Cron sessionTarget: "isolated". Zmniejsza koszt tokenów na Heartbeat z około 100K do około 2-5K tokenów.
  • Per agent: ustaw agents.list[].heartbeat. Gdy dowolny agent definiuje heartbeat, Heartbeat uruchamiają tylko te agenty.
  • Heartbeat uruchamia pełne tury agenta — krótsze interwały zużywają więcej tokenów.

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 lub safeguard (podsumowywanie porcjami dla długiej historii). Zobacz Compaction.
  • provider: identyfikator zarejestrowanego Pluginu dostawcy Compaction. Gdy ustawione, wywoływane jest summarize() dostawcy zamiast wbudowanego podsumowywania LLM. W razie błędu wraca do wbudowanego trybu. Ustawienie dostawcy wymusza mode: "safeguard". Zobacz Compaction.
  • timeoutSeconds: maksymalna liczba sekund dozwolona dla pojedynczej operacji Compaction, po której OpenClaw ją przerywa. Domyślnie: 900.
  • identifierPolicy: strict (domyślnie), off lub custom. strict dodaje na początku wbudowane wskazówki dotyczące zachowywania nieprzezroczystych identyfikatorów podczas podsumowywania Compaction.
  • identifierInstructions: opcjonalny własny tekst zachowania identyfikatorów używany, gdy identifierPolicy=custom.
  • postCompactionSections: opcjonalne nazwy sekcji H2/H3 z AGENTS.md do ponownego wstrzyknięcia po Compaction. Domyślnie ["Session Startup", "Red Lines"]; ustaw [], aby wyłączyć ponowne wstrzyknięcie. Gdy nieustawione lub jawnie ustawione na tę domyślną parę, starsze nagłówki Every Session/Safety są również akceptowane jako zgodność wsteczna.
  • model: opcjonalne nadpisanie provider/model-id tylko dla podsumowywania Compaction. Użyj tego, gdy główna sesja ma pozostać przy jednym modelu, ale podsumowania Compaction mają działać na innym; gdy nieustawione, Compaction używa modelu podstawowego sesji.
  • notifyUser: gdy true, wysyła krótkie powiadomienie do użytkownika, gdy rozpoczyna się Compaction (na przykład „Trwa kompaktowanie kontekstu…” ). Domyślnie wyłączone, aby Compaction pozostawał cichy.
  • memoryFlush: cicha agentowa tura przed automatycznym Compaction, aby zapisać trwałe wspomnienia. Pomijane, gdy workspace jest tylko do odczytu.

agents.defaults.contextPruning

Przycina stare wyniki narzędzi z kontekstu w pamięci przed wysłaniem do LLM. Nie modyfikuje historii sesji zapisanej na dysku.
{
  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" włącza przebiegi przycinania.
  • ttl określa, jak często przycinanie może uruchomić się ponownie (po ostatnim użyciu pamięci podręcznej).
  • Przycinanie najpierw miękko skraca zbyt duże wyniki narzędzi, a następnie w razie potrzeby całkowicie czyści starsze wyniki narzędzi.
Miękkie skracanie zachowuje początek i koniec oraz wstawia ... pośrodku.Twarde czyszczenie zastępuje cały wynik narzędzia symbolem zastępczym.Uwagi:
  • Bloki obrazów nigdy nie są skracane/czyszczone.
  • Proporcje są oparte na znakach (w przybliżeniu), a nie na dokładnej liczbie tokenów.
  • Jeśli istnieje mniej niż keepLastAssistants wiadomości asystenta, przycinanie jest pomijane.
Szczegóły zachowania znajdziesz w Session Pruning.

Strumieniowanie blokowe

{
  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)
    },
  },
}
  • Kanały inne niż Telegram wymagają jawnego *.blockStreaming: true, aby włączyć odpowiedzi blokowe.
  • Nadpisania kanału: channels.<channel>.blockStreamingCoalesce (oraz warianty per konto). Signal/Slack/Discord/Google Chat domyślnie używają minChars: 1500.
  • humanDelay: losowa pauza między odpowiedziami blokowymi. natural = 800–2500 ms. Nadpisanie per agent: agents.list[].humanDelay.
Szczegóły zachowania i porcjowania znajdziesz w Streaming.

Wskaźniki pisania

{
  agents: {
    defaults: {
      typingMode: "instant", // never | instant | thinking | message
      typingIntervalSeconds: 6,
    },
  },
}
  • Wartości domyślne: instant dla czatów bezpośrednich/wzmianek, message dla niewzmiankowanych czatów grupowych.
  • Nadpisania per sesja: session.typingMode, session.typingIntervalSeconds.
Zobacz Typing Indicators.

agents.defaults.sandbox

Opcjonalny sandboxing dla wbudowanego agenta. Pełny przewodnik znajdziesz w Sandboxing.
{
  agents: {
    defaults: {
      sandbox: {
        mode: "non-main", // off | non-main | all
        backend: "docker", // docker | ssh | openshell
        scope: "agent", // session | agent | shared
        workspaceAccess: "none", // none | ro | rw
        workspaceRoot: "~/.openclaw/sandboxes",
        docker: {
          image: "openclaw-sandbox:bookworm-slim",
          containerPrefix: "openclaw-sbx-",
          workdir: "/workspace",
          readOnlyRoot: true,
          tmpfs: ["/tmp", "/var/tmp", "/run"],
          network: "none",
          user: "1000:1000",
          capDrop: ["ALL"],
          env: { LANG: "C.UTF-8" },
          setupCommand: "apt-get update && apt-get install -y git curl jq",
          pidsLimit: 256,
          memory: "1g",
          memorySwap: "2g",
          cpus: 1,
          ulimits: {
            nofile: { soft: 1024, hard: 2048 },
            nproc: 256,
          },
          seccompProfile: "/path/to/seccomp.json",
          apparmorProfile: "openclaw-sandbox",
          dns: ["1.1.1.1", "8.8.8.8"],
          extraHosts: ["internal.service:10.0.0.5"],
          binds: ["/home/user/source:/source:rw"],
        },
        ssh: {
          target: "user@gateway-host:22",
          command: "ssh",
          workspaceRoot: "/tmp/openclaw-sandboxes",
          strictHostKeyChecking: true,
          updateHostKeys: true,
          identityFile: "~/.ssh/id_ed25519",
          certificateFile: "~/.ssh/id_ed25519-cert.pub",
          knownHostsFile: "~/.ssh/known_hosts",
          // SecretRefs / inline 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: lokalny runtime Docker (domyślnie)
  • ssh: ogólny zdalny runtime oparty na SSH
  • openshell: runtime OpenShell
Gdy wybrane jest backend: "openshell", ustawienia specyficzne dla runtime są przenoszone do plugins.entries.openshell.config.Konfiguracja backendu SSH:
  • target: cel SSH w formie user@host[:port]
  • command: polecenie klienta SSH (domyślnie: ssh)
  • workspaceRoot: bezwzględny zdalny katalog główny używany dla workspace per zakres
  • identityFile / certificateFile / knownHostsFile: istniejące lokalne pliki przekazywane do OpenSSH
  • identityData / certificateData / knownHostsData: zawartość inline lub SecretRef, które OpenClaw materializuje do plików tymczasowych w czasie działania
  • strictHostKeyChecking / updateHostKeys: ustawienia zasad klucza hosta OpenSSH
Priorytet uwierzytelniania SSH:
  • identityData ma pierwszeństwo przed identityFile
  • certificateData ma pierwszeństwo przed certificateFile
  • knownHostsData ma pierwszeństwo przed knownHostsFile
  • Wartości *Data oparte na SecretRef są rozwiązywane z aktywnej migawki runtime sekretów przed rozpoczęciem sesji sandboxa
Zachowanie backendu SSH:
  • inicjuje zdalny workspace raz po utworzeniu lub odtworzeniu
  • następnie utrzymuje zdalny workspace SSH jako kanoniczny
  • kieruje exec, narzędzia plikowe i ścieżki mediów przez SSH
  • nie synchronizuje automatycznie zdalnych zmian z powrotem na hosta
  • nie obsługuje kontenerów przeglądarki sandboxa
Dostęp do workspace:
  • none: workspace sandboxa per zakres pod ~/.openclaw/sandboxes
  • ro: workspace sandboxa pod /workspace, workspace agenta montowany tylko do odczytu pod /agent
  • rw: workspace agenta montowany do odczytu i zapisu pod /workspace
Zakres:
  • session: kontener + workspace per sesja
  • agent: jeden kontener + workspace per agent (domyślnie)
  • shared: współdzielony kontener i workspace (brak izolacji między sesjami)
Konfiguracja Pluginu 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,
        },
      },
    },
  },
}
Tryb OpenShell:
  • mirror: inicjuje zdalne środowisko z lokalnego przed exec, synchronizuje z powrotem po exec; lokalny workspace pozostaje kanoniczny
  • remote: inicjuje zdalne środowisko raz podczas tworzenia sandboxa, a następnie utrzymuje zdalny workspace jako kanoniczny
W trybie remote lokalne zmiany hosta wykonane poza OpenClaw nie są automatycznie synchronizowane do sandboxa po kroku inicjalizacji. Transport odbywa się przez SSH do sandboxa OpenShell, ale Plugin zarządza cyklem życia sandboxa i opcjonalną synchronizacją lustrzaną.setupCommand uruchamia się raz po utworzeniu kontenera (przez sh -lc). Wymaga wychodzącego dostępu do sieci, zapisywalnego katalogu głównego i użytkownika root.Kontenery domyślnie używają network: "none" — ustaw "bridge" (lub własną sieć bridge), jeśli agent potrzebuje dostępu wychodzącego. "host" jest blokowane. "container:<id>" jest domyślnie blokowane, chyba że jawnie ustawisz sandbox.docker.dangerouslyAllowContainerNamespaceJoin: true (tryb awaryjny).Przychodzące załączniki są umieszczane w media/inbound/* w aktywnym workspace.docker.binds montuje dodatkowe katalogi hosta; globalne i per-agent binds są scalane.Sandboxowana przeglądarka (sandbox.browser.enabled): Chromium + CDP w kontenerze. URL noVNC jest wstrzykiwany do system prompt. Nie wymaga browser.enabled w openclaw.json. Dostęp obserwatora noVNC domyślnie używa uwierzytelniania VNC, a OpenClaw emituje URL z krótkotrwałym tokenem (zamiast ujawniać hasło we współdzielonym URL).
  • allowHostControl: false (domyślnie) blokuje sandboxowane sesje przed kierowaniem do przeglądarki hosta.
  • network domyślnie ma wartość openclaw-sandbox-browser (dedykowana sieć bridge). Ustaw bridge tylko wtedy, gdy jawnie chcesz globalnej łączności bridge.
  • cdpSourceRange opcjonalnie ogranicza ruch przychodzący CDP na krawędzi kontenera do zakresu CIDR (na przykład 172.21.0.1/32).
  • sandbox.browser.binds montuje dodatkowe katalogi hosta tylko do kontenera sandboxowanej przeglądarki. Gdy ustawione (w tym []), zastępuje docker.binds dla kontenera przeglądarki.
  • Domyślne parametry uruchomienia są zdefiniowane w scripts/sandbox-browser-entrypoint.sh i dostrojone pod hosty kontenerowe:
    • --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 (domyślnie włączone)
    • --disable-3d-apis, --disable-software-rasterizer i --disable-gpu są domyślnie włączone i można je wyłączyć przez OPENCLAW_BROWSER_DISABLE_GRAPHICS_FLAGS=0, jeśli użycie WebGL/3D tego wymaga.
    • OPENCLAW_BROWSER_DISABLE_EXTENSIONS=0 ponownie włącza rozszerzenia, jeśli Twój workflow ich wymaga.
    • --renderer-process-limit=2 można zmienić przez OPENCLAW_BROWSER_RENDERER_PROCESS_LIMIT=<N>; ustaw 0, aby użyć domyślnego limitu procesów Chromium.
    • dodatkowo --no-sandbox i --disable-setuid-sandbox, gdy noSandbox jest włączone.
    • Wartości domyślne są bazą obrazu kontenera; użyj własnego obrazu przeglądarki z własnym entrypointem, aby zmienić domyślne ustawienia kontenera.
Sandboxing przeglądarki i sandbox.docker.binds działają tylko z Dockerem. Budowanie obrazów:
scripts/sandbox-setup.sh           # main sandbox image
scripts/sandbox-browser-setup.sh   # optional browser image

agents.list (nadpisania per agent)

{
  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: stabilny identyfikator agenta (wymagany).
  • default: gdy ustawionych jest wiele, wygrywa pierwszy (zapisywane jest ostrzeżenie). Jeśli żaden nie jest ustawiony, domyślny jest pierwszy wpis listy.
  • model: forma ciągu nadpisuje tylko primary; forma obiektu { primary, fallbacks } nadpisuje oba ([] wyłącza globalne fallbacki). Zadania Cron, które nadpisują tylko primary, nadal dziedziczą domyślne fallbacki, chyba że ustawisz fallbacks: [].
  • params: parametry strumienia per agent scalane ponad wybranym wpisem modelu w agents.defaults.models. Użyj tego do nadpisań specyficznych dla agenta, takich jak cacheRetention, temperature lub maxTokens, bez duplikowania całego katalogu modeli.
  • skills: opcjonalna lista dozwolonych Skills per agent. Jeśli pominięta, agent dziedziczy agents.defaults.skills, gdy jest ustawione; jawna lista zastępuje wartości domyślne zamiast je scalać, a [] oznacza brak Skills.
  • thinkingDefault: opcjonalny domyślny poziom thinking per agent (off | minimal | low | medium | high | xhigh | adaptive). Nadpisuje agents.defaults.thinkingDefault dla tego agenta, gdy nie jest ustawione nadpisanie per wiadomość ani per sesję.
  • reasoningDefault: opcjonalna domyślna widoczność reasoning per agent (on | off | stream). Stosowane, gdy nie ma nadpisania reasoning per wiadomość ani per sesję.
  • fastModeDefault: opcjonalna wartość domyślna per agent dla fast mode (true | false). Stosowane, gdy nie ma nadpisania fast mode per wiadomość ani per sesję.
  • embeddedHarness: opcjonalne nadpisanie polityki niskopoziomowego harnessu per agent. Użyj { runtime: "codex", fallback: "none" }, aby jeden agent był tylko Codex, a pozostałe zachowały domyślny fallback PI.
  • runtime: opcjonalny deskryptor runtime per agent. Użyj type: "acp" z domyślnymi ustawieniami runtime.acp (agent, backend, mode, cwd), gdy agent ma domyślnie używać sesji harnessu ACP.
  • identity.avatar: ścieżka względna do workspace, URL http(s) lub URI data:.
  • identity wyprowadza wartości domyślne: ackReaction z emoji, mentionPatterns z name/emoji.
  • subagents.allowAgents: lista dozwolonych identyfikatorów agentów dla sessions_spawn (["*"] = dowolny; domyślnie: tylko ten sam agent).
  • Zabezpieczenie dziedziczenia sandboxa: jeśli sesja żądająca jest sandboxowana, sessions_spawn odrzuca cele, które działałyby bez sandboxa.
  • subagents.requireAgentId: gdy true, blokuje wywołania sessions_spawn, które pomijają agentId (wymusza jawny wybór profilu; domyślnie: false).

Routing wielu agentów

Uruchamiaj wiele izolowanych agentów w jednym Gateway. Zobacz 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" } },
  ],
}

Pola dopasowania binding

  • type (opcjonalne): route dla zwykłego routingu (brak typu domyślnie oznacza route), acp dla trwałych powiązań rozmów ACP.
  • match.channel (wymagane)
  • match.accountId (opcjonalne; * = dowolne konto; pominięte = konto domyślne)
  • match.peer (opcjonalne; { kind: direct|group|channel, id })
  • match.guildId / match.teamId (opcjonalne; zależne od kanału)
  • acp (opcjonalne; tylko dla type: "acp"): { mode, label, cwd, backend }
Deterministyczna kolejność dopasowania:
  1. match.peer
  2. match.guildId
  3. match.teamId
  4. match.accountId (dokładne, bez peer/guild/team)
  5. match.accountId: "*" (na cały kanał)
  6. Agent domyślny
W obrębie każdego poziomu wygrywa pierwszy pasujący wpis bindings. Dla wpisów type: "acp" OpenClaw rozwiązuje po dokładnej tożsamości rozmowy (match.channel + konto + match.peer.id) i nie używa powyższej kolejności poziomów powiązań route.

Profile dostępu per agent

{
  agents: {
    list: [
      {
        id: "personal",
        workspace: "~/.openclaw/workspace-personal",
        sandbox: { mode: "off" },
      },
    ],
  },
}
{
  agents: {
    list: [
      {
        id: "family",
        workspace: "~/.openclaw/workspace-family",
        sandbox: { mode: "all", scope: "agent", workspaceAccess: "ro" },
        tools: {
          allow: [
            "read",
            "sessions_list",
            "sessions_history",
            "sessions_send",
            "sessions_spawn",
            "session_status",
          ],
          deny: ["write", "edit", "apply_patch", "exec", "process", "browser"],
        },
      },
    ],
  },
}
{
  agents: {
    list: [
      {
        id: "public",
        workspace: "~/.openclaw/workspace-public",
        sandbox: { mode: "all", scope: "agent", workspaceAccess: "none" },
        tools: {
          allow: [
            "sessions_list",
            "sessions_history",
            "sessions_send",
            "sessions_spawn",
            "session_status",
            "whatsapp",
            "telegram",
            "slack",
            "discord",
            "gateway",
          ],
          deny: [
            "read",
            "write",
            "edit",
            "apply_patch",
            "exec",
            "process",
            "browser",
            "canvas",
            "nodes",
            "cron",
            "gateway",
            "image",
          ],
        },
      },
    ],
  },
}
Szczegóły priorytetów znajdziesz w Multi-Agent Sandbox & Tools.

Sesja

{
  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: podstawowa strategia grupowania sesji dla kontekstów czatu grupowego.
    • per-sender (domyślnie): każdy nadawca otrzymuje izolowaną sesję w kontekście kanału.
    • global: wszyscy uczestnicy w kontekście kanału współdzielą jedną sesję (używaj tylko wtedy, gdy współdzielony kontekst jest zamierzony).
  • dmScope: sposób grupowania DM.
    • main: wszystkie DM współdzielą główną sesję.
    • per-peer: izolacja według identyfikatora nadawcy między kanałami.
    • per-channel-peer: izolacja per kanał + nadawca (zalecane dla skrzynek odbiorczych wielu użytkowników).
    • per-account-channel-peer: izolacja per konto + kanał + nadawca (zalecane dla wielu kont).
  • identityLinks: mapuje kanoniczne identyfikatory do peerów z prefiksem dostawcy dla współdzielenia sesji między kanałami.
  • reset: podstawowa polityka resetu. daily resetuje o atHour czasu lokalnego; idle resetuje po idleMinutes. Gdy skonfigurowane są oba, wygrywa to, które wygaśnie wcześniej.
  • resetByType: nadpisania per typ (direct, group, thread). Starsze dm jest akceptowane jako alias direct.
  • parentForkMaxTokens: maksymalna wartość totalTokens sesji nadrzędnej dozwolona przy tworzeniu rozwidlonej sesji wątku (domyślnie 100000).
    • Jeśli totalTokens sesji nadrzędnej przekracza tę wartość, OpenClaw rozpoczyna nową sesję wątku zamiast dziedziczyć historię transkryptu sesji nadrzędnej.
    • Ustaw 0, aby wyłączyć to zabezpieczenie i zawsze zezwalać na rozwidlanie z sesji nadrzędnej.
  • mainKey: starsze pole. Runtime zawsze używa "main" dla głównego kubełka czatu bezpośredniego.
  • agentToAgent.maxPingPongTurns: maksymalna liczba tur odpowiedzi zwrotnych między agentami podczas wymian agent-agent (liczba całkowita, zakres: 05). 0 wyłącza łańcuchowanie ping-pong.
  • sendPolicy: dopasowanie po channel, chatType (direct|group|channel, ze starszym aliasem dm), keyPrefix lub rawKeyPrefix. Pierwsze odrzucenie wygrywa.
  • maintenance: czyszczenie magazynu sesji + kontrola retencji.
    • mode: warn emituje tylko ostrzeżenia; enforce stosuje czyszczenie.
    • pruneAfter: granica wieku dla nieaktualnych wpisów (domyślnie 30d).
    • maxEntries: maksymalna liczba wpisów w sessions.json (domyślnie 500).
    • rotateBytes: rotuje sessions.json, gdy przekroczy ten rozmiar (domyślnie 10mb).
    • resetArchiveRetention: retencja dla archiwów transkryptów *.reset.<timestamp>. Domyślnie przyjmuje wartość pruneAfter; ustaw false, aby wyłączyć.
    • maxDiskBytes: opcjonalny twardy budżet dyskowy katalogu sesji. W trybie warn zapisuje ostrzeżenia; w trybie enforce najpierw usuwa najstarsze artefakty/sesje.
    • highWaterBytes: opcjonalny cel po czyszczeniu budżetu. Domyślnie 80% wartości maxDiskBytes.
  • threadBindings: globalne wartości domyślne dla funkcji sesji związanych z wątkami.
    • enabled: główny domyślny przełącznik (dostawcy mogą go nadpisywać; Discord używa channels.discord.threadBindings.enabled)
    • idleHours: domyślny automatyczny brak fokusu po bezczynności w godzinach (0 wyłącza; dostawcy mogą nadpisywać)
    • maxAgeHours: domyślny twardy maksymalny wiek w godzinach (0 wyłącza; dostawcy mogą nadpisywać)

Wiadomości

{
  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,
      },
    },
  },
}

Prefiks odpowiedzi

Nadpisania per kanał/konto: channels.<channel>.responsePrefix, channels.<channel>.accounts.<id>.responsePrefix. Rozwiązywanie (wygrywa najbardziej szczegółowe): konto → kanał → globalne. "" wyłącza i zatrzymuje kaskadę. "auto" wyprowadza [{identity.name}]. Zmienne szablonu:
ZmiennaOpisPrzykład
{model}Krótka nazwa modeluclaude-opus-4-6
{modelFull}Pełny identyfikator modeluanthropic/claude-opus-4-6
{provider}Nazwa dostawcyanthropic
{thinkingLevel}Bieżący poziom thinkinghigh, low, off
{identity.name}Nazwa tożsamości agenta(to samo co "auto")
Zmienne nie rozróżniają wielkości liter. {think} jest aliasem dla {thinkingLevel}.

Reakcja ack

  • Domyślnie używa identity.emoji aktywnego agenta, w przeciwnym razie "👀". Ustaw "", aby wyłączyć.
  • Nadpisania per kanał: channels.<channel>.ackReaction, channels.<channel>.accounts.<id>.ackReaction.
  • Kolejność rozwiązywania: konto → kanał → messages.ackReaction → fallback tożsamości.
  • Zakres: group-mentions (domyślnie), group-all, direct, all.
  • removeAckAfterReply: usuwa ack po odpowiedzi w Slack, Discord i Telegram.
  • messages.statusReactions.enabled: włącza reakcje statusu cyklu życia w Slack, Discord i Telegram. W Slack i Discord brak ustawienia utrzymuje reakcje statusu włączone, gdy reakcje ack są aktywne. W Telegram ustaw to jawnie na true, aby włączyć reakcje statusu cyklu życia.

Debounce przychodzących wiadomości

Łączy szybkie wiadomości tekstowe od tego samego nadawcy w jedną turę agenta. Media/załączniki są opróżniane natychmiast. Polecenia sterujące omijają debounce.

TTS (zamiana tekstu na mowę)

{
  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 kontroluje domyślny tryb auto-TTS: off, always, inbound lub tagged. /tts on|off może nadpisać lokalne preferencje, a /tts status pokazuje stan efektywny.
  • summaryModel nadpisuje agents.defaults.model.primary dla automatycznego podsumowania.
  • modelOverrides jest domyślnie włączone; modelOverrides.allowProvider domyślnie ma wartość false (wymaga opt-in).
  • Klucze API mają wartości zapasowe z ELEVENLABS_API_KEY/XI_API_KEY oraz OPENAI_API_KEY.
  • openai.baseUrl nadpisuje punkt końcowy OpenAI TTS. Kolejność rozwiązywania to konfiguracja, następnie OPENAI_TTS_BASE_URL, a potem https://api.openai.com/v1.
  • Gdy openai.baseUrl wskazuje punkt końcowy inny niż OpenAI, OpenClaw traktuje go jako serwer TTS zgodny z OpenAI i łagodzi walidację modelu/głosu.

Talk

Ustawienia domyślne dla trybu 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 musi odpowiadać kluczowi w talk.providers, gdy skonfigurowano wielu dostawców Talk.
  • Starsze płaskie klucze Talk (talk.voiceId, talk.voiceAliases, talk.modelId, talk.outputFormat, talk.apiKey) służą wyłącznie zgodności i są automatycznie migrowane do talk.providers.<provider>.
  • Identyfikatory głosów mają wartości zapasowe z ELEVENLABS_VOICE_ID lub SAG_VOICE_ID.
  • providers.*.apiKey akceptuje jawne ciągi znaków lub obiekty SecretRef.
  • Wartość zapasowa ELEVENLABS_API_KEY ma zastosowanie tylko wtedy, gdy nie skonfigurowano klucza API Talk.
  • providers.*.voiceAliases pozwala dyrektywom Talk używać przyjaznych nazw.
  • silenceTimeoutMs kontroluje, jak długo tryb Talk czeka po ciszy użytkownika, zanim wyśle transkrypt. Brak ustawienia zachowuje domyślne okno pauzy platformy (700 ms na macOS i Androidzie, 900 ms na iOS).

Narzędzia

Profile narzędzi

tools.profile ustawia bazową listę dozwolonych przed tools.allow/tools.deny: Lokalny onboarding domyślnie ustawia w nowych lokalnych konfiguracjach tools.profile: "coding", gdy nie jest ustawione (istniejące jawne profile są zachowywane).
ProfilObejmuje
minimaltylko 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
fullBrak ograniczeń (tak samo jak brak ustawienia)

Grupy narzędzi

GrupaNarzędzia
group:runtimeexec, process, code_execution (bash jest akceptowane jako alias 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:openclawWszystkie wbudowane narzędzia (z wyłączeniem Pluginów dostawców)

tools.allow / tools.deny

Globalna polityka dozwalania/odrzucania narzędzi (odrzucenie ma pierwszeństwo). Nierozróżniająca wielkości liter, obsługuje wildcardy *. Stosowana nawet wtedy, gdy sandbox Docker jest wyłączony.
{
  tools: { deny: ["browser", "canvas"] },
}

tools.byProvider

Dodatkowo ogranicza narzędzia dla określonych dostawców lub modeli. Kolejność: profil bazowy → profil dostawcy → allow/deny.
{
  tools: {
    profile: "coding",
    byProvider: {
      "google-antigravity": { profile: "minimal" },
      "openai/gpt-5.4": { allow: ["group:fs", "sessions_list"] },
    },
  },
}

tools.elevated

Steruje dostępem elevated exec poza sandboxem:
{
  tools: {
    elevated: {
      enabled: true,
      allowFrom: {
        whatsapp: ["+15555550123"],
        discord: ["1234567890123", "987654321098765432"],
      },
    },
  },
}
  • Nadpisanie per agent (agents.list[].tools.elevated) może tylko dalej ograniczać.
  • /elevated on|off|ask|full zapisuje stan per sesja; dyrektywy inline mają zastosowanie do pojedynczej wiadomości.
  • Elevated exec omija sandboxing i używa skonfigurowanej ścieżki ucieczki (gateway domyślnie lub node, gdy celem exec jest node).

tools.exec

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

tools.loopDetection

Kontrole bezpieczeństwa pętli narzędzi są domyślnie wyłączone. Ustaw enabled: true, aby aktywować wykrywanie. Ustawienia można zdefiniować globalnie w tools.loopDetection i nadpisywać per agent w agents.list[].tools.loopDetection.
{
  tools: {
    loopDetection: {
      enabled: true,
      historySize: 30,
      warningThreshold: 10,
      criticalThreshold: 20,
      globalCircuitBreakerThreshold: 30,
      detectors: {
        genericRepeat: true,
        knownPollNoProgress: true,
        pingPong: true,
      },
    },
  },
}
  • historySize: maksymalna historia wywołań narzędzi przechowywana do analizy pętli.
  • warningThreshold: próg powtarzającego się wzorca bez postępu dla ostrzeżeń.
  • criticalThreshold: wyższy próg powtarzania dla blokowania krytycznych pętli.
  • globalCircuitBreakerThreshold: próg twardego zatrzymania dla dowolnego przebiegu bez postępu.
  • detectors.genericRepeat: ostrzega o powtarzanych wywołaniach tego samego narzędzia z tymi samymi argumentami.
  • detectors.knownPollNoProgress: ostrzega/blokuje znane narzędzia odpytywania (process.poll, command_status itd.).
  • detectors.pingPong: ostrzega/blokuje naprzemienne wzorce par bez postępu.
  • Jeśli warningThreshold >= criticalThreshold lub criticalThreshold >= globalCircuitBreakerThreshold, walidacja kończy się błędem.

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

Konfiguruje rozumienie przychodzących mediów (obraz/audio/wideo):
{
  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" }],
      },
    },
  },
}
Wpis dostawcy (type: "provider" lub pominięte):
  • provider: identyfikator dostawcy API (openai, anthropic, google/gemini, groq itd.)
  • model: nadpisanie identyfikatora modelu
  • profile / preferredProfile: wybór profilu auth-profiles.json
Wpis CLI (type: "cli"):
  • command: wykonywalne polecenie do uruchomienia
  • args: argumenty szablonowe (obsługuje {{MediaPath}}, {{Prompt}}, {{MaxChars}} itd.)
Pola wspólne:
  • capabilities: opcjonalna lista (image, audio, video). Domyślnie: openai/anthropic/minimax → image, google → image+audio+video, groq → audio.
  • prompt, maxChars, maxBytes, timeoutSeconds, language: nadpisania per wpis.
  • Błędy powodują przejście do kolejnego wpisu.
Uwierzytelnianie dostawcy przebiega według standardowej kolejności: auth-profiles.json → zmienne środowiskowe → models.providers.*.apiKey.Pola async completion:
  • asyncCompletion.directSend: gdy true, zakończone zadania asynchroniczne music_generate i video_generate najpierw próbują bezpośredniego dostarczenia do kanału. Domyślnie: false (starsza ścieżka wybudzania sesji żądającej/dostarczania modelu).

tools.agentToAgent

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

tools.sessions

Kontroluje, które sesje mogą być wskazywane przez narzędzia sesji (sessions_list, sessions_history, sessions_send). Domyślnie: tree (bieżąca sesja + sesje utworzone przez nią, takie jak subagenci).
{
  tools: {
    sessions: {
      // "self" | "tree" | "agent" | "all"
      visibility: "tree",
    },
  },
}
Uwagi:
  • self: tylko bieżący klucz sesji.
  • tree: bieżąca sesja + sesje utworzone przez bieżącą sesję (subagenci).
  • agent: dowolna sesja należąca do bieżącego identyfikatora agenta (może obejmować innych użytkowników, jeśli używasz sesji per nadawca pod tym samym identyfikatorem agenta).
  • all: dowolna sesja. Kierowanie między agentami nadal wymaga tools.agentToAgent.
  • Ograniczenie sandboxa: gdy bieżąca sesja jest sandboxowana i agents.defaults.sandbox.sessionToolsVisibility="spawned", widoczność jest wymuszana na tree, nawet jeśli tools.sessions.visibility="all".

tools.sessions_spawn

Kontroluje obsługę załączników inline dla 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"
      },
    },
  },
}
Uwagi:
  • Załączniki są obsługiwane tylko dla runtime: "subagent". Runtime ACP je odrzuca.
  • Pliki są materializowane w workspace potomnym pod .openclaw/attachments/<uuid>/ z .manifest.json.
  • Zawartość załączników jest automatycznie redagowana z utrwalania transkryptu.
  • Wejścia base64 są walidowane przy użyciu ścisłych kontroli alfabetu/dopełnienia i zabezpieczenia rozmiaru przed dekodowaniem.
  • Uprawnienia plików to 0700 dla katalogów i 0600 dla plików.
  • Czyszczenie zależy od polityki cleanup: delete zawsze usuwa załączniki; keep zachowuje je tylko wtedy, gdy retainOnSessionKeep: true.

tools.experimental

Flagi eksperymentalnych wbudowanych narzędzi. Domyślnie wyłączone, chyba że ma zastosowanie reguła automatycznego włączenia strict-agentic GPT-5.
{
  tools: {
    experimental: {
      planTool: true, // enable experimental update_plan
    },
  },
}
Uwagi:
  • planTool: włącza strukturalne narzędzie update_plan do śledzenia nietrywialnej pracy wieloetapowej.
  • Domyślnie: false, chyba że agents.defaults.embeddedPi.executionContract (lub nadpisanie per agent) jest ustawione na "strict-agentic" dla przebiegu OpenAI lub OpenAI Codex z rodziny GPT-5. Ustaw true, aby wymusić włączenie narzędzia poza tym zakresem, lub false, aby pozostawić je wyłączone nawet dla przebiegów strict-agentic GPT-5.
  • Gdy włączone, system prompt również dodaje wskazówki użycia, aby model używał go tylko do istotnej pracy i utrzymywał co najwyżej jeden krok in_progress.

agents.defaults.subagents

{
  agents: {
    defaults: {
      subagents: {
        allowAgents: ["research"],
        model: "minimax/MiniMax-M2.7",
        maxConcurrent: 8,
        runTimeoutSeconds: 900,
        archiveAfterMinutes: 60,
      },
    },
  },
}
  • model: domyślny model dla uruchamianych subagentów. Jeśli pominięty, subagenci dziedziczą model wywołującego.
  • allowAgents: domyślna lista dozwolonych identyfikatorów agentów docelowych dla sessions_spawn, gdy agent żądający nie ustawia własnego subagents.allowAgents (["*"] = dowolny; domyślnie: tylko ten sam agent).
  • runTimeoutSeconds: domyślny limit czasu (sekundy) dla sessions_spawn, gdy wywołanie narzędzia pomija runTimeoutSeconds. 0 oznacza brak limitu czasu.
  • Polityka narzędzi per subagent: tools.subagents.tools.allow / tools.subagents.tools.deny.

Niestandardowi dostawcy i base URL-e

OpenClaw używa wbudowanego katalogu modeli. Dodawaj niestandardowych dostawców przez models.providers w konfiguracji lub ~/.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,
          },
        ],
      },
    },
  },
}
  • Użyj authHeader: true + headers dla niestandardowych potrzeb uwierzytelniania.
  • Nadpisz katalog główny konfiguracji agenta przez OPENCLAW_AGENT_DIR (lub PI_CODING_AGENT_DIR, starszy alias zmiennej środowiskowej).
  • Priorytet scalania dla pasujących identyfikatorów dostawców:
    • Niepuste wartości baseUrl z models.json agenta mają pierwszeństwo.
    • Niepuste wartości apiKey agenta mają pierwszeństwo tylko wtedy, gdy ten dostawca nie jest zarządzany przez SecretRef w bieżącym kontekście config/auth-profile.
    • Wartości apiKey dostawcy zarządzanego przez SecretRef są odświeżane ze znaczników źródła (ENV_VAR_NAME dla odwołań env, secretref-managed dla odwołań file/exec) zamiast utrwalania rozwiązanych sekretów.
    • Wartości nagłówków dostawcy zarządzanego przez SecretRef są odświeżane ze znaczników źródła (secretref-env:ENV_VAR_NAME dla odwołań env, secretref-managed dla odwołań file/exec).
    • Puste lub brakujące apiKey/baseUrl agenta wracają do models.providers w konfiguracji.
    • Pasujące contextWindow/maxTokens modelu używają wyższej wartości z jawnej konfiguracji i domyślnych wartości katalogu.
    • Pasujące contextTokens modelu zachowuje jawny limit runtime, gdy jest obecny; użyj go, aby ograniczyć efektywny kontekst bez zmiany natywnych metadanych modelu.
    • Użyj models.mode: "replace", gdy chcesz, aby konfiguracja całkowicie nadpisała models.json.
    • Utrwalanie znaczników jest autorytatywne względem źródła: znaczniki są zapisywane z aktywnej migawki konfiguracji źródłowej (przed rozwiązaniem), a nie z rozwiązanych wartości sekretów runtime.

Szczegóły pól dostawcy

  • models.mode: zachowanie katalogu dostawców (merge lub replace).
  • models.providers: mapa niestandardowych dostawców kluczowana identyfikatorem dostawcy.
  • models.providers.*.api: adapter żądań (openai-completions, openai-responses, anthropic-messages, google-generative-ai itd.).
  • models.providers.*.apiKey: poświadczenie dostawcy (preferuj podstawienie SecretRef/env).
  • models.providers.*.auth: strategia uwierzytelniania (api-key, token, oauth, aws-sdk).
  • models.providers.*.injectNumCtxForOpenAICompat: dla Ollama + openai-completions wstrzykuje options.num_ctx do żądań (domyślnie: true).
  • models.providers.*.authHeader: wymusza przesyłanie poświadczenia w nagłówku Authorization, gdy jest to wymagane.
  • models.providers.*.baseUrl: bazowy URL nadrzędnego API.
  • models.providers.*.headers: dodatkowe statyczne nagłówki dla routingu proxy/dzierżawy.
  • models.providers.*.request: nadpisania transportu dla żądań HTTP dostawcy modeli.
    • request.headers: dodatkowe nagłówki (scalane z domyślnymi ustawieniami dostawcy). Wartości akceptują SecretRef.
    • request.auth: nadpisanie strategii uwierzytelniania. Tryby: "provider-default" (użyj wbudowanego uwierzytelniania dostawcy), "authorization-bearer" (z token), "header" (z headerName, value, opcjonalnym prefix).
    • request.proxy: nadpisanie proxy HTTP. Tryby: "env-proxy" (użyj zmiennych środowiskowych HTTP_PROXY/HTTPS_PROXY), "explicit-proxy" (z url). Oba tryby akceptują opcjonalny pod-obiekt tls.
    • request.tls: nadpisanie TLS dla połączeń bezpośrednich. Pola: ca, cert, key, passphrase (wszystkie akceptują SecretRef), serverName, insecureSkipVerify.
    • request.allowPrivateNetwork: gdy true, zezwala na HTTPS do baseUrl, gdy DNS rozwiązuje się do prywatnych, CGNAT lub podobnych zakresów, przez zabezpieczenie pobierania HTTP dostawcy (operator opt-in dla zaufanych samohostowanych punktów końcowych zgodnych z OpenAI). WebSocket używa tego samego request dla nagłówków/TLS, ale nie tego zabezpieczenia SSRF pobierania. Domyślnie false.
  • models.providers.*.models: jawne wpisy katalogu modeli dostawcy.
  • models.providers.*.models.*.contextWindow: natywne metadane okna kontekstu modelu.
  • models.providers.*.models.*.contextTokens: opcjonalny limit kontekstu runtime. Użyj tego, gdy chcesz mniejszy efektywny budżet kontekstu niż natywne contextWindow modelu.
  • models.providers.*.models.*.compat.supportsDeveloperRole: opcjonalna wskazówka zgodności. Dla api: "openai-completions" z niepustym nienatywnym baseUrl (host różny od api.openai.com) OpenClaw wymusza to w runtime na false. Puste/pominięte baseUrl zachowuje domyślne zachowanie OpenAI.
  • models.providers.*.models.*.compat.requiresStringContent: opcjonalna wskazówka zgodności dla punktów końcowych czatu zgodnych z OpenAI obsługujących tylko ciągi znaków. Gdy true, OpenClaw spłaszcza czysto tekstowe tablice messages[].content do zwykłych ciągów przed wysłaniem żądania.
  • plugins.entries.amazon-bedrock.config.discovery: główny katalog ustawień automatycznego wykrywania Bedrock.
  • plugins.entries.amazon-bedrock.config.discovery.enabled: włącza/wyłącza niejawne wykrywanie.
  • plugins.entries.amazon-bedrock.config.discovery.region: region AWS dla wykrywania.
  • plugins.entries.amazon-bedrock.config.discovery.providerFilter: opcjonalny filtr identyfikatora dostawcy do wykrywania ukierunkowanego.
  • plugins.entries.amazon-bedrock.config.discovery.refreshInterval: interwał odpytywania do odświeżania wykrywania.
  • plugins.entries.amazon-bedrock.config.discovery.defaultContextWindow: zapasowe okno kontekstu dla wykrytych modeli.
  • plugins.entries.amazon-bedrock.config.discovery.defaultMaxTokens: zapasowa maksymalna liczba tokenów wyjściowych dla wykrytych modeli.

Przykłady dostawców

{
  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)" },
        ],
      },
    },
  },
}
Użyj cerebras/zai-glm-4.7 dla Cerebras; zai/glm-4.7 dla bezpośredniego Z.AI.
{
  agents: {
    defaults: {
      model: { primary: "opencode/claude-opus-4-6" },
      models: { "opencode/claude-opus-4-6": { alias: "Opus" } },
    },
  },
}
Ustaw OPENCODE_API_KEY (lub OPENCODE_ZEN_API_KEY). Używaj odwołań opencode/... dla katalogu Zen lub opencode-go/... dla katalogu Go. Skrót: openclaw onboard --auth-choice opencode-zen lub openclaw onboard --auth-choice opencode-go.
{
  agents: {
    defaults: {
      model: { primary: "zai/glm-4.7" },
      models: { "zai/glm-4.7": {} },
    },
  },
}
Ustaw ZAI_API_KEY. z.ai/* i z-ai/* są akceptowanymi aliasami. Skrót: openclaw onboard --auth-choice zai-api-key.
  • Ogólny punkt końcowy: https://api.z.ai/api/paas/v4
  • Punkt końcowy do kodowania (domyślny): https://api.z.ai/api/coding/paas/v4
  • Dla ogólnego punktu końcowego zdefiniuj niestandardowego dostawcę z nadpisaniem base URL.
{
  env: { MOONSHOT_API_KEY: "sk-..." },
  agents: {
    defaults: {
      model: { primary: "moonshot/kimi-k2.5" },
      models: { "moonshot/kimi-k2.5": { alias: "Kimi K2.5" } },
    },
  },
  models: {
    mode: "merge",
    providers: {
      moonshot: {
        baseUrl: "https://api.moonshot.ai/v1",
        apiKey: "${MOONSHOT_API_KEY}",
        api: "openai-completions",
        models: [
          {
            id: "kimi-k2.5",
            name: "Kimi K2.5",
            reasoning: false,
            input: ["text", "image"],
            cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
            contextWindow: 262144,
            maxTokens: 262144,
          },
        ],
      },
    },
  },
}
Dla punktu końcowego w Chinach: baseUrl: "https://api.moonshot.cn/v1" lub openclaw onboard --auth-choice moonshot-api-key-cn.Natywne punkty końcowe Moonshot ogłaszają zgodność użycia strumieniowania na współdzielonym transporcie openai-completions, a OpenClaw opiera się tu na możliwościach punktu końcowego, a nie wyłącznie na wbudowanym identyfikatorze dostawcy.
{
  env: { KIMI_API_KEY: "sk-..." },
  agents: {
    defaults: {
      model: { primary: "kimi/kimi-code" },
      models: { "kimi/kimi-code": { alias: "Kimi Code" } },
    },
  },
}
Wbudowany dostawca zgodny z Anthropic. Skrót: 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,
          },
        ],
      },
    },
  },
}
Base URL powinien pomijać /v1 (klient Anthropic dopisuje je sam). Skrót: 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,
          },
        ],
      },
    },
  },
}
Ustaw MINIMAX_API_KEY. Skróty: openclaw onboard --auth-choice minimax-global-api lub openclaw onboard --auth-choice minimax-cn-api. Katalog modeli domyślnie zawiera tylko M2.7. Na ścieżce strumieniowania zgodnej z Anthropic OpenClaw domyślnie wyłącza thinking MiniMax, chyba że jawnie ustawisz thinking. /fast on lub params.fastMode: true przepisuje MiniMax-M2.7 na MiniMax-M2.7-highspeed.
Zobacz Local Models. W skrócie: uruchamiaj duży model lokalny przez LM Studio Responses API na odpowiednio wydajnym sprzęcie; zachowaj hostowane modele jako scalone dla fallbacku.

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: opcjonalna lista dozwolonych tylko dla bundled Skills (Skills zarządzane/workspace bez zmian).
  • load.extraDirs: dodatkowe współdzielone katalogi główne Skills (najniższy priorytet).
  • install.preferBrew: gdy true, preferuje instalatory Homebrew, jeśli brew jest dostępne, zanim przejdzie do innych rodzajów instalatorów.
  • install.nodeManager: preferencja instalatora node dla specyfikacji metadata.openclaw.install (npm | pnpm | yarn | bun).
  • entries.<skillKey>.enabled: false wyłącza Skill nawet jeśli jest bundled/zainstalowany.
  • entries.<skillKey>.apiKey: wygodne ustawienie dla Skills deklarujących główną zmienną env (jawny ciąg znaków lub obiekt 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" },
      },
    },
  },
}
  • Ładowane z ~/.openclaw/extensions, <workspace>/.openclaw/extensions oraz plugins.load.paths.
  • Wykrywanie akceptuje natywne Plugins OpenClaw oraz zgodne bundli Codex i Claude, w tym bundli Claude o domyślnym układzie bez manifestu.
  • Zmiany konfiguracji wymagają restartu Gateway.
  • allow: opcjonalna lista dozwolonych (ładują się tylko wymienione Plugins). deny ma pierwszeństwo.
  • plugins.entries.<id>.apiKey: wygodne pole klucza API na poziomie Pluginu (gdy obsługiwane przez Plugin).
  • plugins.entries.<id>.env: mapa zmiennych środowiskowych o zakresie Pluginu.
  • plugins.entries.<id>.hooks.allowPromptInjection: gdy false, core blokuje before_prompt_build i ignoruje pola mutujące prompt ze starszego before_agent_start, zachowując przy tym starsze modelOverride i providerOverride. Dotyczy natywnych hooków Pluginów i obsługiwanych katalogów hooków dostarczanych przez bundle.
  • plugins.entries.<id>.subagent.allowModelOverride: jawnie ufa temu Pluginowi, że może żądać nadpisań provider i model per uruchomienie dla przebiegów subagenta w tle.
  • plugins.entries.<id>.subagent.allowedModels: opcjonalna lista dozwolonych kanonicznych celów provider/model dla zaufanych nadpisań subagentów. Używaj "*" tylko wtedy, gdy celowo chcesz zezwolić na dowolny model.
  • plugins.entries.<id>.config: obiekt konfiguracji zdefiniowany przez Plugin (walidowany względem natywnego schematu Pluginu OpenClaw, gdy jest dostępny).
  • plugins.entries.firecrawl.config.webFetch: ustawienia dostawcy web-fetch Firecrawl.
    • apiKey: klucz API Firecrawl (akceptuje SecretRef). Wartość zapasowa pochodzi z plugins.entries.firecrawl.config.webSearch.apiKey, starszego tools.web.fetch.firecrawl.apiKey lub zmiennej środowiskowej FIRECRAWL_API_KEY.
    • baseUrl: bazowy URL API Firecrawl (domyślnie: https://api.firecrawl.dev).
    • onlyMainContent: wyodrębnia tylko główną treść stron (domyślnie: true).
    • maxAgeMs: maksymalny wiek pamięci podręcznej w milisekundach (domyślnie: 172800000 / 2 dni).
    • timeoutSeconds: limit czasu żądania scrapingu w sekundach (domyślnie: 60).
  • plugins.entries.xai.config.xSearch: ustawienia xAI X Search (wyszukiwanie webowe Grok).
    • enabled: włącza dostawcę X Search.
    • model: model Grok używany do wyszukiwania (np. "grok-4-1-fast").
  • plugins.entries.memory-core.config.dreaming: ustawienia memory Dreaming. Zobacz Dreaming, aby poznać fazy i progi.
    • enabled: główny przełącznik Dreaming (domyślnie false).
    • frequency: harmonogram Cron dla każdego pełnego przebiegu Dreaming (domyślnie "0 3 * * *").
    • polityka faz i progi są szczegółami implementacji (nie są kluczami konfiguracji przeznaczonymi dla użytkownika).
  • Pełna konfiguracja pamięci znajduje się w Memory configuration reference:
    • agents.defaults.memorySearch.*
    • memory.backend
    • memory.citations
    • memory.qmd.*
    • plugins.entries.memory-core.config.dreaming
  • Włączone Plugins z bundli Claude mogą także dostarczać osadzone wartości domyślne Pi z settings.json; OpenClaw stosuje je jako oczyszczone ustawienia agentów, a nie jako surowe łatki konfiguracji OpenClaw.
  • plugins.slots.memory: wybiera identyfikator aktywnego Pluginu pamięci albo "none", aby wyłączyć Plugins pamięci.
  • plugins.slots.contextEngine: wybiera identyfikator aktywnego Pluginu silnika kontekstu; domyślnie "legacy", chyba że zainstalujesz i wybierzesz inny silnik.
  • plugins.installs: metadane instalacji zarządzane przez CLI używane przez openclaw plugins update.
    • Obejmuje source, spec, sourcePath, installPath, version, resolvedName, resolvedVersion, resolvedSpec, integrity, shasum, resolvedAt, installedAt.
    • Traktuj plugins.installs.* jako stan zarządzany; preferuj polecenia CLI zamiast ręcznych edycji.
Zobacz Plugins.

Browser

{
  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 wyłącza act:evaluate i wait --fn.
  • ssrfPolicy.dangerouslyAllowPrivateNetwork jest wyłączone, gdy nie jest ustawione, więc nawigacja Browser pozostaje domyślnie restrykcyjna.
  • Ustaw ssrfPolicy.dangerouslyAllowPrivateNetwork: true tylko wtedy, gdy celowo ufasz nawigacji Browser do sieci prywatnych.
  • W trybie ścisłym zdalne punkty końcowe profili CDP (profiles.*.cdpUrl) podlegają temu samemu blokowaniu sieci prywatnych podczas kontroli osiągalności/wykrywania.
  • ssrfPolicy.allowPrivateNetwork pozostaje obsługiwane jako starszy alias.
  • W trybie ścisłym używaj ssrfPolicy.hostnameAllowlist i ssrfPolicy.allowedHostnames dla jawnych wyjątków.
  • Profile zdalne są tylko do podłączania (start/stop/reset wyłączone).
  • profiles.*.cdpUrl akceptuje http://, https://, ws:// i wss://. Używaj HTTP(S), gdy chcesz, aby OpenClaw wykrył /json/version; używaj WS(S), gdy dostawca przekazuje bezpośredni URL DevTools WebSocket.
  • Profile existing-session działają tylko na hoście i używają Chrome MCP zamiast CDP.
  • Profile existing-session mogą ustawiać userDataDir, aby kierować na konkretny profil przeglądarki opartej na Chromium, takiej jak Brave lub Edge.
  • Profile existing-session zachowują bieżące limity tras Chrome MCP: działania oparte na snapshot/ref zamiast targetowania selektorami CSS, hooki przesyłania jednego pliku, brak nadpisań limitu czasu dialogów, brak wait --load networkidle oraz brak responsebody, eksportu PDF, przechwytywania pobrań i działań wsadowych.
  • Lokalne zarządzane profile openclaw automatycznie przypisują cdpPort i cdpUrl; jawnie ustawiaj cdpUrl tylko dla zdalnego CDP.
  • Kolejność automatycznego wykrywania: domyślna przeglądarka, jeśli jest oparta na Chromium → Chrome → Brave → Edge → Chromium → Chrome Canary.
  • Usługa sterowania: tylko loopback (port wyprowadzany z gateway.port, domyślnie 18791).
  • extraArgs dopisuje dodatkowe flagi uruchomienia do lokalnego startu Chromium (na przykład --disable-gpu, rozmiar okna lub flagi debugowania).

UI

{
  ui: {
    seamColor: "#FF4500",
    assistant: {
      name: "OpenClaw",
      avatar: "CB", // emoji, short text, image URL, or data URI
    },
  },
}
  • seamColor: kolor akcentu dla chrome natywnego UI aplikacji (odcień dymku trybu Talk itd.).
  • assistant: nadpisanie tożsamości Control UI. Wartość zapasowa pochodzi z aktywnej tożsamości agenta.

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 (uruchom Gateway) lub remote (połącz ze zdalnym Gateway). Gateway odmawia uruchomienia, jeśli nie jest local.
  • port: pojedynczy multipleksowany port dla WS + HTTP. Priorytet: --port > OPENCLAW_GATEWAY_PORT > gateway.port > 18789.
  • bind: auto, loopback (domyślnie), lan (0.0.0.0), tailnet (tylko IP Tailscale) lub custom.
  • Starsze aliasy bind: używaj wartości trybu bind w gateway.bind (auto, loopback, lan, tailnet, custom), a nie aliasów hosta (0.0.0.0, 127.0.0.1, localhost, ::, ::1).
  • Uwaga dotycząca Dockera: domyślny bind loopback nasłuchuje na 127.0.0.1 wewnątrz kontenera. Przy sieci bridge Dockera (-p 18789:18789) ruch przychodzi przez eth0, więc Gateway jest nieosiągalny. Użyj --network host albo ustaw bind: "lan" (lub bind: "custom" z customBindHost: "0.0.0.0"), aby nasłuchiwać na wszystkich interfejsach.
  • Auth: domyślnie wymagane. Bindy inne niż loopback wymagają uwierzytelniania Gateway. W praktyce oznacza to współdzielony token/hasło albo reverse proxy świadome tożsamości z gateway.auth.mode: "trusted-proxy". Kreator onboardingu domyślnie generuje token.
  • Jeśli skonfigurowane są jednocześnie gateway.auth.token i gateway.auth.password (w tym SecretRef), ustaw jawnie gateway.auth.mode na token lub password. Uruchamianie oraz przepływy instalacji/naprawy usługi kończą się błędem, gdy oba są skonfigurowane, a tryb nie jest ustawiony.
  • gateway.auth.mode: "none": jawny tryb bez uwierzytelniania. Używaj tylko dla zaufanych lokalnych konfiguracji local loopback; ten tryb celowo nie jest oferowany przez prompty onboardingowe.
  • gateway.auth.mode: "trusted-proxy": deleguje uwierzytelnianie do reverse proxy świadomego tożsamości i ufa nagłówkom tożsamości z gateway.trustedProxies (zobacz Trusted Proxy Auth). Ten tryb oczekuje źródła proxy innego niż loopback; reverse proxy na tym samym hoście przez loopback nie spełniają wymagań uwierzytelniania trusted-proxy.
  • gateway.auth.allowTailscale: gdy true, nagłówki tożsamości Tailscale Serve mogą spełniać uwierzytelnianie Control UI/WebSocket (weryfikowane przez tailscale whois). Punkty końcowe HTTP API nie używają tego uwierzytelniania nagłówkiem Tailscale; stosują normalny tryb uwierzytelniania HTTP Gateway. Ten beztokenowy przepływ zakłada, że host Gateway jest zaufany. Domyślnie true, gdy tailscale.mode = "serve".
  • gateway.auth.rateLimit: opcjonalny limiter nieudanych prób uwierzytelniania. Stosowany per IP klienta i per zakres auth (współdzielony sekret i token urządzenia są śledzone niezależnie). Zablokowane próby zwracają 429 + Retry-After.
    • W asynchronicznej ścieżce Tailscale Serve Control UI nieudane próby dla tego samego {scope, clientIp} są serializowane przed zapisem porażki. Współbieżne błędne próby od tego samego klienta mogą więc uruchomić limiter przy drugim żądaniu zamiast przejść równolegle jako zwykłe niedopasowania.
    • gateway.auth.rateLimit.exemptLoopback domyślnie ma wartość true; ustaw false, jeśli celowo chcesz ograniczać ruchem także localhost (dla środowisk testowych lub ścisłych wdrożeń proxy).
  • Próby uwierzytelniania WS pochodzące z przeglądarki są zawsze ograniczane z wyłączonym wyjątkiem dla loopbacka (dodatkowa warstwa obrony przed brutalnym atakiem z przeglądarki na localhost).
  • Na loopback te blokady pochodzące z przeglądarki są izolowane per znormalizowana wartość Origin, więc powtarzające się błędy z jednego źródła localhost nie blokują automatycznie innego źródła.
  • tailscale.mode: serve (tylko tailnet, bind loopback) lub funnel (publiczne, wymaga auth).
  • controlUi.allowedOrigins: jawna lista dozwolonych źródeł przeglądarki dla połączeń Gateway WebSocket. Wymagana, gdy oczekiwani są klienci przeglądarkowi z innych źródeł niż loopback.
  • controlUi.dangerouslyAllowHostHeaderOriginFallback: niebezpieczny tryb włączający fallback źródła oparty na nagłówku Host dla wdrożeń, które celowo opierają się na polityce źródła z nagłówka Host.
  • remote.transport: ssh (domyślnie) lub direct (ws/wss). Dla direct remote.url musi być ws:// lub wss://.
  • OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1: awaryjne nadpisanie po stronie klienta, które zezwala na jawne ws:// do zaufanych adresów IP sieci prywatnej; domyślnie jawny tekst pozostaje dozwolony tylko dla loopback.
  • gateway.remote.token / .password to pola poświadczeń klienta zdalnego. Same w sobie nie konfigurują uwierzytelniania Gateway.
  • gateway.push.apns.relay.baseUrl: bazowy HTTPS URL zewnętrznego przekaźnika APNs używanego przez oficjalne/TestFlight buildy iOS po opublikowaniu przez nie rejestracji opartych na przekaźniku do Gateway. Ten URL musi odpowiadać URL-owi przekaźnika skompilowanemu w buildzie iOS.
  • gateway.push.apns.relay.timeoutMs: limit czasu wysyłania Gateway-do-przekaźnika w milisekundach. Domyślnie 10000.
  • Rejestracje oparte na przekaźniku są delegowane do określonej tożsamości Gateway. Sparowana aplikacja iOS pobiera gateway.identity.get, dołącza tę tożsamość do rejestracji przekaźnika i przekazuje do Gateway uprawnienie wysyłania o zakresie rejestracji. Inny Gateway nie może ponownie użyć tej zapisanej rejestracji.
  • OPENCLAW_APNS_RELAY_BASE_URL / OPENCLAW_APNS_RELAY_TIMEOUT_MS: tymczasowe nadpisania środowiskowe dla powyższej konfiguracji przekaźnika.
  • OPENCLAW_APNS_RELAY_ALLOW_HTTP=true: tylko deweloperska furtka dla URL-i przekaźnika HTTP na loopback. Produkcyjne URL-e przekaźnika powinny pozostać przy HTTPS.
  • gateway.channelHealthCheckMinutes: interwał monitora zdrowia kanałów w minutach. Ustaw 0, aby globalnie wyłączyć restarty monitora zdrowia. Domyślnie: 5.
  • gateway.channelStaleEventThresholdMinutes: próg nieaktualnego socketu w minutach. Zachowaj wartość większą lub równą gateway.channelHealthCheckMinutes. Domyślnie: 30.
  • gateway.channelMaxRestartsPerHour: maksymalna liczba restartów monitora zdrowia na kanał/konto w ruchomej godzinie. Domyślnie: 10.
  • channels.<provider>.healthMonitor.enabled: rezygnacja per kanał z restartów monitora zdrowia przy zachowaniu globalnego monitora.
  • channels.<provider>.accounts.<accountId>.healthMonitor.enabled: nadpisanie per konto dla kanałów z wieloma kontami. Gdy ustawione, ma pierwszeństwo przed nadpisaniem na poziomie kanału.
  • Lokalne ścieżki wywołań Gateway mogą używać gateway.remote.* jako wartości zapasowej tylko wtedy, gdy gateway.auth.* nie jest ustawione.
  • Jeśli gateway.auth.token / gateway.auth.password jest jawnie skonfigurowane przez SecretRef i nierozwiązane, rozwiązywanie kończy się bezpiecznie jako zamknięte (bez maskującego zdalnego fallbacku).
  • trustedProxies: adresy IP reverse proxy, które kończą TLS lub wstrzykują nagłówki przekazanego klienta. Wymieniaj tylko proxy, które kontrolujesz. Wpisy loopback są nadal prawidłowe dla konfiguracji wykrywania tego samego hosta/proxy lokalnego (na przykład Tailscale Serve lub lokalne reverse proxy), ale nie sprawiają, że żądania loopback kwalifikują się do gateway.auth.mode: "trusted-proxy".
  • allowRealIpFallback: gdy true, Gateway akceptuje X-Real-IP, jeśli brakuje X-Forwarded-For. Domyślnie false dla zachowania fail-closed.
  • gateway.tools.deny: dodatkowe nazwy narzędzi blokowane dla HTTP POST /tools/invoke (rozszerza domyślną listę blokad).
  • gateway.tools.allow: usuwa nazwy narzędzi z domyślnej listy blokad HTTP.

Punkty końcowe zgodne z OpenAI

  • Chat Completions: domyślnie wyłączone. Włącz przez gateway.http.endpoints.chatCompletions.enabled: true.
  • Responses API: gateway.http.endpoints.responses.enabled.
  • Utwardzanie wejścia URL dla Responses:
    • gateway.http.endpoints.responses.maxUrlParts
    • gateway.http.endpoints.responses.files.urlAllowlist
    • gateway.http.endpoints.responses.images.urlAllowlist Puste listy dozwolonych są traktowane jako brak ustawienia; użyj gateway.http.endpoints.responses.files.allowUrl=false i/lub gateway.http.endpoints.responses.images.allowUrl=false, aby wyłączyć pobieranie URL-i.
  • Opcjonalny nagłówek utwardzający odpowiedź:
    • gateway.http.securityHeaders.strictTransportSecurity (ustawiaj tylko dla kontrolowanych przez siebie źródeł HTTPS; zobacz Trusted Proxy Auth)

Izolacja wielu instancji

Uruchamiaj wiele Gateway na jednym hoście z unikalnymi portami i katalogami stanu:
OPENCLAW_CONFIG_PATH=~/.openclaw/a.json \
OPENCLAW_STATE_DIR=~/.openclaw-a \
openclaw gateway --port 19001
Wygodne flagi: --dev (używa ~/.openclaw-dev + port 19001), --profile <name> (używa ~/.openclaw-<name>). Zobacz 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: włącza kończenie TLS na listenerze Gateway (HTTPS/WSS) (domyślnie: false).
  • autoGenerate: automatycznie generuje lokalną samopodpisaną parę certyfikat/klucz, gdy nie skonfigurowano jawnych plików; tylko do użytku lokalnego/deweloperskiego.
  • certPath: ścieżka systemu plików do pliku certyfikatu TLS.
  • keyPath: ścieżka systemu plików do prywatnego klucza TLS; utrzymuj ograniczone uprawnienia.
  • caPath: opcjonalna ścieżka pakietu CA do weryfikacji klienta lub niestandardowych łańcuchów zaufania.

gateway.reload

{
  gateway: {
    reload: {
      mode: "hybrid", // off | restart | hot | hybrid
      debounceMs: 500,
      deferralTimeoutMs: 300000,
    },
  },
}
  • mode: kontroluje sposób stosowania edycji konfiguracji w runtime.
    • "off": ignoruje edycje na żywo; zmiany wymagają jawnego restartu.
    • "restart": zawsze restartuje proces Gateway przy zmianie konfiguracji.
    • "hot": stosuje zmiany w procesie bez restartu.
    • "hybrid" (domyślnie): najpierw próbuje hot reload; w razie potrzeby wraca do restartu.
  • debounceMs: okno debounce w ms przed zastosowaniem zmian konfiguracji (nieujemna liczba całkowita).
  • deferralTimeoutMs: maksymalny czas w ms oczekiwania na operacje w toku przed wymuszeniem restartu (domyślnie: 300000 = 5 minut).

Hooki

{
  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> lub x-openclaw-token: <token>. Tokeny hooków w query string są odrzucane. Uwagi dotyczące walidacji i bezpieczeństwa:
  • hooks.enabled=true wymaga niepustego hooks.token.
  • hooks.token musi być różny od gateway.auth.token; ponowne użycie tokenu Gateway jest odrzucane.
  • hooks.path nie może być /; używaj dedykowanej podścieżki, takiej jak /hooks.
  • Jeśli hooks.allowRequestSessionKey=true, ogranicz hooks.allowedSessionKeyPrefixes (na przykład ["hook:"]).
Punkty końcowe:
  • POST /hooks/wake{ text, mode?: "now"|"next-heartbeat" }
  • POST /hooks/agent{ message, name?, agentId?, sessionKey?, wakeMode?, deliver?, channel?, to?, model?, thinking?, timeoutSeconds? }
    • sessionKey z ładunku żądania jest akceptowany tylko wtedy, gdy hooks.allowRequestSessionKey=true (domyślnie: false).
  • POST /hooks/<name> → rozwiązywane przez hooks.mappings
  • match.path dopasowuje podścieżkę po /hooks (np. /hooks/gmailgmail).
  • match.source dopasowuje pole ładunku dla ścieżek ogólnych.
  • Szablony takie jak {{messages[0].subject}} odczytują dane z ładunku.
  • transform może wskazywać moduł JS/TS zwracający akcję hooka.
    • transform.module musi być ścieżką względną i pozostawać w obrębie hooks.transformsDir (ścieżki bezwzględne i traversal są odrzucane).
  • agentId kieruje do konkretnego agenta; nieznane identyfikatory wracają do domyślnego.
  • allowedAgentIds: ogranicza jawny routing (* lub pominięte = zezwól na wszystkie, [] = zabroń wszystkich).
  • defaultSessionKey: opcjonalny stały klucz sesji dla przebiegów agenta hooka bez jawnego sessionKey.
  • allowRequestSessionKey: pozwala wywołującym /hooks/agent ustawiać sessionKey (domyślnie: false).
  • allowedSessionKeyPrefixes: opcjonalna lista dozwolonych prefiksów dla jawnych wartości sessionKey (żądanie + mapowanie), np. ["hook:"].
  • deliver: true wysyła końcową odpowiedź do kanału; channel domyślnie ma wartość last.
  • model nadpisuje LLM dla tego przebiegu hooka (musi być dozwolony, jeśli ustawiono katalog modeli).

Integracja 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",
    },
  },
}
  • Gateway automatycznie uruchamia gog gmail watch serve przy starcie, gdy jest skonfigurowane. Ustaw OPENCLAW_SKIP_GMAIL_WATCHER=1, aby to wyłączyć.
  • Nie uruchamiaj osobnego gog gmail watch serve równolegle z Gateway.

Canvas host

{
  canvasHost: {
    root: "~/.openclaw/workspace/canvas",
    liveReload: true,
    // enabled: false, // or OPENCLAW_SKIP_CANVAS_HOST=1
  },
}
  • Udostępnia edytowalne przez agenta HTML/CSS/JS oraz A2UI przez HTTP pod portem Gateway:
    • http://<gateway-host>:<gateway.port>/__openclaw__/canvas/
    • http://<gateway-host>:<gateway.port>/__openclaw__/a2ui/
  • Tylko lokalnie: zachowaj gateway.bind: "loopback" (domyślnie).
  • Bindy inne niż loopback: ścieżki canvas wymagają uwierzytelniania Gateway (token/hasło/trusted-proxy), tak samo jak inne powierzchnie HTTP Gateway.
  • Node WebViews zwykle nie wysyłają nagłówków auth; po sparowaniu i połączeniu node Gateway ogłasza URL-e capability o zakresie node dla dostępu do canvas/A2UI.
  • URL-e capability są powiązane z aktywną sesją WS node i szybko wygasają. Fallback oparty na IP nie jest używany.
  • Wstrzykuje klienta live reload do serwowanego HTML.
  • Automatycznie tworzy startowy index.html, gdy katalog jest pusty.
  • Serwuje też A2UI pod /__openclaw__/a2ui/.
  • Zmiany wymagają restartu Gateway.
  • Wyłącz live reload dla dużych katalogów lub przy błędach EMFILE.

Discovery

mDNS (Bonjour)

{
  discovery: {
    mdns: {
      mode: "minimal", // minimal | full | off
    },
  },
}
  • minimal (domyślnie): pomija cliPath + sshPort z rekordów TXT.
  • full: uwzględnia cliPath + sshPort.
  • Nazwa hosta domyślnie ma wartość openclaw. Nadpisz przez OPENCLAW_MDNS_HOSTNAME.

Wide-area (DNS-SD)

{
  discovery: {
    wideArea: { enabled: true },
  },
}
Zapisuje strefę unicast DNS-SD pod ~/.openclaw/dns/. Do wykrywania między sieciami połącz to z serwerem DNS (zalecany CoreDNS) + Tailscale split DNS. Konfiguracja: openclaw dns setup --apply.

Środowisko

env (inline env vars)

{
  env: {
    OPENROUTER_API_KEY: "sk-or-...",
    vars: {
      GROQ_API_KEY: "gsk-...",
    },
    shellEnv: {
      enabled: true,
      timeoutMs: 15000,
    },
  },
}
  • Inline env vars są stosowane tylko wtedy, gdy w środowisku procesu brakuje klucza.
  • Pliki .env: .env z bieżącego katalogu roboczego + ~/.openclaw/.env (żaden nie nadpisuje istniejących zmiennych).
  • shellEnv: importuje brakujące oczekiwane klucze z profilu powłoki logowania.
  • Pełny priorytet znajdziesz w Environment.

Podstawianie zmiennych env

Odwołuj się do zmiennych env w dowolnym ciągu konfiguracji przez ${VAR_NAME}:
{
  gateway: {
    auth: { token: "${OPENCLAW_GATEWAY_TOKEN}" },
  },
}
  • Dopasowywane są tylko nazwy pisane wielkimi literami: [A-Z_][A-Z0-9_]*.
  • Brakujące/puste zmienne powodują błąd podczas ładowania konfiguracji.
  • Ucieknij przez $${VAR}, aby uzyskać dosłowne ${VAR}.
  • Działa z $include.

Sekrety

Odwołania do sekretów są addytywne: jawne wartości nadal działają.

SecretRef

Użyj jednego kształtu obiektu:
{ source: "env" | "file" | "exec", provider: "default", id: "..." }
Walidacja:
  • wzorzec provider: ^[a-z][a-z0-9_-]{0,63}$
  • wzorzec id dla source: "env": ^[A-Z][A-Z0-9_]{0,127}$
  • source: "file" id: bezwzględny wskaźnik JSON (na przykład "/providers/openai/apiKey")
  • wzorzec id dla source: "exec": ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,255}$
  • id dla source: "exec" nie mogą zawierać segmentów ścieżki rozdzielanych przez ukośniki . ani .. (na przykład a/../b jest odrzucane)

Obsługiwana powierzchnia poświadczeń

  • Macierz kanoniczna: SecretRef Credential Surface
  • secrets apply kieruje na obsługiwane ścieżki poświadczeń openclaw.json.
  • Odwołania z auth-profiles.json są uwzględniane w rozwiązywaniu runtime i pokryciu audytu.

Konfiguracja dostawców sekretów

{
  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",
    },
  },
}
Uwagi:
  • Dostawca file obsługuje mode: "json" i mode: "singleValue" (id musi mieć wartość "value" w trybie singleValue).
  • Dostawca exec wymaga bezwzględnej ścieżki command i używa ładunków protokołu przez stdin/stdout.
  • Domyślnie ścieżki poleceń będące dowiązaniami symbolicznymi są odrzucane. Ustaw allowSymlinkCommand: true, aby zezwolić na ścieżki dowiązań symbolicznych przy jednoczesnej walidacji ścieżki rozwiązanego celu.
  • Jeśli skonfigurowano trustedDirs, kontrola zaufanych katalogów dotyczy ścieżki rozwiązanego celu.
  • Środowisko potomne exec jest domyślnie minimalne; przekazuj wymagane zmienne jawnie przez passEnv.
  • Odwołania do sekretów są rozwiązywane w czasie aktywacji do migawki w pamięci, a następnie ścieżki żądań odczytują tylko tę migawkę.
  • Filtrowanie aktywnej powierzchni ma zastosowanie podczas aktywacji: nierozwiązane odwołania na włączonych powierzchniach powodują błąd startu/przeładowania, a nieaktywne powierzchnie są pomijane z diagnostyką.

Magazyn auth

{
  auth: {
    profiles: {
      "anthropic:default": { provider: "anthropic", mode: "api_key" },
      "anthropic:work": { provider: "anthropic", mode: "api_key" },
      "openai-codex:personal": { provider: "openai-codex", mode: "oauth" },
    },
    order: {
      anthropic: ["anthropic:default", "anthropic:work"],
      "openai-codex": ["openai-codex:personal"],
    },
  },
}
  • Profile per agent są przechowywane w <agentDir>/auth-profiles.json.
  • auth-profiles.json obsługuje odwołania na poziomie wartości (keyRef dla api_key, tokenRef dla token) dla statycznych trybów poświadczeń.
  • Profile trybu OAuth (auth.profiles.<id>.mode = "oauth") nie obsługują poświadczeń auth-profile opartych na SecretRef.
  • Statyczne poświadczenia runtime pochodzą z rozwiązanych migawek w pamięci; starsze statyczne wpisy auth.json są czyszczone po wykryciu.
  • Starsze importy OAuth z ~/.openclaw/credentials/oauth.json.
  • Zobacz OAuth.
  • Zachowanie runtime sekretów oraz narzędzia audit/configure/apply: Secrets Management.

auth.cooldowns

{
  auth: {
    cooldowns: {
      billingBackoffHours: 5,
      billingBackoffHoursByProvider: { anthropic: 3, openai: 8 },
      billingMaxHours: 24,
      authPermanentBackoffMinutes: 10,
      authPermanentMaxMinutes: 60,
      failureWindowHours: 24,
      overloadedProfileRotations: 1,
      overloadedBackoffMs: 0,
      rateLimitedProfileRotations: 1,
    },
  },
}
  • billingBackoffHours: bazowy backoff w godzinach, gdy profil kończy się błędem z powodu rzeczywistych problemów rozliczeniowych/braku środków (domyślnie: 5). Jawny tekst rozliczeniowy może nadal trafić tutaj nawet przy odpowiedziach 401/403, ale dopasowania tekstu specyficzne dla dostawcy pozostają ograniczone do dostawcy, do którego należą (na przykład OpenRouter Key limit exceeded). Powtarzalne komunikaty 402 dotyczące okna użycia lub limitów wydatków organizacji/workspace pozostają zamiast tego w ścieżce rate_limit.
  • billingBackoffHoursByProvider: opcjonalne nadpisania godzin backoffu rozliczeniowego per dostawca.
  • billingMaxHours: limit wzrostu wykładniczego backoffu rozliczeniowego w godzinach (domyślnie: 24).
  • authPermanentBackoffMinutes: bazowy backoff w minutach dla błędów auth_permanent o wysokiej pewności (domyślnie: 10).
  • authPermanentMaxMinutes: limit wzrostu backoffu auth_permanent w minutach (domyślnie: 60).
  • failureWindowHours: ruchome okno w godzinach używane dla liczników backoffu (domyślnie: 24).
  • overloadedProfileRotations: maksymalna liczba rotacji auth-profile tego samego dostawcy przy błędach przeciążenia przed przełączeniem na fallback modelu (domyślnie: 1). Także kształty typu provider-busy, takie jak ModelNotReadyException, trafiają tutaj.
  • overloadedBackoffMs: stałe opóźnienie przed ponowną próbą rotacji przeciążonego dostawcy/profilu (domyślnie: 0).
  • rateLimitedProfileRotations: maksymalna liczba rotacji auth-profile tego samego dostawcy przy błędach limitu szybkości przed przełączeniem na fallback modelu (domyślnie: 1). Ten koszyk rate_limit obejmuje teksty charakterystyczne dla dostawców, takie jak Too many concurrent requests, ThrottlingException, concurrency limit reached, workers_ai ... quota limit exceeded i resource exhausted.

Logowanie

{
  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"],
  },
}
  • Domyślny plik logu: /tmp/openclaw/openclaw-YYYY-MM-DD.log.
  • Ustaw logging.file, aby uzyskać stałą ścieżkę.
  • consoleLevel podnosi się do debug, gdy --verbose.
  • maxFileBytes: maksymalny rozmiar pliku logu w bajtach, po którym zapisy są wstrzymywane (dodatnia liczba całkowita; domyślnie: 524288000 = 500 MB). W środowiskach produkcyjnych używaj zewnętrznej rotacji logów.

Diagnostyka

{
  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: główny przełącznik wyjścia instrumentacji (domyślnie: true).
  • flags: tablica ciągów flag włączających ukierunkowane wyjście logów (obsługuje wildcardy takie jak "telegram.*" lub "*").
  • stuckSessionWarnMs: próg wieku w ms do emitowania ostrzeżeń o zablokowanej sesji, gdy sesja pozostaje w stanie przetwarzania.
  • otel.enabled: włącza potok eksportu OpenTelemetry (domyślnie: false).
  • otel.endpoint: URL kolektora dla eksportu OTel.
  • otel.protocol: "http/protobuf" (domyślnie) lub "grpc".
  • otel.headers: dodatkowe nagłówki metadanych HTTP/gRPC wysyłane z żądaniami eksportu OTel.
  • otel.serviceName: nazwa usługi dla atrybutów zasobu.
  • otel.traces / otel.metrics / otel.logs: włączają eksport śledzeń, metryk lub logów.
  • otel.sampleRate: współczynnik próbkowania śledzeń 01.
  • otel.flushIntervalMs: okresowy interwał opróżniania telemetrii w ms.
  • cacheTrace.enabled: zapisuje migawki śladu cache dla przebiegów wbudowanych (domyślnie: false).
  • cacheTrace.filePath: ścieżka wyjściowa dla JSONL śladu cache (domyślnie: $OPENCLAW_STATE_DIR/logs/cache-trace.jsonl).
  • cacheTrace.includeMessages / includePrompt / includeSystem: kontrolują, co jest uwzględniane w wyjściu śladu cache (wszystkie domyślnie: true).

Aktualizacja

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

    auto: {
      enabled: false,
      stableDelayHours: 6,
      stableJitterHours: 12,
      betaCheckIntervalHours: 1,
    },
  },
}
  • channel: kanał wydania dla instalacji npm/git — "stable", "beta" lub "dev".
  • checkOnStart: sprawdza aktualizacje npm przy starcie Gateway (domyślnie: true).
  • auto.enabled: włącza aktualizacje automatyczne w tle dla instalacji pakietowych (domyślnie: false).
  • auto.stableDelayHours: minimalne opóźnienie w godzinach przed automatycznym zastosowaniem na kanale stable (domyślnie: 6; max: 168).
  • auto.stableJitterHours: dodatkowe okno rozłożenia wdrożenia kanału stable w godzinach (domyślnie: 12; max: 168).
  • auto.betaCheckIntervalHours: jak często wykonywane są sprawdzenia kanału beta, w godzinach (domyślnie: 1; max: 24).

ACP

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

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

    runtime: {
      ttlMinutes: 30,
    },
  },
}
  • enabled: globalna bramka funkcji ACP (domyślnie: false).
  • dispatch.enabled: niezależna bramka dla dyspozycji tur sesji ACP (domyślnie: true). Ustaw false, aby zachować dostępność poleceń ACP przy jednoczesnym blokowaniu wykonania.
  • backend: domyślny identyfikator backendu runtime ACP (musi odpowiadać zarejestrowanemu Pluginowi runtime ACP).
  • defaultAgent: zapasowy identyfikator docelowego agenta ACP, gdy uruchomienia nie określają jawnego celu.
  • allowedAgents: lista dozwolonych identyfikatorów agentów dopuszczonych do sesji runtime ACP; pusta oznacza brak dodatkowych ograniczeń.
  • maxConcurrentSessions: maksymalna liczba jednocześnie aktywnych sesji ACP.
  • stream.coalesceIdleMs: okno bezczynnego opróżniania w ms dla strumieniowanego tekstu.
  • stream.maxChunkChars: maksymalny rozmiar porcji przed podziałem projekcji strumieniowanego bloku.
  • stream.repeatSuppression: tłumi powtarzające się linie statusu/narzędzi per tura (domyślnie: true).
  • stream.deliveryMode: "live" strumieniuje przyrostowo; "final_only" buforuje aż do terminalnych zdarzeń tury.
  • stream.hiddenBoundarySeparator: separator przed widocznym tekstem po ukrytych zdarzeniach narzędzi (domyślnie: "paragraph").
  • stream.maxOutputChars: maksymalna liczba znaków wyjścia asystenta projektowana per tura ACP.
  • stream.maxSessionUpdateChars: maksymalna liczba znaków dla projektowanych linii statusu/aktualizacji ACP.
  • stream.tagVisibility: zapis nazw tagów do logicznych nadpisań widoczności dla strumieniowanych zdarzeń.
  • runtime.ttlMinutes: TTL bezczynności w minutach dla workerów sesji ACP przed kwalifikacją do czyszczenia.
  • runtime.installCommand: opcjonalne polecenie instalacji uruchamiane przy bootstrapowaniu środowiska runtime ACP.

CLI

{
  cli: {
    banner: {
      taglineMode: "off", // random | default | off
    },
  },
}
  • cli.banner.taglineMode kontroluje styl sloganu bannera:
    • "random" (domyślnie): rotujące zabawne/sezonowe slogany.
    • "default": stały neutralny slogan (Wszystkie Twoje czaty, jeden OpenClaw.).
    • "off": brak tekstu sloganu (tytuł/wersja bannera nadal są wyświetlane).
  • Aby ukryć cały banner (nie tylko slogany), ustaw zmienną środowiskową OPENCLAW_HIDE_BANNER=1.

Wizard

Metadane zapisywane przez prowadzone przepływy konfiguracji CLI (onboard, configure, doctor):
{
  wizard: {
    lastRunAt: "2026-01-01T00:00:00.000Z",
    lastRunVersion: "2026.1.4",
    lastRunCommit: "abc1234",
    lastRunCommand: "configure",
    lastRunMode: "local",
  },
}

Tożsamość

Zobacz pola tożsamości agents.list w sekcji Domyślne ustawienia agenta.

Bridge (starsze, usunięte)

Bieżące buildy nie zawierają już mostu TCP. Node łączą się przez Gateway WebSocket. Klucze bridge.* nie są już częścią schematu konfiguracji (walidacja kończy się błędem do czasu ich usunięcia; openclaw doctor --fix może usunąć nieznane klucze).
{
  "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: jak długo zachowywać ukończone izolowane sesje uruchomień Cron przed usunięciem z sessions.json. Steruje także czyszczeniem zarchiwizowanych usuniętych transkryptów Cron. Domyślnie: 24h; ustaw false, aby wyłączyć.
  • runLog.maxBytes: maksymalny rozmiar pliku logu na uruchomienie (cron/runs/<jobId>.jsonl) przed przycięciem. Domyślnie: 2_000_000 bajtów.
  • runLog.keepLines: liczba najnowszych linii zachowywanych po uruchomieniu przycinania logu uruchomienia. Domyślnie: 2000.
  • webhookToken: token bearer używany do dostarczania POST Webhook dla Cron (delivery.mode = "webhook"); jeśli pominięty, nagłówek auth nie jest wysyłany.
  • webhook: przestarzały starszy zapasowy URL Webhook (http/https) używany tylko dla zapisanych zadań, które nadal mają notify: true.

cron.retry

{
  cron: {
    retry: {
      maxAttempts: 3,
      backoffMs: [30000, 60000, 300000],
      retryOn: ["rate_limit", "overloaded", "network", "timeout", "server_error"],
    },
  },
}
  • maxAttempts: maksymalna liczba ponowień dla jednorazowych zadań przy błędach przejściowych (domyślnie: 3; zakres: 010).
  • backoffMs: tablica opóźnień backoff w ms dla każdej próby ponowienia (domyślnie: [30000, 60000, 300000]; 1–10 wpisów).
  • retryOn: typy błędów wyzwalające ponowienia — "rate_limit", "overloaded", "network", "timeout", "server_error". Pomiń, aby ponawiać dla wszystkich typów przejściowych.
Dotyczy tylko jednorazowych zadań Cron. Zadania cykliczne używają osobnej obsługi błędów.

cron.failureAlert

{
  cron: {
    failureAlert: {
      enabled: false,
      after: 3,
      cooldownMs: 3600000,
      mode: "announce",
      accountId: "main",
    },
  },
}
  • enabled: włącza alerty o błędach dla zadań Cron (domyślnie: false).
  • after: liczba kolejnych niepowodzeń przed uruchomieniem alertu (dodatnia liczba całkowita, min.: 1).
  • cooldownMs: minimalna liczba milisekund między powtarzanymi alertami dla tego samego zadania (nieujemna liczba całkowita).
  • mode: tryb dostarczenia — "announce" wysyła przez wiadomość kanałową; "webhook" wysyła POST na skonfigurowany Webhook.
  • accountId: opcjonalny identyfikator konta lub kanału do ograniczenia zakresu dostarczania alertów.

cron.failureDestination

{
  cron: {
    failureDestination: {
      mode: "announce",
      channel: "last",
      to: "channel:C1234567890",
      accountId: "main",
    },
  },
}
  • Domyślny cel dla powiadomień o błędach Cron we wszystkich zadaniach.
  • mode: "announce" lub "webhook"; domyślnie "announce", gdy istnieją wystarczające dane docelowe.
  • channel: nadpisanie kanału dla dostarczania announce. "last" ponownie używa ostatniego znanego kanału dostarczenia.
  • to: jawny cel announce lub URL Webhook. Wymagane dla trybu webhook.
  • accountId: opcjonalne nadpisanie konta dla dostarczania.
  • Per-zadaniowe delivery.failureDestination nadpisuje tę globalną wartość domyślną.
  • Gdy nie jest ustawiony ani globalny, ani per-zadaniowy cel błędu, zadania, które już dostarczają przez announce, wracają przy błędzie do tego podstawowego celu announce.
  • delivery.failureDestination jest obsługiwane tylko dla zadań sessionTarget="isolated", chyba że podstawowe delivery.mode zadania ma wartość "webhook".
Zobacz Cron Jobs. Izolowane wykonania Cron są śledzone jako background tasks.

Zmienne szablonów modeli mediów

Placeholders szablonów rozwijane w tools.media.models[].args:
ZmiennaOpis
{{Body}}Pełna treść wiadomości przychodzącej
{{RawBody}}Surowa treść (bez opakowań historii/nadawcy)
{{BodyStripped}}Treść z usuniętymi wzmiankami grupowymi
{{From}}Identyfikator nadawcy
{{To}}Identyfikator celu
{{MessageSid}}Identyfikator wiadomości kanału
{{SessionId}}Bieżący UUID sesji
{{IsNewSession}}"true" po utworzeniu nowej sesji
{{MediaUrl}}Pseudo-URL przychodzącego medium
{{MediaPath}}Lokalna ścieżka medium
{{MediaType}}Typ medium (image/audio/document/…)
{{Transcript}}Transkrypt audio
{{Prompt}}Rozwiązany prompt mediów dla wpisów CLI
{{MaxChars}}Rozwiązana maksymalna liczba znaków wyjścia dla wpisów CLI
{{ChatType}}"direct" lub "group"
{{GroupSubject}}Temat grupy (best effort)
{{GroupMembers}}Podgląd członków grupy (best effort)
{{SenderName}}Wyświetlana nazwa nadawcy (best effort)
{{SenderE164}}Numer telefonu nadawcy (best effort)
{{Provider}}Wskazówka dostawcy (whatsapp, telegram, discord itd.)

Include konfiguracji ($include)

Podziel konfigurację na wiele plików:
// ~/.openclaw/openclaw.json
{
  gateway: { port: 18789 },
  agents: { $include: "./agents.json5" },
  broadcast: {
    $include: ["./clients/mueller.json5", "./clients/schmidt.json5"],
  },
}
Zachowanie scalania:
  • Pojedynczy plik: zastępuje zawierający go obiekt.
  • Tablica plików: głębokie scalanie w kolejności (późniejsze nadpisują wcześniejsze).
  • Klucze sąsiednie: scalane po include (nadpisują dołączone wartości).
  • Zagnieżdżone include: do 10 poziomów głębokości.
  • Ścieżki: rozwiązywane względem pliku dołączającego, ale muszą pozostać w obrębie katalogu głównego najwyższego poziomu konfiguracji (dirname z openclaw.json). Formy bezwzględne/../ są dozwolone tylko wtedy, gdy nadal rozwiązują się wewnątrz tej granicy.
  • Błędy: jasne komunikaty dla brakujących plików, błędów parsowania i cyklicznych include.

Powiązane: Konfiguracja · Przykłady konfiguracji · Doctor