快速结论:该问题出现在 Dify 自托管部署中,使用 WaterCrawl 作为数据源采集网站内容时。问题根因是 download_result() 方法在请求结果 URL 时使用了 timeout=None,导致连接被挂起时无法触发超时。优先排查 api/core/rag/extractor/watercrawl/client.py 中 download_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.py 的 download_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()方法
解决步骤
- 打开
api/core/rag/extractor/watercrawl/client.py文件。 - 找到
download_result()方法,定位到response = httpx.get(result_object["result"], timeout=None)这行代码。 - 可优先尝试:将该行中的
timeout=None替换为合理的有限超时时间,例如timeout=httpx.Timeout(10.0, connect=3.0)(读取超时 10 秒,连接超时 3 秒)。对于较大载荷可适当调整读取超时。 - 相关修改可参考已有 PR #33267,该 PR 对 WaterCrawl 的认证提供者 HTTP 调用添加了明确的超时设置,但未覆盖
download_result()。 - 保存文件并重启 Dify 服务。
验证方法
重新配置 WaterCrawl 数据源并启动爬取任务,确保在结果 URL 停顿或缓慢响应时,请求能在超时时间内断开并返回错误(如超时异常),而不是无限期等待。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


