148 lines
No EOL
8.2 KiB
Python
148 lines
No EOL
8.2 KiB
Python
"""
|
|
Chat model classes for the chat system.
|
|
"""
|
|
|
|
from pydantic import BaseModel, Field
|
|
from typing import List, Dict, Any, Optional
|
|
from datetime import datetime
|
|
import uuid
|
|
|
|
from modules.shared.attributeUtils import Label, BaseModelWithUI
|
|
|
|
|
|
# WORKFLOW MODELS
|
|
|
|
class ChatContent(BaseModelWithUI):
|
|
"""Data model for chat content"""
|
|
sequenceNr: int = Field(description="Sequence number of the content")
|
|
name: str = Field(description="Name of the content")
|
|
data: str = Field(description="The actual content data")
|
|
mimeType: str = Field(description="MIME type of the content")
|
|
metadata: Dict[str, Any] = Field(default_factory=dict, description="Additional metadata")
|
|
|
|
class ChatDocument(BaseModelWithUI):
|
|
"""Data model for a chat document"""
|
|
id: str = Field(description="Primary key")
|
|
fileId: int = Field(description="Foreign key to file")
|
|
filename: str = Field(description="Name of the file")
|
|
fileSize: int = Field(description="Size of the file")
|
|
mimeType: str = Field(description="MIME type of the file")
|
|
contents: List[ChatContent] = Field(default_factory=list, description="List of chat contents")
|
|
|
|
class ChatStat(BaseModelWithUI):
|
|
"""Data model for chat statistics"""
|
|
id: str = Field(description="Primary key")
|
|
processingTime: Optional[float] = Field(None, description="Processing time in seconds")
|
|
tokenCount: Optional[int] = Field(None, description="Number of tokens processed")
|
|
bytesSent: Optional[int] = Field(None, description="Number of bytes sent")
|
|
bytesReceived: Optional[int] = Field(None, description="Number of bytes received")
|
|
successRate: Optional[float] = Field(None, description="Success rate of operations")
|
|
errorCount: Optional[int] = Field(None, description="Number of errors encountered")
|
|
|
|
class ChatLog(BaseModelWithUI):
|
|
"""Data model for a chat log"""
|
|
id: str = Field(description="Primary key")
|
|
workflowId: str = Field(description="Foreign key to workflow")
|
|
message: str = Field(description="Log message")
|
|
type: str = Field(description="Type of log entry")
|
|
timestamp: str = Field(description="Timestamp of the log entry")
|
|
agentName: str = Field(description="Name of the agent")
|
|
status: str = Field(description="Status of the log entry")
|
|
progress: Optional[int] = Field(None, description="Progress percentage")
|
|
performance: Optional[Dict[str, Any]] = Field(None, description="Performance metrics")
|
|
|
|
class ChatMessage(BaseModelWithUI):
|
|
"""Data model for a chat message"""
|
|
id: str = Field(description="Primary key")
|
|
workflowId: str = Field(description="Foreign key to workflow")
|
|
parentMessageId: Optional[str] = Field(None, description="Parent message ID for threading")
|
|
agentName: Optional[str] = Field(None, description="Name of the agent")
|
|
documents: List[ChatDocument] = Field(default_factory=list, description="Associated documents")
|
|
message: Optional[str] = Field(None, description="Message content")
|
|
role: str = Field(description="Role of the message sender")
|
|
status: str = Field(description="Status of the message")
|
|
sequenceNr: int = Field(description="Sequence number of the message")
|
|
startedAt: str = Field(description="When the message processing started")
|
|
finishedAt: Optional[str] = Field(None, description="When the message processing finished")
|
|
stats: Optional[ChatStat] = Field(None, description="Statistics for this message")
|
|
success: Optional[bool] = Field(None, description="Whether the message processing was successful")
|
|
|
|
class ChatWorkflow(BaseModelWithUI):
|
|
"""Data model for a chat workflow"""
|
|
id: str = Field(description="Primary key")
|
|
mandateId: str = Field(description="ID of the mandate this workflow belongs to")
|
|
status: str = Field(description="Current status of the workflow")
|
|
name: Optional[str] = Field(None, description="Name of the workflow")
|
|
currentRound: int = Field(description="Current round number")
|
|
lastActivity: str = Field(description="Timestamp of last activity")
|
|
startedAt: str = Field(description="When the workflow started")
|
|
logs: List[ChatLog] = Field(default_factory=list, description="Workflow logs")
|
|
messages: List[ChatMessage] = Field(default_factory=list, description="Messages in the workflow")
|
|
stats: Optional[ChatStat] = Field(None, description="Workflow statistics")
|
|
tasks: List['Task'] = Field(default_factory=list, description="List of tasks in the workflow")
|
|
|
|
label: Label = Field(
|
|
default=Label(default="Chat Workflow", translations={"en": "Chat Workflow", "fr": "Flux de travail de chat"}),
|
|
description="Label for the class"
|
|
)
|
|
|
|
fieldLabels: Dict[str, Label] = {
|
|
"id": Label(default="ID", translations={}),
|
|
"mandateId": Label(default="Mandate ID", translations={"en": "Mandate ID", "fr": "ID du mandat"}),
|
|
"status": Label(default="Status", translations={"en": "Status", "fr": "Statut"}),
|
|
"name": Label(default="Name", translations={"en": "Name", "fr": "Nom"}),
|
|
"currentRound": Label(default="Current Round", translations={"en": "Current Round", "fr": "Tour actuel"}),
|
|
"lastActivity": Label(default="Last Activity", translations={"en": "Last Activity", "fr": "Dernière activité"}),
|
|
"startedAt": Label(default="Started At", translations={"en": "Started At", "fr": "Démarré le"}),
|
|
"logs": Label(default="Logs", translations={"en": "Logs", "fr": "Journaux"}),
|
|
"messages": Label(default="Messages", translations={"en": "Messages", "fr": "Messages"}),
|
|
"stats": Label(default="Statistics", translations={"en": "Statistics", "fr": "Statistiques"}),
|
|
"tasks": Label(default="Tasks", translations={"en": "Tasks", "fr": "Tâches"})
|
|
}
|
|
|
|
# AGENT AND TASK MODELS
|
|
|
|
class Agent(BaseModelWithUI):
|
|
"""Data model for an agent"""
|
|
id: str = Field(description="Primary key")
|
|
name: str = Field(description="Name of the agent")
|
|
description: str = Field(description="Description of the agent")
|
|
capabilities: List[str] = Field(default_factory=list, description="List of agent capabilities")
|
|
performance: Optional[Dict[str, Any]] = Field(None, description="Performance metrics")
|
|
|
|
class AgentResponse(BaseModelWithUI):
|
|
"""Data model for an agent response"""
|
|
success: bool = Field(description="Whether the agent execution was successful")
|
|
message: ChatMessage = Field(description="Response message from the agent")
|
|
performance: Dict[str, Any] = Field(default_factory=dict, description="Performance metrics")
|
|
progress: float = Field(description="Task progress (0-100)")
|
|
|
|
class Task(BaseModelWithUI):
|
|
"""Data model for a task"""
|
|
id: str = Field(description="Primary key")
|
|
workflowId: str = Field(description="Foreign key to workflow")
|
|
agentName: str = Field(description="Name of the agent assigned to this task")
|
|
status: str = Field(description="Current status of the task")
|
|
progress: float = Field(description="Task progress (0-100)")
|
|
prompt: str = Field(description="Prompt for the task")
|
|
userLanguage: str = Field(description="User's preferred language")
|
|
filesInput: List[str] = Field(default_factory=list, description="Input files")
|
|
filesOutput: List[str] = Field(default_factory=list, description="Output files")
|
|
result: Optional[ChatMessage] = Field(None, description="Task result message")
|
|
error: Optional[str] = Field(None, description="Error message if failed")
|
|
startedAt: str = Field(description="When the task started")
|
|
finishedAt: Optional[str] = Field(None, description="When the task finished")
|
|
performance: Optional[Dict[str, Any]] = Field(None, description="Performance metrics")
|
|
|
|
class TaskPlan(BaseModelWithUI):
|
|
"""Data model for a task plan"""
|
|
fileList: List[str] = Field(default_factory=list, description="List of files")
|
|
tasks: List[Task] = Field(default_factory=list, description="List of tasks in the plan")
|
|
userLanguage: str = Field(description="User's preferred language")
|
|
userResponse: str = Field(description="User's response or feedback")
|
|
|
|
class UserInputRequest(BaseModelWithUI):
|
|
"""Data model for a user input request"""
|
|
prompt: str = Field(description="Prompt for the user")
|
|
listFileId: List[int] = Field(default_factory=list, description="List of file IDs")
|
|
userLanguage: str = Field(description="User's preferred language") |