From 08e4c163ea99d5310f50da6959b0d694a4e441c8 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 17 May 2025 01:47:48 +0400 Subject: [PATCH] feat: local/external connections --- backend/open_webui/routers/ollama.py | 12 ++++-- backend/open_webui/routers/openai.py | 18 +++++---- backend/open_webui/utils/models.py | 1 + src/lib/components/AddConnectionModal.svelte | 38 ++++++++++++++++++- .../admin/Settings/Interface.svelte | 10 ++--- .../chat/ModelSelector/Selector.svelte | 28 +++++++------- 6 files changed, 74 insertions(+), 33 deletions(-) diff --git a/backend/open_webui/routers/ollama.py b/backend/open_webui/routers/ollama.py index 85349339f..7c313ea97 100644 --- a/backend/open_webui/routers/ollama.py +++ b/backend/open_webui/routers/ollama.py @@ -340,6 +340,8 @@ async def get_all_models(request: Request, user: UserModel = None): ), # Legacy support ) + connection_type = api_config.get("connection_type", "local") + prefix_id = api_config.get("prefix_id", None) tags = api_config.get("tags", []) model_ids = api_config.get("model_ids", []) @@ -352,14 +354,16 @@ async def get_all_models(request: Request, user: UserModel = None): ) ) - if prefix_id: - for model in response.get("models", []): + for model in response.get("models", []): + if prefix_id: model["model"] = f"{prefix_id}.{model['model']}" - if tags: - for model in response.get("models", []): + if tags: model["tags"] = tags + if connection_type: + model["connection_type"] = connection_type + def merge_models_lists(model_lists): merged_models = {} diff --git a/backend/open_webui/routers/openai.py b/backend/open_webui/routers/openai.py index 02a81209c..a196eca26 100644 --- a/backend/open_webui/routers/openai.py +++ b/backend/open_webui/routers/openai.py @@ -353,21 +353,22 @@ async def get_all_models_responses(request: Request, user: UserModel) -> list: ), # Legacy support ) + connection_type = api_config.get("connection_type", "external") prefix_id = api_config.get("prefix_id", None) tags = api_config.get("tags", []) - if prefix_id: - for model in ( - response if isinstance(response, list) else response.get("data", []) - ): + for model in ( + response if isinstance(response, list) else response.get("data", []) + ): + if prefix_id: model["id"] = f"{prefix_id}.{model['id']}" - if tags: - for model in ( - response if isinstance(response, list) else response.get("data", []) - ): + if tags: model["tags"] = tags + if connection_type: + model["connection_type"] = connection_type + log.debug(f"get_all_models:responses() {responses}") return responses @@ -415,6 +416,7 @@ async def get_all_models(request: Request, user: UserModel) -> dict[str, list]: "name": model.get("name", model["id"]), "owned_by": "openai", "openai": model, + "connection_type": model.get("connection_type", "external"), "urlIdx": idx, } for model in models diff --git a/backend/open_webui/utils/models.py b/backend/open_webui/utils/models.py index 952786691..77ff0c932 100644 --- a/backend/open_webui/utils/models.py +++ b/backend/open_webui/utils/models.py @@ -49,6 +49,7 @@ async def get_all_base_models(request: Request, user: UserModel = None): "created": int(time.time()), "owned_by": "ollama", "ollama": model, + "connection_type": model.get("connection_type", "local"), "tags": model.get("tags", []), } for model in ollama_models["models"] diff --git a/src/lib/components/AddConnectionModal.svelte b/src/lib/components/AddConnectionModal.svelte index 864d850a6..629f19f1b 100644 --- a/src/lib/components/AddConnectionModal.svelte +++ b/src/lib/components/AddConnectionModal.svelte @@ -30,6 +30,9 @@ let url = ''; let key = ''; + let connectionType = 'external'; + let azure = false; + let prefixId = ''; let enable = true; let tags = []; @@ -95,7 +98,9 @@ enable: enable, tags: tags, prefix_id: prefixId, - model_ids: modelIds + model_ids: modelIds, + connection_type: connectionType, + ...(!ollama && azure ? { azure: true } : {}) } }; @@ -120,6 +125,13 @@ tags = connection.config?.tags ?? []; prefixId = connection.config?.prefix_id ?? ''; modelIds = connection.config?.model_ids ?? []; + + if (ollama) { + connectionType = connection.config?.connection_type ?? 'local'; + } else { + connectionType = connection.config?.connection_type ?? 'external'; + azure = connection.config?.azure ?? false; + } } }; @@ -134,7 +146,7 @@
-
+
{#if edit} {$i18n.t('Edit Connection')} @@ -172,6 +184,28 @@ >
+
+
{$i18n.t('Connection Type')}
+ +
+ +
+
+
+ +
{$i18n.t('URL')}
diff --git a/src/lib/components/admin/Settings/Interface.svelte b/src/lib/components/admin/Settings/Interface.svelte index 53d4f29e4..866237973 100644 --- a/src/lib/components/admin/Settings/Interface.svelte +++ b/src/lib/components/admin/Settings/Interface.svelte @@ -108,8 +108,8 @@
-
-
{$i18n.t('Set Task Model')}
+
+
{$i18n.t('Task Model')}
-
{$i18n.t('Local Models')}
+
{$i18n.t('Local Task Model')}
{ if (selectedConnectionType === '') { return true; - } else if (selectedConnectionType === 'ollama') { - return item.model?.owned_by === 'ollama'; - } else if (selectedConnectionType === 'openai') { - return item.model?.owned_by === 'openai'; + } else if (selectedConnectionType === 'local') { + return item.model?.connection_type === 'local'; + } else if (selectedConnectionType === 'external') { + return item.model?.connection_type === 'external'; } else if (selectedConnectionType === 'direct') { return item.model?.direct; } @@ -118,10 +118,10 @@ .filter((item) => { if (selectedConnectionType === '') { return true; - } else if (selectedConnectionType === 'ollama') { - return item.model?.owned_by === 'ollama'; - } else if (selectedConnectionType === 'openai') { - return item.model?.owned_by === 'openai'; + } else if (selectedConnectionType === 'local') { + return item.model?.connection_type === 'local'; + } else if (selectedConnectionType === 'external') { + return item.model?.connection_type === 'external'; } else if (selectedConnectionType === 'direct') { return item.model?.direct; } @@ -393,7 +393,7 @@ class="flex gap-1 w-fit text-center text-sm font-medium rounded-full bg-transparent px-1.5 pb-0.5" bind:this={tagsContainerElement} > - {#if (items.find((item) => item.model?.owned_by === 'ollama') && items.find((item) => item.model?.owned_by === 'openai')) || items.find((item) => item.model?.direct) || tags.length > 0} + {#if (items.find((item) => item.model?.connection_type === 'local') && items.find((item) => item.model?.connection_type === 'external')) || items.find((item) => item.model?.direct) || tags.length > 0}