Przejdź do głównej treści

Referencja konfiguracji

Każde pole dostępne w ~/.openclaw/openclaw.json. Aby uzyskać przegląd zorientowany na zadania, zobacz Configuration. Format konfiguracji to JSON5 (dozwolone komentarze i końcowe przecinki). Wszystkie pola są opcjonalne — OpenClaw używa bezpiecznych wartości domyślnych, gdy zostaną pominięte.

Kanały

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

Dostęp do DM i grup

Wszystkie kanały obsługują zasady DM i zasady grup:
Zasada DMZachowanie
pairing (domyślna)Nieznani nadawcy dostają jednorazowy kod parowania; właściciel musi zatwierdzić
allowlistTylko nadawcy z allowFrom (lub sparowanego magazynu dozwolonych)
openZezwalaj na wszystkie przychodzące DM (wymaga allowFrom: ["*"])
disabledIgnoruj wszystkie przychodzące DM
Zasada grupyZachowanie
allowlist (domyślna)Tylko grupy pasujące do skonfigurowanej listy dozwolonych
openPomija listy dozwolonych grup (gating wzmiankami nadal obowiązuje)
disabledBlokuje wszystkie wiadomości grupowe/pokojów
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 cały blok dostawcy jest nieobecny (channels.<provider> nie istnieje), zasada grupowa środowiska uruchomieniowego wraca do allowlist (fail-closed) z ostrzeżeniem podczas uruchamiania.

Nadpisania modeli dla kanałów

