如何在一台 Windows 宿主机上跑两个完全独立的 OpenClaw Gateway,各自绑定不同微信、使用不同 AI 模型,还能互不干扰?本文记录完整的配置、踩坑和修复过程。

前言

需求:一个微信号对接 DeepSeek Flash(快速、便宜、日常对话),另一个微信号对接 DeepSeek Pro(翻译审校、长文档处理)。虽然 OpenClaw 单个 Gateway 原生支持多微信账号,但所有账号共享同一个 AI 模型和 Workspace

如果你需要不同微信使用不同模型、独立会话上下文、互不干扰,就需要两个独立 Gateway。

本文将基于 openclaw 2026.3.23-2 + Node.js 24.2.0 + Windows 11,从头配置双 Gateway 并记录所有踩坑。

架构

关键设计原则:端口隔离、配置隔离、状态隔离、Agent 隔离。四个维度全部独立,才能保证稳定。

环境准备

组件 版本 说明
OpenClaw 2026.3.23-2 npm 全局安装
Node.js 24.2.0 Windows 端
微信插件 @tencent-weixin/openclaw-weixin 2.0.1 已安装
OS Windows 11

确认当前只有一个 Gateway 在运行:

curl http://127.0.0.1:18789/health
# {"ok":true,"status":"live"}

第一步:创建第二个配置文件

以当前 openclaw.json 为模板:

cp ~/.openclaw/openclaw.json ~/.openclaw/openclaw-gateway2.json

用 Node.js 修改关键字段:

const fs = require('fs');
const path = 'C:/Users/<用户名>/.openclaw/openclaw-gateway2.json';
const cfg = JSON.parse(fs.readFileSync(path, 'utf8'));

// 修改端口和模型
cfg.gateway.port = 19789;
cfg.agents.defaults.model.primary = 'deepseek/deepseek-v4-pro[1m]';
cfg.agents.defaults.workspace = String.raw`C:\Users\<用户名>\.openclaw\workspace-gateway2`;
cfg.agents.defaults.timeoutSeconds = 600;

fs.writeFileSync(path, JSON.stringify(cfg, null, 2), 'utf8');

⚠️ 端口间隔:G2 使用 19789,与 G1 的 18789 间隔至少 20,因为 browser control(+2)、canvas 等端口是自动派生的。

第二步:创建独立目录

mkdir $env:USERPROFILE\.openclaw\workspace-gateway2
mkdir $env:USERPROFILE\.openclaw\state-gateway2

⚠️ 最关键的一个坑

绝对不要用 junction/symlink 共享 agents 目录!

# ❌ 错误做法:会导致两 Gateway 共享 session 文件,产生锁冲突
mklink /J state-gateway2\agents ~\.openclaw\agents

# ✅ 正确做法:extensions 可以共享,agents 必须独立
mklink /J state-gateway2\extensions ~\.openclaw\extensions

共享 agents 的后果:

现象 原因
Gateway 进程静默崩溃 两个进程争抢同一个 session 文件的写锁
日志无任何错误 文件锁竞争发生在 OS 层,JS 层捕获不到
微信消息"请求超时" Session 被锁住,模型无法写入回复

第三步:Agent 初始化

清空 G2 的 agents 目录,让 openclaw 首次启动时自动创建:

