Checklist
🐞 问题详细描述
问题详细描述:
jiuwen_memory_entry/core/handler.py 中两个 handler 直接用枚举构造函数解析参数,未捕获非法取值异常:
-
_add(第 471 行,mem2.0@5cc2f6c 基线):
modality = Modality(payload.get("source", payload.get("modality", "text")))
当请求体传 "source": null 时,payload.get 因 key 存在返回 None(默认值不生效),
Modality(None) 抛 ValueError;传 "source": "invalid" 同样抛 ValueError。
-
_evolve(第 753 行):
mode = EvolveMode(payload.get("mode", "extract"))
"mode": null 或非法字符串同样抛 ValueError。
缺陷影响:ValueError 不是 AgentMemoryError 体系异常,被 dispatch 顶层
except Exception 捕获后返回 500 InternalError,而同类畸形输入按契约应返回
400 ValidationError。
行为不一致对比:
- 同文件 _batch_add 对完全相同的 Modality() 调用做了 try-except 包裹转为 ValidationError(第 542-545 行);
- _delete_space 对 DeleteMode 用了 _enum_value 校验;
- _add 和 _evolve 漏掉了同样的保护,属于校验遗漏。
另外注意 Modality(payload.get("source", ...)) 的另一个隐患:
dict.get(key, default) 在 key 存在但值为 null 时返回 None 而非默认值,
"source": null 即可触发,无需传非法字符串。
重现步骤:
- 启动 HTTP 服务(mem2.0@5cc2f6c);
- POST /add,请求体 {"content": "test", "source": null} → 响应 500,期望 400;
- POST /add,请求体 {"content": "test", "source": "invalid"} → 同样 500;
- POST /evolve,请求体 {"mode": "invalid"} → 同样 500。
期望结果:
- source/mode 传 null 或非法值时返回 400 ValidationError 与明确错误信息(列出允许的枚举值);
- 合法值行为不变;不传参数时默认值不变(text / extract)。
修复建议:复用文件内已有的 _enum_value 工具函数(_list_spaces、_delete_space 等十余处在用),
两处分别改为 _enum_value(Modality, payload.get("source", payload.get("modality", "text")), name="source")
和 _enum_value(EvolveMode, payload.get("mode", "extract"), name="mode"),
1 文件约 +3-2 行。
详细的环境信息描述
详细的环境信息描述:
- 组件:JiuwenMemory agent-memory,mem2.0 分支,基线提交 5cc2f6c
- OS:Windows 11 x64(纯应用层逻辑缺陷,与操作系统无关,Linux/macOS 同样复现)
- Python:3.13.x(项目要求 >=3.11,与 Python 小版本无关)
- 涉及文件与行号:jiuwen_memory_entry/core/handler.py 第 471 行(_add 内 Modality(...))、
第 753 行(_evolve 内 EvolveMode(...));
对比参照 1:同文件 _batch_add 第 542-545 行已对 Modality() 做 try-except 转 ValidationError;
对比参照 2:同文件 _delete_space 第 967 行已用 _enum_value(DeleteMode, ...) 校验
- 触发入口:HTTP /add、/evolve 及 CLI/MCP 对应动作,三个入口共用 handler,全部受影响
- 依赖情况:修复复用文件内已有 _enum_value 函数,不新增任何依赖
- 触发条件:请求体 source/mode 字段传 null 或非法字符串即可触发,无需特定存储后端或配置
其他辅助信息
版本信息
感谢您的贡献 🎉!
Checklist
🐞 问题详细描述
问题详细描述:
jiuwen_memory_entry/core/handler.py 中两个 handler 直接用枚举构造函数解析参数,未捕获非法取值异常:
_add(第 471 行,mem2.0@5cc2f6c 基线):
modality = Modality(payload.get("source", payload.get("modality", "text")))
当请求体传 "source": null 时,payload.get 因 key 存在返回 None(默认值不生效),
Modality(None) 抛 ValueError;传 "source": "invalid" 同样抛 ValueError。
_evolve(第 753 行):
mode = EvolveMode(payload.get("mode", "extract"))
"mode": null 或非法字符串同样抛 ValueError。
缺陷影响:ValueError 不是 AgentMemoryError 体系异常,被 dispatch 顶层
except Exception 捕获后返回 500 InternalError,而同类畸形输入按契约应返回
400 ValidationError。
行为不一致对比:
另外注意 Modality(payload.get("source", ...)) 的另一个隐患:
dict.get(key, default) 在 key 存在但值为 null 时返回 None 而非默认值,
"source": null 即可触发,无需传非法字符串。
重现步骤:
期望结果:
修复建议:复用文件内已有的 _enum_value 工具函数(_list_spaces、_delete_space 等十余处在用),
两处分别改为 _enum_value(Modality, payload.get("source", payload.get("modality", "text")), name="source")
和 _enum_value(EvolveMode, payload.get("mode", "extract"), name="mode"),
1 文件约 +3-2 行。
详细的环境信息描述
详细的环境信息描述:
第 753 行(_evolve 内 EvolveMode(...));
对比参照 1:同文件 _batch_add 第 542-545 行已对 Modality() 做 try-except 转 ValidationError;
对比参照 2:同文件 _delete_space 第 967 行已用 _enum_value(DeleteMode, ...) 校验
其他辅助信息
版本信息
感谢您的贡献 🎉!