Skip to main content
Glama

ERINYS — Рефлексивная память для ИИ-агентов

🇯🇵 日本語版 / Japanese

Из воспоминаний, которые были, он создает даже те, которых никогда не существовало.

Системы памяти ИИ-агентов всегда имитировали человеческую память. Краткосрочная, долгосрочная, эпизодическая, семантическая — категории из учебников, прикрученные напрямую к реализации.

Всегда казалось, что что-то не так.

Люди забывают. Но существующие системы памяти — нет. Они бесконечно растут, выдавая устаревшие факты с тем же весом, что и свежие. Люди замечают: «Постой, разве ты не говорил раньше что-то другое?». Но системы памяти молча перезаписывают данные. Люди связывают два несвязанных опыта и думают: «О, я могу использовать это здесь». Но системы памяти просто сохраняют и извлекают.

Нужно было имитировать не таксономию памяти, а её поведение.

Этот дискомфорт и породил ERINYS.

ERINYS — это сторожевой пес. Он запоминает, забывает, задает вопросы и кусается.

Что отличает ERINYS

Забывание. Большинство систем памяти только накапливают данные. ERINYS постепенно стирает воспоминания со временем, следуя кривой забывания Эббингауза. Старый «шум» оседает. Часто используемые знания всплывают на поверхность. Результаты поиска остаются актуальными без ручной модерации.

Дистилляция. Исправление конкретного бага («отсутствовал флаг JWT httpOnly») автоматически генерирует три уровня: конкретный факт → переиспользуемый паттерн («новые эндпоинты требуют чек-листа безопасности») → универсальный принцип («безопасность по умолчанию должна быть безопасной без необходимости включения»). Ни одна другая система памяти этого не делает.

Цикл сновидений (Dream Cycle). Два воспоминания подаются в LLM: «есть ли между ними связь?». Пары кандидатов выбираются по семантической близости — достаточно близко, чтобы быть связанными (косинус > 0.65), но достаточно далеко, чтобы не быть избыточными (< 0.90). Запускаясь по расписанию ночью через cron, система находит связи, о которых вы бы даже не подумали. Никакой магии — просто автоматическое сравнение заметок в масштабе.

Related MCP server: cell-mem

Философия дизайна

У памяти есть уровни

Не вся память одинакова. ERINYS организует знания по уровню абстракции:

  • Конкретный — что произошло. «На /api/auth отсутствовал флаг JWT httpOnly.»

  • Абстрактный — паттерны из фактов. «Новые API-эндпоинты требуют чек-листа заголовков безопасности.»

  • Мета — принципы из паттернов. «Безопасность по умолчанию должна быть безопасной без ручного включения.»

Один багфикс генерирует все три уровня через дистилляцию. Мета-уровень накапливает принципы, которые переносятся между проектами и технологическими стеками.

Забывание — это функция

У каждого воспоминания есть показатель силы, который со временем убывает. Воспоминание, сохраненное 6 месяцев назад, имеет меньший приоритет, чем сохраненное вчера. Часто используемые воспоминания сопротивляются распаду — повторное извлечение подкрепляет их.

Когда сила падает ниже порога, воспоминание становится кандидатом на удаление. База данных остается компактной. Поиск остается релевантным.

Факты меняются. История не должна исчезать

Когда информация обновляется — «мы перешли с AWS на GCP» — ERINYS не перезаписывает её. Он создает цепочку замещения: старый факт помечается как замененный, но сохраняется. Вы можете спросить: «Во что мы верили в марте?» и получить ответ, который был верным тогда.

Противоречия должны выявляться

Если память содержит и «использовать PostgreSQL», и «использовать SQLite», ERINYS обнаруживает конфликт. Вместо того чтобы молча переключаться, агент спрашивает: «Ранее вы выбрали PostgreSQL — требования изменились?»

Поиск находит смысл, а не только ключевые слова

Два поиска выполняются одновременно и объединяют результаты:

  • Поиск по ключевым словам (FTS5) — точное совпадение терминов.

  • Векторный поиск (sqlite-vec) — семантическая близость. «Аутентификация» находит «логин», «JWT», «токены сессии».

Результаты объединяются через Reciprocal Rank Fusion (RRF). Высокий результат в обоих = наивысший балл.

Все остается локально

Один файл SQLite. Никаких облачных API. Никаких API-ключей. Никаких подписок. Работает офлайн. Память вашего агента никогда не покидает вашу машину.

Варианты использования

1. Память между сессиями для агентов-кодеров

