llm_worker_rs/llm-worker/src/message.rs
2026-01-16 16:58:03 +09:00

117 lines
2.7 KiB
Rust

//! 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<ContentPart>),
}
/// 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<String>) -> 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<String>) -> 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<String>, content: impl Into<String>) -> Self {
Self {
role: Role::User,
content: MessageContent::ToolResult {
tool_use_id: tool_use_id.into(),
content: content.into(),
},
}
}
}