☰
OpenClaw 集成 SearXNG 实现本地搜索:把 Brave API 换成 TaoToken 统一通道的配置清单
2026/10/17 23:08:29 网站建设 项目流程

1. 为什么本地搜索总被 Brave API 配额卡住

如果你正在用 OpenClaw 搭本地智能助手,大概率遇到过这个场景:早上问它一个实时问题,它老老实实去调 Brave Search API,结果返回一个 429,或者干脆告诉你「本月免费额度已用完」。OpenClaw 的搜索链路本身没问题,问题出在 Brave API 的免费层限制——每月固定请求数,超了就断,而且这个配额是按 Key 走的,多开几个 Agent 会话很快就见底。

我试过把搜索请求切到自建 SearXNG,思路很简单:SearXNG 是一个开源的元搜索引擎,它自己不存索引,而是把查询转发给 Bing、DuckDuckGo、Wikipedia 这些上游引擎,再把结果聚合回来。它对外暴露一个/search?q=xxx&format=json的接口,返回结构化 JSON。OpenClaw 只要能拿到这个 JSON,就能像调 Brave 一样拿到搜索结果,而且没有月度配额这回事——请求打到你自己的服务器上,上游引擎的限流由 SearXNG 帮你扛。

但这里有个新问题:SearXNG 默认只监听127.0.0.1:8080,OpenClaw 如果跑在另一个容器或另一台机器上,就连不上。更关键的是,很多人在这一步会想「那我干脆把 SearXNG 暴露到公网,用 IP 直连」——这其实是个坑,裸奔的 SearXNG 没有鉴权,谁扫到你的 8080 都能白嫖你的搜索通道,甚至被拿去做恶意查询。

所以真正稳的做法是:SearXNG 只在内网监听,OpenClaw 的搜索请求统一走 TaoToken 的 API 通道出去。TaoToken 在这里扮演的是「统一出口」的角色——你不需要把 SearXNG 暴露到公网,也不需要为每个 Agent 单独配 Brave Key,而是让 OpenClaw 通过一个统一的 Base URL 和 Key 去访问搜索能力。这样既解决了 Brave 配额中断的问题,又避免了自建搜索服务裸奔的安全隐患。

这篇文章要交付的就是这套配置清单:从 SearXNG 的 JSON 输出开启,到 OpenClaw 的auth.json和 endpoint 改写,再到一次真实搜索请求的验证动作和返回结果对照。目标很明确——让你的本地搜索链路不再因为 Brave API 额度而中断。

适合谁看?如果你已经在用 OpenClaw 做本地 Agent,或者正准备把搜索能力接进自己的助手,但被 Brave 的配额和自建 SearXNG 的暴露问题卡住,这篇就是给你写的。不需要你精通 Linux 网络,但需要你能改配置文件、能跑 curl 验证。

2. TaoToken 统一通道的前置准备与 Key 获取

在动手改 OpenClaw 配置之前,先把 TaoToken 这边的准备工作做完。这一步不复杂,但顺序不能乱——Key 没拿到、Base URL 没确认,后面改auth.json就是瞎填。

2.1 注册与确认统一通道地址

打开 TaoToken 官网https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=,完成账号注册。注册流程很标准,邮箱加密码,收个验证邮件就完事。登录之后进控制台,你会看到两个关键信息:

  • API Base URL:https://taotoken.net/api,这是所有请求的统一入口,注意末尾不带斜杠。
  • API Key 管理入口:在控制台左侧菜单里找「API Keys」,点进去。

这里要强调一点:TaoToken 的 API 地址是https://taotoken.net/api,不要自己加/v1或者/search之类的后缀,具体路径由 OpenClaw 的 endpoint 配置决定。很多新手在这里踩坑,把 Base URL 写成https://taotoken.net/api/v1,结果请求 404。

2.2 创建 API Key 并确认模型 ID

在 API Keys 页面点「创建新 Key」,给它起个能认出来的名字,比如openclaw-search。创建完成后,Key 只会完整显示一次,格式类似sk-xxxxxxxxxxxxxxxx,立刻复制存到安全的地方。如果你之前已经创建过 Key,也可以直接用现有的,但建议为 OpenClaw 单独建一个,方便后面按用途排查。

