mod private
{
use crate::
{
client ::Client,
environment ::{ OpenaiEnvironment, EnvironmentInterface },
error ::Result,
diagnostics ::DiagnosticsCollector,
request_cache ::{ ApiRequestCache, CacheConfig },
};
#[ cfg( feature = "retry" ) ]
use crate::enhanced_retry::{ EnhancedRetryConfig };
#[ cfg( feature = "circuit_breaker" ) ]
use crate::enhanced_circuit_breaker::{ EnhancedCircuitBreakerConfig, EnhancedCircuitBreaker };
#[ cfg( feature = "rate_limiting" ) ]
use crate::enhanced_rate_limiting::{ EnhancedRateLimitingConfig, EnhancedRateLimiter };
use reqwest::Client as HttpClient;
use std::sync::Arc;
impl< E > Client< E >
where
E : OpenaiEnvironment + EnvironmentInterface + Send + Sync + 'static, {
#[ inline ]
pub fn build( environment : E ) -> Result< Self >
{
let headers = environment.headers()?;
let http_client = HttpClient::builder()
.default_headers( headers )
.timeout( core::time::Duration::from_secs( 300 ) ) .connect_timeout( core::time::Duration::from_secs( 30 ) ) .pool_max_idle_per_host( 10 ) .pool_idle_timeout( core::time::Duration::from_secs( 90 ) ) .tcp_keepalive( core::time::Duration::from_secs( 60 ) ) .build()?;
let diagnostics = environment.diagnostics_config()
.map( |config| Arc::new( DiagnosticsCollector::new( config.clone() ) ) );
Ok( Self
{
http_client,
environment,
diagnostics,
cache : None,
#[ cfg( feature = "retry" ) ]
retry_config : None,
#[ cfg( feature = "circuit_breaker" ) ]
circuit_breaker_config : None,
#[ cfg( feature = "circuit_breaker" ) ]
circuit_breaker : None,
#[ cfg( feature = "rate_limiting" ) ]
rate_limiting_config : None,
#[ cfg( feature = "rate_limiting" ) ]
rate_limiter : None,
})
}
#[ inline ]
#[ must_use ]
pub fn with_cache( mut self ) -> Self
{
self.cache = Some( Arc::new( ApiRequestCache::new_api_cache() ) );
self
}
#[ inline ]
#[ must_use ]
pub fn with_cache_config( mut self, config : CacheConfig ) -> Self
{
self.cache = Some( Arc::new( ApiRequestCache::with_config( config ) ) );
self
}
#[ inline ]
pub fn cache_statistics( &self ) -> Option< &crate::request_cache::CacheStatistics >
{
self.cache.as_ref().map( |cache| cache.statistics() )
}
#[ inline ]
pub async fn clear_cache( &self )
{
if let Some( cache ) = &self.cache
{
cache.clear().await;
}
}
#[ cfg( feature = "retry" ) ]
#[ inline ]
#[ must_use ]
pub fn with_retry( mut self ) -> Self
{
self.retry_config = Some( EnhancedRetryConfig::default() );
self
}
#[ cfg( feature = "retry" ) ]
#[ inline ]
#[ must_use ]
pub fn with_retry_config( mut self, config : EnhancedRetryConfig ) -> Self
{
self.retry_config = Some( config );
self
}
#[ cfg( feature = "retry" ) ]
#[ inline ]
pub fn retry_config( &self ) -> Option< &EnhancedRetryConfig >
{
self.retry_config.as_ref()
}
#[ cfg( feature = "circuit_breaker" ) ]
#[ inline ]
#[ must_use ]
pub fn with_circuit_breaker( mut self ) -> Self
{
let config = EnhancedCircuitBreakerConfig::default();
self.circuit_breaker_config = Some( config.clone() );
#[ cfg( feature = "circuit_breaker" ) ]
{
self.circuit_breaker = EnhancedCircuitBreaker::new( config ).ok();
}
self
}
#[ cfg( feature = "circuit_breaker" ) ]
#[ inline ]
#[ must_use ]
pub fn with_circuit_breaker_config( mut self, config : EnhancedCircuitBreakerConfig ) -> Self
{
self.circuit_breaker_config = Some( config.clone() );
self.circuit_breaker = EnhancedCircuitBreaker::new( config ).ok();
self
}
#[ cfg( feature = "circuit_breaker" ) ]
#[ inline ]
pub fn circuit_breaker_config( &self ) -> Option< &EnhancedCircuitBreakerConfig >
{
self.circuit_breaker_config.as_ref()
}
#[ cfg( feature = "rate_limiting" ) ]
#[ inline ]
#[ must_use ]
pub fn with_rate_limiting( mut self ) -> Self
{
let config = EnhancedRateLimitingConfig::default();
self.rate_limiting_config = Some( config.clone() );
self.rate_limiter = EnhancedRateLimiter::new( config ).ok();
self
}
#[ cfg( feature = "rate_limiting" ) ]
#[ inline ]
#[ must_use ]
pub fn with_rate_limiting_config( mut self, config : EnhancedRateLimitingConfig ) -> Self
{
self.rate_limiting_config = Some( config.clone() );
self.rate_limiter = EnhancedRateLimiter::new( config ).ok();
self
}
#[ cfg( feature = "rate_limiting" ) ]
#[ inline ]
pub fn rate_limiting_config( &self ) -> Option< &EnhancedRateLimitingConfig >
{
self.rate_limiting_config.as_ref()
}
}
}