import { SettingsInput } from "@client/pages/settings/components/SettingsInput"; import type { ModelValues } from "@client/pages/settings/types"; import { formatSecretHint, getLlmProviderConfig, } from "@client/pages/settings/utils"; import type { UpdateSettingsInput } from "@shared/settings-schema.js"; import type React from "react"; import { useEffect } from "react"; import { Controller, useFormContext } from "react-hook-form"; import { AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Separator } from "@/components/ui/separator"; type ModelSettingsSectionProps = { values: ModelValues; isLoading: boolean; isSaving: boolean; }; export const ModelSettingsSection: React.FC = ({ values, isLoading, isSaving, }) => { const { effective, default: defaultModel, scorer, tailoring, projectSelection, llmProvider, llmBaseUrl, llmApiKeyHint, } = values; const { register, control, watch, setValue, formState: { errors }, } = useFormContext(); const selectedProvider = watch("llmProvider") || llmProvider || "openrouter"; const providerConfig = getLlmProviderConfig(selectedProvider); const { showApiKey, showBaseUrl } = providerConfig; const llmBaseUrlValue = watch("llmBaseUrl"); useEffect(() => { if (showBaseUrl) return; if (llmBaseUrlValue) { setValue("llmBaseUrl", "", { shouldDirty: true }); } }, [setValue, showBaseUrl, llmBaseUrlValue]); const keyHint = formatSecretHint(llmApiKeyHint); const keyText = showApiKey ? keyHint || "Not set" : "Not required"; const effectiveDefaultModel = effective || defaultModel || "—"; const scoringModel = scorer || effectiveDefaultModel; const tailoringModel = tailoring || effectiveDefaultModel; const projectSelectionModel = projectSelection || effectiveDefaultModel; return ( Model
LLM Provider
( )} /> {errors.llmProvider?.message && (

{errors.llmProvider.message as string}

)}

Used for scoring, tailoring, and extraction.

{providerConfig.providerHint}

{showBaseUrl && ( )} {showApiKey && ( )}
Task-Specific Overrides
Resolved config
Provider
{selectedProvider || "—"}
Base URL
{llmBaseUrl || "—"}
API key
{keyText}
Default model
{effectiveDefaultModel}
Scoring model
{scoringModel === effectiveDefaultModel ? "inherits" : scoringModel}
Tailoring model
{tailoringModel === effectiveDefaultModel ? "inherits" : tailoringModel}
Project selection
{projectSelectionModel === effectiveDefaultModel ? "inherits" : projectSelectionModel}
); };