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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import pytest
  2. from agnext.application import SingleThreadedAgentRuntime
  3. from agnext.core import AgentId
  4. from agnext.core.exceptions import MessageDroppedException
  5. from agnext.core.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_handler=handler)
  17. await runtime.register("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(self, message: MessageType, *, sender: AgentId | None, recipient: AgentId) -> MessageType | type[DropMessage]:
  29. return DropMessage
  30. handler = DropSendInterventionHandler()
  31. runtime = SingleThreadedAgentRuntime(intervention_handler=handler)
  32. await runtime.register("name", LoopbackAgent)
  33. loopback = AgentId("name", key="default")
  34. runtime.start()
  35. with pytest.raises(MessageDroppedException):
  36. _response = await runtime.send_message(MessageType(), recipient=loopback)
  37. await runtime.stop()
  38. loopback_agent = await runtime.try_get_underlying_agent_instance(loopback, type=LoopbackAgent)
  39. assert loopback_agent.num_calls == 0
  40. @pytest.mark.asyncio
  41. async def test_intervention_drop_response() -> None:
  42. class DropResponseInterventionHandler(DefaultInterventionHandler):
  43. async def on_response(self, message: MessageType, *, sender: AgentId, recipient: AgentId | None) -> MessageType | type[DropMessage]:
  44. return DropMessage
  45. handler = DropResponseInterventionHandler()
  46. runtime = SingleThreadedAgentRuntime(intervention_handler=handler)
  47. await runtime.register("name", LoopbackAgent)
  48. loopback = AgentId("name", key="default")
  49. runtime.start()
  50. with pytest.raises(MessageDroppedException):
  51. _response = await runtime.send_message(MessageType(), recipient=loopback)
  52. await runtime.stop()
  53. @pytest.mark.asyncio
  54. async def test_intervention_raise_exception_on_send() -> None:
  55. class InterventionException(Exception):
  56. pass
  57. class ExceptionInterventionHandler(DefaultInterventionHandler): # type: ignore
  58. async def on_send(self, message: MessageType, *, sender: AgentId | None, recipient: AgentId) -> MessageType | type[DropMessage]: # type: ignore
  59. raise InterventionException
  60. handler = ExceptionInterventionHandler()
  61. runtime = SingleThreadedAgentRuntime(intervention_handler=handler)
  62. await runtime.register("name", LoopbackAgent)
  63. loopback = AgentId("name", key="default")
  64. runtime.start()
  65. with pytest.raises(InterventionException):
  66. _response = await runtime.send_message(MessageType(), recipient=loopback)
  67. await runtime.stop()
  68. long_running_agent = await runtime.try_get_underlying_agent_instance(loopback, type=LoopbackAgent)
  69. assert long_running_agent.num_calls == 0
  70. @pytest.mark.asyncio
  71. async def test_intervention_raise_exception_on_respond() -> None:
  72. class InterventionException(Exception):
  73. pass
  74. class ExceptionInterventionHandler(DefaultInterventionHandler): # type: ignore
  75. async def on_response(self, message: MessageType, *, sender: AgentId, recipient: AgentId | None) -> MessageType | type[DropMessage]: # type: ignore
  76. raise InterventionException
  77. handler = ExceptionInterventionHandler()
  78. runtime = SingleThreadedAgentRuntime(intervention_handler=handler)
  79. await runtime.register("name", LoopbackAgent)
  80. loopback = AgentId("name", key="default")
  81. runtime.start()
  82. with pytest.raises(InterventionException):
  83. _response = await runtime.send_message(MessageType(), recipient=loopback)
  84. await runtime.stop()
  85. long_running_agent = await runtime.try_get_underlying_agent_instance(loopback, type=LoopbackAgent)
  86. assert long_running_agent.num_calls == 1