如何让两个不同操作系统不同大模型的OpenClaw 相互通讯和协作
如何让两个不同操作系统不同大模型的
OpenClaw 相互通讯和协作
文档版本:v1.0 | 创建日期:2026-04-10 | 作者:David, Walt, Leo
摘要
本文档详细描述了如何在两个运行于不同操作系统(Linux和Windows)、使用不同大模型的OpenClaw实例之间建立可靠的Socket通讯机制,实现跨平台任务协作。整个系统以Leo为核心协调者,通过消息队列和状态机管理实现了三个智能体之间的高效协作。
关键词:OpenClaw、Socket通讯、跨平台协作、消息队列、状态机
1. 引言
1.1 背景
OpenClaw是一个多智能体协作框架,支持在不同操作系统和不同大模型上运行。在实际应用场景中,经常需要让多个OpenClaw实例协同工作。
1.2 本文目标
本文档旨在提供一套完整的解决方案,实现以下目标:
-
跨平台通讯:Linux和Windows之间的可靠数据交换
-
大模型无关:方案适用于不同的大模型后端
-
确认机制:引入人工确认节点,确保关键操作安全可控
-
状态管理:建立完善的消息状态跟踪机制
-
错误恢复:实现自动错误检测和恢复能力
2. 系统架构
2.1 节点定义
|
节点名称 |
操作系统 |
大模型 |
IP地址 |
主要职责 |
|
Node-A |
Linux |
Kimi |
192.168.4.251 |
接收请求、执行任务、结果反馈 |
|
Node-B |
Windows |
MiniMax |
192.168.4.89 |
主动发起请求、接收确认通知 |
|
Node-C (Leo) |
- |
- |
- |
决策者、确认者、协调者 |
2.2 网络拓扑
┌─────────────────────────────────────────────────────────────┐
│ Node-A (Linux) │
│ OpenClaw + Kimi │
│ Socket Server :5555 │
└─────────────────────────────────────────────────────────────┘
│
Socket (TCP 5555)
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Node-B (Windows) │
│ OpenClaw + MiniMax │
│ Socket Client │
└─────────────────────────────────────────────────────────────┘
│
Feishu API
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Node-C (Leo) │
│ 决策者/确认者 │
│ 微信/飞书 │
└─────────────────────────────────────────────────────────────┘
2.3 通讯协议设计原则
-
简单性:协议设计尽量简单,降低实现复杂度
-
可靠性:通过确认机制确保消息可靠送达
-
可扩展性:支持未来增加新的节点类型
-
编码统一:统一使用UTF-8编码,避免中文乱码
3. 通讯协议设计
3.1 消息格式
采用JSON作为消息格式,具有良好的可读性和跨语言支持。
请求消息格式(发起方 → 接收方):
{
"from": "Node-A",
"to": "Node-B",
"sequence": "mesg001",
"message": "查询深圳明天天气",
"timestamp": "2026-04-10 22:00:00"
}
响应消息格式(接收方 → 发起方):
{
"from": "Node-B",
"to": "Node-A",
"sequence": "mesg001",
"status": "completed",
"result": "深圳明天多云,25-28°C",
"timestamp": "2026-04-10 22:05:00"
}
3.2 字段说明
|
字段名 |
类型 |
必填 |
说明 |
|
from |
string |
是 |
发送方节点名称 |
|
to |
string |
是 |
接收方节点名称 |
|
sequence |
string |
是 |
消息序号,格式为"mesgXXX" |
|
message |
string |
是 |
消息内容 |
|
status |
string |
否 |
响应状态:completed/pending/failed |
|
result |
string |
否 |
执行结果或错误信息 |
|
timestamp |
string |
否 |
消息时间戳 |
3.3 消息状态机
|
状态 |
定义 |
触发条件 |
|
unread_unprocessed |
未读未处理 |
Socket接收到新消息 |
|
read_unprocessed |
已读未处理 |
消息已被读取,待通知协调者 |
|
pending |
等待确认 |
已通知协调者,等待回复 |
|
executing |
执行中 |
协调者已确认,正在执行任务 |
|
done |
已完成 |
任务执行完成或协调者拒绝执行 |
4. 跨平台实现方案
4.1 Socket服务器实现(Node-A / Linux)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
跨平台Socket服务器
监听5555端口,接收来自其他OpenClaw的消息
"""
import socket
import threading
import json
from datetime import datetime
HOST = '0.0.0.0'
PORT = 5555
def get_timestamp():
return datetime.now().strftime('%Y-%m-%d %H:%M:%S')
def handle_client(conn, addr):
print(f"[{get_timestamp()}] 连接来自: {addr}")
try:
data = b''
while True:
chunk = conn.recv(4096)
if not chunk:
break
data += chunk
if len(chunk) < 4096:
break
message = data.decode('utf-8', errors='ignore')
print(f"[{get_timestamp()}] 收到消息: {message[:100]}...")
response = process_and_generate_response(message)
conn.sendall(response.encode('utf-8'))
except Exception as e:
print(f"[{get_timestamp()}] 处理错误: {e}")
finally:
conn.close()
print(f"[{get_timestamp()}] 连接关闭: {addr}")
def process_and_generate_response(message):
response = {
"from": "Node-A",
"to": "Node-B",
"sequence": "ACK",
"status": "received",
"result": "Message received",
"timestamp": get_timestamp()
}
return json.dumps(response, ensure_ascii=False)
def start_server():
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind((HOST, PORT))
server.listen(5)
print(f"[{get_timestamp()}] Socket服务器启动,监听 {HOST}:{PORT}")
while True:
conn, addr = server.accept()
thread = threading.Thread(target=handle_client, args=(conn, addr))
thread.daemon = True
thread.start()
if __name__ == '__main__':
start_server()
4.2 Socket客户端实现(Node-B / Windows)
import socket
import json
from datetime import datetime
def send_message(host, port, message, sequence):
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((host, port))
data = {
"from": "Node-B",
"to": "Node-A",
"sequence": sequence,
"message": message,
"timestamp": datetime.now().strftime('%Y-%m-%d %H:%M:%S')
}
json_str = json.dumps(data, ensure_ascii=False)
client.sendall(json_str.encode('utf-8'))
response = client.recv(4096)
response_data = json.loads(response.decode('utf-8'))
client.close()
return response_data
result = send_message("192.168.4.251", 5555, "查询天气", "mesg001")
4.3 关键实现细节
4.3.1 编码处理
# 发送时确保UTF-8编码
json_str = json.dumps(data, ensure_ascii=False)
client.sendall(json_str.encode('utf-8'))
# 接收时处理编码问题
data = conn.recv(4096)
text = data.decode('utf-8', errors='ignore')
4.3.2 并发处理
# 每个连接一个线程,避免阻塞
def handle_client(conn, addr):
thread = threading.Thread(target=handle_client, args=(conn, addr))
thread.daemon = True
thread.start()
4.3.3 心跳机制
import subprocess
def trigger_heartbeat(notification_text):
openclaw_cmd = r'C:\Users\DFET\AppData\Roaming\npm\openclaw.cmd'
subprocess.Popen(
['cmd', '/c', openclaw_cmd, 'system', 'event', '--text', notification_text],
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL
)
5. 协作流程设计
5.1 标准协作流程(14步)
阶段一:消息接收与确认(Node-A视角)
|
步骤 |
执行者 |
动作 |
说明 |
|
1 |
Socket |
接收JSON消息 |
解析from、to、sequence、message |
|
2 |
Socket |
保存消息文件 |
覆盖式写入message_from_xxx.txt |
|
3 |
Socket |
清空触发标记 |
写入notification_queue.txt |
|
4 |
Socket |
记录处理日志 |
追加到temp_processing_log.txt |
|
5 |
Socket |
触发heartbeat |
唤醒OpenClaw主session |
|
6 |
Socket |
回复发送方 |
"Message received. Notified..." |
阶段二:任务执行与反馈(Node-B视角)
|
步骤 |
执行者 |
动作 |
说明 |
|
7 |
OpenClaw |
读取处理日志 |
按序号降序处理(LIFO) |
|
8 |
OpenClaw |
更新消息状态 |
unread → read_unprocessed |
|
9 |
OpenClaw |
通知协调者 |
飞书/微信发送确认请求 |
|
10 |
OpenClaw |
等待确认 |
暂停处理,直到收到回复 |
|
11 |
OpenClaw |
执行任务 |
调用相应skill |
|
12 |
OpenClaw |
回复发送方 |
通过Socket发送结果 |
|
13 |
OpenClaw |
告知协调者 |
执行结果反馈 |
|
14 |
OpenClaw |
更新日志状态 |
read → done |
6. 状态管理机制
6.1 重复消息处理
判断标准:3秒内消息内容一致(忽略sequence号)
判断逻辑:
IF 存在相同内容 AND 时间差 < 3秒 AND 状态为done
THEN 判定为重复消息,跳过处理
ELSE 按正常流程处理
7. 错误处理机制
7.1 错误类型与处理策略
|
错误类型 |
发生阶段 |
处理策略 |
|
文件读取失败 |
任一阶段 |
记录到debug_log.txt,跳过该消息 |
|
Socket发送失败 |
任意 |
重试3次,标记error,通知协调者 |
|
协调者超时未回复 |
等待确认 |
10分钟后重新通知 |
|
任务执行失败 |
执行阶段 |
返回failed状态及错误信息 |
|
连接异常断开 |
任意 |
关闭连接,记录日志 |
8. 安全考虑
8.1 网络安全
-
防火墙隔离:只开放必要的5555端口
-
IP白名单:只允许已知IP连接
-
内网通信:所有节点在同一局域网内
8.2 操作安全
-
人工确认:所有操作需协调者确认
-
操作日志:所有操作记录可追溯
-
状态验证:执行前验证状态正确性
9. 实际应用案例
9.1 天气查询
场景:Node-B需要查询深圳明天天气
Node-B → Node-A: "查询深圳明天天气"
Node-A → Leo: "Node-B请求查询天气,确认执行?"
Leo → Node-A: "确认执行"
Node-A → Node-B: "深圳明天多云,25-28°C"
10. 总结与展望
10.1 方案优势
-
跨平台:支持Linux、Windows等多种操作系统
-
跨模型:不依赖特定大模型,可灵活替换
-
高可靠:完善的确认机制和错误处理
-
易扩展:新增节点只需适配Socket接口
-
可追溯:完整的日志记录和状态管理
10.2 局限性
-
实时性:依赖协调者确认,不适合超低延迟场景
-
复杂性:14步流程较复杂,可适当简化
-
单点故障:协调者宕机会导致流程中断
10.3 未来改进方向
-
并行确认:支持多个协调者同时确认
-
自动决策:对于简单任务,可配置自动执行
-
监控告警:增加更完善的状态监控和告警机制
-
Web界面:提供可视化的消息监控和管理界面
修订历史
|
版本 |
日期 |
作者 |
说明 |
|
v1.0 |
2026-04-10 |
David, Walt, Leo |
初始版本,经过三方审核确认 |
本文档由David、Walt和Leo共同审核通过
更多推荐


所有评论(0)