diff --git a/web-app/src/routes/settings/providers/$providerName.tsx b/web-app/src/routes/settings/providers/$providerName.tsx index 6300b4f48..21a88191a 100644 --- a/web-app/src/routes/settings/providers/$providerName.tsx +++ b/web-app/src/routes/settings/providers/$providerName.tsx @@ -79,6 +79,7 @@ function ProviderDetail() { const [activeModels, setActiveModels] = useState([]) const [loadingModels, setLoadingModels] = useState([]) const [refreshingModels, setRefreshingModels] = useState(false) + const [importingModel, setImportingModel] = useState(false) const { providerName } = useParams({ from: Route.id }) const { getProviderByName, setProviders, updateProvider } = useModelProvider() const provider = getProviderByName(providerName) @@ -482,7 +483,9 @@ function ProviderDetail() { variant="link" size="sm" className="hover:no-underline" + disabled={importingModel} onClick={async () => { + setImportingModel(true) const selectedFile = await open({ multiple: false, directory: false, @@ -496,10 +499,26 @@ function ProviderDetail() { // If the dialog returns a file path, extract just the file name const fileName = typeof selectedFile === 'string' - ? selectedFile.split(/[\\/]/).pop() + ? selectedFile + .split(/[\\/]/) + .pop() + ?.replace(/\s/g, '-') : undefined if (selectedFile && fileName) { + // Check if model already exists + const modelExists = provider.models.some( + (model) => model.name === fileName + ) + + if (modelExists) { + toast.error('Model already exists', { + description: `${fileName} already imported`, + }) + setImportingModel(false) + return + } + try { await pullModel(fileName, selectedFile) } catch (error) { @@ -509,25 +528,35 @@ function ProviderDetail() { ) } finally { // Refresh the provider to update the models list - getProviders().then(setProviders) + await getProviders().then(setProviders) toast.success(t('providers:import'), { id: `import-model-${provider.provider}`, description: t( 'providers:importModelSuccess', - { provider: provider.provider } + { provider: fileName } ), }) + setImportingModel(false) } + } else { + setImportingModel(false) } }} >
- + {importingModel ? ( + + ) : ( + + )} - {t('providers:import')} + {importingModel ? 'Importing...' : t('providers:import')}