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,
response_id: Option<String>,
) -> 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,
cache_ttl: None,
tool_call_id: None,
name: None,
tool_calls: original_tool_calls,
images: None,
videos: None,
thinking: None,
id: response_id,
};
chat_session.session.messages.push(assistant_message);
chat_session.last_response = content.to_string();
if let Some(usage) = &exchange.usage {
if let Some(api_time_ms) = usage.request_time_ms {
chat_session.session.info.total_api_time_ms += api_time_ms;
}
chat_session.session.info.total_api_calls += 1;
let cache_manager = crate::session::cache::CacheManager::new();
cache_manager.update_token_tracking(
&mut chat_session.session,
usage.input_tokens, usage.output_tokens,
usage.cache_read_tokens,
usage.cache_write_tokens,
usage.reasoning_tokens,
);
if let Some(cost) = usage.cost {
chat_session.session.info.total_cost += cost;
}
}
if let Some(session_file) = &chat_session.session.session_file {
let message_json =
serde_json::to_string(&chat_session.session.messages.last().unwrap())?;
crate::session::append_to_session_file(session_file, &message_json)?;
}
Ok(())
}
}