MODULE_03 · УРОК 3.1

Структура инструкций

Сейчас в main.py у агента примерно так: «Ты coding-агент. Рабочая директория: …». Это не политика — это тупо бейджик на груди. Инструменты уже умеют многое, но как агенту себя вести (делать или болтать? Тащить pip без спроса?) нигде не записано. Летс дуит, комрадес.

ЧТО ПОЛУЧИТСЯ В main.py поле instructions будет с двумя секциями: Agency («делай, не рассказывай») и Guardrails («не раздувай scope»). Агент чаще сразу зовёт tools, а не пишет поэму «я бы сделал так…».

Слова по делу

  • instructions / системный промпт — текст, который модель видит как «правила работы». Не путать с вашим вопросом в командной строке.
  • Agency — «тебе можно и нужно действовать»: читай, ищи, запускай, потом отвечай.
  • Guardrails — «но не геройствуй»: мелкие правки, сначала поиск, новые зависимости — только с разрешения.

Быстрый путь

  1. Откройте main.py.
  2. Замените короткий instructions=... на текст с # Agency и # Guardrails.
  3. Прогоните знакомый промпт и сравните тон ответа.

Какие файлы трогаем

Файл Что делать
main.py Править. Только строку/блок instructions= у Agent(...).
tools / approval / local_bash Не трогать.

Было

main.py — сейчас примерно так:

agent = Agent(
    "deepseek:deepseek-chat",
    deps_type=Path,
    tools=[Tool(bash_fn, takes_ctx=False)],
    instructions=(
        f"Ты coding-агент.\nРабочая директория: {cwd}\n"
        "Используй инструмент read..."
    ),
)

Работает. Но попросите «найди TODO и скажи где» — один день модель сразу зовёт grep, другой — пишет план на пол-экрана и ждёт аплодисментов. Политики нет — есть настроение модели.

Стало — правьте instructions так

main.py — новый блок instructions

instructions = f"""Ты coding-агент. Рабочая директория: {cwd}

# Agency
- ПОЛЬЗУЙСЯ инструментами: читай файлы, ищи по коду, запускай команды — потом отвечай.
- НЕ объясняй, что ты «сейчас сделаешь». Сделай, потом коротко отчитайся.
- Для поиска — grep, для просмотра файла — read.
- bash — только если задача не закрывается read/grep.

# Guardrails
- Меняй по минимуму: маленькие правки лучше «великого рефакторинга».
- Сначала поищи существующий паттерн в проекте, не плоди сущности.
- Новые зависимости (pip/uv add) — только если пользователь явно попросил.
"""

agent = Agent(
    "deepseek:deepseek-chat",
    deps_type=Path,
    tools=[Tool(bash_fn, takes_ctx=False)],
    instructions=instructions,
)

Зачем так писать:

  • «Сделай, не рассказывай» — модели любят быть лекторами. Без прямой команды «actually do it» они скатываются в PowerPoint.
  • Имена tools в промпте и в docstring — повтор специально. Один раз модель может пропустить; два раза — реже.
  • «Не ставь пакеты без спроса» — задел под human-in-the-loop позже.
ЭТО ЕЩЁ НЕ МАГИЯ Если Module 2 уже хорошо рулит tools, разница в ответе может быть тонкой. Выигрыш другой: политику теперь можно править одним местом и копировать на субагента, не охотясь по всему коду.

Проверьте

uv run python main.py . "Найди все TODO-комментарии и скажи, где они"

Хороший знак: сразу вызов grep (или лог tool), потом список мест. Плохой: длинное «Я могу использовать grep, чтобы…» без вызова.

Готово, если:

  • В main.py в instructions есть секции # Agency и # Guardrails
  • Agency явно говорит действовать через tools, а не объяснять план
  • Guardrails ограничивают scope (минимум правок, без самовольного pip)
  • В промпт по-прежнему подставляется {cwd}
ЭКСПЕРИМЕНТ Вырежьте блок Agency, оставьте Guardrails. Тот же промпт. Вернулся лектор? Потом наоборот. Так вы увидите, какая секция ловит какое поведение — дешевле, чем гадать по звёздам.