初步完成channel->queueu->[tool]->[queue]->[assistant]->channel的流程

【待处理】上下文管理和错误处理。
This commit is contained in:
2026-06-29 09:15:30 +08:00
parent 79ec21bfd4
commit 46544e9c42
46 changed files with 1215 additions and 755 deletions
+61 -39
View File
@@ -1,62 +1,84 @@
use crate::{
AppState,
core::context::{add_assistant_message, add_tool_message, add_user_message, snapshot_context},
use crate::core::context::{
add_assistant_message, add_tool_message, add_user_message, snapshot_context,
};
use ai::core::send_message;
use axum::Json;
use axum::extract::State;
use common::queue::{ChannelMessage, QueueMessage};
use common::queue::QueueMessage;
use serde_json::error;
use std::sync::Arc;
use tokio::sync::{mpsc, mpsc::Sender};
use tokio::sync::{mpsc::Receiver, mpsc::Sender};
use wechat::manager::WeChatMultiAccountManager;
pub async fn create_queue() -> Result<Sender<QueueMessage>, error::Error> {
let (sender, mut receiver) = mpsc::channel::<QueueMessage>(100);
let result_sender = sender.clone();
pub async fn create_queue(
sender: Sender<QueueMessage>,
mut receiver: Receiver<QueueMessage>,
manager: WeChatMultiAccountManager,
) -> Result<(), error::Error> {
tokio::spawn(async move {
while let Some(msg) = receiver.recv().await {
let queue_sender = sender.clone();
match msg {
QueueMessage::Aissitant(reasoning, content) => {
QueueMessage::Aissitant(channel, assistant) => {
let content = assistant.content.clone();
let reasoning = assistant.reasoning.clone().unwrap_or_default();
println!("\n\n收到llm回复:\n{}\n-------\n{}", reasoning, content);
add_assistant_message(content).await;
if !content.trim().is_empty() || !reasoning.trim().is_empty() {
let text = if !content.trim().is_empty() {
content.trim()
} else {
reasoning.trim()
};
manager
.send_text(
&channel.account_id,
&channel.from_user_id,
&text,
channel.context.as_deref(),
)
.await
.unwrap();
}
add_assistant_message(assistant.content, assistant.tool_calls).await;
}
QueueMessage::Channel(name, text) => {
println!("\n\n收到来自{}消息:\n{}", name, text);
add_user_message(text).await;
send_message(queue_sender, snapshot_context().await)
QueueMessage::Channel(bundle) => {
println!(
"\n\n收到来自{}消息:\n{}",
bundle.from_user_id.clone(),
bundle.content.clone()
);
// todo 目前按单用户处理
add_user_message(bundle.content.clone()).await;
send_message(queue_sender, snapshot_context().await, bundle)
.await
.unwrap();
}
QueueMessage::Tool(tool_call_id, name, result) => {
QueueMessage::Tool(channel, tool_call_id, name, result) => {
println!("\n\n调用{}工具的结果:\n{}", name, result);
add_tool_message(tool_call_id, result).await;
send_message(queue_sender, snapshot_context().await)
send_message(queue_sender, snapshot_context().await, channel)
.await
.unwrap();
}
}
}
});
Ok(result_sender)
Ok(())
}
pub async fn send_to_queue(
State(state): State<Arc<AppState>>,
Json(body): Json<ChannelMessage>,
) -> Json<serde_json::Value> {
match state
.sender
.send(QueueMessage::Channel(body.channel, body.content))
.await
{
Ok(_) => Json(serde_json::json!({
"success":true,
"message":"queued"
})),
Err(_) => Json(serde_json::json!({
"success":true,
"message":"queue closed"
})),
}
}
// pub async fn send_to_queue(
// State(state): State<Arc<AppState>>,
// Json(body): Json<ChannelMessageBundle>,
// ) -> Json<serde_json::Value> {
// match state
// .sender
// .send(QueueMessage::Channel(body.channel, body.content))
// .await
// {
// Ok(_) => Json(serde_json::json!({
// "success":true,
// "message":"queued"
// })),
// Err(_) => Json(serde_json::json!({
// "success":true,
// "message":"queue closed"
// })),
// }
// }