import json import logging import sys from datetime import datetime from typing import Sequence from autogen_agentchat.base._task import TaskResult from autogen_agentchat.messages import BaseAgentEvent, BaseChatMessage, BaseTextChatMessage from pydantic import BaseModel class FileLogHandler(logging.Handler): def __init__(self, filename: str) -> None: super().__init__() self.filename = filename self.file_handler = logging.FileHandler(filename) def emit(self, record: logging.LogRecord) -> None: ts = datetime.fromtimestamp(record.created).isoformat() if isinstance(record.msg, BaseModel): record.msg = json.dumps( { "timestamp": ts, "message": record.msg.model_dump_json(indent=2), "type": record.msg.__class__.__name__, }, ) self.file_handler.emit(record) class ConsoleLogHandler(logging.Handler): def emit(self, record: logging.LogRecord) -> None: ts = datetime.fromtimestamp(record.created).isoformat() if isinstance(record.msg, BaseModel): record.msg = json.dumps( { "timestamp": ts, "message": record.msg.model_dump_json(indent=2), "type": record.msg.__class__.__name__, }, ) sys.stdout.write(f"{record.msg}\n") def compare_messages( msg1: BaseAgentEvent | BaseChatMessage | BaseTextChatMessage, msg2: BaseAgentEvent | BaseChatMessage | BaseTextChatMessage, ) -> bool: if isinstance(msg1, BaseTextChatMessage) and isinstance(msg2, BaseTextChatMessage): if msg1.content != msg2.content: return False return ( (msg1.source == msg2.source) and (msg1.models_usage == msg2.models_usage) and (msg1.metadata == msg2.metadata) ) def compare_message_lists( msgs1: Sequence[BaseAgentEvent | BaseChatMessage], msgs2: Sequence[BaseAgentEvent | BaseChatMessage], ) -> bool: if len(msgs1) != len(msgs2): return False for i in range(len(msgs1)): if not compare_messages(msgs1[i], msgs2[i]): return False return True def compare_task_results( res1: TaskResult, res2: TaskResult, ) -> bool: if res1.stop_reason != res2.stop_reason: return False return compare_message_lists(res1.messages, res2.messages)