use serde::{Deserialize, Serialize};
use crate::openai::create_image::types::{
OpenAiApiError, OpenAiImageBackground, OpenAiImageOutputFormat, OpenAiImageQuality,
OpenAiImageSize, OpenAiImageUsage,
};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct OpenAiCreateImageSseStreamBody {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub events: Vec<OpenAiCreateImageSseEvent>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct OpenAiCreateImageSseEvent {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub event: Option<String>,
pub data: OpenAiCreateImageSseData,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum OpenAiCreateImageSseData {
Event(ImageGenerationStreamEvent),
Done(String),
}
impl OpenAiCreateImageSseData {
pub fn is_done(&self) -> bool {
matches!(self, Self::Done(marker) if marker == "[DONE]")
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum ImageGenerationStreamEvent {
#[serde(rename = "image_generation.partial_image")]
PartialImage {
b64_json: String,
background: OpenAiImageBackground,
created_at: u64,
output_format: OpenAiImageOutputFormat,
partial_image_index: u32,
quality: OpenAiImageQuality,
size: OpenAiImageSize,
},
#[serde(rename = "image_generation.completed")]
Completed {
b64_json: String,
background: OpenAiImageBackground,
created_at: u64,
output_format: OpenAiImageOutputFormat,
quality: OpenAiImageQuality,
size: OpenAiImageSize,
usage: OpenAiImageUsage,
},
#[serde(rename = "error")]
Error { error: OpenAiApiError },
#[serde(rename = "keepalive")]
Keepalive {
#[serde(default, skip_serializing_if = "Option::is_none")]
sequence_number: Option<u64>,
},
}