use crate::session::chat::session::ChatSession;
use crate::session::ProviderExchange;
use anyhow::Result;
pub struct MessageHandler;
impl MessageHandler {
pub fn extract_original_tool_calls(exchange: &ProviderExchange) -> Option<serde_json::Value> {
if let Some(tool_calls) = exchange.response.get("tool_calls") {
return Some(tool_calls.clone());
}
match octolib::ProviderToolCalls::extract_from_exchange(exchange) {
Ok(Some(provider_calls)) => {
let generic_calls = provider_calls.to_generic_tool_calls();
Some(serde_json::to_value(&generic_calls).unwrap_or_default())
}
Ok(None) => None,
Err(_) => None, }
}
pub fn add_assistant_message_with_tool_calls(
chat_session: &mut ChatSession,
content: &str,
exchange: &ProviderExchange,
) -> Result<()> {
let original_tool_calls = Self::extract_original_tool_calls(exchange);
let assistant_message = crate::session::Message {
role: "assistant".to_string(),
content: content.to_string(),
timestamp: std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap_or_default()
.as_secs(),
cached: false,
tool_calls: original_tool_calls, ..Default::default()
};
chat_session.session.messages.push(assistant_message);
chat_session.last_response = content.to_string();
Ok(())
}
pub fn log_response_data(
session_name: &str,
content: &str,
exchange: &ProviderExchange,
) -> Result<()> {
let _ = crate::session::logger::log_assistant_response(session_name, content);
let _ = crate::session::logger::log_raw_exchange(exchange);
Ok(())
}
}