Автономный агент для исследовательских задач веб-инженера
Hermes Agent на собственном VPS: безопасное развёртывание, устройство памяти и навыков, модель стоимости эксплуатации и сравнение моделей на десяти контрольных задачах.
01Развёртывание Hermes Agent
Hermes Agent — опенсорсный (MIT) оркестратор агентов от Nous Research. Он состоит из шлюзов (CLI, Telegram, Discord…), инструментов (терминал, файлы, браузер, планировщик), навыков и подключаемой LLM. За основу взято руководство thecode.media, детали сверены с официальной документацией. Все файлы лежат в репозитории сайта, в каталоге agent-lab/.
Журнал параметров
Фактические значения подставляются из journal.json. Пустые поля ещё не зафиксированы.
| Загрузка журнала… |
Ход работы
- Сервер
Используется сервер сайта: Ubuntu 26.04.1, 1 vCPU, 891 МБ RAM, 14 ГБ диска, Амстердам. На нём же работают nginx, API стенда и PostgreSQL. Модель облачная, поэтому минимальных требований Hermes (1 vCPU, 1 ГБ) хватает с учётом swap. Провайдер, тариф и цена записываются в журнал.
- Подготовка сервера —
deploy/agent/setup-agent.sh, запускается один раз- swap 1 ГБ: сайт, Postgres и агент вместе не помещаются в 891 МБ;
- пользователь
agentбез пароля и sudo; доступ к серверу — только по SSH-ключу; - сетевая изоляция контейнера —
agent-firewall.sh(сервис systemd, правила восстанавливаются после перезагрузки); - агенту не нужны входящие порты: Telegram-шлюз работает через исходящий long polling.
Из контейнера
curl 172.x.0.1:3001(API) и:5432(Postgres) не проходят,https://simakov.spaceоткрывается. - Docker и Compose
Пакеты
docker.ioиdocker-compose-v2из репозитория Ubuntu. Ротация логов задаётся в/etc/docker/daemon.json. Пользовательagentв группуdockerне добавляется: группа docker равносильна root, а на сервере сайта это недопустимо. Контейнером управляет администратор.docker run --rm hello-worldпечатает «Hello from Docker!» - LLM-провайдер и ключ
Основная модель —
deepseek-v4-flashчерез OpenAI-совместимый шлюзllms.dotpoin.com. Это сторонний перепродавец DeepSeek, а не официальный API: запросы агента проходят через него. Шлюз сообщает окно 1 048 576 токенов; вызов инструментов проверен запросом сtools. Hermes отклоняет модели с окном меньше 64 000 токенов, поэтому окно проверяется до запуска. Для P4 дополнительно подключаются GigaChat 2 Max (отечественная, 128K) и Qwen3 8B через Ollama (локальная, контекст поднят до 65 536). Бесплатные:free-модели для работы не годятся: общий лимит запросов, частые HTTP 429. - Лимит расходов
Лимит ставится до первого запуска планировщика: в кабинете провайдера — лимит на ключ или только предоплаченный баланс без автопополнения. Значения лимитов записываются в журнал. Ошибочная cron-задача раз в 5 минут — это 8 640 запусков в месяц; расчёт ниже, в разделе «Экономика».
- Telegram-шлюз
Бот создаётся в @BotFather (
/newbot), числовой ID пользователя берётся у @userinfobot. Токен хранится только в~/.hermesна VPS, в репозитории его нет. Если токен утёк —/revokeв @BotFather и новый токен. - Мастер настройки в контейнере
cd /opt/hermes docker compose run --rm hermes-agent setup ls /home/agent/.hermes # config.yaml, .env, memories/, skills/ — конфиг записан на хостМастер запускается тем же compose-сервисом, что и шлюз, поэтому пишет ровно в тот каталог, который смонтирован при работе:
/home/agent/.hermesна хосте =/opt/dataв контейнере. Модель и шлюз задаются вconfig.yaml(образец —deploy/agent/config.example.yaml), ключи — в.envс правами 600. - compose.yaml —
deploy/agent/compose.yaml→/opt/hermes/compose.yamlservices: hermes-agent: image: nousresearch/hermes-agent:latest container_name: hermes_agent restart: unless-stopped command: gateway run environment: HERMES_UID: "${AGENT_UID}" # процесс — под UID пользователя agent HERMES_GID: "${AGENT_GID}" volumes: - /home/agent/.hermes:/opt/data networks: [agent] # мост br-agent, см. agent-firewall.sh security_opt: [ "no-new-privileges:true" ] cpus: 0.8 mem_limit: 700m memswap_limit: 1400m pids_limit: 256 logging: driver: json-file options: { max-size: "10m", max-file: "5" } networks: agent: driver_opts: { com.docker.network.bridge.name: br-agent }Портов наружу нет. Лимиты CPU, памяти и числа процессов не дают зациклившемуся агенту положить сайт.
- Запуск и логи
docker compose up -d && docker compose logs -f
В строке навыков ненулевое число (
… 87 total bundled), предупрежденияNo messaging platforms enabledнет. - Первое сообщение
Боту отправляется «Кто ты и какие у тебя инструменты?». Время отклика — от отправки до первого ответа, по меткам времени Telegram, медиана трёх попыток. Записывается в журнал.
- Ограничение доступа
В
~/.hermes/.envуказан толькоTELEGRAM_ALLOWED_USERS=<мой ID>;GATEWAY_ALLOW_ALL_USERSне задан. Проверка — сообщение с тестового аккаунта.Бот не отвечает постороннему аккаунту. Запись об этом ищется в
hermes logs gateway. - Память —
agent-lab/server/memories/→~/.hermes/memories/USER.md(568 из 1 375 символов) хранит предметную область, стиль, формат ответов и язык.MEMORY.md(770 из 2 200) — контекст исследования и договорённости. Агент читает их при старте сессии, так что после правки нужна новая сессия (/new).Контрольный вопрос: «Как мы договорились считать стабильный FPS и как называется эталонная сцена?» Правильный ответ («5-й перцентиль за 30 с», «Нива») есть только в MEMORY.md, в интернете его не найти.
- Инструменты
Проверяется каждый набор по отдельности: веб-поиск («найди RFC 9110, раздел про 413»), чтение страницы (
https://agent.simakov.space/fixtures/changelog.html), файлы (создать и прочитать/opt/data/research/test.md), терминал (df -h,uname -a), планировщик (/cron list). Отдельно проверяется, что опасная команда (например,rm -rfвне рабочего каталога) запрашивает подтверждение. Эту защиту не отключать. - Первый навык —
agent-lab/server/skills/source-digest/SKILL.md«Конспект источника». Условие срабатывания: пользователь прислал ссылку и просит конспект, сводку или разбор. Шаги: загрузить страницу, извлечь метаданные, выписать 3–5 утверждений с дословными цитатами, сохранить файл в
/opt/data/research/digests/, ответить путём и итоговой строкой. Негативная проверка — вопрос без ссылки: навык срабатывать не должен.По сообщению «сделай конспект https://…» появился файл, в ответе есть «Источников: N, из них первичных: M».
- Задача по расписанию
/cron add "0 9 * * *" "Проверь https://simakov.space/ и https://simakov.space/api/benchmarks: код ответа, время ответа, число записей в JSON. Допиши строку в /opt/data/research/monitoring.csv. Если что-то не 200 — начни ответ со слова ALERT, иначе ответь [SILENT]."
Задания хранятся в
~/.hermes/cron/jobs.json, вывод каждого запуска — в~/.hermes/cron/output/<job>/<время>.md, журнал попыток —hermes cron runs.[SILENT]подавляет доставку в Telegram, когда всё в порядке. - Логи
- stdout контейнера: json-file, 5 × 10 МБ (не больше 50 МБ);
~/.hermes/logs/(agent.log,errors.log,gateway.log) — встроенная ротация Hermes (agent.log.1…), просмотр черезhermes logs gateway -f;- вывод cron и отчёты P4: срок хранения 90 дней. Пользовательский crontab:
find ~/.hermes/cron/output -type f -mtime +90 -delete; - сессии в
state.dbне удаляются: они нужны для анализа шагов и отказов в P4.
- Отладка
Ошибки, гипотезы и решения ведутся в журнале (раздел
debugвjournal.json) и показываются в таблице ниже. Известные по руководству и документации ситуации:Симптом Гипотеза Решение 0 total bundled+No messaging platforms enabledАгент не видит конфиг: смонтирован не тот каталог Монтировать в /opt/data(не/opt/hermes) тот же каталог, куда писалsetupHTTP 429 от провайдера Бесплатная модель, общий лимит Платная модель с лимитом бюджета на ключе Auxiliary title generation failedНе задана вспомогательная модель для заголовков сессий Безвредно; при желании задать дешёвую модель в auxiliaryМодель отклонена при старте Окно контекста меньше 64K Другая модель; для Ollama — OLLAMA_CONTEXT_LENGTH=65536Контейнер перезапускается, KilledOOM на 1 ГБ RAM swap 1 ГБ, mem_limit, не запускать параллельно второй шлюз на те же данные
T2Память, контекст и навыки
Как агент живёт с ограниченным контекстным окном: что он видит в каждом запросе, что достаёт по требованию и что переносит между сессиями. Описание механики Hermes опирается на документацию разделов Memory, Skills и Cron.
Три уровня: окно, история, память
Всё, что модель видит в одном запросе: системный промпт, схемы инструментов, снимок памяти, список навыков и сообщения текущей сессии вместе с результатами вызовов инструментов. Окно ограничено (64K–1M токенов), каждый токен в нём оплачивается при каждом запросе. Вне запроса модель ничего не помнит.
Полные журналы прошлых разговоров в SQLite (~/.hermes/state.db) с полнотекстовым поиском FTS5. В окно они не попадают, агент достаёт нужные фрагменты инструментом session_search. Это архив: он хранит всё дословно, но агент должен сам догадаться, что и где искать. Длинную текущую сессию Hermes сжимает (compaction), и сжатие повторяется по всё более длинной истории. Поэтому документация советует начинать /new на границе задач.
Два небольших файла, MEMORY.md (2 200 символов, около 800 токенов) и USER.md (1 375 символов, около 500 токенов). Они целиком вставляются в системный промпт каждой сессии. Маленький размер выбран сознательно: память — это постоянная надбавка к цене каждого запроса.
Отсюда главная разница. Окно — это рабочий стол: всё в нём сразу видно, но места мало и оно дорогое. История — архив: туда помещается всё, но искать приходится вручную. Файловая память — записка на мониторе: всегда перед глазами, поэтому в ней только то, что нужно почти в каждой задаче.
Механика файловой памяти
| Вопрос | Как устроено в Hermes |
|---|---|
| Что пишется | USER.md — кто пользователь, предпочтения, стиль, язык. MEMORY.md — заметки агента: контекст проектов, договорённости, выводы из решённых задач. Записи короткие, по одному факту. |
| Кто инициирует | (1) Сама модель во время диалога, через инструмент memory с действиями add, patch, remove и целью memory или user. (2) Фоновый self-improvement review после хода: отдельный вызов (можно дешёвой моделью) решает, что стоит запомнить. (3) Пользователь — просьбой «запомни…» или прямой правкой файла. Режим memory.write_approval: true складывает записи в очередь (/memory pending, /memory approve). |
| Когда | Запись попадает на диск сразу, но системный промпт текущей сессии собран из снимка, сделанного на старте. Новая запись начнёт влиять на поведение только со следующей сессии. Отсюда практическое правило: после правки памяти — /new. |
| Противоречия | Автоматического механизма разрешения нет. Есть защита от грубых ошибок: точные дубли отклоняются, patch и remove требуют уникальную подстроку (неоднозначное совпадение — ошибка), отложенная правка отклоняется, если запись успела измениться. Решить, что новое сведение заменяет старое, должна сама модель, сделав patch. Если она вместо этого сделала add, в памяти останутся два противоречащих факта, и модель будет выбирать между ними в каждой сессии. Поэтому договорённости стоит формулировать как одну запись с датой и регулярно просматривать файл. |
| Разрастание | Жёсткий лимит символов. add сверх лимита возвращает ошибку со списком записей и числом символов, которые нужно освободить. После этого агент одной пачкой операций удаляет или сокращает старое и добавляет новое. Автосжатия нет: при заполнении больше 80 % агенту рекомендуется объединять записи. Плюс — размер памяти и её стоимость ограничены. Минус — при консолидации модель может выбросить важное: решение о забывании принимает модель, а не пользователь. |
Сравнение с другими подходами к памяти
| Подход | Что хранит и как достаёт | Сильные стороны | Слабые стороны |
|---|---|---|---|
| Файловая память (Hermes, CLAUDE.md, AGENTS.md) | Короткий текст целиком в каждом промпте | Прозрачна, читается и правится руками, версионируется в git, не нужна инфраструктура, поведение детерминировано | Объём ~1K токенов; нет поиска; противоречия и забывание — на совести модели |
| Векторная БД + RAG | Фрагменты документов с эмбеддингами; в окно попадают top-k похожих на запрос | Масштаб — тысячи документов; поиск по смыслу, а не по словам | Похожее ≠ нужное; теряются точные числа и связи между фрагментами; качество зависит от нарезки и модели эмбеддингов; трудно объяснить, почему найдено именно это |
| Суммаризация истории (compaction) | Старая часть диалога заменяется сжатым пересказом | Длинная сессия продолжается без переполнения окна | Потери накапливаются от сжатия к сжатию: сначала пропадают детали, потом цитаты и ссылки; ошибка в пересказе становится «фактом» |
| Граф знаний | Сущности и связи (автор → статья → метод → результат); запросы по графу | Многошаговые вопросы («какие методы из статей 2025 года проверялись на мобильных GPU»), явные связи, видно происхождение факта | Дорогое построение (извлечение сущностей — тоже LLM с ошибками); нужна схема; избыточен для мелких задач |
| Внешняя база фактов (SQL, таблица замеров) | Структурированные записи, агент делает запросы инструментом | Точность, агрегаты, проверяемость; данные не зависят от модели | Пишет туда код или пользователь; агенту нужен инструмент и знание схемы |
В Hermes эти слои совмещаются. Файловая память остаётся всегда, история доступна через session_search, а внешние провайдеры памяти (Honcho, Mem0, Supermemory и др., hermes memory setup) работают рядом с файлами, но не вместо них.
Когда файловой памяти достаточно
- Персональный ассистент одного исследователя: стиль ответов, язык, формат таблиц, договорённости о метриках.
- Одна текущая тема исследования, небольшой набор постоянных фактов: адреса стенда, названия сцен, рабочие каталоги.
- Регламентные задачи (мониторинг, еженедельные сводки), где важна стабильность поведения, а не объём знаний.
Когда недостаточно
- Обзор литературы на десятки и сотни источников: нужен RAG по конспектам (их и складывает навык
source-digest) или граф «источник → утверждение → цитата». - Работа с количественными данными: замеры FPS за месяцы должны жить в базе (у стенда это PostgreSQL за
/api/benchmarks), а не в памяти модели. Модель запрашивает и считает, а не вспоминает. - Несколько тем или проектов параллельно: 2 200 символов не хватит, факты начнут вытеснять друг друга. Тут нужны профили Hermes (
~/.hermes/profiles/<имя>) со своей памятью у каждого. - Требования к воспроизводимости и происхождению фактов: файловая память не хранит, откуда взят факт и когда он записан.
Навыки: происхождение и риски
Навык — это каталог с SKILL.md: frontmatter с name, description и version, в теле — условие применения, шаги и проверка, рядом могут лежать вспомогательные файлы. Навыки подгружаются постепенно (progressive disclosure). В окне всегда только имя и описание из skills_list(); полный текст загружается через skill_view(), только когда модель решила, что навык подходит. Так сотни навыков почти не занимают контекста.
| Где живёт | Когда действует | Что задаёт | |
|---|---|---|---|
| Промпт | Сообщение пользователя | Один запрос | Что сделать сейчас |
| Системная инструкция | Системный промпт (+ USER.md / MEMORY.md) | Всегда, в каждой сессии | Роль, правила, стиль; поведение по умолчанию |
| Инструмент | Код с JSON-схемой (terminal, web, memory, cronjob…) | Когда модель его вызывает | Новое действие во внешнем мире. Без инструмента агент только пишет текст |
| Навык | Файл ~/.hermes/skills/<имя>/SKILL.md | Когда задача подходит под description | Процедуру: какие инструменты, в каком порядке, как проверить результат. Знание «как», а не «что» |
Автоматическое порождение. У агента есть инструмент skill_manage (create, patch, delete…). Документация называет поводы создать навык: многошаговый процесс, который удалось выстроить и стоит повторить, и исправление подхода пользователем. Фоновый review после хода тоже может предложить навык. По сути агент пишет себе регламент по следам удачной сессии.
Риски:
- Закрепление ошибочной процедуры. «Удачной» сессию считает модель, а не внешний критерий. Если задача решилась случайно (сработал обходной путь, тест был слабый, пользователь просто не заметил ошибку), процедура превращается в правило и воспроизводится во всех похожих задачах.
- Переобучение на частный случай. Конкретный URL, путь или версия пакета в шагах навыка ломаются, как только меняется окружение.
- Дрейф поведения. Навыки патчатся по ходу работы. Через месяц поведение агента определяется набором правок, которые никто не просматривал, и уже нельзя сказать, почему агент делает именно так. Для исследования это прямой удар по воспроизводимости: тот же запрос даёт другой результат.
- Конфликт навыков. Два навыка с пересекающимися описаниями — и модель выбирает между ними непредсказуемо.
- Внедрение инструкций. Текст с веб-страницы может попасть в навык и остаться там надолго. Навыки из Hub проходят сканер (эксфильтрация, prompt injection, деструктивные команды), а созданные самим агентом проверяются отдельным сканером
skills.guard_agent_created.
Меры, принятые в работе: skills.write_approval: true — новые навыки и правки ждут ручного одобрения (/skills pending); каталог ~/.hermes/skills под git, чтобы каждая правка была видна диффом; у каждого навыка раздел «Проверка» с внешним признаком успеха; на время эксперимента P4 память и навыки откатываются к снимку перед каждым прогоном.
T2Экономика: модель стоимости
Агентная задача — это цикл. На каждом шаге модель получает весь накопленный контекст и отвечает вызовом инструмента или итоговым текстом. Результат инструмента дописывается в контекст, и следующий шаг стоит дороже предыдущего.
Модель
Пусть C₀ — постоянная часть запроса (системный промпт, схемы инструментов, память, список навыков, сообщение пользователя), Δ — сколько токенов добавляет один шаг (вызов и результат инструмента), n — число шагов, o — выходных токенов на шаг. Тогда за одну задачу:
входные токены T_in = n·C₀ + Δ·n(n−1)/2 # растут квадратично по числу шагов
выходные токены T_out = n·o
стоимость S = [ (1−h)·T_in·p_in + h·T_in·p_cache + T_out·p_out ] / 10⁶
месяц M = 30·(задач_в_день·S(n) + cron_в_день·S(n_cron)) + VPS
Здесь h — доля входных токенов, прочитанных из кэша промпта. Постоянный префикс C₀ одинаков во всех шагах, поэтому почти весь вход попадает в кэш. Значения по умолчанию измерены на этом агенте (отчёты --usage-file и журнал вызовов API): ответ одним словом — 14 188 входных токенов, шаг cron-задачи — 14 943, доля кэша — 97–99 %. Отсюда C₀ = 14 500 и h = 95 % с запасом. Δ зависит от инструмента: вывод команды терминала — сотни токенов, загруженная веб-страница — тысячи. Взято 1 500.
| Сценарий | Задач/день × шагов | Cron/день × шагов | Токены/мес | LLM, ₽/мес | Итого с VPS |
|---|
Что видно из модели
Цифры ниже — при параметрах по умолчанию (C₀ = 14 500, Δ = 1 500, h = 95 %, VPS 400 ₽, 82 ₽/$).
| Модель | Лёгкий | Средний | Тяжёлый | Задача на 8 шагов |
|---|---|---|---|---|
| DeepSeek V4 Flash · llms.dotpoin.com ($1 / $3, кэш $0,5) | ≈ 890 ₽ | ≈ 5 700 ₽ | ≈ 43 700 ₽ | ≈ 7,6 ₽ |
| DeepSeek V4 Flash · OpenRouter ($0,14 / $0,28, кэш $0,028) | ≈ 60 ₽ | ≈ 390 ₽ | ≈ 2 900 ₽ | ≈ 0,5 ₽ |
| GigaChat 2 Lite (65 ₽) | ≈ 1 200 ₽ | ≈ 7 900 ₽ | ≈ 60 100 ₽ | ≈ 10,5 ₽ |
| GigaChat 2 Max (650 ₽) | ≈ 12 200 ₽ | ≈ 78 900 ₽ | ≈ 601 300 ₽ | ≈ 105 ₽ |
Расходы на модель в месяц, без VPS.
- Доминирует вход, а не выход. Задача на 8 шагов — 158 000 входных токенов против 3 200 выходных, и почти весь вход — один и тот же префикс
C₀, повторённый на каждом шаге. - Решает кэширование, а не цена за токен. У GigaChat нет скидки на кэш, поэтому даже Lite с ценой 65 ₽ за 1M (≈ $0,8) выходит дороже DeepSeek у перепродавца с ценой $1, а Max — в 14 раз дороже. Для агента с длинным постоянным префиксом это главный критерий выбора провайдера.
- Один и тот же DeepSeek стоит в 15 раз дороже у перепродавца, чем через OpenRouter: $1 против $0,14 за вход и $0,5 против $0,028 за кэш. Удобство оплаты из России — заметная статья расходов.
- Число шагов работает квадратично. Задача на 16 шагов использует в 2,6 раза больше входных токенов, чем на 8. Зацикливание опасно для бюджета, а не только для качества.
- Частый cron сопоставим со всей интерактивной работой. Проверка раз в 5 минут — 8 640 запусков в месяц и около 47 % расходов в тяжёлом сценарии. Для регламентных проверок частота расписания — первый параметр, который стоит пересмотреть.
- VPS — главная статья только у дешёвого провайдера при лёгкой нагрузке. Через OpenRouter аренда (≈ 400 ₽) дороже токенов до среднего сценария включительно. У перепродавца токены дороже VPS уже в лёгком сценарии, у GigaChat Max — в 30 раз.
- Бесплатный пакет GigaChat для физлиц (25M токенов Max на год) покрывает лёгкий сценарий примерно на 1,3 месяца — хватит для эксперимента, но не для эксплуатации.
Как снизить расход
| Приём | На что действует | Эффект и цена |
|---|---|---|
| Кэширование промпта | p_in → p_cache для префикса | Самый сильный рычаг для многошаговых задач: префикс одинаков на всех шагах. Требует стабильного начала промпта: любая правка памяти или списка навыков в середине сессии сбрасывает кэш |
| Дешёвая модель для вспомогательных задач | p_in, p_out | Заголовки сессий, фоновый review памяти, сжатие истории, cron-мониторинг — секция auxiliary в конфиге. Цена — возможный пропуск важного в review |
| Скрипт вместо агента в cron | число LLM-вызовов | hermes cron create … --no-agent --script check.sh: проверку делает скрипт, агент включается только при отклонении. Для мониторинга расход падает почти до нуля |
| Короткая память и узкий набор инструментов | C₀ | Схемы инструментов — заметная часть префикса. Флаг -t/--toolsets оставляет только нужное (например, для cron — web без браузера и терминала) |
| Ограничение числа шагов | n, квадратичный член | Лимит итераций и таймаут обрывают зацикливание. Цена — часть сложных задач не будет доведена до конца |
/new на границе задач | Δ·n² | Не тянуть историю прошлой задачи в новую; нужное агент найдёт через session_search |
| Обрезка вывода инструментов | Δ | Вместо целой страницы или лога — grep/tail; агента об этом стоит попросить в USER.md |
P4Сравнительный эксперимент качества
Десять контрольных задач из реальной работы веб-инженера-исследователя, три модели, по три прогона каждой задачи на каждой модели — всего 90 прогонов. Успех проверяет код, а не модель-судья и не автор на глаз. Стенд: agent-lab/p4/.
Контрольные задачи
Веб-фикстуры опубликованы на этом сайте (vps-plans, changelog) и закрыты от индексации. Файловые фикстуры копируются в контейнер агента в /opt/data/p4. Правильные ответы известны заранее или вычисляются из фикстур.
| ID | Класс | Критерий успеха (проверяется кодом) |
|---|
Модели
| Модель | Класс | Контекст | Вход / выход за 1M | Цена сверена |
|---|
Процедура
- Каждый прогон — отдельная одноразовая сессия:
hermes -z "<задача>" --provider … --model … --usage-file …. Из отчёта--usage-fileберутся токены (с учётом вспомогательных вызовов), число вызовов API (= шаги) и оценка стоимости. Время измеряется по часам. - Перед каждым прогоном память и навыки откатываются к снимку. Агент не учится между повторами, и третий прогон не получает подсказок от первого.
- Порядок — повтор → задача → модель. Колебания нагрузки у провайдеров во времени распределяются по всем моделям поровну.
- Таймаут 10 минут: превышение считается зацикливанием. Пустой ответ — преждевременная остановка. Все URL в ответе проверяются запросом; неоткрывающиеся помечаются как выдуманная или битая ссылка.
- Ложные и непроверяемые утверждения размечаются вручную в
annotations.jsonпо тексту ответа, без оглядки на автоматический вердикт. - Стоимость считается по токенам и прайсу из
models.jsonв рублях. Для локальной модели токены бесплатны, её стоимость — железо и электричество; она обсуждается отдельно.
Результаты
Итоги и выводы
Выводы предварительные: протокол выполнен как пилот, по одному прогону на ячейку «модель × задача», поэтому разброс по повторам не измерен.
Стоимость одной успешной задачи
| Модель | T07: время | Шаги | Вход, ток. | Доля кэша | ₽ за успех | То же через OpenRouter |
|---|---|---|---|---|---|---|
| DeepSeek V4 Flash | 31 с | 5 | 74 394 | 98 % | 3,28 ₽ | ≈ 0,20 ₽ |
| GLM-5.3 Flash | 72 с | 5 | 73 523 | 79 % | 1,90 ₽ | — |
| Qwen3.5 9B | 301 с | 7 | 371 869 | 16 % | 6,13 ₽ | 0 ₽ локально |
Задача T07 (подсчёт IP и ответов 5xx в журнале nginx) — единственная, которую прошли все три модели. Цены — по прайсу шлюза llms.dotpoin.com; колонка OpenRouter — тот же расход токенов по цене DeepSeek на OpenRouter.
- Стоимость определяют шаги и кэш, а не цена токена. Qwen 9B — самая дешёвая модель за токен ($0,2), но на той же задаче сделал 7 шагов вместо 5, а в кэш у него попало 16 % входа против 98 % у DeepSeek. В итоге он прочитал в 5 раз больше токенов и вышел самым дорогим за успешную задачу, к тому же в 10 раз медленнее. Это подтверждает модель стоимости из T2: главные рычаги — число шагов
nи доля кэшаh. - GLM-5.3 Flash — самый дешёвый за успех (1,90 ₽), но вдвое медленнее DeepSeek.
- Провайдер важнее модели. Тот же прогон DeepSeek через OpenRouter стоил бы около 0,20 ₽, в 16 раз дешевле, чем через перепродавца.
Какая модель для какого класса задач
| Класс задач | Рекомендация | Основание |
|---|---|---|
| Обработка файлов и логов командами, регламентные cron-задачи (T02, T04, T07, T09) | GLM-5.3 Flash; DeepSeek, когда важна скорость ответа | Обе модели решили T07 верно; GLM дешевле на 42 %, DeepSeek быстрее в 2,3 раза. Для фоновых задач время некритично |
| Поиск по источникам и спецификациям, ссылки (T05, T06, T10) | DeepSeek V4 Flash | T06 решён с верной ссылкой на раздел RFC и корректной исторической справкой (в RFC 7231 — «Payload Too Large»). Для остальных моделей не проверено |
| Фоновая обработка без ограничений по времени и при требованиях к приватности | Qwen3.5 9B локально | Решает простую задачу верно, но через платный API невыгоден. Оправдан только локально, где токены бесплатны, а 5 минут на задачу приемлемы |
Наблюдавшиеся отказы
- В четырёх прогонах протокола зацикливания, преждевременной остановки, выдуманных ссылок и неверных вызовов инструментов нет. Все ответы засчитаны проверкой, единственная ссылка открывается.
- Отклонённый вызов инструмента с восстановлением (cron, проверки задания 2). Агент попытался выполнить скрипт через
-cи получил отказ «BLOCKED: Command flagged as dangerous… cron jobs run without a user present to approve it». После этого он сам нашёл другой путь и дописал строку вmonitoring.csv. - Различие режимов по безопасности. В одноразовом режиме
-zагент выполнилrm -rfбез подтверждения, а в cron такая же команда блокируется. Это не ошибка модели, а свойство режима: защитой от опасных команд здесь служит изоляция контейнера. - Сбой стенда, а не агента. В прогоне T06 отчёт
--usage-fileне записался: каталог был создан от root. Шаги и токены восстановлены из журнала сессий Hermes (state.db, таблицаsessions). Ошибка исправлена вrun.mjs.
Оценка полного протокола
По стоимости T07 полный протокол (10 задач × 3 повтора) обошёлся бы примерно в 100 ₽ для DeepSeek, 57 ₽ для GLM и 185 ₽ для Qwen — около 340 ₽ на три модели. Это нижняя граница: задачи с загрузкой веб-страниц (T01, T05, T08) добавляют в контекст тысячи токенов на шаг. Через OpenRouter часть DeepSeek стоила бы около 6 ₽. Стенд готов: node run.mjs --resume досчитает недостающие прогоны, и таблицы на странице обновятся из results.json.
Ограничения эксперимента
- Малая выборка. 3 прогона × 10 задач на модель — это 30 исходов. 95-процентный доверительный интервал для доли успехов 0,7 на 30 прогонах — примерно ±0,16. Разница в 10–15 п. п. между моделями статистически не различима. Выводы — о порядке величины, а не о рейтинге.
- Смена модели у провайдера. Идентификатор вроде
deepseek-v4-flashможет указывать на разные снимки, а OpenRouter может маршрутизировать запросы к разным хостерам с разной квантизацией. Фиксируются дата прогона, по возможности датированный идентификатор модели и digest образа Hermes. - Нестационарность внешнего мира. T05 зависит от текущих версий пакетов, задачи с поиском — от выдачи поисковика в момент прогона. Поэтому проверка T05 сверяется с реестром npm сразу после прогона, а не с заранее записанным ответом.
- Строгость и субъективность критериев. Автоматические проверки ищут конкретные признаки: правильный по сути ответ в неожиданной форме может быть засчитан как неуспех, и наоборот. Неуспехи просматриваются вручную, расхождения отмечаются в
annotations.json. Разметка ложных утверждений субъективна по определению. - Агент, а не модель. Измеряется связка «Hermes + модель»: системный промпт, набор инструментов и формат вызовов у всех моделей одинаковы, но разные модели по-разному с ними совместимы. Плохой результат может означать плохую совместимость с форматом инструментов Hermes, а не слабую модель.
- Нет отечественной и по-настоящему локальной модели. Все три модели работают через один шлюз llms.dotpoin.com. Qwen3.5 9B — малая открытая модель того класса, что запускают локально на GPU с 8–16 ГБ, но здесь она работает удалённо, поэтому её время ответа не равно локальному. GigaChat 2 Max (контекст 128K, вызов функций есть) в прогон не вошёл: нет ключа API. Бесплатного пакета для физлиц (25M токенов Max) хватило бы на весь эксперимент — это следующий шаг.