import { useCallback, useEffect } from "react"; import type { ModelInfo } from "../api"; import { CustomModelDropdown } from "./CustomModelDropdown"; import { Brain, X } from "lucide-react"; interface ModelSelectionModalProps { isOpen: boolean; onClose: () => void; models: ModelInfo[]; executorValue: string; validatorValue: string; onExecutorChange: (value: string) => void; onValidatorChange: (value: string) => void; modelsLoading: boolean; modelsError: string | null; onRetry: () => void; favoriteProviders?: string[]; onToggleFavorite?: (provider: string) => void; } function getModelBadgeLabel(models: ModelInfo[], value: string): string { if (!value) return "Using default"; const slashIdx = value.indexOf("/"); if (slashIdx === -1) return value; const provider = value.slice(0, slashIdx); const modelId = value.slice(slashIdx + 1); const matched = models.find((m) => m.provider === provider && m.id === modelId); return matched ? `${matched.provider}/${matched.id}` : `${provider}/${modelId}`; } export function ModelSelectionModal({ isOpen, onClose, models, executorValue, validatorValue, onExecutorChange, onValidatorChange, modelsLoading, modelsError, onRetry, favoriteProviders = [], onToggleFavorite, }: ModelSelectionModalProps) { // Handle Escape key useEffect(() => { if (!isOpen) return; const handleKeyDown = (event: KeyboardEvent) => { if (event.key === "Escape") { event.preventDefault(); onClose(); } }; document.addEventListener("keydown", handleKeyDown); return () => document.removeEventListener("keydown", handleKeyDown); }, [isOpen, onClose]); // Handle overlay click const handleOverlayClick = useCallback( (event: React.MouseEvent) => { if (event.target === event.currentTarget) { onClose(); } }, [onClose], ); if (!isOpen) return null; const hasExecutorOverride = Boolean(executorValue); const hasValidatorOverride = Boolean(validatorValue); return (
Loading models…
Choose models for this task. If not selected, default models will be used.