Skip to content

Hermes Session 架构

SessionDB

text
hermes_state.py

SessionDB 是 Hermes 的持久化层:

python
class SessionDB:
    """SQLite state store with FTS5 full-text search."""

数据库设计

sessions 表

字段类型说明
idTEXT PKSession ID
titleTEXT会话标题
system_promptTEXT字节稳定的 system prompt
modelTEXT使用的模型
providerTEXTProvider 名
sourceTEXTcli / telegram / discord / ...
platformTEXT平台
user_idTEXT用户 ID
parent_session_idTEXT压缩后的父 session
created_atTEXT创建时间
updated_atTEXT最后活动
message_countINTEGER消息计数
is_compressedBOOL是否被压缩
compressed_session_idTEXT压缩后的子 session

messages 表

字段类型说明
idINTEGER PK消息 ID
session_idTEXT FK所属 session
roleTEXTuser / assistant / tool
contentTEXT消息内容
tool_callsTEXTJSON 工具调用数据
tool_call_idTEXT工具调用 ID
nameTEXT工具名
created_atTEXT时间戳
token_countINTEGERToken 估算

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 搜索 + 结果聚合 + 上下文窗口"""

提供三种搜索形状:

  1. Discovery:FTS5 按相关性搜索
  2. Scroll:在 session 内滚动
  3. 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 对比

维度PiOpenCodeHermes
存储JSONL 文件SQLiteSQLite + FTS5
数据模型消息树事件流消息表 + 会话表
搜索grep事件查询FTS5 全文搜索
压缩新 session split事件压缩消息压缩 + parent 链
System prompt随 session 存随 session 存DB 持久 + 首轮缓存
跨 session 记忆✅(memory tool)

Powered by VitePress