use serde::{Deserialize, Serialize};
use super::tool_call::{ToolCall, ToolResult};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "role", rename_all = "snake_case")]
pub enum Message {
System(SystemMessage),
User(UserMessage),
Assistant(AssistantMessage),
ToolResult(ToolResultMessage),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SystemMessage {
pub content: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserMessage {
pub content: Vec<MediaPart>,
}
impl UserMessage {
pub fn text(text: impl Into<String>) -> Self {
Self {
content: vec![MediaPart::Text(text.into())],
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AssistantMessage {
pub content: Option<String>,
#[serde(default)]
pub tool_calls: Vec<ToolCall>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolResultMessage {
pub tool_results: Vec<ToolResult>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum MediaPart {
Text(String),
Image(Media),
Document(Media),
Audio(Media),
Video(Media),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Media {
pub mime_type: Option<String>,
pub data: MediaData,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum MediaData {
Url(String),
Base64(String),
}