Что такое agent harness: архитектура Claude Code, DeepSeek Harness и Hermes Agent

· 4 мин чтения
ai-agents harness claude-code deepseek mcp
Что такое agent harness: архитектура Claude Code, DeepSeek Harness и Hermes Agent

Модель умеет ровно одно: получив текст и список доступных инструментов, предсказать следующий ответ или вызов инструмента. Всё остальное — цикл вызовов, исполнение инструментов, память между десятками ходов, песочница — делает обёртка вокруг модели, которую в 2026 году называют harness. В августе 2026-го DeepSeek опубликовала репозиторий deepseek-harness и за два дня собрала 95 386 звёзд, а минималистичный кодинг-агент Pi инженера Марио Цехнера за год органического роста дошёл до 91 600. За обоими стоит одно и то же слово — и совершенно разная архитектура. Разбираемся, что такое agent harness, чем десять самых обсуждаемых харнесс отличаются под оболочкой маркетинга и как собрать минимальную версию на Python в 60 строк.

Что такое agent harness

Harness — это runtime-оболочка вокруг LLM. Когда вы вводите запрос в Claude Code, Cursor или Aider, происходит одно и то же:

  1. Харнесс собирает промпт: запрос, системные инструкции и схемы доступных инструментов.
  2. Модель отвечает — обычно текстом рассуждения и одним или несколькими вызовами инструментов (read_file, run_bash, edit).
  3. Харнесс исполняет каждый вызов, в идеале внутри песочницы, и захватывает вывод.
  4. Вывод инструментов дописывается в диалог, и модель вызывается снова.
  5. Цикл повторяется — иногда десятки ходов, — пока модель не выдаст финальный ответ или пока не сработает лимит ходов, лимит стоимости или не вмешается человек.

Этот пятишаговый цикл (его называют agent loop или ReAct loop — по статье Yao et al. 2022 года) одинаков у всех харнесс на рынке. Качество же определяется тем, что обёрнуто вокруг шагов 3 и 4: насколько качественно спланирована работа до старта, как память решает, что оставить, а что выбросить при заполнении контекста, насколько изолирована песочница и умеет ли харнесс породить субагента с чистым контекстом, не замусорив главный диалог.

От фреймворков к харнессам

С 2023 по 2025 год в разговорах об агентах доминировало слово «фреймворк»: LangChain, AutoGen, CrewAI. Фреймворки — это библиотеки: вы импортировали компоненты и сами писали логику оркестрации. Харнесс — продукт другого рода: цикл уже собран и настроен относительно памяти, планирования и безопасности, а взаимодействие сводится к запуску команды. Сдвиг сделал неоспоримым Claude Code, а к 2026 году паттерн «shipped loop» стал нормой.

Показательна история LangChain Deep Agents: библиотека, в которой команда попыталась абстрагировать то, что сделало харнесс Claude Code универсальным. Внутри — четыре механизма, которые стоит запомнить, потому что каждый серьёзный харнесс решает именно эти инженерные проблемы:

  • Инструмент планирования, заставляющий модель расписать шаги до касания файлов — иначе модель тихо уползает от задачи в длинной сессии.
  • Виртуальная файловая система и песочница — структурный изолированный доступ к репозиторию на чтение и запись.
  • Делегирование субагентам: главный агент порождает меньшего агента с чистым контекстным окном для изолированной подзадачи и получает назад краткое резюме.
  • Управление контекстом и памятью — middleware сжимает историю диалога и выгружает крупные выводы инструментов, чтобы длинная сессия не переполнила контекстное окно.

Планирование, песочница, делегирование, управление контекстом. Всё остальное — брендинг.

Десять харнесс: кто на что делает ставку

Харнесс Автор Оптимизирован для Примечание
Claude Code Anthropic Сквозные кодинг-сессии: план, правки, тесты, коммиты Популяризовал паттерн planning-tool + субагенты
DeepSeek Harness (dsh) DeepSeek AI Полная модульность рантайма 95 000 звёзд за 2 дня; модели, инструменты, песочницы, UI — сменные плагины
Deep Agents LangChain Модель-агностичное воспроизведение паттернов Claude Code Open-source библиотека + CLI, работает с любой tool-calling моделью
Hermes Agent Nous Research Постоянный самоулучшающийся ассистент Telegram, Slack, Discord, WhatsApp, email из одного процесса; растущий хаб скиллов
Pi Mario Zechner / Earendil Радикальный минимализм: четыре встроенных инструмента 91 600+ звёзд органического роста
Oh-My-Pi (omp) Can Bölük Максимальалистский форк Pi со встроенной IDE Движок переписан на Rust; 60+ провайдеров моделей, 31 инструмент
CellCog CellCog Универсальный супер-агент для знаний #1 на DeepResearch Bench (август 2026, 55.78)
OpenHands All Hands AI Открытый докеризованный автономный инженер Бывший OpenDevin; Docker — песочница по умолчанию
Aider Paul Gauthier и контрибьюторы Git-native парное программирование Каждый шаг агента — чистый ревьюируемый коммит
Cline Cline Bot Inc. VS Code extension с ручным одобрением Каждая правка и команда ждут вашего подтверждения

