今天折腾了半小时,终于搞明白为什么 openclaw gateway start 一直报 HTTP 401: Invalid API key,而 openclaw gateway run 却能正常工作。
记录一下,免得以后又踩。
问题现象
用 openclaw gateway run 前台运行,一切正常,能正常对话。
但换成 openclaw gateway start(systemd 后台服务),就报错:
HTTP 401: Invalid API key
明明配置文件里 API key 写得好好的,为什么会这样?
原因分析
run 和 start 的区别:
run--- 前台运行,直接继承当前 shell 的环境变量start--- 通过 systemd 启动后台服务,环境变量是隔离的
问题就出在这里。
我的 shell 里设置了:
bash
export ANTHROPIC_BASE_URL=https://api.aigocode.com
export ANTHROPIC_AUTH_TOKEN=sk-xxx...
gateway run 能继承这些变量,所以能用。但 systemd service 启动时,这些变量根本不存在。
虽然 openclaw.json 配置文件里也写了 apiKey,但 OpenClaw 优先读取环境变量。环境变量不存在时,可能走了默认的 Anthropic 官方 API,然后用配置文件里的 key 去请求------当然会 401。
解决方案
把环境变量加到 systemd service 文件里。
Step 1:找到 service 文件
bash
cat ~/.config/systemd/user/openclaw-gateway.service
Step 2:在 [Service] section 添加环境变量
ini
[Service]
# ... 其他配置 ...
Environment=ANTHROPIC_BASE_URL=https://api.aigocode.com
Environment=ANTHROPIC_AUTH_TOKEN=sk-你的key
[Install]
WantedBy=default.target
⚠️ 注意 :Environment 必须放在 [Service] section 里,不能放在 [Install] 后面,否则 systemd 会直接忽略。
Step 3:重新加载并重启
bash
systemctl --user daemon-reload
systemctl --user restart openclaw-gateway
搞定。
踩坑记录
我一开始用 >> 追加环境变量到文件末尾,结果加到了 [Install] section 后面。systemd 日志里有这么一行:
Unknown key name 'Environment' in section 'Install', ignoring.
直接被忽略了,难怪不生效。
写在最后
这个问题的本质是:前台运行和后台服务的环境变量是隔离的。
如果你用的是第三方 API 代理(比如 aigocode),或者自定义了 ANTHROPIC_BASE_URL,记得把这些变量也加到 systemd service 里。
希望这篇文章能帮到遇到同样问题的人。