Skip to main content

claude_agent_sdk/types/
messages.rs

1use serde::{Deserialize, Serialize};
2
3use super::{AssistantMessageErrorKind, RateLimitInfo, TaskNotificationStatus, TaskUsage};
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
6#[serde(tag = "type", rename_all = "snake_case")]
7pub enum ContentBlock {
8    Text {
9        text: String,
10    },
11    Thinking {
12        thinking: String,
13        signature: String,
14    },
15    ToolUse {
16        id: String,
17        name: String,
18        input: serde_json::Map<String, serde_json::Value>,
19    },
20    ToolResult {
21        tool_use_id: String,
22        #[serde(skip_serializing_if = "Option::is_none")]
23        content: Option<serde_json::Value>,
24        #[serde(skip_serializing_if = "Option::is_none")]
25        is_error: Option<bool>,
26    },
27    ServerToolUse {
28        id: String,
29        name: String,
30        input: serde_json::Map<String, serde_json::Value>,
31    },
32    #[serde(rename = "advisor_tool_result")]
33    ServerToolResult {
34        tool_use_id: String,
35        content: serde_json::Value,
36    },
37}
38
39#[derive(Debug, Clone, Serialize, Deserialize)]
40#[serde(rename_all = "camelCase")]
41pub struct UserContent {
42    #[serde(skip_serializing_if = "Option::is_none")]
43    pub role: Option<String>,
44    pub content: serde_json::Value,
45}
46
47#[derive(Debug, Clone, Serialize, Deserialize)]
48#[serde(tag = "type", rename_all = "snake_case")]
49pub enum Message {
50    #[serde(rename = "user")]
51    UserMsg {
52        #[serde(rename = "message")]
53        content: UserContent,
54        #[serde(skip_serializing_if = "Option::is_none")]
55        uuid: Option<String>,
56        #[serde(skip_serializing_if = "Option::is_none")]
57        parent_tool_use_id: Option<String>,
58        #[serde(skip_serializing_if = "Option::is_none")]
59        tool_use_result: Option<serde_json::Map<String, serde_json::Value>>,
60    },
61    #[serde(rename = "assistant")]
62    AssistantMsg {
63        #[serde(rename = "message")]
64        content: AssistantContent,
65        #[serde(skip_serializing_if = "Option::is_none")]
66        parent_tool_use_id: Option<String>,
67        #[serde(skip_serializing_if = "Option::is_none")]
68        error: Option<AssistantMessageErrorKind>,
69        #[serde(skip_serializing_if = "Option::is_none")]
70        usage: Option<serde_json::Map<String, serde_json::Value>>,
71        #[serde(skip_serializing_if = "Option::is_none")]
72        message_id: Option<String>,
73        #[serde(skip_serializing_if = "Option::is_none")]
74        stop_reason: Option<String>,
75        #[serde(skip_serializing_if = "Option::is_none")]
76        session_id: Option<String>,
77        #[serde(skip_serializing_if = "Option::is_none")]
78        uuid: Option<String>,
79    },
80    #[serde(rename = "system")]
81    SystemMsg {
82        subtype: String,
83        #[serde(flatten)]
84        data: serde_json::Map<String, serde_json::Value>,
85    },
86    #[serde(skip_serializing, skip_deserializing)]
87    TaskStartedMsg(TaskStartedMessage),
88    #[serde(skip_serializing, skip_deserializing)]
89    TaskProgressMsg(TaskProgressMessage),
90    #[serde(skip_serializing, skip_deserializing)]
91    TaskNotificationMsg(TaskNotificationMessage),
92    #[serde(skip_serializing, skip_deserializing)]
93    HookEventMsg(HookEventMessage),
94    #[serde(skip_serializing, skip_deserializing)]
95    MirrorErrorMsg(MirrorErrorMessage),
96    #[serde(rename = "result")]
97    ResultMsg {
98        subtype: String,
99        duration_ms: i32,
100        duration_api_ms: i32,
101        is_error: bool,
102        num_turns: i32,
103        session_id: String,
104        #[serde(skip_serializing_if = "Option::is_none")]
105        stop_reason: Option<String>,
106        #[serde(skip_serializing_if = "Option::is_none")]
107        total_cost_usd: Option<f64>,
108        #[serde(skip_serializing_if = "Option::is_none")]
109        usage: Option<serde_json::Map<String, serde_json::Value>>,
110        #[serde(skip_serializing_if = "Option::is_none")]
111        result: Option<String>,
112        #[serde(skip_serializing_if = "Option::is_none")]
113        structured_output: Option<serde_json::Value>,
114        #[serde(skip_serializing_if = "Option::is_none")]
115        deferred_tool_use: Option<DeferredToolUse>,
116        #[serde(skip_serializing_if = "Option::is_none")]
117        errors: Option<Vec<String>>,
118        #[serde(skip_serializing_if = "Option::is_none")]
119        api_error_status: Option<i32>,
120        #[serde(skip_serializing_if = "Option::is_none")]
121        #[serde(rename = "modelUsage")]
122        model_usage: Option<serde_json::Map<String, serde_json::Value>>,
123        #[serde(skip_serializing_if = "Option::is_none")]
124        permission_denials: Option<Vec<serde_json::Value>>,
125        #[serde(skip_serializing_if = "Option::is_none")]
126        uuid: Option<String>,
127    },
128    #[serde(rename = "stream_event")]
129    StreamEventMsg {
130        uuid: String,
131        session_id: String,
132        #[serde(skip_serializing_if = "Option::is_none")]
133        event: Option<serde_json::Map<String, serde_json::Value>>,
134        #[serde(skip_serializing_if = "Option::is_none")]
135        parent_tool_use_id: Option<String>,
136    },
137    #[serde(rename = "rate_limit_event")]
138    RateLimitEventMsg {
139        rate_limit_info: RateLimitInfo,
140        uuid: String,
141        session_id: String,
142    },
143}
144
145#[derive(Debug, Clone, Serialize, Deserialize)]
146#[serde(rename_all = "camelCase")]
147pub struct AssistantContent {
148    #[serde(skip_serializing_if = "Option::is_none")]
149    pub id: Option<String>,
150    pub content: Vec<ContentBlock>,
151    pub model: String,
152    #[serde(skip_serializing_if = "Option::is_none")]
153    pub usage: Option<serde_json::Map<String, serde_json::Value>>,
154    #[serde(skip_serializing_if = "Option::is_none")]
155    #[serde(rename = "stop_reason")]
156    pub stop_reason: Option<String>,
157}
158
159#[derive(Debug, Clone, Serialize, Deserialize)]
160#[serde(rename_all = "camelCase")]
161pub struct DeferredToolUse {
162    pub id: String,
163    pub name: String,
164    pub input: serde_json::Map<String, serde_json::Value>,
165}
166
167#[derive(Debug, Clone, Serialize, Deserialize)]
168#[serde(rename_all = "camelCase")]
169pub struct TaskStartedMessage {
170    #[serde(alias = "task_id")]
171    pub task_id: String,
172    pub description: String,
173    pub uuid: String,
174    #[serde(alias = "session_id")]
175    pub session_id: String,
176    #[serde(skip_serializing_if = "Option::is_none")]
177    #[serde(alias = "tool_use_id")]
178    pub tool_use_id: Option<String>,
179    #[serde(skip_serializing_if = "Option::is_none")]
180    #[serde(alias = "task_type")]
181    pub task_type: Option<String>,
182}
183
184#[derive(Debug, Clone, Serialize, Deserialize)]
185#[serde(rename_all = "camelCase")]
186pub struct TaskProgressMessage {
187    #[serde(alias = "task_id")]
188    pub task_id: String,
189    pub description: String,
190    pub usage: TaskUsage,
191    pub uuid: String,
192    #[serde(alias = "session_id")]
193    pub session_id: String,
194    #[serde(skip_serializing_if = "Option::is_none")]
195    #[serde(alias = "tool_use_id")]
196    pub tool_use_id: Option<String>,
197    #[serde(skip_serializing_if = "Option::is_none")]
198    #[serde(alias = "last_tool_name")]
199    pub last_tool_name: Option<String>,
200}
201
202#[derive(Debug, Clone, Serialize, Deserialize)]
203#[serde(rename_all = "camelCase")]
204pub struct TaskNotificationMessage {
205    #[serde(alias = "task_id")]
206    pub task_id: String,
207    pub status: TaskNotificationStatus,
208    #[serde(alias = "output_file")]
209    pub output_file: String,
210    pub summary: String,
211    pub uuid: String,
212    #[serde(alias = "session_id")]
213    pub session_id: String,
214    #[serde(skip_serializing_if = "Option::is_none")]
215    #[serde(alias = "tool_use_id")]
216    pub tool_use_id: Option<String>,
217    #[serde(skip_serializing_if = "Option::is_none")]
218    pub usage: Option<TaskUsage>,
219}
220
221#[derive(Debug, Clone, Serialize, Deserialize)]
222#[serde(rename_all = "camelCase")]
223pub struct HookEventMessage {
224    pub subtype: String,
225    #[serde(skip_serializing_if = "Option::is_none")]
226    pub hook_event_name: Option<String>,
227    #[serde(skip_serializing_if = "Option::is_none")]
228    pub session_id: Option<String>,
229    #[serde(skip_serializing_if = "Option::is_none")]
230    pub uuid: Option<String>,
231    pub data: serde_json::Map<String, serde_json::Value>,
232}
233
234#[derive(Debug, Clone, Serialize, Deserialize)]
235#[serde(rename_all = "camelCase")]
236pub struct MirrorErrorMessage {
237    #[serde(skip_serializing_if = "Option::is_none")]
238    pub key: Option<serde_json::Map<String, serde_json::Value>>,
239    pub error: String,
240    pub data: serde_json::Map<String, serde_json::Value>,
241}