之前一直有个头疼的问题,就是 OpenClaw 的搜索信源。

它自带的 web_search 就那么几个选择,百度搜出来的质量大家懂的,Google 又被墙了,Bing 勉强能用但偶尔也会抽风。后来我推荐过大家用 SearXNG,自己搭一个聚合搜索引擎,把多个信源揉在一起,这样即使某个挂了还有别的顶着。

但搭完发现 SearXNG 也有它的烦恼——它自己也需要信源啊。而且那些免费的搜索引擎引擎三天两头换接口、加验证,时不时就罢工了。像 startpage 和 duckduckgo 经常被 captcha 拦住,Yandex 搜中文又不太行,稳定可用的信源真的越来越少了。

后来发现火山方舟的 Agent Plan 提供了一个豆包搜索的 Harness,每个月有 500 次免费额度。对个人用户来说完全够用了。而且我本身就开通了方舟的 Agent Plan,用积分(AFP)抵扣就行,搜索一次消耗不了多少积分,很划算。

不过 OpenClaw 原生只给了 skill 和 MCP 的方案来接豆包搜索,对 OpenClaw 本身不太友好。所以我绕了一下,把它接进了 SearXNG,这样 OpenClaw 通过 SearXNG 就能用上豆包搜索了。

折腾完之后觉得这个过程值得记录下来,就写了这篇。

搜索引擎

原理

SearXNG 内置了一个 json_engine,它可以用来对接任意返回 JSON 的搜索 API。我们只需要在配置里定义一个引擎,告诉 SearXNG 请求怎么发、结果怎么解析就行了。

豆包搜索的 API 是一个标准的 HTTP POST 请求,返回 JSON,刚好适配 json_engine。

普通接入方式

如果你没有开通 Agent Plan,也可以用豆包搜索的普通 API。需要先在火山引擎控制台开通豆包模型服务,获取 API Key。

然后编辑 SearXNG 的 settings.yml,在 engines 部分添加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- name: doubao-search
engine: json_engine
search_url: https://open.feedcoopapi.com/search_api/web_search
method: POST
request_body: >-
{{"Query": "{query}", "SearchType": "web", "Count": 10, "NeedSummary": true}}
results_query: Result/WebResults
url_query: Url
title_query: Title
content_query: Summary
headers:
Content-Type: application/json
Authorization: Bearer YOUR_API_KEY_HERE
X-Traffic-Tag: skill_web_search_common
categories:
- general
disabled: false

注意 request_body 这里有个坑。json_engine 是用 Python 的 .format() 处理请求体的,所以 JSON 里的大括号必须写成 {{` 和 `}},不然会被当成 format 的变量名解析,然后报 KeyError。只有 {query} 这种真正的变量才保持单括号。

Agent Plan 接入方式

如果你像我一样开通了方舟的 Agent Plan,那就更简单了。直接用 Agent Plan 的 API Key,配置基本一样,区别在于 API Key 的格式是 ark- 开头的。

把上面的 YOUR_API_KEY_HERE 换成你在 Agent Plan 控制台拿到的 Key 就行。每个月 500 次免费搜索,用完了走积分抵扣,完全不用操心计费的事。

1
2
3
4
headers:
Content-Type: application/json
Authorization: Bearer ark-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-xxxxx
X-Traffic-Tag: skill_web_search_common

还有一个坑:引擎名不能用下划线

这个折腾了我好久。SearXNG 的引擎名不能带下划线 _,否则会报 Engine name contains underscore 的错误然后加载失败。所以引擎名要用连字符 -,比如 doubao-search 而不是 doubao_search

配置后的验证

改完配置记得重启 SearXNG:

1
docker restart searxng

然后访问 http://你的地址:端口/search?q=测试&format=json,看看返回结果里有没有 doubao-search 引擎的结果。

如果结果里没有,检查一下 SearXNG 的日志:

1
docker logs searxng | grep doubao

常见的错误有两个:一个是 request_body 的大括号没双写导致 KeyError,另一个是 API Key 填错了导致 401。

最终效果

配置好之后,OpenClaw 的搜索走 SearXNG,SearXNG 又多了豆包搜索这个稳定的信源。搜索质量提升了不少,中文搜索尤其明显,毕竟豆包搜索对中文的支持比 Yandex 好太多了。

而且有了每月 500 次的免费额度兜底,加上 Agent Plan 的积分抵扣,日常使用完全够用,基本不用操心配额的问题。

如果你也在用 SearXNG,可以试试加上豆包搜索,体验还不错。