From a29bfa7489c4f85a02981d293c6c4ca1c1b20782 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 12 Jan 2026 13:51:19 +0200 Subject: [PATCH] fix simple routing (#2261) --- application/core/model_configs.py | 15 ++++++++++ application/core/model_settings.py | 35 +++++++++++++++++------ frontend/src/preferences/PromptsModal.tsx | 4 +-- tests/test_model_validation.py | 21 +++++++++----- 4 files changed, 57 insertions(+), 18 deletions(-) diff --git a/application/core/model_configs.py b/application/core/model_configs.py index 951abfb6..a25c4440 100644 --- a/application/core/model_configs.py +++ b/application/core/model_configs.py @@ -187,3 +187,18 @@ AZURE_OPENAI_MODELS = [ ), ), ] + + +def create_custom_openai_model(model_name: str, base_url: str) -> AvailableModel: + """Create a custom OpenAI-compatible model (e.g., LM Studio, Ollama).""" + return AvailableModel( + id=model_name, + provider=ModelProvider.OPENAI, + display_name=model_name, + description=f"Custom OpenAI-compatible model at {base_url}", + base_url=base_url, + capabilities=ModelCapabilities( + supports_tools=True, + supported_attachment_types=OPENAI_ATTACHMENTS, + ), + ) diff --git a/application/core/model_settings.py b/application/core/model_settings.py index 87325ac3..bc38239a 100644 --- a/application/core/model_settings.py +++ b/application/core/model_settings.py @@ -84,7 +84,9 @@ class ModelRegistry: self.models.clear() - self._add_docsgpt_models(settings) + # Skip DocsGPT model if using custom OpenAI-compatible endpoint + if not settings.OPENAI_BASE_URL: + self._add_docsgpt_models(settings) if settings.OPENAI_API_KEY or ( settings.LLM_PROVIDER == "openai" and settings.API_KEY ): @@ -125,19 +127,34 @@ class ModelRegistry: ) def _add_openai_models(self, settings): - from application.core.model_configs import OPENAI_MODELS + from application.core.model_configs import ( + OPENAI_MODELS, + create_custom_openai_model, + ) + # Add standard OpenAI models if API key is present if settings.OPENAI_API_KEY: for model in OPENAI_MODELS: self.models[model.id] = model - return - if settings.LLM_PROVIDER == "openai" and settings.LLM_NAME: + + # Add custom model if OPENAI_BASE_URL is configured with a custom LLM_NAME + if ( + settings.LLM_PROVIDER == "openai" + and settings.OPENAI_BASE_URL + and settings.LLM_NAME + ): + custom_model = create_custom_openai_model( + settings.LLM_NAME, settings.OPENAI_BASE_URL + ) + self.models[settings.LLM_NAME] = custom_model + logger.info( + f"Registered custom OpenAI model: {settings.LLM_NAME} at {settings.OPENAI_BASE_URL}" + ) + + # Fallback: add all OpenAI models if none were added + if not any(m.provider.value == "openai" for m in self.models.values()): for model in OPENAI_MODELS: - if model.id == settings.LLM_NAME: - self.models[model.id] = model - return - for model in OPENAI_MODELS: - self.models[model.id] = model + self.models[model.id] = model def _add_azure_openai_models(self, settings): from application.core.model_configs import AZURE_OPENAI_MODELS diff --git a/frontend/src/preferences/PromptsModal.tsx b/frontend/src/preferences/PromptsModal.tsx index b724e968..f6d938dc 100644 --- a/frontend/src/preferences/PromptsModal.tsx +++ b/frontend/src/preferences/PromptsModal.tsx @@ -136,7 +136,7 @@ function PromptTextarea({