use crate::agent::Agent;
use crate::provider::{ContentPart, Message};
use crate::session::Session;
pub(super) type PendingToolCall = (String, String, String);
impl Agent {
pub(super) fn build_messages(&self, session: &Session) -> Vec<Message> {
let mut messages = vec![Message {
role: crate::provider::Role::System,
content: vec![ContentPart::Text {
text: self.system_prompt.clone(),
}],
}];
messages.extend(session.messages.clone());
messages
}
}
pub(super) fn collect_tool_calls(message: &Message) -> Vec<PendingToolCall> {
message
.content
.iter()
.filter_map(extract_tool_call)
.collect()
}
pub(super) fn response_text(message: &Message) -> String {
message
.content
.iter()
.filter_map(extract_text)
.collect::<Vec<_>>()
.join("\n")
}
fn extract_tool_call(part: &ContentPart) -> Option<PendingToolCall> {
match part {
ContentPart::ToolCall {
id,
name,
arguments,
..
} => Some((id.clone(), name.clone(), arguments.clone())),
_ => None,
}
}
fn extract_text(part: &ContentPart) -> Option<String> {
match part {
ContentPart::Text { text } => Some(text.clone()),
_ => None,
}
}