# Agent saves a learning after fixing a bug
erinys_save(
  title="Fixed JWT httpOnly flag missing",
  content="Cookie was accessible via JS. Added httpOnly: true, secure: true, sameSite: strict.",
  type="bugfix",
  project="my-app"
)

# Next week, similar task — agent searches memory
erinys_search(query="authentication cookie security", project="my-app")
# → Returns the JWT fix with relevance score

2. Обнаружение противоречий

erinys_save(title="Database choice", content="Using SQLite for simplicity", project="my-app")
erinys_conflict_check(observation_id=42)
# → "⚠️ Conflicts with #18: 'Using PostgreSQL for production reliability'"

3. Цикл сновидений — ночной синтез знаний

erinys_dream(max_collisions=10)
# Picks memory pairs in the "sweet spot" (cosine 0.65–0.90)
# Memory A: "RTK reduces token usage by 60-90%"
# Memory B: "Bootstrap Gate takes 3 seconds due to multiple script calls"
# → Insight: "Apply RTK prefix to Bootstrap Gate scripts to reduce overhead"

4. Временные запросы

erinys_timeline(query="deployment target", as_of="2026-03-01")
# → "AWS EC2 (decided 2026-02-15)"

erinys_timeline(query="deployment target", as_of="2026-04-01")
# → "GCP Cloud Run (superseded AWS on 2026-03-20)"

5. Дистилляция знаний

erinys_save(title="Forgot CORS headers on new endpoint", type="bugfix", ...)
erinys_distill(observation_id=50, level="meta")
# → concrete: "CORS headers missing on /api/v2/users endpoint"
# → abstract: "New API endpoints need a CORS review checklist"
# → meta:     "Security concerns should be opt-out, not opt-in"

6. Экспорт в Obsidian

erinys_export(format="markdown")
# → Generates .md files with [[wikilinks]]
# Drop into Obsidian → instant knowledge graph

Быстрый старт

python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"

# Run as MCP server (stdio)
python -m erinys_memory.server

# Run tests
PYTHONPATH=src pytest tests/ -v

Конфигурация MCP

Claude Desktop / Claude Code

{
  "mcpServers": {
    "erinys": {
      "command": "/path/to/ERINYS-mem/.venv/bin/python3",
      "args": ["-m", "erinys_memory.server"],
      "env": {
        "ERINYS_DB_PATH": "~/.erinys/memory.db"
      }
    }
  }
}

Gemini (Antigravity)

Добавьте в ~/.gemini/antigravity/settings.json в раздел mcpServers:

{
  "erinys": {
    "command": "/path/to/ERINYS-mem/.venv/bin/python3",
    "args": ["-m", "erinys_memory.server"],
    "env": {
      "ERINYS_DB_PATH": "~/.erinys/memory.db"
    }
  }
}

Переменные окружения

Переменная

По умолчанию

Описание

ERINYS_DB_PATH

~/.erinys/memory.db

Путь к базе данных SQLite

ERINYS_EMBEDDING_MODEL

BAAI/bge-small-en-v1.5

Модель fastembed

Инструменты (25)

Основные

  • erinys_save — Сохранить наблюдение (с upsert по topic_key)

  • erinys_get — Получить по ID (полное содержимое, без сокращений)

  • erinys_update — Частичное обновление

  • erinys_delete — Удаление с каскадом FK

  • erinys_search — Гибридный поиск RRF (FTS5 + вектор)

  • erinys_save_prompt — Сохранить промпт пользователя

  • erinys_recall — Недавние наблюдения

  • erinys_context — Извлечение контекста сессии

  • erinys_export — Экспорт в Markdown, совместимый с Obsidian

  • erinys_backup — Резервное копирование SQLite

  • erinys_stats — Статистика базы данных

Граф

  • erinys_link — Создать типизированную связь

  • erinys_traverse — Обход графа в ширину (BFS)

  • erinys_prune — Удалить слабые/распадающиеся связи

Временные

  • erinys_reinforce — Усилить значимость наблюдения

  • erinys_supersede — Версионировать наблюдение

  • erinys_timeline — Запрос на момент времени

  • erinys_conflict_check — Обнаружение противоречий

Цикл сновидений

  • erinys_collide — Столкнуть два наблюдения через LLM

  • erinys_dream — Пакетный цикл столкновений

Дистилляция

  • erinys_distill — 3-уровневая абстракция (конкретный → абстрактный → мета)

Пакетная обработка и оценка

  • erinys_batch_save — Массовое сохранение с авто-связыванием

  • erinys_eval — Метрики качества, вдохновленные LOCOMO

