ERINYS
ERINYS — AIエージェントのための再帰的メモリ
かつて存在した記憶から、存在しなかった記憶さえも作り出す。
AIエージェントのメモリシステムは、常に人間の記憶を模倣してきました。短期、長期、エピソード記憶、意味記憶といった教科書的な分類が、そのまま実装に組み込まれてきました。
何かがおかしいと感じていました。
人間は忘れます。しかし、既存のメモリシステムは忘れません。それらは際限なく肥大化し、古い事実を新しい事実と同じ重みで提供し続けます。人間は「あれ、前と言っていることが違わない?」と気づきますが、メモリシステムは静かに上書きしてしまいます。人間は無関係な二つの経験を結びつけて「おっ、ここで使えるかも」と考えますが、メモリシステムはただ保存して取り出すだけです。
模倣すべきだったのは、記憶の分類学ではありません。その「振る舞い」でした。
その違和感こそが、ERINYSを呼び起こしたのです。
ERINYSは番犬です。記憶し、忘れ、問いかけ、そして噛みつきます。
ERINYSが他と違う理由
忘却。 ほとんどのメモリシステムは蓄積する一方です。ERINYSはエビングハウスの忘却曲線に従い、時間の経過とともに記憶を減衰させます。古いノイズは沈み、頻繁にアクセスされる知識は浮上します。検索結果は手動で整理しなくても関連性を保ちます。
蒸留。 特定のバグ修正(「JWTのhttpOnlyフラグが欠落していた」)は、自動的に3つのレイヤーを生成します。具体的な事実 → 再利用可能なパターン(「新しいエンドポイントにはセキュリティチェックリストが必要」) → 普遍的な原則(「セキュリティのデフォルトはオプトインなしで安全であるべき」)。これを行うメモリシステムは他にありません。
ドリームサイクル。 2つの記憶がLLMに送られ、「関連性はあるか?」が判断されます。候補となるペアは意味的類似性によって選択されます(関連性があるほど近く、冗長にならないほど遠い:コサイン類似度 > 0.65 かつ < 0.90)。cronを通じて夜間にスケジュールされ、自分では思いつかないようなつながりを見つけ出します。魔法ではありません。単なる大規模な自動ノート比較です。
設計哲学
記憶には階層がある
すべての記憶が平等ではありません。ERINYSは知識を抽象度で整理します:
具体的 (Concrete) — 何が起きたか。「
/api/authでJWTのhttpOnlyフラグが欠落していた。」抽象的 (Abstract) — 事実からのパターン。「新しいAPIエンドポイントにはセキュリティヘッダーのチェックリストが必要。」
メタ (Meta) — パターンからの原則。「セキュリティのデフォルトは手動のオプトインなしで安全であるべき。」
一つのバグ修正が、蒸留を通じてこれらすべてを生成します。メタレイヤーは、プロジェクトや技術スタックを超えて転用可能な原則を蓄積します。
忘却は機能である
すべての記憶には、時間とともに減衰する強度スコアがあります。6ヶ月前に保存された記憶は、昨日保存された記憶よりもランクが低くなります。頻繁にアクセスされる記憶は減衰に抵抗します。繰り返し取り出すことで強化されるのです。
強度が閾値を下回ると、その記憶は削除候補となります。データベースは軽量に保たれ、検索は関連性を維持します。
事実は変わる。歴史は消えるべきではない
情報が更新されたとき(「AWSからGCPへ移行した」)も、ERINYSは上書きしません。置換チェーンを作成します。古い事実は「置換済み」とマークされますが、保存はされます。「3月時点ではどう考えていた?」と尋ねれば、当時正しかった答えが得られます。
矛盾は捉えられるべきである
メモリに「PostgreSQLを使う」と「SQLiteを使う」の両方が含まれている場合、ERINYSはその矛盾を検知します。黙って切り替えるのではなく、エージェントはこう尋ねます。「以前はPostgreSQLを選択していましたが、要件が変わりましたか?」
検索はキーワードではなく意味を見つける
2つの検索が同時に実行され、結果が融合されます:
キーワード検索 (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 score2. 矛盾検知
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/ -vMCP設定
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"
}
}
}環境変数
変数 | デフォルト | 説明 |
|
| SQLiteデータベースのパス |
|
| fastembedモデル |
ツール (25)
コア
erinys_save— 観測結果を保存 (topic_keyによるアップサート)erinys_get— IDで取得 (全文、切り捨てなし)erinys_update— 部分更新erinys_delete— FKカスケードによる削除erinys_search— RRFハイブリッド検索 (FTS5 + ベクトル)erinys_save_prompt— ユーザープロンプトを保存erinys_recall— 最近の観測結果erinys_context— セッションコンテキストの呼び出しerinys_export— Obsidian互換のMarkdownエクスポートerinys_backup— SQLiteバックアップerinys_stats— データベース統計
グラフ
erinys_link— 型付きエッジの作成erinys_traverse— BFSグラフ探索erinys_prune— 弱い/減衰したエッジの剪定
時間的
erinys_reinforce— 観測強度のブーストerinys_supersede— 観測結果のバージョン管理erinys_timeline— 指定タイムスタンプ時点でのクエリerinys_conflict_check— 矛盾の検知
ドリームサイクル
erinys_collide— LLMを介して2つの観測結果を衝突させる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段階の蒸留 (具体的 → 抽象的 → メタ) | ✅ | ❌ | ❌ |
ドリームサイクル (衝突ベースの洞察) | ✅ | ❌ | ❌ |
矛盾検知 | ✅ | ⚠️ リゾルバーによる上書き | ❌ |
時間的クエリ ("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
└──────────────────────────┘ロードマップ
[ ] Dream Daemon — ドリームサイクルのバックグラウンド自動実行
[x] 保存時の自動蒸留 — 保存のたびに3段階の蒸留をトリガー
[ ] 自動剪定 — DBがサイズ閾値を超えた際に減衰した観測結果をGC
[ ] Cron対応CLI — 定期的な夜間合成のための
erinys dream --max 10[ ] PyPIパッケージ —
pip install erinys-memory[ ] マルチエージェントサポート — エージェントIDごとのスコープ付きメモリ
ライセンス
MIT
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/GhostyAI-HA/ERINYS-mem'
If you have feedback or need assistance with the MCP directory API, please join our Discord server