[Question]: An error occurred when calling the agent through the API in version v0.22.1

用户在使用 RAGFlow v0.22.1 版本,通过 API 调用 Agent 功能时触发。该版本之前运行正常。

[Question]: An error occurred when calling the agent through the API in version v0.22.1

[Question]: An error occurred when calling the agent through the API in version v0.22.1

快速结论:该报错通常出现在通过 API 调用 RAGFlow Agent 时,核心原因是 agent runner (canvas.run) 在 v0.22.1 被重构为异步生成器(async generator),但部分 API 端点和内部函数仍使用同步 for 循环对它进行迭代。优先排查代码中是否存在对 canvas.run 的普通 for 循环,并替换为 async for。

问题场景

用户在使用 RAGFlow v0.22.1 版本,通过 API 调用 Agent 功能时触发。该版本之前运行正常。

报错原文

{"code":100,"data":null,"message":"TypeError("'async generator' object is not iterable")"}

原因分析

这是 v0.22.1 版本引入的一个回归(regression)问题。核心 Agent 运行器 canvas.run 被重构为异步生成器,但部分 API 端点或内部函数仍使用普通的 for 循环去迭代它。根据 Python 语言规则,你不能用同步 for 循环来遍历异步生成器,因此抛出了 TypeError("'async generator' object is not iterable")。此问题在旧版本中未出现,是因为当时并未强制执行异步生成器约定。

已知修复:该问题已在 PR #11404 中解决,通过将所有受影响的函数和 API 端点改为使用 async for。相关代码位置在 canvas_service.py

环境排查

  • RAGFlow 版本:确认是否为 v0.22.1。
  • Python 版本:建议 Python >= 3.9,因为 async generator 特性在 3.6+ 引入,但早期版本可能表现不同。
  • 检查是否使用了官方 Docker 镜像(nightly 版本已包含修复)。

解决步骤

  1. 方法一:升级到最新版或使用 nightly 镜像。 官方推荐的方式是直接拉取 nightly Docker 镜像,其中已包含针对此次回归问题的修复。
  2. 方法二:手动修复代码。 如果你需要自行修改,请找到所有对 canvas.run(...) 进行迭代的位置(主要在 API 端点和内部服务函数中,如 canvas_service.py),将普通 for 循环改为异步 for 循环。具体操作如下:
    # 修改前(会报错)
    for ans in canvas.run(...):
        ...
    
    # 修改后
    async for ans in canvas.run(...):
        ...
    

    注意,执行 async for 的函数本身也必须是 async def 定义的异步函数。

  3. 方法三:针对所有处理 agent completions 或流式响应的端点做相同修改。 不仅仅是 canvas.run,任何被重构为 async generator 的同类代码都需要统一替换。

验证方法

修改完成后,通过 API 重新调用 Agent 功能,确认不再返回 TypeError("'async generator' object is not iterable") 的 100 错误码,且能获取正常的返回数据或流式响应。

参考来源

infiniflow/ragflow #11619

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

celebrityanime
celebrityanime
文章: 11235

发表回复

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