部分第三方消息服务提供商(企微 bot、个微 bot)要求固定公网 IP 接收 webhook,而 openclaw 多为本地部署。awada 在公网中转消息到本地 openclaw 实例。
微信用户
│ (消息)
▼
provider service ──webhook──► awada-server
│
HTTP/WS 网关(X-Awada-Key 鉴权)
│
▼
awada-extension(本地 openclaw,本仓)
│
openclaw agent
│
▼
awada-server ──► 微信用户(回复)
传输契约:见 docs/AWADA-CLIENT-TRANSPORT.md(唯一耦合面)。
- inbound(server 写 / bot 读):bot 通过
WS /api/v1/awada/inbound?lane=拉取,处理完发{type:"ack",id}。 - outbound(bot 写 / server 读):bot 通过
POST /api/v1/awada/outbound?lane=回执,meta必填channel_id/user_id_external(从 inboundevent.meta原样回传);platform回复时回传、主动外呼省略。 - Redis → relay 内部,不对客户端暴露(D2)。客户端最少只需配
awadaKey。
核心组件(拆分后归属):
- awada-server → relay 仓
services/awada-server/。客户端不部署、不持凭据。 - awada-extension → 本仓
awada/。openclaw channel 插件,走 HTTP/WS 调 relay 网关。
cd /path/to/openclaw/awada
pnpm install --prod典型报错信号:Cannot find module 'ws'(缺依赖)。
openclaw 配置文件中添加 channels.awada 节点:
{
"channels": {
"awada": {
"awadaKey": "<AWADA_KEY>"
}
}
}传输改造点:原
redisUrl字段已作废,替换为relayBaseUrl+awadaKey。extension 走WS /api/v1/awada/inbound?lane=(读 inbound + ack)+POST /api/v1/awada/outbound?lane=(写回执),带X-Awada-Keyheader。Redis 直连模式不再支持。
awadaKey与签名服务用的OFB_KEY是两份独立凭证,relay admin 分别签发。lane在 relay 侧 provision 时已绑死 platform,客户端不发platform。
awada-extension 配置项:
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled |
boolean | true |
是否启用 |
awadaKey |
string | — | awada key,必填,由 relay admin 签发(含 awada:lane:<laneId> scope),作为 X-Awada-Key header 发出 |
relayBaseUrl |
string | https://relay.openclaw-for-business.com |
relay 网关端点(http/https);官方域名可不配 |
lane |
string | ""(server 默认 User) |
订阅的 lane,可选;不传时服务器默认使用 User lane |
dmPolicy |
string | "open" |
open/pairing/allowlist |
allowFrom |
string[] | [] |
allowlist 模式下允许的用户 ID |
perMsgMaxLen |
number | — | 单条消息最大字符数,超长自动拆分 |
客服场景推荐配置(含消息长度限制 + 用户会话隔离):
{
"channels": {
"awada": {
"awadaKey": "<AWADA_KEY>",
"perMsgMaxLen": 500
}
},
"session": { "dmScope": "per-channel-peer" }
}
perMsgMaxLen: 500:超长回复自动拆分,每条 ≤500 字符(微信单消息长度限制)。session.dmScope: "per-channel-peer":每个微信用户独享 session,上下文隔离。
- WS 长连接 + ack:extension 启动后开一条 WS 到 relay 网关,relay 推
{id,event}帧,extension 处理完(含 POST 回执)后发{type:"ack",id}。未 ack 的事件留在 PEL,断线重连后由网关 XAUTOCLAIM 回收重投(min-idle 65s)。 - 至少一次:极少数情况下(ack 已发但网关进程恰好崩溃在 ack 处理中)同一条会重投。bot 侧业务应按
event_id幂等。 - session_lock / processed 去重在网关侧,client 不碰锁、不做去重。
- 回执路由:relay 据回执
meta.platform/channel_id/user_id_external路由回 platform,不按source_event_id反查。extension 从 inboundevent.meta原样回传这些字段。
- 多 bot:在 relay 侧 awada-server 配置多个 bot,每个 bot 绑定一个 lane(1:1)。客户端用不同
awadaKey/lane订阅(lane可省略,server 默认User)。 - 多 openclaw 实例:不同实例订阅不同 lane。
- 客户端无需感知 Redis db 隔离(relay 内部处理)。