spatial-atlas / src /executor.py
Arun0808's picture
Spatial Atlas v1.0: spatial-aware research agent for AgentBeats Challenge
77a8cec
Raw
History Blame Contribute Delete
2.3 kB
"""
Spatial Atlas — A2A AgentExecutor
Routes incoming A2A requests to per-context Agent instances.
Follows the standard AgentBeats executor pattern.
"""
from a2a.server.agent_execution import AgentExecutor, RequestContext
from a2a.server.events import EventQueue
from a2a.server.tasks import TaskUpdater
from a2a.types import (
InvalidRequestError,
Task,
TaskState,
UnsupportedOperationError,
)
from a2a.utils import (
new_agent_text_message,
new_task,
)
from a2a.utils.errors import ServerError
from agent import Agent
TERMINAL_STATES = {
TaskState.completed,
TaskState.canceled,
TaskState.failed,
TaskState.rejected,
}
class Executor(AgentExecutor):
def __init__(self):
self.agents: dict[str, Agent] = {}
async def execute(self, context: RequestContext, event_queue: EventQueue) -> None:
msg = context.message
if not msg:
raise ServerError(error=InvalidRequestError(message="Missing message in request"))
task = context.current_task
if task and task.status.state in TERMINAL_STATES:
raise ServerError(
error=InvalidRequestError(
message=f"Task {task.id} already processed (state: {task.status.state})"
)
)
if not task:
task = new_task(msg)
await event_queue.enqueue_event(task)
context_id = task.context_id
updater = TaskUpdater(event_queue, task.id, context_id)
await updater.start_work()
try:
agent = self.agents.get(context_id)
if not agent:
agent = Agent()
self.agents[context_id] = agent
await agent.run(msg, updater)
if not updater._terminal_state_reached:
await updater.complete()
except Exception as e:
print(f"Task failed with agent error: {e}")
await updater.failed(
new_agent_text_message(
f"Agent error: {e}",
context_id=context_id,
task_id=task.id,
)
)
async def cancel(self, context: RequestContext, event_queue: EventQueue) -> None:
raise ServerError(error=UnsupportedOperationError())