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.

run_worker_pub_sub.py 3.1 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import asyncio
  2. import logging
  3. from dataclasses import dataclass
  4. from typing import Any, NoReturn
  5. from agnext.application import WorkerAgentRuntime
  6. from agnext.components import DefaultTopicId, RoutedAgent, message_handler
  7. from agnext.components._type_subscription import TypeSubscription
  8. from agnext.core import MESSAGE_TYPE_REGISTRY, MessageContext, TopicId
  9. @dataclass
  10. class AskToGreet:
  11. content: str
  12. @dataclass
  13. class Greeting:
  14. content: str
  15. @dataclass
  16. class ReturnedGreeting:
  17. content: str
  18. @dataclass
  19. class Feedback:
  20. content: str
  21. @dataclass
  22. class ReturnedFeedback:
  23. content: str
  24. class ReceiveAgent(RoutedAgent):
  25. def __init__(self) -> None:
  26. super().__init__("Receive Agent")
  27. @message_handler
  28. async def on_greet(self, message: Greeting, ctx: MessageContext) -> None:
  29. await self.publish_message(ReturnedGreeting(f"Returned greeting: {message.content}"), topic_id=DefaultTopicId())
  30. @message_handler
  31. async def on_feedback(self, message: Feedback, ctx: MessageContext) -> None:
  32. await self.publish_message(ReturnedFeedback(f"Returned feedback: {message.content}"), topic_id=DefaultTopicId())
  33. async def on_unhandled_message(self, message: Any, ctx: MessageContext) -> NoReturn: # type: ignore
  34. print(f"Unhandled message: {message}")
  35. class GreeterAgent(RoutedAgent):
  36. def __init__(self) -> None:
  37. super().__init__("Greeter Agent")
  38. @message_handler
  39. async def on_ask(self, message: AskToGreet, ctx: MessageContext) -> None:
  40. await self.publish_message(Greeting(f"Hello, {message.content}!"), topic_id=DefaultTopicId())
  41. @message_handler
  42. async def on_returned_greet(self, message: ReturnedGreeting, ctx: MessageContext) -> None:
  43. await self.publish_message(Feedback(f"Feedback: {message.content}"), topic_id=DefaultTopicId())
  44. async def on_unhandled_message(self, message: Any, ctx: MessageContext) -> NoReturn: # type: ignore
  45. print(f"Unhandled message: {message}")
  46. async def main() -> None:
  47. runtime = WorkerAgentRuntime()
  48. MESSAGE_TYPE_REGISTRY.add_type(Greeting)
  49. MESSAGE_TYPE_REGISTRY.add_type(AskToGreet)
  50. MESSAGE_TYPE_REGISTRY.add_type(Feedback)
  51. MESSAGE_TYPE_REGISTRY.add_type(ReturnedGreeting)
  52. MESSAGE_TYPE_REGISTRY.add_type(ReturnedFeedback)
  53. await runtime.start(host_connection_string="localhost:50051")
  54. await runtime.register("receiver", lambda: ReceiveAgent())
  55. await runtime.add_subscription(TypeSubscription("default", "receiver"))
  56. await runtime.register("greeter", lambda: GreeterAgent())
  57. await runtime.add_subscription(TypeSubscription("default", "greeter"))
  58. await runtime.publish_message(AskToGreet("Hello World!"), topic_id=TopicId("default", "default"))
  59. # Just to keep the runtime running
  60. try:
  61. await asyncio.sleep(1000000)
  62. except KeyboardInterrupt:
  63. pass
  64. await runtime.stop()
  65. if __name__ == "__main__":
  66. logging.basicConfig(level=logging.DEBUG)
  67. logger = logging.getLogger("agnext")
  68. logger.setLevel(logging.DEBUG)
  69. asyncio.run(main())