From 3cd2df0b5084a032d80d3a113745e889e2b48fde Mon Sep 17 00:00:00 2001 From: Enrico Ros Date: Thu, 29 Jan 2026 20:40:45 -0800 Subject: [PATCH] Model Services: Duplicates removal --- .../layout/overlays/store-layout-overlays.ts | 1 + .../models-modal/ModelsConfiguratorModal.tsx | 28 +++++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/common/layout/overlays/store-layout-overlays.ts b/src/common/layout/overlays/store-layout-overlays.ts index 9d08482b4..65d9bafde 100644 --- a/src/common/layout/overlays/store-layout-overlays.ts +++ b/src/common/layout/overlays/store-layout-overlays.ts @@ -27,6 +27,7 @@ export type GlobalOverlayId = // string - disabled so we keep an orderliness | 'livefile-overwrite' | 'shortcuts-confirm-close' | 'blocks-off-enhance-code' + | 'llms-remove-clones' | 'llms-reset-parameters' | 'llms-service-remove' | 'composer-unsupported-attachments' // The LLM does not seem to support this mime type - continue anyway? diff --git a/src/modules/llms/models-modal/ModelsConfiguratorModal.tsx b/src/modules/llms/models-modal/ModelsConfiguratorModal.tsx index 100bdc74c..79248839b 100644 --- a/src/modules/llms/models-modal/ModelsConfiguratorModal.tsx +++ b/src/modules/llms/models-modal/ModelsConfiguratorModal.tsx @@ -64,6 +64,7 @@ export function ModelsConfiguratorModal(props: { ?? null; const activeService = modelsServices.find(s => s.id === activeServiceId); + // const hasClones = useModelsStore(({ llms }) => llms.some(llm => llm.sId === activeServiceId && llm.isUserClone)); const hasAnyServices = !!modelsServices.length; const isTabWizard = tab === 'wizard'; @@ -119,6 +120,16 @@ export function ModelsConfiguratorModal(props: { ).then(() => llmsStoreActions().resetServiceUserParameters(activeServiceId)).catch(() => null /* ignore closure */); }, [activeService?.label, activeServiceId, showPromisedOverlay]); + const handleRemoveClones = React.useCallback(() => { + showPromisedOverlay('llms-remove-clones', {}, ({ onResolve, onUserReject }) => + onResolve(true)} + confirmationText={`Remove all user-cloned models from ${activeService?.label ?? 'this service'}?`} + positiveActionText='Remove' + />, + ).then(() => llmsStoreActions().removeCustomModels(activeServiceId)).catch(() => null /* ignore closure */); + }, [activeService?.label, activeServiceId, showPromisedOverlay]); + const handleDeleteService = React.useCallback((serviceId: DModelsServiceId, skipConfirmation: boolean) => { const targetService = modelsServices.find(s => s.id === serviceId); if (!targetService) return; @@ -158,7 +169,14 @@ export function ModelsConfiguratorModal(props: { - + + + {/* Service Name Header */} + {/**/} + {/* */} + {/*
{activeService?.label ?? ''}
*/} + {/*
*/} + {/**/} {/* Refresh Models */} @@ -174,6 +192,12 @@ export function ModelsConfiguratorModal(props: { Reset Customizations + {/* Remove Cloned Models */} + + + Remove Duplicate Models + + {/* View toggles */} @@ -199,7 +223,7 @@ export function ModelsConfiguratorModal(props: { ); return undefined; - }, [handleRefreshModels, handleResetAllParameters, handleShowAdvanced, handleShowWizard, hasAnyServices, hasLLMs, isMobile, isRefreshing, isTabSetup, isTabWizard, setShowModelsHidden, showModelsHidden]); + }, [handleRefreshModels, handleRemoveClones, handleResetAllParameters, handleShowAdvanced, handleShowWizard, hasAnyServices, hasLLMs, isMobile, isRefreshing, isTabSetup, isTabWizard, setShowModelsHidden, showModelsHidden]); // custom done button for wizard mode (combines start and close buttons)