1use serde::{Deserialize, Serialize};
5
6use super::output::{OutputItem, ResponseOutputItem};
7use super::response::Response;
8
9#[derive(Debug, Clone, Serialize, Deserialize)]
11#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
12pub struct ResponseTextDeltaEvent {
13 #[serde(default)]
15 pub sequence_number: i64,
16 #[serde(default)]
18 pub item_id: String,
19 #[serde(default)]
21 pub output_index: i64,
22 #[serde(default)]
24 pub content_index: i64,
25 pub delta: String,
27 #[serde(default)]
29 #[serde(skip_serializing_if = "Option::is_none")]
30 pub logprobs: Option<serde_json::Value>,
31}
32
33#[derive(Debug, Clone, Serialize, Deserialize)]
35#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
36pub struct ResponseReasoningTextDeltaEvent {
37 #[serde(default)]
39 pub sequence_number: i64,
40 #[serde(default)]
42 pub item_id: String,
43 #[serde(default)]
45 pub output_index: i64,
46 #[serde(default)]
48 pub content_index: i64,
49 pub delta: String,
51}
52
53#[derive(Debug, Clone, Serialize, Deserialize)]
55#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
56pub struct ResponseReasoningSummaryTextDeltaEvent {
57 #[serde(default)]
59 pub sequence_number: i64,
60 #[serde(default)]
62 pub item_id: String,
63 #[serde(default)]
65 pub output_index: i64,
66 #[serde(default)]
68 pub summary_index: i64,
69 pub delta: String,
71}
72
73#[derive(Debug, Clone, Serialize, Deserialize)]
75#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
76pub struct ResponseOutputItemAddedEvent {
77 #[serde(default)]
79 pub sequence_number: i64,
80 #[serde(default)]
82 pub output_index: i64,
83 pub item: OutputItem,
85}
86
87#[derive(Debug, Clone, Serialize, Deserialize)]
89#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
90pub struct ResponseFunctionCallArgumentsDeltaEvent {
91 #[serde(default)]
93 pub sequence_number: i64,
94 #[serde(default)]
96 pub item_id: String,
97 #[serde(default)]
99 pub output_index: u32,
100 pub delta: String,
102}
103
104#[derive(Debug, Clone, Serialize, Deserialize)]
106#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
107pub struct ResponseFunctionCallArgumentsDoneEvent {
108 #[serde(default)]
110 pub sequence_number: i64,
111 #[serde(default)]
113 pub item_id: String,
114 #[serde(default)]
116 pub output_index: u32,
117 pub arguments: String,
119 #[serde(default)]
121 #[serde(skip_serializing_if = "Option::is_none")]
122 pub name: Option<String>,
123}
124
125#[derive(Debug, Clone, Serialize, Deserialize)]
127#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
128pub struct ResponseCompletedEvent {
129 #[serde(default)]
131 pub sequence_number: i64,
132 pub response: Response,
134}
135
136#[derive(Debug, Clone, Serialize, Deserialize)]
138#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
139pub struct ResponseFailedEvent {
140 #[serde(default)]
142 pub sequence_number: i64,
143 pub response: Response,
145}
146
147#[derive(Debug, Clone, Serialize, Deserialize)]
149#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
150pub struct ResponseIncompleteEvent {
151 #[serde(default)]
153 pub sequence_number: i64,
154 pub response: Response,
156}
157
158#[derive(Debug, Clone, Serialize, Deserialize)]
160#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
161pub struct ResponseErrorEvent {
162 #[serde(default)]
164 pub sequence_number: i64,
165 pub message: String,
167 #[serde(default)]
169 #[serde(skip_serializing_if = "Option::is_none")]
170 pub code: Option<String>,
171 #[serde(default)]
173 #[serde(skip_serializing_if = "Option::is_none")]
174 pub param: Option<String>,
175}
176
177#[derive(Debug, Clone, Deserialize, Serialize)]
182#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
183#[serde(tag = "type")]
184#[non_exhaustive]
185pub enum ResponseStreamEvent {
186 #[serde(rename = "response.created")]
189 ResponseCreated {
190 response: Response,
192 },
193 #[serde(rename = "response.in_progress")]
195 ResponseInProgress {
196 response: Response,
198 },
199 #[serde(rename = "response.completed")]
201 ResponseCompleted(ResponseCompletedEvent),
202 #[serde(rename = "response.failed")]
204 ResponseFailed(ResponseFailedEvent),
205 #[serde(rename = "response.incomplete")]
207 ResponseIncomplete(ResponseIncompleteEvent),
208
209 #[serde(rename = "response.output_item.added")]
212 ResponseOutputItemAdded(ResponseOutputItemAddedEvent),
213 #[serde(rename = "response.output_item.done")]
215 OutputItemDone {
216 output_index: i64,
218 item: ResponseOutputItem,
220 },
221
222 #[serde(rename = "response.content_part.added")]
225 ContentPartAdded {
226 output_index: i64,
228 content_index: i64,
230 part: serde_json::Value,
232 },
233 #[serde(rename = "response.content_part.done")]
235 ContentPartDone {
236 output_index: i64,
238 content_index: i64,
240 part: serde_json::Value,
242 },
243
244 #[serde(rename = "response.output_text.delta")]
247 ResponseOutputTextDelta(ResponseTextDeltaEvent),
248 #[serde(rename = "response.output_text.done")]
250 OutputTextDone {
251 output_index: i64,
253 content_index: i64,
255 text: String,
257 },
258
259 #[serde(rename = "response.function_call_arguments.delta")]
262 ResponseFunctionCallArgumentsDelta(ResponseFunctionCallArgumentsDeltaEvent),
263 #[serde(rename = "response.function_call_arguments.done")]
265 ResponseFunctionCallArgumentsDone(ResponseFunctionCallArgumentsDoneEvent),
266
267 #[serde(rename = "response.reasoning_text.delta")]
270 ResponseReasoningTextDelta(ResponseReasoningTextDeltaEvent),
271 #[serde(rename = "response.reasoning_summary_text.delta")]
273 ResponseReasoningSummaryTextDelta(ResponseReasoningSummaryTextDeltaEvent),
274 #[serde(rename = "response.reasoning_summary_text.done")]
276 ReasoningSummaryTextDone {
277 output_index: i64,
279 #[serde(default)]
281 summary_index: Option<i64>,
282 text: String,
284 },
285
286 #[serde(rename = "error")]
289 ResponseError(ResponseErrorEvent),
290
291 #[serde(untagged)]
294 Other(serde_json::Value),
295}
296
297impl ResponseStreamEvent {
298 pub fn event_type(&self) -> &str {
300 match self {
301 Self::ResponseCreated { .. } => "response.created",
302 Self::ResponseInProgress { .. } => "response.in_progress",
303 Self::ResponseCompleted { .. } => "response.completed",
304 Self::ResponseFailed { .. } => "response.failed",
305 Self::ResponseIncomplete { .. } => "response.incomplete",
306 Self::ResponseOutputItemAdded { .. } => "response.output_item.added",
307 Self::OutputItemDone { .. } => "response.output_item.done",
308 Self::ContentPartAdded { .. } => "response.content_part.added",
309 Self::ContentPartDone { .. } => "response.content_part.done",
310 Self::ResponseOutputTextDelta { .. } => "response.output_text.delta",
311 Self::OutputTextDone { .. } => "response.output_text.done",
312 Self::ResponseFunctionCallArgumentsDelta { .. } => {
313 "response.function_call_arguments.delta"
314 }
315 Self::ResponseFunctionCallArgumentsDone { .. } => {
316 "response.function_call_arguments.done"
317 }
318 Self::ResponseReasoningTextDelta { .. } => "response.reasoning_text.delta",
319 Self::ResponseReasoningSummaryTextDelta { .. } => {
320 "response.reasoning_summary_text.delta"
321 }
322 Self::ReasoningSummaryTextDone { .. } => "response.reasoning_summary_text.done",
323 Self::ResponseError { .. } => "error",
324 Self::Other(v) => v.get("type").and_then(|t| t.as_str()).unwrap_or("unknown"),
325 }
326 }
327}