1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
//! Provider configuration trait
//!
//! Defines the configuration interface for all AI providers
use Debug;
/// Provider configuration trait
///
/// All provider configurations must implement this trait to ensure consistent
/// validation and access to common settings.
///
/// # Design Principles
/// - Type-safe configuration management
/// - Validation before provider initialization
/// - Common settings abstraction (API key, timeout, retries)
/// - Clone and Debug for testability
///
/// # Example
/// ```rust
/// use std::time::Duration;
/// use litellm_rs::core::traits::provider::ProviderConfig;
///
/// #[derive(Debug, Clone)]
/// struct MyProviderConfig {
/// api_key: String,
/// api_base: Option<String>,
/// timeout_secs: u64,
/// max_retries: u32,
/// }
///
/// impl ProviderConfig for MyProviderConfig {
/// fn validate(&self) -> Result<(), String> {
/// if self.api_key.is_empty() {
/// return Err("API key is required".to_string());
/// }
/// Ok(())
/// }
///
/// fn api_key(&self) -> Option<&str> {
/// Some(&self.api_key)
/// }
///
/// fn api_base(&self) -> Option<&str> {
/// self.api_base.as_deref()
/// }
///
/// fn timeout(&self) -> Duration {
/// Duration::from_secs(self.timeout_secs)
/// }
///
/// fn max_retries(&self) -> u32 {
/// self.max_retries
/// }
/// }
/// ```