Урок 04 · Планирование

Передайте сложную задачу свежему агенту

«Process isolation gives context isolation for free.» Дочерний агент делает грязную работу, родительский получает чистый summary.

⏱ ~10 мин · 📝 3 интерактивных компонента · 🧑‍💻 На основе shareAI-lab · s04_subagent.py

Проблема родительского агента

Представьте, что вы просите 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?

Интерактив

Виджет 1 · Parent vs Child · сравнение размера контекста

Одна задача, два подхода. Нажмите Run и сравните итоговую длину messages[] и примерное количество токенов.

🧠 Родитель выполняет сам
messages: 0 · ~0 tokens
🎯 Spawn subagent
messages: 0 · ~0 tokens
Интерактив

Виджет 2 · True or False · ответственность родителя и дочернего агента

6 вопросов True/False, проверяющих понимание границ изоляции.

Правильно: 0 / 6
Интерактив

Виджет 3 · When to spawn · какие задачи стоит отдать subagent?

6 описаний задач. Решите: (A) родитель выполняет сам или (B) spawn subagent. Нет абсолютно правильного ответа, но есть явные предпочтения.

Правильно: 0 / 6