增量提交

This commit is contained in:
zqm
2026-04-21 13:46:20 +08:00
parent f64209cb04
commit 09eb6fb1bd
44 changed files with 4411 additions and 931 deletions

View File

@@ -0,0 +1,2 @@
set RUSTFLAGS=-C target-feature=+crt-static
cargo build --release

View File

@@ -18,9 +18,7 @@ fn get_current_time() -> String {
/// 带时间前缀的打印宏
macro_rules! log {
($($arg:tt)*) => {
println!("[{}] {}", get_current_time(), format!($($arg)*));
};
($($arg:tt)*) => { println!("[{}] {}", get_current_time(), format!($($arg)*)) }
}
/// WebSocket 客户端连接管理器
@@ -302,14 +300,52 @@ impl WebSocketClient {
}
}
}
Some("wechat_message") => {
// 处理企业微信消息
Some("miniprogram_message") => {
if debug {
log!("📱 收到企业微信消息");
log!("收到小程序消息: {:?}", message);
}
let from_user_name = message.get("data").and_then(|d| d.get("from_user_name").and_then(|v| v.as_str())).unwrap_or("miniprogram_user");
let content = message.get("data").and_then(|d| d.get("content").and_then(|v| v.as_str())).unwrap_or("");
let conn_id = message.get("data").and_then(|d| d.get("conn_id").and_then(|v| v.as_str())).unwrap_or("");
if !content.is_empty() {
if debug { log!("处理小程序消息: {}", content); }
let ai_response = match self.call_lmstudio(content).await {
Ok(r) => r,
Err(e) => {
if debug { log!("LMStudio error: {}", e); }
format!("处理消息时出错: {}", e)
}
};
if debug { log!("AI回复: {}", ai_response); }
let reply_message = serde_json::json!({
"type": "miniprogram_message_response",
"data": {
"conn_id": conn_id,
"from_user_name": from_user_name,
"content": ai_response,
"msg_type": "text",
"timestamp": chrono::Utc::now().timestamp()
}
});
if let Some(sender) = &*self.sender.lock().await {
if let Err(e) = sender.send(reply_message.to_string()).await {
if debug { log!("发送回复失败: {}", e); }
} else {
if debug { log!("AI回复已发送"); }
}
}
}
}
Some("wechat_message") => {
if debug {
log!("收到企业微信消息");
log!(" 消息内容: {:?}", message);
}
// 提取消息数据
let from_user_name = message.get("data").and_then(|d| d.get("from_user_name").and_then(|v| v.as_str())).unwrap_or("");
let content = message.get("data").and_then(|d| d.get("content").and_then(|v| v.as_str())).unwrap_or("");
@@ -384,6 +420,25 @@ impl WebSocketClient {
log!("✅ 收到确认消息");
}
}
Some("wechat_app_sse_request") => {
if debug {
log!("📡 收到 WechatApp SSE 请求");
}
let request_id = message.get("request_id").and_then(|v| v.as_str()).unwrap_or("");
let data = message.get("data");
if !request_id.is_empty() && data.is_some() {
if debug {
log!("📡 处理 SSE 请求request_id: {}", request_id);
}
let client_clone = self.clone();
let request_id_clone = request_id.to_string();
let data_clone = data.cloned();
tokio::spawn(async move {
client_clone.handle_sse_request(request_id_clone, data_clone).await;
});
}
}
Some(msg_type) => {
if debug {
log!("❓ 收到未知消息类型: {}", msg_type);
@@ -524,7 +579,7 @@ impl WebSocketClient {
// 构建LMStudio API请求
let payload = json!({
"model": "qwen-3-panda-agi-v2", // 使用当前可用模型
"model": "qwen2.5-vl-7b-instruct", // 使用当前可用模型,qwen-3-panda-agi-v2
"input": message,
"system_prompt": system_prompt,
"temperature": 0.7,
@@ -595,6 +650,105 @@ impl WebSocketClient {
Ok(ai_response)
}
/// 处理 WechatApp SSE 请求
async fn handle_sse_request(&self, request_id: String, data: Option<serde_json::Value>) {
if !self.lmstudio_enabled {
let error_msg = serde_json::json!({
"type": "sse_error",
"request_id": request_id,
"error": "LMStudio is not enabled"
});
self.send_message(error_msg.to_string()).await.ok();
return;
}
if self.debug {
log!("📡 开始处理 SSE 请求: {}", request_id);
}
// 解析请求数据
let chat_request = match data {
Some(d) => d,
None => {
let error_msg = serde_json::json!({
"type": "sse_error",
"request_id": request_id,
"error": "Invalid request data"
});
self.send_message(error_msg.to_string()).await.ok();
return;
}
};
// 发送请求到 LMStudio SSE 端点
let client = reqwest::Client::new();
let lmstudio_url = format!("{}/v1/chat/completions", self.lmstudio_url);
if self.debug {
log!("🌐 发送 SSE 请求到 LMStudio: {}", lmstudio_url);
log!("📝 请求数据: {}", chat_request);
}
let response = match client.post(&lmstudio_url)
.header("Content-Type", "application/json")
.json(&chat_request)
.send()
.await {
Ok(resp) => resp,
Err(e) => {
if self.debug {
log!("❌ LMStudio SSE 请求失败: {}", e);
}
let error_msg = serde_json::json!({
"type": "sse_error",
"request_id": request_id,
"error": format!("LMStudio request failed: {}", e)
});
self.send_message(error_msg.to_string()).await.ok();
return;
}
};
// 处理 SSE 流
let body = response.bytes().await;
match body {
Ok(bytes) => {
// 将 SSE 片段发送回网关
let sse_chunk = serde_json::json!({
"type": "sse_chunk",
"request_id": request_id,
"chunk": String::from_utf8_lossy(&bytes)
});
if self.debug {
log!("📡 发送 SSE 片段: {}", sse_chunk);
}
self.send_message(sse_chunk.to_string()).await.ok();
}
Err(e) => {
if self.debug {
log!("❌ 读取 SSE 流失败: {}", e);
}
let error_msg = serde_json::json!({
"type": "sse_error",
"request_id": request_id,
"error": format!("Failed to read SSE stream: {}", e)
});
self.send_message(error_msg.to_string()).await.ok();
return;
}
}
// 发送 SSE 完成消息
let done_msg = serde_json::json!({
"type": "sse_done",
"request_id": request_id
});
if self.debug {
log!("📡 发送 SSE 完成消息: {}", done_msg);
}
self.send_message(done_msg.to_string()).await.ok();
}
}
/// WebSocket 客户端管理器