Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 2 additions & 9 deletions examples/google_adk/calendar_agent/adk_agent_executor.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,7 @@
from google.adk.events import Event
from google.genai import types

from a2a.server.agent_execution import AgentExecutor
from a2a.server.agent_execution.context import RequestContext
from a2a.server.agent_execution import BaseAgentExecutor, RequestContext
from a2a.server.events.event_queue import EventQueue
from a2a.server.tasks import TaskUpdater
from a2a.types import (
Expand All @@ -22,9 +21,7 @@
Part,
TaskState,
TextPart,
UnsupportedOperationError,
)
from a2a.utils.errors import ServerError
from a2a.utils.message import new_agent_text_message


Expand All @@ -40,7 +37,7 @@
auth_receive_timeout_seconds = 60


class ADKAgentExecutor(AgentExecutor):
class ADKAgentExecutor(BaseAgentExecutor):
"""An AgentExecutor that runs an ADK-based Agent."""

_awaiting_auth: dict[str, asyncio.Future]
Expand Down Expand Up @@ -221,10 +218,6 @@ async def execute(
)
logger.debug('[Calendar] execute exiting')

async def cancel(self, context: RequestContext, event_queue: EventQueue):
# Ideally: kill any ongoing tasks.
raise ServerError(error=UnsupportedOperationError())
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kthota-g is this the correct way to handle UnsupportedOperationError vs the event_queue?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, the latest version would handle throwing exceptions from agent executor


async def on_auth_callback(self, state: str, uri: str):
self._awaiting_auth[state].set_result(uri)

Expand Down
10 changes: 2 additions & 8 deletions examples/helloworld/agent_executor.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from typing_extensions import override

from a2a.server.agent_execution import AgentExecutor, RequestContext
from a2a.server.agent_execution import BaseAgentExecutor, RequestContext
from a2a.server.events import EventQueue
from a2a.utils import new_agent_text_message

Expand All @@ -12,7 +12,7 @@ async def invoke(self) -> str:
return 'Hello World'


class HelloWorldAgentExecutor(AgentExecutor):
class HelloWorldAgentExecutor(BaseAgentExecutor):
"""Test AgentProxy Implementation."""

def __init__(self):
Expand All @@ -26,9 +26,3 @@ async def execute(
) -> None:
result = await self.agent.invoke()
event_queue.enqueue_event(new_agent_text_message(result))

@override
async def cancel(
self, context: RequestContext, event_queue: EventQueue
) -> None:
raise Exception('cancel not supported')
10 changes: 2 additions & 8 deletions examples/langgraph/agent_executor.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from agent import CurrencyAgent
from typing_extensions import override

from a2a.server.agent_execution import AgentExecutor, RequestContext
from a2a.server.agent_execution import BaseAgentExecutor, RequestContext
from a2a.server.events.event_queue import EventQueue
from a2a.types import (
TaskArtifactUpdateEvent,
Expand All @@ -12,7 +12,7 @@
from a2a.utils import new_agent_text_message, new_task, new_text_artifact


class CurrencyAgentExecutor(AgentExecutor):
class CurrencyAgentExecutor(BaseAgentExecutor):
"""Currency AgentExecutor Example."""

def __init__(self):
Expand Down Expand Up @@ -89,9 +89,3 @@ async def execute(
taskId=task.id,
)
)

@override
async def cancel(
self, context: RequestContext, event_queue: EventQueue
) -> None:
raise Exception('cancel not supported')
3 changes: 2 additions & 1 deletion src/a2a/server/agent_execution/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from a2a.server.agent_execution.agent_executor import AgentExecutor
from a2a.server.agent_execution.base_agent_executor import BaseAgentExecutor
from a2a.server.agent_execution.context import RequestContext


__all__ = ['AgentExecutor', 'RequestContext']
__all__ = ['AgentExecutor', 'BaseAgentExecutor', 'RequestContext']
42 changes: 4 additions & 38 deletions src/a2a/server/agent_execution/base_agent_executor.py
Original file line number Diff line number Diff line change
@@ -1,48 +1,14 @@
from a2a.server.agent_execution.agent_executor import AgentExecutor
from a2a.server.agent_execution.context import RequestContext
from a2a.server.events.event_queue import EventQueue
from a2a.types import (
A2AError,
CancelTaskRequest,
SendMessageRequest,
SendStreamingMessageRequest,
Task,
TaskResubscriptionRequest,
UnsupportedOperationError,
)
from a2a.types import A2AError, UnsupportedOperationError


class BaseAgentExecutor(AgentExecutor):
"""Base AgentExecutor which returns unsupported operation error."""

async def on_message_send(
self,
request: SendMessageRequest,
event_queue: EventQueue,
task: Task | None,
) -> None:
"""Handler for 'message/send' requests."""
async def execute(self, context: RequestContext, event_queue: EventQueue):
event_queue.enqueue_event(A2AError(UnsupportedOperationError()))

async def on_message_stream(
self,
request: SendStreamingMessageRequest,
event_queue: EventQueue,
task: Task | None,
) -> None:
"""Handler for 'message/stream' requests."""
event_queue.enqueue_event(A2AError(UnsupportedOperationError()))

async def on_cancel(
self, request: CancelTaskRequest, event_queue: EventQueue, task: Task
) -> None:
"""Handler for 'tasks/cancel' requests."""
event_queue.enqueue_event(A2AError(UnsupportedOperationError()))

async def on_resubscribe(
self,
request: TaskResubscriptionRequest,
event_queue: EventQueue,
task: Task,
) -> None:
"""Handler for 'tasks/resubscribe' requests."""
async def cancel(self, context: RequestContext, event_queue: EventQueue):
event_queue.enqueue_event(A2AError(UnsupportedOperationError()))