From 7397e33f2920d26c06ecb19a6ab68e4fec0da51b Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Mon, 27 Oct 2025 15:08:50 +0530 Subject: [PATCH] feat(app): rename providers to connection, enhance UX --- .../Sections/Models/AddProviderDialog.tsx | 16 +- .../Sections/Models/DeleteProviderDialog.tsx | 13 +- .../Sections/Models/ModelProvider.tsx | 273 +++++++++--------- .../Settings/Sections/Models/ModelSelect.tsx | 4 +- .../Settings/Sections/Models/Section.tsx | 52 +++- .../Sections/Models/UpdateProviderDialog.tsx | 12 +- src/components/Settings/SettingsDialogue.tsx | 2 +- src/components/Setup/SetupConfig.tsx | 19 +- 8 files changed, 219 insertions(+), 172 deletions(-) diff --git a/src/components/Settings/Sections/Models/AddProviderDialog.tsx b/src/components/Settings/Sections/Models/AddProviderDialog.tsx index 83047be..01cf39d 100644 --- a/src/components/Settings/Sections/Models/AddProviderDialog.tsx +++ b/src/components/Settings/Sections/Models/AddProviderDialog.tsx @@ -82,10 +82,10 @@ const AddProvider = ({ setProviders((prev) => [...prev, data]); - toast.success('Provider added successfully.'); + toast.success('Connection added successfully.'); } catch (error) { console.error('Error adding provider:', error); - toast.error('Failed to add provider.'); + toast.error('Failed to add connection.'); } finally { setLoading(false); setOpen(false); @@ -99,7 +99,7 @@ const AddProvider = ({ className="px-3 md:px-4 py-1.5 md:py-2 rounded-lg text-xs sm:text-sm border border-light-200 dark:border-dark-200 text-black dark:text-white bg-light-secondary/50 dark:bg-dark-secondary/50 hover:bg-light-secondary hover:dark:bg-dark-secondary hover:border-light-300 hover:dark:border-dark-300 flex flex-row items-center space-x-1 active:scale-95 transition duration-200" > - Add Provider + Add Connection {open && ( @@ -120,7 +120,7 @@ const AddProvider = ({

- Add new provider + Add new connection

@@ -128,7 +128,7 @@ const AddProvider = ({
setName(e.target.value)} className="w-full rounded-lg border border-light-200 dark:border-dark-200 bg-light-primary dark:bg-dark-primary px-4 py-3 pr-10 text-sm text-black/80 dark:text-white/80 placeholder:text-black/40 dark:placeholder:text-white/40 focus-visible:outline-none focus-visible:border-light-300 dark:focus-visible:border-dark-300 transition-colors disabled:cursor-not-allowed disabled:opacity-60" - placeholder={'Provider Name'} + placeholder={'e.g., My OpenAI Connection'} type="text" required={true} /> @@ -199,7 +199,7 @@ const AddProvider = ({ {loading ? ( ) : ( - 'Add Provider' + 'Add Connection' )}
diff --git a/src/components/Settings/Sections/Models/DeleteProviderDialog.tsx b/src/components/Settings/Sections/Models/DeleteProviderDialog.tsx index e05a449..c9a4c72 100644 --- a/src/components/Settings/Sections/Models/DeleteProviderDialog.tsx +++ b/src/components/Settings/Sections/Models/DeleteProviderDialog.tsx @@ -34,10 +34,10 @@ const DeleteProvider = ({ return prev.filter((p) => p.id !== modelProvider.id); }); - toast.success('Provider deleted successfully.'); + toast.success('Connection deleted successfully.'); } catch (error) { console.error('Error deleting provider:', error); - toast.error('Failed to delete provider.'); + toast.error('Failed to delete connection.'); } finally { setLoading(false); } @@ -51,7 +51,7 @@ const DeleteProvider = ({ setOpen(true); }} className="group p-1.5 rounded-md hover:bg-light-200 hover:dark:bg-dark-200 transition-colors group" - title="Delete provider" + title="Delete connection" >

- Delete provider + Delete connection

-

- Are you sure you want to delete the provider " +

+ Are you sure you want to delete the connection " {modelProvider.name}"? This action cannot be undone. + All associated models will also be removed.

diff --git a/src/components/Settings/Sections/Models/ModelProvider.tsx b/src/components/Settings/Sections/Models/ModelProvider.tsx index 79928c2..061ee1c 100644 --- a/src/components/Settings/Sections/Models/ModelProvider.tsx +++ b/src/components/Settings/Sections/Models/ModelProvider.tsx @@ -1,7 +1,7 @@ import { UIConfigField, ConfigModelProvider } from '@/lib/config/types'; import { cn } from '@/lib/utils'; import { AnimatePresence, motion } from 'framer-motion'; -import { AlertCircle, ChevronDown, Pencil, Trash2, X } from 'lucide-react'; +import { AlertCircle, Plug2, Plus, Pencil, Trash2, X } from 'lucide-react'; import { useState } from 'react'; import { toast } from 'sonner'; import AddModel from './AddModelDialog'; @@ -17,7 +17,7 @@ const ModelProvider = ({ fields: UIConfigField[]; setProviders: React.Dispatch>; }) => { - const [open, setOpen] = useState(false); + const [open, setOpen] = useState(true); const handleModelDelete = async ( type: 'chat' | 'embedding', @@ -66,146 +66,157 @@ const ModelProvider = ({ } }; + const modelCount = + modelProvider.chatModels.filter((m) => m.key !== 'error').length + + modelProvider.embeddingModels.filter((m) => m.key !== 'error').length; + const hasError = + modelProvider.chatModels.some((m) => m.key === 'error') || + modelProvider.embeddingModels.some((m) => m.key === 'error'); + return (
-
setOpen(!open)} - > -

- {modelProvider.name} -

-
-
- - +
+
+
+
- +

+ {modelProvider.name} +

+ {modelCount > 0 && ( +

+ {modelCount} model{modelCount !== 1 ? 's' : ''} configured +

)} +
+
+
+ +
- - {open && ( - -
-
-
-
-

- Chat models -

- -
-
- {modelProvider.chatModels.some((m) => m.key === 'error') ? ( -
- - - { - modelProvider.chatModels.find( - (m) => m.key === 'error', - )?.name - } - -
- ) : ( -
- {modelProvider.chatModels.map((model, index) => ( -
- {model.name} - -
- ))} -
- )} -
+
+
+
+

+ Chat Models +

+ {!modelProvider.chatModels.some((m) => m.key === 'error') && ( + + )} +
+
+ {modelProvider.chatModels.some((m) => m.key === 'error') ? ( +
+ + + { + modelProvider.chatModels.find((m) => m.key === 'error') + ?.name + } +
-
-
-

- Embedding models -

- -
-
- {modelProvider.embeddingModels.some( - (m) => m.key === 'error', - ) ? ( -
- - - { - modelProvider.embeddingModels.find( - (m) => m.key === 'error', - )?.name - } - -
- ) : ( -
- {modelProvider.embeddingModels.map((model, index) => ( -
- {model.name} - -
- ))} -
- )} -
+ ) : modelProvider.chatModels.filter((m) => m.key !== 'error') + .length === 0 && !hasError ? ( +
+

+ No chat models configured +

-
- - )} - + ) : modelProvider.chatModels.filter((m) => m.key !== 'error') + .length > 0 ? ( +
+ {modelProvider.chatModels.map((model, index) => ( +
+ {model.name} + +
+ ))} +
+ ) : null} +
+
+ +
+
+

+ Embedding Models +

+ {!modelProvider.embeddingModels.some((m) => m.key === 'error') && ( + + )} +
+
+ {modelProvider.embeddingModels.some((m) => m.key === 'error') ? ( +
+ + + { + modelProvider.embeddingModels.find((m) => m.key === 'error') + ?.name + } + +
+ ) : modelProvider.embeddingModels.filter((m) => m.key !== 'error') + .length === 0 && !hasError ? ( +
+

+ No embedding models configured +

+
+ ) : modelProvider.embeddingModels.filter((m) => m.key !== 'error') + .length > 0 ? ( +
+ {modelProvider.embeddingModels.map((model, index) => ( +
+ {model.name} + +
+ ))} +
+ ) : null} +
+
+
); }; diff --git a/src/components/Settings/Sections/Models/ModelSelect.tsx b/src/components/Settings/Sections/Models/ModelSelect.tsx index 75117b3..51614f2 100644 --- a/src/components/Settings/Sections/Models/ModelSelect.tsx +++ b/src/components/Settings/Sections/Models/ModelSelect.tsx @@ -64,8 +64,8 @@ const ModelSelect = ({

{type === 'chat' - ? 'Select the model to use for chat responses' - : 'Select the model to use for embeddings'} + ? 'Choose which model to use for generating responses' + : 'Choose which model to use for generating embeddings'}

setName(event.target.value)} className="w-full rounded-lg border border-light-200 dark:border-dark-200 bg-light-primary dark:bg-dark-primary px-4 py-3 pr-10 text-sm text-black/80 dark:text-white/80 placeholder:text-black/40 dark:placeholder:text-white/40 focus-visible:outline-none focus-visible:border-light-300 dark:focus-visible:border-dark-300 transition-colors disabled:cursor-not-allowed disabled:opacity-60" - placeholder={'Provider Name'} + placeholder={'Connection Name'} type="text" required={true} /> @@ -171,7 +171,7 @@ const UpdateProvider = ({ {loading ? ( ) : ( - 'Update Provider' + 'Update Connection' )}
diff --git a/src/components/Settings/SettingsDialogue.tsx b/src/components/Settings/SettingsDialogue.tsx index 7950954..a799bd3 100644 --- a/src/components/Settings/SettingsDialogue.tsx +++ b/src/components/Settings/SettingsDialogue.tsx @@ -28,7 +28,7 @@ const sections = [ { key: 'models', name: 'Models', - description: 'Configure model settings.', + description: 'Connect to AI services and manage connections.', icon: BrainCog, component: Models, dataAdd: 'modelProviders', diff --git a/src/components/Setup/SetupConfig.tsx b/src/components/Setup/SetupConfig.tsx index 334974f..4e17a92 100644 --- a/src/components/Setup/SetupConfig.tsx +++ b/src/components/Setup/SetupConfig.tsx @@ -63,7 +63,11 @@ const SetupConfig = ({ } }; - const hasProviders = providers.length > 0; + const visibleProviders = providers.filter( + (p) => p.name.toLowerCase() !== 'transformers', + ); + const hasProviders = + visibleProviders.filter((p) => p.chatModels.length > 0).length > 0; return (
@@ -81,10 +85,10 @@ const SetupConfig = ({

- Manage Providers + Manage Connections

- Add and configure your model providers + Add connections to access AI models

- ) : providers.length === 0 ? ( + ) : visibleProviders.length === 0 ? (

- No providers configured + No connections configured +

+

+ Click "Add Connection" above to get started

) : ( - providers.map((provider) => ( + visibleProviders.map((provider) => (