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"