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.

test_intervention.py 5.7 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. from typing import Any
  2. import pytest
  3. from autogen_core import (
  4. AgentId,
  5. DefaultInterventionHandler,
  6. DefaultSubscription,
  7. DefaultTopicId,
  8. DropMessage,
  9. MessageContext,
  10. SingleThreadedAgentRuntime,
  11. )
  12. from autogen_core.exceptions import MessageDroppedException
  13. from autogen_test_utils import LoopbackAgent, MessageType
  14. @pytest.mark.asyncio
  15. async def test_intervention_count_messages() -> None:
  16. class DebugInterventionHandler(DefaultInterventionHandler):
  17. def __init__(self) -> None:
  18. self.num_send_messages = 0
  19. self.num_publish_messages = 0
  20. self.num_response_messages = 0
  21. async def on_send(self, message: Any, *, message_context: MessageContext, recipient: AgentId) -> Any:
  22. self.num_send_messages += 1
  23. return message
  24. async def on_publish(self, message: Any, *, message_context: MessageContext) -> Any:
  25. self.num_publish_messages += 1
  26. return message
  27. async def on_response(self, message: Any, *, sender: AgentId, recipient: AgentId | None) -> Any:
  28. self.num_response_messages += 1
  29. return message
  30. handler = DebugInterventionHandler()
  31. runtime = SingleThreadedAgentRuntime(intervention_handlers=[handler])
  32. await LoopbackAgent.register(runtime, "name", LoopbackAgent)
  33. loopback = AgentId("name", key="default")
  34. runtime.start()
  35. _response = await runtime.send_message(MessageType(), recipient=loopback)
  36. await runtime.stop_when_idle()
  37. assert handler.num_send_messages == 1
  38. assert handler.num_response_messages == 1
  39. loopback_agent = await runtime.try_get_underlying_agent_instance(loopback, type=LoopbackAgent)
  40. assert loopback_agent.num_calls == 1
  41. runtime.start()
  42. await runtime.add_subscription(DefaultSubscription(agent_type="name"))
  43. await runtime.publish_message(MessageType(), topic_id=DefaultTopicId())
  44. await runtime.stop_when_idle()
  45. assert loopback_agent.num_calls == 2
  46. assert handler.num_publish_messages == 1
  47. @pytest.mark.asyncio
  48. async def test_intervention_drop_send() -> None:
  49. class DropSendInterventionHandler(DefaultInterventionHandler):
  50. async def on_send(
  51. self, message: MessageType, *, message_context: MessageContext, recipient: AgentId
  52. ) -> MessageType | type[DropMessage]:
  53. return DropMessage
  54. handler = DropSendInterventionHandler()
  55. runtime = SingleThreadedAgentRuntime(intervention_handlers=[handler])
  56. await LoopbackAgent.register(runtime, "name", LoopbackAgent)
  57. loopback = AgentId("name", key="default")
  58. runtime.start()
  59. with pytest.raises(MessageDroppedException):
  60. _response = await runtime.send_message(MessageType(), recipient=loopback)
  61. await runtime.stop()
  62. loopback_agent = await runtime.try_get_underlying_agent_instance(loopback, type=LoopbackAgent)
  63. assert loopback_agent.num_calls == 0
  64. @pytest.mark.asyncio
  65. async def test_intervention_drop_response() -> None:
  66. class DropResponseInterventionHandler(DefaultInterventionHandler):
  67. async def on_response(
  68. self, message: MessageType, *, sender: AgentId, recipient: AgentId | None
  69. ) -> MessageType | type[DropMessage]:
  70. return DropMessage
  71. handler = DropResponseInterventionHandler()
  72. runtime = SingleThreadedAgentRuntime(intervention_handlers=[handler])
  73. await LoopbackAgent.register(runtime, "name", LoopbackAgent)
  74. loopback = AgentId("name", key="default")
  75. runtime.start()
  76. with pytest.raises(MessageDroppedException):
  77. _response = await runtime.send_message(MessageType(), recipient=loopback)
  78. await runtime.stop()
  79. @pytest.mark.asyncio
  80. async def test_intervention_raise_exception_on_send() -> None:
  81. class InterventionException(Exception):
  82. pass
  83. class ExceptionInterventionHandler(DefaultInterventionHandler): # type: ignore
  84. async def on_send(
  85. self, message: MessageType, *, message_context: MessageContext, recipient: AgentId
  86. ) -> MessageType | type[DropMessage]: # type: ignore
  87. raise InterventionException
  88. handler = ExceptionInterventionHandler()
  89. runtime = SingleThreadedAgentRuntime(intervention_handlers=[handler])
  90. await LoopbackAgent.register(runtime, "name", LoopbackAgent)
  91. loopback = AgentId("name", key="default")
  92. runtime.start()
  93. with pytest.raises(InterventionException):
  94. _response = await runtime.send_message(MessageType(), recipient=loopback)
  95. await runtime.stop()
  96. long_running_agent = await runtime.try_get_underlying_agent_instance(loopback, type=LoopbackAgent)
  97. assert long_running_agent.num_calls == 0
  98. @pytest.mark.asyncio
  99. async def test_intervention_raise_exception_on_respond() -> None:
  100. class InterventionException(Exception):
  101. pass
  102. class ExceptionInterventionHandler(DefaultInterventionHandler): # type: ignore
  103. async def on_response(
  104. self, message: MessageType, *, sender: AgentId, recipient: AgentId | None
  105. ) -> MessageType | type[DropMessage]: # type: ignore
  106. raise InterventionException
  107. handler = ExceptionInterventionHandler()
  108. runtime = SingleThreadedAgentRuntime(intervention_handlers=[handler])
  109. await LoopbackAgent.register(runtime, "name", LoopbackAgent)
  110. loopback = AgentId("name", key="default")
  111. runtime.start()
  112. with pytest.raises(InterventionException):
  113. _response = await runtime.send_message(MessageType(), recipient=loopback)
  114. await runtime.stop()
  115. long_running_agent = await runtime.try_get_underlying_agent_instance(loopback, type=LoopbackAgent)
  116. assert long_running_agent.num_calls == 1