← Все статьи

Что такое agent harness и когда писать свой — на Python

  • практикум
  • Python
  • ИИ-агенты
  • LLM
Потоки разрозненных данных входят в металлический каркас со светящимся ядром и выходят упорядоченными документами.

Языковая модель умеет предложить следующий шаг: «поищи в каталоге», «спроси клиента», «готово». Но сама она ничего не исполняет. Она не ходит в базу, не помнит, что нашлось на прошлом шаге, и не знает, когда пора остановиться. Всё это делает обычный код вокруг модели. Его называют agent harness — буквально «упряжь»: сила у модели, а направление, пределы и право на действие задаёт программа.

Коротко: модель предлагает, harness решает.

Что делает harness

Даже у самого простого агента с одним инструментом harness отвечает за несколько вещей:

  • цикл. Вызвать модель, разобрать её ответ, исполнить разрешённый инструмент, вернуть результат и повторить;
  • права. Какие инструменты модели доступны и что делать, если она попросила другой или передала неверные аргументы;
  • контекст. Что модель увидит на следующем шаге: задачу, ответы инструментов, их источник;
  • остановку. Предел числа шагов и различимый итог: ответ найден, нужно уточнение, лимит исчерпан, источник недоступен;
  • происхождение результата. Пользователю можно показать только то, что действительно вернул инструмент, а не то, что модель «вспомнила».

Когда агент растёт, к этому добавляются сохранение незавершённого запуска, утверждение действий человеком и трассы, по которым видно, что поведение изменилось после смены модели или промпта.

Когда стоит написать свой harness

Готовых решений много, и для части задач их достаточно. Свой harness обычно оправдан в таких ситуациях.

Агент — часть существующего продукта. У приложения уже есть свои правила доступа, предметная модель и тесты. Агенту нужно встроиться в них, а не принести собственные. Например, цену считает предметный код, а модель только помогает найти нужную запись.

Агент небольшой. Для одного-двух инструментов настройка фреймворка и его абстракции иногда сложнее самого цикла, который нужен задаче.

Сервис написан не на Python. Если основной код на Go, Java или Rust, Python-фреймворк разделит приложение между языками. Цикл вызова инструментов переносится на любой язык: у провайдеров моделей разный формат запросов, но схема одна.

Нужно доказывать поведение. Что модель вызвала, с какими аргументами, на основании чего получился итог. Когда ошибка стоит денег или доверия, эти ответы нужны в тестах и журнале, а не только в логах провайдера.

Действие требует согласия человека. Агент готовит черновик, но утверждает его сотрудник, и именно ту версию, которую видел.

Процесс длиннее одного запроса. Клиент отвечает на уточнение через день, а запуск должен продолжиться с сохранёнными основаниями.

Обратная ситуация тоже бывает. Если задача совпадает со сценарием готового агента — например, агента, который работает с файлами и кодом, — разумно начать с него.

Как это помогает понять готовые инструменты

Слово «harness» используют и авторы популярных инструментов. В LangChain разделяют три уровня: LangChain — фреймворк с абстракциями, LangGraph — среда выполнения агента, а harness у них — Deep Agents, который добавляет к ним готовые промпты, обработку вызовов инструментов, планирование и файловую систему. Anthropic называет Claude Agent SDK harness-ом, на котором работает Claude Code.

Внутри у них те же вопросы: какие действия разрешены, что модель видит на следующем шаге, когда остановиться, как пережить паузу и сменить модель без сюрпризов. Если вы хотя бы раз ответили на них в своём коде, документация готового инструмента читается как набор чужих ответов на знакомые вопросы. Проще понять, что он делает за вас, где его поведение придётся настраивать и стоит ли он своих абстракций в вашей задаче.

Практикум «Создание agent harness — Python»

В SoftPractice есть практикум, в котором вы собираете такой harness по частям. Заказчик — компания «Нева-Ремонт», которая занимается внутренней отделкой офисов. Сотрудник получает заявку свободным текстом, а ставки хранятся во внутреннем каталоге. Вы пишете помощника сметчика: он ищет нужные сведения и готовит черновик сметы.

Маршрут из шести заданий в одном растущем проекте:

  1. Поиск работы через инструмент. Цикл одного инструмента: итоговый тариф берётся только из найденной записи.
  2. Несколько разрешённых источников. Выбор инструмента, проверка аргументов, сбой источника как отдельный исход.
  3. Неполная заявка и происхождение сведений. Вопрос о конкретном недостающем условии; слова клиента не выдаются за замер.
  4. Сохранение черновика и продолжение после паузы. Состояние и источники переживают завершение процесса.
  5. Расчёт позиции и утверждение ревизии. Сумму считает предметный код, а сотрудник утверждает конкретную версию.
  6. Структурированная трасса и регрессия. Сценарии замечают, что поведение изменилось при смене модели, инструкции или инструмента.

Практикум рассчитан на уверенного Python-разработчика: понадобятся pytest, Git, JSON и подстановка зависимостей в тестах. Знать конкретный SDK модели не нужно. Проверки используют управляемую учебную модель, поэтому ключ провайдера для прохождения не требуется. На задания заложите около 14 часов и ещё около часа на короткую теорию.

Практикум не учит строить универсальный фреймворк агентов. Его цель — чтобы вы умели управлять действиями модели в своём приложении и доказывать это тестами.

Как начать

Код вы пишете у себя в редакторе — сами или с ИИ-инструментами, — фиксируете commit-ом и отправляете командой softpractice submit. SoftPractice запускает проверки, а ИИ-наставник помогает разобрать результат, не выдавая готового решения. Следующие задания приходят в тот же проект командой softpractice update.

Первое задание открыто без подписки.

Открыть практикум