use super::model::{Interaction, InteractionStatus, Step};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "event_type", rename_all = "snake_case")]
pub enum InteractionSseEvent {
#[serde(rename = "interaction.created")]
InteractionCreated {
interaction: Interaction,
#[serde(default, skip_serializing_if = "Option::is_none")]
event_id: Option<String>,
},
#[serde(rename = "interaction.completed")]
InteractionCompleted {
interaction: Interaction,
#[serde(default, skip_serializing_if = "Option::is_none")]
event_id: Option<String>,
},
#[serde(rename = "interaction.status_update")]
InteractionStatusUpdate {
interaction_id: String,
status: InteractionStatus,
#[serde(default, skip_serializing_if = "Option::is_none")]
event_id: Option<String>,
},
#[serde(rename = "step.start")]
StepStart {
index: i64,
step: Step,
#[serde(default, skip_serializing_if = "Option::is_none")]
event_id: Option<String>,
},
#[serde(rename = "step.delta")]
StepDelta {
index: i64,
delta: StepDelta,
#[serde(default, skip_serializing_if = "Option::is_none")]
event_id: Option<String>,
},
#[serde(rename = "step.stop")]
StepStop {
index: i64,
#[serde(default, skip_serializing_if = "Option::is_none")]
event_id: Option<String>,
},
Error {
error: InteractionStreamError,
#[serde(default, skip_serializing_if = "Option::is_none")]
event_id: Option<String>,
},
#[serde(untagged)]
Other(serde_json::Value),
}
impl InteractionSseEvent {
pub fn text_delta(&self) -> Option<&str> {
match self {
InteractionSseEvent::StepDelta { delta: StepDelta::Text { text }, .. } => Some(text),
_ => None,
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum StepDelta {
Text {
text: String,
},
FunctionCall {
#[serde(default, skip_serializing_if = "Option::is_none")]
arguments_delta: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
id: Option<String>,
},
#[serde(untagged)]
Other(serde_json::Value),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct InteractionStreamError {
#[serde(default)]
pub message: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
}