ХЕЛЛОУИН СЕЙЛ-10%
До 31 октября-10%
ХЕЛЛОУИН СЕЙЛ-10%
До 31 октября-10%
ХЕЛЛОУИН СЕЙЛ-10%
До 31 октября-10%
ХЕЛЛОУИН СЕЙЛ-10%
До 31 октября-10%
ХЕЛЛОУИН СЕЙЛ-10%
До 31 октября-10%
ХЕЛЛОУИН СЕЙЛ-10%
До 31 октября-10%

Что такое харнес AI-агента

Модель умеет только писать текст. Как харнес превращает этот текст в действия, чем он отличается от интерфейса и почему один харнес работает в разных приложениях.
Guide DAO

23 октября 2026 года Тео Браун, автор T3 Code, опубликовал в X статью о том, что такое харнес. Он признался, что устал объяснять это слово каждый раз заново, а единого понятного объяснения так и не нашёл. Слово звучит всё чаще: харнес Claude Code, харнес Codex, «модель хорошая, но харнес слабый».

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

Модель умеет только писать текст

Языковая модель получает на вход текст и выдаёт текст. Она не может открыть файл, запустить тесты или отправить запрос в интернет. Если попросить её прочитать README.md, она может только написать что-то вроде «прочитай мне README.md». Пока этот текст никто не обработал, ничего не происходит. Тео сравнивает это с тем, как печатать на клавиатуре выключенного компьютера.

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

Из чего состоит харнес

Первое: сами тулы. Это код, который выполняет действия: читает файл, редактирует его, запускает команду в терминале, ищет в интернете. У Claude Code такие тулы называются Read, Edit, Bash, Grep, WebFetch и так далее.

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

Третье: синтаксис вызова. Модели нужно как-то сказать «запусти вот это». Формат можно описать прямо в промпте, как в примере Тео с тегом <read_file>. Но современные модели обучены работать с тулами, и API Claude сам добавляет служебный системный промпт про них. В документации Claude API это 286 токенов для Claude Opus 5.5. Ответ с вызовом тула выглядит так:

{
  "type": "tool_use",
  "id": "toolu_01A09q90qw90lq917835lq9",
  "name": "get_weather",
  "input": { "location": "New York, NY" }
}

Четвёртое: исполнитель. Харнес находит в ответе модели блок tool_use, проверяет, можно ли его выполнять, и запускает соответствующий код. Модель только просит, решение и исполнение остаются за харнесом.

Пятое: возврат результата. Вывод тула харнес отправляет модели следующим сообщением, в блоке tool_result с тем же id, чтобы модель понимала, на какой вызов это ответ.

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

Что ещё делает хороший харнес

Учебный харнес занимает немного кода: в примере из документации Claude API это два запроса к модели и разбор одного блока tool_use. Claude Code и Codex отличаются от такого цикла тем, что происходит вокруг этих шести частей.

Контекст. Всё, что прошло через цикл, копится в контекстном окне: системный промпт, описания тулов, история, вывод каждой команды. Когда окно подходит к пределу, харнес выполняет компактинг: сжимает старую историю в саммари и оставляет свежие шаги. Ранние инструкции при этом могут потеряться, поэтому постоянные правила хранят в CLAUDE.md, который харнес добавляет в каждый запрос. Схемы MCP-тулов Claude Code по умолчанию не грузит заранее, а находит поиском, когда они понадобились. Подробно о том, из чего складывается контекст, мы писали в статье о контексте и памяти.

Права. Харнес решает, какие вызовы выполнять сразу, какие показать человеку, а какие запретить. В Claude Code это режимы разрешений, правила вроде Bash(npm *) и хуки: хук PreToolUse может отклонить вызов, и модель получит отказ вместо результата.

Сэндбокс. Разрешение на команду не защищает от того, что команда сделает внутри. Поэтому харнесы ограничивают процессы на уровне операционной системы. Сэндбокс Claude Code на macOS использует Seatbelt, на Linux bubblewrap: команды пишут в рабочую папку и временный каталог, а в сеть ходят через прокси со списком разрешённых доменов. Ядро Codex на macOS тоже рассчитывает на Seatbelt.

Параллельность. Если модель попросила сразу несколько вызовов, харнес решает, как их выполнить. Agent SDK запускает читающие тулы одновременно, а правки и команды по очереди, чтобы они не мешали друг другу.

Интерфейс и харнес

Человек работает с интерфейсом: терминалом, окном приложения, расширением в редакторе. Модель работает с харнесом. Тео делит Claude Code на эти две части. Команда claude в терминале открывает TUI, вкладка Code в десктопном приложении открывает GUI, и ни то ни другое не харнес. Документация Claude Code говорит то же: интерфейс определяет, как вы видите Claude, а агентный цикл под ним одинаковый в терминале, приложении, IDE и вебе.

Этот цикл можно взять отдельно. Claude Agent SDK даёт те же тулы, агентный цикл и управление контекстом, на которых работает Claude Code, как библиотеку для Python и TypeScript. Тео пишет, что Claude Code работает поверх Agent SDK. По документации связь обратная: SDK поставляется с бинарником Claude Code и запускает его. Для понимания разница небольшая, харнес у них общий.

У OpenAI похожая схема. Логика Codex живёт в отдельном ядре, которое используют разные интерфейсы, а Codex App Server открывает его клиентам через JSON-RPC. На нём работает, например, расширение Codex для VS Code. Разговор там делится на треды, треды на ходы, ходы на элементы: сообщения, команды, правки файлов, вызовы тулов.

Один харнес в разных приложениях

Раз харнес отделён от интерфейса, его можно встроить в чужое приложение. Сам T3 Code использует Agent SDK и Codex App Server: интерфейс свой, харнесы чужие. Тео приводит и другие пары, например харнес Pi внутри OpenClaw. В его метафоре модель работает поваром, харнес кухней, а приложение рестораном, который может арендовать любую кухню.

MCP в эту картину вписывается как способ дать харнесу тулы, код которых живёт в другом месте. Обычный тул выполняется внутри харнеса, а MCP-тул отправляет запрос на внешний сервер. Модели всё равно: она видит в списке ещё одно имя с описанием.

Поэтому разные агенты часто отличаются только конфигурацией харнеса: набором тулов, инструкциями, подключёнными MCP-серверами, правами.

Что из этого следует на практике

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

Ваши настройки тоже работают на уровне харнеса. CLAUDE.md, скилы, хуки, MCP-серверы и правила разрешений ничего не меняют в модели. Они меняют то, что харнес показывает ей и что позволяет сделать.

Если хотите понять механику, напишите минимальный цикл сами: один тул, разбор tool_use, возврат tool_result, повтор до ответа без вызовов. После этого становится понятно, за что отвечает каждая часть Claude Code. Для рабочего агента цикл с нуля писать не обязательно: Agent SDK и Codex App Server дают готовый харнес с правами, сэндбоксом и компактингом.

Как устроены тулы, контекст, скилы и хуки Claude Code и как настроить их под свой проект, разбираем на курсе по Claude Code.

Поделиться
Интересно погрузиться в крипту?
Поможем выбрать направление!