1. 为什么 OpenClaw 联网查资料总卡在“工具调用”这一步
OpenClaw 装好之后,很多人第一反应是让它“自己去网上查点东西”。结果发现它推理挺顺,但一到联网环节就掉链子:要么 web_search 报 401,要么 web_fetch 抓回来一堆乱码,要么 Brave 的 Key 填了但工具根本没被调用。问题往往不在模型,而在工具调用链路里的 API 通道配置是分散的——搜索走一套 Key,抓取走另一套出口,模型请求又走第三套,任何一环没对齐,Agent 就退化成“只会思考的本地劳动力”。
这篇聚焦一个具体场景:OpenClaw 跑在 Docker 里,通过 web_search 找链接、web_fetch 读正文,底层搜索用 Brave,模型与工具调用的统一出口走 TaoToken。目标很明确——给你一份能直接复制的 config.toml 与 settings.json 骨架,再演示一次完整的“搜索 → 抓取 → 模型总结”验证动作,让联网检索流程稳定跑通。
适合谁看:已经在 Docker 里跑起 OpenClaw、想让 Agent 具备自主查资料能力、但被多套 Key 和多份配置文件绕晕的人。下面所有配置都按“可复制、可验证、可排障”来写,不讨论哪种方案最优,只把路铺平。
2. 前置准备:TaoToken 作为统一 API 通道
OpenClaw 的联网能力拆开看是三层:模型推理、web_search 搜索、web_fetch 抓取。传统做法是每层配一个供应商,Key 散落在 .env、openclaw.json、环境变量里,改一处忘一处。我试过把模型和工具调用的出口统一收敛到 TaoToken,好处是只需要维护一份 Key,Base URL 指向同一个网关,排查问题时不用在多个后台之间跳。
TaoToken 在这里扮演的是统一 API 通道的角色:模型对话、工具调用请求都从同一个入口出去,配置项从“三套”压成“一套”。官网入口在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 基址是 https://taotoken.net/api (这个不加 UTM,直接填进配置)。
你需要先拿到两样东西:
一是 TaoToken 的 API Key。登录后进控制台,在 API Keys 页面新建一个,复制出来形如sk-xxxxxxxx。这个 Key 同时用于模型请求和工具调用通道。
二是 Brave Search 的 API Key。Brave 有免费额度,每月 2000 次查询,注册在 brave.com/search/api。注意它注册时要绑卡,国内部分信用卡会失败,换一张能过验证的即可。拿到后是一串BSA...开头的 Key。
提示:Brave Key 只负责“搜索”这一层,模型和抓取不走它。别把两个 Key 填反,这是后面 401 报错最常见的来源。
拿到两个 Key 后,先确认 Docker 容器能正常访问外网,再往下配。容器内可以用curl -I https://taotoken.net/api测一下连通性,返回 200 或 401 都说明网络通,返回超时才是网络问题。
3. 可复制配置:config.toml 与 settings.json 骨架
OpenClaw 的配置分两处:config.toml管工具与搜索,settings.json(或 openclaw.json)管模型与浏览器。下面给的是最小可用骨架,字段名按你实际版本微调,但结构可以直接抄。
先看config.toml,重点是 web_search 和 web_fetch 两段:
[web_search] enabled = true provider = "brave" api_key = "BSA你的BraveKey" endpoint = "https://api.search.brave.com/res/v1/web/search" country = "CN" search_lang = "zh-hans" count = 8 [web_fetch] enabled = true timeout_ms = 15000 max_bytes = 2000000 user_agent = "Mozilla/5.0 (compatible; OpenClaw/1.0)" convert = "markdown" [api] base_url = "https://taotoken.net/api" api_key = "sk-你的TaoTokenKey"几个参数说明:count = 8控制单次返回链接数,太大容易触发限流;convert = "markdown"让 web_fetch 把 HTML 转成 markdown,模型读起来更省 token;max_bytes防止抓到超大页面把上下文撑爆。
再看settings.json,模型和工具通道都指向 TaoToken:
{ "model": { "provider": "openai-compatible", "baseUrl": "https://taotoken.net/api", "apiKey": "sk-你的TaoTokenKey", "name": "gpt-4o-mini" }, "tools": { "web_search": { "enabled": true }, "web_fetch": { "enabled": true } }, "browser": { "enabled": false } }这里browser.enabled先关掉。如果你只想让 Agent“读资料”而不是“操作网页”,web_search + web_fetch 这套内置能力就够了,不用碰 Playwright 那套 600MB 的浏览器镜像,省事也省磁盘。
注意:
baseUrl结尾不要带/v1,OpenClaw 会自己拼路径。带了会变成/v1/v1/chat/completions,直接 404。
改完配置后重启容器:
docker restart openclaw docker logs -f openclaw | grep -i "web_search\|web_fetch"日志里出现web_search tool registered和web_fetch tool registered,说明工具已加载。
4. 验证请求:跑一次完整的搜索抓取动作
配置对不对,跑一次就知道。分三步验证,每步都能单独定位问题。
第一步,单独测 web_search。在 OpenClaw 对话里发一句:
用 web_search 搜索 "OpenClaw docker 配置",返回前 3 条结果的标题和 URL正常返回应该是三条带标题和链接的列表。如果报 401,是 Brave Key 问题;如果报超时,是容器网络问题;如果模型说“我没有这个工具”,是 config.toml 里enabled = false或没重启。
第二步,单独测 web_fetch。拿上一步返回的任意一个 URL:
用 web_fetch 抓取 https://example.com 并总结前 200 字成功的话会返回页面正文的 markdown 摘要。如果返回空或乱码,检查convert参数和user_agent,有些站点会拦截默认 UA。
第三步,串起来跑完整链路:
帮我查一下 OpenClaw 最新的 docker 安装文档,先搜索再抓取正文,最后用三句话总结这一步会触发模型连续调用 web_search → web_fetch → 模型总结。观察日志里的调用顺序:
docker logs -f openclaw | grep -E "tool_call|web_search|web_fetch"理想输出是tool_call: web_search→tool_call: web_fetch→model_response。如果只看到 web_search 没有 web_fetch,说明模型没把搜索结果里的 URL 传给抓取工具,通常是提示词里没明确“抓取正文”,补一句即可。
实测下来,整条链路跑通后,从提问到拿到总结大约 8–15 秒,取决于目标页面大小。如果超过 30 秒,多半是 web_fetch 卡在某个大页面上,调小max_bytes或加timeout_ms。
5. 本篇常见错排查
报错一:web_search 返回 401 Unauthorized。九成是 Brave Key 填错或没生效。检查 config.toml 里api_key是否以BSA开头,有没有多余空格。改完必须重启容器,热加载不一定生效。
报错二:web_fetch 返回空内容或convert failed。目标页面可能是纯 JS 渲染的,web_fetch 只抓静态 HTML,拿不到动态内容。这种情况要么换一个静态页面源,要么启用 browser 那套方案。另外max_bytes设太小也会截断,先调到 2000000 试。
报错三:模型说“工具不存在”。检查 settings.json 里tools.web_search.enabled是否为 true,以及 config.toml 和 settings.json 是否被同一进程读取。有些版本两处都要开,只开一处不生效。
报错四:cdpHost 127.0.0.1 连不上。这是启用 browser 后才会遇到的。Gateway 容器连浏览器容器时,浏览器返回的 CDP 地址是它自己内部的 127.0.0.1,对 Gateway 来说指向自己,自然连不上。解决办法是把浏览器镜像启动参数里的--remote-debugging-address=127.0.0.1改成0.0.0.0重新构建,或者用network_mode: host让两个容器共享宿主机网络。不过如果你只用 web_search + web_fetch,这段可以完全跳过。
报错五:token 不匹配。检查 .env、settings.json、Web UI 登录 token 三处是否一致。改 Key 后旧 token 会失效,重新登录一次。
排障时优先看日志,docker logs里的tool_call和error行能定位到具体哪一层断了。接入相关的完整字段说明可以对照接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。
6. 把通道收拢,让 Agent 稳定联网
回到最初的问题:OpenClaw 联网查资料卡住,本质是工具调用链路上的 API 通道太分散。把模型请求、web_search、web_fetch 的出口统一到 TaoToken 一个 Base URL,Key 从三份压成一份,排查时只需要看一个地方。Brave 只管搜索这一层,职责清晰,出问题也好定位。
配置骨架上面已经给全,复制改 Key 就能用。验证动作按“单独测搜索 → 单独测抓取 → 串起来跑”三步走,哪步断了一眼能看出来。如果你后面要让 Agent 长期跑编码任务或做多步自动化,可以考虑 Coding Plan 那套更完整的通道方案:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。只是想先验证模型和工具能不能通,用模型对话页面快速试一把就行:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite 。
最后留一个实用习惯:每次改完配置,先docker restart再跑一次三步验证,别直接上复杂任务。配置这东西,单点通了再串联,比一上来就端到端调试省一半时间。