mod fal;
mod openai;
mod store;
mod types;
use async_trait::async_trait;
pub(crate) use fal::FAL_DEFAULT_BASE;
pub use fal::FalImageProvider;
pub use openai::OpenAiImageProvider;
pub use store::{FsImageStore, ImageSink};
pub use types::{GeneratedImage, ImageGenRequest, ImageGenResult, ImageSize};
#[derive(Debug, thiserror::Error)]
pub enum ImageGenError {
#[error("image generation requires a model")]
MissingModel,
#[error("bad image response: {0}")]
BadResponse(String),
#[error("provider error ({status}): {body}")]
Http {
status: u16,
body: String,
},
#[error("transport error: {0}")]
Transport(String),
#[error("image store error: {0}")]
Store(String),
#[error("base64 decode error: {0}")]
Base64(String),
#[error("operation timed out: {context}")]
Timeout {
context: String,
},
}
#[async_trait]
pub trait ImageGenProvider: Send + Sync {
fn name(&self) -> &'static str;
async fn generate(&self, req: &ImageGenRequest) -> Result<ImageGenResult, ImageGenError>;
}