1. OpenClaw gateway 命令行启动与 Python uv 环境依赖排错实战
OpenClaw 是一个本地优先的智能体网关,你可以把它理解成一个「跑在自己电脑上的模型调度中枢」:它对外暴露统一的 endpoint,对内管理工具调用、会话状态和模型路由。gateway 就是它的常驻服务进程,负责监听端口、加载配置、把请求转发给后端模型。适合谁?适合想在本地部署 OpenClaw、用命令行管理服务、并且用 Python uv 管理依赖的开发者。我试过在 macOS 上反复启停 gateway,也踩过 uv 虚拟环境和 gateway 服务互相打架的坑,这篇就把命令行启动、uv 依赖安装、报错复现和 endpoint 改到 TaoToken 验证请求的完整链路讲清楚。
核心检索词先摆出来:OpenClaw gateway 命令行启动、Python uv 环境配置、gateway service not loaded 报错、openclaw doctor --fix、uv run 依赖缺失。这几个词基本覆盖了本地部署 OpenClaw 时 80% 的卡点。很多人第一次装完 OpenClaw,openclaw gateway start看着是成功了,但一关一开就报Gateway service not loaded,或者 Python 脚本里import一堆包找不到,本质是两件事:服务没被 launchd 正确托管,以及 uv 的虚拟环境没被 gateway 进程继承。下面按「先复现问题 → 再配 TaoToken → 再写可复制配置 → 再验证请求 → 再排错 → 最后给入口」的顺序走,每一步都能直接跟做。
先说清楚 gateway 和 uv 的关系。gateway 本身是个常驻进程,它启动时会去读配置、拉起工具、可能还会调用你写的 Python MCP server。而你的 Python 代码依赖是用 uv 管理的,uv 会创建.venv并把依赖装进去。问题就出在:gateway 作为系统服务(launchd)启动时,它的环境变量和当前 shell 不是一套,uv run能找到的包,gateway 拉起的子进程未必找得到。所以排错要分两条线:服务托管线(launchd / openclaw gateway install)和 Python 依赖线(uv sync / uv run)。两条线都通了,请求才能稳定跑起来。
2. TaoToken 前置:把模型 endpoint 指到统一网关
在动 gateway 配置之前,先把模型出口定下来。本地 OpenClaw 默认可能指向某个本地模型或空配置,你要让它真正能出请求,就得给它一个可用的 endpoint 和 Key。这里用 TaoToken 作为统一入口,它的 API 地址是https://taotoken.net/api,官网是https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=。注意 API 地址不带 UTM 参数,配置里只写https://taotoken.net/api就行。
你需要准备三样东西,我把它叫「三件套」:Base URL、API Key、Model ID。Base URL 就是https://taotoken.net/api;API Key 去控制台生成,地址是https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite;Model ID 看你要用哪个模型,比如claude-sonnet-4-5这类标识,具体以文档里的模型列表为准,文档入口https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite。生成 Key 的页面在https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite,进去点新建,复制那串sk-开头的字符串,只显示一次,先存到安全的地方。
为什么要在 gateway 之前做这一步?因为 gateway 的配置文件里要写 endpoint 和 Key,如果你先启动 gateway 再改配置,就得重启服务,而重启又可能触发Gateway service not loaded,来回折腾。正确顺序是:先拿到三件套 → 写进 gateway 配置 → 再 install/start 服务 → 最后用 uv 跑一个最小请求验证。这样一次成型,少走弯路。
这里要提醒一句:TaoToken 是合规的 API 聚合入口,配置时只填 Base URL 和 Key,不要在里面塞任何本地代理或额外转发层。如果你之前配过别的 endpoint,先把旧的清掉,避免 gateway 读到两套配置互相覆盖。配置文件的位置通常在~/.openclaw/下,具体文件名以你安装版本为准,常见是config.toml或settings.json。下一节给可复制的片段。
3. 可复制配置:gateway 配置片段与 uv 依赖安装
先给 gateway 的配置片段。假设你的配置文件是~/.openclaw/config.toml,把模型出口改成 TaoToken,写法如下。注意路径和字段名要和你本地实际文件一致,不同版本字段可能略有差异,以openclaw config get能读出来的为准。
# ~/.openclaw/config.toml [model] provider = "openai-compatible" base_url = "https://taotoken.net/api" api_key = "sk-你的Key" model_id = "claude-sonnet-4-5" [gateway] host = "127.0.0.1" port = 8787 tools_profile = "full"如果你用的是 JSON 格式的 settings,等价写法是:
{ "model": { "provider": "openai-compatible", "base_url": "https://taotoken.net/api", "api_key": "sk-你的Key", "model_id": "claude-sonnet-4-5" }, "gateway": { "host": "127.0.0.1", "port": 8787, "tools_profile": "full" } }写完配置,先别急着 start。用openclaw config get model确认读到的 base_url 是https://taotoken.net/api,api_key 没被截断。然后处理 Python uv 环境。uv 的安装不在这里展开,假设你已经能用uv --version。进入你的项目目录,初始化并装依赖:
uv init hello cd hello uv add httpx openai uv syncuv sync会根据pyproject.toml创建.venv并锁定依赖。关键点来了:gateway 作为服务启动时,默认不会激活你的.venv。所以要么在 gateway 配置里显式指定 Python 解释器路径,要么在启动脚本里先source .venv/bin/activate。更稳的做法是在配置里写绝对路径:
[tools.python] interpreter = "/Users/你的用户名/hello/.venv/bin/python"这样 gateway 拉起 Python 工具时用的是你 uv 装好的环境,不会出现ModuleNotFoundError。如果你要跑 MCP server,命令是uv run mcp dev mcp_server.py,但注意这个命令要在项目目录下执行,且 gateway 的工作目录要设成同一个目录,否则相对路径找不到mcp_server.py。
配置和依赖都就位后,再走服务安装。第一次部署建议直接openclaw gateway install,它会生成 launchd 的 plist 并 bootstrap。之后用openclaw gateway start/stop/restart管理。控制台用openclaw dashboard打开。授予本地文件操作权限用openclaw config set tools.profile full,重新走配置向导用openclaw onboard。这几条命令建议按顺序记:install → start → dashboard → config set → onboard。
4. 验证请求:用 uv 跑一次最小调用确认 endpoint 生效
配置写完了,服务也起来了,怎么确认请求真的走到了 TaoToken?别急着开 dashboard 点按钮,先用命令行跑一个最小请求,把变量控制到最少。在项目目录下建一个check.py:
import os from openai import OpenAI client = OpenAI( base_url="https://taotoken.net/api", api_key=os.environ["TAOTOKEN_API_KEY"], ) resp = client.chat.completions.create( model="claude-sonnet-4-5", messages=[{"role": "user", "content": "只回复两个字:通了"}], ) print(resp.choices[0].message.content)运行前把 Key 放进环境变量,别硬编码进文件:
export TAOTOKEN_API_KEY="sk-你的Key" uv run --python 3.12 check.pyuv run --python 3.12会确保用 3.12 解释器跑,并且自动带上.venv里的依赖。如果输出「通了」,说明三件事都对:uv 环境正常、TaoToken endpoint 可达、Key 有效。这一步成功后再去 gateway 里发请求,就能排除掉「是模型出口问题还是 gateway 问题」。
接着验证 gateway 本身。启动服务后,用 curl 打一下本地端口:
curl -s http://127.0.0.1:8787/v1/models \ -H "Authorization: Bearer sk-你的Key" | head -c 500如果返回模型列表 JSON,说明 gateway 在监听且能转发。再发一条对话请求:
curl -s http://127.0.0.1:8787/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer sk-你的Key" \ -d '{"model":"claude-sonnet-4-5","messages":[{"role":"user","content":"ping"}]}'看到choices字段里有内容,整条链路就通了。实测下来,最容易出问题的是 gateway 读到的 Key 和你 curl 用的 Key 不一致,或者 gateway 配置里的 base_url 少了/api后缀。这两个点先查,能省一半时间。
如果你更想用图形界面确认,可以打开模型对话页面https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite,手动发一条消息,对比命令行结果。两边都通,说明配置没有歧义。
5. 常见报错排查:Gateway service not loaded 与 uv 依赖缺失
先复现最典型的报错。你openclaw gateway stop之后再openclaw gateway start,终端吐出:
Gateway service not loaded. Start with: openclaw gateway install Start with: openclaw gateway Start with: launchctl bootstrap gui/$UID ~/Library/LaunchAgents/ai.openclaw.gateway.plist这个报错的意思是 launchd 里没有注册这个服务,或者 plist 被卸载了。原因通常是:你之前用stop停掉后,服务被 unload 了,再 start 时找不到注册项。解决顺序是:
openclaw doctor --fix openclaw gateway install openclaw gateway startopenclaw doctor --fix会检查 plist 路径、权限和环境变量,把能自动修的修掉。如果它还提示 plist 不存在,手动确认~/Library/LaunchAgents/ai.openclaw.gateway.plist在不在。不在就openclaw gateway install重新生成。注意launchctl bootstrap gui/$UID这条是 macOS 的加载命令,$UID是你的用户 ID,直接复制执行即可,不要改成别的。
第二个高频报错是 uv 依赖缺失,gateway 日志里出现:
ModuleNotFoundError: No module named 'httpx'或者uv run报error: No solution found when resolving dependencies。前者是 gateway 用的 Python 解释器不是你的.venv,回到第 3 节,在配置里写死interpreter绝对路径。后者是依赖冲突,先uv lock --upgrade再uv sync,还不行就删掉.venv和uv.lock重新uv sync。
第三个是鉴权类报错,curl 返回 401:
{"error":{"message":"Invalid API key","type":"invalid_request_error"}}对照检查:Key 是不是复制时带了空格;Authorization头是不是Bearer sk-xxx格式;gateway 配置里的 Key 和 curl 用的是不是同一个。还有一种情况是 base_url 写成了https://taotoken.net(少了/api),请求打到官网首页,返回 HTML 而不是 JSON,也会被误判成鉴权失败。
第四个是reading choices相关报错,通常是响应结构和你代码里取字段的方式不匹配。比如你用了 OpenAI SDK,但 endpoint 返回的是非标准结构。确认base_url指向https://taotoken.net/api,并且model_id是文档里列出的有效值。如果报OAuth相关错误,说明你误用了需要 OAuth 的 provider 配置,把provider改成openai-compatible即可。
把这几类报错对照表列一下,方便你快速定位:
| 报错关键词 | 根因 | 处理 |
|---|---|---|
| Gateway service not loaded | launchd 未注册 | doctor --fix + gateway install |
| ModuleNotFoundError | 解释器非 .venv | 配置 interpreter 绝对路径 |
| Invalid API key / 401 | Key 错误或 base_url 缺 /api | 核对三件套 |
| reading choices | 响应结构不匹配 | 确认 provider 与 model_id |
| OAuth | provider 配错 | 改 openai-compatible |
排错时养成一个习惯:先看 gateway 日志,再看 curl 结果,最后看 Python 脚本。三层分开验证,别一上来就改配置,越改越乱。
6. 长期编码与 Agent 场景的入口选择
如果你只是偶尔验证一下请求,上面这套命令行加 curl 就够了。但如果你要把 OpenClaw 当长期编码助手或 Agent 底座,频繁启停 gateway、跑 MCP、调模型,那建议把 Coding Plan 用起来,入口是https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite。它适合长时间挂着的编码会话和 Agent 任务,省得你每次手动配 Key 和 endpoint。
Claude Code 这类工具如果要接进来,走 Anthropic 兼容入口https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claudecode&utm_campaign=rewrite,配置时同样记住三件套:Base URL 填https://taotoken.net/api,Key 用控制台生成的,Model ID 按文档填。Cline、CC Switch 这类客户端也是同一套逻辑,Base URL、Key、Model ID 三个字段对齐就行。
最后给一个我自己的操作习惯:每次改完 gateway 配置,先openclaw config get model确认读到的值,再openclaw gateway restart,然后立刻 curl 一次本地端口。三步都过,再去跑业务脚本。这样即使出问题,也能立刻知道是配置层、服务层还是请求层。uv 那边,项目目录固定用uv sync锁依赖,别混用 pip,混用是ModuleNotFoundError的最大来源。把这两条守住,OpenClaw gateway 的本地部署基本不会再卡你。