V minulém díle jsme zprovoznili OpenClaw na vlastním hardware. Agent odpovídá, Tailscale tunel funguje. Ale všechny dotazy putují přes internet do cloudu. Dnes to posuneme dál. Napojíme Claude Code jako kódovacího agenta a nainstalujeme lokální model. Citlivá data pak nikdy neopustí stroj.
Vítejte u 3. dílu seriálu OpenClaw: Kompletní průvodce. Stavíme bezpečnou AI agent infrastrukturu na vlastním hardware, krok za krokem.
V minulém díle jsme zabezpečili macOS, nastavili Docker sandbox a zprovoznili prvního OpenClaw agenta s Claude předplatným. Agent funguje, pamatuje si kontext, odpovídá za dvě sekundy.
Pro většinu použití je cloud model přes předplatné naprosto dostačující. Ale jakmile agent začne pracovat s firemními dokumenty, smlouvami, fakturami nebo klientskými daty, možná budete chtít víc. Ne proto, že by Anthropic nebyl důvěryhodný. Ale proto, že nejbezpečnější data jsou ta, která nikdy neopustí váš hardware.
Tento díl má dvě části. Claude Code — kódovací agent přes předplatné. A lokální model — Qwen3.5 s 35 miliardami parametrů, který se vejde i do Mac Mini s 24 GB paměti. Všechno testuji na Mac Mini.
Dva přístupy: cloud only vs hybridní
Můžete jet čistě přes cloud — Claude Max nebo ChatGPT Pro. Fixní měsíční cena, žádné API klíče, žádné měření tokenů. Pro většinu use cases je to naprosto dostačující.
Ale jakmile chcete privátnost, přidáte lokální model. Hybridní routing. Citlivá data zpracuje lokální model, složité úlohy cloud. Správná odpověď není buď, nebo. Je to routing.
| Typ úlohy | Cloud only | Hybridní |
|---|---|---|
| Citlivá data (smlouvy, finance) | Claude (předplatné) | Lokální model |
| Jednoduchý dotaz, klasifikace | Claude (předplatné) | Lokální model |
| Komplexní analýza, reasoning | Claude (předplatné) | Claude (předplatné) |
| Generování kódu (složité) | Claude (předplatné) | Claude (předplatné) |
| Sumarizace dokumentů | Claude (předplatné) | Lokální model |
Pravidlo pro hybridní režim: cokoliv obsahuje citlivá data, zůstává lokálně. Bez výjimky.
Claude Code na dedikovaném stroji
Claude Code jsme nainstalovali v minulém díle. Běží přes předplatné Claude Max (€90/měs.), veškerý výpočet probíhá v cloudu Anthropic. Teď ho propojíme s lokálním modelem.
Propojení s lokálním modelem
Claude Code podporuje přesměrování na alternativní backend. Stačí dvě environment proměnné.
export ANTHROPIC_BASE_URL="http://127.0.0.1:8001"
export ANTHROPIC_API_KEY="sk-no-key-required"
claude --model qwen3.5-35b-a3b Tím Claude Code místo Anthropic API posílá requesty na lokální llama-server. Klíč je fiktivní, protože lokální server žádnou autentizaci nepotřebuje. Model alias musí odpovídat tomu, co llama-server registruje přes parametr --alias.
Pro trvalé nastavení přidejte proměnné do ~/.zshrc. Ale pozor. Nenastavujte lokální model jako výchozí pro všechno. Chcete mít možnost přepínat mezi lokálním a cloud modelem podle typu úlohy.
Bezpečnostní pravidla pro Claude Code
Claude Code má plný přístup k souborovému systému a může spouštět libovolné shell příkazy. To je obrovská síla a zároveň obrovské riziko. Tři pravidla, která nikdy neporušuji.
Za prvé: nikdy nepoužívejte --dangerously-skip-permissions v produkci. Tento flag vypne všechna potvrzovací dialogová okna. Claude Code pak může mazat soubory, instalovat balíčky a spouštět příkazy bez vašeho vědomí. Pro testování v izolovaném sandboxu to má smysl. Na stroji s reálnými daty nikdy.
Za druhé: pouze vlastní MCP servery. MCP (Model Context Protocol) rozšiřuje Claude Code o externí nástroje. Každý MCP server je potenciální attack surface. Benchmark MCPTox ukázal až 72,8% úspěšnost útoku přes MCP servery (u nejzranitelnějšího modelu o1-mini; průměr přes 20 modelů je 36,5 %). Používejte pouze servery, které jste napsali sami nebo důkladně auditovali.
Za třetí: explicitní allowlist nástrojů. V .claude/settings.json definujte, které nástroje smí Claude Code používat. Všechno ostatní vyžaduje manuální potvrzení.
OpenClaw hooks: audit trail a ochrana
OpenClaw podporuje hooks. Jsou to TypeScript moduly, které se vykonají při konkrétních událostech agenta. Každý hook je adresář se dvěma soubory: HOOK.md (YAML frontmatter definující události) a handler.ts (TypeScript logika).
Hooks se ukládají do ~/.openclaw/hooks/. Příklad hooku pro audit log:
~/.openclaw/hooks/
└── audit-log/
├── HOOK.md
└── handler.ts HOOK.md definuje, na které události hook reaguje:
---
events:
- tool_result_persist
- message:sent
---
Loguje všechny výsledky nástrojů a odeslané zprávy do audit logu. handler.ts obsahuje logiku:
import { writeFileSync, appendFileSync } from "fs";
export default async function handle(event: any) {
const entry = `${new Date().toISOString()} | ${event.type} | ${JSON.stringify(event.data)}\n`;
appendFileSync("/var/log/openclaw/audit.log", entry);
} Dostupné události: message:sent, message:received, tool_result_persist, command:new, command:reset, gateway:startup, agent:bootstrap. Hooks fire přesně jednou per invocation.
Kompilace llama.cpp na Apple Silicon
llama.cpp je open-source inference engine od Georgi Gerganova. Na Apple Silicon využívá Metal framework pro akceleraci na GPU. Kompilace ze zdrojového kódu je jednoduchá a doporučuji ji místo předkompilovaných binárek. Máte kontrolu nad tím, co běží na vašem stroji.
git clone https://github.com/ggml-org/llama.cpp
cmake llama.cpp -B llama.cpp/build \
-DBUILD_SHARED_LIBS=OFF -DGGML_METAL=ON
cmake --build llama.cpp/build --config Release -j --clean-first \
--target llama-cli llama-mtmd-cli llama-server llama-gguf-split
cp llama.cpp/build/bin/llama-* llama.cpp/ Flag -DGGML_METAL=ON zapíná GPU akceleraci. Na M4 Max s 40jádrovým GPU je to zásadní rozdíl. Bez Metal běží inference na CPU a generování je pětkrát pomalejší.
Po kompilaci ověřte, že Metal funguje.
./llama.cpp/llama-cli --model test.gguf --n-gpu-layers 99 -p "Hello" -n 10 V logu hledejte řádek ggml_metal_init: found device: Apple M4 Max. Pokud tam je, GPU akcelerace funguje.
Proč zrovna Qwen3.5-35B-A3B
Než stáhneme model, vysvětlím proč zrovna tento. Na HuggingFace jsou stovky modelů. Potřebuji takový, který splní čtyři podmínky: vejde se do 24 GB paměti na Mac Mini, zvládne function calling pro agentní workflow, má dostatečně velký kontext a běží dostatečně rychle na Apple Silicon.
Qwen3.5-35B-A3B od Alibaba Cloud splňuje všechny čtyři. Je to MoE model (Mixture of Experts) s 35 miliardami parametrů, z nichž jsou při každé inference aktivní pouze 3 miliardy. To znamená rychlost malého modelu s kvalitou velkého. V kvantizaci UD-Q3_K_XL zabírá přibližně 15,8 GB. Na Mac Mini s 24 GB se vejde i s prostorem pro kontext.
Klíčové je, že model zvládne agentní úlohy. Function calling, tool use, práce s kódem. To je přesně co potřebujeme pro OpenClaw agenta, který volá nástroje, čte soubory a reaguje na výsledky.
Model je kompatibilní s Claude Code přes llama-server rovnou z krabice.
Stažení modelu: bezpečně
V prvním díle seriálu jsem popsal pravidla pro bezpečné stahování modelů. Teď je aplikujeme v praxi.
Stahujeme od Unsloth, ověřeného publishera GGUF kvantizací. Kvantizaci volím UD-Q3_K_XL, která zabírá přibližně 15,8 GB. Na Mac Mini s 24 GB zbývá dostatek paměti pro kontext a další služby.
import os
os.environ["HF_HUB_ENABLE_HF_TRANSFER"] = "1"
from huggingface_hub import snapshot_download
snapshot_download(
repo_id="unsloth/Qwen3.5-35B-A3B-GGUF",
local_dir="unsloth/Qwen3.5-35B-A3B-GGUF",
allow_patterns=["*UD-Q3_K_XL*"],
) Bezpečnostní audit staženého modelu
Po stažení provedeme tři kontroly z našeho checklistu z prvního dílu.
Kontrola formátu. Soubor musí být .gguf. Nikdy nestahujte .pt, .bin nebo .pkl soubory. Pickle formát umožňuje arbitrary code execution.
file unsloth/Qwen3.5-35B-A3B-GGUF/Qwen3.5-35B-A3B-UD-Q3_K_XL.gguf Kontrola hash. Porovnejte SHA-256 hash staženého souboru s hodnotou na model card na HuggingFace.
shasum -a 256 unsloth/Qwen3.5-35B-A3B-GGUF/Qwen3.5-35B-A3B-UD-Q3_K_XL.gguf Kontrola chat template. Útočníci vkládají škodlivé instrukce přímo do GGUF chat templates. Pillar Security zjistil, že to ovlivňuje stovky tisíc GGUF souborů na HuggingFace.
./llama.cpp/llama-cli \
--model unsloth/Qwen3.5-35B-A3B-GGUF/Qwen3.5-35B-A3B-UD-Q3_K_XL.gguf \
--show-chat-template Výstup porovnejte s oficiální šablonou v repozitáři Qwen. Pokud vidíte jakékoliv neobvyklé instrukce, hidden prompty nebo base64 kódované řetězce, model nepoužívejte.
Spuštění llama-server
llama-server je HTTP wrapper kolem llama.cpp, který nabízí OpenAI-kompatibilní API. To je klíčové. Znamená to, že jakýkoliv klient (Claude Code, OpenClaw, vlastní skripty), který umí volat OpenAI API, se na něj rovnou napojí.
./llama.cpp/llama-server \
--model unsloth/Qwen3.5-35B-A3B-GGUF/Qwen3.5-35B-A3B-UD-Q3_K_XL.gguf \
--alias "qwen3.5-35b-a3b" \
--host 127.0.0.1 --port 8001 \
--ctx-size 16384 \
--cache-type-k q4_0 --cache-type-v q4_0 \
--batch-size 512 --ubatch-size 256 \
--fit on --jinja --parallel 1 \
--chat-template-file ./models/qwen3.5-chat-template.jinja \
--temp 1.0 --top-p 0.95 --min-p 0.01 Důležité parametry:
| Parametr | Hodnota | Proč |
|---|---|---|
--host 127.0.0.1 | Jen localhost | Žádný přístup ze sítě |
--port 8001 | Alternativní port | Nekonflikuje s jinými službami |
--ctx-size 16384 | 16k tokenů | Bezpečný limit pro Mac Mini s 24 GB |
--cache-type-k q4_0 | Kvantizovaná KV cache | Šetří paměť na 24 GB stroji |
--batch-size 512 | Menší batch | Stabilní na 24 GB, neswapuje |
--fit on | Auto GPU layers | Automaticky využije veškerou GPU paměť |
--parallel 1 | Jeden request | Zabraňuje OOM při souběžných dotazech |
--chat-template-file | Vlastní šablona | Explicitní kontrola nad formátováním chatu |
Proč --ctx-size 16384 a ne víc? Na Mac Mini s 24 GB je to bezpečný limit. Model samotný zabírá ~15,8 GB, KV cache s kvantizací q4_0 při 16k kontextu přidá přibližně 2 GB. Celkem kolem 18 GB — zbývá prostor pro macOS a další služby. S vyšším kontextem (32k+) riskujete swapování na disk, což inference zpomalí na nepoužitelnost. Na stroji s 48+ GB klidně zvyšte.
Server bindujeme výhradně na 127.0.0.1. Ne na 0.0.0.0. Nikdy. Přístup z jiných zařízení řešíme přes Tailscale SSH tunel, stejně jako u OpenClaw gateway.
launchd služba pro automatický start
Chceme, aby llama-server běžel 24/7 a automaticky se restartoval po pádu nebo restartu Macu. Na macOS to řeší launchd.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.nomir.llama-server</string>
<key>ProgramArguments</key>
<array>
<string>/Users/aiservice/llama.cpp/llama-server</string>
<string>--model</string>
<string>/Users/aiservice/models/Qwen3.5-35B-A3B-UD-Q3_K_XL.gguf</string>
<string>--alias</string>
<string>qwen3.5-35b-a3b</string>
<string>--host</string>
<string>127.0.0.1</string>
<string>--port</string>
<string>8001</string>
<string>--ctx-size</string>
<string>16384</string>
<string>--cache-type-k</string>
<string>q4_0</string>
<string>--cache-type-v</string>
<string>q4_0</string>
<string>--batch-size</string>
<string>512</string>
<string>--ubatch-size</string>
<string>256</string>
<string>--fit</string>
<string>on</string>
<string>--jinja</string>
<string>--parallel</string>
<string>1</string>
</array>
<key>UserName</key>
<string>aiservice</string>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/var/log/llama-server.log</string>
<key>StandardErrorPath</key>
<string>/var/log/llama-server.err</string>
</dict>
</plist> Uložte do /Library/LaunchDaemons/com.nomir.llama-server.plist a aktivujte.
sudo launchctl load /Library/LaunchDaemons/com.nomir.llama-server.plist Všimněte si klíče UserName: aiservice. Server běží pod dedikovaným uživatelem, kterého jsme vytvořili v minulém díle. Nemá sudo. Nemá přístup k vašemu home adresáři. I kdyby útočník kompromitoval llama-server přes síťový exploit (jako CVE-2026-21869 v dřívějších verzích), je uzavřený v kontextu neprivilegovaného uživatele.
Propojení s OpenClaw: routing
Cloud only
Pokud nechcete lokální model, konfigurace je jednoduchá. Jeden provider, žádný routing. V souboru ~/.openclaw/openclaw.json:
{
agents: {
defaults: {
model: {
primary: "anthropic/claude-opus-4-6"
}
}
}
} Všechno jde přes Claude předplatné. Jednoduché, spolehlivé, funguje od první minuty.
Hybridní routing
S lokálním modelem máme dvě inference enginy. Claude v cloudu a Qwen3.5 lokálně. OpenClaw potřebuje vědět, kam který dotaz poslat.
V ~/.openclaw/openclaw.json zaregistrujeme lokální provider. Cloud model zůstává výchozí, lokální slouží jako fallback a cíl pro citlivá data:
{
models: {
providers: {
"local-qwen": {
baseUrl: "http://127.0.0.1:8001/v1",
apiKey: "sk-no-key-required",
api: "openai-completions",
models: [
{ id: "qwen3.5-35b-a3b" }
]
}
}
},
agents: {
defaults: {
model: {
primary: "anthropic/claude-opus-4-6",
fallbacks: ["local-qwen/qwen3.5-35b-a3b"]
}
}
}
} Výchozí model je cloud. Pokud cloud API neodpovídá, OpenClaw automaticky přepne na lokální fallback. Pro citlivá data máte k dispozici dedikovaného lokálního agenta (viz níže).
V AGENTS.md pak definujeme behaviorální vodítka pro agenta — kdy má sám zvolit cloud model místo lokálního:
## Model routing
Pravidla pro výběr modelu:
1. Pokud dotaz obsahuje citlivá data (osobní údaje, finanční informace,
klientské dokumenty): VŽDY lokální model. Bez výjimky.
2. Výchozí: cloud model. Kvalita výstupu je zatím nesrovnatelná.
3. Lokální model pro jednoduché úlohy, kde nepotřebujete cloud kvalitu,
nebo jako fallback při výpadku API. AGENTS.md není programatický routing — je to behaviorální instrukce pro agenta. Skutečný model routing řeší konfigurace primary + fallbacks výše. AGENTS.md pomáhá agentovi rozhodnout se, kdy explicitně přepnout na lokální model.
Klíčový detail: výchozí provider je cloud. Lokální model slouží jako fallback při výpadku API a cíleně pro úlohy s citlivými daty. V praxi jsem zjistil, že pro většinu use cases je kvalitativní rozdíl příliš velký na to, aby lokální model byl výchozí (viz testování níže). Ale samotná existence lokálního fallbacku je zásadní — máte plan B, který funguje i bez internetu.
Benchmark: lokální vs cloud
Po hodinách testování mám srovnání backendů na identických úlohách.
Cloud model (Claude Opus 4.6, Max subscription)
| Metrika | Hodnota |
|---|---|
| Generování tokenů | ~80 tok/s (streaming) |
| Latence první token | 800 ms až 2 s |
| Kontext | 1M tokenů |
| Cena | €90/měs. paušál (Max subscription) |
Funguje výborně. Latence 1-2 sekundy je pro konverzačního agenta naprosto přijatelná.
Lokální model (Qwen3.5-35B-A3B, UD-Q3_K_XL)
| Metrika | Hodnota |
|---|---|
| Generování tokenů | ~25-35 tok/s |
| Prompt processing | ~8 000 tok/s |
| Latence první token | < 100 ms |
| Kontext | 16k tokenů |
| Cena za token | 0 Kč |
Lokální model je rychlejší na první token (pod 100 ms vs 800+ ms u cloudu). Žádná síťová latence, žádné čekání ve frontě. Claude má větší kontextové okno (1M vs 16k), ale pro většinu agentních úloh je 16k dostatečných.
Kde Claude jednoznačně vede, je kvalita výstupu u složitých úloh. Při generování komplexního kódu s více soubory, při analýze architektonických rozhodnutí nebo při kreativním psaní je rozdíl patrný. Proto routing, ne výhradně lokální provoz.
Jak si Qwen3.5 vede v praxi
Čísla jsou jedna věc. Reálné používání druhá. Qwen3.5-35B-A3B jsem testoval několik dní na různých typech úloh.
Na to, jak malý model to je (aktivní jsou jen 3 miliardy parametrů), je překvapivě výkonný. Formuluje myšlenky srozumitelně a strukturovaně. Čeština občas hapruje u některých slov a skloňování, ale jinak zvládá český jazyk obstojně.
Vyzkoušel jsem na model i svůj zabijácký prompt — velmi komplexní zadání, kde řeším několik věcí najednou a chci hluboké zamyšlení. V OpenClaw jsem měl problém vidět myšlenkový tok modelu, tak jsem nakonec spustil inference ve vlastním UI rozhraní, kde jsem si nastavil zobrazení reasoning tokenů. Model umí přemýšlet velmi dlouho, někdy až zbytečně dlouho. Ale výsledky jsou solidní.
Dovedu si představit jeho užití na situace, kde potřebuji řešit osobnější věci — data, která nechci posílat do cloudu. Ale reálně? Na většinu případů, které dnes řeším, cloud model Opus 4.6 nemá lokální konkurenci. Proto mám routing nastavený cloud-first. Lokální model je pojistka a nástroj pro citlivá data, ne hlavní tažný kůň.
Cost tracking: kolik to stojí
Náklady jsou fixní a předvídatelné. Žádná překvapení na faktuře.
Cloud only (bez lokálního modelu)
| Položka | Měsíční náklad |
|---|---|
| Elektřina Mac Mini 24/7 (průměr ~10W) | ~40 Kč |
| Claude Max subscription (€90) | ~2 300 Kč |
| Celkem | ~2 340 Kč |
Hybridní (s lokálním modelem)
| Položka | Měsíční náklad |
|---|---|
| Elektřina 24/7 (závisí na stroji) | ~40–160 Kč |
| Claude Max subscription (€90) | ~2 300 Kč |
| Celkem | ~2 340–2 460 Kč |
K tomu připočítejte amortizaci hardware, kterou si každý spočítá podle ceny svého stroje.
Pro srovnání: ChatGPT Plus stojí 499 Kč měsíčně, Claude Pro 500 Kč. Obě služby fungují výhradně v cloudu. Vaše data odcházejí na servery třetích stran a generování je omezené rate limity. Podnikový ChatGPT Enterprise začíná na desítkách tisíc měsíčně.
Vlastní server za pár tisíc měsíčně vám dá sandbox, persistentní paměť a přístup odkudkoli. Hybridní režim s lokálním modelem přidá kompletně jinou kategorii — neomezené lokální generování a data, která nikdy neopustí stroj.
Bezpečnostní kontrola
Projdeme rozšířený checklist z prvního dílu s novými body pro lokální inference.
- ✅ Všechny porty na 127.0.0.1 (OpenClaw gateway i llama-server)
- ✅ llama-server pod uživatelem aiservice (neprivilegovaný, bez sudo)
- ✅ Model ve formátu GGUF od ověřeného publishera (Unsloth)
- ✅ SHA-256 hash ověřen proti model card
- ✅ Chat template zkontrolován proti oficiální dokumentaci Qwen
- ✅ Claude Code bez –dangerously-skip-permissions
- ✅ Hooks nastaveny (tool_result_persist audit log, message:sent gating)
- ✅ MCP servery pouze vlastní, auditované
- ✅ launchd služba s KeepAlive a logováním
- ✅ Routing s výchozím cloud modelem, lokální pro citlivá data a jako fallback
Deset z deseti. Stack je bezpečný a privátní.
Co máme hotové
Cloud only: OpenClaw agent s Claude Code, vše přes předplatné. Plně funkční AI server. Pro většinu lidí je to vše, co potřebují.
Hybridní: Navíc lokální Qwen3.5-35B-A3B jako fallback a pro citlivá data. Cloud-first routing — Opus 4.6 jako výchozí, lokální model pro situace, kde data nesmí opustit stroj. llama-server běží jako launchd služba s automatickým restartem.
Oba stroje mají společné: Claude Code se striktním permission modelem, Docker sandbox, Tailscale VPN, přístup z telefonu odkudkoli.
V příštím díle se ponoříme do toho, co dělá OpenClaw skutečně unikátním. Nastavíme si vlastní agenty s plnou osobností, vytvoříme AI Council pro důležitá rozhodování a podíváme se na reálné náklady v detailu. Kolik tokenů spotřebuje běžný den? Kolik stojí persistentní paměť? A vyplatí se lokální model oproti čistému cloud předplatnému? Čísla vás překvapí.
👉 Zajímá vás lokální RAG pipeline a vlastní AI modely? Podívejte se na seriál Lokální RAG chatbot.
Celý seriál OpenClaw: Kompletní průvodce
- OpenClaw Úvod) Co je OpenClaw a v čem je revoluční
- OpenClaw 1) Bezpečnost na prvním místě: Na co si dát pozor a sandbox
- OpenClaw 2) Jak spustit a nastavit na vlastním HW (Mac Mini i Mac Studio)
- OpenClaw 3) Napojení Claude Code a dalších modelů (i lokální) (právě čtete)
- OpenClaw 4) Nastavení vlastních agentů, osobnosti a náklady
- OpenClaw 5) Přidání nástrojů a dovedností (skills)
- OpenClaw 6) Kompletní nastavení autonomních agentů
- OpenClaw 7) Váš osobní asistent na všechno, 24/7
- OpenClaw 8) Mac Mini + Mac Studio: Jeden rig, kompletně lokální
- OpenClaw 9) Rizika, prompt injection, útoky a ladění
- OpenClaw 10) Digitální dvojče: Projekt od A do Z
Seriál vychází každý týden. Pokud nechcete zmeškat další díl, sledujte blog dangottwald.cz nebo můj LinkedIn.