import { useEffect, useState } from "react"; import { useFormContext } from "react-hook-form"; import { LabelWrapper } from "@/components/label-wrapper"; import { Input } from "@/components/ui/input"; import { Switch } from "@/components/ui/switch"; import { useGetOpenAIModelsQuery } from "@/app/api/queries/useGetModelsQuery"; import { useDebouncedValue } from "@/lib/debounce"; import { AnimatedConditional } from "@/components/animated-conditional"; import OpenAILogo from "@/components/logo/openai-logo"; import { ModelSelectors } from "./model-selectors"; export interface OpenAISettingsFormData { apiKey: string; llmModel: string; embeddingModel: string; } export function OpenAISettingsForm({ isCurrentProvider = false, }: { isCurrentProvider: boolean; }) { const [useExistingKey, setUseExistingKey] = useState(true); const { register, watch, setValue, clearErrors, formState: { errors }, } = useFormContext(); const apiKey = watch("apiKey"); const debouncedApiKey = useDebouncedValue(apiKey, 500); // Handle switch change const handleUseExistingKeyChange = (checked: boolean) => { setUseExistingKey(checked); if (checked) { // Clear the API key field when using existing key setValue("apiKey", ""); } }; // Clear form errors when useExistingKey changes useEffect(() => { clearErrors("apiKey"); }, [useExistingKey, clearErrors]); const shouldFetchModels = isCurrentProvider ? useExistingKey ? true : !!debouncedApiKey : !!debouncedApiKey; const { data: modelsData, isLoading: isLoadingModels, error: modelsError, } = useGetOpenAIModelsQuery( { apiKey: useExistingKey ? "" : debouncedApiKey, }, { enabled: shouldFetchModels, } ); const languageModels = modelsData?.language_models || []; const embeddingModels = modelsData?.embedding_models || []; const apiKeyError = modelsError ? "Invalid OpenAI API key. Verify or replace the key." : errors.apiKey?.message; return (
{isCurrentProvider && ( )} {apiKeyError && (

{apiKeyError}

)} {isLoadingModels && (

Validating API key...

)}
} />
); }