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 4.9 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import pytest
  2. from autogen_core.application import SingleThreadedAgentRuntime
  3. from autogen_core.base import AgentId
  4. from autogen_core.base.exceptions import MessageDroppedException
  5. from autogen_core.base.intervention import DefaultInterventionHandler, DropMessage
  6. from test_utils import LoopbackAgent, MessageType
  7. @pytest.mark.asyncio
  8. async def test_intervention_count_messages() -> None:
  9. class DebugInterventionHandler(DefaultInterventionHandler):
  10. def __init__(self) -> None:
  11. self.num_messages = 0
  12. async def on_send(self, message: MessageType, *, sender: AgentId | None, recipient: AgentId) -> MessageType:
  13. self.num_messages += 1
  14. return message
  15. handler = DebugInterventionHandler()
  16. runtime = SingleThreadedAgentRuntime(intervention_handlers=[handler])
  17. await LoopbackAgent.register(runtime, "name", LoopbackAgent)
  18. loopback = AgentId("name", key="default")
  19. runtime.start()
  20. _response = await runtime.send_message(MessageType(), recipient=loopback)
  21. await runtime.stop()
  22. assert handler.num_messages == 1
  23. loopback_agent = await runtime.try_get_underlying_agent_instance(loopback, type=LoopbackAgent)
  24. assert loopback_agent.num_calls == 1
  25. @pytest.mark.asyncio
  26. async def test_intervention_drop_send() -> None:
  27. class DropSendInterventionHandler(DefaultInterventionHandler):
  28. async def on_send(
  29. self, message: MessageType, *, sender: AgentId | None, recipient: AgentId
  30. ) -> MessageType | type[DropMessage]:
  31. return DropMessage
  32. handler = DropSendInterventionHandler()
  33. runtime = SingleThreadedAgentRuntime(intervention_handlers=[handler])
  34. await LoopbackAgent.register(runtime, "name", LoopbackAgent)
  35. loopback = AgentId("name", key="default")
  36. runtime.start()
  37. with pytest.raises(MessageDroppedException):
  38. _response = await runtime.send_message(MessageType(), recipient=loopback)
  39. await runtime.stop()
  40. loopback_agent = await runtime.try_get_underlying_agent_instance(loopback, type=LoopbackAgent)
  41. assert loopback_agent.num_calls == 0
  42. @pytest.mark.asyncio
  43. async def test_intervention_drop_response() -> None:
  44. class DropResponseInterventionHandler(DefaultInterventionHandler):
  45. async def on_response(
  46. self, message: MessageType, *, sender: AgentId, recipient: AgentId | None
  47. ) -> MessageType | type[DropMessage]:
  48. return DropMessage
  49. handler = DropResponseInterventionHandler()
  50. runtime = SingleThreadedAgentRuntime(intervention_handlers=[handler])
  51. await LoopbackAgent.register(runtime, "name", LoopbackAgent)
  52. loopback = AgentId("name", key="default")
  53. runtime.start()
  54. with pytest.raises(MessageDroppedException):
  55. _response = await runtime.send_message(MessageType(), recipient=loopback)
  56. await runtime.stop()
  57. @pytest.mark.asyncio
  58. async def test_intervention_raise_exception_on_send() -> None:
  59. class InterventionException(Exception):
  60. pass
  61. class ExceptionInterventionHandler(DefaultInterventionHandler): # type: ignore
  62. async def on_send(
  63. self, message: MessageType, *, sender: AgentId | None, recipient: AgentId
  64. ) -> MessageType | type[DropMessage]: # type: ignore
  65. raise InterventionException
  66. handler = ExceptionInterventionHandler()
  67. runtime = SingleThreadedAgentRuntime(intervention_handlers=[handler])
  68. await LoopbackAgent.register(runtime, "name", LoopbackAgent)
  69. loopback = AgentId("name", key="default")
  70. runtime.start()
  71. with pytest.raises(InterventionException):
  72. _response = await runtime.send_message(MessageType(), recipient=loopback)
  73. await runtime.stop()
  74. long_running_agent = await runtime.try_get_underlying_agent_instance(loopback, type=LoopbackAgent)
  75. assert long_running_agent.num_calls == 0
  76. @pytest.mark.asyncio
  77. async def test_intervention_raise_exception_on_respond() -> None:
  78. class InterventionException(Exception):
  79. pass
  80. class ExceptionInterventionHandler(DefaultInterventionHandler): # type: ignore
  81. async def on_response(
  82. self, message: MessageType, *, sender: AgentId, recipient: AgentId | None
  83. ) -> MessageType | type[DropMessage]: # type: ignore
  84. raise InterventionException
  85. handler = ExceptionInterventionHandler()
  86. runtime = SingleThreadedAgentRuntime(intervention_handlers=[handler])
  87. await LoopbackAgent.register(runtime, "name", LoopbackAgent)
  88. loopback = AgentId("name", key="default")
  89. runtime.start()
  90. with pytest.raises(InterventionException):
  91. _response = await runtime.send_message(MessageType(), recipient=loopback)
  92. await runtime.stop()
  93. long_running_agent = await runtime.try_get_underlying_agent_instance(loopback, type=LoopbackAgent)
  94. assert long_running_agent.num_calls == 1