use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use serde_json::Value;
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum MessageRole {
User,
Assistant,
System,
Tool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Message {
pub id: String,
pub role: MessageRole,
#[serde(default)]
pub parts: Vec<MessagePart>,
pub created_at: DateTime<Utc>,
}
impl Message {
pub fn new(role: MessageRole, parts: Vec<MessagePart>) -> Self {
Self {
id: Uuid::new_v4().to_string(),
role,
parts,
created_at: Utc::now(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum MessagePart {
Text {
text: String,
},
Reasoning {
text: String,
},
ToolInvocation {
tool: String,
args: Value,
result: Option<Value>,
error: Option<String>,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum MessagePartInput {
Text {
text: String,
},
File {
mime: String,
filename: Option<String>,
url: String,
},
}