创建 Key 的同时,确认你要用的 Model ID。TaoToken 的模型列表在控制台或文档里能查到,搜索场景一般用通用的对话模型即可。记下这个 Model ID,后面写auth.json和 endpoint 配置时要用。如果你不确定选哪个,先用默认的通用模型,验证通了再换。

2.3 确认 SearXNG 的 JSON 接口可用

TaoToken 这边准备好之后,回头确认你的 SearXNG 已经开启了 JSON 输出。如果你还没装 SearXNG,按官方 docker-compose 方式部署即可,核心是改searxng/settings.yml:

search: formats: - html - json

改完重启容器,然后用 curl 验证:

curl "http://127.0.0.1:8080/search?q=test&format=json" | head -c 500

如果返回的是 JSON 而不是 HTML,说明 SearXNG 这边没问题。注意这里用的是127.0.0.1,因为 SearXNG 只在内网监听,不需要暴露到公网——OpenClaw 的请求会通过 TaoToken 的统一通道出去,SearXNG 只负责在本地把结果聚合好。

2.4 理解请求链路:谁调谁

在改配置之前,先把链路理清楚,不然改到一半会懵:

  1. OpenClaw 发起搜索请求,请求里带query参数。
  2. 请求打到 TaoToken 的 Base URLhttps://taotoken.net/api,带上你创建的 API Key 做鉴权。
  3. TaoToken 统一通道把请求路由到对应的搜索能力,返回结构化结果。
  4. OpenClaw 拿到结果,交给模型组织语言回答。

SearXNG 在这里的角色是「本地结果聚合器」,它不需要直接暴露给 OpenClaw,而是作为 TaoToken 通道背后的搜索源之一。这样你既保留了 SearXNG 的隐私聚合能力,又通过 TaoToken 统一了鉴权和出口,Brave API 的配额问题自然就不存在了。

注意:不要把 SearXNG 的 8080 端口直接映射到公网。如果你之前的docker-compose.yaml里写的是"8080:8080",建议改回"127.0.0.1:8080:8080",只允许本机访问。

3. 可复制的 endpoint 与 auth.json 配置片段

这一节是整篇的核心,直接给可复制的配置。你需要改两个地方:OpenClaw 的auth.json和搜索工具的 endpoint 配置。改之前先备份原文件,出问题能回滚。

3.1 auth.json 的完整配置

OpenClaw 的auth.json一般放在配置目录下,路径类似~/.openclaw/auth.json或项目根目录的config/auth.json。具体位置看你安装方式,用find找一下:

find ~ -name "auth.json" -path "*openclaw*" 2>/dev/null

找到之后,把内容改成下面这样。注意三件套必须齐全:Base URL、Key、Model ID。

{ "base_url": "https://taotoken.net/api", "api_key": "sk-你的TaoToken密钥", "model": "你的Model ID", "search": { "provider": "taotoken", "endpoint": "https://taotoken.net/api", "timeout": 30, "max_results": 10 } }

几个关键点:

  • base_url和search.endpoint都填https://taotoken.net/api,不要加/v1。
  • api_key填你在控制台创建的那个sk-开头的 Key。
  • model填你确认过的 Model ID。
  • search.provider改成taotoken,这样 OpenClaw 就知道搜索请求走统一通道,而不是去找 Brave。
  • timeout给 30 秒,搜索请求有时候上游慢,给足时间。
  • max_results按需调,10 条一般够用。

3.2 搜索工具的 endpoint 改写

如果你在 OpenClaw 里用了自定义搜索工具(比如前面 excerpt 里提到的custom_search),需要把构造 URL 的逻辑改掉。原来的写法可能是直接拼 Brave 的地址:

# 旧写法:直连 Brave,配额受限 url = f"https://api.search.brave.com/res/v1/web/search?q={query}" headers = {"X-Subscription-Token": BRAVE_KEY}

改成走 TaoToken 统一通道:

# 新写法:走 TaoToken 统一通道 import os TAOTOKEN_BASE = "https://taotoken.net/api" TAOTOKEN_KEY = os.environ.get("TAOTOKEN_API_KEY") def custom_search(query: str, max_results: int = 10): url = f"{TAOTOKEN_BASE}/search" headers = { "Authorization": f"Bearer {TAOTOKEN_KEY}", "Content-Type": "application/json" } payload = { "query": query, "max_results": max_results, "format": "json" } resp = requests.post(url, json=payload, headers=headers, timeout=30) resp.raise_for_status() return resp.json()

