ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

动手实践OpenHands系列学习笔记14:网页浏览与信息提取的TaoToken配置与验证

动手实践OpenHands系列学习笔记14:网页浏览与信息提取的TaoToken配置与验证 1. OpenHands 网页浏览与信息提取为什么需要统一模型通道OpenHands 是一个能自己写代码、跑命令、开浏览器抓页面的 AI 开发代理。它和普通聊天机器人的最大区别在于它会真的去访问一个 URL把页面 DOM 拉下来再用模型判断「这段内容里哪些是我要的字段」。所以网页浏览与信息提取这条链路里模型调用不是可选项而是每一步决策的发动机。我先把这条链路拆开看。一次典型的 OpenHands 信息提取任务内部至少发生四类模型调用第一类是任务规划代理拿到「从某页面提取标题、价格、更新时间」这种指令后先决定用 HTTP 客户端还是无头浏览器第二类是页面理解把 HTML 或渲染后的文本喂给模型让它定位目标元素第三类是结构化输出把非结构化文本转成 JSON第四类是结果校验判断提取到的字段是否完整、是否要重试。四类调用如果各自走不同的 Key、不同的 Base URL配置会迅速失控。这就是为什么需要统一通道。OpenHands 的配置文件里模型接入点通常集中在config.toml或环境变量里而浏览器工具、代码执行器、主代理可能读的是不同来源。一旦你换了模型供应商就要在多个地方改地址和密钥漏一处就报 401。把模型调用收敛到一个兼容 OpenAI 协议的 Base URL 上代理的每个子模块都指向同一个入口改一处即可全局生效。适合读这篇的人有三类正在用 OpenHands 做自动化信息收集的开发者想把网页抓取任务接进自己 Agent 流程的工程师以及被多 Key 管理折磨过、想找统一接入方式的人。下面我会用 TaoToken 作为统一通道把 Base URL、auth.json、模型 ID 三件套配齐再跑一次真实的网页抓取任务验证。需要先说明一点OpenHands 的浏览器能力跑在它自己的沙箱里模型通道只负责「理解」和「决策」不负责「翻页」。这两件事是分开的配置时别混在一起。2. TaoToken 前置准备Base URL、API Key 与模型 ID 三件套在动手改 OpenHands 配置之前先把 TaoToken 这边的三样东西拿到手。所谓三件套就是 Base URL、API Key、Model ID缺一个都跑不起来。很多人卡在第一步不是因为不会配而是因为把「官网地址」和「API 地址」搞混了。Base URL 是模型请求的入口格式上要能被 OpenAI 兼容客户端识别。TaoToken 的 API 入口是https://taotoken.net/api注意这里不要带任何查询参数客户端拼接/v1/chat/completions时才能正确命中。官网是https://taotoken.net/用来注册、看文档、进控制台但它不是 API 地址填错会直接 404。API Key 在控制台的 API Keys 页面生成。生成后只显示一次复制下来存到本地环境变量或配置文件里别直接写进会提交到 Git 的代码。我习惯用TAOTOKEN_API_KEY这个变量名后面配置里引用它。Model ID 是你要调用的具体模型标识。OpenHands 在规划、理解、结构化输出这几个环节对模型能力要求不同你可以统一用一个通用模型也可以按环节分开配。第一次跑通建议先用一个模型减少变量。配置项值用途Base URLhttps://taotoken.net/api所有模型请求的统一入口API Key控制台生成形如sk-...身份校验Model ID控制台模型列表里的标识指定调用哪个模型拿到三件套后先做一次最小验证确认 Key 和地址是通的再去改 OpenHands。这一步能帮你把「通道问题」和「OpenHands 配置问题」分开排障时省一半时间。export TAOTOKEN_API_KEYsk-你的key curl https://taotoken.net/api/v1/models \ -H Authorization: Bearer $TAOTOKEN_API_KEY返回里能看到模型列表说明通道没问题。如果这里就报 401别往下走先回控制台确认 Key 是否复制完整、是否被禁用。注意Base URL 结尾不要多加/v1。客户端库通常自己会拼/v1/chat/completions你多写一层就变成/api/v1/v1/...直接 404。3. 可复制配置OpenHands 的 config.toml 与 auth.json 片段OpenHands 的模型配置主要落在两个地方一个是config.toml管模型名、Base URL、温度这些参数另一个是auth.json或环境变量管密钥。不同版本目录略有差异常见路径是项目根目录下的config.toml以及~/.openhands/auth.json。下面给的是可直接复制的片段路径按你本地实际位置调整。先看config.toml。核心是把base_url指向 TaoToken 的 API 入口model填你的 Model ID。# config.toml [llm] model 你的Model ID base_url https://taotoken.net/api api_key env:TAOTOKEN_API_KEY temperature 0.2 max_output_tokens 4096 [llm.browser] # 网页浏览与信息提取环节单独指定可与主模型一致 model 你的Model ID base_url https://taotoken.net/api api_key env:TAOTOKEN_API_KEY这里api_key env:TAOTOKEN_API_KEY的写法表示从环境变量读取避免明文落盘。如果你更习惯用auth.json可以这样写{ api_key: sk-你的key, base_url: https://taotoken.net/api, model: 你的Model ID }auth.json的字段名要和 OpenHands 版本对得上有的版本用api_key有的用llm_api_key。改完先跑一次openhands --help或启动命令看它有没有报「unknown field」有就按提示改字段名。三件套在配置里的对应关系再强调一遍Base URL 填https://taotoken.net/apiKey 走环境变量或 auth.jsonModel ID 填控制台里的标识。这三样在config.toml和auth.json里必须一致否则会出现「主代理能跑、浏览器工具报 401」这种诡异现象。如果你用的是 Cline MCP 或 Codex 这类工具链配置逻辑一样Base URL、Key、Model ID 三件套填全缺一个就报错。CC Switch 切换配置时也要确认这三项同步更新别只换了 Key 忘了地址。配完保存先别急着跑抓取任务用一条最小请求验证配置是否被正确加载。python -c import os, requests r requests.post( https://taotoken.net/api/v1/chat/completions, headers{Authorization: f\Bearer {os.environ[TAOTOKEN_API_KEY]}\}, json{model: 你的Model ID, messages: [{role:user,content:ping}]} ) print(r.status_code, r.json()[choices][0][message][content][:50]) 返回 200 且打印出内容说明配置链路通了。这一步过了再进 OpenHands 跑真实任务。4. 验证请求一次网页抓取任务的完整动作与预期输出配置通了之后用 OpenHands 跑一次真实的网页信息提取任务。我选一个结构清晰的公开页面作为目标让它提取标题和正文摘要这样输出容易核对。启动 OpenHands 后在对话里给出任务指令。指令要具体包含目标 URL、要提取的字段、输出格式。模糊指令会让代理反复试探浪费调用次数。访问 https://example.com 提取页面主标题和第一段正文 以 JSON 输出字段为 title 和 summary。代理内部的动作序列大致是先调用模型规划步骤决定用 HTTP 客户端直接请求拿到 HTML 后调用模型定位标题和正文节点再把结果转成 JSON最后校验字段是否为空。整个过程你能在 OpenHands 的日志里看到每次模型调用的耗时和 token 消耗。预期输出类似{ title: Example Domain, summary: This domain is for use in illustrative examples in documents. }如果代理返回的是自然语言而不是 JSON说明结构化输出环节的提示词不够强可以在指令里加一句「只输出 JSON不要解释」。如果返回的字段是空的多半是页面用了动态渲染HTTP 客户端拿到的 HTML 里没有目标内容这时要让它改用无头浏览器模式。验证成功的标志有三个一是任务在合理步数内结束没有反复重试二是输出字段完整、格式正确三是日志里每次模型调用都返回 200没有 401 或超时。三个都满足说明 TaoToken 通道和 OpenHands 配置都对上了。跑通之后你可以把这条任务固化成脚本定期抓取。OpenHands 支持把任务保存成可复用的流程下次直接调用不用重新描述。5. 本篇常见错排查401、local proxy failed 与 reading choices配 OpenHands 加统一通道报错集中在几个固定位置。我把最常见的几个列出来对照日志定位。401 Unauthorized。这是最高频的。原因通常是 Key 没被正确加载。检查顺序环境变量是否在当前 shell 生效echo $TAOTOKEN_API_KEYconfig.toml里api_key的env:前缀是否写对auth.json字段名是否和版本匹配。还有一种情况是 Key 复制时带了空格或换行肉眼看不出来重新复制一次。local proxy failed。这个报错和网络代理有关但注意它指的是 OpenHands 沙箱内部的本地代理组件启动失败不是让你去配外部代理。常见原因是沙箱端口被占用或者容器网络配置冲突。处理方式是重启 OpenHands 沙箱或检查docker ps看有没有残留容器占着端口。别去改 Base URL这个错和模型通道无关。reading choices 报错。典型信息是KeyError: choices或list index out of range。这说明请求发出去了但返回体里没有choices字段。原因通常是 Base URL 拼错请求打到了非 API 地址返回的是 HTML 错误页。核对base_url是否为https://taotoken.net/api结尾有没有多余的/v1。另一个可能是 Model ID 写错服务端返回了错误结构。OAuth 相关报错。如果你在配置里混用了需要 OAuth 的接入方式会出现 token 刷新失败。统一走 API Key 通道就不会有这个问题。检查配置里有没有残留的 OAuth 字段删掉。报错根因处理401Key 未加载或字段名错检查环境变量与 auth.json 字段local proxy failed沙箱端口冲突重启沙箱清理残留容器reading choicesBase URL 或 Model ID 错核对地址结尾与模型标识OAuth 失败混用鉴权方式移除 OAuth 字段统一用 Key排障时有个通用方法把 OpenHands 的模型调用日志级别调高看它实际请求的 URL 和返回状态码。多数问题看一眼真实请求地址就能定位。6. 把通道固定下来让信息提取任务可复用跑通一次不算完真正省时间的是把配置固定成模板。我的做法是把config.toml和auth.json的模板存一份Key 走环境变量换机器时只改环境变量配置文件不动。这样 OpenHands 的网页浏览与信息提取任务在任何环境都能一键复现。模型对话入口可以用来快速验证某个 Model ID 是否可用不用每次都启动 OpenHands。接入文档里有各客户端的配置示例遇到字段名不确定时查一下比猜快。如果你打算长期跑编码和 Agent 任务Coding Plan 的额度方式比按次调用更可控适合把信息提取做成定时任务。最后留一个实用技巧给网页抓取任务单独配一个低温度的模型结构化输出会更稳定规划环节可以用能力更强的模型。两个环节指向同一个 Base URL只是 Model ID 不同配置里分开写就行。这样既统一了通道又兼顾了效果。
返回列表