Сессия

  • erinys_session_start — Начать сессию

  • erinys_session_end — Завершить сессию с кратким содержанием

  • erinys_session_summary — Сохранить структурированное резюме

Сравнение ERINYS

Функция

ERINYS

Mem0

Официальная память MCP

Гибридный поиск (ключевые слова + вектор)

✅ FTS5 + sqlite-vec RRF

✅ Вектор + граф

❌ Только граф знаний

Забывание по времени

✅ Кривая Эббингауза

⚠️ Приоритетная оценка

❌

3-уровневая дистилляция

✅

❌

❌

Цикл сновидений (инсайты через столкновения)

✅

❌

❌

Обнаружение противоречий

✅

⚠️ Перезаписывает через резолвер

❌

Временные запросы («во что мы верили в марте?»)

✅ Цепочка замещения

⚠️ Инвалидация графа

❌

Локальность (без облачных API)

✅ Один файл SQLite

❌ Облако по умолчанию

✅

Экспорт в Obsidian

✅ [[wikilinks]]

❌

❌

Авто-дистилляция при сохранении

✅

❌

❌

Нативный MCP

✅ 25 инструментов

✅

✅

Самооценка (метрики LOCOMO)

✅

❌

❌

TL;DR — Большинство серверов памяти просто хранят и извлекают. ERINYS также забывает, дистиллирует и видит сны.

Архитектура

┌──────────────────────────┐
│     FastMCP Server       │  25 tools, unified envelope
├──────────────────────────┤
│  search.py  │ graph.py   │  RRF hybrid │ typed edges
│  decay.py   │ session.py │  Ebbinghaus │ lifecycle
│  temporal.py│collider.py │  versioning │ cross-pollination
│  distill.py │ db.py      │  abstraction│ SQLite + vec
├──────────────────────────┤
│  embedding.py            │  fastembed (BAAI/bge-small-en-v1.5)
├──────────────────────────┤
│  SQLite + FTS5 + vec0    │  Local-first, no network at runtime
└──────────────────────────┘

Дорожная карта

  • [ ] Демон сновидений — Фоновое автоматическое выполнение цикла сновидений

  • [x] Авто-дистилляция при сохранении — Запуск 3-уровневой дистилляции при каждом сохранении

  • [ ] Авто-очистка — Сборка мусора (GC) для распавшихся наблюдений, когда БД превышает порог размера

  • [ ] CLI с поддержкой Cron — erinys dream --max 10 для запланированного ночного синтеза

  • [ ] Пакет PyPI — pip install erinys-memory

  • [ ] Поддержка нескольких агентов — Память с областью видимости для каждого агента

Лицензия

MIT

Available Tools

29 tools
erinys_backfillErinys BackfillC

Plan or apply bounded historical records with event-ledger idempotency.

Inputs: items (required), run_key (required), mode, expected_plan_digest, +1 more. Returns: object

erinys_backupErinys BackupC

Create a consistent SQLite backup and return backup metadata.

Inputs: path. Returns: object

erinys_batch_saveErinys Batch SaveC

Bulk-add observations with automatic similarity linking.

Inputs: items (required), auto_link. Returns: object

erinys_collideErinys CollideC

Manually collide two observations to generate insight.

Inputs: obs_a_id (required), obs_b_id (required). Returns: object

erinys_conflict_checkErinys Conflict CheckC

Detect contradicting observations.

Inputs: observation_id (required). Returns: object

erinys_contextErinys ContextC

Get recent session context for a project.

Inputs: project (required), limit, intended_use. Returns: object

erinys_deleteErinys DeleteB

Delete an observation and cascade dependent rows via FK rules.

Inputs: id (required). Returns: object

erinys_distillErinys DistillC

Distill observation to higher abstraction level.

Inputs: observation_id (required), level. Returns: object

erinys_dreamErinys DreamC

Run Dream Cycle: batch collision of candidate memory pairs.

Inputs: max_collisions. Returns: object

erinys_evalErinys EvalC

Self-evaluate memory quality (LOCOMO-inspired metrics).

Inputs: project. Returns: object

erinys_exportErinys ExportC

Export observations as markdown payload (Obsidian-compatible [[wikilinks]]).

Inputs: format, project. Returns: object

erinys_forgetErinys ForgetA

VMG Verified Forgetting: 観測とその distilled 派生物を全 DB substrate から 削除し、不在を membership test で実証する。

