serdes_ai_providers/
lib.rs1mod provider;
52mod registry;
53
54#[cfg(feature = "anthropic")]
56mod anthropic;
57#[cfg(feature = "azure")]
58mod azure;
59#[cfg(feature = "google")]
60mod google;
61#[cfg(feature = "groq")]
62mod groq;
63#[cfg(feature = "mistral")]
64mod mistral;
65#[cfg(feature = "ollama")]
66mod ollama;
67#[cfg(feature = "openai")]
68mod openai;
69
70mod compatible;
72
73mod gateway;
75
76pub mod oauth;
78pub use oauth::config::{chatgpt_oauth_config, claude_code_oauth_config};
79pub use oauth::{
80 refresh_token, run_pkce_flow, OAuthConfig, OAuthContext, OAuthError, TokenResponse,
81};
82
83pub use provider::*;
85pub use registry::*;
86
87#[cfg(feature = "anthropic")]
88pub use anthropic::AnthropicProvider;
89#[cfg(feature = "azure")]
90pub use azure::AzureProvider;
91#[cfg(feature = "google")]
92pub use google::{GoogleProvider, VertexAIProvider};
93#[cfg(feature = "groq")]
94pub use groq::GroqProvider;
95#[cfg(feature = "mistral")]
96pub use mistral::MistralProvider;
97#[cfg(feature = "ollama")]
98pub use ollama::OllamaProvider;
99#[cfg(feature = "openai")]
100pub use openai::OpenAIProvider;
101
102pub use compatible::{
104 CohereProvider, DeepSeekProvider, FireworksProvider, OpenRouterProvider, TogetherProvider,
105};
106
107pub use gateway::{GatewayConfig, GatewayProvider};
109
110use std::sync::Arc;
111
112pub fn from_env() -> ProviderRegistry {
116 let registry = ProviderRegistry::new();
117
118 #[cfg(feature = "openai")]
119 if let Ok(provider) = OpenAIProvider::from_env() {
120 registry.register(Arc::new(provider));
121 }
122
123 #[cfg(feature = "anthropic")]
124 if let Ok(provider) = AnthropicProvider::from_env() {
125 registry.register(Arc::new(provider));
126 }
127
128 #[cfg(feature = "google")]
129 if let Ok(provider) = GoogleProvider::from_env() {
130 registry.register(Arc::new(provider));
131 }
132
133 #[cfg(feature = "azure")]
134 if let Ok(provider) = AzureProvider::from_env() {
135 registry.register(Arc::new(provider));
136 }
137
138 #[cfg(feature = "groq")]
139 if let Ok(provider) = GroqProvider::from_env() {
140 registry.register(Arc::new(provider));
141 }
142
143 #[cfg(feature = "mistral")]
144 if let Ok(provider) = MistralProvider::from_env() {
145 registry.register(Arc::new(provider));
146 }
147
148 #[cfg(feature = "ollama")]
149 if let Ok(provider) = OllamaProvider::from_env() {
150 registry.register(Arc::new(provider));
151 }
152
153 if let Ok(provider) = TogetherProvider::from_env() {
155 registry.register(Arc::new(provider));
156 }
157
158 if let Ok(provider) = FireworksProvider::from_env() {
159 registry.register(Arc::new(provider));
160 }
161
162 if let Ok(provider) = DeepSeekProvider::from_env() {
163 registry.register(Arc::new(provider));
164 }
165
166 if let Ok(provider) = OpenRouterProvider::from_env() {
167 registry.register(Arc::new(provider));
168 }
169
170 if let Ok(provider) = CohereProvider::from_env() {
171 registry.register(Arc::new(provider));
172 }
173
174 if let Ok(provider) = GatewayProvider::portkey_from_env() {
176 registry.register(Arc::new(provider));
177 }
178
179 if let Ok(provider) = GatewayProvider::litellm_from_env() {
180 registry.register(Arc::new(provider));
181 }
182
183 if let Ok(provider) = GatewayProvider::helicone_from_env() {
184 registry.register(Arc::new(provider));
185 }
186
187 if let Ok(provider) = GatewayProvider::from_env() {
188 registry.register(Arc::new(provider));
189 }
190
191 registry
192}
193
194pub fn infer(model_string: &str) -> Result<(BoxedProvider, String), ProviderError> {
202 let registry = from_env();
203 registry.infer_provider(model_string)
204}
205
206pub mod prelude {
208 pub use crate::{
209 from_env, global_registry, infer, BoxedProvider, GatewayProvider, Provider, ProviderConfig,
210 ProviderError, ProviderRegistry,
211 };
212
213 #[cfg(feature = "anthropic")]
214 pub use crate::AnthropicProvider;
215 #[cfg(feature = "groq")]
216 pub use crate::GroqProvider;
217 #[cfg(feature = "ollama")]
218 pub use crate::OllamaProvider;
219 #[cfg(feature = "openai")]
220 pub use crate::OpenAIProvider;
221 #[cfg(feature = "google")]
222 pub use crate::{GoogleProvider, VertexAIProvider};
223}
224
225#[cfg(test)]
226mod tests {
227 use super::*;
228
229 #[test]
230 fn test_from_env_creates_registry() {
231 let registry = from_env();
232 let providers = registry.list();
234 let _ = providers;
237 }
238
239 #[test]
240 fn test_global_registry() {
241 let registry = global_registry();
242 let _ = registry.list();
244 }
245}