Użyj channels.modelByChannel, aby przypiąć konkretne identyfikatory kanałów do modelu. Wartości akceptują provider/model lub skonfigurowane aliasy modeli. Mapowanie kanałów ma zastosowanie, 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 do współdzielonych zasad grupowych i zachowania heartbeat między dostawcami:
{
  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 grupowa, gdy groupPolicy na poziomie dostawcy nie jest ustawione.
  • channels.defaults.contextVisibility: domyślny tryb widoczności kontekstu uzupełniającego dla wszystkich kanałów. Wartości: all (domyślnie, uwzględnia cały kontekst cytatów/wątków/historii), allowlist (uwzględnia tylko kontekst od nadawców z listy dozwolonych), allowlist_quote (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 obniżonej sprawności/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, // niebieskie haczyki (false w trybie self-chat)
      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 (sortowanego).
  • Opcjonalne channels.whatsapp.defaultAccount nadpisuje ten zapasowy wybór konta domyślnego, gdy pasuje do skonfigurowanego identyfikatora konta.
  • Starszy jednokontowy katalog uwierzytelniania Baileys 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: "Odpowiedzi powinny być krótkie.",
          topics: {
            "99": {
              requireMention: false,
              skills: ["search"],
              systemPrompt: "Trzymaj się tematu.",
            },
          },
        },
      },
      customCommands: [
        { command: "backup", description: "Kopia zapasowa Git" },
        { command: "generate", description: "Utwórz obraz" },
      ],
      historyLimit: 50,
      replyToMode: "first", // off | first | all
      linkPreview: true,
      streaming: "partial", // off | partial | block | progress (domyślnie: off; włącz jawnie, aby uniknąć limitów szybkości podglądu-edycji)
      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; symlinki są odrzucane), z TELEGRAM_BOT_TOKEN jako wartością zapasową dla konta domyślnego.
  • Opcjonalne channels.telegram.defaultAccount nadpisuje domyślny wybór konta, gdy pasuje do skonfigurowanego identyfikatora konta.
  • W konfiguracjach wielokontowych (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 przez Telegram (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 w ACP Agents.
  • Podglądy strumieni Telegram używają sendMessage + editMessageText (działa w czatach bezpośrednich i grupowych).
  • Zasada ponawiania: zobacz Retry policy.

Discord

{
  channels: {
    discord: {
      enabled: true,
      token: "your-bot-token",
      mediaMaxMb: 8,
      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
      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: "Tylko krótkie odpowiedzi.",
            },
          },
        },
      },
      historyLimit: 20,
      textChunkLimit: 2000,
      chunkMode: "length", // length | newline
      streaming: "off", // off | partial | block | progress (progress mapuje się do partial w Discord)
      maxLinesPerMessage: 17,
      ui: {
        components: {
          accentColor: "#5865F2",
        },
      },
      threadBindings: {
        enabled: true,
        idleHours: 24,
        maxAgeHours: 0,
        spawnSubagentSessions: false, // opt-in dla 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 podają jawny token Discord, używają tego tokena dla wywołania; ustawienia ponawiania/zasad konta nadal pochodzą z wybranego konta w aktywnym snapshotcie środowiska uruchomieniowego.
  • Opcjonalne channels.discord.defaultAccount nadpisuje domyślny wybór konta, gdy pasuje do skonfigurowanego identyfikatora konta.
  • Używaj user:<id> (DM) lub channel:<id> (kanał guild) jako celów dostarczenia; same numeryczne identyfikatory są odrzucane.
  • Slugi guild są pisane małymi literami, a spacje zastępowane przez -; klucze kanałów używają nazwy w postaci slug (bez #). Preferuj identyfikatory guild.
  • Wiadomości autorstwa botów 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 kanałów) 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 kontroluje routing powiązany z wątkami Discord:
    • enabled: nadpisanie Discord dla funkcji sesji powiązanych z wątkiem (/focus, /unfocus, /agents, /session idle, /session max-age oraz dostarczenie/routing powiązany)
    • idleHours: nadpisanie Discord dla automatycznego odfokusowania po bezczynności w godzinach (0 wyłącza)
    • maxAgeHours: nadpisanie Discord dla sztywnego maksymalnego wieku w godzinach (0 wyłącza)
    • spawnSubagentSessions: przełącznik opt-in dla automatycznego tworzenia/powiązywania 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 w ACP Agents.
  • channels.discord.ui.components.accentColor ustawia kolor akcentu dla kontenerów Discord components v2.
  • channels.discord.voice włącza rozmowy w kanałach głosowych Discord oraz opcjonalne automatyczne dołączanie i nadpisania TTS.
  • channels.discord.voice.daveEncryption i channels.discord.voice.decryptionFailureTolerance są przekazywane do opcji DAVE w @discordjs/voice (domyślnie true i 24).
  • 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 deszyfrowania.
  • channels.discord.streaming to kanoniczny klucz trybu strumieniowania. Starsze wartości streamMode oraz logiczne streaming są automatycznie migrowane.
  • channels.discord.autoPresence mapuje dostępność środowiska uruchomieniowego na obecność 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 (tryb zgodności break-glass).
  • channels.discord.execApprovals: natywne dostarczanie zatwierdzeń exec przez Discord 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 Discord, którzy mogą zatwierdzać żądania exec. Gdy pominięte, następuje powrót do 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ć prompty zatwierdzeń. "dm" (domyślnie) wysyła do DM zatwierdzających, "channel" wysyła do kanału źródłowego, "both" wysyła do obu. Gdy cel obejmuje "channel", przycisków mogą używać tylko rozwiązani zatwierdzający.
    • cleanupAfterResolve: gdy true, usuwa DM-y zatwierdzeń po zatwierdzeniu, odrzuceniu lub upływie czasu.
Tryby powiadomień o reakcjach: off (brak), own (wiadomości bota, domyślnie), all (wszystkie wiadomości), allowlist (z 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: inline (serviceAccount) lub z pliku (serviceAccountFile).
  • SecretRef konta usługi jest również obsługiwany (serviceAccountRef).
  • Zapasowe wartości z env: 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 principal email (tryb zgodności break-glass).

Slack

{
  channels: {
    slack: {
      enabled: true,
      botToken: "xoxb-...",
      appToken: "xapp-...",
      dmPolicy: "pairing",
      allowFrom: ["U123", "U456", "*"],
      dm: { enabled: true, groupEnabled: false, groupChannels: ["G123"] },
      channels: {
        C123: { allow: true, requireMention: true, allowBots: false },
        "#general": {
          allow: true,
          requireMention: true,
          allowBots: false,
          users: ["U123"],
          skills: ["docs"],
          systemPrompt: "Tylko krótkie odpowiedzi.",
        },
      },
      historyLimit: 50,
      allowBots: false,
      reactionNotifications: "own",
      reactionAllowlist: ["U123"],
      replyToMode: "off", // off | first | all
      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: "partial", // off | partial | block | progress (tryb podglądu)
      nativeStreaming: true, // użyj natywnego API strumieniowania Slack, gdy streaming=partial
      mediaMaxMb: 20,
      execApprovals: {
        enabled: "auto", // true | false | "auto"
        approvers: ["U123"],
        agentFilter: ["default"],
        sessionFilter: ["slack:"],
        target: "dm", // dm | channel | both
      },
    },
  },
}
  • Socket mode wymaga zarówno botToken, jak i appToken (SLACK_BOT_TOKEN + SLACK_APP_TOKEN jako zapasowe wartości env dla konta domyślnego).
  • HTTP mode wymaga botToken plus signingSecret (na poziomie głównym lub per konto).
  • botToken, appToken, signingSecret i userToken akceptują jawne stringi lub obiekty SecretRef.
  • Snapshoty kont Slack udostępniają pola źródła/statusu poświadczeń, takie jak botTokenSource, botTokenStatus, appTokenStatus, a w trybie HTTP także 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 przez Slack.
  • Opcjonalne channels.slack.defaultAccount nadpisuje domyślny wybór konta, gdy pasuje do skonfigurowanego identyfikatora konta.
  • channels.slack.streaming to kanoniczny klucz trybu strumieniowania. Starsze wartości streamMode oraz logiczne streaming 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ółdzielony w kanale. thread.inheritParent kopiuje transkrypt kanału nadrzędnego do nowych wątków.
  • typingReaction dodaje tymczasową reakcję do przychodzącej wiadomości Slack podczas generowania odpowiedzi, a po zakończeniu ją usuwa. Użyj skrótu emoji Slack, takiego jak "hourglass_flowing_sand".
  • channels.slack.execApprovals: natywne dostarczanie zatwierdzeń exec przez Slack i autoryzacja zatwierdzających. Ten sam schemat co Discord: enabled (true/false/"auto"), approvers (identyfikatory użytkowników Slack), agentFilter, sessionFilter i target ("dm", "channel" lub "both").
Grupa akcjiDomyślnieUwagi
reactionsenabledReagowanie + lista reakcji
messagesenabledOdczyt/wysyłanie/edycja/usuwanie
pinsenabledPrzypinanie/odpinanie/lista
memberInfoenabledInformacje o członku
emojiListenabledLista 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",
        // Opcjonalny jawny URL dla wdrożeń z reverse proxy/publicznych
        callbackUrl: "https://gateway.example.com/api/channels/mattermost/command",
      },
      textChunkLimit: 4000,
      chunkMode: "length",
    },
  },
}
Tryby czatu: oncall (odpowiada przy wzmiance @, 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ć endpoint gateway OpenClaw i być osiągalny z serwera Mattermost.
  • Natywne callbacki slash są uwierzytelniane tokenami per polecenie zwróconymi przez Mattermost podczas rejestracji poleceń slash. Jeśli rejestracja się nie powiedzie lub nie aktywowano żadnych poleceń, OpenClaw odrzuca callbacki z Unauthorized: invalid command token.
  • W przypadku prywatnych/tailnet/internal hostów callbacków Mattermost może wymagać, aby ServiceSettings.AllowedUntrustedInternalConnections zawierało host/domenę callbacku. Używaj wartości host/domena, a nie pełnych URL-i.
  • channels.mattermost.configWrites: zezwalaj lub odmawiaj zapisów konfiguracji inicjowanych przez Mattermost.
  • channels.mattermost.requireMention: wymagaj @mention przed odpowiedzią w kanałach.
  • channels.mattermost.groups.<channelId>.requireMention: nadpisanie gatingu wzmiankami per kanał ("*" dla domyślnego).
  • Opcjonalne channels.mattermost.defaultAccount nadpisuje domyślny wybór konta, gdy pasuje do skonfigurowanego identyfikatora konta.

Signal

{
  channels: {
    signal: {
      enabled: true,
      account: "+15555550123", // opcjonalne powiązanie konta
      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 konkretnej tożsamości konta Signal.
  • channels.signal.configWrites: zezwalaj lub odmawiaj zapisów konfiguracji inicjowanych przez Signal.
  • Opcjonalne channels.signal.defaultAccount nadpisuje domyślny wybór konta, gdy pasuje do skonfigurowanego identyfikatora konta.

BlueBubbles

BlueBubbles to zalecana ścieżka iMessage (oparta na pluginie, konfigurowana w channels.bluebubbles).
{
  channels: {
    bluebubbles: {
      enabled: true,
      dmPolicy: "pairing",
      // serverUrl, password, webhookPath, kontrola grup i zaawansowane akcje:
      // zobacz /channels/bluebubbles
    },
  },
}
  • Kluczowe ścieżki rdzeniowe omówione tutaj: channels.bluebubbles, channels.bluebubbles.dmPolicy.
  • Opcjonalne channels.bluebubbles.defaultAccount nadpisuje domyślny wybór konta, gdy 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 udokumentowana 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 domyślny wybór konta, gdy 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ć 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łej kontroli klucza hosta, więc upewnij się, że klucz hosta przekaźnika już istnieje w ~/.ssh/known_hosts.
  • channels.imessage.configWrites: zezwalaj lub odmawiaj zapisów konfiguracji inicjowanych przez 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 oparty na rozszerzeniu 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 proxy HTTP(S). Nazwane konta mogą go nadpisać przez channels.matrix.accounts.<id>.proxy.
  • channels.matrix.allowPrivateNetwork zezwala na prywatne/wewnętrzne homeserwery. proxy i allowPrivateNetwork to niezależne mechanizmy kontroli.
  • channels.matrix.defaultAccount wybiera preferowane konto w konfiguracjach wielokontowych.
  • channels.matrix.execApprovals: natywne dostarczanie zatwierdzeń exec przez Matrix 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) mogące zatwierdzać żądania 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ć prompty zatwierdzeń. "dm" (domyślnie), "channel" (pokój źródłowy) lub "both".
    • Nadpisania per konto: channels.matrix.accounts.<id>.execApprovals.
  • Sondy stanu Matrix i wyszukiwania katalogowe na żywo używają tej samej polityki proxy co ruch środowiska uruchomieniowego.
  • Pełna konfiguracja Matrix, reguły targetowania i przykłady konfiguracji są udokumentowane w Matrix.

Microsoft Teams

Microsoft Teams jest oparty na rozszerzeniu i konfigurowany w channels.msteams.
{
  channels: {
    msteams: {
      enabled: true,
      configWrites: true,
      // appId, appPassword, tenantId, webhook, zasady zespołów/kanałów:
      // zobacz /channels/msteams
    },
  },
}
  • Kluczowe ścieżki rdzeniowe omówione tutaj: channels.msteams, channels.msteams.configWrites.
  • Pełna konfiguracja Teams (poświadczenia, webhook, zasady DM/grup, nadpisania per zespół/per kanał) jest udokumentowana w Microsoft Teams.

IRC

IRC jest oparte na rozszerzeniu i konfigurowane 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",
      },
    },
  },
}
  • Kluczowe ścieżki rdzeniowe omówione tutaj: channels.irc, channels.irc.dmPolicy, channels.irc.configWrites, channels.irc.nickserv.*.
  • Opcjonalne channels.irc.defaultAccount nadpisuje domyślny wybór konta, gdy pasuje do skonfigurowanego identyfikatora konta.
  • Pełna konfiguracja kanału IRC (host/port/TLS/kanały/listy dozwolonych/gating wzmiankami) jest udokumentowana w IRC.

