【Bug已解决】openclaw: "environment variable conflict" / Config override issue — OpenClaw 环境变量冲突解决方案
1. 问题描述
OpenClaw 的环境变量与配置文件冲突,导致配置不生效:
# 环境变量覆盖配置 $ cat .openclaw/config.json {"model": "claude-sonnet-4-20250514"} $ export OPENCLAW_MODEL=claude-3-haiku $ openclaw "task" # 使用了 haiku 而非配置中的 sonnet # 或多个环境变量冲突 $ export ANTHROPIC_API_KEY=key_A $ export OPENCLAW_API_KEY=key_B $ openclaw "task" # 不确定使用哪个 Key # 或 .env 和 .bashrc 冲突 $ cat .env ANTHROPIC_API_KEY=key_A $ cat ~/.bashrc export ANTHROPIC_API_KEY=key_B $ openclaw "task" # 使用了 key_B这个问题在以下场景中特别常见:
- 环境变量覆盖配置文件
- 多个环境变量冲突
- .env 和 .bashrc 冲突
- 旧变量残留
- CI/CD 环境变量注入
2. 原因分析
| 原因分类 | 具体表现 | 占比 |
|---|---|---|
| 环境变量覆盖 | env > config | 约 35% |
| 多变量冲突 | key_A vs key_B | 约 25% |
| .env vs .bashrc | 加载顺序 | 约 15% |
| 旧变量残留 | stale | 约 15% |
| CI/CD 注入 | 覆盖 | 约 5% |
| export 顺序 | 后覆盖先 | 约 5% |
3. 解决方案
方案一:检查环境变量(最推荐)
# 步骤 1:检查所有相关环境变量 env | grep -i "OPENCLAW\|ANTHROPIC" # 步骤 2:检查特定变量 echo $OPENCLAW_MODEL echo $ANTHROPIC_API_KEY # 步骤 3:清除冲突变量 unset OPENCLAW_MODEL # 让配置文件生效 unset OPENCLAW_API_KEY # 只用 ANTHROPIC_API_KEY # 步骤 4:验证 openclaw --debug 2>&1 | grep -i "model\|api_key\|config"方案二:统一配置来源
# 只使用一种配置方式:环境变量 OR 配置文件 # 如果使用配置文件 unset OPENCLAW_MODEL cat > .openclaw/config.json << 'EOF' {"model": "claude-sonnet-4-20250514"} EOF # 或只使用环境变量 export ANTHROPIC_API_KEY=sk-ant-api03-xxxxx export OPENCLAW_MODEL=claude-sonnet-4-20250514 # 验证 openclaw --print "hello"方案三:修复 .env 和 .bashrc 冲突
# 步骤 1:检查 .env cat .env | grep -i "ANTHROPIC\|OPENCLAW" # 步骤 2:检查 .bashrc grep -i "ANTHROPIC\|OPENCLAW" ~/.bashrc # 步骤 3:统一到一个文件 sed -i '/ANTHROPIC\|OPENCLAW/d' ~/.bashrc source ~/.bashrc # 步骤 4:验证 env | grep -i "ANTHROPIC\|OPENCLAW" openclaw --print "hello"方案四:清除旧变量
# 步骤 1:检查所有变量 env | grep -i "OPENCLAW" # 步骤 2:清除所有旧变量 unset OPENCLAW_MODEL unset OPENCLAW_API_KEY unset OPENCLAW_MAX_TOKENS # 步骤 3:重新设置 export ANTHROPIC_API_KEY=sk-ant-api03-xxxxx # 步骤 4:验证 openclaw --print "hello"方案五:使用配置文件优先
# 步骤 1:清除环境变量 unset OPENCLAW_MODEL unset OPENCLAW_API_KEY # 步骤 2:创建配置文件 cat > .openclaw/config.json << 'EOF' { "model": "claude-sonnet-4-20250514", "maxTokens": 8192 } EOF # 步骤 3:验证 python3 -m json.tool .openclaw/config.json openclaw --print "hello" # 步骤 4:验证来源 openclaw --debug 2>&1 | grep -i "config\|source"方案六:检查 CI/CD 注入
# 步骤 1:检查 CI/CD 变量 env | grep -i "CI\|OPENCLAW\|ANTHROPIC" # 步骤 2:在 CI/CD 配置中设置 # .github/workflows/ci.yml # env: # ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} # 步骤 3:清除冲突变量 unset OPENCLAW_MODEL # 让 CI/CD 的 ANTHROPIC_API_KEY 生效 # 步骤 4:验证 openclaw --print "hello"4. 各方案对比总结
| 方案 | 适用场景 | 推荐指数 | 难度 |
|---|---|---|---|
| 方案一:检查变量 | 排查 | ⭐⭐⭐⭐⭐ | 低 |
| 方案二:统一来源 | 长期 | ⭐⭐⭐⭐⭐ | 低 |
| 方案三:.env 修复 | 项目 | ⭐⭐⭐⭐⭐ | 低 |
| 方案四:清除旧变量 | 残留 | ⭐⭐⭐⭐⭐ | 低 |
| 方案五:配置优先 | 文件 | ⭐⭐⭐⭐⭐ | 低 |
| 方案六:CI/CD | 流水线 | ⭐⭐⭐⭐ | 低 |
5. 常见问题 FAQ
5.1 环境变量和配置文件的优先级
环境变量通常优先于配置文件。清除环境变量让配置文件生效。
5.2 如何检查环境变量
env | grep -i "OPENCLAW\|ANTHROPIC"5.3 如何清除环境变量
unset OPENCLAW_MODEL unset OPENCLAW_API_KEY5.4 .env 和 .bashrc 冲突
统一到一个文件,从另一个中删除相关行。
5.5 CI/CD 中如何管理
在 CI/CD 配置中设置 secrets,清除冲突变量。
5.6 旧变量残留
使用unset清除所有旧变量,重新设置。
5.7 如何验证配置来源
openclaw --debug 2>&1 | grep -i "config\|source\|env"5.8 ANTHROPIC_API_KEY 和 OPENCLAW_API_KEY
只使用一个。推荐ANTHROPIC_API_KEY。
5.9 如何统一配置
选择一种方式(环境变量或配置文件),清除另一种。
5.10 排查清单速查表
□ 1. env | grep OPENCLAW 检查 □ 2. unset 清除冲突变量 □ 3. 统一到一种配置方式 □ 4. sed -i 清理 .bashrc □ 5. cat .env 检查项目配置 □ 6. python3 -m json.tool 验证 □ 7. openclaw --debug | grep config □ 8. CI/CD secrets 管理 □ 9. unset 旧变量重新设置 □ 10. 只用 ANTHROPIC_API_KEY6. 总结
- 根本原因:环境变量冲突最常见原因是环境变量覆盖配置(35%)和多变量冲突(25%)
- 最佳实践:使用
env | grep -i OPENCLAW检查,unset清除冲突变量 - 统一来源:选择一种配置方式(环境变量或配置文件),清除另一种
- .env 和 .bashrc:统一到一个文件,从另一个中删除
- 最佳实践建议:CI/CD 中使用 secrets,只使用
ANTHROPIC_API_KEY
故障排查流程图
flowchart TD A[环境变量冲突] --> B[env | grep OPENCLAW] B --> C{有冲突变量?} C -->|是| D[unset 清除] C -->|否| E[检查 .env] D --> F[openclaw --print hello] E --> G{.env 有冲突?} G -->|是| H[统一到 .env 或 .bashrc] G -->|否| I[检查 CI/CD] H --> F I --> J{CI/CD 注入?} J -->|是| K[清除冲突变量] J -->|否| L[检查旧变量] K --> F L --> M[unset 所有旧变量] M --> F F --> N{配置正确?} N -->|是| O[✅ 问题解决] N -->|否| P[使用配置文件] P --> Q[unset 所有环境变量] Q --> R[创建 config.json] R --> F O --> S[长期: 统一来源 + 清除冲突] S --> T[✅ 长期方案]