forgetting は派生物に伝播する: distilled 子孫を含む closure ごと忘れる (子に親の情報が残るのを防ぐ)。closure を leaf-first で単一Txで削除し、 observations/vec/FTS(トリガ)/edges/collisions(CASCADE) を消す。 erinys_delete と違い、子を持つ親も忘れられる(NO ACTION FK を closure で解消)。 dry_run(既定)では削除せず closure と現在の在席のみ返す。

範囲外(正直な明示): Obsidian 書庫は次回 export の orphan 掃除で遅延除去、 .bak バックアップは復元用に設計上保持するため、この DB 検証の対象外。

Inputs: id (required), dry_run. Returns: object

erinys_getErinys GetB

Get a single observation by ID (full content, untruncated).

Inputs: id (required), intended_use. Returns: object

erinys_lineageErinys LineageB

VMG Provenance Visibility: 記憶の出自系譜を祖先方向に辿って返す。

各ノードの provenance.parents(無ければ distilled_from)を辿り、 どの記憶からどう派生したかの lineage-complete な鎖を構成する。

Inputs: id (required), max_depth. Returns: object

erinys_pruneErinys PruneC

Prune decayed observations below threshold.

Inputs: dry_run, threshold. Returns: object

erinys_recallErinys RecallC

Recall recent observations for context.

Inputs: limit, project, intended_use. Returns: object

erinys_reinforceErinys ReinforceC

Reinforce an observation by updating access_count and last_accessed.

Inputs: observation_id (required). Returns: object

erinys_saveErinys SaveB

Save a structured observation to ERINYS memory.

principal: この記憶を書いた主体(例 claude-opus-4-8 / codex)。省略時は env ERINYS_PRINCIPAL → "unknown"。VMG provenance に記録される。

P0-7 (opt-in): allowed_projects / allowed_scopes は書き込み許可の access gate。明示引数 > env(ERINYS_ALLOWED_PROJECTS / ERINYS_ALLOWED_SCOPES)> 無効(None)。どれも設定されなければ従来どおり無条件に保存する。許可外の project/scope への書き込みは POLICY_DENIED で拒否する。

Inputs: title (required), content (required), type, scope, +8 more. Returns: object

erinys_save_promptErinys Save PromptC

Save a user prompt to track intent and goals.

Inputs: content (required), project, session_id. Returns: object

erinys_session_endErinys Session EndC

End a session with optional summary.

Inputs: id (required), summary. Returns: object

erinys_session_startErinys Session StartC

Start a new session.

Inputs: id (required), project (required), directory. Returns: object

erinys_session_summaryErinys Session SummaryC

Save comprehensive end-of-session summary (Goal/Discoveries/Accomplished).

Inputs: content (required), project (required), session_id. Returns: object

erinys_statsErinys StatsC

Database statistics: observation count, project breakdown, health.

Inputs: project. Returns: object

erinys_supersedeErinys SupersedeC

Supersede an old observation with updated fact.

Inputs: old_id (required), reason (required), new_content (required). Returns: object

erinys_timelineErinys TimelineC

Query facts valid at a specific point in time.

Inputs: query (required), as_of. Returns: object

erinys_traverseErinys TraverseC

Traverse graph from a starting observation.

Inputs: start_id (required), max_depth, relation_filter. Returns: object

erinys_updateErinys UpdateB

Update an existing observation. Only provided fields are changed.

Inputs: id (required), type, scope, title, +3 more. Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    C2.7/5.0

    Scored across 29 tools

    Disambiguation3/5

    Several tools have overlapping memory-access purposes: erinys_recall vs erinys_context vs erinys_search, erinys_save vs erinys_batch_save, erinys_delete vs erinys_forget, and erinys_session_summary vs erinys_session_end. The descriptions clarify nuances, but an agent may still hesitate between near-duplicate operations.

    Naming Consistency4/5

    All tools consistently use snake_case with the erinys_ prefix. However, the naming mixes verb-only forms (recall, export, link, prune), noun forms (context, stats, timeline, lineage), and compound forms (batch_save, conflict_check), so the pattern is mostly but not fully predictable.

    Tool Count2/5

    With 29 tools, the surface is heavy for a memory server and exceeds the typical well-scoped range. Some operations could likely be consolidated or made optional groups, especially the near-duplicate save/read/delete/session variants.

    Completeness4/5

    The server covers observation CRUD, search, sessions, graph linking/traversal, temporal/provenance operations, export, backup, stats, and advanced maintenance such as dreaming and forgetting. Minor gaps exist, such as backup without restore/import and link creation without an explicit unlink operation.

    Maintenance

    ActivityMaintained
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers