import type { ReactNode } from "react"; import { useTranslation } from "react-i18next"; import { THINKING_LEVELS } from "@fusion/core"; import type { Settings, ThinkingLevel } from "@fusion/core"; import type { ModelInfo } from "../../../api"; import type { ToastType } from "../../../hooks/useToast"; import { ModelPricingSection } from "./ModelPricingSection"; import { CustomModelDropdown } from "../../CustomModelDropdown"; import type { SectionBaseProps, ModelLane } from "./context"; import { LoadingSpinner } from "../../LoadingSpinner"; function toCommaSeparatedInput(values?: string[]): string { return values?.join(", ") ?? ""; } function fromCommaSeparatedInput(value: string): string[] { return value.split(",").map((item) => item.trim()).filter((item) => item.length > 0); } export interface GlobalModelsSectionProps extends SectionBaseProps { scopeBanner: ReactNode; availableModels: ModelInfo[]; modelsLoading: boolean; /** Global model lanes (i.e. MODEL_LANES without the `default` lane). */ globalModelLanes: ModelLane[]; favoriteProviders: string[]; favoriteModels: string[]; onToggleFavorite: (provider: string) => void; onToggleModelFavorite: (modelId: string) => void; addToast: (message: string, type?: ToastType) => void; projectId?: string; } export function GlobalModelsSection({ scopeBanner, form, setForm, availableModels, modelsLoading, globalModelLanes, favoriteProviders, favoriteModels, onToggleFavorite, onToggleModelFavorite, addToast, projectId, }: GlobalModelsSectionProps) { const { t } = useTranslation("app"); const selectedValue = form.defaultProvider && form.defaultModelId ? `${form.defaultProvider}/${form.defaultModelId}` : ""; return (<> {scopeBanner} {/* --- Default Model --- */}
{t("settings.globalModels.globalBaselineModelsForEachAIRoleProject", " Global baseline models for each AI role. Project settings can override these per-project. ")}
{globalModelLanes.map((lane) => { const provider = form[lane.globalProviderKey as keyof Settings] as string | undefined; const model = form[lane.globalModelKey as keyof Settings] as string | undefined; const value = provider && model ? `${provider}/${model}` : ""; return (opencode models opencode --refresh{t("settings.globalModels.flowAndPublishesThemUnderTheOpencodeGo", " flow and publishes them under the opencode-go provider in model pickers. ")}