You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

utils.py 2.4 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import json
  2. import logging
  3. import sys
  4. from datetime import datetime
  5. from typing import Sequence
  6. from autogen_agentchat.base._task import TaskResult
  7. from autogen_agentchat.messages import BaseAgentEvent, BaseChatMessage, BaseTextChatMessage
  8. from pydantic import BaseModel
  9. class FileLogHandler(logging.Handler):
  10. def __init__(self, filename: str) -> None:
  11. super().__init__()
  12. self.filename = filename
  13. self.file_handler = logging.FileHandler(filename)
  14. def emit(self, record: logging.LogRecord) -> None:
  15. ts = datetime.fromtimestamp(record.created).isoformat()
  16. if isinstance(record.msg, BaseModel):
  17. record.msg = json.dumps(
  18. {
  19. "timestamp": ts,
  20. "message": record.msg.model_dump_json(indent=2),
  21. "type": record.msg.__class__.__name__,
  22. },
  23. )
  24. self.file_handler.emit(record)
  25. class ConsoleLogHandler(logging.Handler):
  26. def emit(self, record: logging.LogRecord) -> None:
  27. ts = datetime.fromtimestamp(record.created).isoformat()
  28. if isinstance(record.msg, BaseModel):
  29. record.msg = json.dumps(
  30. {
  31. "timestamp": ts,
  32. "message": record.msg.model_dump_json(indent=2),
  33. "type": record.msg.__class__.__name__,
  34. },
  35. )
  36. sys.stdout.write(f"{record.msg}\n")
  37. def compare_messages(
  38. msg1: BaseAgentEvent | BaseChatMessage | BaseTextChatMessage,
  39. msg2: BaseAgentEvent | BaseChatMessage | BaseTextChatMessage,
  40. ) -> bool:
  41. if isinstance(msg1, BaseTextChatMessage) and isinstance(msg2, BaseTextChatMessage):
  42. if msg1.content != msg2.content:
  43. return False
  44. return (
  45. (msg1.source == msg2.source) and (msg1.models_usage == msg2.models_usage) and (msg1.metadata == msg2.metadata)
  46. )
  47. def compare_message_lists(
  48. msgs1: Sequence[BaseAgentEvent | BaseChatMessage],
  49. msgs2: Sequence[BaseAgentEvent | BaseChatMessage],
  50. ) -> bool:
  51. if len(msgs1) != len(msgs2):
  52. return False
  53. for i in range(len(msgs1)):
  54. if not compare_messages(msgs1[i], msgs2[i]):
  55. return False
  56. return True
  57. def compare_task_results(
  58. res1: TaskResult,
  59. res2: TaskResult,
  60. ) -> bool:
  61. if res1.stop_reason != res2.stop_reason:
  62. return False
  63. return compare_message_lists(res1.messages, res2.messages)