117 lines
2.7 KiB
Rust
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(),
|
|
},
|
|
}
|
|
}
|
|
}
|