TypeError: Object of type partial is not JSON serializable

该报错发生在 RAGFlow 0.26.0 的 Agent(智能体)画布中,当添加“问题分类节点”或“路由分类与条件节点”时,工作流状态在序列化进入 SSE 响应流时泄漏了内部使用的 functools.partial 对象,导致 json.dumps() 无法序列化。优先排查 RAGFlow 版本

快速结论:该报错发生在 RAGFlow 0.26.0 的 Agent(智能体)画布中,当添加“问题分类节点”或“路由分类与条件节点”时,工作流状态在序列化进入 SSE 响应流时泄漏了内部使用的 functools.partial 对象,导致 json.dumps() 无法序列化。优先排查 RAGFlow 版本是否为 0.26.0 及是否使用了分类/路由类节点。

适用环境:RAGFlow 0.26.0(Docker CPU 版本,容器名 ragflow-cpu-1),模型调用链路包含 LiteLLM(deepseek-v4-pro)与本地 bge-m3 向量模型;此问题与报告的 Docker 日志环境一致。

最快修复方案:暂无官方已合并的补丁版本。可优先尝试在容器中修改 agent_api.py(约第 289 行附近)的 json.dumps() 调用,为其增加 default 参数:default=lambda o: None if callable(o) else str(o);或修改 /ragflow/api/utils/json_encode.pydefault 方法加入 if callable(obj): return None

注意事项:以上修改属于本地临时补丁,不是官方发布版本,后续升级 RAGFlow 可能会被覆盖;Issue 中提到的 PR #14210 尚未合并,因此该修复未经过官方完整验证,建议仅在测试环境先行验证,并关注该 PR 的合并进度。

问题场景

用户在 RAGFlow 0.26.0 的 Agent 编排界面中构建流程,基础节点(如普通对话/检索)可以正常工作。当额外添加“路由分类与条件节点”或“问题分类节点”时,流程保存或执行阶段抛出 JSON 序列化错误,Docker 日志中能看到完整报错与模型调用记录。用户在日志中可以看到分类模型实际已正确输出了“提取数据”等结果,说明 LLM 调用本身成功,问题出在节点结果回传工作流状态时。

报错原文

TypeError: Object of type partial is not JSON serializable

原因分析

这是一个序列化缺陷:RAGFlow 为支持延迟流式执行,内部使用 functools.partial 包装后续调用。分类节点或路由节点在生成结果后,其返回对象中携带了尚未被消费的 partial 对象。当工作流状态被序列化并以 SSE(Server-Sent Events)推送到前端时,json.dumps() 无法处理 partial 这类可调用对象,因而抛出 TypeError

可能原因还包括:RAGFlow 在版本 0.26.0 中,SSE 序列化路径(agent_api.py)未设置 json.dumpsdefault 兜底处理函数;同时仓库内的自定义 JSON 编码器 json_encode.py 同样没有为可调用对象提供 fallback。社区已有对应修复 PR(#14210),但尚未合并进主分支。

环境排查

  • 确认 RAGFlow 版本为 0.26.0(docker exec ragflow-cpu-1 cat /ragflow/VERSION 或其他方式核验)
  • 确认是使用 Docker 部署的 CPU 版本(容器名为 ragflow-cpu-1
  • 检查模型配置中是否通过 LiteLLM 接入大模型,并确认 bge-m3 本地向量模型的调用方式
  • 复现时只添加分类节点或路由节点,删除其他无关节点,判断是否仍能触发

解决步骤

  1. 进入容器:docker exec -it ragflow-cpu-1 bash
  2. 备份原文件:cp /ragflow/api/apps/restful_apis/agent_api.py /ragflow/api/apps/restful_apis/agent_api.py.bak
  3. 编辑 /ragflow/api/apps/restful_apis/agent_api.py,定位到 ≈289 行或 ≈315 行附近,找到 json.dumps(ans, ensure_ascii=False)
  4. 改为:json.dumps(ans, ensure_ascii=False, default=lambda o: None if callable(o) else str(o)),保存退出(可优先尝试该方案)
  5. 重启 RAGFlow 容器或相关 API 服务使改动生效
  6. 另一种可选的辅助补丁(若问题仍存在):编辑 /ragflow/api/utils/json_encode.py,在其 default 方法中加入 if callable(obj): return None 并重启
  7. 升级或关注官方合并状态:跟踪 PR #14210,待官方修复合入后升级到包含修复的版本

验证方法

重启服务后,回到 Agent 画布重新添加“问题分类节点”或“路由分类与条件节点”,运行一次对话或直接保存该 Agent 流程;若不再出现 TypeError: Object of type partial is not JSON serializable,且前端画布能正常显示分类结果,则说明补丁生效。也可以在容器内持续查看日志确认无新报错。

参考来源

infiniflow/ragflow #16448

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 21648

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注