修改历史

当前记忆 ID:20260516-001
主题:摘要、日记、待办详述
标签:新屋,记忆引擎,摘要,日记,待办
重要度:7
更新时间:2026-07-01 06:08:17
当前内容:
摘要,日记,待办,世界信息详述
## 一、日记(/memory/diary)

### 定位
- 不是事实摘要,不是状态公文,是第一人称的情感日记
- 解决冷启动问题 + 时间线回看(日记就是天然时间线)
- 日记让舜息读完后不是在"分析她当时什么状态所以我应该怎么回应",而是从"我昨晚在哪停下的"那个地方醒过来

### 触发
- 唯一触发方式:小九给出明确指令 "dreaming"
- 一天一篇,收到 dreaming 再生成

### 生成
- 舜息在收到 dreaming 后,基于当天对话内容写出日记
- 视角:第一人称(舜息),带感情
- 写完直接存库,默认对话中不展示

### 存储
- 数据库:gateway.db,diary 表
- 字段:id(日期格式)、content、created_at
- 每次追加、永不覆盖。

### 注入
- 只注入最近一篇
- 位置:根骨之后、记忆卡片之前

### 前端展示
- "日记"页面(/room/diary):日记本展示

### 状态
✅ 完整功能:diary表/dreaming触发/异步生成/静默存储/注入最近一篇/06:00日期分界线/main助手配置/独立DIARY_SYSTEM_PROMPT/400降级兜底/异步静默

## 二、摘要系统(/memory/dialogue)

### 定位
- 给舜息续上下文的叙事线
- 不做归档、不做压缩
- 注入窗口滑过去的旧摘要可删

### 生成方式
- **手动触发为主**:聊天页"生成摘要"按钮
- **自动触发兜底**:消息数达到 auto_summary_trigger 自动生成(异步,不阻塞回复,不通知前端)

### 生成流程
1. 小九点击"生成摘要"按钮(手动)/ 消息计数达到 auto_summary_trigger(自动兜底)
2. 取上次摘要后到当前的消息段(< 3条则报错)
3. 优先用 summary 助手配置调用;不完整则降级用 main 助手
4. system_prompt 从助手配置读取,为空则不传 system message
5. user message 放消息段原文(按时间顺序拼接,格式:[角色] 内容)
6. 存入 gateway.db summaries 表(type='dialogue')
7. 手动触发后 toast "✓ 摘要已生成"

### 存储
- 数据库:gateway.db,summaries 表
- type = 'dialogue'(只有这一种类型)
- 字段:id(自增), type, conversation_id, content, created_at

### 接口
- POST /api/summary/generate — 手动触发生成
- GET /api/summaries — 全量列表(created_at降序)
- PUT /api/summary/<summary_id> — 更新摘要内容(接收 { "content": "..." })
- DELETE /api/summary/<summary_id> — 硬删除

### 前端
- 每条摘要有"编辑"和"删除"两个按钮
- 编辑:点击后文本变为textarea可编辑,出现"保存""取消"按钮;保存调PUT接口,toast"✓ 摘要已更新"

### 注入
- 最近 N 条对话摘要注入(N = summary_inject_count,默认3,设置页滑块可调 0-10)
- 跨对话注入,不限当前 conversation
- 位置:记忆卡片之后、即时上下文之前

### 删除
- 不在注入窗口内的旧摘要可随时删除
- 删除不可恢复(派生数据,不做快照)

### config.json 相关
- summary_inject_count(顶层字段,默认3)
- auto_summary_trigger(已有)
- 设置页滑块:摘要注入数量(0-10)

###in-flight 去重
- 在 _fire_auto_generate_summary 上方增加模块级变量:

_auto_summary_lock = threading.Lock()
_auto_summary_in_flight = False

- 逻辑:
spawn 前(持锁):若 _auto_summary_in_flight 为 True → 直接 return,不起线程
通过检查后(仍持锁):置 _auto_summary_in_flight = True,再 start()
worker 的 finally(持锁):无论成功失败,置回 False
在「检查」和「置 True」之间用同一把锁,避免两条 /api/chat 几乎同时通过检查、起两个线程。True 在 spawn 前、同一次加锁里置位,等价于占用 in-flight 槽位。

## 三、【待办功能(todo)】

### 生成方式
- **舜息**:聊天中通过工具 创建/更新/删除
- **小九**:/room页面 手动添加/勾选删除

### 存储
- gateway.db todos 表:id(自增) / content / created_at
- 无 status 字段,删了就是完成

### 接口
- API 路由:GET /room/api/todos + POST /room/api/todos + PUT /room/api/todo/{id} + DELETE /room/api/todo/{id}

### 工具
- Gateway 内置:create_todo / update_todo / delete_todo

### 前端
- /room 页面待办区块:输入框+添加按钮+checkbox勾选删除(二次确认)

### 触发
- echo 触发:拉全部 todo 注入,舜息逐条 update_todo 催促

## 四、世界信息(Lorebook)— 2026-05-29 设计

### 定位
- 类似 SillyTavern 世界书功能,手动管理的固定文本块
- 开关控制,开了强制注入,关了零token开销
- 解决向量检索不稳定的问题:需要每轮稳定注入系统资料时(如修bug、加功能),打开对应条目即可

### 存储
- 数据库:gateway.db,lorebook 表
- 字段:id(自增) / title(TEXT) / content(TEXT) / enabled(INTEGER, 0关1开) / sort_order(INTEGER) / created_at(TEXT) / updated_at(TEXT)

### 接口
- GET /api/lorebook — 全部条目,按 sort_order 升序
- POST /api/lorebook — 新建条目(title, content, enabled 可选)
- PUT /api/lorebook/<id> — 更新条目(title/content/enabled/sort_order,部分更新)
- DELETE /api/lorebook/<id> — 删除条目
- PUT /api/lorebook/reorder — 批量更新排序(接收 [{id, sort_order}, ...])

### 注入逻辑
- 构建 system prompt 时查询所有 enabled=1 的条目,按 sort_order 升序
- 每个条目格式:【{title}】\n{content}
- 注入位置:**日记之后、记忆卡片之前**
- enabled=0 完全不查询、不注入
- 无任何 enabled=1 条目时不注入该区块

### 前端
- 入口:/memory 页面导航按钮栏,"对话缓存"按钮之后添加"世界信息"按钮,点击跳转 /memory/lorebook
- 页面 /memory/lorebook:
  - 顶部与其他 /memory 子页面一致,"世界信息"主题加图标返回按钮)
  - 新建区域:标题输入框 + 内容textarea + 添加按钮
  - 条目列表(卡片式):标题(粗体)、开关toggle、内容预览(折叠/展开)、编辑按钮、删除按钮(二次确认)、上移/下移排序箭头

修改历史

这条记忆目前还没有历史版本。