import type { Metadata } from "next"; import { Badge } from "@/components/ui/badge"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { CheckCircle, XCircle, Database, Cpu } from "lucide-react"; import { getAllSiteSettings } from "@/lib/site-settings"; import { AdminSettingsForm } from "@/components/admin/admin-settings-form"; import { AdminDefaultModelForm } from "@/components/admin/admin-default-model-form"; export const metadata: Metadata = {}; const SETTING_GROUPS = [ { title: "AI Provider Keys", description: "Override the environment variable API keys at runtime. Values are encrypted at rest.", keys: ["OPENAI_API_KEY", "ANTHROPIC_API_KEY", "OPENROUTER_API_KEY"] as const, }, { title: "AI Configuration", description: "Provider routing and model defaults.", keys: ["OPENROUTER_DEFAULT_MODEL", "OLLAMA_BASE_URL"] as const, }, ]; function resolveProvider(settings: Record) { if (settings["OPENROUTER_API_KEY"]?.value) return { provider: "OpenRouter", description: "Routes to many models via openrouter.ai" }; if (settings["OPENAI_API_KEY"]?.value) return { provider: "OpenAI", description: "Direct OpenAI API (GPT-4 etc.)" }; if (settings["ANTHROPIC_API_KEY"]?.value) return { provider: "Anthropic", description: "Direct Anthropic API (Claude models)" }; const url = settings["OLLAMA_BASE_URL"]?.value || "http://localhost:11434"; return { provider: "Ollama", description: `Local inference at ${url}` }; } export default async function AdminAiConfigPage() { const settings = await getAllSiteSettings(); const active = resolveProvider(settings); const keyRows = [ { key: "OPENROUTER_API_KEY", label: "OPENROUTER_API_KEY" }, { key: "OPENAI_API_KEY", label: "OPENAI_API_KEY" }, { key: "ANTHROPIC_API_KEY", label: "ANTHROPIC_API_KEY" }, ]; return (

AI Configuration

Provider keys, routing, and default models for AI generation. DB values here take precedence over environment variables — clear a value to fall back to the env var.

Active Provider (fallback, no default set below)
{active.provider} {active.description}

Priority: OpenRouter → OpenAI → Anthropic → Ollama (first configured key wins) — only when a user has no personal preference, no BYOK key, and no default is set for that use case below.

API Keys {keyRows.map(({ key, label }) => { const meta = settings[key]; const present = !!meta?.value; return (
{present ? ( ) : ( )} {label}
{present && meta?.fromDb && ( DB override )} {present && !meta?.fromDb && ( from .env )} {present ? "Configured" : "Not set"}
); })}
OLLAMA_BASE_URL {settings["OLLAMA_BASE_URL"]?.value || "http://localhost:11434 (default)"}
OPENROUTER_DEFAULT_MODEL {settings["OPENROUTER_DEFAULT_MODEL"]?.value || "google/gemini-flash-1.5 (default)"}
{SETTING_GROUPS.map((group) => ( ))}
); }