注意这里用的是POST加 JSON body,而不是GET拼 query string。TaoToken 的统一通道对搜索请求的处理方式是这样设计的,用 POST 更稳,也方便后面扩展参数。

3.3 环境变量注入 Key(推荐)

不要把 Key 硬编码在代码里。用环境变量注入,改起来方便,也不容易泄露。在 OpenClaw 的启动脚本或.env文件里加:

export TAOTOKEN_API_KEY="sk-你的TaoToken密钥" export TAOTOKEN_BASE_URL="https://taotoken.net/api"

然后在auth.json里可以用${TAOTOKEN_API_KEY}这种占位符(如果你的 OpenClaw 版本支持),或者直接在代码里读os.environ。这样换 Key 的时候只改环境变量,不用动配置文件。

3.4 配置对照表

把改前改后的关键字段列出来,方便你核对:

配置项旧值(Brave 直连)新值(TaoToken 统一通道)
Base URLhttps://api.search.brave.comhttps://taotoken.net/api
鉴权方式X-Subscription-Token头Authorization: Bearer头
请求方法GET + query stringPOST + JSON body
配额限制月度固定额度无月度硬限制
Key 来源Brave 控制台TaoToken 控制台
SearXNG 暴露可能需要公网仅内网127.0.0.1:8080

改完保存,先别急着重启 OpenClaw,下一节先做一次独立的请求验证,确认通道通了再重启。

4. 验证搜索请求与返回结果对照

配置改完,最怕的就是「看起来对了但实际不通」。这一节用 curl 和 OpenClaw 内部调用两种方式验证,每一步都有预期结果对照。

4.1 用 curl 直接验证 TaoToken 通道

先绕开 OpenClaw,直接用 curl 打 TaoToken 的搜索接口,确认 Key 和 Base URL 没问题:

curl -X POST "https://taotoken.net/api/search" \ -H "Authorization: Bearer sk-你的TaoToken密钥" \ -H "Content-Type: application/json" \ -d '{"query": "OpenClaw SearXNG 集成", "max_results": 5, "format": "json"}'

预期返回是一个 JSON 对象,结构大致如下:

{ "query": "OpenClaw SearXNG 集成", "results": [ { "title": "OpenClaw 集成 SearXNG 实现本地搜索", "url": "https://example.com/article", "snippet": "本文介绍如何将 SearXNG 接入 OpenClaw...", "source": "bing" } ], "total": 5, "provider": "taotoken" }

如果你看到results数组里有内容,说明通道通了。如果返回 401,检查 Key 是不是复制错了;如果返回 404,检查 Base URL 是不是多加了/v1。

4.2 在 OpenClaw 内部发起一次搜索

curl 通了之后,进 OpenClaw 的对话界面,直接问一个需要实时搜索的问题,比如:

搜索一下今天有什么 AI 相关的新闻

OpenClaw 会触发custom_search工具,走 TaoToken 通道拿结果。你可以在 OpenClaw 的日志里看到这次请求的详情:

tail -f ~/.openclaw/logs/openclaw.log | grep -i search

预期日志里会出现类似这样的记录:

[INFO] search request: query="今天有什么 AI 相关的新闻", provider=taotoken [INFO] search response: status=200, results=8, latency=1.2s

如果看到status=200和results=8,说明 OpenClaw 已经成功通过 TaoToken 拿到搜索结果了。

4.3 返回结果对照:Brave vs TaoToken 通道

把两种通道的返回结果放在一起对比,你能更直观地看出差异:

对比项Brave API 直连TaoToken 统一通道
返回格式JSON,字段名web.resultsJSON,字段名results
结果条数受配额限制,通常 5-10 条按max_results参数,可调
响应时间200-500ms800ms-2s(取决于上游)
配额中断月度额度用完即断无月度硬限制
鉴权失败401 +Invalid API Key401 +Unauthorized
搜索源Brave 自有索引SearXNG 聚合多引擎

响应时间上 TaoToken 通道会稍慢一点,因为中间多了一层路由,而且 SearXNG 要等上游引擎返回。但换来的是不会因为配额中断,这个取舍对本地搜索场景是值得的。

4.4 验证 SearXNG 是否真的被调用

如果你想确认搜索请求确实走了 SearXNG,可以在 SearXNG 容器里看日志:

