)
1. 为什么要在 macOS 上把 OpenClaw 接到统一 Key 通道OpenClaw 是一个跑在本地的 AI 网关装好之后你可以在浏览器里打开一个对话界面也可以让本机的脚本、编辑器插件通过它去调用大模型。它本身不生产模型能力只负责把请求转发给你配置好的模型服务商。2026.2.6-3 这个版本对 macOS 的适配已经比较完整Node.js 环境就绪之后剩下的核心工作就是两件事把网关跑起来把模型通道配通。很多人卡在第二步。原因不复杂如果你直接拿 DeepSeek 官方 Key 写进配置短期能用但一旦你同时想接别的模型、或者想在多台机器上共用一套凭证就会变成每个配置文件里散落着不同的 Key改一处漏一处。我试过在三个项目里分别维护 Key最后自己都记不清哪个是哪个。所以这篇的做法是用 TaoToken 的统一 Key 作为 OpenClaw 的上游通道DeepSeek 只是这条通道上的一个模型选项。这样你的openclaw.json里只出现一个 baseUrl 和一个 Key换模型、加模型都只改模型 ID不动凭证。适合谁看已经在 macOS 上装好 Node.js、准备部署 OpenClaw 2026.2.6-3 的人已经装过 OpenClaw 但模型调用一直报错的人想把 DeepSeek 接进本地网关又不想管理一堆 Key 的人。下面从环境确认开始一路走到 curl 验证返回内容中间每个配置文件都给完整骨架你可以直接复制改占位符。2. TaoToken 前置拿 Key 和确认通道地址TaoToken 在这里的角色是统一的上游 API 通道。你不需要在 OpenClaw 里分别填 DeepSeek、Claude 各自的地址和 Key只需要填 TaoToken 的 API 地址和一把 Key然后在模型列表里选你要用的模型。对 OpenClaw 来说它看到的始终是同一个 OpenAI 兼容接口。第一步打开官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册并登录。登录后进入控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 。在控制台里找到 API Keys 页面路径是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 新建一把 Key。新建时给它起个能认出来的名字比如openclaw-mac方便以后在列表里区分。Key 只在创建时完整显示一次复制出来先存到密码管理器或者临时文本里。第二步确认 API 基地址。TaoToken 的 API 入口是 https://taotoken.net/api 注意这个地址后面不加 UTM 参数直接用它作为 baseUrl。OpenClaw 配置里填的 baseUrl 就是它后面拼/v1/chat/completions这类路径由 OpenClaw 自己处理。第三步确认你要用的模型 ID。DeepSeek 在 TaoToken 通道上的模型 ID 通常就是deepseek-chat如果你要用推理型还有对应的 ID。这个 ID 后面要写进openclaw.json的models数组里。如果你不确定当前通道支持哪些 ID可以在控制台的模型列表页看或者直接用模型对话页面 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 发一条消息页面上会显示当前可选模型。注意Key 不要写进任何会提交到 Git 的文件里。OpenClaw 的配置在~/.openclaw/下这个目录默认不在项目仓库里相对安全但仍建议你确认一下没有把 home 目录整体纳入版本管理。到这里你手里应该有三样东西一把sk-开头的 Key、baseUrlhttps://taotoken.net/api、模型 IDdeepseek-chat。下面开始写配置。3. 可复制配置openclaw.json 与 settings.json 骨架OpenClaw 2026.2.6-3 在 macOS 上的核心配置文件是~/.openclaw/openclaw.json。这个文件是 JSON 格式不能有注释不能有尾逗号所有键和字符串值必须用双引号。下面这份骨架已经把 TaoToken 通道和 DeepSeek 模型接好了你只需要替换三个占位符。先建目录并备份旧配置mkdir -p ~/.openclaw if [ -f ~/.openclaw/openclaw.json ]; then mkdir -p ~/.openclaw/backup cp ~/.openclaw/openclaw.json ~/.openclaw/backup/openclaw.json.bak fi然后写入配置。注意把你的TaoTokenKey换成第 2 步拿到的 Key把你的用户名换成whoami的输出cat ~/.openclaw/openclaw.json EOF { meta: { lastTouchedVersion: 2026.2.6-3, lastTouchedAt: 2026-02-08T07:43:20.228Z }, models: { mode: merge, providers: { taotoken: { baseUrl: https://taotoken.net/api, apiKey: 你的TaoTokenKey, api: openai-completions, models: [ { id: deepseek-chat, name: DeepSeek Chat via TaoToken, input: [text], contextWindow: 128000, maxTokens: 8192, reasoning: false } ] } } }, agents: { defaults: { workspace: /Users/你的用户名/.openclaw/workspace, maxConcurrent: 4, subagents: { maxConcurrent: 8 }, model: { primary: taotoken/deepseek-chat } } }, gateway: { port: 18789, mode: local, auth: { mode: token, token: 39769ded65eac493eceeb0fb6a543fb48ed4fce3f1166bf5 } } } EOF这份配置和直接填 DeepSeek 官方地址的区别在providers这一层provider 名字叫taotokenbaseUrl 指向 TaoToken 的 API 入口模型 ID 仍然是deepseek-chat。agents.defaults.model.primary写的是taotoken/deepseek-chat格式是provider名/模型ID。这个对应关系不能写错否则网关启动后找不到默认模型。gateway.auth.token那一串是网关自己的访问令牌不是模型 Key。你可以用 OpenClaw 自带的命令重新生成一个避免用示例里的固定值node ~/.npm-global/lib/node_modules/openclaw/openclaw.mjs gateway token --print把输出替换掉配置里的 token 值即可。接下来是settings.json。OpenClaw 的 UI 层配置在~/.openclaw/settings.json主要控制界面行为和默认会话参数。如果你只做网关调用这个文件可以不存在但如果你要用 UI 对话建议写一份最小配置cat ~/.openclaw/settings.json EOF { ui: { defaultModel: taotoken/deepseek-chat, theme: system, sendOnEnter: true }, session: { maxHistory: 50, autoTitle: true } } EOF两个文件写完后先做语法校验这一步能挡掉大部分启动报错node -e JSON.parse(require(fs).readFileSync(process.env.HOME /.openclaw/openclaw.json, utf8)); console.log(openclaw.json OK) node -e JSON.parse(require(fs).readFileSync(process.env.HOME /.openclaw/settings.json, utf8)); console.log(settings.json OK)两条都输出 OK 才继续。如果报Unexpected token九成是全角引号或者多了逗号重新执行上面的写入命令不要手动去改。3.1 CC Switch 切换动作CC Switch 是 OpenClaw 生态里用来切换当前活跃模型配置的工具。当你后面在 TaoToken 通道上加了第二个模型比如想从deepseek-chat切到别的不需要改openclaw.json的 provider 层只需要改agents.defaults.model.primary的值然后让网关重载。如果你装了 CC Switch 命令行工具切换动作是这样的# 查看当前可用配置 ccswitch list # 切换到指定模型配置 ccswitch use taotoken/deepseek-chat # 重载 OpenClaw 网关使配置生效 node ~/.npm-global/lib/node_modules/openclaw/openclaw.mjs gateway reload如果没有装 CC Switch手动改openclaw.json里的primary字段然后执行gateway reload效果一样。CC Switch 的价值在于它帮你管理多套 provider 配置的切换不用每次手动编辑 JSON。4. 验证请求从网关启动到 curl 拿到回复配置写完先清掉可能残留的旧进程避免端口冲突pkill -f openclaw 2/dev/null openclaw gateway stop 2/dev/null lsof -i :18789 | grep -v PID | awk {print $2} | xargs kill -9 2/dev/null然后启动网关node ~/.npm-global/lib/node_modules/openclaw/openclaw.mjs gateway --port 18789 --force终端出现监听日志、没有invalid config或Config validation failed字样就说明网关起来了。另开一个终端窗口跟踪日志tail -f /tmp/openclaw/openclaw-$(date %Y-%m-%d).log日志里如果出现API request failed先别急着改配置用 curl 直接打 TaoToken 的接口确认 Key 和通道本身是通的curl -s -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer 你的TaoTokenKey \ -H Content-Type: application/json \ -d { model: deepseek-chat, messages: [{role: user, content: 用一句话说明你是什么模型}] }返回 JSON 里包含choices数组且message.content有实际文本说明 TaoToken 通道和 DeepSeek 模型都正常。如果返回Unauthorized回控制台检查 Key 是否复制完整、是否被禁用。如果返回模型不存在检查model字段是不是deepseek-chat不要自己造 ID。curl 通了之后再验证 OpenClaw 网关这一层。网关的本地接口默认也在 18789带上网关 token 请求curl -s -X POST http://127.0.0.1:18789/v1/chat/completions \ -H Authorization: Bearer 39769ded65eac493eceeb0fb6a543fb48ed4fce3f1166bf5 \ -H Content-Type: application/json \ -d { model: taotoken/deepseek-chat, messages: [{role: user, content: test}] }这里model字段用的是taotoken/deepseek-chat和配置文件里的 primary 保持一致。返回内容正常说明从本地网关到 TaoToken 再到 DeepSeek 的整条链路都通了。最后打开浏览器访问http://127.0.0.1:18789在 UI 输入框发一条消息能收到回复就完成了闭环。如果你更想先在网页上确认模型行为也可以直接用模型对话页面 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 发几条消息对比一下 UI 和网关返回是否一致。5. 本篇常见错排查5.1 网关启动报 Config validation failed先跑语法校验命令确认 JSON 本身合法。如果 JSON 合法但仍报 validation failed检查agents.defaults.model.primary的格式。必须是provider名/模型ID中间一个斜杠。写成taotoken:deepseek-chat或者deepseek-chat都会失败。另外确认providers下的 provider 名和 primary 里的前缀完全一致大小写敏感。5.2 curl 网关返回 401 或 403这是网关自己的 auth token 不对不是 TaoToken Key 的问题。检查请求头里的Authorization: Bearer后面那串是否和openclaw.json里gateway.auth.token完全一致。如果你用gateway token --print重新生成过记得把新值写回配置并重启网关。5.3 UI 能打开但发消息无回复按顺序查三处。第一settings.json里ui.defaultModel是否写了taotoken/deepseek-chat写错会导致 UI 不知道调哪个模型。第二openclaw.json里agents.defaults.model.primary是否存在且正确。第三看日志里有没有API request failed如果有用第 4 节的 curl 命令直接打 TaoToken 接口区分是通道问题还是网关转发问题。5.4 端口 18789 被占用报Gateway already running locally或EADDRINUSE说明旧进程没清干净。执行第 4 节开头的清理命令。如果清理后仍被占用可能是别的程序占了这个端口换一个端口启动比如--port 18788同时把openclaw.json里gateway.port也改成 18788两处保持一致。5.5 Node.js 版本过低导致启动失败OpenClaw 2026.2.6-3 要求 Node.js v24.13.0 及以上。用node -v确认。如果低于这个版本用 Homebrew 升级brew upgrade node升级后重新执行npm install -g openclaw确保全局包是在新版本 Node 下安装的。如果你之前配过~/.npm-global路径升级后确认npm config get prefix仍指向该目录。5.6 想彻底重来一遍停进程、删配置、卸包三步pkill -f openclaw rm -rf ~/.openclaw rm -rf /tmp/openclaw npm uninstall -g openclaw然后从第 3 节重新写配置。删~/.openclaw会丢掉工作区数据如果里面有你想保留的会话记录先备份~/.openclaw/workspace。6. 长期编码与 Agent 场景的通道选择如果你只是偶尔在 UI 里问几个问题上面这套配置已经够用。但如果你打算把 OpenClaw 当作日常编码助手让编辑器插件、终端脚本、甚至自动化 Agent 长期通过它调用模型那 Key 的管理方式值得再想一步。单次调用用按量 Key 没问题高频调用下你需要关注的是配额和稳定性。TaoToken 的 Coding Plan 页面 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 里有针对长期编码场景的通道说明你可以对照自己的调用量决定用哪种 Key 类型。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面写了 OpenAI 兼容接口的完整参数和错误码含义排障时比猜要快。如果你用的是 Claude Code 这类工具对应的接入说明在 https://taotoken.net/claudecode-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecode-anthropicutm_campaignrewrite 思路和这篇一样统一通道、一个 Key、模型 ID 区分。回到 OpenClaw 本身配置改完之后建议做一件事把~/.openclaw/openclaw.json里的 Key 换成环境变量引用。OpenClaw 支持在配置里写${TAOTOKEN_API_KEY}这种形式实际值从 shell 环境读取。这样你的配置文件可以安全地备份到别处Key 留在~/.zshrc里。改法是把apiKey的值从明文字符串改成${TAOTOKEN_API_KEY}然后在~/.zshrc里加一行export TAOTOKEN_API_KEY你的Keysource ~/.zshrc后重启网关。这一步不做也不影响使用但做了之后你换 Key 只需要改一个地方。