Wielokontowość (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 zostanie pominięte (CLI + routing).
  • Tokeny env 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 skierować każde konto do innego agenta.
  • Jeśli dodasz konto inne niż domyślne przez openclaw channels add (lub onboarding kanału), będąc nadal przy jednokontowej konfiguracji kanału na poziomie głównym, OpenClaw najpierw promuje 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 cel named/default.
  • Istniejące powiązania tylko kanałowe (bez accountId) nadal pasują do konta domyślnego; powiązania o zakresie konta pozostają opcjonalne.
  • openclaw doctor --fix naprawia też mieszane kształty, przenosząc wartości jednokontowe najwyższego poziomu o zakresie konta do promowanego konta wybranego dla danego kanału. Większość kanałów używa accounts.default; Matrix może zamiast tego zachować istniejący pasujący cel named/default.

Inne kanały rozszerzeń

Wiele kanałów rozszerzeń jest konfigurowanych jako channels.<id> i udokumentowanych 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.

Gating wzmiankami w czatach grupowych

Wiadomości grupowe domyślnie wymagają wzmianki (wzmianka w metadanych lub bezpieczne wzorce regex). Dotyczy WhatsApp, Telegram, Discord, Google Chat oraz czatów grupowych iMessage. Typy wzmianek:
  • Wzmianki w 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.
  • Gating wzmiankami jest egzekwowany 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 },
      },
    },
  },
}
Rozstrzyganie: nadpisanie per DM → domyślna wartość dostawcy → brak limitu (zachowywane wszystko). Obsługiwane: telegram, whatsapp, discord, slack, signal, imessage, msteams.

Tryb self-chat

Dodaj własny numer do 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"] },
      },
    ],
  },
}

Commands (obsługa poleceń czatu)

{
  commands: {
    native: "auto", // rejestruj natywne polecenia, gdy są obsługiwane
    text: true, // parsuj /commands w wiadomościach czatu
    bash: false, // zezwalaj na ! (alias: /bash)
    bashForegroundMs: 2000,
    config: false, // zezwalaj na /config
    debug: false, // zezwalaj na /debug
    restart: false, // zezwalaj na /restart + narzędzie restartu gateway
    allowFrom: {
      "*": ["user1"],
      discord: ["user:123"],
    },
    useAccessGroups: true,
  },
}
  • Polecenia tekstowe muszą być samodzielnymi wiadomościami zaczynającymi się od /.
  • native: "auto" włącza natywne polecenia dla Discord/Telegram, zostawia Slack wyłączony.
  • Nadpisanie per kanał: channels.discord.commands.native (bool lub "auto"). false czyści wcześniej zarejestrowane polecenia.
  • channels.telegram.customCommands dodaje dodatkowe wpisy menu bota Telegram.
  • bash: true włącza ! <cmd> dla powłoki hosta. Wymaga tools.elevated.enabled i 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.
  • channels.<provider>.configWrites kontroluje mutacje konfiguracji per kanał (domyślnie: true).
  • Dla kanałów wielokontowych channels.<provider>.accounts.<id>.configWrites również kontroluje zapisy, które dotyczą tego konta (na przykład /allowlist --config --account <id> lub /config set channels.<provider>.accounts.<id>...).
  • allowFrom jest per dostawca. Gdy jest ustawione, jest to jedyne źródło autoryzacji (listy dozwolonych/parowanie kanału i useAccessGroups są ignorowane).
  • useAccessGroups: false pozwala poleceniom omijać zasady grup dostępu, gdy allowFrom nie jest ustawione.

Domyślne ustawienia agentów

agents.defaults.workspace

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

agents.defaults.repoRoot

Opcjonalny katalog główny repozytorium pokazywany w wierszu Runtime system promptu. Jeśli nieustawiony, OpenClaw wykrywa go automatycznie, idą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" }, // dziedziczy github, weather
      { id: "docs", skills: ["docs-search"] }, // zastępuje wartości domyślne
      { id: "locked-down", skills: [] }, // bez Skills
    ],
  },
}
  • Pomiń agents.defaults.skills, aby domyślnie Skills nie były ograniczone.
  • 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 ostatecznym zestawem dla danego agenta; nie jest scalana 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.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 przez wszystkie pliki bootstrap workspace. Domyślnie: 150000.
{
  agents: { defaults: { bootstrapTotalMaxChars: 150000 } },
}

agents.defaults.bootstrapPromptTruncationWarning

Kontroluje tekst ostrzeżenia widoczny dla agenta, gdy kontekst bootstrap został obcięty. Domyślnie: "once".
  • "off": nigdy nie wstrzykuje tekstu ostrzeżenia do system promptu.
  • "once": wstrzykuje ostrzeżenie raz na unikalną sygnaturę obcięcia (zalecane).
  • "always": wstrzykuje ostrzeżenie przy każdym uruchomieniu, gdy istnieje obcięcie.
{
  agents: { defaults: { bootstrapPromptTruncationWarning: "once" } }, // off | once | always
}

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ą zużycie tokenów vision i rozmiar ładunku żądania w przebiegach obfitujących w zrzuty ekranu. Wyższe wartości zachowują więcej szczegółów wizualnych.
{
  agents: { defaults: { imageMaxDimensionPx: 1200 } },
}

agents.defaults.userTimezone

Strefa czasowa dla kontekstu system promptu (nie dla timestampów wiadomości). Wartość zapasowa to strefa czasowa hosta.
{
  agents: { defaults: { userTimezone: "America/Chicago" } },
}

agents.defaults.timeFormat

