mod private
{
use crate::
{
client ::Client,
error ::Result,
environment ::{ OpenaiEnvironment, EnvironmentInterface },
};
use crate::components::images::
{
ImagesResponse,
CreateImageEditRequest,
CreateImageVariationRequest,
};
use reqwest::multipart::{ Form, Part };
#[ derive( Debug, Clone ) ]
pub struct Images< 'client, E >
where
E : OpenaiEnvironment + EnvironmentInterface + Send + Sync + 'static,
{
client : &'client Client< E >,
}
impl< 'client, E > Images< 'client, E >
where
E : OpenaiEnvironment + EnvironmentInterface + Send + Sync + 'static,
{
#[ inline ]
pub(crate) fn new( client : &'client Client< E > ) -> Self
{
Self { client }
}
#[ inline ]
pub async fn generate( &self, request : serde_json::Value ) -> Result< ImagesResponse >
{
self.client.post( "images/generations", &request ).await
}
#[ inline ]
pub async fn edit( &self, request : CreateImageEditRequest ) -> Result< ImagesResponse >
{
let image_part = Part::bytes( request.image )
.file_name( request.image_filename.clone() )
.mime_str( "image/png" )
.map_err( | e | crate::error::OpenAIError::Internal( format!( "Failed to create image part : {e}" ) ) )?;
let mut form = Form::new()
.part( "image", image_part )
.text( "prompt", request.prompt );
if let Some( mask_data ) = request.mask
{
if let Some( mask_filename ) = request.mask_filename
{
let mask_part = Part::bytes( mask_data )
.file_name( mask_filename )
.mime_str( "image/png" )
.map_err( | e | crate::error::OpenAIError::Internal( format!( "Failed to create mask part : {e}" ) ) )?;
form = form.part( "mask", mask_part );
}
}
if let Some( model ) = request.model
{
form = form.text( "model", model );
}
if let Some( n ) = request.n
{
form = form.text( "n", n.to_string() );
}
if let Some( size ) = request.size
{
form = form.text( "size", size );
}
if let Some( response_format ) = request.response_format
{
form = form.text( "response_format", response_format );
}
if let Some( user ) = request.user
{
form = form.text( "user", user );
}
let path = "/images/edits";
self.client.post_multipart( path, form ).await
}
#[ inline ]
pub async fn variation( &self, request : CreateImageVariationRequest ) -> Result< ImagesResponse >
{
let image_part = Part::bytes( request.image )
.file_name( request.image_filename.clone() )
.mime_str( "image/png" )
.map_err( | e | crate::error::OpenAIError::Internal( format!( "Failed to create image part : {e}" ) ) )?;
let mut form = Form::new()
.part( "image", image_part );
if let Some( model ) = request.model
{
form = form.text( "model", model );
}
if let Some( n ) = request.n
{
form = form.text( "n", n.to_string() );
}
if let Some( response_format ) = request.response_format
{
form = form.text( "response_format", response_format );
}
if let Some( size ) = request.size
{
form = form.text( "size", size );
}
if let Some( user ) = request.user
{
form = form.text( "user", user );
}
let path = "/images/variations";
self.client.post_multipart( path, form ).await
}
}
}
crate ::mod_interface!
{
exposed use
{
Images,
};
}