From 89202eb0403721c22b11ab1c6b4d4134e64df5c0 Mon Sep 17 00:00:00 2001
From: ValueOn AG
Date: Wed, 14 Jan 2026 22:38:23 +0100
Subject: [PATCH] hotfix initiation of ai models performance issue
---
app.py | 4 ++++
modules/aicore/aicoreModelRegistry.py | 12 ++++++++++++
.../serviceExtraction/mainServiceExtraction.py | 18 +++++++++++-------
3 files changed, 27 insertions(+), 7 deletions(-)
diff --git a/app.py b/app.py
index 94d70136..8ddd806e 100644
--- a/app.py
+++ b/app.py
@@ -279,6 +279,10 @@ instanceLabel = APP_CONFIG.get("APP_ENV_LABEL")
async def lifespan(app: FastAPI):
logger.info("Application is starting up")
+ # Initialize AI connectors once at startup to avoid per-request discovery
+ from modules.aicore.aicoreModelRegistry import modelRegistry
+ modelRegistry.ensureConnectorsRegistered()
+
# Get event user for feature lifecycle (system-level user for background operations)
rootInterface = getRootInterface()
eventUser = rootInterface.getUserByUsername("event")
diff --git a/modules/aicore/aicoreModelRegistry.py b/modules/aicore/aicoreModelRegistry.py
index 6d1b3365..ed82572d 100644
--- a/modules/aicore/aicoreModelRegistry.py
+++ b/modules/aicore/aicoreModelRegistry.py
@@ -30,6 +30,7 @@ class ModelRegistry:
self._connectors: Dict[str, BaseConnectorAi] = {}
self._lastRefresh: Optional[float] = None
self._refreshInterval: float = 300.0 # 5 minutes
+ self._connectorsInitialized: bool = False
def registerConnector(self, connector: BaseConnectorAi):
"""Register a connector and collect its models."""
@@ -96,11 +97,22 @@ class ModelRegistry:
logger.warning(f"Failed to discover connector from {filename}: {e}")
return connectors
+
+ def ensureConnectorsRegistered(self):
+ """Register connectors once to avoid per-request discovery."""
+ if self._connectorsInitialized:
+ return
+ discovered = self.discoverConnectors()
+ for connector in discovered:
+ self.registerConnector(connector)
+ self._connectorsInitialized = True
def refreshModels(self, force: bool = False):
"""Refresh models from all registered connectors."""
import time
+ self.ensureConnectorsRegistered()
+
currentTime = time.time()
# Check if refresh is needed
diff --git a/modules/services/serviceExtraction/mainServiceExtraction.py b/modules/services/serviceExtraction/mainServiceExtraction.py
index be38de05..13739dea 100644
--- a/modules/services/serviceExtraction/mainServiceExtraction.py
+++ b/modules/services/serviceExtraction/mainServiceExtraction.py
@@ -22,15 +22,19 @@ logger = logging.getLogger(__name__)
class ExtractionService:
+ _sharedExtractorRegistry: Optional[ExtractorRegistry] = None
+ _sharedChunkerRegistry: Optional[ChunkerRegistry] = None
+
def __init__(self, services: Optional[Any] = None):
self.services = services
- self._extractorRegistry = ExtractorRegistry()
- self._chunkerRegistry = ChunkerRegistry()
-
- # Ensure connectors are registered
- discovered = modelRegistry.discoverConnectors()
- for connector in discovered:
- modelRegistry.registerConnector(connector)
+ if ExtractionService._sharedExtractorRegistry is None:
+ ExtractionService._sharedExtractorRegistry = ExtractorRegistry()
+ if ExtractionService._sharedChunkerRegistry is None:
+ ExtractionService._sharedChunkerRegistry = ChunkerRegistry()
+ self._extractorRegistry = ExtractionService._sharedExtractorRegistry
+ self._chunkerRegistry = ExtractionService._sharedChunkerRegistry
+
+ modelRegistry.ensureConnectorsRegistered()
# Verify required internal model is available (used for pricing in extractContent)
modelDisplayName = "Internal Document Extractor"