Кодинг-специфичные харнесс могут считать репозиторий, тесты и diff единицей работы. Харнесс для широких задач знаний (CellCog, Hermes Agent) вынужден изобретать эквивалент диффа для исследований и бизнес-задач — проблема более сложная и менее стандартизированная.

Три конкурирующие философии

Ставка первая: всё — плагин. DeepSeek Harness построена на мета-фреймворке Cordis: модель, песочница, хранилище сессий, планировщик и даже тема UI — сменные на рантайме модули. Логика ставки: ни одна архитектура не выигрывает навсегда, поэтому выигрышный ход — сделать саму архитектуру конфигурационным файлом.

Ставка вторая: небольшой фиксированный набор механизмов. Claude Code и Deep Agents идут наоборот: выбрать четыре механизма (планирование, песочница, субагенты, сжатие контекста) и вкладываться в надёжность каждого. Все четыре работают на каждой задаче вместе; пропустишь один — остальные подстрахуют, пока длинная сессия не найдёт дыру.

Ставка третья: накапливающаяся память. Hermes Agent бьёт в главную нерешённую проблему — что происходит между сессиями. Решив нетривиальную задачу, агент предлагает сохранить подход как переиспользуемый скилл и в будущем проверяет библиотеку скиллов до рассуждений с нуля. Плюс — растущая скорость на повторяющихся задачах; риск — разросшаяся библиотека превращается в долг, переживающий причину своего написания.

Четвёртая ставка под всеми тремя: Pi и Oh-My-Pi утверждают, что большая часть встроенного у конкурентов — лишний вес, и четыре инструмента плюс система расширений бьют фичастую платформу для инженера, знающего, чего хочет. Все четыре ставки защищаемы — они оптимизируют против разных режимов отказа: DeepSeek против vendor lock-in, Claude Code и Deep Agents против ненадёжности длинных сессий, Hermes против повторной работы, Pi против раздувания. Прежде чем выбирать, спросите: какой режим отказа стоит вам времени сегодня?

Минимальный харнесс на Python в 60 строк

Пятишаговый цикл с Anthropic Messages API: модель, три инструмента и цикл, который вызывает модель, пока та не перестанет запрашивать инструменты.

import subprocess
from anthropic import Anthropic

client = Anthropic()

TOOLS = [
    {
        "name": "read_file",
        "description": "Read a UTF-8 text file from the working directory.",
        "input_schema": {
            "type": "object",
            "properties": {"path": {"type": "string"}},
            "required": ["path"],
        },
    },
    {
        "name": "write_file",
        "description": "Write content to a file, overwriting it if it exists.",
        "input_schema": {
            "type": "object",
            "properties": {
                "path": {"type": "string"},
                "content": {"type": "string"},
            },
            "required": ["path", "content"],
        },
    },
    {
        "name": "run_bash",
        "description": "Run a shell command inside the sandbox directory and return its output.",
        "input_schema": {
            "type": "object",
            "properties": {"command": {"type": "string"}},
            "required": ["command"],
        },
    },
]

def execute_tool(name, tool_input):
    if name == "read_file":
        return open(tool_input["path"]).read()
    if name == "write_file":
        with open(tool_input["path"], "w") as f:
            f.write(tool_input["content"])
        return f"wrote {len(tool_input['content'])} bytes to {tool_input['path']}"
    if name == "run_bash":
        result = subprocess.run(
            tool_input["command"],
            shell=True,
            cwd="./sandbox",
            capture_output=True,
            text=True,
            timeout=30,
        )
        return result.stdout + result.stderr
    raise ValueError(f"unknown tool: {name}")

def run_harness(task, max_turns=15):
    messages = [{"role": "user", "content": task}]

    for _ in range(max_turns):
        response = client.messages.create(
            model="claude-sonnet-5",
            max_tokens=4096,
            tools=TOOLS,
            messages=messages,
        )
        messages.append({"role": "assistant", "content": response.content})

        if response.stop_reason != "tool_use":
            return response.content[0].text

        tool_results = []
        for block in response.content:
            if block.type == "tool_use":
                output = execute_tool(block.name, block.input)
                tool_results.append({
                    "type": "tool_result",
                    "tool_use_id": block.id,
                    "content": output,
                })
        messages.append({"role": "user", "content": tool_results})

    return "stopped: hit max_turns without a final answer"

