1use serde::{Deserialize, Serialize};
5
6use crate::event::BaseEvent;
7use crate::ids::{MessageId, SubagentRunId};
8
9#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
13#[serde(rename_all = "camelCase")]
14#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
15#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
16pub struct ReasoningStartEvent {
17 #[serde(flatten)]
19 pub base: BaseEvent,
20 pub message_id: MessageId,
22 #[serde(
25 default,
26 deserialize_with = "crate::serde_util::reject_null",
27 skip_serializing_if = "Option::is_none"
28 )]
29 pub subagent_run_id: Option<SubagentRunId>,
30}
31
32impl ReasoningStartEvent {
33 pub fn new(message_id: impl Into<MessageId>) -> Self {
35 Self {
36 base: BaseEvent::default(),
37 message_id: message_id.into(),
38 subagent_run_id: None,
39 }
40 }
41}
42
43#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
45#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
46#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
47pub enum ReasoningRole {
48 #[default]
50 #[serde(rename = "reasoning")]
51 Reasoning,
52}
53
54#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
56#[serde(rename_all = "camelCase")]
57#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
58#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
59pub struct ReasoningMessageStartEvent {
60 #[serde(flatten)]
62 pub base: BaseEvent,
63 pub message_id: MessageId,
65 pub role: ReasoningRole,
68 #[serde(
71 default,
72 deserialize_with = "crate::serde_util::reject_null",
73 skip_serializing_if = "Option::is_none"
74 )]
75 pub subagent_run_id: Option<SubagentRunId>,
76}
77
78impl ReasoningMessageStartEvent {
79 pub fn new(message_id: impl Into<MessageId>) -> Self {
81 Self {
82 base: BaseEvent::default(),
83 message_id: message_id.into(),
84 role: ReasoningRole::Reasoning,
85 subagent_run_id: None,
86 }
87 }
88}
89
90#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
92#[serde(rename_all = "camelCase")]
93#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
94#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
95pub struct ReasoningMessageContentEvent {
96 #[serde(flatten)]
98 pub base: BaseEvent,
99 pub message_id: MessageId,
101 pub delta: String,
103 #[serde(
106 default,
107 deserialize_with = "crate::serde_util::reject_null",
108 skip_serializing_if = "Option::is_none"
109 )]
110 pub subagent_run_id: Option<SubagentRunId>,
111}
112
113impl ReasoningMessageContentEvent {
114 pub fn new(message_id: impl Into<MessageId>, delta: impl Into<String>) -> Self {
116 Self {
117 base: BaseEvent::default(),
118 message_id: message_id.into(),
119 delta: delta.into(),
120 subagent_run_id: None,
121 }
122 }
123}
124
125#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
127#[serde(rename_all = "camelCase")]
128#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
129#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
130pub struct ReasoningMessageEndEvent {
131 #[serde(flatten)]
133 pub base: BaseEvent,
134 pub message_id: MessageId,
136 #[serde(
139 default,
140 deserialize_with = "crate::serde_util::reject_null",
141 skip_serializing_if = "Option::is_none"
142 )]
143 pub subagent_run_id: Option<SubagentRunId>,
144}
145
146impl ReasoningMessageEndEvent {
147 pub fn new(message_id: impl Into<MessageId>) -> Self {
149 Self {
150 base: BaseEvent::default(),
151 message_id: message_id.into(),
152 subagent_run_id: None,
153 }
154 }
155}
156
157#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
159#[serde(rename_all = "camelCase")]
160#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
161#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
162pub struct ReasoningMessageChunkEvent {
163 #[serde(flatten)]
165 pub base: BaseEvent,
166 #[serde(default, skip_serializing_if = "Option::is_none")]
168 pub message_id: Option<MessageId>,
169 #[serde(default, skip_serializing_if = "Option::is_none")]
171 pub delta: Option<String>,
172 #[serde(
178 default,
179 deserialize_with = "crate::serde_util::reject_null",
180 skip_serializing_if = "Option::is_none"
181 )]
182 pub subagent_run_id: Option<SubagentRunId>,
183}
184
185impl ReasoningMessageChunkEvent {
186 pub fn new(message_id: Option<MessageId>, delta: Option<String>) -> Self {
188 Self {
189 base: BaseEvent::default(),
190 message_id,
191 delta,
192 subagent_run_id: None,
193 }
194 }
195}
196
197#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
199#[serde(rename_all = "camelCase")]
200#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
201#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
202pub struct ReasoningEndEvent {
203 #[serde(flatten)]
205 pub base: BaseEvent,
206 pub message_id: MessageId,
208 #[serde(
211 default,
212 deserialize_with = "crate::serde_util::reject_null",
213 skip_serializing_if = "Option::is_none"
214 )]
215 pub subagent_run_id: Option<SubagentRunId>,
216}
217
218impl ReasoningEndEvent {
219 pub fn new(message_id: impl Into<MessageId>) -> Self {
221 Self {
222 base: BaseEvent::default(),
223 message_id: message_id.into(),
224 subagent_run_id: None,
225 }
226 }
227}
228
229#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
231#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
232#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
233pub enum ReasoningEncryptedValueSubtype {
234 #[serde(rename = "tool-call")]
236 ToolCall,
237 #[default]
239 #[serde(rename = "message")]
240 Message,
241}
242
243impl ReasoningEncryptedValueSubtype {
244 pub const fn as_str(&self) -> &'static str {
246 match self {
247 Self::ToolCall => "tool-call",
248 Self::Message => "message",
249 }
250 }
251}
252
253#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
259#[serde(rename_all = "camelCase")]
260#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
261#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
262pub struct ReasoningEncryptedValueEvent {
263 #[serde(flatten)]
265 pub base: BaseEvent,
266 pub subtype: ReasoningEncryptedValueSubtype,
268 pub entity_id: String,
270 pub encrypted_value: String,
272 #[serde(
275 default,
276 deserialize_with = "crate::serde_util::reject_null",
277 skip_serializing_if = "Option::is_none"
278 )]
279 pub subagent_run_id: Option<SubagentRunId>,
280}
281
282impl ReasoningEncryptedValueEvent {
283 pub fn new(
285 subtype: ReasoningEncryptedValueSubtype,
286 entity_id: impl Into<String>,
287 encrypted_value: impl Into<String>,
288 ) -> Self {
289 Self {
290 base: BaseEvent::default(),
291 subtype,
292 entity_id: entity_id.into(),
293 encrypted_value: encrypted_value.into(),
294 subagent_run_id: None,
295 }
296 }
297}
298
299#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
312#[serde(rename_all = "camelCase")]
313#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
314#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
315#[cfg_attr(
316 not(feature = "utoipa"),
317 deprecated(note = "use the REASONING_* events: ReasoningStartEvent")
318)]
319pub struct ThinkingStartEvent {
320 #[serde(flatten)]
322 pub base: BaseEvent,
323 #[serde(default, skip_serializing_if = "Option::is_none")]
325 pub title: Option<String>,
326}
327
328impl ThinkingStartEvent {
329 pub fn new(title: Option<String>) -> Self {
331 Self {
332 base: BaseEvent::default(),
333 title,
334 }
335 }
336}
337
338#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
340#[serde(rename_all = "camelCase")]
341#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
342#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
343#[cfg_attr(
344 not(feature = "utoipa"),
345 deprecated(note = "use the REASONING_* events: ReasoningEndEvent")
346)]
347pub struct ThinkingEndEvent {
348 #[serde(flatten)]
350 pub base: BaseEvent,
351}
352
353#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
355#[serde(rename_all = "camelCase")]
356#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
357#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
358#[cfg_attr(
359 not(feature = "utoipa"),
360 deprecated(note = "use the REASONING_* events: ReasoningMessageStartEvent")
361)]
362pub struct ThinkingTextMessageStartEvent {
363 #[serde(flatten)]
365 pub base: BaseEvent,
366}
367
368#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
373#[serde(rename_all = "camelCase")]
374#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
375#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
376#[cfg_attr(
377 not(feature = "utoipa"),
378 deprecated(note = "use the REASONING_* events: ReasoningMessageContentEvent")
379)]
380pub struct ThinkingTextMessageContentEvent {
381 #[serde(flatten)]
383 pub base: BaseEvent,
384 pub delta: String,
386}
387
388impl ThinkingTextMessageContentEvent {
389 pub fn new(delta: impl Into<String>) -> Self {
391 Self {
392 base: BaseEvent::default(),
393 delta: delta.into(),
394 }
395 }
396}
397
398#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
400#[serde(rename_all = "camelCase")]
401#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
402#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
403#[cfg_attr(
404 not(feature = "utoipa"),
405 deprecated(note = "use the REASONING_* events: ReasoningMessageEndEvent")
406)]
407pub struct ThinkingTextMessageEndEvent {
408 #[serde(flatten)]
410 pub base: BaseEvent,
411}