Lekce 02.1: Modely, harnessy, agenti a prostředí (Models, Harnesses, Agents, Environments)
🧠 Mentální model & teoretický rozbor
Většina nedorozumění při vývoji s AI pramení z toho, že lidé zaměňují model za agenta a harness za editor. Pokud chceme kódovat spolehlivě, musíme striktně rozlišovat čtyři vrstvy:
┌─────────────────────────────────────────────────────────────────────────┐│ 1. MODEL (Neuronová síť na serveru) ││ Příklad: Google Gemini 2.5/3.8 Pro, Claude 3.7 Sonnet. ││ Co to je: Pravděpodobnostní funkce f(text) -> text. Nemá přístup k ││ disku, síti ani terminálu. Nemá žádnou interní paměť mezi voláními. │└────────────────────────────────────┬────────────────────────────────────┘ │ JSON API (HTTP POST)┌────────────────────────────────────▼────────────────────────────────────┐│ 2. HARNESS (Běhové prostředí a kódovací postroj) ││ Příklad: Google Antigravity CLI (`agy`), Claude Code (`claude`). ││ Co to je: Běžný program na vašem PC. Odesílá prompty, čte disky, ││ spouští bashové příkazy a překládá výstupy zpět do JSONu pro model. │└────────────────────────────────────┬────────────────────────────────────┘ │┌────────────────────────────────────▼────────────────────────────────────┐│ 3. AGENT (Autonomní řídicí smyčka) ││ Co to je: Architektura promptů a smyčka: Myšlenka ➔ Nástroj ➔ ││ Pozorování výsledku ➔ Další myšlenka. Řídí se souborem AGENTS.md. │└────────────────────────────────────┬────────────────────────────────────┘ │┌────────────────────────────────────▼────────────────────────────────────┐│ 4. PROSTŘEDÍ (Environment) ││ Váš operační systém: Souborový systém, Git repozitář, běžící procesy,││ databáze a síťová spojení. │└─────────────────────────────────────────────────────────────────────────┘Klíčový poznatek: Model sám o sobě nikdy nepřepíše soubor. Model pouze vrátí textový řetězec:
{"name": "EditFile", "parameters": {"path": "src/index.ts", "content": "..."}}.
Teprve harness tento JSON zachytí a fyzicky provede fs.writeFileSync() na vašem disku.
🏢 Realistický scénář z praxe
Představte si situaci, kdy model navrhne úpravu souboru, ale harness selže, protože soubor je zamčený jiným procesem nebo chybí oprávnění k zápisu.
- Nezkušený vývojář se začne hádat s modelem: „Proč jsi ten soubor neuložil? Jsi hloupý!“
- Inženýr okamžitě chápe: Model úpravu navrhl správně, ale selhal harness nebo narazil na mantinel prostředí (např. Unix oprávnění
chmod 444). Problém řeší v terminálu, nikoliv v chatu.
💻 Konkrétní ukázky kódu & promptů
Ukázka: Jak vypadá zjednodušená smyčka kódovacího harnessu v TypeScriptu:
// mini-harness.ts - Principiální ukázka fungování harnessuimport Anthropic from '@anthropic-ai/sdk';import fs from 'fs';import { execSync } from 'child_process';
const anthropic = new Anthropic();const messages: any[] = [{ role: 'user', content: 'Zkontroluj stav repozitáře a oprav linter.' }];
async function agentLoop() { while (true) { const response = await anthropic.messages.create({ model: 'claude-3-7-sonnet-20250219', max_tokens: 4096, tools: [ { name: 'bash', description: 'Spustí bash příkaz', input_schema: { type: 'object', properties: { cmd: { type: 'string' } }, required: ['cmd'] } } ], messages });
// Uložíme odpověď asistenta do historie messages.push({ role: 'assistant', content: response.content });
const toolUse = response.content.find((block) => block.type === 'tool_use'); if (!toolUse) { console.log('Agent dokončil úkol:', response.content); break; }
// HARNESS VYKONÁVÁ NÁSTROJ V PROSTŘEDÍ if (toolUse.name === 'bash') { console.log(`[HARNESS] Spouštím v bashi: ${toolUse.input.cmd}`); let stdout = ''; try { stdout = execSync(toolUse.input.cmd, { encoding: 'utf-8' }); } catch (err: any) { stdout = `ERROR: ${err.message}`; }
// Výsledek vracíme modelu v dalším tahu messages.push({ role: 'user', content: [{ type: 'tool_result', tool_use_id: toolUse.id, content: stdout }] }); } }}⚠️ Analýza selhání & Anti-patterns
Anti-pattern: Zaměňování schopností modelu se schopnostmi harnessu
Někteří vývojáři píší do CLAUDE.md: „Pamatuj si, že včera jsme dělali refaktoring user modulu.“
- Proč to selže: Model nemá žádnou dlouhodobou paměť. Pokud harness nenačte předchozí historii nebo specializovaný paměťový soubor (
MEMORY.md), model o včerejšku neví zhola nic. - Řešení: Všechny kontextové informace musí být explicitně uloženy v souborech repozitáře (Gitu, dokumentaci, testech).
🛠️ Inženýrský postup krok za krokem (Playbook)
- Identifikujte vrstvu problému:
- Pokud model generuje syntaktické nesmysly ➔ problém je v modelu nebo nedostatečném zadání.
- Pokud se nespustil test ➔ problém je v harnessu (zaseknutý proces, špatný tool call).
- Pokud chybí soubor nebo práva ➔ problém je v prostředí.
- Udržujte prostředí v čistotě: Harness má přístup přesně k tomu, co je v prostředí. Smažte nepoužívané soubory a lockněte závislosti.
🧪 Praktické cvičení (Hands-on Lab)
Úkol:
Ověřte si oddělení modelu a prostředí v Antigravity CLI (agy) nebo Claude Code.
Kroky:
- Spusťte
agy(neboclaude). - Zadejte příkaz: „Zobraz aktuální čas a datum na tomto počítači.“
- Sledujte v terminálu, jak model vygeneruje volání nástroje
Bashs příkazemdate, harness ho spustí v prostředí vašeho OS a model vám teprve poté odpoví. - Zamyslete se: Proč model nemohl odpovědět rovnou ze svých interních vah?