"use client"; import { useState } from "react"; import { ChevronDown, Check, AlertCircle } from "lucide-react"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { isModelAvailable } from "@/app/lib/modelAvailability"; import type { ApiKeyState } from "@/app/lib/mikeApi"; export interface ModelOption { id: string; label: string; group: "Anthropic" | "Google" | "OpenAI"; } export const MODELS: ModelOption[] = [ { id: "claude-opus-4-7", label: "Claude Opus 4.7", group: "Anthropic" }, { id: "claude-sonnet-4-6", label: "Claude Sonnet 4.6", group: "Anthropic" }, { id: "gemini-3.1-pro-preview", label: "Gemini 3.1 Pro", group: "Google" }, { id: "gemini-3-flash-preview", label: "Gemini 3 Flash", group: "Google" }, { id: "gpt-5.5", label: "GPT-5.5", group: "OpenAI" }, { id: "gpt-5.4", label: "GPT-5.4", group: "OpenAI" }, ]; export const SETTINGS_MODELS: ModelOption[] = [ ...MODELS, { id: "claude-haiku-4-5", label: "Claude Haiku 4.5", group: "Anthropic" }, { id: "gemini-3.1-flash-lite-preview", label: "Gemini 3.1 Flash Lite", group: "Google", }, { id: "gpt-5.4-lite", label: "GPT-5.4 Lite", group: "OpenAI" }, ]; export const DEFAULT_MODEL_ID = "gemini-3-flash-preview"; export const ALLOWED_MODEL_IDS = new Set(MODELS.map((m) => m.id)); const GROUP_ORDER: ModelOption["group"][] = ["Anthropic", "Google", "OpenAI"]; interface Props { value: string; onChange: (id: string) => void; apiKeys?: ApiKeyState; } export function ModelToggle({ value, onChange, apiKeys }: Props) { const [isOpen, setIsOpen] = useState(false); const selected = MODELS.find((m) => m.id === value); const selectedLabel = selected?.label ?? "Model"; const selectedAvailable = apiKeys ? isModelAvailable(value, apiKeys) : true; return ( {GROUP_ORDER.map((group, gi) => { const items = MODELS.filter((m) => m.group === group); if (items.length === 0) return null; return (
{gi > 0 && } {group} {items.map((m) => { const available = apiKeys ? isModelAvailable(m.id, apiKeys) : true; return ( onChange(m.id)} > {m.label} {!available && ( )} {m.id === value && available && ( )} ); })}
); })}
); }