Repository navigation
✨ 新特性
会话标签
amrita_memory_sessions表新增tag列(VARCHAR(64),可为空),用于存放归档时由模型生成的一行短摘要,也可由/session rename手动改写。- 旧数据该列为
NULL,用于区分「从未生成过标签」与「生成失败/被清空」;展示侧按tag→data.abstract→ 首条用户消息 的顺序逐级回落。 - 标签长度统一在写入前截断到 64 字符(
_clip_tag):SQLite 不校验VARCHAR长度,但严格方言会直接拒写,模型生成的摘要长度不可控,这里统一收口,避免归档因标签过长而失败。
新增数据库/接口方法
MemorySessions.add_session(data, tag=None):插入归档并返回(id, created_at),created_at显式取值,便于后续回填标签时精确定位该行。MemorySessions.update_session_tag(session_id, tag, created_at):条件写,仅在tag IS NULL且id、user_id、created_at全部匹配时生效,用于归档流程的标签回填。MemorySessions.rename_session(session_id, tag, created_at=None):强制写,用于用户手动重命名,不校验tag IS NULL;调用方持有created_at时建议一并传入,防止主键回收后改到新行。- 对应在
AmritaMemory(memory.py)上暴露同名方法,均复用database_lock(owner)与add_session串行,避免 SQLite 上的交叉写入。
🐛 问题修复
会话列表排序不稳定
get()现在显式使用ORDER BY created_at ASC, id ASC。/session list的编号、use/del/rename均按下标定位,而 SQLite 的id会回收复用,仅依赖隐式 rowid 顺序并不稳定;同一秒内连续归档导致created_at相同时,再以id兜底。_expire()同步改为ORDER BY created_at DESC, id DESC,与get()保持同一口径,避免在保留边界上删掉列表顺序里本该保留的那条。
主键回收导致的误写
- 写入标签时同时校验
id、user_id与created_at,防止 SQLite 回收复用id后,把旧会话的标签写到新行,或改到他人的归档上。
🗃️ 数据库迁移
- 新增迁移
9a1f4c7b2d30_session_tag(父迁移072361e8936f):upgrade:为amrita_memory_sessions添加tag列(nullable=True,无server_default,旧行保持NULL)。downgrade:删除该列。
- 升级时自动执行,无需手动干预。
⬆️ 升级说明
- 版本号:
0.4.0→0.5.0。 - 由于涉及表结构变更,升级后首次启动会触发 Alembic 迁移;建议升级前备份数据库文件。
add_session的返回值由None变为(id, created_at),如有直接调用请按需适配;update_session_tag/rename_session为新增接口,对现有调用无影响。
What's Changed
Full Changelog: 0.4.0...0.5.0