gemini_bridge 0.1.1

Types and functions to interact with Gemini AI API
Documentation
use text::text_generator::{TextGenerator, TextGeneratorImpl};

mod config;
pub mod text;

pub struct GeminiRs();

impl GeminiRs {
    pub fn new_text_generator(model: String) -> Box<dyn TextGenerator> {
        Box::new(TextGeneratorImpl {
            uri: build_uri(
                config::Config::from_env().unwrap().api_key.to_owned(),
                model,
            ),
        })
    }
}

fn build_uri(api_key: String, model: String) -> String {
    format!(
        "https://generativelanguage.googleapis.com/v1beta/models/{}:generateContent?key={}",
        model, api_key
    )
    // return "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent?key=".to_owned();
}

#[cfg(test)]
mod tests {
    use text::request::{Content, Part, RequestBody};

    use super::*;

    #[tokio::test]
    async fn test_api_call() {
        let gen = GeminiRs::new_text_generator("gemini-1.5-flash-latest".to_owned());
        let res = gen
            .generate_content(RequestBody {
                contents: vec![Content {
                    parts: vec![Part {
                        text: "send me a test response".to_owned(),
                    }],
                }],
                safety_settings: None,
                generation_config: None,
            })
            .await;

        if res.is_ok() {
            let text = res.unwrap();
            assert!(text.candidates.len() > 0);
            return;
        }

        panic!("Error: {:?}", res.err().unwrap());
    }
}