use super::{Message, Tool};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Context {
#[serde(skip_serializing_if = "Option::is_none")]
pub system_prompt: Option<String>,
pub messages: Vec<Message>,
#[serde(default)]
pub tools: Vec<Tool>,
}
impl Default for Context {
fn default() -> Self {
Self::new()
}
}
impl Context {
pub fn new() -> Self {
Self {
system_prompt: None,
messages: Vec::new(),
tools: Vec::new(),
}
}
pub fn with_system_prompt(mut self, prompt: impl Into<String>) -> Self {
self.system_prompt = Some(prompt.into());
self
}
pub fn add_message(&mut self, message: Message) {
self.messages.push(message);
}
pub fn message(&self, index: usize) -> Option<&Message> {
self.messages.get(index)
}
pub fn last_message(&self) -> Option<&Message> {
self.messages.last()
}
pub fn is_empty(&self) -> bool {
self.messages.is_empty()
}
pub fn len(&self) -> usize {
self.messages.len()
}
pub fn set_system_prompt(&mut self, prompt: impl Into<String>) {
self.system_prompt = Some(prompt.into());
}
pub fn clear_system_prompt(&mut self) {
self.system_prompt = None;
}
pub fn set_tools(&mut self, tools: Vec<Tool>) {
self.tools = tools;
}
pub fn add_tool(&mut self, tool: Tool) {
self.tools.push(tool);
}
pub fn to_json(&self) -> Result<String, serde_json::Error> {
serde_json::to_string(self)
}
pub fn from_json(json: &str) -> Result<Self, serde_json::Error> {
serde_json::from_str(json)
}
pub fn clone(&self) -> Self {
Self {
system_prompt: self.system_prompt.clone(),
messages: self.messages.clone(),
tools: self.tools.clone(),
}
}
}
impl From<Vec<Message>> for Context {
fn from(messages: Vec<Message>) -> Self {
Self {
system_prompt: None,
messages,
tools: Vec::new(),
}
}
}
impl From<Message> for Context {
fn from(message: Message) -> Self {
Self {
system_prompt: None,
messages: vec![message],
tools: Vec::new(),
}
}
}