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.interfaceComponentObjects import getInterface as getComponentObjects
from modules.interfaces.interfaceAppObjects import getInterface as getAppObjects
from modules.workflow.processorDocument import DocumentProcessor
from modules.workflow.methodBase import MethodBase
from modules.chat.processorDocument import DocumentProcessor
from modules.chat.methodBase import MethodBase
import uuid
import base64
import hashlib

View file

@ -454,3 +454,75 @@ register_model_labels(
"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
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__)

View file

@ -8,7 +8,7 @@ from typing import Dict, Any, List, Optional
import uuid
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__)

View file

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

View file

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

View file

@ -11,7 +11,7 @@ from bs4 import BeautifulSoup
import time
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
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.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__)
@ -179,15 +180,15 @@ class WorkflowManager:
logger.error(f"Error sending last message: {str(e)}")
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"""
try:
if workflow_result.get('status') == 'failed':
if workflow_result.status == 'failed':
# Create error message
error_message = {
"workflowId": workflow.id,
"role": "assistant",
"message": f"Workflow failed: {workflow_result.get('error', 'Unknown error')}",
"message": f"Workflow failed: {workflow_result.error or 'Unknown error'}",
"status": "last",
"sequenceNr": len(workflow.messages) + 1,
"publishedAt": datetime.now(UTC).isoformat()
@ -205,41 +206,11 @@ class WorkflowManager:
})
return
# Process successful workflow results
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)
# For successful workflows, create a simple completion message
summary_message = {
"workflowId": workflow.id,
"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",
"sequenceNr": len(workflow.messages) + 1,
"publishedAt": datetime.now(UTC).isoformat()