//! Message Types //! //! Message structure used in conversations with LLM. //! Can be easily created using [`Message::user`] or [`Message::assistant`]. use serde::{Deserialize, Serialize}; /// Message role #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "lowercase")] pub enum Role { /// User User, /// Assistant Assistant, } /// Conversation message /// /// # Examples /// /// ```ignore /// use llm_worker::Message; /// /// // User message /// let user_msg = Message::user("Hello!"); /// /// // Assistant message /// let assistant_msg = Message::assistant("Hi there!"); /// ``` #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Message { /// Role pub role: Role, /// Content pub content: MessageContent, } /// Message content #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(untagged)] pub enum MessageContent { /// Text content Text(String), /// Tool result ToolResult { tool_use_id: String, content: String, }, /// Composite content (text + tool use, etc.) Parts(Vec), } /// Content part #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(tag = "type")] pub enum ContentPart { /// Text #[serde(rename = "text")] Text { text: String }, /// Tool use #[serde(rename = "tool_use")] ToolUse { id: String, name: String, input: serde_json::Value, }, /// Tool result #[serde(rename = "tool_result")] ToolResult { tool_use_id: String, content: String, }, } impl Message { /// Create a user message /// /// # Examples /// /// ```ignore /// use llm_worker::Message; /// let msg = Message::user("Hello"); /// ``` pub fn user(content: impl Into) -> Self { Self { role: Role::User, content: MessageContent::Text(content.into()), } } /// Create an assistant message /// /// Usually auto-generated inside Worker, /// but can be manually created for history initialization, etc. pub fn assistant(content: impl Into) -> Self { Self { role: Role::Assistant, content: MessageContent::Text(content.into()), } } /// Create a tool result message /// /// Auto-generated inside Worker after tool execution. /// Usually no need to create manually. pub fn tool_result(tool_use_id: impl Into, content: impl Into) -> Self { Self { role: Role::User, content: MessageContent::ToolResult { tool_use_id: tool_use_id.into(), content: content.into(), }, } } }