issue: fetch_url can remain stuck indefinitely with remote Playwright while browser and network are idle

该问题通常出现在 Open WebUI 使用内置 fetch_url 工具并连接远程 Playwright 服务的场景中,表现为 UI 一直显示 fetch_url executing... 但浏览器和网络均已空闲。优先确认 Open WebUI 版本是否为 v0.11.4 或更高,因为 v0.11

快速结论:该问题通常出现在 Open WebUI 使用内置 fetch_url 工具并连接远程 Playwright 服务的场景中,表现为 UI 一直显示 fetch_url executing... 但浏览器和网络均已空闲。优先确认 Open WebUI 版本是否为 v0.11.4 或更高,因为 v0.11.4 已修复 Playwright loader 被 WebSocket 页面卡死的问题。

适用环境:Open WebUI v0.11.3(Docker 安装),操作系统 Debian 13 / Linux 6.12.x / x86_64,Ollama 0.33.1,远程 Playwright 服务运行在容器中,本地 Python Playwright driver 位于 /usr/local/lib/python3.11/site-packages/playwright/driver/node

最快修复方案:将 Open WebUI 升级到 v0.11.4 或更高版本。Issue 维护者明确说明 v0.11.4 修复了 Playwright loader 在页面打开 WebSocket 时可能永久卡住且日志无输出的问题,同版本还包含另外两个 Playwright loader 修复。

注意事项:如果你在默认 loader 下遇到的是模型反复调用 fetch_url(工具调用循环),而不是单次调用卡死,那属于不同问题,需要单独提交 Issue 并附上后端日志。若升级到 v0.11.4 后仍能复现,维护者建议在容器内执行 py-spy dump --pid <open-webui pid> 获取卡住的 worker 堆栈后再重新打开 Issue。

问题场景

用户在 Open WebUI 中运行 agent / tool 工作流,模型调用内置的 fetch_url 工具抓取网页内容。发起的 fetch_url 调用进入执行状态后不再返回,UI 持续显示 fetch_url executing...,超过 20–30 分钟仍未完成或报错。该问题为间歇性出现,同一条 agent 在正常情况下可以成功完成,甚至能处理更多并发或串行的 fetch_url 调用。

诊断时发现:GPU 利用率为 0%,模型推理已停止;SearXNG 处于空闲状态,搜索阶段已完成;远程 Playwright 容器中的 Chromium 进程存在但已空闲,没有 renderer 进程,也没有到 TCP/80 或 TCP/443 的出站连接,唯一连接是 Open WebUI 到 Playwright 的协议连接。Open WebUI 侧 Playwright driver 线程和远程 Playwright 服务均停留在 futex/epoll 等待状态,Open WebUI 容器日志中没有相关异常、超时或 traceback。仅重启 Open WebUI 容器即可立即清除该状态,Playwright 服务和远程容器无需重启。

报错原文

fetch_url executing...

poll([{fd=15, events=POLLIN}, {fd=16, events=POLLIN}], 2, 3999)
    = 0 (Timeout)

poll([{fd=15, events=POLLIN}, {fd=16, events=POLLIN}], 2, 4000)

futex(... FUTEX_WAIT_BITSET_PRIVATE ...)
epoll_pwait(...)

127.0.0.1:60608 -> 127.0.0.1:3000 ESTABLISHED

ESTAB ... 172.25.0.2:3000 172.25.0.1:<port>

原因分析

根据维护者在 Issue 中的回复,v0.11.4 修复了一个 Playwright loader 永久卡住的 bug:当页面打开 WebSocket 时,fetch_url 使用的 Playwright loader 可能永远无法完成,并且在重启前日志中没有任何记录。同一版本还包含另外两个 Playwright loader 修复。

从诊断现象看,卡住时 Chromium 已空闲、没有 renderer 进程、没有出站 HTTP/HTTPS 连接,Open WebUI 侧 driver 与远程 Playwright 服务都停留在等待状态,说明问题更可能出在 Playwright 生命周期 / 连接管理层面,而不是目标 URL 不可访问或网络请求本身。Issue 中也明确说明 HTTP 错误(例如 CloudFront HTTP 403)可以被正常返回给模型并继续工作流,因此不是简单的目标 URL 无法访问。

另有相关 Issue 提到 Playwright 页面或浏览器在失败时未正确关闭(#25880),以及页面关闭时仍有子请求在飞行中会触发 TargetClosedError(#28869),这类 Playwright 生命周期边界情况可能与本次卡住问题属于同一区域的故障路径。

环境排查

  • 确认 Open WebUI 版本:Issue 报告为 v0.11.3,需升级到 v0.11.4 或更高版本。
  • 确认安装方式:Docker 安装。
  • 确认操作系统:Debian 13、Linux 6.12.x、x86_64。
  • 确认 Ollama 版本:0.33.1。
  • 确认 Playwright 部署方式:Open WebUI 使用本地 Python Playwright driver(playwright/driver/nodepackage/cli.js run-driver),并连接到独立的远程 Playwright 服务端口(示例中为 127.0.0.1:3000)。
  • 确认 Open WebUI 容器日志中是否有异常、超时或 traceback;Issue 报告在卡住期间没有相关日志输出。
  • 如有必要,检查 Open WebUI 进程 PID,用于后续 py-spy dump
  • Issue 未提供 Python、CUDA、PyTorch、显卡型号的明确版本信息,这些项目无法从现有证据确认。

解决步骤

  1. 确认当前 Open WebUI 版本,若为 v0.11.3 或更早版本,升级到 v0.11.4 或更高版本。Issue 维护者明确表示 v0.11.4 已修复 Playwright loader 因页面 WebSocket 永久卡住的问题,并同时包含另外两个 Playwright loader 修复。
  2. 升级后重新运行之前会卡住的 agent / 工作流,观察 fetch_url 是否能正常返回内容、HTTP/Playwright 错误或按有界超时终止。
  3. 若升级到 v0.11.4 或更高版本后仍能复现,在 Open WebUI 容器内获取卡住进程的 PID,并执行 py-spy dump --pid <open-webui pid> 获取 worker 堆栈。
  4. 携带堆栈信息重新打开或新建 Issue,说明 Open WebUI 版本、Playwright 部署方式、卡住时的诊断输出,以便定位等待位置。
  5. 如果你使用的是默认 loader,并且现象是模型反复调用 fetch_url 而不是单次调用卡死,应单独提交 Issue 并附上该运行的后端日志,因为维护者将其归类为模型工具调用循环,而非本次 Playwright loader 卡死问题。

验证方法

升级到 v0.11.4 或更高版本后,重新执行原本会触发卡住的 agent / 工作流,确认 fetch_url 调用能够正常返回提取内容、返回 HTTP/Playwright 错误或按超时终止,不再出现 fetch_url executing... 长时间挂起。同时可检查 Open WebUI 容器日志中是否出现对应完成记录,以及 Playwright 侧是否不再残留空闲的 Chromium 会话。若问题仍复现,则按上述步骤收集 py-spy dump 堆栈后重新打开 Issue。

参考来源

open-webui/open-webui #29773

相关 Issue:#29741#25880#28869

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 25045

发表回复

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