WaterCrawl result downloads disable HTTP timeouts

用户在 Dify 自托管(Self Hosted Source)部署中,配置 WaterCrawl 作为网站数据源(Website Datasource Provider)。启动爬取任务后,WaterCrawl 返回事件流,其中每个事件包含一个 result URL。当该结果 URL 的 TCP 连

WaterCrawl result downloads disable HTTP timeouts

WaterCrawl result downloads disable HTTP timeouts

快速结论:该问题出现在 Dify 自托管部署中,使用 WaterCrawl 作为数据源采集网站内容时。问题根因是 download_result() 方法在请求结果 URL 时使用了 timeout=None,导致连接被挂起时无法触发超时。优先排查 api/core/rag/extractor/watercrawl/client.pydownload_result 方法的超时配置。

问题场景

用户在 Dify 自托管(Self Hosted Source)部署中,配置 WaterCrawl 作为网站数据源(Website Datasource Provider)。启动爬取任务后,WaterCrawl 返回事件流,其中每个事件包含一个 result URL。当该结果 URL 的 TCP 连接正常建立但返回 JSON 数据时发生停顿,则触发该问题。

报错原文

response = httpx.get(result_object["result"], timeout=None)

原因分析

api/core/rag/extractor/watercrawl/client.pydownload_result() 方法中(第 220 行左右),调用 httpx.get() 时传入了 timeout=None,这会禁用 HTTPX 的请求超时机制。这与 process_eventstream() 中处理长时间运行的 SSE 流不同,download_result() 仅用于下载单个 JSON 结果载荷,应当使用有限超时时间。如果结果端点停顿,会导致处理 WaterCrawl 提取的工作线程或请求无限期等待而不会失败。

环境排查

  • Dify 版本:main branch at b6b9165d
  • 部署方式:Self Hosted (Source)
  • 检查文件路径:api/core/rag/extractor/watercrawl/client.py
  • 检查具体行号:第 219-226 行之间的 download_result() 方法

解决步骤

  1. 打开 api/core/rag/extractor/watercrawl/client.py 文件。
  2. 找到 download_result() 方法,定位到 response = httpx.get(result_object["result"], timeout=None) 这行代码。
  3. 可优先尝试:将该行中的 timeout=None 替换为合理的有限超时时间,例如 timeout=httpx.Timeout(10.0, connect=3.0)(读取超时 10 秒,连接超时 3 秒)。对于较大载荷可适当调整读取超时。
  4. 相关修改可参考已有 PR #33267,该 PR 对 WaterCrawl 的认证提供者 HTTP 调用添加了明确的超时设置,但未覆盖 download_result()
  5. 保存文件并重启 Dify 服务。

验证方法

重新配置 WaterCrawl 数据源并启动爬取任务,确保在结果 URL 停顿或缓慢响应时,请求能在超时时间内断开并返回错误(如超时异常),而不是无限期等待。

参考来源

langgenius/dify #37494

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

celebrityanime
celebrityanime
文章: 9288

发表回复

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