Files
JoyD/Claw/.trae/documents/gateway_forward_to_smartclaw.md

375 lines
8.9 KiB
Markdown
Raw Normal View History

# 网关转发企业微信消息到 SmartClaw 处理计划
## 目标
将网关收到的企业微信和微信小程序消息通过 WebSocket 转发给 SmartClaw 进行处理,采用异步回复模式,支持混合消息类型,并确保多端同步和不串线。
## 核心架构:异步回复模式
```
用户发消息
→ 企业微信/微信小程序
→ 网关5秒内立即回复"思考中..."
→ 网关通过 WebSocket 发给 SmartClaw
→ SmartClaw 调用 LMStudio耗时5~15秒都没关系
→ 完成后 → SmartClaw 把结果发给网关
→ 网关根据平台类型分发:
- 微信小程序:通过 WebSocket 流式推送
- 企业微信:通过 HTTP 轮询一次性返回
→ 用户收到回复
```
## 统一数据协议
### 1. 消息请求格式
```json
{
"type": "wechat_message",
"uid": "用户ID",
"session_id": "会话ID",
"request_id": "消息唯一ID",
"platform": "wecom|wechat",
"content": "消息内容",
"msg_type": "text|image|voice|svg",
"segments": [
{
"type": "text",
"content": "文本内容"
},
{
"type": "image",
"url": "图片URL",
"width": 100,
"height": 100
},
{
"type": "svg",
"content": "SVG内容"
},
{
"type": "voice",
"url": "语音URL",
"duration": 10
}
],
"timestamp": 1234567890
}
```
### 2. 消息响应格式
```json
{
"type": "wechat_response",
"uid": "用户ID",
"session_id": "会话ID",
"request_id": "消息唯一ID",
"platform": "wecom|wechat",
"success": true,
"content": "纯文本内容(企业微信使用)",
"segments": [
{
"type": "text",
"content": "文本内容"
},
{
"type": "image",
"url": "图片URL",
"width": 100,
"height": 100
},
{
"type": "svg",
"content": "SVG内容"
},
{
"type": "voice",
"url": "语音URL",
"duration": 10
}
],
"timestamp": 1234567890,
"streaming": true, // 是否流式输出
"finished": false // 是否输出完成
}
```
## 实现步骤
### 1. 修改网关 (gateway) - 实现异步处理
#### 1.1 立即回复企业微信
-`handle_wechat_callback` 中,收到消息后立即返回 200 OK + "思考中..." 消息
- 不等待 SmartClaw 处理结果
- 企业微信要求在5秒内回复否则会重试发送消息
#### 1.2 统一消息处理
- 新增 `unified_message_handler` 函数,处理来自不同平台的消息
- 生成三级IDuid + session_id + request_id
- 根据平台类型选择不同的处理方式
#### 1.3 添加 WebSocket 消息发送
- 在 TaskService 中添加 `forward_to_smartclaw()` 方法
- 异步通过 WebSocket 连接池发送消息到 SmartClaw
- 消息格式使用统一数据协议
#### 1.4 处理 SmartClaw 回调
- 在 WebSocket 处理器中添加处理 SmartClaw 回复的逻辑
- 根据平台类型分发消息:
- 微信小程序:通过 WebSocket 流式推送
- 企业微信:通过 HTTP 轮询一次性返回
- 实现会话管理和消息路由,确保不串线
### 2. 修改 SmartClaw - 添加消息处理功能
#### 2.1 接收并处理消息
-`handle_incoming_message` 中添加处理 "wechat_message" 类型消息的逻辑
- 解析消息内容,调用现有的任务处理逻辑
- 支持混合消息类型的处理
#### 2.2 消息处理流程
- 文本消息 → 调用 AI 处理
- 图片消息 → 调用图像处理
- 语音消息 → 调用语音识别
- SVG消息 → 保持原样
- 处理完成后返回统一格式的回复
#### 2.3 流式输出支持
- 实现流式输出逻辑,支持小程序的打字机效果
- 分段处理消息,实时返回处理结果
## 后端架构
### 1. 会话管理
- 使用 Redis 存储会话信息
- 会话结构:
```
session:{session_id} = {
"uid": "用户ID",
"platforms": ["wecom", "wechat"],
"last_active": 1234567890,
"connections": {
"wecom": "connection_id",
"wechat": "connection_id"
}
}
```
### 2. 消息路由
- 使用 Redis 发布订阅机制
- 消息分发:
```
PUBLISH session:{session_id} {message}
```
- 连接管理:
```
SET connection:{connection_id} {session_id}
```
### 3. 高并发不串线机制
- 使用三级ID确保消息唯一性
- 消息队列保证顺序
- 连接池管理确保消息正确路由
- 超时机制避免消息阻塞
## 服务器实现逻辑
### 1. 服务器A网关
- 监听企业微信回调:`/wecom`
- 监听微信小程序连接:`/api/v1/ws/wechat`
- 管理 WebSocket 连接池
- 处理 SmartClaw 回调
- 根据平台类型分发消息
### 2. 服务器BSmartClaw
- 主动连接服务器A的 WebSocket
- 处理来自网关的消息
- 调用 LMStudio 进行 AI 处理
- 支持流式输出
- 返回统一格式的处理结果
## 前端实现
### 1. 微信小程序wechat_app目录
```javascript
// WebSocket 连接
const socket = wx.connectSocket({
url: 'wss://pactgo.cn/api/v1/ws/wechat',
header: {
'content-type': 'application/json'
}
});
// 发送消息
socket.send({
data: JSON.stringify({
type: 'wechat_message',
uid: 'user123',
session_id: 'session456',
request_id: 'req789',
platform: 'wechat',
content: '你好',
msg_type: 'text',
segments: [{
type: 'text',
content: '你好'
}],
timestamp: Date.now()
})
});
// 接收消息
socket.onMessage((res) => {
const data = JSON.parse(res.data);
if (data.streaming) {
// 流式渲染,打字机效果
renderStreamingMessage(data);
} else if (data.finished) {
// 渲染完整消息
renderCompleteMessage(data);
}
});
// 渲染消息
function renderMessage(message) {
message.segments.forEach(segment => {
switch (segment.type) {
case 'text':
renderText(segment.content);
break;
case 'image':
renderImage(segment.url);
break;
case 'svg':
renderSVG(segment.content);
break;
case 'voice':
renderVoice(segment.url);
break;
}
});
}
```
### 2. 企业微信
```javascript
// 轮询获取消息
function pollMessages() {
wx.request({
url: 'https://pactgo.cn/api/v1/wecom/messages',
method: 'GET',
data: {
session_id: 'session456',
last_timestamp: lastTimestamp
},
success: (res) => {
if (res.data.messages) {
res.data.messages.forEach(message => {
// 只渲染文本内容
renderText(message.content);
});
lastTimestamp = res.data.last_timestamp;
}
setTimeout(pollMessages, 3000);
}
});
}
// 发送消息
function sendMessage(content) {
wx.request({
url: 'https://pactgo.cn/wecom',
method: 'POST',
data: {
content: content
},
success: (res) => {
console.log('消息发送成功');
}
});
}
// 渲染文本
function renderText(content) {
// 只渲染纯文本
const messageElement = document.createElement('div');
messageElement.textContent = content;
document.getElementById('messageList').appendChild(messageElement);
}
```
## 前后端交互流程
1. **用户发送消息**
- 微信小程序:通过 WebSocket 发送消息
- 企业微信:通过 HTTP POST 发送消息
2. **网关处理**
- 立即回复 "思考中..."
- 生成三级ID
- 通过 WebSocket 转发给 SmartClaw
3. **SmartClaw 处理**
- 调用 LMStudio 处理消息
- 支持流式输出
- 返回统一格式的结果
4. **网关分发**
- 微信小程序:通过 WebSocket 流式推送
- 企业微信:存储消息等待轮询
5. **前端渲染**
- 微信小程序:流式渲染、富媒体完整显示
- 企业微信:只渲染文本内容
## 实现顺序
1. **修改 SmartClaw**
- 添加接收和处理企业微信消息的功能
- 实现混合消息处理
- 支持流式输出
2. **修改网关**
- 实现统一消息处理
- 添加会话管理和消息路由
- 实现平台区分和分发
3. **前端实现**
- 微信小程序:流式渲染、富媒体支持
- 企业微信:纯文本渲染
4. **测试完整流程**
- 多设备并发测试
- 消息不串线测试
- 混合消息类型测试
- 流式输出测试
## 注意事项
1. **企业微信限制**
- 不支持流式输出
- 不支持富媒体
- 不支持 SVG
- 只显示纯文本
2. **微信小程序特性**
- 支持流式输出
- 支持富媒体
- 支持 SVG使用 rich-text 渲染)
- 支持打字机效果
3. **后端处理**
- 统一数据协议
- 自动区分平台
- 确保消息不串线
- 支持高并发
4. **性能优化**
- 使用 WebSocket 连接池
- 实现消息队列
- 优化流式输出
- 合理使用缓存
## 总结
本方案通过统一数据协议和平台区分实现了企业微信和微信小程序的消息处理支持混合消息类型并确保多端同步和不串线。采用异步回复模式满足企业微信的5秒内回复要求同时通过流式输出提升用户体验。