use super::{
ApiClient, BareLoop, Message, MessagePart, Role, ToolCall, ToolContext, ToolDispatchResult,
ToolSchema,
};
impl<C: ApiClient> BareLoop<C> {
pub(super) fn extract_text(msg: &Message) -> String {
msg.parts
.iter()
.filter_map(|b| b.as_text())
.collect::<Vec<_>>()
.join("")
}
pub(super) fn extract_tool_calls(msg: &Message) -> Vec<ToolCall> {
msg.parts
.iter()
.filter_map(|part| match part {
MessagePart::ToolCall { id, name, input } => Some(ToolCall {
id: id.clone(),
tool: name.clone(),
input: input.clone(),
}),
_ => None,
})
.collect()
}
pub(super) fn build_tool_result_message(results: Vec<ToolDispatchResult>) -> Message {
let parts: Vec<MessagePart> = results
.into_iter()
.map(|r| MessagePart::tool_result(r.tool_call_id, r.output, r.is_error))
.collect();
Message::new(Role::User, parts)
}
pub(super) fn build_tool_schemas(&self) -> Option<Vec<ToolSchema>> {
let schemas = self.tools.all_schemas();
if schemas.is_empty() {
None
} else {
Some(schemas)
}
}
pub(super) fn build_tool_context(&self) -> ToolContext {
ToolContext {
session_id: self.config.session_id,
..ToolContext::default()
}
}
}