Format czasu w system prompt. Domyślnie: auto (preferencja OS).
{
  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" }, // globalne domyślne parametry dostawcy
      pdfMaxBytesMb: 10,
      pdfMaxPages: 20,
      thinkingDefault: "low",
      verboseDefault: "off",
      elevatedDefault: "on",
      timeoutSeconds: 600,
      mediaMaxMb: 5,
      contextTokens: 200000,
      maxConcurrent: 3,
    },
  },
}
  • model: akceptuje albo string ("provider/model"), albo obiekt ({ primary, fallbacks }).
    • Forma string ustawia tylko model główny.
    • Forma obiektu ustawia model główny plus uporządkowane modele failover.
  • imageModel: akceptuje albo string ("provider/model"), albo obiekt ({ primary, fallbacks }).
    • Używany przez ścieżkę narzędzia image jako konfiguracja modelu vision.
    • Używany też jako routing zapasowy, gdy wybrany/domyslny model nie akceptuje wejścia obrazowego.
  • imageGenerationModel: akceptuje albo string ("provider/model"), albo obiekt ({ primary, fallbacks }).
    • Używany przez współdzieloną funkcję generowania obrazów i każdą przyszłą powierzchnię narzędzi/pluginów 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 dostawcę/model, skonfiguruj też 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ślnego dostawcę z uwierzytelniania. 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.
  • videoGenerationModel: akceptuje albo string ("provider/model"), albo obiekt ({ primary, fallbacks }).
    • Używany przez współdzieloną funkcję generowania wideo.
    • 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.
    • Ustaw to jawnie przed użyciem współdzielonego generowania wideo. W przeciwieństwie do imageGenerationModel, środowisko uruchomieniowe generowania wideo nie wywnioskuje jeszcze domyślnego dostawcy.
    • Jeśli wybierzesz bezpośrednio dostawcę/model, skonfiguruj też pasujące uwierzytelnianie/klucz API dostawcy.
    • Dołączony dostawca generowania wideo Qwen obsługuje obecnie maksymalnie 1 wideo wyjściowe, 1 obraz wejściowy, 4 wideo wejściowe, 10 sekund czasu trwania oraz opcje na poziomie dostawcy size, aspectRatio, resolution, audio i watermark.
  • pdfModel: akceptuje albo string ("provider/model"), albo obiekt ({ primary, fallbacks }).
    • Używany przez narzędzie pdf do routingu modeli.
    • Jeśli pominięty, narzędzie PDF wraca 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 podczas wywołania.
  • pdfMaxPages: domyślna maksymalna liczba stron uwzględnianych przez tryb zapasowy 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 skonfigurowanego dostawcy dla dokładnie tego identyfikatora modelu, a dopiero potem wraca do skonfigurowanego dostawcy domyślnego (przestarzałe zachowanie zgodności, więc preferuj jawne provider/model). Jeśli ten dostawca nie udostępnia już skonfigurowanego modelu domyślnego, OpenClaw wraca do pierwszego skonfigurowanego dostawcy/modelu zamiast eksponować nieaktualną 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, np. 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), następnie agents.list[].params (dla pasującego identyfikatora agenta) nadpisuje per klucz. Szczegóły: Prompt Caching.
  • Mechanizmy zapisu konfiguracji, które modyfikują te pola (na przykład /models set, /models set-image i polecenia add/remove fallback), zapisują kanoniczną formę obiektową i w miarę możliwości zachowują istniejące listy fallback.
  • maxConcurrent: maksymalna liczba równoległych uruchomień agentów między sesjami (każda sesja nadal jest serializowana). Domyślnie: 4.
