2024-06-26 06:32:33 -07:00
|
|
|
"""
|
|
|
|
This example shows how to use direct messaging to implement
|
|
|
|
a simple interaction between an inner and an outer agent.
|
|
|
|
1. The outer agent receives a message, sends a message to the inner agent.
|
|
|
|
2. The inner agent receives the message, processes it, and sends a response to the outer agent.
|
|
|
|
3. The outer agent receives the response and processes it, and returns the final response.
|
|
|
|
"""
|
|
|
|
|
2024-05-15 12:31:13 -04:00
|
|
|
import asyncio
|
2024-06-17 17:54:27 -07:00
|
|
|
import logging
|
2024-05-15 12:31:13 -04:00
|
|
|
from dataclasses import dataclass
|
|
|
|
|
2024-06-04 10:00:05 -04:00
|
|
|
from agnext.application import SingleThreadedAgentRuntime
|
2024-06-05 15:48:14 -04:00
|
|
|
from agnext.components import TypeRoutedAgent, message_handler
|
2024-08-16 23:14:09 -04:00
|
|
|
from agnext.core import AgentId, MessageContext
|
2024-05-15 12:31:13 -04:00
|
|
|
|
|
|
|
|
|
|
|
@dataclass
|
2024-05-20 13:32:08 -06:00
|
|
|
class MessageType:
|
2024-05-17 14:59:00 -07:00
|
|
|
body: str
|
2024-05-15 12:31:13 -04:00
|
|
|
sender: str
|
|
|
|
|
|
|
|
|
2024-06-24 15:05:47 -07:00
|
|
|
class Inner(TypeRoutedAgent):
|
|
|
|
def __init__(self) -> None:
|
2024-06-18 14:53:18 -04:00
|
|
|
super().__init__("The inner agent")
|
2024-05-15 12:31:13 -04:00
|
|
|
|
2024-06-24 15:05:47 -07:00
|
|
|
@message_handler()
|
2024-08-16 23:14:09 -04:00
|
|
|
async def on_new_message(self, message: MessageType, ctx: MessageContext) -> MessageType:
|
2024-08-07 16:08:13 -04:00
|
|
|
return MessageType(body=f"Inner: {message.body}", sender=self.metadata["type"])
|
2024-05-15 12:31:13 -04:00
|
|
|
|
|
|
|
|
2024-06-24 15:05:47 -07:00
|
|
|
class Outer(TypeRoutedAgent):
|
|
|
|
def __init__(self, inner: AgentId) -> None:
|
2024-06-18 14:53:18 -04:00
|
|
|
super().__init__("The outer agent")
|
2024-05-15 12:31:13 -04:00
|
|
|
self._inner = inner
|
|
|
|
|
2024-06-24 15:05:47 -07:00
|
|
|
@message_handler()
|
2024-08-16 23:14:09 -04:00
|
|
|
async def on_new_message(self, message: MessageType, ctx: MessageContext) -> MessageType:
|
2024-06-18 15:51:02 -04:00
|
|
|
inner_response = self.send_message(message, self._inner)
|
2024-05-15 12:31:13 -04:00
|
|
|
inner_message = await inner_response
|
2024-05-23 16:00:05 -04:00
|
|
|
assert isinstance(inner_message, MessageType)
|
2024-08-07 16:08:13 -04:00
|
|
|
return MessageType(body=f"Outer: {inner_message.body}", sender=self.metadata["type"])
|
2024-05-15 12:31:13 -04:00
|
|
|
|
|
|
|
|
|
|
|
async def main() -> None:
|
2024-06-17 15:37:46 -04:00
|
|
|
runtime = SingleThreadedAgentRuntime()
|
2024-07-23 11:49:38 -07:00
|
|
|
inner = await runtime.register_and_get("inner", Inner)
|
|
|
|
outer = await runtime.register_and_get("outer", lambda: Outer(inner))
|
2024-05-15 12:31:13 -04:00
|
|
|
|
2024-07-01 11:53:45 -04:00
|
|
|
run_context = runtime.start()
|
2024-05-15 12:31:13 -04:00
|
|
|
|
2024-07-01 11:53:45 -04:00
|
|
|
response = await runtime.send_message(MessageType(body="Hello", sender="external"), outer)
|
|
|
|
print(response)
|
|
|
|
await run_context.stop()
|
2024-05-15 12:31:13 -04:00
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
2024-06-24 15:05:47 -07:00
|
|
|
import logging
|
|
|
|
|
|
|
|
logging.basicConfig(level=logging.WARNING)
|
|
|
|
logging.getLogger("agnext").setLevel(logging.DEBUG)
|
2024-05-15 12:31:13 -04:00
|
|
|
asyncio.run(main())
|