Передайте сложную задачу свежему агенту
«Process isolation gives context isolation for free.» Дочерний агент делает грязную работу, родительский получает чистый summary.
Проблема родительского агента
Представьте, что вы просите Claude Code «разобраться, как в этом 100-тысячном Rust-репозитории обрабатывается параллелизм». Интуитивно: агент сам ls, cat, grep и прочёсывает код в основном контексте.
Проблема: после такого исследования в messages[] накапливается 30+ tool_result, каждый на несколько тысяч токенов. К моменту, когда агент начнёт писать ответ, контекст уже переполнен — ещё пара шагов и достигнет лимита, ответ получится путаным.
Решение s04: передать задачу новому агенту. Тот стартует с messages=[], исследует самостоятельно и возвращает родителю только summary. Родительский контекст получает лишь одно сообщение — «вызвал task, результат: XXX» — и остаётся компактным.
def run_subagent(prompt: str) -> str: sub_messages = [{"role":"user", "content": prompt}] # свежий контекст for _ in range(30): # защитный лимит на случай зацикливания response = client.messages.create(..., messages=sub_messages, tools=CHILD_TOOLS, ...) ... # возвращаем только текст, всё промежуточное отбрасываем return "".join(b.text for b in response.content if hasattr(b, "text"))
Сравнение context родителя и дочернего агента
Виджет моделирует реальную задачу: «Найдите все места в репозитории, где используется deprecated API». Сравните два подхода: (A) родитель выполняет сам; (B) spawn subagent. Посмотрите на итоговый размер обоих контекстов.
CHILD_TOOLS: какие инструменты доступны дочернему агенту
В реализации s04 есть деталь, которую легко пропустить: дочерний агент не имеет доступа к инструменту task.
# дочерний агент работает только с базовыми инструментами CHILD_TOOLS = [bash, read_file, write_file, edit_file] # родительский агент получает дополнительный инструмент task PARENT_TOOLS = CHILD_TOOLS + [task]
Почему? Чтобы избежать рекурсивного порождения в виде дерева. Если дочерний агент тоже порождает 4 дочерних, несколько итераций — и уже десятки параллельных вызовов, которые перегрузят и токены, и rate limit API. Договорённость s04: порождение плоское, родитель→ребёнок и не глубже. Реальный Claude Code придерживается того же — Task tool запрещено вызывать внутри Task tool.
Что видно и что нет
Давайте разберём распределение ответственности. Ответьте на несколько вопросов ниже: T или F?