rm -rf ~/.openclaw/state-gateway2/agents/*

启动后 openclaw 自动生成独立 Agent:

Agent ID: gateway2
Session Key: agent:gateway2:main

与 G1 的 agent:main:main 完全隔离。

第四步:编写启动脚本

# start-openclaw-gateway2.ps1
$ErrorActionPreference = 'Stop'

# === 独立配置 ===
$env:OPENCLAW_CONFIG_PATH = "$env:USERPROFILE\.openclaw\openclaw-gateway2.json"
$env:OPENCLAW_STATE_DIR   = "$env:USERPROFILE\.openclaw\state-gateway2"

# === 只杀自己的端口进程 ===
$gatewayPid = Get-NetTCPConnection -LocalPort 19789 -State Listen `
    -ErrorAction SilentlyContinue | Select-Object -ExpandProperty OwningProcess -First 1
if ($gatewayPid) {
    Stop-Process -Id $gatewayPid -Force
}
Start-Sleep -Seconds 1

# === PATH 修正:避免 spawn openclaw ENOENT ===
$npmGlobalBin = Join-Path $env:APPDATA 'npm'
$env:PATH = "$npmGlobalBin;$env:PATH"

# === 启动 ===
$nodeExe = (Get-Command node).Source
$openclawMjs = "$env:APPDATA\npm\node_modules\openclaw\openclaw.mjs"

Start-Process -FilePath "cmd.exe" -ArgumentList "/d /c `"$nodeExe`" `"$openclawMjs`" gateway --port 19789 > `"$env:USERPROFILE\openclaw-gateway2-manual.log`" 2>&1" -WindowStyle Hidden

同样,G1 的启动脚本也要改为按端口查杀

# ✅ G1 只杀 18789 端口的进程,不会误杀 G2
$gatewayPid = Get-NetTCPConnection -LocalPort 18789 -State Listen `
    | Select-Object -ExpandProperty OwningProcess -First 1

❌ 不要用 CommandLine -like "*openclaw*" 来匹配进程,那会把另一个 Gateway 也杀掉。

第五步:登录第二个微信

$env:OPENCLAW_CONFIG_PATH = "$env:USERPROFILE\.openclaw\openclaw-gateway2.json"
$env:OPENCLAW_STATE_DIR   = "$env:USERPROFILE\.openclaw\state-gateway2"

openclaw channels login --channel openclaw-weixin

⏱️ 二维码约 2 分钟有效,拿另一个微信扫码。超时需要重新执行。

第六步:配置 Workspace

复制基础文件到 G2:

cp ~/.openclaw/workspace/AGENTS.md  ~/.openclaw/workspace-gateway2/
cp ~/.openclaw/workspace/SOUL.md    ~/.openclaw/workspace-gateway2/
cp ~/.openclaw/workspace/USER.md    ~/.openclaw/workspace-gateway2/
cp ~/.openclaw/workspace/TOOLS.md   ~/.openclaw/workspace-gateway2/

根据 G2 的用途定制 AGENTS.md。比如 G2 侧重翻译审校,可以加入技能调度规则:

## Deep Review Mode

触发词:深度审校、深度翻译、法律翻译、合同翻译

当触发时,分三步处理:
1. 直译,保持原文结构
2. 检查术语一致性、逻辑连贯性
3. 优化中文表达,附审校说明

验证

健康检查

curl http://127.0.0.1:18789/health  # G1
# {"ok":true,"status":"live"}
curl http://127.0.0.1:19789/health  # G2
# {"ok":true,"status":"live"}

端口确认

netstat -ano | findstr "18789 18791 19789 19791"

预期输出:

TCP  127.0.0.1:18789  LISTENING  <PID1>
TCP  127.0.0.1:18791  LISTENING  <PID1>
TCP  127.0.0.1:19789  LISTENING  <PID2>
TCP  127.0.0.1:19791  LISTENING  <PID2>

双微信确认

openclaw channels list
# G1: openclaw-weixin a2dbb69f5a80-im-bot: configured, enabled

$env:OPENCLAW_CONFIG_PATH = "..."
openclaw channels list
# G2: openclaw-weixin 5c21986455d7-im-bot: configured, enabled

互不干扰测试

重启 G1,验证 G2 不受影响:

# 重启 G1
./start-openclaw-gateway.ps1
# G2 仍然存活
curl http://127.0.0.1:19789/health
# {"ok":true,"status":"live"}

完整的踩坑记录

# 问题 日志表现 根因 修复
1 G1 重启后 G2 消失 G2 端口消失 查杀脚本 CommandLine -like "*openclaw*" 误杀 按端口查杀进程
2 Gateway 静默崩溃 进程消失,无错误日志 junction 共享 agents 目录,session 文件锁冲突 独立 agents 目录
3 spawn openclaw ENOENT 崩溃日志有 ENOENT npm bin 不在 Gateway 进程 PATH 启动脚本加 $env:PATH
4 Request timed out embedded run timeout 默认 timeout 30s,系统 prompt 41KB+ 首次请求慢 设 600s
5 微信消息无回复 有 typing 无回复 DeepSeek 超时 / session 锁冲突 修 1+2+4
6 图片分析卡住 Navigation blocked: file:// 浏览器不支持本地文件协议 改用多模态模型直调 API
7 JSON 解析失败 Unexpected token PowerShell Set-Content -Encoding UTF8 写入 BOM Node.js 写配置,不带 BOM

最终配置对照

维度 Gateway 1 Gateway 2
端口 18789 / 18791 19789 / 19791
配置文件 openclaw.json openclaw-gateway2.json
State 目录 ~/.openclaw/ ~/.openclaw/state-gateway2/
Workspace ~/.openclaw/workspace/ ~/.openclaw/workspace-gateway2/
启动脚本 start-openclaw-gateway.ps1 start-openclaw-gateway2.ps1
AI 模型 DeepSeek V4 Flash DeepSeek V4 Pro
Agent ID main gateway2
Session Key agent:main:main agent:gateway2:main
上下文窗口 128K 1M
微信账号 账号 A 账号 B
超时设置 600s 600s

FAQ

Q: 能不能在同一台机器上跑三个 Gateway?

可以。端口再加 20(19789 + 20 = 19809),依此类推。注意内存占用和 DeepSeek API 并发限制。

Q: 双 Gateway 能用同一个 API Key 吗?

可以。DeepSeek 按 token 计费,两个 Gateway 共享同一个 Key,所有消耗合并计入同一个账单。如果需要分开核算(例如不同部门/项目),可以申请两个 API Key 分别配置。

Q: 一号微信的消息会不会串到二号?

不会。每个 Gateway 监听自己的端口,微信账号绑定不同的 im-bot ID,会话完全隔离。

Q: 需要每次开机手动启动两个 Gateway 吗?

可以把两个启动脚本都加入 Windows 启动文件夹或计划任务,开机自动启动。注意 G1 和 G2 之间加 30 秒延迟,避免同时初始化冲突。


如果您觉得有用,欢迎 点赞、转发、评论、关注

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