# Fork агента как субагент > [!summary] Суть > При спавне субагента через `Agent` tool можно выбрать тип `subagent_type: "fork"` — тогда агент запускает **форк самого себя**. В отличие от обычного субагента (который стартует с **пустого** буфера и видит только переданный `prompt`), форк **наследует полный контекст разговора родителя** на момент запуска. Форк **всегда** идёт на модели родителя — параметр `model` для него **игнорируется**. --- ## Обычный субагент vs fork ghj | | Обычный субагент | Fork (`subagent_type: "fork"`) | | :--- | :--- | :--- | | Контекст разговора родителя | ❌ не видит (фрешевый буфер) | ✅ наследует полностью на момент запуска | | Что нужно класть в `prompt` | весь нужный контекст вручную | только саму задачу — историю форк уже знает | | Модель | из конфигурации агента / унаследованная | **всегда модель родителя**; `model` игнорируется | | Возврат родителю | только финальное сообщение | только финальное сообщение | | Вывод инструментов | остаётся внутри субагента | остаётся внутри форка | > [!note] «Fork» здесь — это не форк сессии > Не путать с [[Форк сессии Claude Code]] (`--fork-session`): то — копия **сессии** в новый `.jsonl` с новым ID на уровне CLI. А `subagent_type: "fork"` — это форк **agent context'а** внутри одной сессии (см. [[Session ID одинаковый у родительского агента и его субагентов]]). Session ID при этом общий. --- ## Зачем это нужно Главная ценность форка — **изолировать «шумную» работу, не теряя контекст и не засоряя основное окно**: - Прогнать объёмный поиск, чтение множества файлов, трол логов, широкий `grep` — и вернуть в основной разговор **только выводы**, а не свалку из содержимого файлов. Промежуточный мусор остаётся в буфере форка. - При этом, в отличие от обычного субагента, **не надо вручную пересказывать контекст** в `prompt` — форк уже видит всю историю родителя. Правило выбора: - Нужно «**я, но с полным контекстом**, чтобы разгрести шумную работу и вернуть итог» → `fork`. - Нужен **исполнитель с другой/дешёвой моделью или специализированный** (Explore, Plan, кастомный) → обычный субагент, контекст передаётся явно через `prompt`. --- ## Как запустить Запускает форк сам агент (ассистент) через `Agent` tool. Минимальный вызов: ```json { "subagent_type": "fork", "description": "краткое описание 3-5 слов", "prompt": "что должен сделать форк" } ``` Пользователь инициирует это словами — «**форкни себя** и разбери логи, дай только итог», «прогони поиск **форком**». > [!tip] `model` для форка не задавать > Для `fork` переопределение модели игнорируется — форк всегда на модели родителя. Если нужна другая модель, это уже сценарий **обычного** субагента, а не форка. --- ## Ограничения и подводные камни - **Запуск в фоне:** мне возвращается только финальное сообщение форка; вывод его инструментов в мой контекст не попадает. - **Вложенность бессмысленна:** если агент сам уже является форком — форкать дальше не нужно, задачу надо выполнять напрямую. На максимальной глубине вложенности субагент вообще теряет доступ к запуску агентов. - **Race conditions на файлах:** несколько форков, пишущих в один файл параллельно, конфликтуют (last-write-wins). Для параллельной правки нужна изоляция (отдельный git worktree). - **Снимок на момент запуска:** форк наследует историю **до точки спавна**; дальнейшие сообщения родителя в форк уже не доезжают. --- ## Смежная механика: fork как оптимизация токенов В сторонних разборах «fork субагента» иногда описывают **другой** механизм — через переменную окружения `CLAUDE_CODE_FORK_SUBAGENT=1`. Там акцент не на наследовании истории, а на **prompt caching**: параллельные субагенты переиспользуют закэшированный системный промпт родителя, что резко снижает стоимость в токенах. Срабатывает только когда в вызове агента **не указаны** ни `model`, ни явный `subagent_type`. Это смежная/иная реализация и не тождественна явному `subagent_type: "fork"` в `Agent` tool — относиться к ней стоит как к историческому/смежному контексту, а не к гарантии текущего поведения. --- ## Быстрая шпаргалка | Хочу | Делаю | | :--- | :--- | | Копию себя с полным контекстом для шумной работы | `subagent_type: "fork"` | | Исполнителя с другой моделью | обычный субагент + контекст в `prompt` | | Специализированную роль (Explore/Plan/кастом) | обычный субагент нужного типа | | Параллельную правку файлов без конфликтов | субагенты с изоляцией (worktree) | --- ## Источники - Спецификация `Agent` tool в Claude Code (актуальное поведение: форк наследует полный контекст разговора и всегда идёт на модели родителя, `model` игнорируется). - [Create custom subagents — Claude Code Docs](https://code.claude.com/docs/en/sub-agents) - [How Claude Code works — Resume or fork sessions](https://code.claude.com/docs/en/how-claude-code-works) - [Fork Subagents in Claude Code — Build This Now](https://www.buildthisnow.com/blog/guide/mechanics/claude-code-fork-subagent) (механика через `CLAUDE_CODE_FORK_SUBAGENT=1`) - [Agent as a Tool Call: Claude Code's Fork-Exec Pattern — DEV Community](https://dev.to/eyesofish/agent-as-a-tool-call-claude-codes-fork-exec-pattern-n)