Структура инструкций
Сейчас в main.py у агента примерно так:
«Ты coding-агент. Рабочая директория: …». Это не политика —
это тупо бейджик на груди. Инструменты уже умеют многое, но
как агенту себя вести (делать или болтать? Тащить pip без спроса?)
нигде не записано. Летс дуит, комрадес.
main.py поле instructions будет с двумя секциями:
Agency («делай, не рассказывай») и
Guardrails («не раздувай scope»). Агент чаще
сразу зовёт tools, а не пишет поэму «я бы сделал так…».
Слова по делу
- instructions / системный промпт — текст, который модель видит как «правила работы». Не путать с вашим вопросом в командной строке.
- Agency — «тебе можно и нужно действовать»: читай, ищи, запускай, потом отвечай.
- Guardrails — «но не геройствуй»: мелкие правки, сначала поиск, новые зависимости — только с разрешения.
Быстрый путь
- Откройте
main.py. - Замените короткий
instructions=...на текст с# Agencyи# Guardrails. - Прогоните знакомый промпт и сравните тон ответа.
Какие файлы трогаем
| Файл | Что делать |
|---|---|
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 позже.
Проверьте
uv run python main.py . "Найди все TODO-комментарии и скажи, где они"
Хороший знак: сразу вызов grep (или лог tool), потом список мест.
Плохой: длинное «Я могу использовать grep, чтобы…» без вызова.
Готово, если:
- В
main.pyвinstructionsесть секции# Agencyи# Guardrails - Agency явно говорит действовать через tools, а не объяснять план
- Guardrails ограничивают scope (минимум правок, без самовольного pip)
- В промпт по-прежнему подставляется
{cwd}