From f45cf794744a42a4df9c9773bf21eaae0deb6f80 Mon Sep 17 00:00:00 2001 From: ValueOn AG Date: Fri, 23 Jan 2026 07:35:53 +0100 Subject: [PATCH] fixes --- modules/features/aichat/mainAiChat.py | 166 ++++++++++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 modules/features/aichat/mainAiChat.py diff --git a/modules/features/aichat/mainAiChat.py b/modules/features/aichat/mainAiChat.py new file mode 100644 index 00000000..2e6514e6 --- /dev/null +++ b/modules/features/aichat/mainAiChat.py @@ -0,0 +1,166 @@ +# Copyright (c) 2025 Patrick Motsch +# All rights reserved. +""" +AIChat Feature Container - Main Module. +Handles feature initialization and RBAC catalog registration. + +AIChat is the dynamic chat workflow feature that handles: +- AI-powered document processing +- Dynamic workflow execution +- Automation definitions +""" + +import logging +from typing import Dict, List, Any + +logger = logging.getLogger(__name__) + +# Feature metadata +FEATURE_CODE = "chatworkflow" +FEATURE_LABEL = {"en": "Chat Workflow", "de": "Chat-Workflow", "fr": "Workflow de Chat"} +FEATURE_ICON = "mdi-message-cog" + +# UI Objects for RBAC catalog +UI_OBJECTS = [ + { + "objectKey": "ui.feature.aichat.workflows", + "label": {"en": "Workflows", "de": "Workflows", "fr": "Workflows"}, + "meta": {"area": "workflows"} + }, + { + "objectKey": "ui.feature.aichat.automations", + "label": {"en": "Automations", "de": "Automatisierungen", "fr": "Automatisations"}, + "meta": {"area": "automations"} + }, + { + "objectKey": "ui.feature.aichat.logs", + "label": {"en": "Logs", "de": "Logs", "fr": "Journaux"}, + "meta": {"area": "logs"} + }, +] + +# Resource Objects for RBAC catalog +RESOURCE_OBJECTS = [ + { + "objectKey": "resource.feature.aichat.workflow.start", + "label": {"en": "Start Workflow", "de": "Workflow starten", "fr": "Démarrer workflow"}, + "meta": {"endpoint": "/api/chat/playground/start", "method": "POST"} + }, + { + "objectKey": "resource.feature.aichat.workflow.stop", + "label": {"en": "Stop Workflow", "de": "Workflow stoppen", "fr": "Arrêter workflow"}, + "meta": {"endpoint": "/api/chat/playground/stop/{workflowId}", "method": "POST"} + }, + { + "objectKey": "resource.feature.aichat.workflow.delete", + "label": {"en": "Delete Workflow", "de": "Workflow löschen", "fr": "Supprimer workflow"}, + "meta": {"endpoint": "/api/chat/playground/workflow/{workflowId}", "method": "DELETE"} + }, +] + +# Template roles for this feature +TEMPLATE_ROLES = [ + { + "roleLabel": "workflow-admin", + "description": { + "en": "Workflow Administrator - Full access to workflow configuration and execution", + "de": "Workflow-Administrator - Vollzugriff auf Workflow-Konfiguration und Ausführung", + "fr": "Administrateur workflow - Accès complet à la configuration et exécution" + } + }, + { + "roleLabel": "workflow-editor", + "description": { + "en": "Workflow Editor - Create and modify workflows", + "de": "Workflow-Editor - Workflows erstellen und bearbeiten", + "fr": "Éditeur workflow - Créer et modifier les workflows" + } + }, + { + "roleLabel": "workflow-viewer", + "description": { + "en": "Workflow Viewer - View workflows and execution results", + "de": "Workflow-Betrachter - Workflows und Ausführungsergebnisse einsehen", + "fr": "Visualiseur workflow - Consulter les workflows et résultats" + } + }, +] + + +def getFeatureDefinition() -> Dict[str, Any]: + """Return the feature definition for registration.""" + return { + "code": FEATURE_CODE, + "label": FEATURE_LABEL, + "icon": FEATURE_ICON + } + + +def getUiObjects() -> List[Dict[str, Any]]: + """Return UI objects for RBAC catalog registration.""" + return UI_OBJECTS + + +def getResourceObjects() -> List[Dict[str, Any]]: + """Return resource objects for RBAC catalog registration.""" + return RESOURCE_OBJECTS + + +def getTemplateRoles() -> List[Dict[str, Any]]: + """Return template roles for this feature.""" + return TEMPLATE_ROLES + + +def registerFeature(catalogService) -> bool: + """ + Register this feature's RBAC objects in the catalog. + + Args: + catalogService: The RBAC catalog service instance + + Returns: + True if registration was successful + """ + try: + # Register UI objects + for uiObj in UI_OBJECTS: + catalogService.registerUiObject( + featureCode=FEATURE_CODE, + objectKey=uiObj["objectKey"], + label=uiObj["label"], + meta=uiObj.get("meta") + ) + + # Register Resource objects + for resObj in RESOURCE_OBJECTS: + catalogService.registerResourceObject( + featureCode=FEATURE_CODE, + objectKey=resObj["objectKey"], + label=resObj["label"], + meta=resObj.get("meta") + ) + + logger.info(f"Feature '{FEATURE_CODE}' registered {len(UI_OBJECTS)} UI objects and {len(RESOURCE_OBJECTS)} resource objects") + return True + + except Exception as e: + logger.error(f"Failed to register feature '{FEATURE_CODE}': {e}") + return False + + +async def onStart(eventUser) -> None: + """ + Called when the feature container starts. + Initializes AI connectors for model registry. + """ + try: + from modules.aicore.aicoreModelRegistry import modelRegistry + modelRegistry.ensureConnectorsRegistered() + logger.info(f"Feature '{FEATURE_CODE}' started - AI connectors initialized") + except Exception as e: + logger.error(f"Feature '{FEATURE_CODE}' failed to initialize AI connectors: {e}") + + +async def onStop(eventUser) -> None: + """Called when the feature container stops.""" + logger.info(f"Feature '{FEATURE_CODE}' stopped")