WaterCrawl API client disables HTTP timeouts for crawl requests

用户在使用 Dify 自托管(Source 或 Docker)环境,配置 WaterCrawl 作为网站爬取提供者时触发。当 WaterCrawl 的 base_url 指向一个接受 TCP 连接但不返回响应的端点时,crawl 创建、状态轮询、结果分页或爬取操作会被无限阻塞。

WaterCrawl API client disables HTTP timeouts for crawl requests

WaterCrawl API client disables HTTP timeouts for crawl requests

快速结论:该问题发生在 Dify 自托管环境中使用 WaterCrawl 网站爬取功能时,由于 WaterCrawl API 客户端的共享 httpx.Client 被设置为 timeout=None,导致所有请求无超时限制。优先排查并替换 init_session() 中的 timeout=None 为有界超时配置。

问题场景

用户在使用 Dify 自托管(Source 或 Docker)环境,配置 WaterCrawl 作为网站爬取提供者时触发。当 WaterCrawl 的 base_url 指向一个接受 TCP 连接但不返回响应的端点时,crawl 创建、状态轮询、结果分页或爬取操作会被无限阻塞。

报错原文

WaterCrawlAPIClient disables httpx timeouts for its shared session

return httpx.Client(headers=headers, timeout=None)

{'timeout': None, 'has_timeout_key': True, 'client_type': 'DummyClient'}

原因分析

WaterCrawl API 客户端的 init_session() 方法在 BaseAPIClient 中显式设置了 timeout=None,导致共享的 httpx.Client 对所有请求路径(包括 create_crawl_request、get_crawl_request、get_crawl_request_results、monitor_crawl_request、scrape_url)禁用超时处理。虽然 download_result() 方法已通过 PR #37495 修复为 timeout=30,但共享会话的超时问题仍未解决。

环境排查

  • Dify 版本:当前 main 分支(通过代码审查确认)
  • 部署方式:Self Hosted (Source) 或 Self Hosted (Docker)
  • 相关文件路径:api/core/rag/extractor/watercrawl/client.py
  • 检查组件:WaterCrawl 爬取提供者配置

解决步骤

  1. 可优先尝试:修改 init_session() 方法,将 timeout=None 替换为有界超时配置。参考 PR #33267 的模式,可使用 httpx.Timeout(30.0, connect=10.0) 作为默认值。
  2. 对于 monitor_crawl_request() 这类流式请求,如果需要更长的读取超时,可以为该特定请求单独传递一个 per-request 超时参数。
  3. 添加单元测试,断言共享客户端不再传递 timeout=None
  4. 更新代码后,重启 Dify 服务使配置生效。

验证方法

执行以下验证步骤:

  1. 配置 WaterCrawl 爬取提供者,指向一个会延迟响应或滞后的端点。
  2. 创建 crawl 请求,发起爬取任务。
  3. 确认任务在可接受时间内超时或正常返回,不再无限阻塞。
  4. 检查日志确认 httpx 客户端超时设置已生效(可通过小规模本地测试验证 timeout 值不再是 None)。

参考来源

langgenius/dify #37512

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

celebrityanime
celebrityanime
文章: 9288

发表回复

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