cleaned chatmanager with pydantic models

This commit is contained in:
ValueOn AG 2025-07-11 00:45:57 +02:00
parent 5687b1aec7
commit 53a4a39214
11 changed files with 520 additions and 389 deletions

View file

@ -15,8 +15,8 @@ from modules.interfaces.interfaceChatObjects import getInterface as getChatObjec
from modules.interfaces.interfaceChatModel import ActionResult from modules.interfaces.interfaceChatModel import ActionResult
from modules.interfaces.interfaceComponentObjects import getInterface as getComponentObjects from modules.interfaces.interfaceComponentObjects import getInterface as getComponentObjects
from modules.interfaces.interfaceAppObjects import getInterface as getAppObjects from modules.interfaces.interfaceAppObjects import getInterface as getAppObjects
from modules.workflow.processorDocument import DocumentProcessor from modules.chat.processorDocument import DocumentProcessor
from modules.workflow.methodBase import MethodBase from modules.chat.methodBase import MethodBase
import uuid import uuid
import base64 import base64
import hashlib import hashlib

View file

@ -454,3 +454,75 @@ register_model_labels(
"tasks": {"en": "Tasks", "fr": "Tâches"} "tasks": {"en": "Tasks", "fr": "Tâches"}
} }
) )
# ====== WORKFLOW SUPPORT MODELS (for managerChat.py compatibility) ======
class TaskStep(BaseModel, ModelMixin):
id: str
description: str
dependencies: Optional[list[str]] = []
expected_outputs: Optional[list[str]] = []
success_criteria: Optional[list[str]] = []
required_documents: Optional[list[str]] = []
estimated_complexity: Optional[str] = None
ai_prompt: Optional[str] = None
class TaskContext(BaseModel, ModelMixin):
task_step: TaskStep
workflow: Optional['ChatWorkflow'] = None
workflow_id: Optional[str] = None
available_documents: Optional[list[str]] = []
previous_results: Optional[list[str]] = []
improvements: Optional[list[str]] = []
retry_count: Optional[int] = 0
previous_action_results: Optional[list] = []
previous_review_result: Optional[dict] = None
is_regeneration: Optional[bool] = False
failure_patterns: Optional[list[str]] = []
failed_actions: Optional[list] = []
successful_actions: Optional[list] = []
class ActionExecutionResult(BaseModel, ModelMixin):
success: bool
data: dict
metadata: dict = {}
error: Optional[str] = None
actionId: Optional[str] = None
actionMethod: Optional[str] = None
actionName: Optional[str] = None
documents: Optional[list] = []
validation: Optional[dict] = {}
is_retry: Optional[bool] = False
previous_error: Optional[str] = None
applied_improvements: Optional[list[str]] = []
class ReviewContext(BaseModel, ModelMixin):
task_step: TaskStep
task_actions: Optional[list] = []
action_results: Optional[list] = []
step_result: Optional[dict] = {}
workflow_id: Optional[str] = None
previous_results: Optional[list[str]] = []
class ReviewResult(BaseModel, ModelMixin):
status: str
reason: Optional[str] = None
improvements: Optional[list[str]] = []
quality_score: Optional[int] = 5
missing_outputs: Optional[list[str]] = []
met_criteria: Optional[list[str]] = []
unmet_criteria: Optional[list[str]] = []
confidence: Optional[float] = 0.5
class TaskPlan(BaseModel, ModelMixin):
overview: str
tasks: list[TaskStep]
class WorkflowResult(BaseModel, ModelMixin):
status: str
completed_tasks: int
total_tasks: int
execution_time: float
final_results_count: int
error: Optional[str] = None
phase: Optional[str] = None

View file

@ -3,7 +3,7 @@ import logging
import uuid import uuid
from datetime import datetime, UTC from datetime import datetime, UTC
from modules.workflow.methodBase import MethodBase, ActionResult, action from modules.chat.methodBase import MethodBase, ActionResult, action
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View file

@ -8,7 +8,7 @@ from typing import Dict, Any, List, Optional
import uuid import uuid
from datetime import datetime, UTC from datetime import datetime, UTC
from modules.workflow.methodBase import MethodBase, ActionResult, action from modules.chat.methodBase import MethodBase, ActionResult, action
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View file

@ -9,7 +9,7 @@ from datetime import datetime, UTC
import json import json
import uuid import uuid
from modules.workflow.methodBase import MethodBase, ActionResult, action from modules.chat.methodBase import MethodBase, ActionResult, action
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View file

