v0.14.0 выкатил стопку перф-работы, которая, сложенная вместе, делает Hermes Agent ощущением другой программы. Три заголовка из release notes:
- •~19 секунд срезаны с холодного старта. Размазаны по графу импортов, doctor-проверкам, lookup'у каталога моделей, welcome-баннеру.
- •
browser_consoleбыстрее в 180×. Одно постоянное CDP-соединение вместо открытия новой DevTools-сессии на каждый вызов. - •Кросс-сессионный 1-часовой Claude prompt-кеш.
/newне теряет тёплый prefix-кеш.
Ни один из этих пунктов не «переписали с нуля». Каждый — это серия маленьких, локализуемых PR, бьющих по конкретным hot path'ам. Этот пост — разбор PR-за-PR: что было медленным, что изменилось, и какие уроки годятся любому, кто пишет агента.
Точка отсчёта
Если ты запускал hermes в начале мая 2026, путь холодного старта выглядел так:
- 1.Стартует Python-интерпретатор (~100 мс)
- 2.
import hermesзапускает остаток графа импортов (~5–10 с) - 3.Plugin-discovery
hermesсканирует установленные плагины (~2–3 с) - 4.
hermes doctorпоследовательно гоняет API-connectivity-пробы (~3–5 с) - 5.Загружается skills-индекс, часто заново тянется по сети (~2–4 с)
- 6.Рендерится welcome-баннер (~1 с)
- 7.Появляется prompt
Итого 15–25 секунд до того, как ты можешь начать печатать. Достаточно, чтобы разрушить flow. Перф-волна v0.14.0 атакует каждый из этих шагов.
Волна по холодному старту (10+ PR)
Кеш скилов + ленивые импорты адаптеров (#22138)
Самая большая одиночная победа. Два параллельных изменения:
- 1.Skills-индекс закешан на диск. Раньше каждый вызов
hermesперечитывал директорию скилов и крутил лёгкую индексацию. Теперь индекс лежит в кеш-файле; пересобирается, только когда меняется директория (проверка по mtime). - 2.Тяжёлые SDK адаптеров стали ленивыми. Раньше: импорт
hermesтащил импорт SDK Feishu, SDK WhatsApp, всех voice/TTS-провайдеров, всех image-gen-SDK. Теперь: каждый откладывается до первого использования. Если ты никогда не пользуешься Feishu, Feishu-SDK никогда не грузится.
Оба изменения — в #22138, отрезали ~5–8 секунд. Паттерн lazy-import — невоспетый герой: он механически разбросан по кодовой базе, но не выглядит как один эффектный PR.
Пропустить агрессивный plugin-discovery на известных подкомандах (#22120)
Когда ты запускаешь hermes config set X Y, plugin-discovery не нужен. То же для hermes tools, hermes model, hermes doctor. Диспетчер теперь коротит plugin-discovery, когда команда — известный built-in. Сэкономлено ~2 секунды на большинстве CLI-вызовов.
Cache-first lookup на models.dev (#22808)
Hermes стучится в models.dev за канон-каталогом моделей. До v0.14.0 каждый старт hermes делал HTTP-вызов. Теперь: сначала читаем из disk-кеша; refetch только когда stale (>24 ч). Cache hit — ~5 мс вместо ~200–500 мс (сетевой round-trip).
Параллельные API-пробы в hermes doctor (#22766)
hermes doctor проверял «дотягиваюсь ли я до Nous Portal, OpenRouter, Anthropic, OpenAI» последовательно. Теперь: asyncio.gather их в кучу, и сдохший IMDS-проб (instance metadata service), который таймаутил на не-cloud-машинах, выкинут. ~3–5 секунд срезано с doctor'а в типичном случае.
chat -q пропускает welcome-баннер (#22904)
Если ты в single-query режиме (hermes chat -q "what's the time"), welcome-баннер — шум. v0.14.0 не рендерит его. ~1 секунда возвращена для scripted / автоматизационных сценариев.
Отложенные импорты по всему графу
Длинный хвост PR, каждый откладывает один тяжеловесный импорт:
- •
google-cloudв адаптереgoogle_chat— грузится только при первом использовании google chat (#22681) - •
QQAdapter,YuanbaoAdapter— отложены на уровне модуля через PEP 562 (#22790) - •
httpxв адаптере teams — только при первом webhook-вызове (#22831) - •
fal_client— только при первой генерации изображения (#22859)
Каждый PR маленький. Вместе — ещё 2–4 секунды.
Кеширование Nous-auth и .env-загрузок (#25341)
Экран All-Platforms в hermes tools раньше делал per-platform auth-пробы синхронно. Когда кеш приземлился, это упало с 14 секунд до меньше 1,5. Экран работает так же; просто не жжёт 14 секунд сетевого времени на каждый вызов.
Чистый итог
Сложи победы — получишь те самые 19 секунд из заголовка. По отдельности ни одна не драматическая; вместе программа ощущается отзывчивой.
История 180× browser_console (#23226)
Browser-tool в Hermes использует Chrome DevTools Protocol (CDP) для управления headless-Chrome'ом. До v0.14.0 каждое вычисление browser_console делало вот это:
- 1.Открыть новый CDP-WebSocket к Chrome
- 2.Дождаться handshake'а (~1–2 с)
- 3.Отправить JavaScript на вычисление
- 4.Прочитать результат
- 5.Закрыть WebSocket
Для цепочки вычислений — скажем, агент инспектирует страницу шаг за шагом — это было ~1,5 с на вычисление. Типичный workflow «посмотри на эту страницу и расскажи мне о ней» был мучительно медленным.
Изменение v0.14.0: один постоянный WebSocket на supervisor'а, общий для всех вызовов browser-tool'а. CDP-handshake происходит один раз за сессию; последующие вычисления полностью пропускают шаги 1–2 и просто шлют payload.
Результат: latency per-call упала с ~1,5 с до ~8 мс. Это ~180×.
Урок общий. Везде, где твой агент делает N tool-вызовов, и каждый открывает новое соединение: для нагрузок в темпе чата connection pooling бьёт параллелизм. Всё время уходит на установку соединения, а не на саму работу.
Кросс-сессионный 1-часовой Claude prompt-кеш (#23828, #25434, #24778)
Prompt-кеш Claude (feature Anthropic API) позволяет пометить кусок контекста как cacheable. Последующие запросы внутри TTL — исторически 5 минут — переиспользуют закешированный prefix с заметно меньшей стоимостью и latency.
До v0.14.0 Hermes использовал это внутри сессии: system-prompt + активные скилы кешировались, попадания в той же беседе были быстрее и дешевле. Но когда ты запускал /new, кеш инвалидировался, и следующая беседа начиналась холодной.
Работа v0.14.0, размазанная по трём PR, расширяет TTL кеша до 1 часа и заставляет ключ кеша переживать /new. Первый ответ в свежей сессии получает выгоду от тёплого кеша из прошлой. Для людей, у которых день — это много коротких бесед, это значимая победа по стоимости и latency.
Кеш также покрывает ветку фонового memory-review (#25434) — периодический процесс, который пересматривает и консолидирует твой memory-файл, теперь бьёт по тому же prompt-кешу, а не платит полную цену на каждой итерации.
Сопутствующий перф-фикс в этой области: ключ prompt-кеша использует timestamp, обрезанный до даты, чтобы кеши не разваливались на смене часового пояса. Шумное логирование gateway-DB-round-trip'ов завершает картину по наблюдаемости.
Какие инструменты вывели эти победы наружу
Как авторы нашли именно эти hot path'ы? Два ответа:
- •Профилирование холодного старта на реальной установке. Они гоняли
hermesпод таймингом и отслеживали, какие импорты дольше всех. Потом шли на них по одному. - •Жалобы пользователей, что «Hermes тормозит». То, что All-Platforms-экран
hermes toolsтормозит, было конкретным bug-report'ом; стоило этому всплыть — фикс был прямолинейным.
Никакой магии. Победы находятся через python -X importtime, cProfile и слушание тех, кто жалуется.
Уроки для любого автора агента
Если ты пишешь своего агента, перф-волна v0.14.0 обобщается до нескольких правил:
- 1.Не импортируй то, чем не пользуешься. Lazy-import каждого адаптера и SDK провайдера. Граф импортов — это твой холодный старт.
- 2.Кешируй всё, что стабильно. Skills-индекс, каталог моделей, auth-токены. Refetch только когда заведомо stale.
- 3.Пуль соединения. Если ты ходишь к API или к CDP-серверу больше одного раза за сессию, держи соединение.
- 4.Гоняй независимые пробы параллельно. Doctor-проверки, health-чеки, всё, где порядок не важен.
- 5.Не рендери UI, который не нужен. Welcome-баннеры, декоративный вывод — пропускай в не-интерактивных путях.
Ни одно из них не новость. Это стандартный перф-плейбук для любого CLI. Интересно в v0.14.0 то, что весь плейбук был применён в одном release-окне, и результат был ощутим в момент, когда пользователи обновились.
Если твой Hermes ощущался хрупким в начале мая, v0.14.0 — это релиз, в котором холодный путь исчез.