Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2.5 KiB
2.5 KiB
H-2 长驻 Hermes Session Manager
1. 目标
让 Hermes 以 conversation 级别的长驻 session 运行,而不是每条消息都重新冷启动。
这是本次接入最关键的用户体验目标:
- 连续上下文
- 无缝多轮对话
- 降低重复初始化耗时
- 避免“每次都像重新开机”
2. 会话归属原则
Hermes session 以 conversation_id 作为主键绑定。
原因:
- Jarvis 现有 chat 的持久化中心本来就是 conversation
- 前后端现有逻辑都已围绕 conversation 组织
- conversation 是最自然的“连续对话上下文容器”
必要时可组合:
user_id + conversation_id
3. 会话管理职责
建议新增 HermesSessionManager,负责:
- 根据 conversation 获取或创建 Hermes session
- 保存内存态句柄
- 记录 last_used 时间
- 做每会话锁,防止并发 turn 污染
- 做 idle timeout 回收
- 在异常时受控重建 session
4. 与持久化层的关系
4.1 内存态
内存里保存:
- session handle
- lock
- last_used
- health status
- restart count
4.2 数据库存储
建议把 Hermes runtime 元数据落入 Conversation.agent_state,但不要覆盖现有 Jarvis continuity。
建议结构:
{
"runtime": "jarvis | hermes",
"runtime_state": {
"jarvis": { ... },
"hermes": {
"session_id": "...",
"last_used_at": "...",
"restart_count": 0,
"status": "healthy"
}
}
}
这样支持:
- 并存
- 切换
- 回滚
- 不破坏旧 continuity 数据
5. 生命周期建议
用户发起消息
-> 根据 conversation 找 session
-> 有则复用
-> 无则创建
-> 执行消息
-> 更新 last_used / 状态
-> 空闲超时后回收
5.1 回收策略
- conversation 长时间无活动后可回收
- 但回收前要把必要 runtime 元数据保存到
agent_state
5.2 异常策略
- 首次异常:尝试一次受控重建
- 重建失败:返回 clean error
- 不能因此破坏 Jarvis 默认路径
6. 关键设计约束
- 一个 conversation 同一时刻只能有一个进行中的 Hermes turn
- 不允许两个并发消息写进同一个 Hermes session
- session manager 不能成为 Jarvis 主流程的单点故障
- Hermes 失败时,不能污染 conversation 的历史结构
7. 完成标准
conversation_id能稳定映射到 Hermes session- session 可复用,不是每轮冷启动
- 有 per-conversation lock
- 有 idle timeout / cleanup 机制
- 有 crash / recreate 基础机制
- metadata 可写入
Conversation.agent_state