fix(nginx): 调整企业微信回调代理路径 feat(gateway): 添加企业微信消息处理功能 docs: 更新项目规划文档和企业微信配置详情 refactor(XCamera): 重构LED检测和图像处理逻辑 test: 添加ONVIF抓图测试功能
8.9 KiB
8.9 KiB
网关转发企业微信消息到 SmartClaw 处理计划
目标
将网关收到的企业微信和微信小程序消息通过 WebSocket 转发给 SmartClaw 进行处理,采用异步回复模式,支持混合消息类型,并确保多端同步和不串线。
核心架构:异步回复模式
用户发消息
→ 企业微信/微信小程序
→ 网关(5秒内立即回复"思考中...")
→ 网关通过 WebSocket 发给 SmartClaw
→ SmartClaw 调用 LMStudio(耗时5~15秒都没关系)
→ 完成后 → SmartClaw 把结果发给网关
→ 网关根据平台类型分发:
- 微信小程序:通过 WebSocket 流式推送
- 企业微信:通过 HTTP 轮询一次性返回
→ 用户收到回复
统一数据协议
1. 消息请求格式
{
"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. 消息响应格式
{
"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函数,处理来自不同平台的消息 - 生成三级ID:uid + 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. 服务器B(SmartClaw)
- 主动连接服务器A的 WebSocket
- 处理来自网关的消息
- 调用 LMStudio 进行 AI 处理
- 支持流式输出
- 返回统一格式的处理结果
前端实现
1. 微信小程序(wechat_app目录)
// 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. 企业微信
// 轮询获取消息
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);
}
前后端交互流程
-
用户发送消息:
- 微信小程序:通过 WebSocket 发送消息
- 企业微信:通过 HTTP POST 发送消息
-
网关处理:
- 立即回复 "思考中..."
- 生成三级ID
- 通过 WebSocket 转发给 SmartClaw
-
SmartClaw 处理:
- 调用 LMStudio 处理消息
- 支持流式输出
- 返回统一格式的结果
-
网关分发:
- 微信小程序:通过 WebSocket 流式推送
- 企业微信:存储消息等待轮询
-
前端渲染:
- 微信小程序:流式渲染、富媒体完整显示
- 企业微信:只渲染文本内容
实现顺序
-
修改 SmartClaw:
- 添加接收和处理企业微信消息的功能
- 实现混合消息处理
- 支持流式输出
-
修改网关:
- 实现统一消息处理
- 添加会话管理和消息路由
- 实现平台区分和分发
-
前端实现:
- 微信小程序:流式渲染、富媒体支持
- 企业微信:纯文本渲染
-
测试完整流程:
- 多设备并发测试
- 消息不串线测试
- 混合消息类型测试
- 流式输出测试
注意事项
-
企业微信限制:
- 不支持流式输出
- 不支持富媒体
- 不支持 SVG
- 只显示纯文本
-
微信小程序特性:
- 支持流式输出
- 支持富媒体
- 支持 SVG(使用 rich-text 渲染)
- 支持打字机效果
-
后端处理:
- 统一数据协议
- 自动区分平台
- 确保消息不串线
- 支持高并发
-
性能优化:
- 使用 WebSocket 连接池
- 实现消息队列
- 优化流式输出
- 合理使用缓存
总结
本方案通过统一数据协议和平台区分,实现了企业微信和微信小程序的消息处理,支持混合消息类型,并确保多端同步和不串线。采用异步回复模式,满足企业微信的5秒内回复要求,同时通过流式输出提升用户体验。