Здесь видны все режимы отказа, о которых шла речь. execute_tool не ловит ни битые ответы, ни ошибки инструментов — один неудачный вызов зациклит модель на сломанном результате ход за ходом. cwd="./sandbox" — несущая граница безопасности: без неё run_bash может исполнить всё, что доступно хостовому пользователю, и эту строку легко потерять при рефакторинге. max_turns=15 существует потому, что ничто не велит модели остановиться самой: уберите лимит — и задача никогда не вернётся, а счёт за токены будет расти, пока кто-нибудь не убьёт процесс руками.

Разница между этой игрушкой и серьёзным харнессом — целиком в reliability engineering: что происходит при падении вызова инструмента, что происходит на пятидесятом ходу и что мешает песочнице трогать что-либо вне ./sandbox.

Стек вокруг харнесса

Харнесс не работает в одиночку. В продакшене рядом живут три слоя, и важно знать границы ответственности каждого.

Протокольный слой — MCP. Model Context Protocol — открытый стандарт, представленный Anthropic в ноябре 2024-го и к концу 2025-го переданный Agentic AI Foundation под крылом Linux Foundation (Anthropic, OpenAI, Block). Харнесс грузит список инструментов из MCP-конфига:

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "/Users/you/project"]
    },
    "postgres": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-postgres", "postgresql://localhost/mydb"]
    }
  }
}

Каждый MCP-сервер из конфига становится инструментами внутри TOOLS — без единой новой ветки в execute_tool. Написали интеграцию один раз — использует любой MCP-совместимый харнесс.

Слой оркестрации. Харнесс ведёт одного агента в одном цикле. Как только нужны несколько агентов с ролями в долгом stateful-процессе — это территория фреймворков оркестрации: LangGraph с графами, чекпоинтами и time-travel-отладкой, CrewAI с ролевыми агентами, AG2 (преемник AutoGen с async, event-driven рантаймом), TypeScript-первый Mastra и DSPy из Stanford NLP, который компилирует промпты против метрики, а не пишется руками.

Наблюдаемость и песочницы. Langfuse и LangSmith трассируют каждый вызов модели, инструмента и стоимость в токенах — так отлаживается харнесс, упавший на 34-м ходу. Braintrust и Arize Phoenix добавляют регрессионное тестирование поведения агента. Для самой песочницы E2B и Modal дают одноразовые micro-VM для недоверенного кода без риска для хоста.

Кривая хайпа против кривой внедрения

95 000 звёзд DeepSeek Harness за два дня и 91 600 звёзд Pi за год — два маршрута к одной точке. Первый — координированный запуск и аудитория известной лаборатории; второй — год отдельных решений инженеров, что инструмент стоит держать. Всплеск говорит о внимании; устойчивое использование — о том, что терминал с ним открыт и через полгода. Выбирая харнесс, смотрите на форму кривой, а не на высоту.

Как выбрать харнесс

  • Один агент надёжно закрывает одну кодинг-задачу: Claude Code, Deep Agents или Aider для самого плотного цикла diff-per-commit.
  • Страх vendor lock-in и частая смена моделей: DeepSeek Harness с архитектурой «всё — плагин» или модель-агностичный Deep Agents.
  • Одни и те же задачи повторяются неделями, хочется ускорения со временем: накапливающаяся библиотека скиллов Hermes Agent.
  • Минимальная поверхность аудита, готовность писать расширения самому: ядро Pi из четырёх инструментов; Oh-My-Pi, если нужны IDE-инструменты, LSP-диагностика и отладчик.
  • Несколько агентов в долгом stateful-процессе: это слой выше харнесса — LangGraph, CrewAI, AG2, Mastra.

И в любом случае наблюдаемость — не опция с первого дня: харнесс без трейса, упавший на 30-м ходу, — кошмар отладки, а с Langfuse или LangSmith — пятиминутный фикс.

Что переживёт смену имён

Названия инструментов из этой статьи устареют в течение года. Останутся три референса: пятишаговый цикл, четыре механизма Claude Code и слоистый стек протокол — харнесс — оркестрация — наблюдаемость. Любой новый харнесс читается против них за час: структурная новизна или перепаковка того же цикла. Читать архитектуру вместо маркетинга — единственный навык, который эта категория не может устарить.

Источник: https://www.freecodecamp.org/news/what-is-an-agent-harness/