rig_core/client/
gemini.rs1use crate::client::macros::http_client;
5use crate::driver::Model;
6use crate::error::ProviderError;
7use crate::model::ModelList;
8
9use crate::providers::gemini::GeminiConfig;
10#[cfg(feature = "audio")]
11use crate::providers::gemini::audio_generation::Speech;
12use crate::providers::gemini::cached_content::CachedContents;
13use crate::providers::gemini::completion::GenerateContent;
14use crate::providers::gemini::embedding::Embeddings;
15#[cfg(feature = "image")]
16use crate::providers::gemini::image_generation::Images;
17use crate::providers::gemini::interactions_api::{InteractionResume, Interactions};
18use crate::providers::gemini::transcription::Transcriptions;
19
20http_client!(
21 Gemini,
24 GeminiConfig
25);
26
27impl Gemini {
28 #[cfg(feature = "reqwest")]
31 #[cfg_attr(docsrs, doc(cfg(feature = "reqwest")))]
32 pub fn new(api_key: impl Into<crate::wire::Secret>) -> Self {
33 GeminiConfig::new(api_key).client()
34 }
35
36 #[cfg(feature = "reqwest")]
38 #[cfg_attr(docsrs, doc(cfg(feature = "reqwest")))]
39 pub fn from_env() -> Result<Self, crate::client::env::EnvError> {
40 Ok(GeminiConfig::from_env()?.client())
41 }
42
43 pub fn completion(&self, model: impl Into<String>) -> Model<GenerateContent> {
45 self.model(self.config.completion(model))
46 }
47
48 pub fn interactions(&self, model: impl Into<String>) -> Model<Interactions> {
50 self.model(self.config.interactions(model))
51 }
52
53 pub fn embedding(&self, model: impl Into<String>, ndims: Option<usize>) -> Model<Embeddings> {
56 self.model(self.config.embedding(model, ndims))
57 }
58
59 pub fn transcription(&self, model: impl Into<String>) -> Model<Transcriptions> {
61 self.model(self.config.transcription(model))
62 }
63
64 #[cfg(feature = "image")]
66 #[cfg_attr(docsrs, doc(cfg(feature = "image")))]
67 pub fn image_generation(&self, model: impl Into<String>) -> Model<Images> {
68 self.model(self.config.image_generation(model))
69 }
70
71 #[cfg(feature = "audio")]
73 #[cfg_attr(docsrs, doc(cfg(feature = "audio")))]
74 pub fn audio_generation(&self, model: impl Into<String>) -> Model<Speech> {
75 self.model(self.config.audio_generation(model))
76 }
77
78 pub fn cached_contents(&self) -> Model<CachedContents> {
80 self.model(self.config.cached_contents())
81 }
82
83 pub fn interaction(&self, interaction_id: impl Into<String>) -> Model<InteractionResume> {
87 self.model(InteractionResume::new(self.config.clone(), interaction_id))
88 }
89
90 pub fn interaction_resumed(
93 &self,
94 interaction_id: impl Into<String>,
95 last_event_id: Option<&str>,
96 ) -> Model<InteractionResume> {
97 let wire = InteractionResume::new(self.config.clone(), interaction_id);
98 self.model(match last_event_id {
99 Some(last_event_id) => wire.after_event(last_event_id),
100 None => wire,
101 })
102 }
103
104 pub async fn list_models(&self) -> Result<ModelList, ProviderError> {
106 self.model(self.config.models()).list().await
107 }
108
109 pub async fn verify(&self) -> Result<(), ProviderError> {
112 self.model(self.config.verify()).verify().await
113 }
114}