use crate::client::macros::http_client;
use crate::driver::Model;
use crate::error::ProviderError;
use crate::model::ModelList;
use crate::providers::gemini::GeminiConfig;
use crate::providers::gemini::cached_content::CachedContents;
use crate::providers::gemini::completion::GenerateContent;
use crate::providers::gemini::embedding::Embeddings;
#[cfg(feature = "image")]
use crate::providers::gemini::image_generation::Images;
use crate::providers::gemini::interactions_api::{InteractionResume, Interactions};
use crate::providers::gemini::transcription::Transcriptions;
http_client!(
Gemini,
GeminiConfig
);
impl Gemini {
#[cfg(feature = "reqwest")]
#[cfg_attr(docsrs, doc(cfg(feature = "reqwest")))]
pub fn new(api_key: impl Into<crate::wire::Secret>) -> Self {
GeminiConfig::new(api_key).client()
}
#[cfg(feature = "reqwest")]
#[cfg_attr(docsrs, doc(cfg(feature = "reqwest")))]
pub fn from_env() -> Result<Self, crate::client::env::EnvError> {
Ok(GeminiConfig::from_env()?.client())
}
pub fn completion(&self, model: impl Into<String>) -> Model<GenerateContent> {
self.model(self.config.completion(model))
}
pub fn interactions(&self, model: impl Into<String>) -> Model<Interactions> {
self.model(self.config.interactions(model))
}
pub fn embedding(&self, model: impl Into<String>, ndims: Option<usize>) -> Model<Embeddings> {
self.model(self.config.embedding(model, ndims))
}
pub fn transcription(&self, model: impl Into<String>) -> Model<Transcriptions> {
self.model(self.config.transcription(model))
}
#[cfg(feature = "image")]
#[cfg_attr(docsrs, doc(cfg(feature = "image")))]
pub fn image_generation(&self, model: impl Into<String>) -> Model<Images> {
self.model(self.config.image_generation(model))
}
pub fn cached_contents(&self) -> Model<CachedContents> {
self.model(self.config.cached_contents())
}
pub fn interaction(&self, interaction_id: impl Into<String>) -> Model<InteractionResume> {
self.model(InteractionResume::new(self.config.clone(), interaction_id))
}
pub fn interaction_resumed(
&self,
interaction_id: impl Into<String>,
last_event_id: Option<&str>,
) -> Model<InteractionResume> {
let wire = InteractionResume::new(self.config.clone(), interaction_id);
self.model(match last_event_id {
Some(last_event_id) => wire.after_event(last_event_id),
None => wire,
})
}
pub async fn list_models(&self) -> Result<ModelList, ProviderError> {
self.model(self.config.models()).list().await
}
pub async fn verify(&self) -> Result<(), ProviderError> {
self.model(self.config.verify()).verify().await
}
}