Série: Jak jsem si postavil druhý mozek · díl 2
Podrobnosti o OpenClaw jsem si z přednášky na TechEdu odložil na blog. Tady jsou. Projdu svou konfiguraci po částech a pak čtyři věci, které jsem se o OpenClaw naučil až v provozu, protože ty v dokumentaci nenajdete.
Jak je OpenClaw postavený
OpenClaw je open-source běhové prostředí pro AI agenty. Má dvě části a ten rozdíl je důležitější, než vypadá:
- Gateway je dlouho běžící proces. Drží sezení agentů, spojení s modely i kanály, přes které s agenty mluvíte. U mě běží jako systemd služba na pracovní stanici NVIDIA DGX Spark, nonstop.
- CLI (
openclaw agent …) je jen klient. Pošle zadání do gateway a čeká na odpověď. Samotná práce běží v gateway.
Všechno ostatní je jeden soubor: ~/.openclaw/openclaw.json.
Modely: Ollama na stejném stroji, a Claude tam, kde to volím
V konfiguraci mám dva poskytovatele modelů. Ollamu na stejném stroji, se sedmi zaregistrovanými lokálními modely (Gemma 4, několik velikostí Qwenu včetně qwen3-coder-next a další) a modely od společnosti Anthropic.
Dvě nastavení u lokálních modelů stojí za to opsat:
- Kontextové okno nastavujte explicitně (
num_ctxu každého modelu). Výchozí kontext v Ollamě je malý a agent, který čte soubory, ho vyčerpá rychle. U svých modelů mám 64 až 256 tisíc tokenů. - Timeouty dejte velkoryse. Lokální 35B model není cloudové API: jeden krok může trvat minuty. Model má u mě 10 minut na odpověď a agent 29 minut na celý „tah“.
Výchozí model pro všechny agenty je ale Claude Opus, spuštěný přes běhové prostředí claude-cli s vysokou úrovní přemýšlení. Lokální model musí mít agent napsaný u sebe.
Tohle je potřeba říct otevřeně, protože na konferenci TechEd jsem říkal, že „žádná data neopustí stroj". Pro svůj osobní systém jsem vědomě zvolil cloudový model Claude. Odpovídá výrazně lépe a vím, že tím obětuji kus soukromí: co mu napíšu, odchází na servery Anthropicu. Agenti, kteří pracují sami s veřejnými daty, běží dál jen na lokálních modelech. Ta věta z konference tedy platí pro konkrétní agenty, ne pro stroj. Rozhodněte si tuhle hranici předem.
Agenti: devět definovaných, pět v provozu
Agent je v OpenClaw tři věci: pracovní složka, vlastní adresář se stavem a model. V konfiguraci jich mám devět, ale hlavních je těchto pět:
- Osobní asistent (
main) na Claude. - Čtyři autonomní agenti na Qwenu, kteří nonstop sbírají data pro projekt Transparence, mapu vlivu v Česku z veřejných zdrojů. Nikdo s nimi nemluví; jejich běhy spouští plánovač a fronta práce.
Sandbox: hranice v konfiguraci, ne v promptu
Agent, který pracuje sám, musí mít hranice, které nedrží v promptu. OpenClaw na to má sandbox a já ho u všech čtyř autonomních agentů zapínám naplno:
- Každý agent ve vlastním Docker kontejneru (
sandbox.mode: all,scope: agent). - Všechna Linuxová oprávnění odebraná (
capDrop: ALL), limit 512 procesů a 8 GB paměti. - Repozitář připojený pro zápis, ale jeho složka
.gitjen pro čtení. Agent může měnit soubory, ale nemůže nic zapsat do historie. Commit dělá kód mimo kontejner, až zkontroluje, co se změnilo. - Zakázané skupiny nástrojů (
tools.deny): posílání zpráv, UI, média, ovládání zařízení a spouštění dalších agentů. Autonomní agent nemá komu psát a nemůže si přivolat pomocníka.
A jeden méně zjevný trik: v bloku env nastavuji gitu jinou identitu odesílatele. Každý příkaz, který agent spustí, ji zdědí, takže kdyby se agentovi přece jen podařilo commitnout, je to na první pohled poznat a dá se to vrátit. Tohle nevzniklo z opatrnosti — agenti to v červnu opravdu dělali.
Kanály a gateway: kdo s agenty smí mluvit
- Hlavní bot na Telegramu v režimu pairing: neznámý odesílatel musí být spárovaný, než mu bot odpoví. Skupiny jen ze seznamu.
- WhatsApp jen z jednoho čísla, mého.
Kdo projde, dostane vlastní sezení — v každém kanálu zvlášť (session.dmScope: per-channel-peer), takže se konverzace různých lidí nemíchají.
Gateway poslouchá jen na localhostu a chce token. Ovládací panel povoluje jedinou adresu, a ta je v mé privátní síti Tailscale. A pro nody — zařízení spárovaná s gateway, typicky telefon nebo Mac s aplikací OpenClaw — mám zakázané příkazy, které by agent neměl umět ani omylem: fotit kamerou, nahrávat obrazovku, posílat SMS a přidávat kontakty, události do kalendáře nebo připomínky.
Skilly: vypnout víc, než zapnout
Skill je v OpenClaw návod v Markdownu, jak použít nějaký nástroj. Čtyřicet vestavěných, které nepotřebuji, mám vypnutých: Slack, Notion, Spotify, 1Password, Apple Notes a další. Každý zapnutý skill je schopnost, kterou agent má, i když ji zrovna nepotřebuje.
Pro Google Workspace mám sadu skillů na poštu, kalendář, dokumenty a tabulky. Ty jdou úplně jinou cestou než nody: přes Google přímo ze Sparku. Zákaz přidávat události do kalendáře na nodech na ně nedosáhne. A protože skill je jen text, u skillu, který zapisuje do kalendáře, je jedinou pojistkou řádek s upozorněním. Pojistka, kterou model může přečíst a přehlédnout, není pojistka. Skutečná hranice musí být jinde: v zakázaných skupinách nástrojů a v sandboxu, které model obejít nemůže.
Čtyři věci, které jsem se naučil v provozu
1. Když vyprší timeout, práce nekončí. CLI je jen klient, model běží v gateway. Když jsem při timeoutu ukončil CLI, generování v gateway běželo dál a drželo grafickou kartu. Další běh pak dostal méně výkonu, taky vypršel, a tak dál: 22. června takhle čtyři hodiny po sobě skončil každý běh na limitu a nevzniklo nic. ollama stop nepomohl (čeká, až dotaz doběhne) a OpenClaw nemá příkaz pro zrušení běžícího tahu. Jediné, co generování spolehlivě zastaví, je zavřít spojení, ze kterého přišel dotaz. Takže po timeoutu restartuji gateway.
2. Sandbox nevidí, co vidí shell. Nástroj na čtení souborů je v sandboxu uzamčený do pracovní složky agenta a připojený repozitář nevidí, i když příkazy v shellu ano. Agenti zkoušeli cesty typu ../, a za tři dny jsem napočítal 734 neúspěšných čtení. Oprava: před každým během zkopírovat agentovi do pracovní složky dokumenty, které má číst.
3. Bez vlastního ID sezení se běhy sčítají. Když openclaw agent nedostane --session-id, OpenClaw připíše tah do dlouhodobého hlavního sezení agenta. Každý další běh pak zdědí celý přepis všech předchozích: zadání, volání nástrojů i jejich výstupy. Kontext roste, dokud nenarazí na okno modelu a nevynutí kompaktaci uprostřed práce, každý běh znovu zpracovává celou nahromaděnou historii (hlavní důvod pomalých běhů) a kontext jedné úlohy prosakuje do další. Proto každý automatický běh dostává nové ID sezení. Paměť, na které záleží, patří do souborů.
4. Zálohujte, ale hlídejte, co zálohujete. OpenClaw má vestavěné openclaw backup create a openclaw backup verify. Pouštím je každý týden a archivy držím mimo repozitář, protože obsahují přihlašovací údaje. Dvě věci jsem zjistil za pochodu: OpenClaw sám nikdy nemaže staré přepisy sezení, takže před zálohou mažu ty, na které se 60 dní nesáhlo. A jeden agent si v červenci zkopíroval do pracovní složky 1,9 GB velkou kopii gitu, a týdenní záloha tím narostla na čtyřnásobek. Všiml jsem si až po pěti dnech.
Proč na něm neběží můj druhý mozek
O mé wiki byl první díl. Na OpenClaw jsem ji zvažoval víckrát a pokaždé skončil u stejného problému.
Když OpenClaw volá Claude přes claude-cli, vypíná projektový soubor s pravidly (CLAUDE.md), hooky i skilly. A ten soubor je celá moje wiki: co se nesmí přepsat, jak se zapisuje čas, kolik smí poradce přečíst. Agent, který ho nevidí, je chytrý cizinec s přístupem k mým souborům. Své AI poradce jsem proto v červenci postavil na Claude Code spuštěném přímo ve složce wiki. V srpnu, když měli začít pracovat i bez dozoru, platil ten důvod ještě víc. O tom jsou další díly.
OpenClaw tedy dělá to, v čem je dobrý: drží kanály, osobního asistenta a autonomní agenty na lokálních modelech, na jednom stroji, za jednou gateway.
Jak začít
- Rozhodněte, který agent smí ven, a napište to do konfigurace. Výchozí model platí pro každého agenta, který nemá vlastní.
- Nastavte
num_ctxa timeouty dřív, než se divíte, proč lokální agent zapomíná a padá. - Autonomní agent dostane sandbox, zakázané skupiny nástrojů a
.gitjen pro čtení. - Zamkněte kanály hned: pairing, seznam povolených čísel, gateway jen na localhostu.
- Počítejte s tím, že CLI není ten, kdo pracuje. Timeout na klientovi nezastaví model v gateway.
- Zálohujte přes
openclaw backupa prořezávejte staré přepisy sezení.
Příště: šest AI poradců a jak s nimi mluvím přes Claude Code.