1#[derive(Clone, Copy, Debug, PartialEq, Eq)]
8pub struct ProviderInfo {
9 pub id: &'static str,
11 pub name: &'static str,
13 pub api_key: Option<ApiKeyMethod>,
15 pub oauth: Option<&'static str>,
17}
18
19#[derive(Clone, Copy, Debug, PartialEq, Eq)]
21pub struct ApiKeyMethod {
22 pub name: &'static str,
24 pub env: &'static [&'static str],
26}
27
28const fn key(name: &'static str, env: &'static [&'static str]) -> Option<ApiKeyMethod> {
29 Some(ApiKeyMethod { name, env })
30}
31
32const fn provider(
33 id: &'static str,
34 name: &'static str,
35 api_key: Option<ApiKeyMethod>,
36 oauth: Option<&'static str>,
37) -> ProviderInfo {
38 ProviderInfo {
39 id,
40 name,
41 api_key,
42 oauth,
43 }
44}
45
46pub const PROVIDERS: &[ProviderInfo] = &[
48 provider(
49 "amazon-bedrock",
50 "Amazon Bedrock",
51 key("AWS credentials or bearer token", &[]),
52 None,
53 ),
54 provider(
55 "ant-ling",
56 "Ant Ling",
57 key("Ant Ling API key", &["ANT_LING_API_KEY"]),
58 None,
59 ),
60 provider(
61 "anthropic",
62 "Anthropic",
63 key(
64 "Anthropic API key",
65 &[
66 "ANTHROPIC_AUTH_TOKEN",
67 "ANTHROPIC_OAUTH_TOKEN",
68 "ANTHROPIC_API_KEY",
69 ],
70 ),
71 Some("Anthropic (Claude Pro/Max)"),
72 ),
73 provider(
74 "azure-openai-responses",
75 "Azure OpenAI",
76 key("Azure OpenAI API key", &["AZURE_OPENAI_API_KEY"]),
77 None,
78 ),
79 provider(
80 "baseten",
81 "Baseten",
82 key("Baseten API key", &["BASETEN_API_KEY"]),
83 None,
84 ),
85 provider(
86 "cerebras",
87 "Cerebras",
88 key("Cerebras API key", &["CEREBRAS_API_KEY"]),
89 None,
90 ),
91 provider(
92 "cloudflare-ai-gateway",
93 "Cloudflare AI Gateway",
94 key("Cloudflare API key", &["CLOUDFLARE_API_KEY"]),
95 None,
96 ),
97 provider(
98 "cloudflare-workers-ai",
99 "Cloudflare Workers AI",
100 key("Cloudflare API key", &["CLOUDFLARE_API_KEY"]),
101 None,
102 ),
103 provider(
104 "deepseek",
105 "DeepSeek",
106 key("DeepSeek API key", &["DEEPSEEK_API_KEY"]),
107 None,
108 ),
109 provider(
110 "fireworks",
111 "Fireworks",
112 key("Fireworks API key", &["FIREWORKS_API_KEY"]),
113 None,
114 ),
115 provider(
116 "github-copilot",
117 "GitHub Copilot",
118 key("GitHub Copilot token", &["COPILOT_GITHUB_TOKEN"]),
119 Some("GitHub Copilot"),
120 ),
121 provider(
122 "google",
123 "Google",
124 key("Gemini API key", &["GEMINI_API_KEY"]),
125 None,
126 ),
127 provider(
128 "google-vertex",
129 "Google Vertex AI",
130 key("Google Cloud credentials", &["GOOGLE_CLOUD_API_KEY"]),
131 None,
132 ),
133 provider("groq", "Groq", key("Groq API key", &["GROQ_API_KEY"]), None),
134 provider(
135 "huggingface",
136 "Hugging Face",
137 key("Hugging Face token", &["HF_TOKEN"]),
138 None,
139 ),
140 provider(
141 "kimi-coding",
142 "Kimi For Coding",
143 key("Kimi API key", &["KIMI_API_KEY"]),
144 Some("Kimi Code (subscription)"),
145 ),
146 provider(
147 "meta",
148 "Meta",
149 key("Meta Model API key", &["META_API_KEY"]),
150 Some("Meta (Muse subscription)"),
151 ),
152 provider(
153 "minimax",
154 "MiniMax",
155 key("MiniMax API key", &["MINIMAX_API_KEY"]),
156 None,
157 ),
158 provider(
159 "minimax-cn",
160 "MiniMax CN",
161 key("MiniMax CN API key", &["MINIMAX_CN_API_KEY"]),
162 None,
163 ),
164 provider(
165 "mistral",
166 "Mistral",
167 key("Mistral API key", &["MISTRAL_API_KEY"]),
168 None,
169 ),
170 provider(
171 "moonshotai",
172 "Moonshot AI",
173 key("Moonshot AI API key", &["MOONSHOT_API_KEY"]),
174 None,
175 ),
176 provider(
177 "moonshotai-cn",
178 "Moonshot AI CN",
179 key("Moonshot AI API key", &["MOONSHOT_API_KEY"]),
180 None,
181 ),
182 provider(
183 "nvidia",
184 "NVIDIA",
185 key("NVIDIA API key", &["NVIDIA_API_KEY"]),
186 None,
187 ),
188 provider(
189 "openai",
190 "OpenAI",
191 key("OpenAI API key", &["OPENAI_API_KEY"]),
192 Some("OpenAI (ChatGPT subscription)"),
193 ),
194 provider(
195 "openai-codex",
196 "OpenAI Codex (legacy)",
197 None,
198 Some("OpenAI (ChatGPT Plus/Pro)"),
199 ),
200 provider(
201 "opencode",
202 "OpenCode Zen",
203 key("OpenCode API key", &["OPENCODE_API_KEY"]),
204 None,
205 ),
206 provider(
207 "opencode-go",
208 "OpenCode Go",
209 key("OpenCode API key", &["OPENCODE_API_KEY"]),
210 None,
211 ),
212 provider(
213 "openrouter",
214 "OpenRouter",
215 key("OpenRouter API key", &["OPENROUTER_API_KEY"]),
216 Some("OpenRouter OAuth"),
217 ),
218 provider(
219 "qwen-token-plan",
220 "Qwen Token Plan",
221 key("Qwen Token Plan API key", &["QWEN_TOKEN_PLAN_API_KEY"]),
222 None,
223 ),
224 provider(
225 "qwen-token-plan-cn",
226 "Qwen Token Plan CN",
227 key(
228 "Qwen Token Plan CN API key",
229 &["QWEN_TOKEN_PLAN_CN_API_KEY"],
230 ),
231 None,
232 ),
233 provider(
234 "qwen-token-plan-individual",
235 "Qwen Token Plan Individual",
236 key(
237 "Qwen Token Plan Individual API key",
238 &["QWEN_TOKEN_PLAN_API_KEY"],
239 ),
240 None,
241 ),
242 provider(
243 "radius",
244 "Radius",
245 key("Radius API key", &["RADIUS_API_KEY"]),
246 Some("Radius"),
247 ),
248 provider(
249 "together",
250 "Together",
251 key("Together API key", &["TOGETHER_API_KEY"]),
252 None,
253 ),
254 provider(
255 "typesafe",
256 "TypeSafe",
257 key("TypeSafe API key", &["TYPESAFE_API_KEY"]),
258 None,
259 ),
260 provider(
261 "vercel-ai-gateway",
262 "Vercel AI Gateway",
263 key("Vercel AI Gateway API key", &["AI_GATEWAY_API_KEY"]),
264 None,
265 ),
266 provider(
267 "xai",
268 "xAI",
269 key("xAI API key", &["XAI_API_KEY"]),
270 Some("xAI (Grok/X subscription)"),
271 ),
272 provider(
273 "xiaomi",
274 "Xiaomi",
275 key("Xiaomi API key", &["XIAOMI_API_KEY"]),
276 None,
277 ),
278 provider(
279 "xiaomi-token-plan-ams",
280 "Xiaomi Token Plan AMS",
281 key(
282 "Xiaomi Token Plan AMS API key",
283 &["XIAOMI_TOKEN_PLAN_AMS_API_KEY"],
284 ),
285 None,
286 ),
287 provider(
288 "xiaomi-token-plan-cn",
289 "Xiaomi Token Plan CN",
290 key(
291 "Xiaomi Token Plan CN API key",
292 &["XIAOMI_TOKEN_PLAN_CN_API_KEY"],
293 ),
294 None,
295 ),
296 provider(
297 "xiaomi-token-plan-sgp",
298 "Xiaomi Token Plan SGP",
299 key(
300 "Xiaomi Token Plan SGP API key",
301 &["XIAOMI_TOKEN_PLAN_SGP_API_KEY"],
302 ),
303 None,
304 ),
305 provider("zai", "Z.AI", key("Z.AI API key", &["ZAI_API_KEY"]), None),
306 provider(
307 "zai-coding-cn",
308 "Z.AI Coding CN",
309 key("Z.AI Coding CN API key", &["ZAI_CODING_CN_API_KEY"]),
310 None,
311 ),
312];
313
314pub fn info(id: &str) -> Option<&'static ProviderInfo> {
316 PROVIDERS.iter().find(|provider| provider.id == id)
317}
318
319#[cfg(test)]
320mod tests {
321 use super::*;
322
323 #[test]
324 fn covers_catalog() {
325 for id in crate::catalog::builtin_providers() {
326 assert!(info(id).is_some(), "{id} has no provider info");
327 }
328 }
329}