OpenManus 浏览器任务死循环?先别急着改 Playwright,检查 Agent 模型配置
如果你正在用 OpenManus 或类似的浏览器 Agent 跑自动化任务,大概率遇到过这个场景:Agent 打开一个网页,点击搜索按钮,页面还没加载完就去抓内容,抓到空白,判定失败,然后重试——同样的操作再来一遍,再失败,再重试。日志里wait_for_selector超时和模型请求交替出现,你分不清到底是页面等待逻辑没写好,还是 LLM 节点本身就没正常发出请求。
这篇文章不讨论怎么修 Playwright 的等待策略,也不教你写死循环检测器。那些是 OpenManus 框架层面的事。我们要解决的是一个更前置的问题:在 LangGraph 编排的 Planner / Executor / Reviewer 节点里,LLM 请求本身是否稳定发出、是否被正确认证。如果模型通道配置有问题,401 和超时会夹在重试循环里,让你误以为是 Agent 逻辑出了 bug。
TaoToken(官网:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=)在这里的角色很明确:它是一个兼容 OpenAI 接口的模型通道,你把它配到 OpenManus 读取模型配置的地方,让 Planner、Executor、Reviewer 的请求能稳定发出去。配通之后,再去按原文思路加wait_for_selector、wait_for_network_idle和死循环检测器,排查路径才清晰。
先搞清楚:死循环里到底谁在报错
OpenManus 这类浏览器 Agent 的典型执行链路是这样的:
- Planner 节点:LLM 分析当前任务,决定下一步做什么(比如“打开百度,搜索关键词”)。
- Executor 节点:调用 Playwright 工具执行具体操作(
goto、click、fill等)。 - Reviewer 节点:LLM 检查执行结果,判断是否成功、是否需要重试。
当页面动态加载没处理好时,Executor 返回“失败”,Reviewer 判断“需要重试”,Planner 再次生成相似指令——循环开始。但这里有一个容易被忽略的点:每次循环,Planner 和 Reviewer 都在消耗 Token。如果模型配置不稳定,请求时好时坏,日志里就会出现“模型调用失败 → 工具执行失败 → 重试 → 模型调用又失败”的混合报错。
你以为是 Playwright 的wait_for_selector没写对,实际上可能是 LLM 节点根本没拿到有效响应,导致 Planner 生成了空指令或错误指令,Executor 自然执行失败。
所以排查顺序应该是:先确认模型通道稳定,再去看页面等待和死循环检测。
TaoToken 前置:注册、创建 Key、确认 Base URL
在改 OpenManus 配置之前,先把模型通道准备好。
第一步:注册并创建 Key
打开 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,注册账号后进入控制台,在 API Keys 页面创建一个新的 Key。这个 Key 就是后面填到 OpenManus 配置里的凭证。
第二步:确认 Base URL
TaoToken 的 API 地址是:
https://taotoken.net/api注意两点:
- 不要带
/v1。有些框架会自动拼接/v1/chat/completions,你填 Base URL 时只需要填到/api这一层。 - 不要把官网地址当 Base URL。
https://taotoken.net/?utm_source=...是给人看的页面,不是 API 端点。
第三步:确认模型 ID
在控制台的模型列表里选一个你打算用于 Agent 的模型,记下它的 Model ID。Planner 和 Reviewer 可以用同一个模型,也可以按需分级——比如 Planner 用强一点的模型,Reviewer 用快一点的模型。这取决于你的 Token 预算和任务复杂度。
可复制配置:把 TaoToken 接入 OpenManus 的 LLM 节点
OpenManus 读取模型配置的位置通常在项目的配置文件中,可能是config.toml、.env或config.yaml,具体取决于你用的版本。下面给出通用改法。
方式一:环境变量(推荐)
在 OpenManus 项目根目录的.env文件里,找到或添加以下字段:
# OpenManus LLM 配置 OPENAI_API_KEY=YOUR_API_KEY OPENAI_BASE_URL=https://taotoken.net/api OPENAI_MODEL=gpt-4o-mini如果你用的是其他模型,把OPENAI_MODEL换成你在 TaoToken 控制台看到的 Model ID。
方式二:config.toml
如果 OpenManus 使用config.toml管理模型配置,找到[llm]或[model]段落:
[llm] api_key = "YOUR_API_KEY" base_url = "https://taotoken.net/api" model = "gpt-4o-mini" max_tokens = 4096 temperature = 0.7方式三:LangGraph 节点级配置
如果你在 LangGraph 里自定义了 Planner / Executor / Reviewer 节点,并且每个节点单独初始化 LLM 客户端,那么需要在每个节点的初始化处传入 Base URL 和 Key:
from langchain_openai import ChatOpenAI llm = ChatOpenAI( model="gpt-4o-mini", api_key="YOUR_API_KEY", base_url="https://taotoken.net/api", temperature=0.7, ) # Planner 节点 def planner_node(state): response = llm.invoke(state["messages"]) return {"plan": response.content} # Reviewer 节点 def reviewer_node(state): response = llm.invoke(state["review_messages"]) return {"review": response.content}关键点:base_url填https://taotoken.net/api,不要加/v1,不要填官网地址。Key 用你在 TaoToken 控制台创建的那个。
验证请求:跑一个浏览器检索任务,看日志里有没有 401
配置改完之后,不要直接上复杂任务。先跑一个最简单的浏览器检索流程,确认模型请求能成功发出。
验证步骤:
- 启动 OpenManus,执行一个基础任务,比如“打开百度,搜索‘LangGraph 教程’,返回第一条结果的标题”。
- 观察控制台日志或 LangFuse trace。
- 重点看两个东西:
- 模型请求是否成功:日志里应该有 LLM 调用的记录,没有 401、403 或连接超时。
- Planner / Reviewer 是否正常返回:如果模型通道通了,Planner 应该能生成合理的下一步指令,Reviewer 能给出明确的成功/失败判断。
成功标志:
- 日志中看到
POST https://taotoken.net/api/chat/completions返回 200。 - Planner 输出的指令不是空的,也不是重复的无效指令。
- 整个任务能在有限步骤内完成,而不是无限重试。
如果这一步就出现 401,说明 Key 或 Base URL 配错了。回到上一步检查:Key 是否复制完整,Base URL 是否带了多余的/v1或官网地址。
验证通过后,再去处理死循环问题。
这时候你加wait_for_selector、wait_for_network_idle,或者写一个基于 Action 语义相似度的死循环检测器,排查起来就清晰了——因为你知道模型通道是稳定的,问题只可能出在页面等待逻辑或 Agent 编排策略上。
本篇常见错排查
错误一:401 Unauthorized
最常见的原因有三个:
- Key 复制时带了空格或换行。
- Base URL 填成了
https://taotoken.net/api/v1,多了一层/v1。 - Base URL 填成了官网地址
https://taotoken.net/?utm_source=...,这不是 API 端点。
错误二:模型返回空内容或乱码
检查 Model ID 是否填对。TaoToken 控制台里显示的 Model ID 是什么,配置里就填什么。不要凭记忆写gpt-4或claude-3,以控制台为准。
错误三:Planner 一直生成重复指令
如果模型通道确认没问题,但 Planner 还是在死循环里生成相似指令,那就是 Agent 编排层面的问题了。这时候需要按原文思路,在 LangGraph 里加死循环检测器:计算当前 Action 与过去 3 次 Action 的语义相似度,连续相似就强制打断,给 Agent 发一条系统提示让它换策略。
错误四:LangFuse trace 里看不到模型请求
检查 OpenManus 是否真的读取了你修改的配置文件。有些项目会优先读环境变量,有些会读config.toml,确认你改的是实际生效的那个。另外,LangFuse 的集成需要在代码里显式初始化 callback,不是自动生效的。
错误五:Executor 执行成功但 Reviewer 判断失败
这通常是 Reviewer 的 Prompt 或模型配置问题。确认 Reviewer 节点用的 LLM 客户端也指向了正确的 Base URL 和 Key。如果 Planner 和 Reviewer 用了不同的模型,检查两个模型的配置是否都正确。
配通模型通道,再去修 Agent 逻辑
回到最初的问题:OpenManus 浏览器任务死循环,到底该怎么排查?
正确的顺序是:
- 先确认模型通道稳定。用 TaoToken 的 Base URL 和 Key 配好 Planner / Executor / Reviewer 的 LLM 节点,跑一个简单任务验证请求能成功发出。
- 再处理页面等待。按原文思路,封装
wait_for_selector和wait_for_network_idle,让 Agent 学会等页面加载完再操作。 - 最后加死循环检测。在 LangGraph 架构层加语义相似度检测,连续相似 Action 就强制打断。
TaoToken 在这里只做一件事:让你的 LLM 节点请求能稳定发出去。它不修 Playwright,不写死循环检测器,也不替代 OpenManus 的 Agent 编排逻辑。但如果没有稳定的模型通道,你会在 401 和重试之间浪费大量时间,误以为问题出在页面等待上。
下一步动作:
- 如果你还没创建 Key,打开 https://taotoken.net/api-keys 创建一个,然后按本文的配置改 OpenManus。
- 如果你在配置过程中遇到接入问题,参考接入文档:https://taotoken.net/doc
- 如果你已经配通了模型通道,想进一步优化 Agent 的 Token 消耗和模型分级策略,可以了解 Coding Plan:https://taotoken.net/coding-plan
先把模型请求跑通,再去修死循环。顺序对了,排查效率会高很多。