use crate::{
config::Config,
error::OpenAIError,
types::images::{
CreateImageEditRequest, CreateImageRequest, CreateImageVariationRequest, ImagesResponse,
},
Client, RequestOptions,
};
#[cfg(not(target_family = "wasm"))]
use crate::types::images::{ImageEditStream, ImageGenStream};
pub struct Images<'c, C: Config> {
client: &'c Client<C>,
pub(crate) request_options: RequestOptions,
}
impl<'c, C: Config> Images<'c, C> {
pub fn new(client: &'c Client<C>) -> Self {
Self {
client,
request_options: RequestOptions::new(),
}
}
#[crate::byot(T0 = serde::Serialize, R = serde::de::DeserializeOwned)]
pub async fn generate(
&self,
request: CreateImageRequest,
) -> Result<ImagesResponse, OpenAIError> {
self.client
.post("/images/generations", request, &self.request_options)
.await
}
#[cfg(not(target_family = "wasm"))]
#[crate::byot(
T0 = serde::Serialize,
R = serde::de::DeserializeOwned,
stream = "true",
where_clause = "R: std::marker::Send + 'static"
)]
#[allow(unused_mut)]
pub async fn generate_stream(
&self,
mut request: CreateImageRequest,
) -> Result<ImageGenStream, OpenAIError> {
#[cfg(not(feature = "byot"))]
{
if request.stream.is_some() && !request.stream.unwrap() {
return Err(OpenAIError::InvalidArgument(
"When stream is false, use Image::generate".into(),
));
}
request.stream = Some(true);
}
Ok(self
.client
.post_stream("/images/generations", request, &self.request_options)
.await)
}
#[crate::byot(
T0 = Clone,
R = serde::de::DeserializeOwned,
where_clause = "reqwest::multipart::Form: crate::traits::AsyncTryFrom<T0, Error = OpenAIError>",
)]
pub async fn edit(
&self,
request: CreateImageEditRequest,
) -> Result<ImagesResponse, OpenAIError> {
self.client
.post_form("/images/edits", request, &self.request_options)
.await
}
#[cfg(not(target_family = "wasm"))]
#[crate::byot(
T0 = Clone,
R = serde::de::DeserializeOwned,
stream = "true",
where_clause = "R: std::marker::Send + 'static, reqwest::multipart::Form: crate::traits::AsyncTryFrom<T0, Error = OpenAIError>"
)]
#[allow(unused_mut)]
pub async fn edit_stream(
&self,
mut request: CreateImageEditRequest,
) -> Result<ImageEditStream, OpenAIError> {
#[cfg(not(feature = "byot"))]
{
if let Some(stream) = request.stream {
if !stream {
return Err(OpenAIError::InvalidArgument(
"When stream is false, use Image::edit".into(),
));
}
}
request.stream = Some(true);
}
self.client
.post_form_stream("/images/edits", request, &self.request_options)
.await
}
#[crate::byot(
T0 = Clone,
R = serde::de::DeserializeOwned,
where_clause = "reqwest::multipart::Form: crate::traits::AsyncTryFrom<T0, Error = OpenAIError>",
)]
pub async fn create_variation(
&self,
request: CreateImageVariationRequest,
) -> Result<ImagesResponse, OpenAIError> {
self.client
.post_form("/images/variations", request, &self.request_options)
.await
}
}