增量提交
This commit is contained in:
2
Claw/Server/SmartClaw/build.bat
Normal file
2
Claw/Server/SmartClaw/build.bat
Normal file
@@ -0,0 +1,2 @@
|
||||
set RUSTFLAGS=-C target-feature=+crt-static
|
||||
cargo build --release
|
||||
@@ -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 客户端管理器
|
||||
|
||||
Reference in New Issue
Block a user