@ -9,7 +9,7 @@ from datetime import datetime, UTC
import json import json
import uuid import uuid
from modules.workflow.methodBase import MethodBase, ActionResult, action from modules.chat.methodBase import MethodBase, ActionResult, action
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View file

@ -11,7 +11,7 @@ from bs4 import BeautifulSoup
import time import time
import uuid import uuid
from modules.workflow.methodBase import MethodBase, ActionResult, action from modules.chat.methodBase import MethodBase, ActionResult, action
from modules.shared.configuration import APP_CONFIG from modules.shared.configuration import APP_CONFIG
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View file

@ -8,7 +8,8 @@ from modules.interfaces.interfaceAppObjects import User
from modules.interfaces.interfaceChatModel import (UserInputRequest, ChatMessage, ChatWorkflow, TaskItem, TaskStatus) from modules.interfaces.interfaceChatModel import (UserInputRequest, ChatMessage, ChatWorkflow, TaskItem, TaskStatus)
from modules.interfaces.interfaceChatObjects import ChatObjects from modules.interfaces.interfaceChatObjects import ChatObjects
from modules.workflow.managerChat import ChatManager from modules.chat.managerChat import ChatManager
from modules.interfaces.interfaceChatModel import WorkflowResult
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -179,15 +180,15 @@ class WorkflowManager:
logger.error(f"Error sending last message: {str(e)}") logger.error(f"Error sending last message: {str(e)}")
raise raise
async def _processWorkflowResults(self, workflow: ChatWorkflow, workflow_result: Dict[str, Any], initial_message: ChatMessage) -> None: async def _processWorkflowResults(self, workflow: ChatWorkflow, workflow_result: WorkflowResult, initial_message: ChatMessage) -> None:
"""Process workflow results and create appropriate messages""" """Process workflow results and create appropriate messages"""
try: try:
if workflow_result.get('status') == 'failed': if workflow_result.status == 'failed':
# Create error message # Create error message
error_message = { error_message = {
"workflowId": workflow.id, "workflowId": workflow.id,
"role": "assistant", "role": "assistant",
"message": f"Workflow failed: {workflow_result.get('error', 'Unknown error')}", "message": f"Workflow failed: {workflow_result.error or 'Unknown error'}",
"status": "last", "status": "last",
"sequenceNr": len(workflow.messages) + 1, "sequenceNr": len(workflow.messages) + 1,
"publishedAt": datetime.now(UTC).isoformat() "publishedAt": datetime.now(UTC).isoformat()
@ -205,41 +206,11 @@ class WorkflowManager:
}) })
return return
# Process successful workflow results # For successful workflows, create a simple completion message
workflow_results = workflow_result.get('workflow_results', [])
for i, result in enumerate(workflow_results):
task_step = result['task_step']
action_results = result['action_results']
review_result = result['review_result']
# Create message for task step
step_message = {
"workflowId": workflow.id,
"role": "assistant",
"message": f"Completed task: {task_step.get('description', 'Unknown')}",
"status": "step",
"sequenceNr": len(workflow.messages) + 1,
"publishedAt": datetime.now(UTC).isoformat()
}
# Add action details if available
if action_results:
successful_actions = [r for r in action_results if r.get('status') == 'completed']
step_message["message"] += f"\nExecuted {len(successful_actions)}/{len(action_results)} actions successfully."
message = self.chatInterface.createWorkflowMessage(step_message)
if message:
workflow.messages.append(message)
# Create final summary message
successful_tasks = workflow_result.get('successful_tasks', 0)
total_tasks = workflow_result.get('total_tasks', 0)
summary_message = { summary_message = {
"workflowId": workflow.id, "workflowId": workflow.id,
"role": "assistant", "role": "assistant",
"message": f"Workflow completed successfully. Completed {successful_tasks}/{total_tasks} tasks.", "message": f"Workflow completed successfully. Completed {workflow_result.completed_tasks}/{workflow_result.total_tasks} tasks in {workflow_result.execution_time:.2f} seconds.",
"status": "last", "status": "last",
"sequenceNr": len(workflow.messages) + 1, "sequenceNr": len(workflow.messages) + 1,
"publishedAt": datetime.now(UTC).isoformat() "publishedAt": datetime.now(UTC).isoformat()