use crate::api::{Message, MessageContentBlock, SystemPrompt};
use crate::repl::conversation::ConversationHistory;
impl ConversationHistory {
pub fn add_user_message(&mut self, content: String) {
self.messages.push(Message::user(content));
self.trim_if_needed();
}
pub fn add_user_with_blocks(&mut self, blocks: Vec<MessageContentBlock>) {
self.messages.push(Message::user_with_blocks(blocks));
self.trim_if_needed();
}
pub fn add_assistant_with_blocks(&mut self, blocks: Vec<MessageContentBlock>) {
self.messages.push(Message::assistant_with_blocks(blocks));
self.trim_if_needed();
}
pub fn add_tool_results(&mut self, results: Vec<MessageContentBlock>) {
self.messages.push(Message::user_with_tool_results(results));
self.trim_if_needed();
}
pub fn append_text_to_last_user_blocks(&mut self, text: String) -> bool {
let Some(last) = self.messages.last_mut() else {
return false;
};
if last.role != "user" {
return false;
}
match &mut last.content {
crate::api::MessageContent::Blocks { content } => {
content.push(MessageContentBlock::Text {
text,
cache_control: None,
});
true
}
crate::api::MessageContent::Text { content } => {
if !content.is_empty() {
content.push_str("\n\n");
}
content.push_str(&text);
true
}
}
}
pub fn messages(&self) -> &[Message] {
&self.messages
}
pub fn system_prompt(&self) -> &Vec<SystemPrompt> {
&self.system_prompt
}
pub fn set_system_prompt(&mut self, system_prompt: Vec<SystemPrompt>) {
self.system_prompt = system_prompt;
self.invalidate_cache_anchor();
}
pub fn clear(&mut self) {
self.messages.clear();
self.invalidate_cache_anchor();
}
pub fn restore_messages(&mut self, messages: Vec<Message>) {
self.invalidate_cache_anchor();
self.messages = messages;
self.trim_if_needed();
}
}