Wbudowane skróty aliasów (mają zastosowanie tylko, 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
Twoje skonfigurowane 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 dla 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ą adaptive thinking, gdy nie ustawiono jawnego poziomu thinking.

agents.defaults.cliBackends

Opcjonalne backendy CLI dla przebiegów zapasowych tylko tekstowych (bez wywołań narzędzi). Przydatne jako kopia zapasowa, gdy dostawcy API zawodzą.
{
  agents: {
    defaults: {
      cliBackends: {
        "claude-cli": {
          command: "/opt/homebrew/bin/claude",
        },
        "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ą ukierunkowane na tekst; narzędzia są zawsze wyłączone.
  • Sesje są obsługiwane, gdy ustawiono sessionArg.
  • Przekazywanie obrazów jest obsługiwane, gdy imageArg akceptuje ścieżki plików.

agents.defaults.heartbeat

Okresowe uruchomienia heartbeat.
{
  agents: {
    defaults: {
      heartbeat: {
        every: "30m", // 0m wyłącza
        model: "openai/gpt-5.4-mini",
        includeReasoning: false,
        lightContext: false, // domyślnie: false; true zachowuje tylko HEARTBEAT.md z plików bootstrap workspace
        isolatedSession: false, // domyślnie: false; true uruchamia każdy heartbeat w nowej sesji (bez historii rozmowy)
        session: "main",
        to: "+15555550123",
        directPolicy: "allow", // allow (domyślnie) | block
        target: "none", // domyślnie: none | opcje: last | whatsapp | telegram | discord | ...
        prompt: "Przeczytaj HEARTBEAT.md, jeśli istnieje...",
        ackMaxChars: 300,
        suppressToolErrorWarnings: false,
      },
    },
  },
}
  • every: ciąg czasu (ms/s/m/h). Domyślnie: 30m (uwierzytelnianie kluczem API) lub 1h (uwierzytelnianie OAuth). Ustaw 0m, aby wyłączyć.
  • suppressToolErrorWarnings: gdy true, tłumi ładunki ostrzeżeń o błędach narzędzi podczas uruchomień heartbeat.
  • directPolicy: zasada dostarczania bezpośredniego/DM. allow (domyślnie) pozwala na dostarczanie do celu bezpośredniego. block tłumi dostarczanie do celu bezpośredniego i emituje reason=dm-blocked.
  • lightContext: gdy true, uruchomienia heartbeat używają lekkiego kontekstu bootstrap i zachowują tylko HEARTBEAT.md z plików bootstrap workspace.
  • isolatedSession: gdy true, każde uruchomienie heartbeat odbywa się w nowej 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 ~2-5K tokenów.
  • Per agent: ustaw agents.list[].heartbeat. Gdy jakikolwiek agent definiuje heartbeat, heartbeat uruchamia się tylko dla tych agentów.
  • Heartbeat wykonują pełne tury agenta — krótsze interwały zużywają więcej tokenów.

agents.defaults.compaction

{
  agents: {
    defaults: {
      compaction: {
        mode: "safeguard", // default | safeguard
        timeoutSeconds: 900,
        reserveTokensFloor: 24000,
        identifierPolicy: "strict", // strict | off | custom
        identifierInstructions: "Zachowaj dokładnie identyfikatory wdrożeń, identyfikatory ticketów i pary host:port.", // używane, gdy identifierPolicy=custom
        postCompactionSections: ["Session Startup", "Red Lines"], // [] wyłącza ponowne wstrzykiwanie
        model: "openrouter/anthropic/claude-sonnet-4-6", // opcjonalne nadpisanie modelu tylko do kompaktowania
        notifyUser: true, // wyślij krótkie powiadomienie, gdy rozpoczyna się kompaktowanie (domyślnie: false)
        memoryFlush: {
          enabled: true,
          softThresholdTokens: 6000,
          systemPrompt: "Sesja zbliża się do kompaktowania. Zapisz trwałe wspomnienia teraz.",
          prompt: "Zapisz trwałe notatki do memory/YYYY-MM-DD.md; odpowiedz dokładnym cichym tokenem NO_REPLY, jeśli nie ma nic do zapisania.",
        },
      },
    },
  },
}
  • mode: default lub safeguard (sumaryzacja kawałkami dla długich historii). Zobacz Compaction.
  • timeoutSeconds: maksymalna liczba sekund dozwolona dla jednej operacji kompaktowania, zanim OpenClaw ją przerwie. Domyślnie: 900.
  • identifierPolicy: strict (domyślnie), off lub custom. strict poprzedza sumaryzację kompaktowania wbudowanymi wskazówkami zachowania nieprzezroczystych identyfikatorów.
  • 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 kompaktowaniu. Domyślnie ["Session Startup", "Red Lines"]; ustaw [], aby wyłączyć ponowne wstrzykiwanie. Gdy nieustawione lub ustawione jawnie na tę domyślną parę, starsze nagłówki Every Session/Safety są również akceptowane jako zapasowa zgodność.
  • model: opcjonalne nadpisanie provider/model-id tylko dla sumaryzacji kompaktowania. Użyj tego, gdy główna sesja powinna pozostać przy jednym modelu, ale podsumowania kompaktowania powinny działać na innym; gdy nieustawione, kompaktowanie używa modelu głównego sesji.
  • notifyUser: gdy true, wysyła użytkownikowi krótkie powiadomienie, gdy rozpoczyna się kompaktowanie (na przykład „Compacting context…”). Domyślnie wyłączone, aby kompaktowanie pozostało ciche.
  • memoryFlush: cicha agentska tura przed automatycznym kompaktowaniem w celu zapisania trwałych wspomnień. Pomijana, 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 na dysku.
{
  agents: {
    defaults: {
      contextPruning: {
        mode: "cache-ttl", // off | cache-ttl
        ttl: "1h", // czas trwania (ms/s/m/h), domyślna jednostka: minuty
        keepLastAssistants: 3,
        softTrimRatio: 0.3,
        hardClearRatio: 0.5,
        minPrunableToolChars: 50000,
        softTrim: { maxChars: 4000, headChars: 1500, tailChars: 1500 },
        hardClear: { enabled: true, placeholder: "[Treść starego wyniku narzędzia wyczyszczona]" },
        tools: { deny: ["browser", "canvas"] },
      },
    },
  },
}
  • mode: "cache-ttl" włącza przebiegi przycinania.
  • ttl kontroluje, jak często przycinanie może zostać uruchomione ponownie (po ostatnim dotknięciu cache).
  • Przycinanie najpierw miękko obcina zbyt duże wyniki narzędzi, a następnie w razie potrzeby twardo czyści starsze wyniki narzędzi.
Soft-trim zachowuje początek i koniec, a pośrodku wstawia ....Hard-clear zastępuje cały wynik narzędzia placeholderem.Uwagi:
  • Bloki obrazów nigdy nie są przycinane/czyszczone.
  • Współczynniki są oparte na znakach (przybliżenie), a nie na dokładnej liczbie tokenów.
  • Jeśli istnieje mniej niż keepLastAssistants wiadomości assistant, przycinanie jest pomijane.
Szczegóły zachowania: Session Pruning.

Block streaming

{
  agents: {
    defaults: {
      blockStreamingDefault: "off", // on | off
      blockStreamingBreak: "text_end", // text_end | message_end
      blockStreamingChunk: { minChars: 800, maxChars: 1200 },
      blockStreamingCoalesce: { idleMs: 1000 },
      humanDelay: { mode: "natural" }, // off | natural | custom (użyj minMs/maxMs)
    },
  },
}
  • Kanały inne niż Telegram wymagają jawnego *.blockStreaming: true, aby włączyć odpowiedzi blokowe.
  • Nadpisania kanałów: 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 chunkingu: Streaming.

Wskaźniki pisania

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

agents.defaults.sandbox

Opcjonalne sandboxowanie dla wbudowanego agenta. Pełny przewodnik: 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",
          // SecretRef i zawartość inline również są obsługiwane:
          // 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: lokalne środowisko Docker (domyślnie)
  • ssh: generyczne zdalne środowisko oparte na SSH
  • openshell: środowisko OpenShell
Gdy wybrano backend: "openshell", ustawienia specyficzne dla środowiska uruchomieniowego przenoszą się 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 podczas uruchomienia
  • strictHostKeyChecking / updateHostKeys: kontrolki zasad kluczy 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 aktywnego snapshotu środowiska sekretów przed rozpoczęciem sesji sandbox
Zachowanie backendu SSH:
  • zasiewa zdalny workspace raz po create lub recreate
  • następnie utrzymuje zdalny workspace SSH jako kanoniczny
  • kieruje exec, narzędzia plikowe i ścieżki mediów przez SSH
  • nie synchronizuje automatycznie zmian zdalnych z powrotem do hosta
  • nie obsługuje kontenerów przeglądarki w sandboxie
Dostęp do workspace:
  • none: workspace sandbox per zakres w ~/.openclaw/sandboxes
  • ro: workspace sandbox w /workspace, workspace agenta montowany tylko do odczytu w /agent
  • rw: workspace agenta montowany do odczytu/zapisu w /workspace
Zakres:
  • session: kontener + workspace per sesja
  • agent: jeden kontener + workspace na agenta (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", // opcjonalnie
          gatewayEndpoint: "https://lab.example", // opcjonalnie
          policy: "strict", // opcjonalny identyfikator polityki OpenShell
          providers: ["openai"], // opcjonalnie
          autoProviders: true,
          timeoutSeconds: 120,
        },
      },
    },
  },
}
Tryb OpenShell:
  • mirror: zasiewa zdalne środowisko z lokalnego przed exec, synchronizuje z powrotem po exec; lokalny workspace pozostaje kanoniczny
  • remote: zasiewa zdalne środowisko raz podczas tworzenia sandbox, a następnie utrzymuje zdalny workspace jako kanoniczny
W trybie remote lokalne edycje hosta wykonane poza OpenClaw nie są automatycznie synchronizowane do sandbox po kroku zasiewania. Transport odbywa się przez SSH do sandbox OpenShell, ale plugin zarządza cyklem życia sandbox i opcjonalną synchronizacją mirror.setupCommand uruchamia się raz po utworzeniu kontenera (przez sh -lc). Wymaga dostępu do sieci, zapisywalnego systemu root 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 (break-glass).Załączniki przychodzące są umieszczane w media/inbound/* w aktywnym workspace.docker.binds montuje dodatkowe katalogi hosta; globalne i per-agent bindy są scalane.Przeglądarka w sandboxie (sandbox.browser.enabled): Chromium + CDP w kontenerze. URL noVNC jest wstrzykiwany do system promptu. 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-u).
  • allowHostControl: false (domyślnie) blokuje sesjom sandbox targetowanie 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 wejście CDP na granicy kontenera do zakresu CIDR (na przykład 172.21.0.1/32).
  • sandbox.browser.binds montuje dodatkowe katalogi hosta tylko do kontenera przeglądarki sandbox. Gdy jest ustawione (w tym []), zastępuje docker.binds dla kontenera przeglądarki.
  • Domyślne opcje uruchamiania są zdefiniowane w scripts/sandbox-browser-entrypoint.sh i dostrojone do hostów kontenerowych:
    • --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.
    • plus --no-sandbox i --disable-setuid-sandbox, gdy noSandbox jest włączone.
    • Wartości domyślne stanowią bazę obrazu kontenera; użyj niestandardowego obrazu przeglądarki z własnym entrypointem, aby zmienić domyślne ustawienia kontenera.
Sandboxowanie przeglądarki i sandbox.docker.binds są obecnie dostępne tylko dla Docker. Budowanie obrazów:
scripts/sandbox-setup.sh           # główny obraz sandbox
scripts/sandbox-browser-setup.sh   # opcjonalny obraz przeglądarki

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", // lub { primary, fallbacks }
        thinkingDefault: "high", // nadpisanie poziomu thinking per agent
        reasoningDefault: "on", // nadpisanie widoczności reasoning per agent
        fastModeDefault: false, // nadpisanie fast mode per agent
        params: { cacheRetention: "none" }, // nadpisuje kluczem pasujące defaults.models params
        skills: ["docs-search"], // zastępuje agents.defaults.skills, gdy ustawione
        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 ustawiono wiele, wygrywa pierwszy (zapisywane jest ostrzeżenie). Jeśli żaden nie jest ustawiony, domyślny jest pierwszy wpis listy.
  • model: forma string nadpisuje tylko primary; forma obiektowa { 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 nad wybranym wpisem modelu w agents.defaults.models. Używaj 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ęte, 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 ustawiono nadpisania per wiadomość lub per sesję.
  • reasoningDefault: opcjonalna domyślna widoczność reasoning per agent (on | off | stream). Ma zastosowanie, gdy nie ustawiono nadpisania reasoning per wiadomość lub per sesję.
  • fastModeDefault: opcjonalna domyślna wartość fast mode per agent (true | false). Ma zastosowanie, gdy nie ustawiono fast mode per wiadomość lub per sesję.
  • runtime: opcjonalny deskryptor środowiska uruchomieniowego per agent. Użyj type: "acp" z wartościami domyślnymi runtime.acp (agent, backend, mode, cwd), gdy agent ma domyślnie używać sesji harness ACP.
  • identity.avatar: ścieżka względna względem 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).
  • Guard dziedziczenia sandbox: 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 wielu 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 powiązania

  • type (opcjonalne): route dla normalnego 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; specyficzne dla kanału)
  • acp (opcjonalne; tylko dla type: "acp"): { mode, label, cwd, backend }
Deterministyczna kolejność dopasowań:
  1. match.peer
  2. match.guildId
  3. match.teamId
  4. match.accountId (dokładne, bez peer/guild/team)
  5. match.accountId: "*" (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 wią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 pierwszeństwa: 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, // pomiń fork wątku nadrzędnego powyżej tej liczby tokenów (0 wyłącza)
    maintenance: {
      mode: "warn", // warn | enforce
      pruneAfter: "30d",
      maxEntries: 500,
      rotateBytes: "10mb",
      resetArchiveRetention: "30d", // czas trwania lub false
      maxDiskBytes: "500mb", // opcjonalny sztywny budżet
      highWaterBytes: "400mb", // opcjonalny cel czyszczenia
    },
    threadBindings: {
      enabled: true,
      idleHours: 24, // domyślne automatyczne odfokusowanie po bezczynności w godzinach (`0` wyłącza)
      maxAgeHours: 0, // domyślny sztywny maksymalny wiek w godzinach (`0` wyłącza)
    },
    mainKey: "main", // starsze (środowisko uruchomieniowe zawsze używa "main")
    agentToAgent: { maxPingPongTurns: 5 },
    sendPolicy: {
      rules: [{ action: "deny", match: { channel: "discord", chatType: "group" } }],
      default: "allow",
    },
  },
}
  • scope: bazowa strategia grupowania sesji dla kontekstów czatu grupowego.
    • per-sender (domyślnie): każdy nadawca dostaje izolowaną sesję w kontekście kanału.
    • global: wszyscy uczestnicy w kontekście kanału współdzielą jedną sesję (używaj tylko wtedy, gdy zamierzony jest współdzielony kontekst).
  • dmScope: sposób grupowania DM.
    • main: wszystkie DM współdzielą sesję główną.
    • 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 wielokontowości).
  • identityLinks: mapuje kanoniczne identyfikatory do peerów z prefiksem dostawcy dla współdzielenia sesji między kanałami.
  • reset: główna zasada resetu. daily resetuje o atHour czasu lokalnego; idle resetuje po idleMinutes. Gdy skonfigurowano oba, wygrywa to, co wygaśnie wcześniej.
  • resetByType: nadpisania per typ (direct, group, thread). Starsze dm akceptowane jako alias dla direct.
  • parentForkMaxTokens: maksymalna liczba totalTokens w sesji nadrzędnej dozwolona przy tworzeniu sforkowanej sesji wątku (domyślnie 100000).
    • Jeśli totalTokens rodzica przekracza tę wartość, OpenClaw rozpoczyna nową sesję wątku zamiast dziedziczyć historię transkryptu rodzica.
    • Ustaw 0, aby wyłączyć tę ochronę i zawsze zezwalać na forking od rodzica.
  • mainKey: pole starsze. Środowisko uruchomieniowe zawsze używa teraz "main" dla głównego bucketu 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ńcuchy ping-pong.
  • sendPolicy: dopasowuje po channel, chatType (direct|group|channel, ze starszym aliasem dm), keyPrefix lub rawKeyPrefix. Pierwsze deny wygrywa.
  • maintenance: kontrolki czyszczenia magazynu sesji i 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: obraca sessions.json, gdy przekroczy ten rozmiar (domyślnie 10mb).
    • resetArchiveRetention: retencja dla archiwów transkryptów *.reset.<timestamp>. Domyślnie pruneAfter; ustaw false, aby wyłączyć.
    • maxDiskBytes: opcjonalny budżet dyskowy katalogu sesji. W trybie warn zapisuje ostrzeżenia; w trybie enforce usuwa najstarsze artefakty/sesje jako pierwsze.
    • highWaterBytes: opcjonalny cel po czyszczeniu budżetu. Domyślnie 80% wartości maxDiskBytes.
  • threadBindings: globalne wartości domyślne dla funkcji sesji powiązanych z wątkami.
    • enabled: główny przełącznik domyślny (dostawcy mogą nadpisać; Discord używa channels.discord.threadBindings.enabled)
    • idleHours: domyślne automatyczne odfokusowanie po bezczynności w godzinach (0 wyłącza; dostawcy mogą nadpisać)
    • maxAgeHours: domyślny sztywny maksymalny wiek w godzinach (0 wyłącza; dostawcy mogą nadpisać)

Wiadomości

{
  messages: {
    responsePrefix: "🦞", // lub "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 wyłącza
      byChannel: {
        whatsapp: 5000,
        slack: 1500,
      },
    },
  },
}

Prefiks odpowiedzi

Nadpisania per kanał/konto: channels.<channel>.responsePrefix, channels.<channel>.accounts.<id>.responsePrefix. Rozstrzyganie (najbardziej szczegółowe wygrywa): 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ść rozstrzygania: konto → kanał → messages.ackReaction → wartość zapasowa z identity.
  • 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 aktywne są reakcje ack. W Telegram ustaw to jawnie na true, aby włączyć reakcje statusu cyklu życia.

Debounce przychodzących

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

TTS (text-to-speech)

{
  messages: {
    tts: {
      auto: "always", // off | always | inbound | tagged
      mode: "final", // final | all
      provider: "elevenlabs",
      summaryModel: "openai/gpt-4.1-mini",
      modelOverrides: { enabled: true },
      maxTextLength: 4000,
      timeoutMs: 30000,
      prefsPath: "~/.openclaw/settings/tts.json",
      elevenlabs: {
        apiKey: "elevenlabs_api_key",
        baseUrl: "https://api.elevenlabs.io",
        voiceId: "voice_id",
        modelId: "eleven_multilingual_v2",
        seed: 42,
        applyTextNormalization: "auto",
        languageCode: "en",
        voiceSettings: {
          stability: 0.5,
          similarityBoost: 0.75,
          style: 0.0,
          useSpeakerBoost: true,
          speed: 1.0,
        },
      },
      openai: {
        apiKey: "openai_api_key",
        baseUrl: "https://api.openai.com/v1",
        model: "gpt-4o-mini-tts",
        voice: "alloy",
      },
    },
  },
}
  • auto kontroluje auto-TTS. /tts off|always|inbound|tagged nadpisuje per sesję.
  • summaryModel nadpisuje agents.defaults.model.primary dla automatycznego podsumowania.
  • modelOverrides jest domyślnie włączone; modelOverrides.allowProvider domyślnie ma wartość false (opt-in).
  • Klucze API wracają do ELEVENLABS_API_KEY/XI_API_KEY oraz OPENAI_API_KEY.
  • openai.baseUrl nadpisuje endpoint OpenAI TTS. Kolejność rozstrzygania to config, potem OPENAI_TTS_BASE_URL, a następnie https://api.openai.com/v1.
  • Gdy openai.baseUrl wskazuje endpoint inny niż OpenAI, OpenClaw traktuje go jako serwer TTS zgodny z OpenAI i łagodzi walidację modelu/głosu.

Talk

Domyślne ustawienia 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 wracają do ELEVENLABS_VOICE_ID lub SAG_VOICE_ID.
  • providers.*.apiKey akceptuje jawne stringi 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 przed wysłaniem transkryptu. Brak ustawienia zachowuje domyślne okno pauzy platformy (700 ms na macOS i Android, 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 brak ustawienia (istniejące jawne profile są zachowywane).
ProfilZawiera
minimalTylko session_status
codinggroup:fs, group:runtime, group:web, group:sessions, group:memory, cron, image, image_generate
messaginggroup:messaging, sessions_list, sessions_history, sessions_send, session_status
fullBez ograniczeń (tak samo jak brak ustawienia)

Grupy narzędzi

GrupaNarzędzia
group:runtimeexec, process, code_execution (bash jest akceptowane jako alias dla 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, tts
group:openclawWszystkie wbudowane narzędzia (bez pluginów dostawców)

tools.allow / tools.deny

Globalna polityka allow/deny dla narzędzi (deny wygrywa). Bez rozróżniania wielkości liter, obsługuje wildcardy *. Stosowana nawet wtedy, gdy sandbox Docker jest wyłączony.
{
  tools: { deny: ["browser", "canvas"] },
}

tools.byProvider

Dalsze ograniczanie narzędzi 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

Kontroluje elevated доступ do 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 sandbox i używa skonfigurowanej ścieżki wyjścia (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 włączyć wykrywanie. Ustawienia można definiować 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 zachowywana do analizy pętli.
  • warningThreshold: próg ostrzeżeń dla powtarzających się wzorców bez postępu.
  • criticalThreshold: wyższy próg blokowania krytycznych pętli.
  • globalCircuitBreakerThreshold: próg twardego zatrzymania dla każdego przebiegu bez postępu.
  • detectors.genericRepeat: ostrzegaj przy powtarzających się wywołaniach tego samego narzędzia z tymi samymi argumentami.
  • detectors.knownPollNoProgress: ostrzegaj/blokuj przy znanych narzędziach poll (process.poll, command_status itp.).
  • detectors.pingPong: ostrzegaj/blokuj przy naprzemiennych parach wzorców bez postępu.
  • Jeśli warningThreshold >= criticalThreshold lub criticalThreshold >= globalCircuitBreakerThreshold, walidacja kończy się niepowodzeniem.

tools.web

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

tools.media

Konfiguruje rozumienie mediów przychodzących (obraz/audio/wideo):
{
  tools: {
    media: {
      concurrency: 2,
      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 z 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 następnego wpisu.
Uwierzytelnianie dostawcy podlega standardowej kolejności: auth-profiles.json → zmienne env → models.providers.*.apiKey.

tools.agentToAgent

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

tools.sessions

Kontroluje, które sesje mogą być celem narzędzi sesji (sessions_list, sessions_history, sessions_send). Domyślnie: tree (bieżąca sesja + sesje utworzone z niej, 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 uruchamiasz sesje per nadawca pod tym samym identyfikatorem agenta).
  • all: dowolna sesja. Targetowanie między agentami nadal wymaga tools.agentToAgent.
  • Ograniczenie sandbox: 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: ustaw true, aby zezwolić na załączniki plikowe inline
        maxTotalBytes: 5242880, // 5 MB łącznie dla wszystkich plików
        maxFiles: 50,
        maxFileBytes: 1048576, // 1 MB na plik
        retainOnSessionKeep: false, // zachowaj załączniki, gdy cleanup="keep"
      },
    },
  },
}
Uwagi:
  • Załączniki są obsługiwane tylko dla runtime: "subagent". Środowisko ACP je odrzuca.
  • Pliki są materializowane w workspace dziecka w .openclaw/attachments/<uuid>/ z plikiem .manifest.json.
  • Zawartość załączników jest automatycznie redagowana przy zapisie transkryptu.
  • Wejścia base64 są walidowane przy użyciu ścisłych kontroli alfabetu/paddingu i ochrony rozmiaru przed dekodowaniem.
  • Uprawnienia plików to 0700 dla katalogów i 0600 dla plików.
  • Czyszczenie podąża za zasadą cleanup: delete zawsze usuwa załączniki; keep zachowuje je tylko wtedy, gdy retainOnSessionKeep: true.

tools.experimental

Eksperymentalne flagi wbudowanych narzędzi. Domyślnie wyłączone, chyba że zastosowanie ma reguła auto-enable specyficzna dla środowiska uruchomieniowego.
{
  tools: {
    experimental: {
      planTool: true, // włącz eksperymentalne update_plan
    },
  },
}
Uwagi:
  • planTool: włącza strukturalne narzędzie update_plan do śledzenia nietrywialnych prac wieloetapowych.
  • Domyślnie: false dla dostawców innych niż OpenAI. Przebiegi OpenAI i OpenAI Codex włączają je automatycznie.
  • Gdy włączone, system prompt dodaje też wskazówki użycia, aby model korzystał z niego tylko przy znaczącej 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 docelowych identyfikatorów agentów dla sessions_spawn, gdy agent żądający nie ustawia własnego subagents.allowAgents (["*"] = dowolny; domyślnie: tylko ten sam agent).
  • runTimeoutSeconds: domyślny timeout (sekundy) dla sessions_spawn, gdy wywołanie narzędzia pomija runTimeoutSeconds. 0 oznacza brak timeoutu.
  • Polityka narzędzi per subagent: tools.subagents.tools.allow / tools.subagents.tools.deny.

Niestandardowi dostawcy i base URL

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 (domyślnie) | 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 w models.json agenta wygrywają.
    • Niepuste wartości apiKey agenta wygrywają tylko wtedy, gdy ten dostawca nie jest zarządzany przez SecretRef w bieżącym kontekście konfiguracji/profilu uwierzytelniania.
    • Wartości apiKey dostawców zarządzanych przez SecretRef są odświeżane na podstawie znaczników źródła (ENV_VAR_NAME dla referencji env, secretref-managed dla referencji file/exec) zamiast utrwalania rozwiązanych sekretów.
    • Wartości nagłówków dostawców zarządzanych przez SecretRef są odświeżane na podstawie znaczników źródła (secretref-env:ENV_VAR_NAME dla referencji env, secretref-managed dla referencji file/exec).
    • Puste lub brakujące apiKey/baseUrl agenta wracają do models.providers w konfiguracji.
    • Dla pasujących modeli contextWindow/maxTokens używają wyższej wartości spośród jawnej konfiguracji i niejawnych wartości katalogowych.
    • Dla pasujących modeli contextTokens zachowuje jawny limit środowiska uruchomieniowego, jeśli 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 przepisała models.json.
    • Utrwalanie znaczników jest źródłowo-autorytatywne: znaczniki są zapisywane z aktywnego snapshotu konfiguracji źródłowej (przed rozwiązaniem), a nie z rozwiązanych wartości sekretów środowiska uruchomieniowego.

Szczegóły pól dostawcy

  • models.mode: zachowanie katalogu dostawców (merge lub replace).
  • models.providers: mapa niestandardowych dostawców kluczowana po identyfikatorze dostawcy.
  • models.providers.*.api: adapter żądań (openai-completions, openai-responses, anthropic-messages, google-generative-ai itd.).
  • models.providers.*.apiKey: poświadczenie dostawcy (preferuj SecretRef/zastępowanie env).
  • models.providers.*.auth: strategia uwierzytelniania (api-key, token, oauth, aws-sdk).
  • models.providers.*.injectNumCtxForOpenAICompat: dla Ollama + openai-completions, wstrzykuj options.num_ctx do żądań (domyślnie: true).
  • models.providers.*.authHeader: wymuś transport poświadczeń w nagłówku Authorization, gdy to wymagane.
  • models.providers.*.baseUrl: bazowy URL upstream API.
  • models.providers.*.headers: dodatkowe statyczne nagłówki dla routingu proxy/tenant.
  • models.providers.*.request: nadpisania transportu dla żądań HTTP dostawcy modeli.
    • request.headers: dodatkowe nagłówki (scalane z domyślnymi nagłówkami 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 env 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.
  • models.providers.*.models: jawne wpisy katalogu modeli dostawcy.
  • models.providers.*.models.*.contextWindow: metadane natywnego okna kontekstu modelu.
  • models.providers.*.models.*.contextTokens: opcjonalny limit kontekstu środowiska uruchomieniowego. Użyj tego, gdy chcesz mniejszego efektywnego budżetu kontekstu niż natywne contextWindow modelu.
  • models.providers.*.models.*.compat.supportsDeveloperRole: opcjonalna wskazówka zgodności. Dla api: "openai-completions" z niepustym, nienatywnym baseUrl (host inny niż api.openai.com), OpenClaw wymusza to na false w środowisku uruchomieniowym. Puste/pominięte baseUrl zachowuje domyślne zachowanie OpenAI.
  • plugins.entries.amazon-bedrock.config.discovery: główny katalog ustawień auto-discovery Bedrock.
  • plugins.entries.amazon-bedrock.config.discovery.enabled: włącz/wyłącz niejawne discovery.
  • plugins.entries.amazon-bedrock.config.discovery.region: region AWS dla discovery.
  • plugins.entries.amazon-bedrock.config.discovery.providerFilter: opcjonalny filtr identyfikatorów dostawców dla ukierunkowanego discovery.
  • plugins.entries.amazon-bedrock.config.discovery.refreshInterval: interwał odświeżania polling discovery.
  • 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 endpoint: https://api.z.ai/api/paas/v4
  • Endpoint coding (domyślnie): https://api.z.ai/api/coding/paas/v4
  • Dla ogólnego endpointu 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 endpointu China: baseUrl: "https://api.moonshot.cn/v1" lub openclaw onboard --auth-choice moonshot-api-key-cn.Natywne endpointy Moonshot deklarują zgodność użycia strumieniowania na współdzielonym transporcie openai-completions, a OpenClaw ustala to teraz na podstawie możliwości endpointu, a nie tylko wbudowanego identyfikatora dostawcy.
{
  env: { KIMI_API_KEY: "sk-..." },
  agents: {
    defaults: {
      model: { primary: "kimi/kimi-code" },
      models: { "kimi/kimi-code": { alias: "Kimi Code" } },
    },
  },
}
Zgodny z Anthropic, wbudowany dostawca. 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 sam je dopisuje). 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 teraz 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: uruchom duży model lokalny przez LM Studio Responses API na mocnym sprzęcie; zachowaj hostowane modele scalone jako fallback.

Skills

{
  skills: {
    allowBundled: ["gemini", "peekaboo"],
    load: {
      extraDirs: ["~/Projects/agent-scripts/skills"],
    },
    install: {
      preferBrew: true,
      nodeManager: "npm", // npm | pnpm | yarn | bun
    },
    entries: {
      "image-lab": {
        apiKey: { source: "env", provider: "default", id: "GEMINI_API_KEY" }, // lub jawny string
        env: { GEMINI_API_KEY: "GEMINI_KEY_HERE" },
      },
      peekaboo: { enabled: true },
      sag: { enabled: false },
    },
  },
}
  • allowBundled: opcjonalna lista dozwolonych tylko dla dołączonych Skills (zarządzane/workspace Skills pozostają bez wpływu).
  • 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 wróci do innych typó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 dołączony/zainstalowany.
  • entries.<skillKey>.apiKey: pole wygody dla Skills deklarujących podstawową zmienną env (jawny string 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.
  • Discovery akceptuje natywne plugins OpenClaw oraz zgodne bundy Codex i Claude, w tym bundle Claude w domyślnym układzie bez manifestu.
  • Zmiany konfiguracji wymagają restartu gateway.
  • allow: opcjonalna lista dozwolonych (ładują się tylko wymienione plugins). deny wygrywa.
  • plugins.entries.<id>.apiKey: wygodne pole klucza API na poziomie pluginu (gdy wspierane przez plugin).
  • plugins.entries.<id>.env: mapa zmiennych env o zakresie pluginu.
  • plugins.entries.<id>.hooks.allowPromptInjection: gdy false, rdzeń blokuje before_prompt_build i ignoruje pola mutujące prompt ze starszego before_agent_start, zachowując starsze modelOverride i providerOverride. Dotyczy natywnych hooków pluginów i wspieranych katalogów hooków dostarczanych przez bundle.
  • plugins.entries.<id>.subagent.allowModelOverride: jawnie ufa temu pluginowi, że może żądać nadpisań provider i model dla uruchomień subagentów w tle.
  • plugins.entries.<id>.subagent.allowedModels: opcjonalna lista dozwolonych kanonicznych celów provider/model dla zaufanych nadpisań subagentów. Używaj "*", tylko gdy świadomie chcesz zezwolić na dowolny model.
  • plugins.entries.<id>.config: obiekt konfiguracji zdefiniowany przez plugin (walidowany przez natywny schemat pluginu OpenClaw, jeśli dostępny).
  • plugins.entries.firecrawl.config.webFetch: ustawienia dostawcy web-fetch Firecrawl.
    • apiKey: klucz API Firecrawl (akceptuje SecretRef). Wraca do plugins.entries.firecrawl.config.webSearch.apiKey, starszego tools.web.fetch.firecrawl.apiKey lub zmiennej env FIRECRAWL_API_KEY.
    • baseUrl: bazowy URL API Firecrawl (domyślnie: https://api.firecrawl.dev).
    • onlyMainContent: wyciągaj tylko główną treść stron (domyślnie: true).
    • maxAgeMs: maksymalny wiek cache w milisekundach (domyślnie: 172800000 / 2 dni).
    • timeoutSeconds: timeout żądania scrape w sekundach (domyślnie: 60).
  • plugins.entries.xai.config.xSearch: ustawienia xAI X Search (wyszukiwanie web 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 (eksperymentalne). Zobacz Dreaming, aby poznać tryby i progi.
    • mode: preset częstotliwości dreaming ("off", "core", "rem", "deep"). Domyślnie: "off".
    • cron: opcjonalne nadpisanie wyrażenia cron dla harmonogramu dreaming.
    • timezone: strefa czasowa dla oceny harmonogramu (wraca do agents.defaults.userTimezone).
    • limit: maksymalna liczba kandydatów do promowania na cykl.
    • minScore: minimalny ważony próg wyniku dla promowania.
    • minRecallCount: minimalny próg liczby recall.
    • minUniqueQueries: minimalny próg liczby unikalnych zapytań.
  • Włączone plugins bundle Claude mogą również dostarczać osadzone domyślne ustawienia Pi z settings.json; OpenClaw stosuje je jako oczyszczone ustawienia agenta, a nie jako