Hermes Agent (Nous Research) переводит агента из «одноразового чата» в stateful runtime: эпизодическая память в ~/.hermes/state.db (SQLite WAL + FTS5), семантическая — в MEMORY.md / USER.md, gateway держит Telegram/Discord/CLI на одном SessionDB. Кто строит 7×24 agent gateway, упирается не в prompt engineering, а в конкуренцию записи в SQLite, рост WAL на NVMe и отсутствие стабильного хоста без сна ноутбука. Ниже — шесть аппаратно-операционных гейтов, таблица слоёв памяти, механика FTS5/trigram, UMA Mac Mini M4 (120 / 273 GB/s), семь шагов деплоя и матрица «локальный Mac vs аренда MACCOME».
Hermes заменил per-session JSONL на единый SQLite — правильный шаг для cross-channel recall. Но production gateway добавляет жёсткие ограничения, которые README не закрывает:
BEGIN IMMEDIATE, timeout 1 s и jitter-retry (20–150 ms, до 15 попыток) — convoy effect и «database is locked» под пиковой нагрузкой Telegram.state.db-wal + state.db-shm на домашнем SSD — измеримый износ; на арендованном инстансе TBW — OpEx платформы.messages_fts_trigram для CJK/substring; латиница идёт в messages_fts (unicode61). Неверный маршрут — «пустой recall» при живой истории.parent_session_id образует цепочки при переполнении контекста. Поиск по title без понимания lineage возвращает устаревший fork, не актуальную ветку.Архитектура памяти Hermes решает софтверный барьер; железный и операционный — на стороне хоста.
Hermes не сводит память к vector DB. Три явных tier с разной latency и consistency:
sessions, messages, billing/reasoning columns, schema_version 11. Полная история tool_calls (JSON), finish_reason, codex replay items — для API replay через get_messages_as_conversation().messages_fts и trigram-таблицу. search_messages() с source_filter, role_filter, snippet с >>>match<<<.~/.hermes/memories/MEMORY.md (факты мира агента), USER.md (модель пользователя), skills/ с SKILL.md — bootstrap в system prompt, не в SQLite.Batch runner и RL trajectories намеренно вынесены из state.db — не путать с gateway persistence.
Reasoning replay columns: messages хранят reasoning, reasoning_content, reasoning_details (JSON), codex_reasoning_items, codex_message_items — schema v6–v9. Gateway при replay в OpenAI-compatible API восстанавливает полный chain-of-thought без re-derivation из assistant text. Это увеличивает row size в SQLite и FTS index footprint после v11 re-index — планируйте disk headroom: 100k messages × avg 2 KB content ≈ 200 MB main file + FTS overhead ~1,5–2×.
state_meta key/value: отдельная таблица для runtime flags вне session scope — migration version hints, feature toggles. Не дублирует MEMORY.md; используется кодом, не LLM recall path.
| Слой | Хранилище | Latency | Конкурентность | Типичный сбой |
|---|---|---|---|---|
| Эпизодическая | state.db WAL | ms (local NVMe) | 1 writer + N readers | database locked без retry |
| FTS5 recall | messages_fts + trigram | sub-ms на <1M rows | read-only при search | CJK query в unicode61 table |
| Семантическая | MEMORY.md, USER.md | disk read per turn | file lock OS | раздувание bootstrap tokens |
| Skills | skills/*/SKILL.md | on-demand load | git worktree split | дублирующие skill без index |
| Gateway channels | source tag в sessions | network-bound | multi-platform fan-in | offline host = broken webhook |
Сравнение с OpenClaw: там memory_search и AGENTS.md — см. чеклист bootstrap и memory_search. Hermes жёстче типизирует billing и session lineage в SQL; OpenClaw гибче в channel ecosystem. На одном Mac Mini оба стека возможны параллельно при разнесении HERMES_HOME и OPENCLAW_STATE_DIR.
Каждый append_message() — транзакция с немедленным FTS sync. Критические константы из hermes_state.py:
# Write contention (SessionDB)
_WRITE_MAX_RETRIES = 15
_WRITE_RETRY_MIN_S = 0.020 # 20ms jitter floor
_WRITE_RETRY_MAX_S = 0.150 # 150ms jitter ceiling
_CHECKPOINT_EVERY_N_WRITES = 50 # WAL PASSIVE checkpoint
# FTS5 external-content sync (simplified)
CREATE TRIGGER messages_fts_insert AFTER INSERT ON messages BEGIN
INSERT INTO messages_fts(rowid, content) VALUES (new.id, new.content);
END;WAL mode даёт concurrent readers (CLI history browse во время gateway write) при одном writer. Checkpoint PASSIVE не блокирует readers агрессивно, но при бурсте Telegram-группы 50-write порог срабатывает чаще — NVMe write amp растёт линейно с message rate, не с user count.
Schema v11 переиндексировала FTS на inline mode с полями tool_name + tool_calls — поиск «terminal deploy error» находит tool rows, не только assistant text. Миграции idempotent через _reconcile_columns(); version-gated chain — только для FTS/trigram backfill.
Session compression split: gateway при переполнении контекста создаёт child session с parent_session_id. Title lineage (Fix Docker Build #2) — механизм continuity без re-ingest всей истории в prompt. SQL recursive CTE из документации — единственный корректный способ audit long-running agent.
FTS5 query surface: search_messages() принимает синтаксис FTS5 — implicit AND для docker deployment, quoted phrase "exact phrase", boolean OR/NOT, prefix deploy*. Метод _sanitize_fts5_query() оборачивает hyphenated terms в кавычки и срезает dangling operators (hello AND → hello). Результат включает snippet с маркерами >>>match<<< и context — одно сообщение до/после match (truncate 200 chars). Фильтры source_filter=["cli"] и exclude_sources=["telegram"] позволяют разделить recall по каналам без второго индекса.
Billing columns в sessions: schema v5+ хранит input_tokens, output_tokens, cache_read_tokens, cache_write_tokens, reasoning_tokens, estimated_cost_usd, pricing_version. Gateway агрегирует spend per session — SQL GROUP BY model ORDER BY total_cost DESC из документации даёт FinOps slice без внешнего ledger. Для 7×24 production это критично: persistent memory без cost attribution превращается в некontrollируемый API burn.
Hermes gateway — long-lived process: принимает Telegram, Discord, CLI, тегирует source в sessions, пишет в общий state.db. Архитектурные следствия для Mac Mini M4:
HERMES_HOME per tenant.gateway.log, agent.log, errors.log — triage отдельно от SQL; disk fill на 256 GB аренде решается prune sessions (prune_sessions(older_than_days=90)), не rm -rf state.db.~/.hermes/cron/ и skills/.hub/ живут вне state.db — gateway читает SKILL.md on-demand; не смешивайте batch runner trajectories с episodic SQL без явного export.Gateway persistence означает: process death ≠ memory loss, но disk corruption или uncheckpointed WAL после hard reboot — риск. Graceful launchctl stop + PASSIVE checkpoint перед maintenance window обязателен; на MACCOME snapshot делается на уровне платформы до reboot.
Persistent memory Hermes — в основном SQLite на NVMe (5–6 GB/s sequential на внутреннем SSD Mac Mini). Но если на том же хосте крутится локальный Metal-инференс, UMA bandwidth становится co-tenant:
| Чип | Unified memory (max) | Bandwidth | Hermes gateway only | Gateway + local 7B Q4 | Gateway + ds4-class model |
|---|---|---|---|---|---|
| M4 | 32 ГБ | 120 GB/s | достаточно | 32 ГБ tight | не влезает |
| M4 Pro | 64 ГБ | 273 GB/s | комфортно | 48–64 ГБ OK | только API offload |
| Studio Ultra | 512 ГБ | ~800 GB/s | overkill | запас под MoE | см. ds4 tier |
UMA без PCIe round-trip — CPU page cache для SQLite и GPU weights читают один физический pool. На M4 Pro 273 GB/s — официальная спецификация Apple; для gateway-only workload это headroom, для concurrent MoE prefill — уже bottleneck рядом с memory capacity.
Metal не ускоряет SQLite, но определяет, можно ли colocate «память агента» и «мозг агента» на одном Mini без swap. Swap на macOS убивает gateway latency: WAL fsync + LLM page fault = multi-second Telegram reply.
7×24 профиль Mac Mini M4: 15 W idle class, 10Gb Ethernet option, нет battery thermal throttle ноутбука. launchd KeepAlive для gateway — штатный паттерн; на арендованном MACCOME инстансе тот же plist без борьбы с локальным sleep policy.
NVMe vs UMA — разделение ролей: SQLite page cache и WAL segments живут в DRAM через mmap; sequential read state.db на internal SSD Mac Mini — до ~5–6 GB/s. UMA bandwidth (120 / 273 GB/s) ограничивает только GPU/ANE path локальной модели. Типичный Hermes gateway без local LLM: CPU-bound на JSON serialize tool_calls, I/O-bound на WAL append — UMA headroom избыточен, зато 16 GB RAM floor быстро исчерпывается при одновременном macOS GUI + gateway + Ollama.
Metal inference colocation: weights 7B Q4 (~4,5 GiB) + KV cache + SQLite buffer pool + macOS — на 24 GB M4 остаётся <8 GB margin. Любой context spike в gateway (compression split + FTS backfill v11 на большой messages table) может trigger memory pressure → swap → WAL fsync latency spike. M4 Pro 48 GB — практический минимум для «gateway + small local model» без daily swap events.
pip install hermes-agent или clone NousResearch/hermes-agent; export HERMES_HOME=~/.hermes (override для multi-tenant).SessionDB() создаёт schema v11, WAL, FTS triggers. Проверка: sqlite3 ~/.hermes/state.db "SELECT * FROM schema_version;" → 11.cli, telegram) пишутся автоматически в sessions.source.KeepAlive, StandardOutPath → ~/.hermes/logs/gateway.log, ThrottleInterval 10 s на crash loop.hermes search "deploy error" или Python db.search_messages("docker", source_filter=["telegram"]) — snippet с match markers.db.prune_sessions(older_than_days=90, source="telegram") — только ended sessions; не удаляет active lineage. Настройте cron на арендованном Mac через ~/.hermes/cron/ или system crontab.ssh -L 8787:127.0.0.1:8787 user@mac-rental для CLI; backup state.db* через export_all() перед schema bump. Центр помощи MACCOME — типовые plist и firewall.После деплоя мониторьте три сигнала: (1) размер state.db-wal относительно main file — WAL >2× main без checkpoint = contention или missing PASSIVE checkpoint; (2) errors.log на «database is locked» — индикатор retry exhaustion; (3) gateway.log latency p95 reply time — коррелирует с swap на undersized RAM tier.
export HERMES_HOME=$HOME/.hermes pip install hermes-agent hermes gateway start --bind 127.0.0.1 # launchd snippet (~/Library/LaunchAgents/com.hermes.gateway.plist) # KeepAlive + RunAtLoad + StandardErrorPath → ~/.hermes/logs/errors.log sqlite3 $HERMES_HOME/state.db "PRAGMA journal_mode;" # → wal sqlite3 $HERMES_HOME/state.db "SELECT COUNT(*) FROM messages_fts;"
tool_name + tool_calls; trigram table с v10 для CJK. Документация: session-storage.Сравнение «купить Mac Mini M4 Pro 64 ГБ для Hermes gateway» vs «аренда MACCOME 24/7». Электричество и админка в Capex не входят.
| Вариант | Capex | 3 года net | state.db / WAL | 7×24 SLA | Tier elasticity |
|---|---|---|---|---|---|
| M4 Pro 64 ГБ покупка | ~450–550 тыс. ₽ | ~250–300 тыс. ₽ net | свой NVMe TBW | домашний uplink | RAM soldered |
| M4 24 ГБ покупка | ~200–250 тыс. ₽ | ~120–150 тыс. ₽ net | тот же риск | ноутбук ≠ Mini | нет апгрейда RAM |
| MACCOME M4/M4 Pro / мес | 0 | 36 × месяц | platform NVMe | DC uplink | 24→48→64 ГБ |
| MACCOME 128 ГБ+ / мес | 0 | для local LLM colocate | + model weights | SSH/VNC 24/7 | 128→256 tier |
Покупка Mini для Hermes таит три ловушки: (a) soldered RAM — gateway сегодня на API, завтра с Ollama 13B = новая машина; (b) TBW домашнего SSD на WAL 7×24 без prune policy; (c) residential uplink и sleep policy ноутбука ломают Telegram webhook continuity. Локальный POC на M4 24 ГБ — разумный первый шаг; production multi-channel gateway с FTS recall и optional Metal sidecar — класс задач для выделенного Mac Mini M4 на MACCOME: OpEx, persistent ~/.hermes на платформенном NVMe, launchd без компромиссов с battery, tier 48→128 ГБ без перепайки.
Альтернатива «Docker на VPS» для Hermes gateway ломается на трёх точках: Linux container не даёт Metal для local inference sidecar; bind mount SQLite WAL через network FS (NFS/EBS) — documented path к corruption; egress webhook latency из US-East в EU Telegram user base добавляет 80–150 ms без выигрыша в стоимости относительно Mac Mini rental в том же регионе. VPS имеет смысл только для API-only gateway без local weights — но тогда Mac Mini M4 16 GB на MACCOME закрывает тот же profile с native SQLite fsync semantics.
Матрица buy vs rent: TCO Mac Mini M4. Multi-model routing рядом с Hermes: OpenRouter matrix. POC без Capex: оформить заказ на почасовую аренду.
Hermes Agent доказал, что persistent agent memory не требует Postgres ни Pinecone на day one — WAL SQLite, FTS5 dual-tokenizer, session lineage и gateway fan-in закрывают episodic recall. Оставшийся барьер — хост, который не засыпает, не сжигает свой SSD и имеет headroom UMA под colocated inference.
Для команды, которая уже настроила gateway и упёрлась в lock contention logs или swap на 16 ГБ — апгрейд не в prompt, а в Mac Mini M4 Pro 48–64 ГБ или аренду MACCOME с тем же launchd plist. Metal/UMA на Apple Silicon — не маркетинг Hermes, а физический потолок colocation «memory DB + LLM weights» на одном silicon pool.
FAQ
Hermes Agent vs OpenClaw для persistent memory?
Hermes — SQL-native episodic store + FTS5; OpenClaw — markdown memory_search и AGENTS.md bootstrap. Разные модели; на одном Mac разнесите HERMES_HOME и OPENCLAW_STATE_DIR. См. чеклист OpenClaw memory.
Сколько RAM нужно для Hermes gateway 7×24?
API-only gateway: 16–24 ГБ на M4. С локальным 7B Q4 через Metal: M4 Pro 48 ГБ минимум. Frontier local — 128 ГБ+ аренда; см. тарифы MACCOME.
Как бэкапить state.db без corruption?
Используйте export_all() или SQLite backup API при живом WAL — не копируйте state.db-wal mid-write. Перед upgrade schema v11 — полный export; центр помощи MACCOME — snapshot перед maintenance window.
Можно ли Hermes gateway на ноутбуке?
POC — да. Production Telegram 7×24 — нет: sleep и thermal throttle ломают webhook SLA. Выделенный Mini или аренда MACCOME с launchd KeepAlive.