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_rpc.py 2.8 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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, TypeSubscription, message_handler
  7. from agnext.core import MESSAGE_TYPE_REGISTRY, AgentId, AgentInstantiationContext, MessageContext, TopicId
  8. @dataclass
  9. class AskToGreet:
  10. content: str
  11. @dataclass
  12. class Greeting:
  13. content: str
  14. @dataclass
  15. class Feedback:
  16. content: str
  17. class ReceiveAgent(RoutedAgent):
  18. def __init__(self) -> None:
  19. super().__init__("Receive Agent")
  20. @message_handler
  21. async def on_greet(self, message: Greeting, ctx: MessageContext) -> Greeting:
  22. return Greeting(content=f"Received: {message.content}")
  23. @message_handler
  24. async def on_feedback(self, message: Feedback, ctx: MessageContext) -> None:
  25. print(f"Feedback received: {message.content}")
  26. async def on_unhandled_message(self, message: Any, ctx: MessageContext) -> NoReturn: # type: ignore
  27. print(f"Unhandled message: {message}")
  28. class GreeterAgent(RoutedAgent):
  29. def __init__(self, receive_agent_id: AgentId) -> None:
  30. super().__init__("Greeter Agent")
  31. self._receive_agent_id = receive_agent_id
  32. @message_handler
  33. async def on_ask(self, message: AskToGreet, ctx: MessageContext) -> None:
  34. response = await self.send_message(Greeting(f"Hello, {message.content}!"), recipient=self._receive_agent_id)
  35. await self.publish_message(Feedback(f"Feedback: {response.content}"), topic_id=DefaultTopicId())
  36. async def on_unhandled_message(self, message: Any, ctx: MessageContext) -> NoReturn: # type: ignore
  37. print(f"Unhandled message: {message}")
  38. async def main() -> None:
  39. runtime = WorkerAgentRuntime()
  40. MESSAGE_TYPE_REGISTRY.add_type(Greeting)
  41. MESSAGE_TYPE_REGISTRY.add_type(AskToGreet)
  42. MESSAGE_TYPE_REGISTRY.add_type(Feedback)
  43. await runtime.start(host_connection_string="localhost:50051")
  44. await runtime.register("receiver", lambda: ReceiveAgent())
  45. await runtime.register(
  46. "greeter", lambda: GreeterAgent(AgentId("receiver", AgentInstantiationContext.current_agent_id().key))
  47. )
  48. await runtime.add_subscription(TypeSubscription(topic_type="default", agent_type="greeter"))
  49. await runtime.add_subscription(TypeSubscription(topic_type="default", agent_type="receiver"))
  50. await runtime.publish_message(AskToGreet("Hello World!"), topic_id=TopicId("default", "default"))
  51. # Just to keep the runtime running
  52. try:
  53. await asyncio.sleep(1000000)
  54. except KeyboardInterrupt:
  55. pass
  56. await runtime.stop()
  57. if __name__ == "__main__":
  58. logging.basicConfig(level=logging.DEBUG)
  59. logger = logging.getLogger("agnext")
  60. logger.setLevel(logging.DEBUG)
  61. asyncio.run(main())