From 9ef4b614a7cc397cc60e89420d7029d1b83d72a2 Mon Sep 17 00:00:00 2001 From: Jeremy Chone Date: Sat, 8 Jun 2024 19:15:05 -0700 Subject: [PATCH] . clippy clean + resolver fn renaming --- README.md | 12 ++++--- examples/c00-readme.rs | 3 +- .../{c02-auth-resolver.rs => c02-auth.rs} | 2 +- src/resolver/auth_resolver.rs | 35 +++++++++---------- 4 files changed, 27 insertions(+), 25 deletions(-) rename examples/{c02-auth-resolver.rs => c02-auth.rs} (96%) diff --git a/README.md b/README.md index 284e925..09d866f 100644 --- a/README.md +++ b/README.md @@ -48,22 +48,23 @@ The goal of this library is to provide a common and ergonomic single API to many [`examples/c00-readme.rs`](examples/c00-readme.rs) ```rust -mod support; // For examples support funtions -use crate::support::{has_env, print_chat_stream}; - use genai::chat::{ChatMessage, ChatRequest}; use genai::client::Client; +use genai::utils::print_chat_stream; const MODEL_OPENAI: &str = "gpt-3.5-turbo"; const MODEL_ANTHROPIC: &str = "claude-3-haiku-20240307"; -const MODEL_COHERE: &str = "command-light"; // see: https://docs.cohere.com/docs/models +const MODEL_COHERE: &str = "command-light"; +const MODEL_GEMINI: &str = "gemini-1.5-flash-latest"; const MODEL_OLLAMA: &str = "mixtral"; +// NOTE: Those are the default env keys for each AI Provider type. const MODEL_AND_KEY_ENV_NAME_LIST: &[(&str, &str)] = &[ // -- de/activate models/providers (MODEL_OPENAI, "OPENAI_API_KEY"), (MODEL_ANTHROPIC, "ANTHROPIC_API_KEY"), (MODEL_COHERE, "COHERE_API_KEY"), + (MODEL_GEMINI, "GEMINI_API_KEY"), (MODEL_OLLAMA, ""), ]; @@ -71,6 +72,7 @@ const MODEL_AND_KEY_ENV_NAME_LIST: &[(&str, &str)] = &[ // - starts_with "gpt" -> OpenAI // - starts_with "claude" -> Anthropic // - starts_with "command" -> Cohere +// - starts_with "gemini" -> Gemini // - For anything else -> Ollama // // Refined mapping rules will be added later and extended as provider support grows. @@ -89,7 +91,7 @@ async fn main() -> Result<(), Box> { for (model, env_name) in MODEL_AND_KEY_ENV_NAME_LIST { // Skip if does not have the environment name set - if !env_name.is_empty() && !has_env(env_name) { + if !env_name.is_empty() && std::env::var(env_name).is_err() { continue; } diff --git a/examples/c00-readme.rs b/examples/c00-readme.rs index bd33653..ce3c75d 100644 --- a/examples/c00-readme.rs +++ b/examples/c00-readme.rs @@ -8,6 +8,7 @@ const MODEL_COHERE: &str = "command-light"; const MODEL_GEMINI: &str = "gemini-1.5-flash-latest"; const MODEL_OLLAMA: &str = "mixtral"; +// NOTE: Those are the default env keys for each AI Provider type. const MODEL_AND_KEY_ENV_NAME_LIST: &[(&str, &str)] = &[ // -- de/activate models/providers (MODEL_OPENAI, "OPENAI_API_KEY"), @@ -32,7 +33,7 @@ async fn main() -> Result<(), Box> { let chat_req = ChatRequest::new(vec![ // -- Messages (de/activate to see the differences) - ChatMessage::system("Answer in one sentence"), + // ChatMessage::system("Answer in one sentence"), ChatMessage::user(question), ]); diff --git a/examples/c02-auth-resolver.rs b/examples/c02-auth.rs similarity index 96% rename from examples/c02-auth-resolver.rs rename to examples/c02-auth.rs index 12dd3bf..d70b820 100644 --- a/examples/c02-auth-resolver.rs +++ b/examples/c02-auth.rs @@ -16,7 +16,7 @@ async fn main() -> Result<(), Box> { ]; // -- Build a auth_resolver and the AdapterConfig - let auth_resolver = AuthResolver::from_provider_sync( + let auth_resolver = AuthResolver::from_sync_resolver( |kind: AdapterKind, _config_set: &ConfigSet<'_>| -> Result, genai::Error> { println!("\n>> Custom auth provider for {kind} <<"); let key = std::env::var("OPENAI_API_KEY").map_err(|_| genai::Error::ApiKeyEnvNotFound { diff --git a/src/resolver/auth_resolver.rs b/src/resolver/auth_resolver.rs index 1a03c4a..c1ad652 100644 --- a/src/resolver/auth_resolver.rs +++ b/src/resolver/auth_resolver.rs @@ -2,7 +2,7 @@ //! It can take the following forms: //! - Configured with a custom environment name, //! - Contain a fixed auth value, -//! - Contain an `AuthDataProvider` trait object or closure that will be called to return the AuthData. +//! - Contain an `AuthResolverFnSync` trait object or closure that will be called to return the AuthData. //! //! Note: AuthData is typically a single value but can be Multi for future adapters (e.g., AWS Berock). @@ -30,47 +30,47 @@ impl AuthResolver { } } - pub fn from_provider_sync(provider: impl IntoAuthDataProviderSync) -> Self { + pub fn from_sync_resolver(resolver_fn: impl IntoSyncAuthResolverFn) -> Self { AuthResolver { - inner: AuthResolverInner::SyncProvider(provider.into_provider()), + inner: AuthResolverInner::ResolverFnSync(resolver_fn.into_sync_resolver_fn()), } } } // region: --- AuthDataProvider & IntoAuthDataProvider -pub trait AuthDataProviderSync: Send + Sync { - fn provide_auth_data_sync(&self, adapter_kind: AdapterKind, config_set: &ConfigSet) -> Result>; +pub trait SyncAuthResolverFn: Send + Sync { + fn exec_sync_resolver_fn(&self, adapter_kind: AdapterKind, config_set: &ConfigSet) -> Result>; } // Define a trait for types that can be converted into Arc -pub trait IntoAuthDataProviderSync { - fn into_provider(self) -> Arc; +pub trait IntoSyncAuthResolverFn { + fn into_sync_resolver_fn(self) -> Arc; } // Implement IntoProvider for Arc -impl IntoAuthDataProviderSync for Arc { - fn into_provider(self) -> Arc { +impl IntoSyncAuthResolverFn for Arc { + fn into_sync_resolver_fn(self) -> Arc { self } } // Implement IntoProvider for closures -impl IntoAuthDataProviderSync for F +impl IntoSyncAuthResolverFn for F where F: Fn(AdapterKind, &ConfigSet) -> Result> + Send + Sync + 'static, { - fn into_provider(self) -> Arc { + fn into_sync_resolver_fn(self) -> Arc { Arc::new(self) } } // Implement AuthDataProviderSync for closures -impl AuthDataProviderSync for F +impl SyncAuthResolverFn for F where F: Fn(AdapterKind, &ConfigSet) -> Result> + Send + Sync, { - fn provide_auth_data_sync(&self, adapter_kind: AdapterKind, config_set: &ConfigSet) -> Result> { + fn exec_sync_resolver_fn(&self, adapter_kind: AdapterKind, config_set: &ConfigSet) -> Result> { self(adapter_kind, config_set) } } @@ -87,8 +87,8 @@ impl AuthResolver { Ok(Some(AuthData::from_single(key))) } AuthResolverInner::Fixed(auth_data) => Ok(Some(auth_data.clone())), - AuthResolverInner::SyncProvider(sync_provider) => { - sync_provider.provide_auth_data_sync(adapter_kind, config_set) + AuthResolverInner::ResolverFnSync(sync_provider) => { + sync_provider.exec_sync_resolver_fn(adapter_kind, config_set) } } } @@ -98,7 +98,7 @@ enum AuthResolverInner { EnvName(String), Fixed(AuthData), #[allow(unused)] // future - SyncProvider(Arc), + ResolverFnSync(Arc), } // impl debug for AuthResolverInner @@ -107,7 +107,7 @@ impl std::fmt::Debug for AuthResolverInner { match self { AuthResolverInner::EnvName(env_name) => write!(f, "AuthResolverInner::EnvName({})", env_name), AuthResolverInner::Fixed(auth_data) => write!(f, "AuthResolverInner::Fixed({:?})", auth_data), - AuthResolverInner::SyncProvider(_) => write!(f, "AuthResolverInner::SyncFn(...)"), + AuthResolverInner::ResolverFnSync(_) => write!(f, "AuthResolverInner::FnSync(...)"), } } } @@ -117,7 +117,6 @@ impl std::fmt::Debug for AuthResolverInner { #[derive(Clone)] pub enum AuthData { Single(String), - // TODO: Probable needs a HashMap Multi(HashMap), }