|
- import asyncio
- import logging
- from dataclasses import dataclass
- from typing import Any, NoReturn
-
- from agnext.application import WorkerAgentRuntime
- from agnext.components import DefaultTopicId, RoutedAgent, TypeSubscription, message_handler
- from agnext.core import MESSAGE_TYPE_REGISTRY, AgentId, AgentInstantiationContext, MessageContext, TopicId
-
-
- @dataclass
- class AskToGreet:
- content: str
-
-
- @dataclass
- class Greeting:
- content: str
-
-
- @dataclass
- class Feedback:
- content: str
-
-
- class ReceiveAgent(RoutedAgent):
- def __init__(self) -> None:
- super().__init__("Receive Agent")
-
- @message_handler
- async def on_greet(self, message: Greeting, ctx: MessageContext) -> Greeting:
- return Greeting(content=f"Received: {message.content}")
-
- @message_handler
- async def on_feedback(self, message: Feedback, ctx: MessageContext) -> None:
- print(f"Feedback received: {message.content}")
-
- async def on_unhandled_message(self, message: Any, ctx: MessageContext) -> NoReturn: # type: ignore
- print(f"Unhandled message: {message}")
-
-
- class GreeterAgent(RoutedAgent):
- def __init__(self, receive_agent_id: AgentId) -> None:
- super().__init__("Greeter Agent")
- self._receive_agent_id = receive_agent_id
-
- @message_handler
- async def on_ask(self, message: AskToGreet, ctx: MessageContext) -> None:
- response = await self.send_message(Greeting(f"Hello, {message.content}!"), recipient=self._receive_agent_id)
- await self.publish_message(Feedback(f"Feedback: {response.content}"), topic_id=DefaultTopicId())
-
- async def on_unhandled_message(self, message: Any, ctx: MessageContext) -> NoReturn: # type: ignore
- print(f"Unhandled message: {message}")
-
-
- async def main() -> None:
- runtime = WorkerAgentRuntime()
- MESSAGE_TYPE_REGISTRY.add_type(Greeting)
- MESSAGE_TYPE_REGISTRY.add_type(AskToGreet)
- MESSAGE_TYPE_REGISTRY.add_type(Feedback)
- await runtime.start(host_connection_string="localhost:50051")
-
- await runtime.register("receiver", lambda: ReceiveAgent())
- await runtime.register(
- "greeter", lambda: GreeterAgent(AgentId("receiver", AgentInstantiationContext.current_agent_id().key))
- )
-
- await runtime.add_subscription(TypeSubscription(topic_type="default", agent_type="greeter"))
- await runtime.add_subscription(TypeSubscription(topic_type="default", agent_type="receiver"))
- await runtime.publish_message(AskToGreet("Hello World!"), topic_id=TopicId("default", "default"))
-
- # Just to keep the runtime running
- try:
- await asyncio.sleep(1000000)
- except KeyboardInterrupt:
- pass
- await runtime.stop()
-
-
- if __name__ == "__main__":
- logging.basicConfig(level=logging.DEBUG)
- logger = logging.getLogger("agnext")
- logger.setLevel(logging.DEBUG)
- asyncio.run(main())
|