docker compose logs -f searxng | grep -i "search"

预期看到类似这样的记录:

searxng | 2025-01-15 10:23:45,123 INFO: search query: OpenClaw SearXNG 集成 searxng | 2025-01-15 10:23:45,456 INFO: engine bing: 5 results searxng | 2025-01-15 10:23:45,789 INFO: engine duckduckgo: 3 results

如果日志里有engine bing和engine duckduckgo的记录,说明 SearXNG 正常工作了,而且聚合了多个引擎的结果。这时候你的本地搜索链路就完整了:OpenClaw → TaoToken 通道 → SearXNG → 上游引擎。

5. 本篇常见报错排查

配置过程中最容易撞上的几个报错,这里按真实错误信息对照排查。每个报错都给出原因和解决动作,照着做就行。

5.1 401 Unauthorized

报错原文:

{ "error": "Unauthorized", "message": "Invalid or missing API key" }

原因:TaoToken 的 Key 没填对,或者Authorization头格式错了。

排查动作:

  1. 检查auth.json里的api_key是不是sk-开头,有没有多余空格。
  2. 检查请求头是不是Authorization: Bearer sk-xxx,Bearer和 Key 之间有一个空格。
  3. 如果 Key 是从环境变量读的,确认环境变量在当前 shell 里生效:echo $TAOTOKEN_API_KEY。
  4. 去 TaoToken 控制台确认这个 Key 没有被删除或禁用。

5.2 local proxy failed

报错原文:

Error: local proxy failed: dial tcp 127.0.0.1:8080: connect: connection refused

原因:OpenClaw 还在尝试直连本地的 SearXNG,但 SearXNG 没启动,或者端口不对。

排查动作:

  1. 确认 SearXNG 容器在跑:docker compose ps,状态应该是running。
  2. 确认端口映射是127.0.0.1:8080:8080,不是8080:8080(后者虽然也能通,但暴露了公网)。
  3. 如果 SearXNG 没启动,docker compose up -d拉起来。
  4. 检查 OpenClaw 的 endpoint 配置是不是还指向http://127.0.0.1:8080,应该改成https://taotoken.net/api。

5.3 reading choices 相关报错

报错原文:

Error: reading choices: unexpected end of JSON input

原因:返回的不是合法 JSON,可能是上游返回了 HTML 错误页,或者响应被截断了。

排查动作:

  1. 用 curl 单独打一次 TaoToken 接口,看返回的原始内容:curl -X POST ... | head -c 1000。
  2. 如果返回的是 HTML,说明请求打到了错误的路径,检查 endpoint 是不是写成了https://taotoken.net/api/search而不是https://taotoken.net/api。
  3. 如果返回被截断,把timeout从 30 调到 60,给上游更多时间。
  4. 检查max_results是不是设得太大,设成 5 先试。

5.4 OAuth 相关报错

报错原文:

Error: OAuth token exchange failed: invalid_grant

原因:OpenClaw 的某些版本会用 OAuth 方式鉴权,但 TaoToken 用的是 API Key 方式,两者不匹配。

排查动作:

  1. 确认auth.json里没有残留的oauth字段,有的话删掉。
  2. 确认auth.json里用的是api_key字段,不是access_token。
  3. 如果 OpenClaw 强制走 OAuth,在配置里显式指定"auth_type": "api_key"。
  4. 重启 OpenClaw 让配置生效。

5.5 SearXNG 返回空结果

报错原文:请求返回 200,但results数组是空的。

原因:SearXNG 里所有搜索引擎都被禁用了,或者查询词太偏门。

排查动作:

  1. 浏览器打开http://127.0.0.1:8080,进【首选项】→【搜索引擎】,确认至少启用了 Bing 或 DuckDuckGo。
  2. 用 curl 直接打 SearXNG:curl "http://127.0.0.1:8080/search?q=test&format=json",看有没有结果。
  3. 如果 SearXNG 有结果但 TaoToken 通道返回空,检查 TaoToken 的搜索配置是不是指向了正确的 SearXNG 地址。
  4. 换个通用查询词试,比如test或hello,排除查询词问题。

5.6 排错顺序建议

遇到问题不要东改西改,按这个顺序来:

  1. 先 curl 打 TaoToken 接口,确认通道本身通不通。
  2. 再 curl 打 SearXNG 接口,确认本地搜索源通不通。
  3. 最后看 OpenClaw 日志,确认请求有没有发出去、发到了哪里。
  4. 每一步的报错对照上面的表格,定位到具体环节再改。

提示:OpenClaw 的日志级别可以调到DEBUG,能看到完整的请求 URL 和响应体,排查起来快很多。在配置里加"log_level": "DEBUG"即可。

6. 把搜索通道固定下来的长期做法

配置跑通只是第一步,真正省心的是让它长期稳定运行。这一节说几个实操层面的建议,都是踩过坑之后总结的。

6.1 Key 轮换与多 Key 备份

TaoToken 的 Key 如果泄露或者想定期轮换,不要直接改auth.json然后重启服务——那样会有短暂的中断。更稳的做法是:

  1. 在 TaoToken 控制台创建一个新 Key。
  2. 把新 Key 加到环境变量里,比如TAOTOKEN_API_KEY_NEW。
  3. 改 OpenClaw 配置读新变量,重启。
  4. 确认新 Key 工作正常后,再去控制台删掉旧 Key。

如果你有多个 OpenClaw 实例,建议每个实例用独立的 Key,这样某个实例出问题不会影响其他实例,排查也方便。

6.2 SearXNG 的引擎健康检查

SearXNG 聚合的上游引擎偶尔会抽风,某个引擎挂了会导致结果变少。可以加一个定时检查:

#!/bin/bash # check_searxng.sh RESULT=$(curl -s "http://127.0.0.1:8080/search?q=test&format=json" | jq '.results | length') if [ "$RESULT" -lt 3 ]; then echo "SearXNG 结果偏少,检查引擎状态" | mail -s "SearXNG Alert" your@email.com fi

放到 crontab 里每小时跑一次,结果少于 3 条就发邮件提醒。这样你能在用户反馈之前发现问题。

6.3 请求超时与重试策略

搜索请求走 TaoToken 通道,中间多了一层,超时设置要合理。建议:

  • timeout设 30 秒,不要设太短,上游引擎慢的时候 10 秒不够。
  • 加重试逻辑,失败后隔 2 秒重试一次,最多重试 2 次。
  • 重试的时候换个查询词或者减少max_results,提高成功率。

在 OpenClaw 的搜索工具代码里可以这样写:

import time def search_with_retry(query, max_retries=2): for attempt in range(max_retries + 1): try: return custom_search(query) except Exception as e: if attempt == max_retries: raise time.sleep(2)

6.4 监控搜索成功率

长期运行的话,建议记录每次搜索的成功率和延迟。在 OpenClaw 的搜索工具里加一行日志:

import logging logging.info(f"search query={query} status={resp.status_code} latency={elapsed:.2f}s")

然后定期看日志,如果成功率低于 95%,或者延迟突然升高,就要检查 TaoToken 通道或 SearXNG 的状态。

6.5 接入文档与 Key 管理入口

配置过程中如果需要查最新的接口参数或模型列表,直接看官方文档最准:

  • 接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
  • API Keys 管理:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
  • 模型对话测试:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=

如果你后面要做长期的编码 Agent 或者多实例部署,可以考虑 Coding Plan,统一管理多个 Key 和配额:

  • Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=

6.6 最后一步:把配置固化到部署脚本

手动改配置容易忘,建议把auth.json的生成和 SearXNG 的启动写成一个部署脚本,每次新环境直接跑脚本:

#!/bin/bash set -e # 启动 SearXNG cd ~/searxng && docker compose up -d # 生成 auth.json cat > ~/.openclaw/auth.json <<EOF { "base_url": "https://taotoken.net/api", "api_key": "${TAOTOKEN_API_KEY}", "model": "${TAOTOKEN_MODEL}", "search": { "provider": "taotoken", "endpoint": "https://taotoken.net/api", "timeout": 30, "max_results": 10 } } EOF # 重启 OpenClaw systemctl restart openclaw

这样换机器或者重装的时候,一条命令搞定,不用再翻这篇文章找配置。脚本里的环境变量从.env文件读,Key 不进代码库。

到这一步,你的 OpenClaw 本地搜索链路就彻底稳了:SearXNG 在内网聚合结果,TaoToken 统一通道负责鉴权和出口,Brave API 的配额问题不再影响你。后面要做的就是定期看日志、轮换 Key、保持 SearXNG 引擎健康,剩下的交给它自己跑。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询