cleaned chatmanager with pydantic models
This commit is contained in:
parent
5687b1aec7
commit
53a4a39214
11 changed files with 520 additions and 389 deletions
File diff suppressed because it is too large
Load diff
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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__)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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__)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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__)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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__)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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__)
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue