Предисловие
Я уже довольно долго провожу время за разработкой с AI-агентами. Пробовал разное, щупал разные подходы, но на данный момент моё предпочтение всё-таки пало на Codex.
И вроде бы всё красиво.
Coding-агент умеет читать проект, менять код, запускать тесты, делать ревью, искать ошибки… Ну красота же!
Но потом начинается бытовуха.
В одном чате ты объяснил ему:
Импорты всегда сверху. Проверки прав не размазываем по use case. DTO маппим явно. Алиасы после рефакторинга не оставляем. Старые compatibility-модули не тащим. Тесты запускаем вот так.
В другом чате объяснил то же самое.
В третьем — опять.
В четвёртом уже хочется не промпт писать, а табличку повесить:
Codex, ну ты же уже это делал…
И самое неприятное здесь даже не раздражение. Хотя оно тоже есть, да.
Главная проблема — токены.
Каждый раз, когда мы руками пихаем в запрос длинную простыню правил, старых решений, архитектурных договорённостей и фраз в стиле «вот тут мы уже делали похожее», мы платим контекстом за то, что по смыслу должно быть памятью.
А память — это не когда ты каждый раз пересказываешь человеку всю историю проекта с нуля.
Память — это когда он сам такой:
Ага, я помню. Тут у нас права через спецификации. Импорты не трогаем. Старые alias-модули не оставляем. Поехали.
Вот примерно такую штуку я и захотел сделать для Codex.
Так появился Hermes Codex Plugin.
TL;DR
Если совсем коротко:
Hermes Codex Plugin — это локальная память для Codex, которая хранит правила проекта, прошлые решения, summaries задач и помогает доставать только маленькие релевантные куски контекста, вместо того чтобы каждый раз кормить агента огромным промптом.
Без векторной базы. Без отдельного embedding-сервиса. Без демона на фоне. Без «давайте поднимем ещё один микросервис, потому что можем».
Просто:
SQLite + FTS5 + MCP tools + Codex hooks + немного здравого смысла
И всё это ради одной простой идеи:
Не надо платить токенами за амнезию агента.
Что вообще такое Hermes Agent
Hermes Agent — это агент, который:
перед работой вспоминает прошлые решения;
достаёт правила проекта;
находит похожие workflow;
после работы сохраняет компактное summary;
в следующий раз не начинает с нуля.
То есть задача не в том, чтобы сделать Codex магически умнее.
Задача проще:
Сделать так, чтобы агент меньше страдал амнезией и меньше тратил контекст на повторение очевидных вещей.
Почему это вообще нужно
В реальной разработке большая часть полезного знания живёт не только в коде.
Код — это финальная форма. А вот решения, причины и договорённости часто живут где-то рядом:
почему выбрали именно такую архитектуру;
где должны лежать проверки прав;
какие импорты считаются нормальными, а какие — нет;
какие тесты запускать перед релизом;
какие старые решения уже признаны плохими;
какие ошибки агент уже делал;
какой стиль ревью принят в проекте;
какие файлы лучше не трогать без крайней необходимости.
Часть этого можно положить в AGENTS.md.
Часть — в README.md.
Часть — в документацию.
Но есть огромный пласт знания, который появляется прямо в процессе работы с агентом:
«Не, вот так не делай». «Мы это уже пробовали». «В этом проекте так не принято». «Вот этот подход норм, давай его переиспользовать». «Не надо опять тащить infrastructure в application layer!»
И вот это всё обычно остаётся в чате.
А потом чат закончился.
И агент снова как будто впервые видит ваш проект.
Ну классика…
Почему длинный промпт — плохая память
Самый простой способ дать агенту контекст — вставить всё руками:
Ты работаешь в таком-то проекте. Архитектура такая-то. Правила такие-то. Проверки прав делаем так-то. Вот старый пример. Вот ещё старый пример. Вот кусок обсуждения из прошлого чата. Вот список команд. Вот ещё 40 пунктов, потому что иначе ты опять забудешь.
Работает?
Да.
Удобно?
Нет.
Дёшево?
Тоже нет.
Проблема в том, что длинный промпт — это не память. Это чемодан без колёсиков.
Его можно каждый раз тащить с собой, но через пару задач ты уже думаешь не о коде, а о том, как бы не расплескать половину контекста.
У coding-агента есть ещё одна особенность: он работает в цикле.
прочитал запрос -> подумал -> вызвал инструмент -> получил вывод -> снова подумал -> полез в файл -> запустил тесты -> получил ошибку -> снова подумал -> исправил
И чем длиннее тред, тем больше истории едет рядом с задачей.
В какой-то момент агенту надо не только решить задачу, но ещё и протащить через себя весь накопленный багаж.
Отсюда три проблемы:
Проблема |
Что происходит |
|---|---|
Дорого |
лишний контекст всё равно считается |
Шумно |
модель читает много нерелевантного |
Нестабильно |
важное правило может утонуть в старых сообщениях |
Идея Hermes простая:
Не надо каждый раз нести весь чемодан. Давайте вытащим из него только отвёртку, которая нужна прямо сейчас.
Что делает Hermes Codex Plugin
Hermes Codex Plugin — это локальный плагин для Codex, который добавляет ему долговременную память, поиск по старым чатам и путь от повторяемых правил к reusable skills.
Если совсем коротко, он делает четыре вещи.
1. Сохраняет полезный контекст
Например:
пользовательские правила;
архитектурные решения;
краткие summaries задач;
повторяемые workflow;
важные замечания по проекту.
То есть не весь чат целиком, а нормальную выжимку:
Project rule: Permission checks should be represented as reusable specifications. The same rule must support in-memory checks and SQL filtering.
2. Ищет релевантную память перед задачей
Когда приходит новый запрос, плагин может поискать похожие правила и прошлые решения.
Не магия. Не телепатия. Просто локальный поиск по сохранённой памяти.
3. Подкладывает в Codex маленький релевантный фрагмент
Не весь старый чат на 20 тысяч токенов.
А, например:
Relevant memory: In this project, permission logic should live in reusable specifications. Application code uses the same specification for in-memory checks. Infrastructure translates it into SQL predicates.
То есть в контекст попадает не «вся жизнь проекта», а ровно то, что может пригодиться для текущей задачи.
4. Помогает превращать повторяемые правила в SKILL.md
Если одно и то же правило всплывает снова и снова, возможно, это уже не просто memory entry.
Это навык.
Workflow.
То, что стоит оформить отдельно и переиспользовать нормально.
Почему я специально сделал это скучно
Когда речь заходит о памяти для агента, очень быстро хочется сделать «как взрослые»:
embeddings;
vector database;
semantic search;
reranking;
отдельный сервис;
UI;
синхронизацию;
очередь задач;
Kubernetes;
а потом ещё мониторинг Kubernetes, потому что он тоже иногда хочет кушать.
Но я специально пошёл в другую сторону.
Hermes хранит память локально в SQLite.
Для поиска используется FTS5, а если он недоступен — обычный fallback через LIKE.
Да, это звучит скучно.
Но в данном случае скучно — это комплимент!
Потому что память агента должна быть:
локальной;
inspectable;
дешёвой;
простой в отладке;
без зависимости от внешних embedding API;
без отдельной цены за индексацию;
без ощущения, что ты поставил плагин, а получил маленькую инфраструктурную ферму.
Большая часть правил проекта — это не поэзия, где нужен сверхтонкий семантический поиск.
Обычно это вполне конкретные штуки:
imports at top permission specification run unit tests do not keep alias modules DTO mapper project scoped memory release workflow
Для такого lexical search часто уже достаточно хорош.
И самое приятное: если агент что-то вспомнил — можно открыть базу и посмотреть, почему.
Как это выглядит в работе
Допустим, я пишу Codex:
Добавь новый use case для проверки доступа к файлу.
Без памяти агент может начать изобретать подход заново.
Он полезет по проекту, найдёт пару файлов, может сделать проверку прямо в use case, может отдельно продублировать SQL-фильтр, может забыть старую договорённость…
Ну, бывает.
С Hermes сценарий другой.
Перед тем как Codex начнёт задачу, плагин может найти в локальной памяти что-то вроде:
Project rule: Permission checks should be represented as reusable specifications. The same rule must support in-memory checks and SQL filtering. Previous task summary: We discussed splitting permission logic into specification objects so application code can check a single object and infrastructure can translate the same rule into a query predicate.
И в контекст текущей задачи попадает не весь старый диалог, а вот такая маленькая выжимка.
Это принципиально другая экономика контекста.
Мы не говорим модели:
Держи всё, вдруг пригодится.
Мы говорим:
Вот три факта, которые реально похожи на текущую задачу. Пользуйся.
Где здесь экономия токенов
Тут нет волшебства.
SQLite не превращается в LLM.
FTS5 не начинает понимать архитектуру вашего проекта на уровне senior-разработчика.
Экономия появляется из более простой вещи:
Мы перестаём подсовывать модели лишний текст.
Было так:
Новый запрос + длинный системный промпт + правила проекта + старые решения + куски прошлых чатов + напоминание про стиль + напоминание про тесты + ещё чуть-чуть, чтобы точно не забыл
Стало так:
Новый запрос + 2–5 компактных memory entries
Hermes не пытается заменить контекстное окно.
Он пытается не мусорить в нём.
Особенно это полезно в задачах, где правила проекта стабильные, а сами задачи разные:
рефакторинг слоёв;
права доступа;
миграции;
добавление API endpoint;
ревью PR;
генерация тестов;
release-процессы;
работа с DDD-подобной структурой;
поддержка одного и того же стиля кода.
Каждый раз объяснять это руками — ну такое…
Один раз сохранить как память и потом доставать по необходимости — намного приятнее.
Hooks: где память цепляется к Codex
Плагин использует hooks Codex.
Идея примерно такая:
SessionStart -> подложить свежую локальную память UserPromptSubmit -> сохранить prompt и добавить релевантный recall Stop -> при необходимости сохранить ответ ассистента PreCompact -> сохранить snapshot перед compaction
То есть память не живёт где-то отдельно от рабочего процесса.
Она подключается в моменты, где это действительно полезно:
в начале сессии;
перед обработкой пользовательского запроса;
после ответа;
перед сжатием контекста.
На практике это похоже на маленького секретаря, который стоит рядом с агентом и шепчет:
Мы уже обсуждали похожую задачу. Вот правило. Вот прошлое решение. Вот summary. Не надо опять изобретать велосипед.
MCP tools: памятью можно управлять руками
Кроме hooks, плагин поднимает MCP-инструменты.
И это важный момент.
Память не должна быть чёрным ящиком.
Основные инструменты:
hermes_codex_search hermes_codex_search_chats hermes_codex_remember hermes_codex_remember_summary hermes_codex_forget hermes_codex_stats hermes_codex_propose_skill hermes_codex_write_skill
То есть можно не только автоматически искать и сохранять, но и явно сказать:
Запомни: в этом проекте все команды application layer не должны импортировать infrastructure.
Или:
Найди, что мы раньше обсуждали про permissions.
Или:
Предложи skill на основе правил про release workflow.
Мне нравится, что это не «память где-то там».
Её можно:
посмотреть;
почистить;
дополнить;
удалить;
превратить в более устойчивую инструкцию.
Memory → Skill: когда правило выросло
Память хороша для фактов и решений.
Но если одно и то же правило всплывает много раз, это уже не просто memory entry.
Это workflow.
Например:
Перед релизом: 1. прогнать unit tests; 2. проверить changelog; 3. обновить version; 4. сделать compileall; 5. не коммитить raw logs и secrets.
Можно каждый раз искать это в памяти.
А можно однажды оформить в SKILL.md.
В этом и смысл skill evolution:
разовая просьба -> повторяемое правило -> сохранённая память -> reusable skill -> стабильный workflow
Hermes не только вспоминает прошлое.
Он помогает понять, какие повторяемые паттерны уже пора вынести в отдельный навык.
Чем это отличается от AGENTS.md
Справедливый вопрос:
А зачем всё это, если можно просто написать
AGENTS.md?
Ответ: AGENTS.md всё ещё нужен.
Я не вижу Hermes как замену AGENTS.md.
Скорее так:
Инструмент |
Для чего |
|---|---|
|
стабильные правила проекта |
Hermes memory |
история решений, summaries, временные договорённости |
Skills |
оформленные повторяемые workflow |
Если правило железобетонное и относится ко всему репозиторию — ему место в AGENTS.md.
Если правило родилось в чате, пока ещё проверяется, относится к конкретной задаче или может потом стать skill — ему удобно сначала пожить в Hermes.
А если оно повторилось достаточно раз — можно превратить его в SKILL.md.
Установка
Из корня репозитория:
codex plugin marketplace add . codex plugin add hermes-codex-plugin@hermes-codex-plugin
Проверить, что Codex видит плагин:
codex plugin list --marketplace hermes-codex-plugin codex mcp get hermes-codex-plugin
Для локального теста через CLI можно использовать отдельную временную базу:
cd plugins/hermes-codex-plugin export HERMES_CODEX_DB=/tmp/hermes-codex-plugin.sqlite3 PYTHONPATH=src python3 -m hermes_codex_plugin.presentation.cli.main init PYTHONPATH=src python3 -m hermes_codex_plugin.presentation.cli.main remember \ "Always run the unit test suite before release." \ --kind rule \ --scope project PYTHONPATH=src python3 -m hermes_codex_plugin.presentation.cli.main search "unit test suite" PYTHONPATH=src python3 -m hermes_codex_plugin.presentation.cli.main stats
Какой должна быть хорошая память
Важный момент: в память не надо сохранять всё подряд.
Память должна быть компактной.
Плохая память:
Вот огромный transcript, где мы 40 минут обсуждали архитектуру, потом Codex ошибся, потом мы спорили, потом всё починили, потом ещё кто-то вспомнил старый PR...
Хорошая память:
Project rule: Permission logic should live in reusable specifications. Application code uses the same specification for in-memory checks, infrastructure translates it into SQL predicates.
Ещё пример:
User preference: When proposing refactoring, include a Codex-ready prompt at the end. Keep it concrete and exclude unrelated base use cases.
Вот такая память реально полезна.
Она короткая. Она actionable. Она не превращает контекст в болото.
Про приватность и секреты
Так как память локальная, она не требует отправлять старые чаты в отдельный embedding-сервис.
Это плюс.
Но это не значит, что туда можно бездумно складывать всё подряд.
В проекте есть редактирование очевидных токенов, bearer-ключей, паролей и JWT-похожих значений перед сохранением.
Но давайте честно:
Это safety layer, а не полноценная DLP-система.
Поэтому правило простое:
Не сохраняйте секреты намеренно.
В память должны попадать:
правила;
решения;
summaries;
workflow;
полезные замечания по проекту.
Не должны попадать:
.env;production-логи;
приватные дампы;
реальные ключи;
bearer-токены;
пароли;
всё, после чего хочется сказать: «ой…»
Ограничения
Важно честно сказать: Hermes Codex Plugin — это не магическая память из фантастики.
Это простой локальный инструмент, и у него есть ограничения.
Например:
поиск лексический, а не семантический;
skill generation эвристический;
результат генерации skills надо ревьюить;
UI пока нет;
фонового демона нет;
память надо поддерживать в чистоте;
плохие записи в памяти будут мешать так же, как плохие инструкции в промпте.
То есть если сохранить мусор, агент будет вспоминать мусор.
Junk in — junk out. Только теперь локально и с SQLite.
Где честный benchmark?
Я не хочу писать в стиле:
Экономит 90% токенов!!! Ускоряет разработку в 12 раз!!! Senior-разработчики ненавидят его!!!
Потому что без нормального замера это будет не инженерия, а маркетинговая магия.
Правильный benchmark я вижу так:
Берём набор типовых задач по одному репозиторию.
Прогоняем Codex без Hermes.
Прогоняем Codex с Hermes.
-
Сравниваем:
input tokens;
output tokens;
число повторных уточнений;
время до готового diff;
количество правок после ревью;
процент задач, где агент вспомнил нужное правило.
Только после этого можно честно говорить цифрами.
Пока моя формулировка скромнее:
Hermes снижает токеновую нагрузку там, где вы раньше вручную повторяли длинный стабильный контекст, потому что заменяет простыни промпта на маленькие релевантные memory entries.
И для меня этого уже достаточно, чтобы идея была полезной.
Что дальше
Мне интересно развивать Hermes в нескольких направлениях:
лучшее deduplication правил;
удобный просмотр памяти;
импорт summaries из старых Codex-сессий;
более умное предложение skills;
опциональный semantic search, но так, чтобы не сломать local-first подход;
нормальные benchmark-сценарии;
больше готовых примеров для реальных Python/TypeScript-проектов.
Но главное направление я бы не менял.
Память должна оставаться:
простой;
локальной;
проверяемой;
дешёвой;
понятной.
Потому что агентская память, которую нельзя посмотреть и понять, очень быстро превращается в ещё один источник странного поведения.
А странного поведения у нас и так хватает, спасибо.
Итог
Hermes Codex Plugin — это попытка сделать Codex менее забывчивым без тяжёлой инфраструктуры.
Не новая модель. Не облачная база знаний. Не RAG-комбайн с тремя сервисами.
А маленькая локальная прослойка:
старые решения + правила проекта + summaries задач + SQLite FTS + MCP tools + Codex hooks = меньше повторного контекста в промпте
Мне нравится думать об этом так:
Хороший coding-агент должен не только писать код, но и помнить, как вы договорились писать код.
Если каждый раз объяснять агенту одно и то же, мы не используем ИИ.
Мы просто очень быстро печатаем документацию в чат.
Hermes пытается сделать следующий шаг: пусть повторяемые правила живут не в голове пользователя и не в километровом промпте, а в локальной памяти, откуда Codex достанет ровно то, что нужно для текущей задачи.
Код проекта: Hermes-Codex-Plugin
Будет интересно услышать в комментариях: как вы сейчас решаете проблему памяти у coding-агентов?
AGENTS.md? Длинные промпты? Свои MCP? Векторные базы? Скрипты?
Или просто старое доброе:
«Надеюсь, в этот раз не забудет…»
Комментарии (11)

IlyaStroynov
09.06.2026 10:49Работаю с hermes agent, всяких вспомогательных .md хранит кучу, токены улетают сильно быстрее, чем через родной codex cli, есть фичи, типа канбан доски, которые перевешивают.

TecHMeaT
09.06.2026 10:49Я для Hermes сделал память с нативной интеграцией, где есть горячий слой и долговременная память, которая хранится в Obsidian. Это общая память с Claude Code и Codex, все они работают на маке и VPS. Как и у вас используется SQLite с FTS5.

caveboy
09.06.2026 10:49Я чет прям описание своего проекта прочитал, пописываю потихоньку с февраля, на гитхабе в публичном доступе лежит. (если кому надо ссылку скину, может звездочку поставите :) Думаю, а почему его только боты скачивают, теперь знаю почему:) Если кому интересно, почему БД лучше чем использование AGENTS.md + MEMORY.md могу популярно в нескольких словах объяснить: Маркдаун файлы - это по сути статика, база данных - она живая. Затраты человека или агента на правку этих файлов сильно выше, чем через правильно приготовленный MCP rпростыми командами типа запиши правило X, или подними задачу Y. Более того, постановка задачи автоматизируется, превращаясь в непринужденный диалог с агентом. Кто пишет ручками пишет *.md для агента - срочно поднимайтесь с предыдущей ступени развития вайбкодинга :)
Я вот интервью агента попросил записать:
https://github.com/Utundry/sloplesscode/blob/master/docs/AGENT_MCP_INTERVIEW.md
Inkognitoo
09.06.2026 10:49Все равно не понял, чем бд в этом плане лучше. Запиши правило X в бд или в файл rules.md, в чем будет принципиальная разница?
md файл ещё и версионировать через git удобно и между командой делить проще

caveboy
09.06.2026 10:49В базе данных можно хранить декомпозированно. и доставать только релевантные части

4wards1
09.06.2026 10:49Markdown-файлов можно сделать несколько и связать их ссылками.
Безусловно, если хочется изобрести свой велосипед, то никто ни в силах помешать. Но преимущества этого велосипеда высосаны из пальца и не выдерживают критики.

caveboy
09.06.2026 10:49Не буду спорить, каждый выбирает то, что ему удобно, или то, к чему привык, в крайнем случает, то, к чему принуждают. Сам являюсь сторонником правила: хочешь понять как работает инструмент, сделай его сам.

Boyscout1234
09.06.2026 10:49Я работаю по принципу кодекс программист - чатжпт агент. Я написал с помощью него целую софтину сотруднику. И на данном этапе он работает без сбоев и багов. Единственное что на данный момент вношу правки, исправляю баги, дорабатываю ПО. Его память по проекту — это файлы документации внутри репозитория, которые мы специально ведём. А для экономии токенов использую: "Контекст проекта актуален в docs/AI_CONTEXT.md и docs/CURRENT_STATE.md. Прочитай только эти два файла и PATCH_RULES.md." А для маленьких исправлений достаточно "Прочитай docs/AI_CONTEXT.md, docs/CURRENT_STATE.md, docs/PATCH_RULES.md." И я уже прошел релиз, сделал кучу мелких исправлений. И уже расширил функционал, при этом он не сломал ничего при добавлении нового. Только он не всегда помни какие были исправления графический в старом и добавляет эти же самые баги графические в новом функционале.
reallord
А чем использование БД лучше чем использование AGENTS.md + MEMORY.md ?
Модель все равно читает текст. Просто в одном случае с диска, в другом случае из БД.
Текст одинаковый для анализа моделью, экономии контекста нет.
vitaly_il1
+1 - хотел задать тот же вопрос