问题描述
执行 memos add "测试记忆" 返回成功,但随后 memos get <user>(即用户视角的 memory list)查不到刚添加的内容。两个账号均可稳定复现,退出重新登录后依然存在。复现链路:写路径按会话作用域存储,读路径却按纯用户作用域列举,作用域不一致导致新写入记忆不可见。
定位(客户端,仓库内部即可复现的根因)
- 写入路径:
cmd_add(src/memos_cli/commands/memory_cmd.py:236-244)始终解析并下发 conversation_id(默认取 config.defaults.conversation_id,即 memos-cli-default,见 src/memos_cli/config.py:22);add_memory(src/memos_cli/backend/memory_api.py:57-79)把 conversation_id 写入 POST /add/message 请求体。
- 读取路径:
cmd_get(src/memos_cli/commands/memory_cmd.py:629-635)只传 user_id/page/size/include_*,从不解析或下发 conversation_id;get_memories(src/memos_cli/backend/memory_api.py:168-190)构造的 POST /get/memory 请求体同样不含 conversation_id;输出 scope(memory_cmd.py:648)也只有 user_id。
- 对照:
search / chat / extract / feedback 四条命令在 cmd_ 层都解析 final_conversation_id 并传给后端(memory_cmd.py:310 / 373 / 435 / 571),唯独 get 断开此链路。
结论:写入按会话维度(conversation_id),列举按纯用户维度(user_id),因此 memos get/列表无法召回刚 add 的内容。修复方向是让 get/list 与 add 使用一致的会话作用域(解析 conversation_id 并随 POST /get/memory 下发),或在 get 明确支持按会话过滤。
附带问题
- 文档与代码不一致:
MemOS CLI.md:52/67 与 skills/memos-memory/SKILL.md 把 memos list --user-id ... --format table --detail simple 定义为主命令,但 src/memos_cli/main.py:134-140 只注册了 add/extract/feedback/search/get/origin/delete,源码中不存在 list 命令或别名。用户按文档执行 memory list/memos list 实际落到 get。建议新增 list(作为 get 的别名/封装)或修正文档。
- 展示层解析局限:
get 展示路径 extract_memory_records_from_response(src/memos_cli/output.py:45-72)只解析 memory_detail_list / preference_detail_list / memories / results / 单条键,不解析 text_mem 桶结构(该结构仅在 src/memos_cli/backend/normalizers.py:157-169 的 extract_memory_list 中处理)。若 /get/memory 返回 text_mem envelope,列表会静默显示 0 条,进一步掩盖已存在的记忆。
复现/验证建议
memos add "测试记忆" --format json 确认成功;随后 memos get <user> --format json 观察是否包含该记忆。
- 对照
memos search "测试记忆" --format json(search 路径带 conversation_id)是否反而能命中,验证作用域不对称假设。
- 若服务端支持,直接向
POST /get/memory 请求体加入相同 conversation_id 验证召回。
问题描述
执行
memos add "测试记忆"返回成功,但随后memos get <user>(即用户视角的memory list)查不到刚添加的内容。两个账号均可稳定复现,退出重新登录后依然存在。复现链路:写路径按会话作用域存储,读路径却按纯用户作用域列举,作用域不一致导致新写入记忆不可见。定位(客户端,仓库内部即可复现的根因)
cmd_add(src/memos_cli/commands/memory_cmd.py:236-244)始终解析并下发conversation_id(默认取config.defaults.conversation_id,即memos-cli-default,见src/memos_cli/config.py:22);add_memory(src/memos_cli/backend/memory_api.py:57-79)把conversation_id写入POST /add/message请求体。cmd_get(src/memos_cli/commands/memory_cmd.py:629-635)只传user_id/page/size/include_*,从不解析或下发conversation_id;get_memories(src/memos_cli/backend/memory_api.py:168-190)构造的POST /get/memory请求体同样不含conversation_id;输出 scope(memory_cmd.py:648)也只有user_id。search / chat / extract / feedback四条命令在 cmd_ 层都解析final_conversation_id并传给后端(memory_cmd.py:310 / 373 / 435 / 571),唯独get断开此链路。结论:写入按会话维度(conversation_id),列举按纯用户维度(user_id),因此
memos get/列表无法召回刚 add 的内容。修复方向是让get/list与add使用一致的会话作用域(解析conversation_id并随POST /get/memory下发),或在get明确支持按会话过滤。附带问题
MemOS CLI.md:52/67与skills/memos-memory/SKILL.md把memos list --user-id ... --format table --detail simple定义为主命令,但src/memos_cli/main.py:134-140只注册了add/extract/feedback/search/get/origin/delete,源码中不存在list命令或别名。用户按文档执行memory list/memos list实际落到get。建议新增list(作为get的别名/封装)或修正文档。get展示路径extract_memory_records_from_response(src/memos_cli/output.py:45-72)只解析memory_detail_list / preference_detail_list / memories / results / 单条键,不解析text_mem桶结构(该结构仅在src/memos_cli/backend/normalizers.py:157-169的extract_memory_list中处理)。若/get/memory返回text_memenvelope,列表会静默显示 0 条,进一步掩盖已存在的记忆。复现/验证建议
memos add "测试记忆" --format json确认成功;随后memos get <user> --format json观察是否包含该记忆。memos search "测试记忆" --format json(search 路径带 conversation_id)是否反而能命中,验证作用域不对称假设。POST /get/memory请求体加入相同conversation_id验证召回。