llm-worker 0.2.0

A library for building autonomous LLM-powered systems
Documentation
//! メッセージ型
//!
//! LLMとの会話で使用されるメッセージ構造。
//! [`Message::user`]や[`Message::assistant`]で簡単に作成できます。

use serde::{Deserialize, Serialize};

/// メッセージのロール
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Role {
    /// ユーザー
    User,
    /// アシスタント
    Assistant,
}

/// 会話のメッセージ
///
/// # Examples
///
/// ```ignore
/// use llm_worker::Message;
///
/// // ユーザーメッセージ
/// let user_msg = Message::user("Hello!");
///
/// // アシスタントメッセージ
/// let assistant_msg = Message::assistant("Hi there!");
/// ```
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Message {
    /// ロール
    pub role: Role,
    /// コンテンツ
    pub content: MessageContent,
}

/// メッセージコンテンツ
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum MessageContent {
    /// テキストコンテンツ
    Text(String),
    /// ツール結果
    ToolResult {
        tool_use_id: String,
        content: String,
    },
    /// 複合コンテンツ (テキスト + ツール使用等)
    Parts(Vec<ContentPart>),
}

/// コンテンツパーツ
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum ContentPart {
    /// テキスト
    #[serde(rename = "text")]
    Text { text: String },
    /// ツール使用
    #[serde(rename = "tool_use")]
    ToolUse {
        id: String,
        name: String,
        input: serde_json::Value,
    },
    /// ツール結果
    #[serde(rename = "tool_result")]
    ToolResult {
        tool_use_id: String,
        content: String,
    },
}

impl Message {
    /// ユーザーメッセージを作成
    ///
    /// # Examples
    ///
    /// ```ignore
    /// use llm_worker::Message;
    /// let msg = Message::user("こんにちは");
    /// ```
    pub fn user(content: impl Into<String>) -> Self {
        Self {
            role: Role::User,
            content: MessageContent::Text(content.into()),
        }
    }

    /// アシスタントメッセージを作成
    ///
    /// 通常はWorker内部で自動生成されますが、
    /// 履歴の初期化などで手動作成も可能です。
    pub fn assistant(content: impl Into<String>) -> Self {
        Self {
            role: Role::Assistant,
            content: MessageContent::Text(content.into()),
        }
    }

    /// ツール結果メッセージを作成
    ///
    /// Worker内部でツール実行後に自動生成されます。
    /// 通常は直接作成する必要はありません。
    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(),
            },
        }
    }
}