use crate::error::Error;
use super::super::ModelApi;
#[ derive( Debug ) ]
pub struct GenerationRequestBuilder< 'a >
{
model : &'a ModelApi< 'a >,
request : crate::models::GenerateContentRequest,
}
impl< 'a > GenerationRequestBuilder< 'a >
{
#[ inline ]
#[ must_use ]
pub fn new( model : &'a ModelApi< 'a > ) -> Self
{
Self {
model,
request : crate::models::GenerateContentRequest {
contents : vec![],
generation_config : None,
safety_settings : None,
tools : None,
tool_config : None,
system_instruction : None,
cached_content : None,
},
}
}
#[ inline ]
#[ must_use ]
pub fn with_prompt( mut self, prompt : &str ) -> Self
{
self.request.contents = vec![ crate::models::Content {
parts : vec![ crate::models::Part {
text : Some( prompt.to_string() ),
..Default::default()
} ],
role : "user".to_string(),
} ];
self
}
#[ inline ]
#[ must_use ]
pub fn with_temperature( mut self, temperature : f32 ) -> Self
{
self.ensure_generation_config();
if let Some( ref mut config ) = self.request.generation_config
{
config.temperature = Some( temperature );
}
self
}
#[ inline ]
#[ must_use ]
pub fn with_max_tokens( mut self, max_tokens : i32 ) -> Self
{
self.ensure_generation_config();
if let Some( ref mut config ) = self.request.generation_config
{
config.max_output_tokens = Some( max_tokens );
}
self
}
#[ inline ]
#[ must_use ]
pub fn with_stop_sequences( mut self, stop_sequences : Vec< String > ) -> Self
{
self.ensure_generation_config();
if let Some( ref mut config ) = self.request.generation_config
{
config.stop_sequences = Some( stop_sequences );
}
self
}
#[ inline ]
pub async fn execute( self ) -> Result< crate::models::GenerateContentResponse, Error >
{
self.model.generate_content( &self.request ).await
}
#[ inline ]
pub async fn execute_text( self ) -> Result< String, Error >
{
let model_id = self.model.model_id.clone();
let response = self.execute().await?;
response.candidates
.first()
.and_then( |candidate| candidate.content.parts.first() )
.and_then( |part| part.text.as_ref() )
.cloned()
.ok_or_else( || Error::ApiError(
format!( "No text content returned from model '{model_id}'." )
) )
}
#[ inline ]
fn ensure_generation_config( &mut self )
{
if self.request.generation_config.is_none()
{
self.request.generation_config = Some( crate::models::GenerationConfig::default() );
}
}
}