> 🔖 **作者**:一名在测试开发领域摸爬滚打 7年的 SDET
> 📅 **发布时间**:2026 年 3 月
> 🎯 **阅读时长**:约 15 分钟
—
## 前言:为什么我们需要 AI Agent 网关?
在 LLM 应用爆发式增长的今天,企业和开发者面临着几个棘手的工程化问题:
1. **多模型碎片化**:GPT、Claude、Gemini、国产大模型百花齐放,API 协议各异
2. **成本与质量的权衡**:不同任务需要不同能力的模型,手动切换效率低下
3. **故障转移缺失**:单一提供商宕机,整个应用随之瘫痪
4. **工具链割裂**:代码执行、文件操作、浏览器控制等能力缺乏统一入口
**OpenClaw** 正是为解决这些问题而生的开源智能体网关。它提供:
– 🔌 **统一 API 接口**:一套协议对接所有主流 LLM
– 🧠 **智能路由**:根据任务复杂度自动选择最优模型
– 🛠️ **Skills 生态**:可插拔的工具链扩展机制
– 🔄 **高可用架构**:自动故障转移与负载均衡
本文将从测试开发的视角,带你完成从 0 到 1 的部署,并深度剖析三个"坑爹"的生产级问题。
—
## 一、部署全流程
### 1.1 环境依赖
在开始之前,请确保你的环境满足以下要求:
| 依赖项 | 最低版本 | 推荐版本 | 检查命令 |
|——–|———|———|———|
| Node.js | v18.0.0 | v24.x | `node –version` |
| pnpm | v8.0.0 | v10.x | `pnpm –version` |
| Git | 任意 | 最新 | `git –version` |
| Python | 3.8+ | 3.12 | `python3 –version` |
> ⚠️ **注意**:Node.js v18 在某些 ESM 语法支持上存在兼容性问题,建议使用 fnm 管理 Node v24:
```bash
# 安装 fnm
curl -fsSL https://fnm.vercel.app/install | bash
# 安装 Node 24
fnm install 24
fnm use 24
# 验证
node –version # 应输出 v24.x.x
```
### 1.2 克隆与安装
```bash
# 克隆仓库
git clone https://github.com/openclaw/openclaw.git
cd openclaw/openclaw
# 安装依赖
pnpm install
# 构建项目
pnpm build
```
### 1.3 初始化配置
OpenClaw 的配置文件位于 `~/.openclaw/` 目录下:
```bash
# 创建配置目录
mkdir -p ~/.openclaw
# 创建环境变量文件
cat > ~/.openclaw/.env << 'EOF'
# Gateway 认证令牌(自动生成或自定义)
OPENCLAW_GATEWAY_TOKEN=your-secure-token-here
# API Keys(按需配置)
ANTHROPIC_API_KEY=your-anthropic-key
GOOGLE_API_KEY=your-google-key
# 国内用户注意:Gemini 需要代理
HTTP_PROXY=http://127.0.0.1:7897
HTTPS_PROXY=http://127.0.0.1:7897
EOF
```
### 1.4 创建主配置文件
```bash
cat > ~/.openclaw/openclaw.json << 'EOF'
{
"meta": {
"lastTouchedVersion": "2026.3.3"
},
"agents": {
"defaults": {
"model": {
"primary": "zhipu_ai/glm-5"
},
"workspace": "~/.openclaw/workspace"
}
},
"models": {
"mode": "replace",
"providers": {
"zhipu_ai": {
"baseUrl": "https://open.bigmodel.cn/api/paas/v4/",
"apiKey": "your-glm-api-key",
"api": "openai-completions",
"models": [
{
"id": "glm-5",
"name": "GLM-5",
"contextWindow": 128000,
"maxTokens": 8192
}
]
}
}
},
"gateway": {
"mode": "local"
}
}
EOF
```
> 💡 **关键点**:`models.mode` 必须设置为 `"replace"`,避免与内置默认配置冲突。后文会详细解释。
### 1.5 启动 Gateway
```bash
# 方式一:直接启动
pnpm openclaw gateway
# 方式二:作为系统服务(推荐生产环境)
# 创建 systemd 服务文件
cat > ~/.config/systemd/user/openclaw-gateway.service << 'EOF'
[Unit]
Description=OpenClaw Gateway
After=network.target
[Service]
Type=simple
ExecStart=%h/.local/share/fnm/node-versions/v24.3.0/installation/bin/node /path/to/openclaw/packages/cli/dist/index.js gateway
Restart=on-failure
RestartSec=10
[Install]
WantedBy=default.target
EOF
# 启用并启动
systemctl –user daemon-reload
systemctl –user enable openclaw-gateway
systemctl –user start openclaw-gateway
```
### 1.6 验证部署
```bash
# 检查 Gateway 状态
curl http://127.0.0.1:18789/status
# 预期返回:HTML 页面,标题为 "OpenClaw Control"
```
—
## 二、硬核排坑指南
以下三个问题均来自真实生产环境,每一个都能让你的部署"翻车"。
—
### 坑位一:API 鉴权 401 报错 —— Kimi 会员体系的物理隔离
#### 问题现象
```
Error: Kimi API error (401): {"error":{"message":"Invalid Authentication"}}
```
当你满怀期待地配置好 Kimi API Key,调用 `web_search` 工具时,却收到了 401 认证失败。
#### 根因分析
Kimi(Moonshot)的产品线存在 **物理隔离**:
| 产品 | 用途 | API 端点 | 认证方式 |
|——|——|———|———|
| Kimi Chat | 通用对话 | `api.moonshot.cn` | 标准 Bearer Token |
| **Kimi Code** | 编程助手 | `api.kimi.com/coding` | Anthropic 协议兼容 |
问题在于:**你在 Kimi Chat 获取的 API Key,无法直接用于 Kimi Code 的服务!**
Kimi Code 采用的是 **Anthropic 协议兼容模式**,需要通过特定的路由配置才能正常工作。
#### 解决方案
**步骤 1:获取正确的 API Key**
访问 [Kimi Code 开放平台](https://platform.kimi.com),获取专用于编程场景的 API Key(格式:`sk-kimi-xxxxx`)。
**步骤 2:配置 Anthropic 兼容路由**
在 `openclaw.json` 中添加 Anthropic provider:
```json
{
"models": {
"mode": "replace",
"providers": {
"anthropic": {
"baseUrl": "https://api.kimi.com/coding/",
"apiKey": "${ANTHROPIC_API_KEY}",
"api": "anthropic-messages",
"models": [
{
"id": "claude-3-5-sonnet-20240620",
"name": "Claude 3.5 Sonnet (Kimi)",
"contextWindow": 200000,
"maxTokens": 8192
}
]
}
}
}
}
```
**步骤 3:环境变量映射**
在 `.env` 文件中:
```bash
ANTHROPIC_API_KEY=sk-kimi-your-actual-key-here
ANTHROPIC_BASE_URL=https://api.kimi.com/coding/
```
**步骤 4:验证连通性**
```bash
curl -X POST "https://api.kimi.com/coding/v1/messages" \\
-H "x-api-key: sk-kimi-your-key" \\
-H "anthropic-version: 2023-06-01" \\
-H "Content-Type: application/json" \\
-d '{
"model": "claude-3-5-sonnet-20240620",
"max_tokens": 10,
"messages": [{"role": "user", "content": "Say OK"}]
}'
```
#### 测试开发视角的启示
这个问题暴露了 API 鉴权测试的盲区:
1. **同一厂商的多产品线可能采用不同的认证体系**
2. **协议兼容不等于 Key 兼容**
3. **401 错误不应只检查 Key 是否正确,还要检查路由是否匹配**
—
### 坑位二:GLM-5 调用的 400 错误 —— Tool Call 格式兼容性
#### 问题现象
```
Error: 400 Bad Request – Invalid tool call format
```
当使用 GLM-5 进行工具调用时,某些场景下会返回 400 错误。
#### 根因分析
GLM 系列模型的 Tool Call 实现与 OpenAI 标准存在 **微妙差异**:
```python
# OpenAI 标准格式
{
"tool_calls": [{
"id": "call_xxx",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{\\"location\\": \\"Beijing\\"}"
}
}]
}
# GLM 实际返回格式(部分场景)
{
"tool_calls": [{
"id": "call_xxx",
"type": "function",
"function": {
"name": "get_weather",
"arguments": {"location": "Beijing"} # 注意:这里是 dict,不是 string
}
}]
}
```
这种差异在 OpenClaw 的 `openai-completions` API 类型处理时会导致解析失败。
#### 解决方案
**方案 A:调整 API 类型配置**
GLM-5 推荐使用 `openai-completions` API 类型,但对于复杂工具调用场景,可以尝试:
```json
{
"zhipu_ai": {
"baseUrl": "https://open.bigmodel.cn/api/paas/v4/",
"apiKey": "your-key",
"api": "openai-completions",
"models": [
{
"id": "glm-5",
"name": "GLM-5",
"contextWindow": 128000,
"maxTokens": 8192
},
{
"id": "glm-4v-flash",
"name": "GLM-4V-Flash",
"input": ["text", "image"],
"contextWindow": 128000
}
]
}
}
```
**方案 B:代码层面的防御性处理**
如果你在开发自己的 Agent 应用,建议在工具调用解析层添加兼容逻辑:
```python
def parse_tool_call(tool_call):
"""兼容 OpenAI 和 GLM 的工具调用格式"""
args = tool_call.function.arguments
if isinstance(args, str):
return json.loads(args)
elif isinstance(args, dict):
return args
else:
raise ValueError(f"Unsupported arguments type: {type(args)}")
```
**方案 C:降级策略**
对于复杂的多工具调用场景,建议:
1. 使用 Gemini(免费)或 Claude(Kimi Code)处理复杂推理
2. GLM-5 用于日常对话和简单任务
3. 建立智能路由机制(后文会讲到)
#### 测试开发视角的启示
1. **不要假设所有模型都完美遵循 OpenAI 协议**
2. **工具调用是 LLM 生态中最容易出问题的环节**
3. **建立自动化测试用例覆盖各种边界情况**
—
### 坑位三:Ubuntu 24 视觉操控失效 —— Wayland 安全隔离
#### 问题现象
在 Ubuntu 24.04 上使用 OpenClaw 的浏览器控制功能时:
```bash
# 浏览器启动成功,但无法操控
browser action=snapshot
# 返回:空白页面或超时错误
```
#### 根因分析
Ubuntu 24.04 默认采用 **Wayland** 显示协议,取代了传统的 X11 (Xorg)。
| 特性 | X11 | Wayland |
|——|—–|———|
| 架构 | 单体式 | 模块化 |
| 安全性 | 弱(任意窗口可被监听) | **强(进程隔离)** |
| 兼容性 | 广泛 | 部分应用不兼容 |
| 自动化测试 | ✅ 完美支持 | ❌ 需要特殊配置 |
Wayland 的安全隔离机制导致:
1. **浏览器自动化工具无法获取窗口句柄**
2. **Playwright/Selenium 的某些功能失效**
3. **屏幕截图工具权限受限**
#### 解决方案
**方案 A:切换回 Xorg(推荐,一劳永逸)**
```bash
# 1. 编辑 GDM 配置
sudo nano /etc/gdm3/custom.conf
# 2. 取消以下行的注释
WaylandEnable=false
# 3. 重启系统
sudo reboot
```
重启后验证:
```bash
echo $XDG_SESSION_TYPE
# 应输出:x11
```
**方案 B:为特定用户禁用 Wayland**
如果不想全局切换,可以在登录界面选择:
1. 注销当前用户
2. 点击登录界面的"齿轮"图标
3. 选择 "Ubuntu on Xorg"
4. 输入密码登录
**方案 C:环境变量强制指定**
```bash
# 在启动 OpenClaw 前设置
export WAYLAND_DISPLAY=
export DISPLAY=:0
# 或在 .env 文件中添加
WAYLAND_DISPLAY=
```
**方案 D:使用无头模式(Headless)**
如果不需要可视化调试:
```json
{
"browser": {
"headless": true
}
}
```
#### 验证修复
```bash
# 启动浏览器测试
browser action=open url=https://example.com
# 截图验证
browser action=screenshot
# 快照验证
browser action=snapshot
```
#### 测试开发视角的启示
作为 SDET,我们在搭建 CI/CD 流水线时经常会遇到类似的底层环境问题:
1. **显示协议是 GUI 自动化的基础设施,必须优先确认**
2. **容器化环境建议使用 Xvfb(虚拟 X11)**
3. **Docker 方案**:
```dockerfile
FROM ubuntu:24.04
# 安装 Xvfb
RUN apt-get update && apt-get install -y xvfb
# 启动脚本
CMD Xvfb :99 -screen 0 1920x1080x24 & \\
export DISPLAY=:99 && \\
node /app/openclaw/packages/cli/dist/index.js gateway
```
—
## 三、质量验证
作为一名测试开发工程师,部署完成后的验证环节绝不能省。以下是我总结的 **Sanity Test 清单**:
### 3.1 Gateway 连通性测试
```bash
# TC-001: Gateway 健康检查
curl -s http://127.0.0.1:18789/status | grep -q "OpenClaw Control" && echo "✅ PASS" || echo "❌ FAIL"
# TC-002: API 端点可达性
curl -s http://127.0.0.1:18789/api/health && echo "✅ PASS" || echo "❌ FAIL"
```
### 3.2 模型调用测试
```bash
# TC-003: GLM-5 基础调用
curl -s -X POST "https://open.bigmodel.cn/api/paas/v4/chat/completions" \\
-H "Authorization: Bearer $GLM_API_KEY" \\
-H "Content-Type: application/json" \\
-d '{"model":"glm-5","messages":[{"role":"user","content":"1+1=?"}],"max_tokens":10}' \\
| jq -e '.choices[0].message.content' && echo "✅ PASS" || echo "❌ FAIL"
# TC-004: Gemini 调用(需代理)
curl -s -x http://127.0.0.1:7897 \\
-X POST "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=$GOOGLE_API_KEY" \\
-H "Content-Type: application/json" \\
-d '{"contents":[{"parts":[{"text":"1+1=?"}]}]}' \\
| jq -e '.candidates[0].content.parts[0].text' && echo "✅ PASS" || echo "❌ FAIL"
# TC-005: Kimi Code 调用
curl -s -X POST "https://api.kimi.com/coding/v1/messages" \\
-H "x-api-key: $KIMI_API_KEY" \\
-H "anthropic-version: 2023-06-01" \\
-H "Content-Type: application/json" \\
-d '{"model":"claude-3-5-sonnet-20240620","max_tokens":10,"messages":[{"role":"user","content":"1+1=?"}]}' \\
| jq -e '.content[0].text' && echo "✅ PASS" || echo "❌ FAIL"
```
### 3.3 浏览器控制测试
```bash
# TC-006: 浏览器启动与导航
browser action=open url=https://example.com
browser action=snapshot | grep -q "Example Domain" && echo "✅ PASS" || echo "❌ FAIL"
browser action=stop
```
### 3.4 工具调用测试
在 OpenClaw 会话中测试:
```
# TC-007: 文件操作
请帮我创建一个测试文件 /tmp/test-openclaw.txt,内容为 "Hello OpenClaw"
# TC-008: 网络请求
请帮我搜索今天的天气预报
# TC-009: 代码执行
运行命令 echo $SHELL 并返回结果
```
### 3.5 故障转移测试
```bash
# TC-010: 模拟 API 故障
# 临时移除某个 provider 的 API Key,验证是否正常报错而非崩溃
# TC-011: 代理故障测试
# 关闭代理,验证 Gemini 调用的错误处理
```
### 3.6 自动化验证脚本
将以上测试整合为脚本:
```bash
#!/bin/bash
# openclaw-sanity-test.sh
GREEN='\\033[0;32m'
RED='\\033[0;31m'
NC='\\033[0m'
pass=0
fail=0
test_case() {
local name="$1"
local cmd="$2"
echo -n "Testing: $name … "
if eval "$cmd" > /dev/null 2>&1; then
echo -e "${GREEN}PASS${NC}"
((pass++))
else
echo -e "${RED}FAIL${NC}"
((fail++))
fi
}
echo "=== OpenClaw Sanity Test ==="
echo ""
test_case "Gateway Health" "curl -s http://127.0.0.1:18789/status | grep -q OpenClaw"
test_case "GLM-5 API" "curl -s -X POST https://open.bigmodel.cn/api/paas/v4/chat/completions -H 'Authorization: Bearer $GLM_API_KEY' -H 'Content-Type: application/json' -d '{\\"model\\":\\"glm-5\\",\\"messages\\":[{\\"role\\":\\"user\\",\\"content\\":\\"test\\"}],\\"max_tokens\\":5}' | jq -e '.choices'"
test_case "X11 Session" "[ \\$XDG_SESSION_TYPE = 'x11' ]"
echo ""
echo "=== Results ==="
echo -e "Pass: ${GREEN}$pass${NC}"
echo -e "Fail: ${RED}$fail${NC}"
if [ $fail -eq 0 ]; then
echo -e "${GREEN}All tests passed!${NC}"
exit 0
else
echo -e "${RED}Some tests failed. Please check the logs.${NC}"
exit 1
fi
```
—
## 四、进阶:智能模型路由
完成基础部署后,你可以进一步配置 **智能路由**,让 OpenClaw 根据任务类型自动选择最优模型:
```json
// ~/.openclaw/workspace/TOOLS.md
## 智能模型路由
| 任务类型 | 推荐模型 | 原因 |
|———-|———-|——|
| 日常对话 | GLM-5 | 国内快、响应快 |
| 代码/编程 | Gemini 3 Flash | 推理强 |
| 长文档 | Gemini 3 Flash | 100万上下文 |
| 图片分析 | Gemini 3 Flash | 多模态 |
```
详细的 Skill 配置可参考 OpenClaw 官方文档或 ClawHub 技能市场。
—
## 五、总结
OpenClaw 作为一款开源的智能体网关,在 AI 应用工程化领域提供了极大的便利。但正如所有基础设施项目一样,部署过程中充满了各种"坑"。
本文从测试开发的视角,深入剖析了三个典型问题:
1. **Kimi API 鉴权**:理解厂商多产品线的物理隔离机制
2. **GLM Tool Call**:关注协议兼容性的边界情况
3. **Wayland 隔离**:重视底层 OS 环境对自动化的影响
希望这份指南能帮助你少走弯路,快速搭建起生产级的 AI Agent 网关。
—
## 参考资料
– [OpenClaw 官方文档](https://docs.openclaw.ai)
– [OpenClaw GitHub 仓库](https://github.com/openclaw/openclaw)
– [ClawHub 技能市场](https://clawhub.com)
– [智谱 AI 开放平台](https://open.bigmodel.cn)
– [Kimi Code 开发者平台](https://platform.kimi.com)
– [Google AI Studio](https://aistudio.google.com)
你在本地部署大模型智能体时遇到过哪些离谱的 Bug?欢迎在评论区贴出报错日志,我们一起复盘排障!




