import type { Dispatch, SetStateAction } from "react"; import { useEffect, useState } from "react"; import IBMLogo from "@/components/icons/ibm-logo"; import { LabelInput } from "@/components/label-input"; import { LabelWrapper } from "@/components/label-wrapper"; import { Switch } from "@/components/ui/switch"; import { Tooltip, TooltipContent, TooltipTrigger, } from "@/components/ui/tooltip"; import { useDebouncedValue } from "@/lib/debounce"; import type { OnboardingVariables } from "../../api/mutations/useOnboardingMutation"; import { useGetIBMModelsQuery } from "../../api/queries/useGetModelsQuery"; import { useModelSelection } from "../_hooks/useModelSelection"; import { useUpdateSettings } from "../_hooks/useUpdateSettings"; import { AdvancedOnboarding } from "./advanced"; import { ModelSelector } from "./model-selector"; export function IBMOnboarding({ isEmbedding = false, setSettings, sampleDataset, setSampleDataset, setIsLoadingModels, alreadyConfigured = false, existingEndpoint, existingProjectId, hasEnvApiKey = false, }: { isEmbedding?: boolean; setSettings: Dispatch>; sampleDataset: boolean; setSampleDataset: (dataset: boolean) => void; setIsLoadingModels?: (isLoading: boolean) => void; alreadyConfigured?: boolean; existingEndpoint?: string; existingProjectId?: string; hasEnvApiKey?: boolean; }) { const [endpoint, setEndpoint] = useState( alreadyConfigured ? "" : existingEndpoint || "https://us-south.ml.cloud.ibm.com", ); const [apiKey, setApiKey] = useState(""); const [getFromEnv, setGetFromEnv] = useState( hasEnvApiKey && !alreadyConfigured, ); const [projectId, setProjectId] = useState( alreadyConfigured ? "" : existingProjectId || "", ); const options = [ { value: "https://us-south.ml.cloud.ibm.com", label: "https://us-south.ml.cloud.ibm.com", default: true, }, { value: "https://eu-de.ml.cloud.ibm.com", label: "https://eu-de.ml.cloud.ibm.com", default: false, }, { value: "https://eu-gb.ml.cloud.ibm.com", label: "https://eu-gb.ml.cloud.ibm.com", default: false, }, { value: "https://au-syd.ml.cloud.ibm.com", label: "https://au-syd.ml.cloud.ibm.com", default: false, }, { value: "https://jp-tok.ml.cloud.ibm.com", label: "https://jp-tok.ml.cloud.ibm.com", default: false, }, { value: "https://ca-tor.ml.cloud.ibm.com", label: "https://ca-tor.ml.cloud.ibm.com", default: false, }, ]; const debouncedEndpoint = useDebouncedValue(endpoint, 500); const debouncedApiKey = useDebouncedValue(apiKey, 500); const debouncedProjectId = useDebouncedValue(projectId, 500); // Fetch models from API when all credentials are provided const { data: modelsData, isLoading: isLoadingModels, error: modelsError, } = useGetIBMModelsQuery( { endpoint: debouncedEndpoint ? debouncedEndpoint : undefined, apiKey: getFromEnv ? "" : debouncedApiKey ? debouncedApiKey : undefined, projectId: debouncedProjectId ? debouncedProjectId : undefined, }, { enabled: (!!debouncedEndpoint && !!debouncedApiKey && !!debouncedProjectId) || getFromEnv || alreadyConfigured, }, ); // Use custom hook for model selection logic const { languageModel, embeddingModel, setLanguageModel, setEmbeddingModel, languageModels, embeddingModels, } = useModelSelection(modelsData, isEmbedding); const handleGetFromEnvChange = (fromEnv: boolean) => { setGetFromEnv(fromEnv); if (fromEnv) { setApiKey(""); } setEmbeddingModel?.(""); setLanguageModel?.(""); }; const handleSampleDatasetChange = (dataset: boolean) => { setSampleDataset(dataset); }; useEffect(() => { setIsLoadingModels?.(isLoadingModels); }, [isLoadingModels, setIsLoadingModels]); // Update settings when values change useUpdateSettings( "watsonx", { endpoint, apiKey, projectId, languageModel, embeddingModel, }, setSettings, isEmbedding, ); return ( <>
{} : setEndpoint} searchPlaceholder="Search endpoint..." noOptionsPlaceholder={ alreadyConfigured ? "https://•••••••••••••••••••••••••••••••••••••••••" : "No endpoints available" } placeholder="Select endpoint..." /> {alreadyConfigured && (

Reusing endpoint from model provider selection.

)}
setProjectId(e.target.value)} disabled={alreadyConfigured} /> {alreadyConfigured && (

Reusing project ID from model provider selection.

)}
{!hasEnvApiKey && !alreadyConfigured && ( watsonx API key not detected in the environment. )}
{!getFromEnv && !alreadyConfigured && (
setApiKey(e.target.value)} /> {isLoadingModels && (

Validating API key...

)} {modelsError && (

Invalid watsonx API key. Verify or replace the key.

)}
)} {alreadyConfigured && (
setApiKey(e.target.value)} disabled={true} />

Reusing API key from model provider selection.

)} {getFromEnv && isLoadingModels && (

Validating configuration...

)} {getFromEnv && modelsError && (

Connection failed. Check your configuration.

)}
} languageModels={languageModels} embeddingModels={embeddingModels} languageModel={languageModel} embeddingModel={embeddingModel} sampleDataset={sampleDataset} setLanguageModel={setLanguageModel} setEmbeddingModel={setEmbeddingModel} setSampleDataset={handleSampleDatasetChange} /> ); }