|
import functools |
|
from naptha_sdk.agent_service import AgentService |
|
from naptha_sdk.client.node import Node |
|
from naptha_sdk.mas import MultiAgentService |
|
from naptha_sdk.schemas import ModuleRunInput |
|
from naptha_sdk.utils import get_logger |
|
import time |
|
|
|
logger = get_logger(__name__) |
|
|
|
class App: |
|
def __init__(self, naptha): |
|
self.naptha = naptha |
|
self.agent_services = [] |
|
|
|
def agent_service(self, name, worker_node_url): |
|
def decorator(func): |
|
worker_node = Node(worker_node_url) |
|
self.agent_services.append(AgentService(name=name, fn=func, worker_node=worker_node, orchestrator_node=self.naptha.node)) |
|
return func |
|
return decorator |
|
|
|
def publish_agent_packages(self): |
|
for agent_service in self.agent_services: |
|
agent_service.publish_package(self.naptha) |
|
|
|
async def register_agent_modules(self): |
|
for agent_service in self.agent_services: |
|
await agent_service.register_module(self.naptha) |
|
|
|
async def register_agent_services(self): |
|
for agent_service in self.agent_services: |
|
await agent_service.register_service(self.naptha) |
|
self.worker_node_urls = [agent_service.worker_node.node_url for agent_service in self.agent_services] |
|
self.worker_nodes = [Node(worker_node_url) for worker_node_url in self.worker_node_urls] |
|
logger.info(f"Worker Nodes: {self.worker_nodes}") |
|
|
|
def multi_agent_service(self, name): |
|
def decorator(func): |
|
self.multi_agent_service = MultiAgentService(self.naptha, name=name, fn=func) |
|
return func |
|
return decorator |
|
|
|
def publish_multi_agent_packages(self): |
|
self.multi_agent_service.publish_package() |
|
|
|
async def register_multi_agent_modules(self): |
|
await self.multi_agent_service.register_module() |
|
|
|
async def register_multi_agent_services(self): |
|
await self.multi_agent_service.register_service() |
|
self.orchestrator_node = self.naptha.node |
|
logger.info(f"Orchestrator node: {self.orchestrator_node.node_url}") |
|
|
|
async def run(self, run_params): |
|
consumer_id = self.naptha.user["id"] |
|
flow_run_input = { |
|
"name": self.multi_agent_service.name, |
|
"type": "template", |
|
"consumer_id": consumer_id, |
|
"orchestrator_node": self.naptha.node.node_url, |
|
"worker_nodes": self.worker_node_urls, |
|
"module_name": self.multi_agent_service.module_name, |
|
"module_params": run_params, |
|
} |
|
flow_run_input = ModuleRunInput(**flow_run_input) |
|
|
|
consumer = { |
|
"public_key": consumer_id.split(':')[1], |
|
'id': consumer_id, |
|
} |
|
|
|
logger.info(f"Starting MAS run: {flow_run_input}") |
|
logger.info(f"Checking user: {consumer}") |
|
consumer = await self.orchestrator_node.check_user(user_input=consumer) |
|
if consumer["is_registered"] == True: |
|
logger.info("Found user...", consumer) |
|
elif consumer["is_registered"] == False: |
|
logger.info("No user found. Registering user...") |
|
consumer = await self.orchestrator_node.register_user(user_input=consumer) |
|
logger.info(f"User registered: {consumer}.") |
|
|
|
logger.info(f"Running multi agent service on orchestrator node {self.orchestrator_node.node_url}: {flow_run_input}") |
|
flow_run = await self.orchestrator_node.run_task(module_run_input=flow_run_input) |
|
logger.info(f"Created multi agent service run on orchestrator node {self.orchestrator_node.node_url}: {flow_run}") |
|
|
|
while True: |
|
flow_run = await self.orchestrator_node.check_task(flow_run) |
|
logger.info(flow_run.status) |
|
|
|
if flow_run.status in ["completed", "error"]: |
|
break |
|
time.sleep(3) |
|
|
|
if flow_run.status == 'completed': |
|
logger.info(flow_run.results) |
|
self.agent_service_result = flow_run.results |
|
return flow_run.results |
|
else: |
|
logger.info(flow_run.error_message) |
|
return flow_run.error_message |
|
|