Skip to content

[Bug]: fix(handler): _add/_evolve 枚举参数未捕获非法取值,source/mode 传 null 或非法字符串返回 500 #409

Description

Checklist

  • 我已经搜索过相关问题,但没有得到预期的帮助。
  • 最新版本中该错误尚未修复。
  • 请注意,如果您提交的Bug描述缺少相应的环境信息和最小可复现的demo,我们将很难复现和解决该问题,从而降低收到反馈的可能性,甚至该问题将被关闭。

🐞 问题详细描述

问题详细描述:

jiuwen_memory_entry/core/handler.py 中两个 handler 直接用枚举构造函数解析参数,未捕获非法取值异常:

  1. _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。

  2. _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 即可触发,无需传非法字符串。

重现步骤:

  1. 启动 HTTP 服务(mem2.0@5cc2f6c);
  2. POST /add,请求体 {"content": "test", "source": null} → 响应 500,期望 400;
  3. POST /add,请求体 {"content": "test", "source": "invalid"} → 同样 500;
  4. 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 或非法字符串即可触发,无需特定存储后端或配置

其他辅助信息

版本信息

感谢您的贡献 🎉!

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions