初步完成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
+19 -15
View File
@@ -3,13 +3,12 @@ use common::ai::{
ChatCompletionRequestBody, ChatCompletionRequestExtra, ChatCompletionRequestMessage,
ChatCompletionRequestThinking, ChatCompletionResponseBody,
};
use common::queue::QueueMessage;
use common::queue::{AssistantMessage, ChannelMessage, QueueMessage};
pub async fn send_message(
sender: tokio::sync::mpsc::Sender<QueueMessage>,
messages: Vec<ChatCompletionRequestMessage>,
channel: ChannelMessage,
) -> Result<(), reqwest::Error> {
let result = request_llm(messages).await;
match result {
@@ -18,25 +17,30 @@ pub async fn send_message(
for choice in result.unwrap().choices {
let messsage_content = choice.message.content;
let messsage_reasoning = choice.message.reasoning_content.unwrap_or_default();
if !messsage_content.trim().is_empty() || !messsage_content.trim().is_empty() {
sender
.send(QueueMessage::Aissitant(
messsage_reasoning,
messsage_content,
))
.await
.unwrap();
}
let tool_calls = choice.message.tool_calls.clone();
sender
.send(QueueMessage::Aissitant(
channel.clone(),
AssistantMessage {
reasoning: Some(messsage_reasoning),
content: messsage_content,
tool_calls,
},
))
.await
.unwrap();
match choice.message.tool_calls {
Some(tool_calls) => {
// eprintln!("调用了{}个工具", tool_calls.len());
let queue_message = call_tools(tool_calls).await.unwrap();
println!("调用了{}个工具", tool_calls.len());
let queue_message = call_tools(channel.clone(), tool_calls).await.unwrap();
if let Some(queue_message) = queue_message {
sender.send(queue_message).await.unwrap();
}
}
None => {
// eprintln!("没有调用工具");
eprintln!("没有调用工具");
}
}
}
+8 -3
View File
@@ -1,10 +1,14 @@
use chrono::Local;
use serde_json::error;
use common::{ai::ChatCompletionResponseToolCall, queue::QueueMessage};
use common::{
ai::ChatCompletionToolCall,
queue::{ChannelMessage, QueueMessage},
};
pub async fn call_tools(
tools: Vec<ChatCompletionResponseToolCall>,
channel: ChannelMessage,
tools: Vec<ChatCompletionToolCall>,
) -> Result<Option<QueueMessage>, error::Error> {
if let Some(tool) = tools.first() {
if let Some(funcation) = tool.function.as_ref() {
@@ -12,6 +16,7 @@ pub async fn call_tools(
let date_time = Local::now();
let formatted = date_time.format("%Y-%m-%d %H:%M:%S").to_string();
return Ok(Some(QueueMessage::Tool(
channel,
tool.id.clone(),
funcation.name.clone(),
format!("现在时间:{}", formatted),
@@ -59,4 +64,4 @@ pub fn get_tool() -> Vec<serde_json::Value> {
// }
// }),
];
}
}