use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum MessageRole { User, Assistant, System, Tool, } #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(tag = "type", rename_all = "snake_case")] pub enum ContentBlock { Text { text: String, }, Image { data: String, mime_type: String, #[serde(skip_serializing_if = "Option::is_none")] uri: Option, }, ToolUse { tool_use_id: Option, tool_name: String, input_preview: Option, }, ToolResult { tool_use_id: Option, output_preview: Option, is_error: bool, }, Thinking { text: String, }, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct TurnUsage { pub input_tokens: u64, pub output_tokens: u64, pub cache_creation_input_tokens: u64, pub cache_read_input_tokens: u64, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct UnifiedMessage { pub id: String, pub role: MessageRole, pub content: Vec, pub timestamp: DateTime, #[serde(skip_serializing_if = "Option::is_none")] pub usage: Option, #[serde(skip_serializing_if = "Option::is_none")] pub duration_ms: Option, #[serde(skip_serializing_if = "Option::is_none")] pub model: Option, } #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum TurnRole { User, Assistant, System, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct MessageTurn { pub id: String, pub role: TurnRole, pub blocks: Vec, pub timestamp: DateTime, #[serde(skip_serializing_if = "Option::is_none")] pub usage: Option, #[serde(skip_serializing_if = "Option::is_none")] pub duration_ms: Option, #[serde(skip_serializing_if = "Option::is_none")] pub model: Option, }