use crate::
{
error::Result,
vision::{ Vision, ImageInput, CaptionResult },
environment::HuggingFaceEnvironment,
};
use serde::{ Serialize, Deserialize };
#[ derive( Debug, Serialize ) ]
struct CaptioningRequest
{
inputs : String,
}
#[ derive( Debug, Deserialize ) ]
#[ serde( untagged ) ]
enum CaptioningResponse
{
Single( CaptionResult ),
Multiple( Vec< CaptionResult > ),
}
impl< E > Vision< E >
where
E : HuggingFaceEnvironment + crate::environment::EnvironmentInterface + Send + Sync + 'static + Clone,
{
#[ inline ]
pub async fn caption_image(
&self,
image : ImageInput,
model : impl AsRef< str >
) -> Result< String >
{
let request = CaptioningRequest
{
inputs : image.to_base64(),
};
let endpoint = format!( "/models/{}", model.as_ref() );
let url = self.client.environment.endpoint_url( &endpoint )?;
let response : CaptioningResponse = self.client
.post( url.as_str(), &request )
.await?;
let caption = match response
{
CaptioningResponse::Single( result ) => result.generated_text,
CaptioningResponse::Multiple( results ) =>
{
results
.into_iter()
.next()
.map( | r | r.generated_text )
.unwrap_or_default()
}
};
Ok( caption )
}
}