Skip to content
Merged
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
14 changes: 13 additions & 1 deletion capiscio_sdk/executor.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,13 @@
except ImportError:
RequestContext = Any # type: ignore[misc,assignment]

try:
from google.protobuf.json_format import MessageToDict
from google.protobuf.message import Message as ProtobufMessage
except ImportError:
MessageToDict = None # type: ignore[assignment,misc]
ProtobufMessage = None # type: ignore[assignment,misc]

from .config import SecurityConfig
from .validators import MessageValidator, ProtocolValidator
from .infrastructure import ValidationCache, RateLimiter
Expand Down Expand Up @@ -86,7 +93,12 @@ async def execute(self, context: RequestContext, event_queue: Any) -> None:
return

# Convert message to dict for validation (our validators expect dict format)
message_dict = message.model_dump() if hasattr(message, 'model_dump') else {}
if hasattr(message, 'model_dump'):
message_dict = message.model_dump()
elif ProtobufMessage is not None and isinstance(message, ProtobufMessage):
message_dict = MessageToDict(message, preserving_proto_field_name=True)
else:
message_dict = {}
Comment on lines +96 to +101

# Extract identifier for rate limiting
identifier = message_dict.get("message_id") or message.message_id
Expand Down
16 changes: 12 additions & 4 deletions examples/simple_agent/agent_executor.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

from a2a.server.agent_execution import AgentExecutor, RequestContext
from a2a.server.events import EventQueue
from a2a.utils import new_agent_text_message
from a2a.types import Message, Part, Role


class SimpleAgent:
Expand Down Expand Up @@ -69,7 +69,12 @@ async def execute(
result = await self.agent.invoke(text or "hello")

# Send response back to client
await event_queue.enqueue_event(new_agent_text_message(result))
response_msg = Message(
message_id="response",
role=Role.ROLE_AGENT,
parts=[Part(text=result)],
)
await event_queue.enqueue_event(response_msg)

async def cancel(
self,
Expand All @@ -84,6 +89,9 @@ async def cancel(
event_queue: Queue for sending events
"""
# This simple agent doesn't support cancellation
await event_queue.enqueue_event(
new_agent_text_message("Task cancellation not supported by this simple agent.")
cancel_msg = Message(
message_id="cancel-response",
role=Role.ROLE_AGENT,
parts=[Part(text="Task cancellation not supported by this simple agent.")],
)
await event_queue.enqueue_event(cancel_msg)
13 changes: 7 additions & 6 deletions examples/simple_agent/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@
import httpx
import asyncio
from datetime import datetime
from a2a.types import Message, TextPart, Role, MessageSendParams
from a2a.types import Message, Part, Role, SendMessageRequest
from google.protobuf.json_format import MessageToDict


async def send_message(client: httpx.AsyncClient, text: str, message_id: str = None):
Expand All @@ -28,16 +29,16 @@ async def send_message(client: httpx.AsyncClient, text: str, message_id: str = N
# Create proper A2A message
message = Message(
message_id=message_id,
role=Role.user,
parts=[TextPart(text=text)]
role=Role.ROLE_USER,
parts=[Part(text=text)]
)

# Wrap in MessageSendParams and serialize
params = MessageSendParams(message=message)
# Wrap in SendMessageRequest and serialize
params = SendMessageRequest(message=message)

response = await client.post(
"http://localhost:8080/v1/tasks",
json=params.model_dump(mode="json")
json=MessageToDict(params)
)
return response

Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ classifiers = [
]

dependencies = [
"a2a-sdk>=0.1.0",
"a2a-sdk>=1.0.0",
"httpx>=0.27.0",
"pydantic>=2.0.0",
"cryptography>=42.0.0",
Expand Down
Loading
Loading