feat: reworked model selector

This commit is contained in:
DESKTOP-RTLN3BA\$punk 2026-04-13 16:10:29 -07:00
parent 7c4d1a6af6
commit 38b9e8dcc5
5 changed files with 1164 additions and 794 deletions

View file

@ -44,21 +44,28 @@ export function ChatHeader({ searchSpaceId, className }: ChatHeaderProps) {
const [isVisionGlobal, setIsVisionGlobal] = useState(false); const [isVisionGlobal, setIsVisionGlobal] = useState(false);
const [visionDialogMode, setVisionDialogMode] = useState<"create" | "edit" | "view">("view"); const [visionDialogMode, setVisionDialogMode] = useState<"create" | "edit" | "view">("view");
// Default provider for create dialogs
const [defaultLLMProvider, setDefaultLLMProvider] = useState<string | undefined>();
const [defaultImageProvider, setDefaultImageProvider] = useState<string | undefined>();
const [defaultVisionProvider, setDefaultVisionProvider] = useState<string | undefined>();
// LLM handlers // LLM handlers
const handleEditLLMConfig = useCallback( const handleEditLLMConfig = useCallback(
(config: NewLLMConfigPublic | GlobalNewLLMConfig, global: boolean) => { (config: NewLLMConfigPublic | GlobalNewLLMConfig, global: boolean) => {
setSelectedConfig(config); setSelectedConfig(config);
setIsGlobal(global); setIsGlobal(global);
setDialogMode(global ? "view" : "edit"); setDialogMode(global ? "view" : "edit");
setDefaultLLMProvider(undefined);
setDialogOpen(true); setDialogOpen(true);
}, },
[] []
); );
const handleAddNewLLM = useCallback(() => { const handleAddNewLLM = useCallback((provider?: string) => {
setSelectedConfig(null); setSelectedConfig(null);
setIsGlobal(false); setIsGlobal(false);
setDialogMode("create"); setDialogMode("create");
setDefaultLLMProvider(provider);
setDialogOpen(true); setDialogOpen(true);
}, []); }, []);
@ -68,10 +75,11 @@ export function ChatHeader({ searchSpaceId, className }: ChatHeaderProps) {
}, []); }, []);
// Image model handlers // Image model handlers
const handleAddImageModel = useCallback(() => { const handleAddImageModel = useCallback((provider?: string) => {
setSelectedImageConfig(null); setSelectedImageConfig(null);
setIsImageGlobal(false); setIsImageGlobal(false);
setImageDialogMode("create"); setImageDialogMode("create");
setDefaultImageProvider(provider);
setImageDialogOpen(true); setImageDialogOpen(true);
}, []); }, []);
@ -80,6 +88,7 @@ export function ChatHeader({ searchSpaceId, className }: ChatHeaderProps) {
setSelectedImageConfig(config); setSelectedImageConfig(config);
setIsImageGlobal(global); setIsImageGlobal(global);
setImageDialogMode(global ? "view" : "edit"); setImageDialogMode(global ? "view" : "edit");
setDefaultImageProvider(undefined);
setImageDialogOpen(true); setImageDialogOpen(true);
}, },
[] []
@ -91,10 +100,11 @@ export function ChatHeader({ searchSpaceId, className }: ChatHeaderProps) {
}, []); }, []);
// Vision model handlers // Vision model handlers
const handleAddVisionModel = useCallback(() => { const handleAddVisionModel = useCallback((provider?: string) => {
setSelectedVisionConfig(null); setSelectedVisionConfig(null);
setIsVisionGlobal(false); setIsVisionGlobal(false);
setVisionDialogMode("create"); setVisionDialogMode("create");
setDefaultVisionProvider(provider);
setVisionDialogOpen(true); setVisionDialogOpen(true);
}, []); }, []);
@ -103,6 +113,7 @@ export function ChatHeader({ searchSpaceId, className }: ChatHeaderProps) {
setSelectedVisionConfig(config); setSelectedVisionConfig(config);
setIsVisionGlobal(global); setIsVisionGlobal(global);
setVisionDialogMode(global ? "view" : "edit"); setVisionDialogMode(global ? "view" : "edit");
setDefaultVisionProvider(undefined);
setVisionDialogOpen(true); setVisionDialogOpen(true);
}, },
[] []
@ -131,6 +142,7 @@ export function ChatHeader({ searchSpaceId, className }: ChatHeaderProps) {
isGlobal={isGlobal} isGlobal={isGlobal}
searchSpaceId={searchSpaceId} searchSpaceId={searchSpaceId}
mode={dialogMode} mode={dialogMode}
defaultProvider={defaultLLMProvider}
/> />
<ImageConfigDialog <ImageConfigDialog
open={imageDialogOpen} open={imageDialogOpen}
@ -139,6 +151,7 @@ export function ChatHeader({ searchSpaceId, className }: ChatHeaderProps) {
isGlobal={isImageGlobal} isGlobal={isImageGlobal}
searchSpaceId={searchSpaceId} searchSpaceId={searchSpaceId}
mode={imageDialogMode} mode={imageDialogMode}
defaultProvider={defaultImageProvider}
/> />
<VisionConfigDialog <VisionConfigDialog
open={visionDialogOpen} open={visionDialogOpen}
@ -147,6 +160,7 @@ export function ChatHeader({ searchSpaceId, className }: ChatHeaderProps) {
isGlobal={isVisionGlobal} isGlobal={isVisionGlobal}
searchSpaceId={searchSpaceId} searchSpaceId={searchSpaceId}
mode={visionDialogMode} mode={visionDialogMode}
defaultProvider={defaultVisionProvider}
/> />
</div> </div>
); );

File diff suppressed because it is too large Load diff

View file

@ -48,6 +48,7 @@ interface ImageConfigDialogProps {
isGlobal: boolean; isGlobal: boolean;
searchSpaceId: number; searchSpaceId: number;
mode: "create" | "edit" | "view"; mode: "create" | "edit" | "view";
defaultProvider?: string;
} }
const INITIAL_FORM = { const INITIAL_FORM = {
@ -67,6 +68,7 @@ export function ImageConfigDialog({
isGlobal, isGlobal,
searchSpaceId, searchSpaceId,
mode, mode,
defaultProvider,
}: ImageConfigDialogProps) { }: ImageConfigDialogProps) {
const [isSubmitting, setIsSubmitting] = useState(false); const [isSubmitting, setIsSubmitting] = useState(false);
const [formData, setFormData] = useState(INITIAL_FORM); const [formData, setFormData] = useState(INITIAL_FORM);
@ -87,11 +89,11 @@ export function ImageConfigDialog({
api_version: config.api_version || "", api_version: config.api_version || "",
}); });
} else if (mode === "create") { } else if (mode === "create") {
setFormData(INITIAL_FORM); setFormData({ ...INITIAL_FORM, provider: defaultProvider ?? "" });
} }
setScrollPos("top"); setScrollPos("top");
} }
}, [open, mode, config, isGlobal]); }, [open, mode, config, isGlobal, defaultProvider]);
const { mutateAsync: createConfig } = useAtomValue(createImageGenConfigMutationAtom); const { mutateAsync: createConfig } = useAtomValue(createImageGenConfigMutationAtom);
const { mutateAsync: updateConfig } = useAtomValue(updateImageGenConfigMutationAtom); const { mutateAsync: updateConfig } = useAtomValue(updateImageGenConfigMutationAtom);

