use serde::{Deserialize, Serialize};
use super::output::{OutputItem, ResponseOutputItem};
use super::response::Response;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
pub struct ResponseTextDeltaEvent {
#[serde(default)]
pub sequence_number: i64,
#[serde(default)]
pub item_id: String,
#[serde(default)]
pub output_index: i64,
#[serde(default)]
pub content_index: i64,
pub delta: String,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub logprobs: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
pub struct ResponseReasoningTextDeltaEvent {
#[serde(default)]
pub sequence_number: i64,
#[serde(default)]
pub item_id: String,
#[serde(default)]
pub output_index: i64,
#[serde(default)]
pub content_index: i64,
pub delta: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
pub struct ResponseReasoningSummaryTextDeltaEvent {
#[serde(default)]
pub sequence_number: i64,
#[serde(default)]
pub item_id: String,
#[serde(default)]
pub output_index: i64,
#[serde(default)]
pub summary_index: i64,
pub delta: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
pub struct ResponseOutputItemAddedEvent {
#[serde(default)]
pub sequence_number: i64,
#[serde(default)]
pub output_index: i64,
pub item: OutputItem,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
pub struct ResponseFunctionCallArgumentsDeltaEvent {
#[serde(default)]
pub sequence_number: i64,
#[serde(default)]
pub item_id: String,
#[serde(default)]
pub output_index: u32,
pub delta: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
pub struct ResponseFunctionCallArgumentsDoneEvent {
#[serde(default)]
pub sequence_number: i64,
#[serde(default)]
pub item_id: String,
#[serde(default)]
pub output_index: u32,
pub arguments: String,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
pub struct ResponseCompletedEvent {
#[serde(default)]
pub sequence_number: i64,
pub response: Response,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
pub struct ResponseFailedEvent {
#[serde(default)]
pub sequence_number: i64,
pub response: Response,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
pub struct ResponseIncompleteEvent {
#[serde(default)]
pub sequence_number: i64,
pub response: Response,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
pub struct ResponseErrorEvent {
#[serde(default)]
pub sequence_number: i64,
pub message: String,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub param: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
#[serde(tag = "type")]
#[non_exhaustive]
pub enum ResponseStreamEvent {
#[serde(rename = "response.created")]
ResponseCreated {
response: Response,
},
#[serde(rename = "response.in_progress")]
ResponseInProgress {
response: Response,
},
#[serde(rename = "response.completed")]
ResponseCompleted(ResponseCompletedEvent),
#[serde(rename = "response.failed")]
ResponseFailed(ResponseFailedEvent),
#[serde(rename = "response.incomplete")]
ResponseIncomplete(ResponseIncompleteEvent),
#[serde(rename = "response.output_item.added")]
ResponseOutputItemAdded(ResponseOutputItemAddedEvent),
#[serde(rename = "response.output_item.done")]
OutputItemDone {
output_index: i64,
item: ResponseOutputItem,
},
#[serde(rename = "response.content_part.added")]
ContentPartAdded {
output_index: i64,
content_index: i64,
part: serde_json::Value,
},
#[serde(rename = "response.content_part.done")]
ContentPartDone {
output_index: i64,
content_index: i64,
part: serde_json::Value,
},
#[serde(rename = "response.output_text.delta")]
ResponseOutputTextDelta(ResponseTextDeltaEvent),
#[serde(rename = "response.output_text.done")]
OutputTextDone {
output_index: i64,
content_index: i64,
text: String,
},
#[serde(rename = "response.function_call_arguments.delta")]
ResponseFunctionCallArgumentsDelta(ResponseFunctionCallArgumentsDeltaEvent),
#[serde(rename = "response.function_call_arguments.done")]
ResponseFunctionCallArgumentsDone(ResponseFunctionCallArgumentsDoneEvent),
#[serde(rename = "response.reasoning_text.delta")]
ResponseReasoningTextDelta(ResponseReasoningTextDeltaEvent),
#[serde(rename = "response.reasoning_summary_text.delta")]
ResponseReasoningSummaryTextDelta(ResponseReasoningSummaryTextDeltaEvent),
#[serde(rename = "response.reasoning_summary_text.done")]
ReasoningSummaryTextDone {
output_index: i64,
#[serde(default)]
summary_index: Option<i64>,
text: String,
},
#[serde(rename = "error")]
ResponseError(ResponseErrorEvent),
#[serde(untagged)]
Other(serde_json::Value),
}
impl ResponseStreamEvent {
pub fn event_type(&self) -> &str {
match self {
Self::ResponseCreated { .. } => "response.created",
Self::ResponseInProgress { .. } => "response.in_progress",
Self::ResponseCompleted { .. } => "response.completed",
Self::ResponseFailed { .. } => "response.failed",
Self::ResponseIncomplete { .. } => "response.incomplete",
Self::ResponseOutputItemAdded { .. } => "response.output_item.added",
Self::OutputItemDone { .. } => "response.output_item.done",
Self::ContentPartAdded { .. } => "response.content_part.added",
Self::ContentPartDone { .. } => "response.content_part.done",
Self::ResponseOutputTextDelta { .. } => "response.output_text.delta",
Self::OutputTextDone { .. } => "response.output_text.done",
Self::ResponseFunctionCallArgumentsDelta { .. } => {
"response.function_call_arguments.delta"
}
Self::ResponseFunctionCallArgumentsDone { .. } => {
"response.function_call_arguments.done"
}
Self::ResponseReasoningTextDelta { .. } => "response.reasoning_text.delta",
Self::ResponseReasoningSummaryTextDelta { .. } => {
"response.reasoning_summary_text.delta"
}
Self::ReasoningSummaryTextDone { .. } => "response.reasoning_summary_text.done",
Self::ResponseError { .. } => "error",
Self::Other(v) => v.get("type").and_then(|t| t.as_str()).unwrap_or("unknown"),
}
}
}