setProjectId(e.target.value)}
- />
{isLoadingModels && (
Validating configuration...
diff --git a/frontend/src/app/onboarding/components/model-selector.tsx b/frontend/src/app/onboarding/components/model-selector.tsx
index dfed52ee..c5f9454c 100644
--- a/frontend/src/app/onboarding/components/model-selector.tsx
+++ b/frontend/src/app/onboarding/components/model-selector.tsx
@@ -1,115 +1,158 @@
import { CheckIcon, ChevronsUpDownIcon } from "lucide-react";
import { useEffect, useState } from "react";
+import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
import {
- Command,
- CommandEmpty,
- CommandGroup,
- CommandInput,
- CommandItem,
- CommandList,
+ Command,
+ CommandEmpty,
+ CommandGroup,
+ CommandInput,
+ CommandItem,
+ CommandList,
} from "@/components/ui/command";
import {
- Popover,
- PopoverContent,
- PopoverTrigger,
+ Popover,
+ PopoverContent,
+ PopoverTrigger,
} from "@/components/ui/popover";
import { cn } from "@/lib/utils";
export function ModelSelector({
- options,
- value,
- onValueChange,
- icon,
- placeholder = "Select model...",
- searchPlaceholder = "Search model...",
- noOptionsPlaceholder = "No models available",
+ options,
+ value,
+ onValueChange,
+ icon,
+ placeholder = "Select model...",
+ searchPlaceholder = "Search model...",
+ noOptionsPlaceholder = "No models available",
+ custom = false,
}: {
- options: {
- value: string;
- label: string;
- default?: boolean;
- }[];
- value: string;
- icon?: React.ReactNode;
- placeholder?: string;
- searchPlaceholder?: string;
- noOptionsPlaceholder?: string;
- onValueChange: (value: string) => void;
+ options: {
+ value: string;
+ label: string;
+ default?: boolean;
+ }[];
+ value: string;
+ icon?: React.ReactNode;
+ placeholder?: string;
+ searchPlaceholder?: string;
+ noOptionsPlaceholder?: string;
+ custom?: boolean;
+ onValueChange: (value: string) => void;
}) {
- const [open, setOpen] = useState(false);
- useEffect(() => {
- if (value && !options.find((option) => option.value === value)) {
- onValueChange("");
- }
- }, [options, value, onValueChange]);
- return (
-
-
- {/** biome-ignore lint/a11y/useSemanticElements: has to be a Button */}
-
-
-
-
-
-
- {noOptionsPlaceholder}
-
- {options.map((option) => (
- {
- if (currentValue !== value) {
- onValueChange(currentValue);
- }
- setOpen(false);
- }}
- >
-
-
- {option.label}
- {option.default && (
-
- Default
-
- )}
-
-
- ))}
-
-
-
-
-
- );
+ const [open, setOpen] = useState(false);
+ const [searchValue, setSearchValue] = useState("");
+
+ useEffect(() => {
+ if (value && value !== "" && (!options.find((option) => option.value === value) && !custom)) {
+ onValueChange("");
+ }
+ }, [options, value, custom, onValueChange]);
+ return (
+
+
+ {/** biome-ignore lint/a11y/useSemanticElements: has to be a Button */}
+
+
+
+
+
+
+ {noOptionsPlaceholder}
+
+ {options.map((option) => (
+ {
+ if (currentValue !== value) {
+ onValueChange(currentValue);
+ }
+ setOpen(false);
+ }}
+ >
+
+
+ {option.label}
+ {/* {option.default && (
+ // DISABLING DEFAULT TAG FOR NOW
+ Default
+
+ )} */}
+
+
+ ))}
+ {custom &&
+ searchValue &&
+ !options.find((option) => option.value === searchValue) && (
+ {
+ if (currentValue !== value) {
+ onValueChange(currentValue);
+ }
+ setOpen(false);
+ }}
+ >
+
+
+ {searchValue}
+
+ Custom
+
+
+
+ )}
+
+
+
+
+
+ );
}
diff --git a/frontend/src/app/onboarding/components/openai-onboarding.tsx b/frontend/src/app/onboarding/components/openai-onboarding.tsx
index b202756d..b057efc0 100644
--- a/frontend/src/app/onboarding/components/openai-onboarding.tsx
+++ b/frontend/src/app/onboarding/components/openai-onboarding.tsx
@@ -2,7 +2,7 @@ import { useState } from "react";
import { LabelInput } from "@/components/label-input";
import { LabelWrapper } from "@/components/label-wrapper";
import OpenAILogo from "@/components/logo/openai-logo";
-import { Checkbox } from "@/components/ui/checkbox";
+import { Switch } from "@/components/ui/switch";
import { useDebouncedValue } from "@/lib/debounce";
import type { OnboardingVariables } from "../../api/mutations/useOnboardingMutation";
import { useGetOpenAIModelsQuery } from "../../api/queries/useGetModelsQuery";
@@ -11,121 +11,114 @@ import { useUpdateSettings } from "../hooks/useUpdateSettings";
import { AdvancedOnboarding } from "./advanced";
export function OpenAIOnboarding({
- setSettings,
- sampleDataset,
- setSampleDataset,
+ setSettings,
+ sampleDataset,
+ setSampleDataset,
}: {
- setSettings: (settings: OnboardingVariables) => void;
- sampleDataset: boolean;
- setSampleDataset: (dataset: boolean) => void;
+ setSettings: (settings: OnboardingVariables) => void;
+ sampleDataset: boolean;
+ setSampleDataset: (dataset: boolean) => void;
}) {
- const [apiKey, setApiKey] = useState("");
- const [getFromEnv, setGetFromEnv] = useState(true);
- const debouncedApiKey = useDebouncedValue(apiKey, 500);
+ const [apiKey, setApiKey] = useState("");
+ const [getFromEnv, setGetFromEnv] = useState(true);
+ const debouncedApiKey = useDebouncedValue(apiKey, 500);
- // Fetch models from API when API key is provided
- const {
- data: modelsData,
- isLoading: isLoadingModels,
- error: modelsError,
- } = useGetOpenAIModelsQuery(
- getFromEnv
- ? { apiKey: "" }
- : debouncedApiKey
- ? { apiKey: debouncedApiKey }
- : undefined,
- { enabled: debouncedApiKey !== "" || getFromEnv },
- );
- // Use custom hook for model selection logic
- const {
- languageModel,
- embeddingModel,
- setLanguageModel,
- setEmbeddingModel,
- languageModels,
- embeddingModels,
- } = useModelSelection(modelsData);
- const handleSampleDatasetChange = (dataset: boolean) => {
- setSampleDataset(dataset);
- };
+ // Fetch models from API when API key is provided
+ const {
+ data: modelsData,
+ isLoading: isLoadingModels,
+ error: modelsError,
+ } = useGetOpenAIModelsQuery(
+ getFromEnv
+ ? { apiKey: "" }
+ : debouncedApiKey
+ ? { apiKey: debouncedApiKey }
+ : undefined,
+ { enabled: debouncedApiKey !== "" || getFromEnv },
+ );
+ // Use custom hook for model selection logic
+ const {
+ languageModel,
+ embeddingModel,
+ setLanguageModel,
+ setEmbeddingModel,
+ languageModels,
+ embeddingModels,
+ } = useModelSelection(modelsData);
+ const handleSampleDatasetChange = (dataset: boolean) => {
+ setSampleDataset(dataset);
+ };
- const handleGetFromEnvChange = (fromEnv: boolean) => {
- setGetFromEnv(fromEnv);
- if (fromEnv) {
- setApiKey("");
- }
- setLanguageModel("");
- setEmbeddingModel("");
- };
+ const handleGetFromEnvChange = (fromEnv: boolean) => {
+ setGetFromEnv(fromEnv);
+ if (fromEnv) {
+ setApiKey("");
+ }
+ setLanguageModel("");
+ setEmbeddingModel("");
+ };
- // Update settings when values change
- useUpdateSettings(
- "openai",
- {
- apiKey,
- languageModel,
- embeddingModel,
- },
- setSettings,
- );
- return (
- <>
-
-
- Reuse the key from your environment config.
-
- Uncheck to enter a different key.
- >
- }
- flex
- start
- >
-
-
- {!getFromEnv && (
-
-
setApiKey(e.target.value)}
- />
- {isLoadingModels && (
-
- Validating API key...
-
- )}
- {modelsError && (
-
- Invalid OpenAI API key. Verify or replace the key.
-
- )}
-
- )}
-
- }
- languageModels={languageModels}
- embeddingModels={embeddingModels}
- languageModel={languageModel}
- embeddingModel={embeddingModel}
- sampleDataset={sampleDataset}
- setLanguageModel={setLanguageModel}
- setSampleDataset={handleSampleDatasetChange}
- setEmbeddingModel={setEmbeddingModel}
- />
- >
- );
+ // Update settings when values change
+ useUpdateSettings(
+ "openai",
+ {
+ apiKey,
+ languageModel,
+ embeddingModel,
+ },
+ setSettings,
+ );
+ return (
+ <>
+
+
+
+
+ {!getFromEnv && (
+
+
setApiKey(e.target.value)}
+ />
+ {isLoadingModels && (
+
+ Validating API key...
+
+ )}
+ {modelsError && (
+
+ Invalid OpenAI API key. Verify or replace the key.
+
+ )}
+
+ )}
+
+ }
+ languageModels={languageModels}
+ embeddingModels={embeddingModels}
+ languageModel={languageModel}
+ embeddingModel={embeddingModel}
+ sampleDataset={sampleDataset}
+ setLanguageModel={setLanguageModel}
+ setSampleDataset={handleSampleDatasetChange}
+ setEmbeddingModel={setEmbeddingModel}
+ />
+ >
+ );
}
diff --git a/frontend/src/app/onboarding/page.tsx b/frontend/src/app/onboarding/page.tsx
index a82e5fab..ca938eeb 100644
--- a/frontend/src/app/onboarding/page.tsx
+++ b/frontend/src/app/onboarding/page.tsx
@@ -68,7 +68,6 @@ function OnboardingPage() {
// Mutations
const onboardingMutation = useOnboardingMutation({
onSuccess: (data) => {
- toast.success("Onboarding completed successfully!");
console.log("Onboarding completed successfully", data);
router.push(redirect);
},
@@ -137,7 +136,7 @@ function OnboardingPage() {
Connect a model provider