Merge pull request #87 from valueonag/feat/saas-multi-tenant-mandates
hotfix initiation of ai models performance issue
This commit is contained in:
commit
4a47044b33
3 changed files with 27 additions and 7 deletions
4
app.py
4
app.py
|
|
@ -279,6 +279,10 @@ instanceLabel = APP_CONFIG.get("APP_ENV_LABEL")
|
||||||
async def lifespan(app: FastAPI):
|
async def lifespan(app: FastAPI):
|
||||||
logger.info("Application is starting up")
|
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)
|
# Get event user for feature lifecycle (system-level user for background operations)
|
||||||
rootInterface = getRootInterface()
|
rootInterface = getRootInterface()
|
||||||
eventUser = rootInterface.getUserByUsername("event")
|
eventUser = rootInterface.getUserByUsername("event")
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@ class ModelRegistry:
|
||||||
self._connectors: Dict[str, BaseConnectorAi] = {}
|
self._connectors: Dict[str, BaseConnectorAi] = {}
|
||||||
self._lastRefresh: Optional[float] = None
|
self._lastRefresh: Optional[float] = None
|
||||||
self._refreshInterval: float = 300.0 # 5 minutes
|
self._refreshInterval: float = 300.0 # 5 minutes
|
||||||
|
self._connectorsInitialized: bool = False
|
||||||
|
|
||||||
def registerConnector(self, connector: BaseConnectorAi):
|
def registerConnector(self, connector: BaseConnectorAi):
|
||||||
"""Register a connector and collect its models."""
|
"""Register a connector and collect its models."""
|
||||||
|
|
@ -96,11 +97,22 @@ class ModelRegistry:
|
||||||
logger.warning(f"Failed to discover connector from {filename}: {e}")
|
logger.warning(f"Failed to discover connector from {filename}: {e}")
|
||||||
|
|
||||||
return connectors
|
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):
|
def refreshModels(self, force: bool = False):
|
||||||
"""Refresh models from all registered connectors."""
|
"""Refresh models from all registered connectors."""
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
self.ensureConnectorsRegistered()
|
||||||
|
|
||||||
currentTime = time.time()
|
currentTime = time.time()
|
||||||
|
|
||||||
# Check if refresh is needed
|
# Check if refresh is needed
|
||||||
|
|
|
||||||
|
|
@ -22,15 +22,19 @@ logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class ExtractionService:
|
class ExtractionService:
|
||||||
|
_sharedExtractorRegistry: Optional[ExtractorRegistry] = None
|
||||||
|
_sharedChunkerRegistry: Optional[ChunkerRegistry] = None
|
||||||
|
|
||||||
def __init__(self, services: Optional[Any] = None):
|
def __init__(self, services: Optional[Any] = None):
|
||||||
self.services = services
|
self.services = services
|
||||||
self._extractorRegistry = ExtractorRegistry()
|
if ExtractionService._sharedExtractorRegistry is None:
|
||||||
self._chunkerRegistry = ChunkerRegistry()
|
ExtractionService._sharedExtractorRegistry = ExtractorRegistry()
|
||||||
|
if ExtractionService._sharedChunkerRegistry is None:
|
||||||
# Ensure connectors are registered
|
ExtractionService._sharedChunkerRegistry = ChunkerRegistry()
|
||||||
discovered = modelRegistry.discoverConnectors()
|
self._extractorRegistry = ExtractionService._sharedExtractorRegistry
|
||||||
for connector in discovered:
|
self._chunkerRegistry = ExtractionService._sharedChunkerRegistry
|
||||||
modelRegistry.registerConnector(connector)
|
|
||||||
|
modelRegistry.ensureConnectorsRegistered()
|
||||||
|
|
||||||
# Verify required internal model is available (used for pricing in extractContent)
|
# Verify required internal model is available (used for pricing in extractContent)
|
||||||
modelDisplayName = "Internal Document Extractor"
|
modelDisplayName = "Internal Document Extractor"
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue