llm_worker/
message.rs

1//! メッセージ型
2//!
3//! LLMとの会話で使用されるメッセージ構造。
4//! [`Message::user`]や[`Message::assistant`]で簡単に作成できます。
5
6use serde::{Deserialize, Serialize};
7
8/// メッセージのロール
9#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
10#[serde(rename_all = "lowercase")]
11pub enum Role {
12    /// ユーザー
13    User,
14    /// アシスタント
15    Assistant,
16}
17
18/// 会話のメッセージ
19///
20/// # Examples
21///
22/// ```ignore
23/// use llm_worker::Message;
24///
25/// // ユーザーメッセージ
26/// let user_msg = Message::user("Hello!");
27///
28/// // アシスタントメッセージ
29/// let assistant_msg = Message::assistant("Hi there!");
30/// ```
31#[derive(Debug, Clone, Serialize, Deserialize)]
32pub struct Message {
33    /// ロール
34    pub role: Role,
35    /// コンテンツ
36    pub content: MessageContent,
37}
38
39/// メッセージコンテンツ
40#[derive(Debug, Clone, Serialize, Deserialize)]
41#[serde(untagged)]
42pub enum MessageContent {
43    /// テキストコンテンツ
44    Text(String),
45    /// ツール結果
46    ToolResult {
47        tool_use_id: String,
48        content: String,
49    },
50    /// 複合コンテンツ (テキスト + ツール使用等)
51    Parts(Vec<ContentPart>),
52}
53
54/// コンテンツパーツ
55#[derive(Debug, Clone, Serialize, Deserialize)]
56#[serde(tag = "type")]
57pub enum ContentPart {
58    /// テキスト
59    #[serde(rename = "text")]
60    Text { text: String },
61    /// ツール使用
62    #[serde(rename = "tool_use")]
63    ToolUse {
64        id: String,
65        name: String,
66        input: serde_json::Value,
67    },
68    /// ツール結果
69    #[serde(rename = "tool_result")]
70    ToolResult {
71        tool_use_id: String,
72        content: String,
73    },
74}
75
76impl Message {
77    /// ユーザーメッセージを作成
78    ///
79    /// # Examples
80    ///
81    /// ```ignore
82    /// use llm_worker::Message;
83    /// let msg = Message::user("こんにちは");
84    /// ```
85    pub fn user(content: impl Into<String>) -> Self {
86        Self {
87            role: Role::User,
88            content: MessageContent::Text(content.into()),
89        }
90    }
91
92    /// アシスタントメッセージを作成
93    ///
94    /// 通常はWorker内部で自動生成されますが、
95    /// 履歴の初期化などで手動作成も可能です。
96    pub fn assistant(content: impl Into<String>) -> Self {
97        Self {
98            role: Role::Assistant,
99            content: MessageContent::Text(content.into()),
100        }
101    }
102
103    /// ツール結果メッセージを作成
104    ///
105    /// Worker内部でツール実行後に自動生成されます。
106    /// 通常は直接作成する必要はありません。
107    pub fn tool_result(tool_use_id: impl Into<String>, content: impl Into<String>) -> Self {
108        Self {
109            role: Role::User,
110            content: MessageContent::ToolResult {
111                tool_use_id: tool_use_id.into(),
112                content: content.into(),
113            },
114        }
115    }
116}