Skip to main content

ralph_workflow/agents/providers/
metadata.rs

1//! Provider Metadata
2//!
3//! Display names, prefixes, and authentication commands for each provider.
4
5use super::types::OpenCodeProviderType;
6
7impl OpenCodeProviderType {
8    /// Get the display name for this provider.
9    pub const fn name(self) -> &'static str {
10        match self {
11            Self::OpenCodeZen => "OpenCode Zen",
12            Self::ZaiDirect => "Z.AI Direct",
13            Self::ZaiCodingPlan => "Z.AI Coding Plan",
14            Self::Moonshot => "Moonshot AI",
15            Self::MiniMax => "MiniMax",
16            Self::Anthropic => "Anthropic",
17            Self::OpenAI => "OpenAI",
18            Self::Google => "Google AI",
19            Self::GoogleVertex => "Google Vertex AI",
20            Self::AmazonBedrock => "Amazon Bedrock",
21            Self::AzureOpenAI => "Azure OpenAI",
22            Self::GithubCopilot => "GitHub Copilot",
23            Self::Groq => "Groq",
24            Self::Together => "Together AI",
25            Self::Fireworks => "Fireworks AI",
26            Self::Cerebras => "Cerebras",
27            Self::SambaNova => "SambaNova",
28            Self::DeepInfra => "DeepInfra",
29            Self::OpenRouter => "OpenRouter",
30            Self::Cloudflare => "Cloudflare Workers AI",
31            Self::Vercel => "Vercel AI Gateway",
32            Self::Helicone => "Helicone",
33            Self::ZenMux => "ZenMux",
34            Self::DeepSeek => "DeepSeek",
35            Self::Xai => "xAI",
36            Self::Mistral => "Mistral AI",
37            Self::Cohere => "Cohere",
38            Self::Perplexity => "Perplexity",
39            Self::AI21 => "AI21 Labs",
40            Self::VeniceAI => "Venice AI",
41            Self::HuggingFace => "HuggingFace",
42            Self::Replicate => "Replicate",
43            Self::Baseten => "Baseten",
44            Self::Cortecs => "Cortecs",
45            Self::Scaleway => "Scaleway",
46            Self::OVHcloud => "OVHcloud",
47            Self::IONet => "IO.NET",
48            Self::Nebius => "Nebius",
49            Self::SapAICore => "SAP AI Core",
50            Self::AzureCognitiveServices => "Azure Cognitive Services",
51            Self::Ollama => "Ollama",
52            Self::LMStudio => "LM Studio",
53            Self::OllamaCloud => "Ollama Cloud",
54            Self::LlamaCpp => "llama.cpp",
55            Self::Custom => "Custom",
56        }
57    }
58
59    /// Get authentication command/instructions for this provider.
60    pub const fn auth_command(self) -> &'static str {
61        match self {
62            Self::OpenCodeZen => "Run: opencode auth login -> select 'OpenCode Zen'",
63            Self::ZaiDirect => "Run: opencode auth login -> select 'Z.AI' or 'Z.AI Coding Plan'",
64            Self::ZaiCodingPlan => "Run: opencode auth login -> select 'Z.AI Coding Plan'",
65            Self::Moonshot => {
66                "Set MOONSHOT_API_KEY or run: opencode auth login -> select 'Moonshot'"
67            }
68            Self::MiniMax => "Set MINIMAX_API_KEY or run: opencode auth login -> select 'MiniMax'",
69            Self::Anthropic => "Set ANTHROPIC_API_KEY environment variable",
70            Self::OpenAI => "Set OPENAI_API_KEY environment variable",
71            Self::Google => "Set GOOGLE_AI_API_KEY environment variable",
72            Self::GoogleVertex => {
73                "Configure GCP credentials: gcloud auth application-default login"
74            }
75            Self::AmazonBedrock => {
76                "Configure AWS credentials: aws configure or set AWS_ACCESS_KEY_ID"
77            }
78            Self::AzureOpenAI => "Set AZURE_OPENAI_API_KEY and AZURE_OPENAI_ENDPOINT",
79            Self::GithubCopilot => "Run: gh auth login (requires GitHub Copilot subscription)",
80            Self::Groq => "Set GROQ_API_KEY environment variable",
81            Self::Together => "Set TOGETHER_API_KEY environment variable",
82            Self::Fireworks => "Set FIREWORKS_API_KEY environment variable",
83            Self::Cerebras => "Set CEREBRAS_API_KEY environment variable",
84            Self::SambaNova => "Set SAMBANOVA_API_KEY environment variable",
85            Self::DeepInfra => "Set DEEPINFRA_API_KEY environment variable",
86            Self::OpenRouter => "Set OPENROUTER_API_KEY environment variable",
87            Self::Cloudflare => "Set CLOUDFLARE_ACCOUNT_ID and CLOUDFLARE_API_TOKEN",
88            Self::Vercel => "Set VERCEL_API_KEY environment variable",
89            Self::Helicone => "Set HELICONE_API_KEY environment variable",
90            Self::ZenMux => "Set ZENMUX_API_KEY environment variable",
91            Self::DeepSeek => "Set DEEPSEEK_API_KEY environment variable",
92            Self::Xai => "Set XAI_API_KEY environment variable",
93            Self::Mistral => "Set MISTRAL_API_KEY environment variable",
94            Self::Cohere => "Set COHERE_API_KEY environment variable",
95            Self::Perplexity => "Set PERPLEXITY_API_KEY environment variable",
96            Self::AI21 => "Set AI21_API_KEY environment variable",
97            Self::VeniceAI => "Set VENICE_API_KEY environment variable",
98            Self::HuggingFace => "Set HUGGINGFACE_API_KEY environment variable",
99            Self::Replicate => "Set REPLICATE_API_TOKEN environment variable",
100            Self::Baseten => "Set BASETEN_API_KEY environment variable",
101            Self::Cortecs => "Set CORTECS_API_KEY environment variable",
102            Self::Scaleway => "Set SCALEWAY_API_KEY environment variable",
103            Self::OVHcloud => "Set OVHCLOUD_API_KEY environment variable",
104            Self::IONet => "Set IONET_API_KEY environment variable",
105            Self::Nebius => "Set NEBIUS_API_KEY environment variable",
106            Self::SapAICore => {
107                "Set AICORE_CLIENT_ID, AICORE_CLIENT_SECRET, AICORE_AUTH_URL, and AICORE_API_BASE"
108            }
109            Self::AzureCognitiveServices => {
110                "Set AZURE_COGNITIVE_SERVICES_KEY and AZURE_COGNITIVE_SERVICES_ENDPOINT"
111            }
112            Self::Ollama => "Ollama runs locally - no API key needed",
113            Self::LMStudio => "LM Studio runs locally - no API key needed",
114            Self::OllamaCloud => "Set OLLAMA_CLOUD_API_KEY environment variable",
115            Self::LlamaCpp => "llama.cpp runs locally - no API key needed",
116            Self::Custom => "Check provider documentation or run: opencode /connect",
117        }
118    }
119
120    /// Get the model prefix for this provider.
121    pub const fn prefix(self) -> &'static str {
122        match self {
123            Self::OpenCodeZen => "opencode/",
124            Self::ZaiDirect => "zai/",
125            Self::ZaiCodingPlan => "zai-coding/",
126            Self::Moonshot => "moonshot/",
127            Self::MiniMax => "minimax/",
128            Self::Anthropic => "anthropic/",
129            Self::OpenAI => "openai/",
130            Self::Google => "google/",
131            Self::GoogleVertex => "google-vertex/",
132            Self::AmazonBedrock => "amazon-bedrock/",
133            Self::AzureOpenAI => "azure-openai/",
134            Self::GithubCopilot => "copilot/",
135            Self::Groq => "groq/",
136            Self::Together => "together/",
137            Self::Fireworks => "fireworks/",
138            Self::Cerebras => "cerebras/",
139            Self::SambaNova => "sambanova/",
140            Self::DeepInfra => "deep-infra/",
141            Self::OpenRouter => "openrouter/",
142            Self::Cloudflare => "cloudflare/",
143            Self::Vercel => "vercel/",
144            Self::Helicone => "helicone/",
145            Self::ZenMux => "zenmux/",
146            Self::DeepSeek => "deepseek/",
147            Self::Xai => "xai/",
148            Self::Mistral => "mistral/",
149            Self::Cohere => "cohere/",
150            Self::Perplexity => "perplexity/",
151            Self::AI21 => "ai21/",
152            Self::VeniceAI => "venice-ai/",
153            Self::HuggingFace => "huggingface/",
154            Self::Replicate => "replicate/",
155            Self::Baseten => "baseten/",
156            Self::Cortecs => "cortecs/",
157            Self::Scaleway => "scaleway/",
158            Self::OVHcloud => "ovhcloud/",
159            Self::IONet => "io-net/",
160            Self::Nebius => "nebius/",
161            Self::SapAICore => "sap-ai-core/",
162            Self::AzureCognitiveServices => "azure-cognitive-services/",
163            Self::Ollama => "ollama/",
164            Self::LMStudio => "lmstudio/",
165            Self::OllamaCloud => "ollama-cloud/",
166            Self::LlamaCpp => "llama.cpp/",
167            Self::Custom => "any other provider/*",
168        }
169    }
170
171    /// Check if this provider requires special cloud configuration.
172    pub const fn requires_cloud_config(self) -> bool {
173        matches!(
174            self,
175            Self::GoogleVertex
176                | Self::AmazonBedrock
177                | Self::AzureOpenAI
178                | Self::SapAICore
179                | Self::AzureCognitiveServices
180        )
181    }
182
183    /// Check if this is a local provider (no API key needed).
184    pub const fn is_local(self) -> bool {
185        matches!(self, Self::Ollama | Self::LMStudio | Self::LlamaCpp)
186    }
187}