import type { AIProviderAdapter, ProviderId } from "@/lib/ai/core/types"; import { anthropicAdapter } from "./anthropic"; import { openaiAdapter } from "./openai"; import { geminiAdapter } from "./gemini"; import { xaiAdapter } from "./xai"; import { mistralAdapter } from "./mistral"; import { deepseekAdapter } from "./deepseek"; import { kimiAdapter } from "./kimi"; import { openrouterAdapter } from "./openrouter"; import { cerebrasAdapter } from "./cerebras"; import { customPlaceholderAdapter } from "./custom"; const ADAPTERS: Record = { openai: openaiAdapter, anthropic: anthropicAdapter, gemini: geminiAdapter, xai: xaiAdapter, mistral: mistralAdapter, deepseek: deepseekAdapter, kimi: kimiAdapter, openrouter: openrouterAdapter, cerebras: cerebrasAdapter, // Per-endpoint adapters are built by `resolveCustomEndpoint()` (lib/endpoints/service); this entry only keeps the map exhaustive. custom: customPlaceholderAdapter, }; export function getAdapter(provider: ProviderId): AIProviderAdapter { const a = ADAPTERS[provider]; if (!a) throw new Error(`Unknown provider: ${provider}`); return a; } export function listAdapters(): AIProviderAdapter[] { return Object.values(ADAPTERS); } /** Static, client-safe provider metadata. */ export const PROVIDER_META: Record = { openai: { name: "OpenAI", shortName: "OpenAI", keyDocsUrl: "https://platform.openai.com/api-keys", keyPrefixHint: "sk-", color: "var(--p-openai)", description: "GPT-5.x, o-series reasoning models, GPT-4.1 — via the Responses API.", consoleUrl: "https://platform.openai.com", }, anthropic: { name: "Anthropic", shortName: "Anthropic", keyDocsUrl: "https://platform.claude.com/settings/keys", keyPrefixHint: "sk-ant-", color: "var(--p-anthropic)", description: "Claude Fable, Opus, Sonnet and Haiku — adaptive thinking, 1M context.", consoleUrl: "https://platform.claude.com", }, gemini: { name: "Google Gemini", shortName: "Gemini", keyDocsUrl: "https://aistudio.google.com/apikey", keyPrefixHint: "AIza / AQ.", color: "var(--p-gemini)", description: "Gemini 3.x Flash and Pro, 2.5 family — Gemini Developer API.", consoleUrl: "https://aistudio.google.com", }, xai: { name: "xAI", shortName: "xAI", keyDocsUrl: "https://console.x.ai", keyPrefixHint: "xai-", color: "var(--p-xai)", description: "Grok 4.x reasoning and non-reasoning models with live search.", consoleUrl: "https://console.x.ai", }, mistral: { name: "Mistral AI", shortName: "Mistral", keyDocsUrl: "https://console.mistral.ai/api-keys", keyPrefixHint: "", color: "var(--p-mistral)", description: "Mistral Large / Medium / Small, Ministral, Magistral, Codestral.", consoleUrl: "https://console.mistral.ai" }, deepseek: { name: "DeepSeek", shortName: "DeepSeek", keyDocsUrl: "https://platform.deepseek.com/api_keys", keyPrefixHint: "sk-", color: "var(--p-deepseek)", description: "DeepSeek V4 Flash / Pro with thinking mode.", consoleUrl: "https://platform.deepseek.com" }, kimi: { name: "Kimi (Moonshot AI)", shortName: "Kimi", keyDocsUrl: "https://platform.moonshot.ai/console/api-keys", keyPrefixHint: "sk-", color: "var(--p-kimi)", description: "Kimi K2.6 / K2.7 Code / K3.", consoleUrl: "https://platform.moonshot.ai" }, openrouter: { name: "OpenRouter", shortName: "OpenRouter", keyDocsUrl: "https://openrouter.ai/settings/keys", keyPrefixHint: "sk-or-v1-", color: "var(--p-openrouter)", description: "Hundreds of models behind one key.", consoleUrl: "https://openrouter.ai" }, cerebras: { name: "Cerebras", shortName: "Cerebras", keyDocsUrl: "https://cloud.cerebras.ai/", keyPrefixHint: "csk-", color: "var(--p-cerebras)", description: "Ultra-fast inference for open models.", consoleUrl: "https://cloud.cerebras.ai" }, custom: { name: "Custom endpoints", shortName: "Custom", keyDocsUrl: "/app/settings/endpoints", keyPrefixHint: "", color: "var(--p-custom)", description: "Your own OpenAI-compatible servers — Ollama, LM Studio, vLLM, llama.cpp, MLX.", consoleUrl: "/app/settings/endpoints" }, };