Hermes Session 架构
SessionDB
text
hermes_state.pySessionDB 是 Hermes 的持久化层:
python
class SessionDB:
"""SQLite state store with FTS5 full-text search."""数据库设计
sessions 表
| 字段 | 类型 | 说明 |
|---|---|---|
| id | TEXT PK | Session ID |
| title | TEXT | 会话标题 |
| system_prompt | TEXT | 字节稳定的 system prompt |
| model | TEXT | 使用的模型 |
| provider | TEXT | Provider 名 |
| source | TEXT | cli / telegram / discord / ... |
| platform | TEXT | 平台 |
| user_id | TEXT | 用户 ID |
| parent_session_id | TEXT | 压缩后的父 session |
| created_at | TEXT | 创建时间 |
| updated_at | TEXT | 最后活动 |
| message_count | INTEGER | 消息计数 |
| is_compressed | BOOL | 是否被压缩 |
| compressed_session_id | TEXT | 压缩后的子 session |
messages 表
| 字段 | 类型 | 说明 |
|---|---|---|
| id | INTEGER PK | 消息 ID |
| session_id | TEXT FK | 所属 session |
| role | TEXT | user / assistant / tool |
| content | TEXT | 消息内容 |
| tool_calls | TEXT | JSON 工具调用数据 |
| tool_call_id | TEXT | 工具调用 ID |
| name | TEXT | 工具名 |
| created_at | TEXT | 时间戳 |
| token_count | INTEGER | Token 估算 |
FTS5 全文搜索
sql
CREATE VIRTUAL TABLE messages_fts USING fts5(
session_id,
role,
content,
tool_calls,
content='messages',
content_rowid='id'
);支持:
- 布尔搜索(
python NOT java) - 短语搜索(
"agent loop") - 前缀搜索(
deploy*) - Trigram fallback(短词/中文)
Session 搜索
python
# tools/session_search_tool.py
async def session_search(query, limit=3):
"""FTS5 搜索 + 结果聚合 + 上下文窗口"""提供三种搜索形状:
- Discovery:FTS5 按相关性搜索
- Scroll:在 session 内滚动
- Browse:最近 session 列表
Prompt Cache 保证
Hermes 的 system prompt 在 session 创建时构建一次,之后不变:
python
def update_system_prompt(session_id, system_prompt):
"""只在创建时调用一次"""
def _restore_or_build_system_prompt(session):
"""每轮从 DB 恢复,不重新生成"""这保证了 Anthropic / OpenRouter / 本地的 prompt caching 一直有效。
压缩链
Session A (100 turns)
↓ 触发压缩
Session B (20 turns) parent_session_id = A.id
↓ 再次压缩
Session C (15 turns) parent_session_id = B.id通过 parent_session_id 链接,可以回溯整个会话生命周期。
三种 Session 对比
| 维度 | Pi | OpenCode | Hermes |
|---|---|---|---|
| 存储 | JSONL 文件 | SQLite | SQLite + FTS5 |
| 数据模型 | 消息树 | 事件流 | 消息表 + 会话表 |
| 搜索 | grep | 事件查询 | FTS5 全文搜索 |
| 压缩 | 新 session split | 事件压缩 | 消息压缩 + parent 链 |
| System prompt | 随 session 存 | 随 session 存 | DB 持久 + 首轮缓存 |
| 跨 session 记忆 | ❌ | ❌ | ✅(memory tool) |