use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, Default, Clone)]
pub struct Message {
pub role: Role,
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_call_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_calls: Option<Vec<ToolCall>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reasoning_content: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prefix: Option<bool>,
}
pub const AUTO_SUMMARY_TAG: &str = "[auto-summary]";
impl Message {
pub fn new(role: Role, message: &str) -> Self {
Self {
role,
content: Some(message.to_string()),
name: None,
tool_call_id: None,
tool_calls: None,
reasoning_content: None,
prefix: None,
}
}
pub fn user(message: &str) -> Self {
Self::new(Role::User, message)
}
pub fn assistant(message: &str) -> Self {
Self::new(Role::Assistant, message)
}
pub fn system(message: &str) -> Self {
Self::new(Role::System, message)
}
#[inline]
pub fn is_auto_summary(&self) -> bool {
matches!(self.role, Role::System) && self.name.as_deref() == Some(AUTO_SUMMARY_TAG)
}
pub(crate) fn auto_summary(text: impl Into<String>) -> Self {
let mut msg = Self::new(Role::System, &text.into());
msg.name = Some(AUTO_SUMMARY_TAG.to_string());
msg
}
}
#[derive(Debug, Serialize, Deserialize, Clone, Default)]
#[serde(rename_all = "lowercase")]
pub enum Role {
System,
#[default]
User,
Assistant,
Tool,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct ToolCall {
pub id: String,
pub r#type: ToolType,
pub function: FunctionCall,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "lowercase")]
pub enum ToolType {
Function,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct FunctionCall {
pub name: String,
pub arguments: String, }