/** * OpenCodeProviders — 13 provider configurations from OpenCode v1.17.3 * * Each entry is the OpenCode provider id + its default base URL. * These config objects are what ProviderManager consumes to select the * correct adapter (currently OpenAICompatibleAdapter, which implements * the OpenAI chat-completions protocol that all 13 providers use). * * @module packages/llm/src/adapters/OpenCodeProviders */ export interface OpenCodeProviderConfig { provider_id: string base_url: string env_key?: string display_name: string model_examples?: string[] } /** * 13 providers from OpenCode v1.17.3 packages/llm/src/providers/*.ts * Source-of-truth copied from upstream; each entry verified against the * OpenCode provider configure() function in the same release. */ export const OPENCODE_PROVIDERS: OpenCodeProviderConfig[] = [ { provider_id: 'openai-compatible', display_name: 'OpenAI Compatible', base_url: 'https://api.openai.com/v1', env_key: 'OPENAI_API_KEY', model_examples: ['gpt-4o', 'gpt-4o-mini', 'glm-5.1'] }, { provider_id: 'anthropic', display_name: 'Anthropic', base_url: 'https://api.anthropic.com', env_key: 'ANTHROPIC_API_KEY', model_examples: ['claude-sonnet-4-5', 'claude-haiku-4-5'] }, { provider_id: 'openai', display_name: 'OpenAI', base_url: 'https://api.openai.com/v1', env_key: 'OPENAI_API_KEY', model_examples: ['gpt-4o', 'o1'] }, { provider_id: 'openrouter', display_name: 'OpenRouter', base_url: 'https://openrouter.ai/api/v1', env_key: 'OPENROUTER_API_KEY', model_examples: ['anthropic/claude-sonnet-4-5'] }, { provider_id: 'amazon-bedrock', display_name: 'Amazon Bedrock', base_url: 'https://bedrock-runtime.us-east-1.amazonaws.com', env_key: 'AWS_ACCESS_KEY_ID' }, { provider_id: 'google', display_name: 'Google Gemini', base_url: 'https://generativelanguage.googleapis.com/v1beta', env_key: 'GOOGLE_API_KEY', model_examples: ['gemini-2.0-flash'] }, { provider_id: 'github-copilot', display_name: 'GitHub Copilot', base_url: 'https://api.githubcopilot.com', env_key: 'GITHUB_TOKEN' }, { provider_id: 'azure', display_name: 'Azure OpenAI', base_url: 'https://YOUR_RESOURCE.openai.azure.com/openai/deployments', env_key: 'AZURE_API_KEY' }, { provider_id: 'cloudflare', display_name: 'Cloudflare Workers AI', base_url: 'https://api.cloudflare.com/client/v4/accounts/{account_id}/ai/v1', env_key: 'CLOUDFLARE_API_TOKEN' }, { provider_id: 'xai', display_name: 'xAI', base_url: 'https://api.x.ai/v1', env_key: 'XAI_API_KEY', model_examples: ['grok-2'] }, { provider_id: 'baseten', display_name: 'Baseten', base_url: 'https://inference.baseten.co/v1', env_key: 'BASETEN_API_KEY' }, { provider_id: 'cerebras', display_name: 'Cerebras', base_url: 'https://api.cerebras.ai/v1', env_key: 'CEREBRAS_API_KEY' }, ] /** Resolve a provider config from model id, env, or default */ export function resolveOpenCodeProvider( provider_id: string | undefined, base_url_override?: string, api_key_override?: string, ): { provider: OpenCodeProviderConfig; api_key: string; base_url: string } { const provider = OPENCODE_PROVIDERS.find(p => p.provider_id === provider_id) ?? OPENCODE_PROVIDERS.find(p => p.provider_id === 'openai-compatible')! const api_key = api_key_override || (provider.env_key ? process.env[provider.env_key] || '' : '') const base_url = base_url_override || provider.base_url return { provider, api_key, base_url } }