View file

@ -28,6 +28,7 @@ interface ModelConfigDialogProps {
isGlobal: boolean; isGlobal: boolean;
searchSpaceId: number; searchSpaceId: number;
mode: "create" | "edit" | "view"; mode: "create" | "edit" | "view";
defaultProvider?: string;
} }
export function ModelConfigDialog({ export function ModelConfigDialog({
@ -37,6 +38,7 @@ export function ModelConfigDialog({
isGlobal, isGlobal,
searchSpaceId, searchSpaceId,
mode, mode,
defaultProvider,
}: ModelConfigDialogProps) { }: ModelConfigDialogProps) {
const [isSubmitting, setIsSubmitting] = useState(false); const [isSubmitting, setIsSubmitting] = useState(false);
const [scrollPos, setScrollPos] = useState<"top" | "middle" | "bottom">("top"); const [scrollPos, setScrollPos] = useState<"top" | "middle" | "bottom">("top");
@ -194,10 +196,12 @@ export function ModelConfigDialog({
{mode === "create" ? ( {mode === "create" ? (
<LLMConfigForm <LLMConfigForm
key={defaultProvider ?? "no-provider"}
searchSpaceId={searchSpaceId} searchSpaceId={searchSpaceId}
onSubmit={handleSubmit} onSubmit={handleSubmit}
mode="create" mode="create"
formId="model-config-form" formId="model-config-form"
initialData={defaultProvider ? { provider: defaultProvider as LiteLLMProvider } : undefined}
/> />
) : isGlobal && config ? ( ) : isGlobal && config ? (
<div className="space-y-6"> <div className="space-y-6">

View file

@ -49,6 +49,7 @@ interface VisionConfigDialogProps {
isGlobal: boolean; isGlobal: boolean;
searchSpaceId: number; searchSpaceId: number;
mode: "create" | "edit" | "view"; mode: "create" | "edit" | "view";
defaultProvider?: string;
} }
const INITIAL_FORM = { const INITIAL_FORM = {
@ -68,6 +69,7 @@ export function VisionConfigDialog({
isGlobal, isGlobal,
searchSpaceId, searchSpaceId,
mode, mode,
defaultProvider,
}: VisionConfigDialogProps) { }: VisionConfigDialogProps) {
const [isSubmitting, setIsSubmitting] = useState(false); const [isSubmitting, setIsSubmitting] = useState(false);
const [formData, setFormData] = useState(INITIAL_FORM); const [formData, setFormData] = useState(INITIAL_FORM);
@ -87,11 +89,11 @@ export function VisionConfigDialog({
api_version: (config as VisionLLMConfig).api_version || "", api_version: (config as VisionLLMConfig).api_version || "",
}); });
} else if (mode === "create") { } else if (mode === "create") {
setFormData(INITIAL_FORM); setFormData({ ...INITIAL_FORM, provider: defaultProvider ?? "" });
} }
setScrollPos("top"); setScrollPos("top");
} }
}, [open, mode, config, isGlobal]); }, [open, mode, config, isGlobal, defaultProvider]);
const { mutateAsync: createConfig } = useAtomValue(createVisionLLMConfigMutationAtom); const { mutateAsync: createConfig } = useAtomValue(createVisionLLMConfigMutationAtom);
const { mutateAsync: updateConfig } = useAtomValue(updateVisionLLMConfigMutationAtom); const { mutateAsync: updateConfig } = useAtomValue(updateVisionLLMConfigMutationAtom);