serviceCenter = DI-Container (Resolver, Registry, Context) fuer Service-Instanziierung serviceHub = Consumer-facing Aggregation (DB-Interfaces, Runtime-State, lazy Service-Resolution via serviceCenter) - modules/serviceHub/ erstellt: ServiceHub, PublicService, getInterface() - 22 Consumer-Dateien migriert (routes, features, tests): imports von modules.services auf serviceHub bzw. serviceCenter umgestellt - resolver.py: legacy fallback auf altes services/ entfernt - modules/services/ komplett geloescht (83 Dateien inkl. dead code mainAiChat.py) - pre-extraction: progress callback durch chunk-pipeline propagiert, operationType DATA_EXTRACT->DATA_ANALYSE fuer guenstigeres Modell
137 lines
4.7 KiB
Python
137 lines
4.7 KiB
Python
# Copyright (c) 2025 Patrick Motsch
|
|
# All rights reserved.
|
|
"""
|
|
Chat Playground Feature Interface.
|
|
Wrapper around interfaceDbChat with feature instance context.
|
|
"""
|
|
|
|
import logging
|
|
from typing import Dict, Any, List, Optional
|
|
|
|
from modules.datamodels.datamodelUam import User
|
|
from modules.interfaces import interfaceDbChat
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
# Feature code constant
|
|
FEATURE_CODE = "chatplayground"
|
|
|
|
# Singleton instances cache
|
|
_instances: Dict[str, "ChatPlaygroundObjects"] = {}
|
|
|
|
|
|
def getInterface(currentUser: User, mandateId: str = None, featureInstanceId: str = None) -> "ChatPlaygroundObjects":
|
|
"""
|
|
Factory function to get or create a ChatPlaygroundObjects instance.
|
|
Uses singleton pattern per user context.
|
|
|
|
Args:
|
|
currentUser: Current user object
|
|
mandateId: Mandate ID
|
|
featureInstanceId: Feature instance ID
|
|
|
|
Returns:
|
|
ChatPlaygroundObjects instance
|
|
"""
|
|
cacheKey = f"{currentUser.id}_{mandateId}_{featureInstanceId}"
|
|
|
|
if cacheKey not in _instances:
|
|
_instances[cacheKey] = ChatPlaygroundObjects(currentUser, mandateId, featureInstanceId)
|
|
else:
|
|
# Update context if needed
|
|
_instances[cacheKey].setUserContext(currentUser, mandateId, featureInstanceId)
|
|
|
|
return _instances[cacheKey]
|
|
|
|
|
|
class ChatPlaygroundObjects:
|
|
"""
|
|
Chat Playground feature interface.
|
|
Wraps the shared interfaceDbChat with feature instance context.
|
|
"""
|
|
|
|
FEATURE_CODE = FEATURE_CODE
|
|
|
|
def __init__(self, currentUser: User, mandateId: str = None, featureInstanceId: str = None):
|
|
"""
|
|
Initialize the Chat Playground interface.
|
|
|
|
Args:
|
|
currentUser: Current user object
|
|
mandateId: Mandate ID
|
|
featureInstanceId: Feature instance ID
|
|
"""
|
|
self.currentUser = currentUser
|
|
self.mandateId = mandateId
|
|
self.featureInstanceId = featureInstanceId
|
|
|
|
# Get the underlying chat interface
|
|
self._chatInterface = interfaceDbChat.getInterface(
|
|
currentUser,
|
|
mandateId=mandateId,
|
|
featureInstanceId=featureInstanceId
|
|
)
|
|
|
|
def setUserContext(self, currentUser: User, mandateId: str = None, featureInstanceId: str = None):
|
|
"""
|
|
Update the user context.
|
|
|
|
Args:
|
|
currentUser: Current user object
|
|
mandateId: Mandate ID
|
|
featureInstanceId: Feature instance ID
|
|
"""
|
|
self.currentUser = currentUser
|
|
self.mandateId = mandateId
|
|
self.featureInstanceId = featureInstanceId
|
|
|
|
# Update underlying interface
|
|
self._chatInterface = interfaceDbChat.getInterface(
|
|
currentUser,
|
|
mandateId=mandateId,
|
|
featureInstanceId=featureInstanceId
|
|
)
|
|
|
|
# =========================================================================
|
|
# Delegated methods from interfaceDbChat
|
|
# =========================================================================
|
|
|
|
def getWorkflow(self, workflowId: str) -> Optional[Dict[str, Any]]:
|
|
"""Get a workflow by ID."""
|
|
return self._chatInterface.getWorkflow(workflowId)
|
|
|
|
def getWorkflows(self, pagination=None) -> Dict[str, Any]:
|
|
"""Get all workflows with pagination."""
|
|
return self._chatInterface.getWorkflows(pagination=pagination)
|
|
|
|
def getUnifiedChatData(self, workflowId: str, afterTimestamp: float = None) -> Dict[str, Any]:
|
|
"""Get unified chat data for a workflow."""
|
|
return self._chatInterface.getUnifiedChatData(workflowId, afterTimestamp)
|
|
|
|
def createWorkflow(self, workflow) -> Dict[str, Any]:
|
|
"""Create a new workflow."""
|
|
return self._chatInterface.createWorkflow(workflow)
|
|
|
|
def updateWorkflow(self, workflowId: str, updates: Dict[str, Any]) -> Optional[Dict[str, Any]]:
|
|
"""Update a workflow."""
|
|
return self._chatInterface.updateWorkflow(workflowId, updates)
|
|
|
|
def deleteWorkflow(self, workflowId: str) -> bool:
|
|
"""Delete a workflow."""
|
|
return self._chatInterface.deleteWorkflow(workflowId)
|
|
|
|
def getMessages(self, workflowId: str) -> List[Dict[str, Any]]:
|
|
"""Get messages for a workflow."""
|
|
return self._chatInterface.getMessages(workflowId)
|
|
|
|
def createMessage(self, message) -> Dict[str, Any]:
|
|
"""Create a new message."""
|
|
return self._chatInterface.createMessage(message)
|
|
|
|
def getLogs(self, workflowId: str) -> List[Dict[str, Any]]:
|
|
"""Get logs for a workflow."""
|
|
return self._chatInterface.getLogs(workflowId)
|
|
|
|
def createLog(self, log) -> Dict[str, Any]:
|
|
"""Create a new log entry."""
|
|
return self._chatInterface.createLog(log)
|