Skip to main content

yapi_ai/
providers.rs

1//! Built-in provider names and the authentication methods each declares.
2//!
3//! Mirrors the `createProvider` definitions in `packages/ai/src/providers` of
4//! pi `v1.0.0`.
5
6/// A built-in provider's display name and sign-in methods.
7#[derive(Clone, Copy, Debug, PartialEq, Eq)]
8pub struct ProviderInfo {
9    /// Provider id, as in the catalog.
10    pub id: &'static str,
11    /// Display name.
12    pub name: &'static str,
13    /// API key method, when the provider accepts keys.
14    pub api_key: Option<ApiKeyMethod>,
15    /// OAuth method name, when pi offers an account sign-in for the provider.
16    pub oauth: Option<&'static str>,
17}
18
19/// How a provider takes an API key.
20#[derive(Clone, Copy, Debug, PartialEq, Eq)]
21pub struct ApiKeyMethod {
22    /// Method name, shown in prompts as `Enter <name>`.
23    pub name: &'static str,
24    /// Environment variables holding the key, in priority order.
25    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
46/// Every built-in provider.
47pub 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
314/// A built-in provider by id.
315pub 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}