快速结论:该报错发生在 RAGFlow 数据管道(dataflow agent)的存储 DSL 中缺少 path 键时,导致 Graph.load() 在启动阶段直接抛出 KeyError: 'path',任务在 0 秒内失败。优先排查已保存画布的 DSL 中是否存在 path 键,并考虑将严格取值改为 .get("path", [])。
适用环境:RAGFlow v0.27.0(commit 2db8eb6c91184402e2979b6b52b77063919c7e17),Docker Compose 部署(docker/docker-compose.yml,ragflow-cpu profile),macOS 宿主机的 Docker Desktop。
最快修复方案:暂无官方发布版中的已验证一键修复;Issue 中确认的修复方式是将 agent/canvas.py 中 Graph.load() 的 self.path = self.dsl["path"] 改为 self.path = self.dsl.get("path", [])(与同一类中 memory 字段的读取方式一致),该改动已在本地验证通过。
注意事项:若你无法直接修改源码,可尝试手动为出问题画布的 DSL 补上 path 键(例如置为 []),但这只是临时绕过,下一次画布自动保存仍可能再次丢失该键。正式修复需要等待上游合并 PR 或自行维护补丁。
问题场景
用户在 RAGFlow 中创建了数据管道(dataflow agent,category=dataflow_canvas),之前运行正常。某次画布编辑器自动保存(发生在后端重连后)导致存储的 DSL 丢失了 path 键。此后无论是从画布编辑器点击“Test Run”,还是解析引用了该管道作为解析方法的知识库文档,任务都会在 0 秒内立即失败,且日志中没有任何组件执行痕迹。
报错原文
[ERROR][Exception]: 'path'
Task has been received.
[ERROR][Exception]: 'path'
File "agent/canvas.py", line 111, in load
self.path = self.dsl["path"]
KeyError: 'path'
原因分析
根本原因在 agent/canvas.py 的 Graph.load() 方法:它使用严格的方括号取值 self.path = self.dsl["path"],而 path 实际上是运行时执行状态(记录已访问组件 id 的列表),并不属于画布作者编辑的图结构本身。
同一类中对该字段的处理方式已经表明它是非必需的后端行为字段:
Graph.__init__默认值为self.path = []rag/flow/pipeline.py中Pipeline.run()首次使用时自行初始化:if not self.path: self.path.append("File")- 同类字段
memory已用防御性读取:self.memory = self.dsl.get("memory", [])
因此,从未执行过的 DSL,或经过不保留该后端字段的代码路径重新保存后的 DSL,合法地没有 "path" 键。Issue 中通过直接查看 user_canvas 表确认了受影响画布存储的 DSL 顶层键为 ["components", "globals", "graph", "messages", "variables"],完全没有 path 键。
环境排查
- 确认 RAGFlow 镜像版本是否为 v0.27.0 或包含相同
agent/canvas.py代码的版本 - 检查部署方式是否为 Docker Compose 且使用
ragflow-cpuprofile(Issue 中确认的环境;不排除其他部署方式同样受影响) - 在数据库中检查出问题的画布 DSL:
SELECT dsl FROM user_canvas WHERE id = '<画布_id>';,确认顶层 JSON 键中是否有path - 若需要复现,可在 MySQL 中执行:
UPDATE user_canvas SET dsl = JSON_REMOVE(dsl, '$.path') WHERE id = '<id>';
解决步骤
- 确认问题范围:检查出现报错的画布 ID,查看
user_canvas表中该画布的dsl字段是否缺少path键。 - 临时绕过(不修改源码):手动为 DSL 补上
path键,例如执行 MySQL 更新,将 DSL 中path设为空数组。注意这只是临时方案,下次画布自动保存仍可能再次丢失该键。 - 正式修复(需要修改源码):编辑
agent/canvas.py中Graph.load()方法,将self.path = self.dsl["path"]改为self.path = self.dsl.get("path", []),与同类的memory字段保持一致的防御性读取方式。 - 重新构建或重启 RAGFlow 服务使源码修改生效。
- 如有能力,可向上游仓库提交 PR(该一行的修复与现有代码风格完全一致,应易于被接受合并)。
验证方法
修复后,对该画布重新执行“Test Run”,以及触发引用该管道作为解析方法的知识库文档解析。确认任务不再立即失败,日志中出现正常的组件执行记录(如“File fetched.”),且 [ERROR][Exception]: 'path' 不再出现。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。
![[Bug]: Current main Docker compose fails to start with v0.25.6 image](https://www.chat-gpts.plus/wp-content/uploads/2026/08/15692-ba3ab69e-768x403.jpg)
![[Bug]: Redacted tool-call arguments ("redacted-by-litellm") spam "Failed to parse tool call arguments" warnings via spend-log tool index](https://www.chat-gpts.plus/wp-content/uploads/2026/08/36647-d46649b0-768x403.jpg)
