agentic-comic-generator / services /message_factory.py
ramsi-k's picture
initial move
bce4c09
"""
Message Factory Service
Handles creation of AgentMessage objects with proper formatting and validation.
"""
import json
import uuid
from datetime import datetime
from typing import Dict, List, Optional, Any
from dataclasses import dataclass, asdict
from enum import Enum
class MessageType(Enum):
"""Types of messages Agent Brown can send"""
GENERATION_REQUEST = "generation_request"
REFINEMENT_REQUEST = "refinement_request"
VALIDATION_ERROR = "validation_error"
FINAL_APPROVAL = "final_approval"
@dataclass
class AgentMessage:
"""Schema for inter-agent communication following tech_specs.md"""
message_id: str
timestamp: str
sender: str
recipient: str
message_type: str
payload: Dict[str, Any]
context: Dict[str, Any]
def to_dict(self) -> Dict[str, Any]:
return asdict(self)
def to_json(self) -> str:
return json.dumps(self.to_dict(), indent=2)
class MessageFactory:
"""Factory for creating standardized AgentMessage objects"""
def __init__(self, session_id: str, conversation_id: str):
self.session_id = session_id
self.conversation_id = conversation_id
def create_generation_request(
self,
enhanced_prompt: str,
original_prompt: str,
dialogues: List[str],
style_tags: List[str],
panels: int,
language: str,
extras: List[str],
style_config: Dict[str, Any],
validation_score: float,
iteration: int,
) -> AgentMessage:
"""Create a generation request message for Agent Bayko"""
payload = {
"prompt": enhanced_prompt,
"original_prompt": original_prompt,
"style_tags": style_tags,
"panels": panels,
"language": language,
"extras": extras,
"style_config": style_config,
"generation_params": {
"quality": "high",
"aspect_ratio": "16:9",
"panel_layout": "sequential",
},
}
return AgentMessage(
message_id=f"msg_{uuid.uuid4().hex[:8]}",
timestamp=datetime.utcnow().isoformat() + "Z",
sender="agent_brown",
recipient="agent_bayko",
message_type=MessageType.GENERATION_REQUEST.value,
payload=payload,
context={
"conversation_id": self.conversation_id,
"session_id": self.session_id,
"iteration": iteration,
"previous_feedback": None,
"validation_score": validation_score,
},
)
def create_error_message(
self, issues: List[str], suggestions: List[str]
) -> AgentMessage:
"""Create error message for validation failures"""
return AgentMessage(
message_id=f"msg_{uuid.uuid4().hex[:8]}",
timestamp=datetime.utcnow().isoformat() + "Z",
sender="agent_brown",
recipient="user_interface",
message_type=MessageType.VALIDATION_ERROR.value,
payload={
"error": "Input validation failed",
"issues": issues,
"suggestions": suggestions,
},
context={
"conversation_id": self.conversation_id or "error",
"session_id": self.session_id or "error",
"iteration": 0,
"error_type": "validation",
},
)
def create_rejection_message(
self,
bayko_response: Dict[str, Any],
evaluation: Dict[str, Any],
iteration: int,
) -> AgentMessage:
"""Create rejection message for auto-rejected content"""
return AgentMessage(
message_id=f"msg_{uuid.uuid4().hex[:8]}",
timestamp=datetime.utcnow().isoformat() + "Z",
sender="agent_brown",
recipient="user_interface",
message_type=MessageType.VALIDATION_ERROR.value,
payload={
"error": "Content rejected",
"reason": evaluation["reason"],
"rejected_content": bayko_response,
"auto_rejection": True,
},
context={
"conversation_id": self.conversation_id,
"session_id": self.session_id,
"iteration": iteration,
"rejection_type": "quality",
},
)
def create_refinement_message(
self,
bayko_response: Dict[str, Any],
feedback: Dict[str, Any],
iteration: int,
) -> AgentMessage:
"""Create refinement request message"""
return AgentMessage(
message_id=f"msg_{uuid.uuid4().hex[:8]}",
timestamp=datetime.utcnow().isoformat() + "Z",
sender="agent_brown",
recipient="agent_bayko",
message_type=MessageType.REFINEMENT_REQUEST.value,
payload={
"original_content": bayko_response,
"feedback": feedback,
"specific_improvements": feedback.get(
"improvement_suggestions", []
),
"focus_areas": [
area
for area, score in [
("adherence", feedback.get("adherence_score", 0)),
(
"style_consistency",
feedback.get("style_consistency", 0),
),
("narrative_flow", feedback.get("narrative_flow", 0)),
(
"technical_quality",
feedback.get("technical_quality", 0),
),
]
if score < 0.7
],
"iteration": iteration,
},
context={
"conversation_id": self.conversation_id,
"session_id": self.session_id,
"iteration": iteration,
"previous_feedback": feedback,
"refinement_reason": "Quality below threshold",
},
)
def create_approval_message(
self,
bayko_response: Dict[str, Any],
feedback: Dict[str, Any],
iteration: int,
) -> AgentMessage:
"""Create final approval message"""
return AgentMessage(
message_id=f"msg_{uuid.uuid4().hex[:8]}",
timestamp=datetime.utcnow().isoformat() + "Z",
sender="agent_brown",
recipient="user_interface",
message_type=MessageType.FINAL_APPROVAL.value,
payload={
"approved_content": bayko_response,
"final_feedback": feedback,
"session_summary": {
"total_iterations": iteration,
"final_score": feedback.get("overall_score", 0),
"processing_complete": True,
},
},
context={
"conversation_id": self.conversation_id,
"session_id": self.session_id,
"iteration": iteration,
"final_approval": True,
"completion_timestamp": datetime.utcnow().isoformat() + "Z",
},
)