1. openclaw 接 Tavily 搜索时,Key 到底该写在哪一层
openclaw 是一个把本地 LLM 应用、工具调用和网关串起来的开发框架,Tavily 则是给模型补上实时联网检索能力的搜索 API。把这两者接起来,最常卡住的地方不是代码,而是 Key 的落点:有人写进了.env,有人用openclaw config set塞进了配置,还有人两个都写了,结果调用时读到的却是空值。这篇就围绕 openclaw 配置 Tavily API Key 与 TaoToken 统一通道这条链路,把配置文件骨架、Key 填写位置和一次真实搜索验证讲清楚,适合正在本地调试 LLM 应用、想让模型自己上网查资料的开发者。
先说清楚一个容易混的点。openclaw 里跟搜索相关的配置通常分两层:一层是「技能/插件」自己的 Key,比如skills.tavily-search.apiKey;另一层是模型通道的 Key,也就是模型对话走哪个网关。Tavily 负责检索,模型负责理解检索结果,两者是分开的。很多人只配了 Tavily 却忘了模型通道,或者反过来,最后表现为「搜索没结果」或「模型不回复」,排查方向完全不同。
我试过把 Tavily 的 Key 和模型通道的 Key 混在一个环境变量文件里,短期能跑,但一旦换模型或换搜索技能就会互相覆盖。所以更稳的做法是:Tavily 的 Key 归 Tavily 配置,模型通道统一走 TaoToken 的 API Key,各管各的。下面按这个思路给一套可以直接复制的骨架。
2. 前置准备:Tavily Key 与 TaoToken 统一通道
Tavily 的 Key 需要去 Tavily 控制台注册后生成,格式一般是tvly-开头,开发版可能是tvly-dev-开头。这个 Key 只用于搜索调用,不要和模型 Key 混用。生成后先放一边,等会儿写进配置。
模型这一侧,如果你希望 openclaw 里的对话、Agent 推理都走同一个入口,可以用 TaoToken 做统一通道。它的作用是让你用一个 Key 管理多家模型的调用,省得每换一个模型就改一次配置。官网地址是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 入口是 https://taotoken.net/api ,注意 API 地址不带 UTM 参数。你需要先在控制台创建一个 API Key,创建入口在 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,Key 管理页在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。拿到 Key 之后,模型通道和搜索技能就可以分别配置了。
这里有个顺序建议:先把模型通道跑通,再加搜索技能。因为搜索技能验证时,最终还是要模型把检索结果组织成回答。如果模型通道本身不通,你会误以为是 Tavily 没配好。
3. 可复制配置:config.toml 与 settings.json 骨架
openclaw 的配置方式跟版本有关,常见的有 TOML 和 JSON 两种。下面给一份config.toml骨架,重点是 Tavily 技能段和模型通道段分开写。
# ~/.openclaw/config.toml [gateway] host = "127.0.0.1" port = 8080 # 模型统一通道:走 TaoToken [models.default] provider = "openai-compatible" base_url = "https://taotoken.net/api" api_key = "你的TaoTokenKey" model = "claude-3-5-sonnet" # Tavily 搜索技能 [skills.tavily-search] enabled = true api_key = "tvly-你的TavilyKey" max_results = 5如果你用的是 JSON 配置,等价骨架如下,字段名按你本地版本的实际 schema 调整:
{ "gateway": { "host": "127.0.0.1", "port": 8080 }, "models": { "default": { "provider": "openai-compatible", "base_url": "https://taotoken.net/api", "api_key": "你的TaoTokenKey", "model": "claude-3-5-sonnet" } }, "skills": { "tavily-search": { "enabled": true, "apiKey": "tvly-你的TavilyKey", "maxResults": 5 } } }除了手写文件,也可以用命令写入,避免格式写错:
openclaw config set skills.tavily-search.apiKey "tvly-你的TavilyKey" openclaw config set models.default.api_key "你的TaoTokenKey" openclaw config set models.default.base_url "https://taotoken.net/api"注意 Key 要用双引号包住,尤其是 Tavily 的 Key 里可能带连字符,不加引号在某些 shell 下会被截断。写完之后建议openclaw config get skills.tavily-search.apiKey回读一次,确认没有多空格或换行。
如果你更习惯用环境变量,也可以写进~/.openclaw/.env:
TAVILY_API_KEY="tvly-你的TavilyKey" TAOTOKEN_API_KEY="你的TaoTokenKey"但要注意,环境变量和配置文件同时存在时,不同版本的优先级可能不一样。稳妥做法是只保留一种来源,别两边都写。
4. 验证请求:一次 Tavily 搜索调用跑通
配置写完,先重启网关让改动生效:
openclaw gateway restart然后确认技能已经加载。可以列出当前可用工具:
openclaw skills list如果看到tavily-search处于 enabled 状态,说明技能注册成功。接下来做一次真实搜索验证。最直接的方式是在新会话里提问,让模型调用tavily-search:
用 tavily_search 查一下今天国内的热点新闻,总结 5 条,每条带标题和链接如果返回结果里带标题、URL 和摘要,说明 Tavily 链路通了。如果模型回复「没有找到结果」或直接不调用工具,先看网关日志:
openclaw gateway logs --tail 50日志里通常会打印工具调用记录。重点看两件事:一是tavily-search有没有被触发,二是请求 Tavily 时返回的状态码。401 一般是 Key 写错或没读到,429 是配额用尽,超时则可能是网络出口问题。
也可以用 curl 单独验证 Tavily Key 本身是否有效,绕过 openclaw:
curl -X POST https://api.tavily.com/search \ -H "Content-Type: application/json" \ -d '{ "api_key": "tvly-你的TavilyKey", "query": "今天国内热点新闻", "max_results": 5 }'如果这一步能返回 JSON 结果,说明 Key 没问题,问题在 openclaw 的配置读取;如果这一步就失败,那就是 Key 或配额的问题,跟 openclaw 无关。这个二分法能帮你快速定位。
模型通道的验证可以单独做一次对话请求,确认 TaoToken 的 Key 和 base_url 生效:
curl -X POST https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer 你的TaoTokenKey" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-3-5-sonnet", "messages": [{"role": "user", "content": "回复 ok"}] }'两边都通之后,再回到 openclaw 里做联合验证,基本就不会互相甩锅了。
5. 本篇常见错排查
错误一:工具名写错。openclaw 里必须调用tavily-search,而不是默认的web_search。后者可能依赖别的搜索后端,Key 不通用。如果你在提示词里写「用 web_search 查」,模型可能压根不碰 Tavily。
错误二:Key 格式不对。Tavily 的 Key 是tvly-或tvly-dev-开头,如果你填的是别的平台的 Key,调用会直接 401。回读配置确认一下。
错误三:配置层级写错。有人把 Tavily Key 写到models.default.api_key里,或者把模型 Key 写到skills.tavily-search.apiKey,结果两边都报错。记住:搜索的归搜索,模型的归模型。
错误四:改了配置没重启。openclaw 的网关进程通常不会热加载配置,改完必须openclaw gateway restart,否则读的还是旧值。
错误五:环境变量和配置文件冲突。两边都写且值不一样时,实际生效的可能是环境变量。排查时先env | grep -i tavily看一眼当前 shell 里有没有残留。
错误六:配额或网络问题。如果 curl 单独调 Tavily 也失败,去 Tavily 控制台看调用次数和剩余配额。配额用尽时返回 429,不是配置问题。
错误七:国内定制版命令不同。如果你用的是 openclaw-cn 之类的定制版,命令前缀可能是openclaw-cn,配置路径也可能不同,按实际安装调整。
6. 统一通道与后续调试建议
把 Tavily 搜索和模型通道分开配置之后,后续调试会清爽很多。搜索出问题就查 Tavily 那一段,模型不回复就查 TaoToken 那一段,不用在一堆混在一起的 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 。接入细节和参数说明在文档里,https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。如果你在用 Claude Code 这类工具,Anthropic 兼容接入的说明在 https://taotoken.net/claudecode-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claudecode-anthropic&utm_campaign=rewrite 。
最后留一个实用习惯:每次改完配置,先openclaw config get回读,再openclaw gateway restart,然后用 curl 单独验证 Tavily 和模型通道各一次,最后才在会话里做联合提问。这个顺序能把大部分「配了但没生效」的问题挡在门外。