O czym to jest
Claude Code potrafi przekazać część pracy subagentowi: osobnej instancji modelu z własnym oknem kontekstu. Subagent dostaje zadanie, wykonuje je swoimi narzędziami i zwraca do głównej rozmowy tylko podsumowanie. Dokumenty, które przeczytał po drodze, i wyniki poleceń zostają w jego kontekście.
Ten wpis dotyczy własnych subagentów. To pliki Markdown w katalogu .claude/agents/, w których zapisuje się stały prompt, listę dozwolonych narzędzi i model. Raz zdefiniowany „recenzent umów” czy „księgowy” jest dostępny w każdej sesji, a Claude na podstawie opisu w nagłówku sam decyduje, kiedy go użyć.
Subagent pracuje w izolacji: nie widzi historii rozmowy ani dokumentów przeczytanych wcześniej przez agenta głównego. Jedynym źródłem wiedzy o zadaniu jest prompt z pliku definicji i wiadomość, którą Claude napisze przy delegowaniu.
Jak wygląda definicja
Każdy subagent to osobny plik .md z nagłówkiem YAML. Przykładowy folder działu operacyjnego:
firma/
├── CLAUDE.md
├── umowy/
├── faktury/
├── raporty/
└── .claude/
└── agents/
├── umowy-reviewer.md
├── uzgadnianie-faktur.md
└── sprzedaz/ # podkatalog tylko dla porządku
└── analityk.md
Przykładowa definicja:
---
name: umowy-reviewer
description: Przegląd umów z kontrahentami pod kątem ryzyk, terminów i niekorzystnych zapisów. Używaj proaktywnie, gdy użytkownik dodaje lub zmienia umowę w folderze umowy/.
tools: Read, Grep, Glob
model: opus
---
Jesteś doświadczonym specjalistą od umów handlowych.
1. Przeczytaj umowę wskazaną w zleceniu.
2. Porównaj ją z wzorcem `umowy/_wzorzec.md` i polityką `umowy/_zasady.md`.
3. Wypisz uwagi w trzech grupach: krytyczne, do negocjacji, kosmetyczne.
4. Przy każdej uwadze podaj paragraf, cytat i proponowane brzmienie.
Osobno wypisz terminy: okres wypowiedzenia, kary umowne, daty płatności, automatyczne przedłużenie.
Nie edytuj plików. Zwróć tylko raport.
Treść pod nagłówkiem to prompt systemowy subagenta. Zastępuje on prompt systemowy Claude Code: subagent dostaje tylko ten tekst i podstawowe informacje o środowisku (katalog roboczy, system). Dlatego prompt powinien opisywać rolę, kolejne kroki i format odpowiedzi, bo subagent nie odziedziczy tego z rozmowy.
Wymagane są tylko dwa pola: name i description. Plik bez name albo z błędnym nagłówkiem jest ignorowany. Plik z name, ale bez description albo z błędem składni YAML, również nie zostanie załadowany, a jedyny ślad tego zostaje w logu claude --debug. Nieznane pola są pomijane bez ostrzeżenia w interfejsie.
Gdzie mogą leżeć definicje
| Lokalizacja | Zasięg | Priorytet |
|---|---|---|
| Ustawienia zarządzane | Cała organizacja | 1 |
Flaga --agents (JSON) | Bieżąca sesja | 2 |
.claude/agents/ | Bieżący projekt | 3 |
~/.claude/agents/ | Wszystkie projekty użytkownika | 4 |
Katalog agents/ w pluginie | Tam gdzie plugin jest włączony | 5 |
Z tego wynika kilka zasad:
- Tożsamość wyznacza
name, a nie nazwa pliku. - Agentów można nadpisywać. Jeśli w
~/.claude/agents/i w.claude/agents/jest agent o tej samej nazwie, używana jest definicja z projektu. - Bliższy katalog wygrywa. Przy powtórzonej nazwie obowiązuje definicja położona najbliżej katalogu, w którym uruchomiono sesję.
- Zmiany działają od razu. Edycja pliku w istniejącym katalogu
agents/jest wykrywana w ciągu kilku sekund. Restart jest potrzebny w trzech przypadkach: gdy katalogagents/dla danego zakresu powstał w trakcie sesji, gdy agent leży w katalogu dodanym przez--add-diralbo/add-diroraz gdy sesję uruchomiono z flagą--disable-slash-commands.
Pola nagłówka
| Pole | Wartości | Domyślne | Co robi |
|---|---|---|---|
name | Tekst do 256 znaków, bez : | brak (pole wymagane) | Identyfikator agenta, używany przy wywołaniu i w hookach. Nie musi być równy nazwie pliku. |
description | Tekst | brak (pole wymagane) | Na jego podstawie Claude decyduje, kiedy delegować zadanie. |
tools | Nazwy narzędzi po przecinku lub lista YAML, np.Read, Grep, Glob | wszystkie narzędzia dostępne dla subagentów | Lista dozwolonych narzędzi. |
disallowedTools | Nazwy narzędzi po przecinku lub lista YAML, np.Write, Edit | brak | Lista zabronionych narzędzi, odejmowana od odziedziczonych lub podanych w tools. |
model | sonnet, opus, haiku, fable, inherit lub pełne ID modelu, np.claude-opus-5-5 | CLAUDE_CODE_SUBAGENT_MODEL, a bez niej model głównej rozmowy | Model subagenta. inherit = model głównej rozmowy. |
permissionMode | default, acceptEdits, auto, dontAsk, bypassPermissions, plan, manual (alias default) | tryb głównej rozmowy | Tryb uprawnień. Tryby bypassPermissions, acceptEdits i auto ustawione w głównej sesji mają pierwszeństwo. |
maxTurns | Liczba całkowita | brak | Limit kroków. Po jego osiągnięciu wynik jest oznaczony jako częściowy. |
skills | Lista nazw skilli | brak | Skille, których pełna treść trafia do kontekstu na starcie subagenta. |
mcpServers | Nazwy skonfigurowanych serwerów lub definicje inline | brak | Serwery MCP dostępne dla tego subagenta. |
hooks | Definicje hooków (PreToolUse, PostToolUse, Stop) | brak | Hooki aktywne w czasie pracy subagenta. |
memory | user, project, local | brak (bez trwałej pamięci) | Trwała pamięć agenta między sesjami. |
isolation | worktree | brak (katalog sesji) | Praca w tymczasowym git worktree, który jest usuwany, jeśli nic w nim nie zmieniono. Wymaga repozytorium git. |
background | true, false | false | Subagent zawsze działa w tle, nawet gdy Claude chciałby poczekać na wynik. |
effort | low, medium, high, xhigh, max (zależnie od modelu) | poziom sesji | Poziom wysiłku rozumowania subagenta. Zmienna CLAUDE_CODE_EFFORT_LEVEL ma pierwszeństwo przed tym polem. |
omitClaudeMd | true, false | false | Subagent nie wczytuje plików CLAUDE.md. |
color | red, blue, green, yellow, purple, orange, pink, cyan | brak | Kolor agenta w interfejsie. |
description: kiedy agent zostanie użyty
description to najważniejsze pole w pliku. Claude porównuje treść prośby z opisami wszystkich agentów i na tej podstawie wybiera, komu oddać zadanie. Opisy własnych agentów są stale obecne w kontekście głównej sesji, więc powinny być krótkie. Gdy ich łączna długość przekracza 15 000 tokenów, Claude Code wyświetla ostrzeżenie na starcie. Opis powinien mówić, co agent robi i kiedy go użyć:
description: >
Uzgadnia wyciąg bankowy (CSV) z rejestrem faktur
i wskazuje nieopłacone lub zdublowane pozycje.
Używaj proaktywnie po dodaniu nowego wyciągu do folderu faktury/
oraz gdy użytkownik pyta o zaległe płatności.
tools i disallowedTools: co agent może zrobić
Bez pola tools subagent dziedziczy narzędzia głównej sesji, także narzędzia serwerów MCP. Subagenty działające w tle (to tryb domyślny) dostają jednak węższy zestaw narzędzi wbudowanych, m.in. Read, Grep, Glob, Bash, Edit, Write, WebFetch, WebSearch i Skill. Narzędzia MCP zachowują w całości. Do dalszego ograniczenia służą dwa pola:
tools: Read, Grep, Glob # lista dozwolonych: agent tylko czyta dokumenty
disallowedTools: Write, Edit # lista zabronionych: wszystko poza edycją plików
# narzędzia MCP
tools: Read, mcp__crm__* # wszystkie narzędzia serwera crm
disallowedTools: mcp__* # bez żadnych narzędzi MCP
Niezależnie od konfiguracji subagent nie ma dostępu do kilku narzędzi, m.in. AskUserQuestion i EnterPlanMode. Nie może więc dopytać użytkownika w trakcie pracy, co jest kolejnym powodem, by prompt był kompletny. Subagent może uruchamiać własne subagenty, maksymalnie do trzech poziomów w głąb. Żeby to zablokować, wystarczy pominąć Agent w tools albo dopisać go do disallowedTools.
model: który model pracuje
Model jest ustalany w następującej kolejności (wygrywa pierwsze podane źródło):
- Parametr
modelw wywołaniu narzędziaAgent. - Pole
modelw nagłówku definicji. - Zmienna środowiskowa
CLAUDE_CODE_SUBAGENT_MODEL. - Model głównej rozmowy.
Jak wywołać subagenta
| Sposób | Przykład | Działanie |
|---|---|---|
| Automatycznie | „Sprawdź, które faktury z października są nieopłacone” | Claude sam wybiera agenta, którego description pasuje do zadania. |
| Wprost w treści | „Użyj subagenta umowy-reviewer, żeby ocenić nową umowę z dostawcą” | Claude deleguje zadanie do wskazanego agenta. |
Wzmianka @ | @agent-umowy-reviewer sprawdź umowę najmu biura | Gwarantuje uruchomienie tego agenta. Wiadomość nadal trafia do Claude'a, który pisze zlecenie. |
| Cała sesja | claude --agent umowy-reviewer | Główny wątek przejmuje prompt, narzędzia i model agenta. Odpowiednik w ustawieniach: "agent": "umowy-reviewer". |
Subagenty uruchamiane z głównej rozmowy domyślnie działają w tle, a ich postęp widać w /tasks. Prośby o uprawnienia od subagenta działającego w tle pojawiają się w głównej sesji, oznaczone jego nazwą. Zakończonego subagenta można wznowić, pisząc np. „kontynuuj ten przegląd i sprawdź jeszcze klauzulę o poufności”. Claude wysyła wtedy wiadomość do istniejącej instancji, która zachowuje całą swoją historię.
Co subagent dostaje na starcie
Własny subagent zaczyna z czystym kontekstem. Dostaje:
- prompt z pliku definicji i informacje o środowisku,
- wiadomość, którą napisał Claude przy delegowaniu,
- pliki
CLAUDE.md(chyba żeomitClaudeMd: true), - migawkę
git status, jeśli folder jest repozytorium git, - treść skilli wymienionych w polu
skills.
Nie dostaje historii rozmowy ani automatycznej pamięci. Zasady, które mają obowiązywać także subagenty, najlepiej trzymać w CLAUDE.md albo w regułach (więcej: Reguły w Claude Code ).
Instrukcje, które agent ma znać przy każdym uruchomieniu, trzeba wpisać do jego promptu albo do CLAUDE.md. Wiadomość przy delegowaniu pisze Claude i może w niej pominąć szczegół, który w rozmowie wydawał się oczywisty.
Przykłady
Agent tylko do odczytu: analiza oferty konkurencji
---
name: analiza-konkurencji
description: >
Zbiera ceny, pakiety i warunki ze stron konkurencji wymienionych w pliku rynek/konkurenci.md.
Używaj, gdy użytkownik pyta o ceny konkurencji, przygotowuje cennik albo ofertę przetargową.
tools: Read, Grep, Glob, WebFetch, WebSearch
model: haiku
color: cyan
---
Analizujesz ofertę konkurencji na podstawie ich stron internetowych.
1. Wczytaj listę firm i adresów z `rynek/konkurenci.md`.
2. Dla każdej firmy pobierz stronę cennika i oferty. Jeśli adres nie działa, wyszukaj aktualną stronę.
3. Zapisz dla każdej firmy: pakiety, ceny netto, okres umowy, dodatkowe opłaty, datę sprawdzenia.
Zwróć jedną tabelę porównawczą i pod nią maksymalnie pięć wniosków. Przy każdej cenie podaj adres źródła.
Jeśli ceny nie da się ustalić, wpisz „brak danych”, nie szacuj. Nie edytuj plików.
Agent ma tylko narzędzia do czytania i pobierania stron, więc niczego nie zmieni. Treść kilkudziesięciu pobranych stron zostaje w jego kontekście, a do rozmowy wraca jedna tabela. Tani model haiku wystarcza do wyciągania cen.
Agent zapisujący wynik: uzgadnianie faktur z wyciągiem
---
name: uzgadnianie-faktur
description: >
Uzgadnia wyciąg bankowy (CSV) z rejestrem faktur i wskazuje nieopłacone lub zdublowane pozycje.
Używaj proaktywnie po dodaniu nowego wyciągu do folderu faktury/ oraz gdy użytkownik pyta o zaległe płatności.
tools: Read, Write, Grep, Glob
model: sonnet
maxTurns: 30
---
Uzgadniasz płatności z fakturami za miesiąc wskazany w zleceniu.
1. Wczytaj wyciąg `faktury/wyciagi/<miesiąc>.csv` i rejestr `faktury/rejestr.csv`.
2. Dopasuj przelewy do faktur po numerze faktury w tytule przelewu, a gdy go brak, po kwocie i NIP kontrahenta.
3. Zapisz wynik w `raporty/uzgodnienie-<miesiąc>.md` w trzech sekcjach:
opłacone, nieopłacone po terminie, przelewy bez dopasowania.
Nie zmieniaj plików wyciągów ani rejestru. Dopasowania niepewne (tylko po kwocie) oznacz jako „do weryfikacji”.
Na koniec zwróć liczbę pozycji w każdej sekcji i łączną kwotę zaległości.
Agent nie ma Edit ani Bash, więc nie poprawi pojedynczych wierszy w danych ani nie uruchomi skryptów. Write pozwala jednak nadpisać każdy plik, także rejestr.csv, i przed tym chroni wyłącznie instrukcja w prompcie. Twardą blokadę daje dopiero hook PreToolUse na Write, który przepuszcza tylko ścieżki w raporty/ (mechanizm opisany w następnym przykładzie). maxTurns chroni przed zapętleniem przy wyciągu, którego nie da się uzgodnić.
Agent z hookiem: dane sprzedażowe tylko do odczytu
---
name: analityk-sprzedazy
description: >
Odpowiada na pytania o sprzedaż, klientów i produkty na podstawie bazy dane/sprzedaz.db.
Używaj, gdy użytkownik pyta o wyniki sprzedaży, trendy albo najlepszych klientów.
tools: Bash, Read
hooks:
PreToolUse:
- matcher: "Bash"
hooks:
- type: command
command: "./scripts/tylko-odczyt.sh"
---
Odpowiadasz na pytania o sprzedaż, wykonując zapytania `sqlite3 -readonly dane/sprzedaz.db "<zapytanie>"`. Używaj wyłącznie SELECT, jedno zapytanie na wywołanie, bez średnika na końcu.
Wynik podsumuj w kilku zdaniach i małej tabeli, nie wklejaj całych zestawień. Kwoty podawaj w PLN netto.
Pole tools nie odróżnia odczytu danych od ich usuwania: zapytania SELECT i DELETE idą przez to samo narzędzie Bash. Dlatego potrzebny jest hook. Przed każdym wywołaniem Bash Claude Code przekazuje skryptowi na standardowe wejście opis wywołania w formacie JSON, a treść polecenia jest w polu tool_input.command. Kod wyjścia 2 blokuje wywołanie, a tekst ze standardowego wyjścia błędów trafia do subagenta jako wyjaśnienie. Skrypt scripts/tylko-odczyt.sh:
#!/usr/bin/env bash
# Hook PreToolUse dla agenta analityk-sprzedazy: przepuszcza tylko odczyt bazy.
COMMAND=$(jq -r '.tool_input.command // empty')
# Dozwolone jest jedno wywołanie sqlite3 na bazie otwartej tylko do odczytu.
if [[ "$COMMAND" != "sqlite3 -readonly dane/sprzedaz.db "* ]]; then
echo "Zablokowano: uruchamiaj wyłącznie 'sqlite3 -readonly dane/sprzedaz.db \"<zapytanie>\"'." >&2
exit 2
fi
# Bez łączenia poleceń, potoków i podstawień powłoki.
if [[ "$COMMAND" == *[\;\&\|\`]* || "$COMMAND" == *'$('* || "$COMMAND" == *$'\n'* ]]; then
echo "Zablokowano: polecenie może zawierać tylko jedno zapytanie, bez ; & | \` i \$(...)." >&2
exit 2
fi
# Słowa kluczowe SQL zmieniające dane lub schemat.
if grep -qiwE 'INSERT|UPDATE|DELETE|DROP|ALTER|CREATE|REPLACE|ATTACH|VACUUM' <<< "$COMMAND"; then
echo "Zablokowano: dozwolone są tylko zapytania SELECT." >&2
exit 2
fi
exit 0
Przykłady zastosowania
| Zastosowanie | Ustawienia | Co daje subagent |
|---|---|---|
| Przegląd umów i regulaminów | tools: Read, Grep, Globmodel: opus | Świeże spojrzenie bez sugerowania się tokiem rozmowy. Raport ryzyk bez zmian w dokumentach. |
| Księgowość i zestawienia | tools: Read, WritemaxTurns | Tysiące wierszy wyciągów i rejestrów zostają w kontekście subagenta. Do rozmowy wraca lista rozbieżności. |
| Research rynku i konkurencji | tools: Read, WebFetch, WebSearchmodel: haiku | Tani model czyta dziesiątki stron, główna sesja dostaje wniosek ze źródłami. |
| Praca z jednym systemem (CRM, poczta) | mcpServers inline | Narzędzia systemu nie zajmują miejsca w kontekście głównej sesji, a dostęp ma tylko ten agent. |
| Wersje robocze dokumentów | isolation: worktree | Agent przygotowuje nową wersję oferty lub procedury w osobnej kopii folderu. Oryginał pozostaje bez zmian do akceptacji. |
| Agent znający firmę | memory: project | Notatki (klienci, słownik pojęć, ustalenia) w .claude/agent-memory/<nazwa>/ zachowywane między sesjami i współdzielone z zespołem. |
Jak sprawdzić, czy agent działa
| Polecenie | Co pokazuje |
|---|---|
claude --debug | Pominięte definicje (błędy YAML, brak description) i nieobsługiwane pola (wpisy z frazą does not recognize or apply). |
@agent-<nazwa> | Szybki test, czy agent jest zarejestrowany: podpowiedź po wpisaniu @agent- pokazuje dostępne nazwy. |
/tasks | Subagenty działające w tle, ich postęp i możliwość zatrzymania. |
/context | Ile miejsca zajmują opisy agentów w kontekście głównej sesji. |
Podsumowanie
- Subagent to plik
.mdw.claude/agents/albo~/.claude/agents/. Przy tej samej nazwie wygrywa projekt. - Wymagane są
nameidescription. Tożsamość agenta wyznaczaname, nie nazwa pliku ani podkatalog. - Treść pliku to prompt systemowy. Subagent nie widzi historii rozmowy, więc prompt musi opisywać rolę, kroki i format wyniku.
descriptiondecyduje o automatycznym delegowaniu: powinien mówić, co agent robi i kiedy go użyć.toolsidisallowedToolsograniczają uprawnienia,modelpozwala dobrać koszt do zadania, a hooki w nagłówku kontrolują to, czego nie da się opisać listą narzędzi.- Subagent sprawdza się tam, gdzie po drodze powstaje dużo danych (umowy, wyciągi, strony konkurencji), a w rozmowie potrzebny jest tylko wynik.