44import traceback
55from typing import Any
66from a2a .server .agent_execution import AgentExecutor , RequestContext
7- from a2a .server .apps import A2AStarletteApplication
87from a2a .server .events .event_queue import EventQueue
98from a2a .server .request_handlers import DefaultRequestHandler
9+ from a2a .server .routes import create_agent_card_routes , create_jsonrpc_routes
1010from a2a .server .tasks import InMemoryTaskStore , TaskUpdater
1111from a2a .types import (
1212 AgentCapabilities ,
1313 AgentCard ,
14+ AgentInterface ,
1415 AgentSkill ,
15- Part ,
1616 TaskState ,
17- TextPart ,
1817)
19- from a2a .utils import new_agent_text_message , new_task
18+ from a2a .helpers import new_task_from_user_message , new_text_part
19+
20+ from starlette .applications import Starlette
2021
2122from autogen .mcp .mcp_client import create_toolkit , Toolkit
2223from mcp import ClientSession
@@ -69,7 +70,7 @@ def get_agent_card(settings: Settings) -> AgentCard:
6970 return AgentCard (
7071 name = "Simple Generalist Agent" ,
7172 description = "A generalist AG2 agent exposed via A2A, powered by MCP tools" ,
72- url = agent_url ,
73+ supported_interfaces = [ AgentInterface ( url = agent_url , protocol_binding = "JSONRPC" )] ,
7374 version = "0.1.0" ,
7475 default_input_modes = ["text" ],
7576 default_output_modes = ["text" ],
@@ -125,7 +126,7 @@ async def execute(self, context: RequestContext, event_queue: EventQueue):
125126 # Get or create task
126127 task = context .current_task
127128 if not task :
128- task = new_task (context .message ) # type: ignore
129+ task = new_task_from_user_message (context .message ) # type: ignore
129130 await event_queue .enqueue_event (task )
130131
131132 # Create task updater for progress events
@@ -138,24 +139,20 @@ async def event_callback(message: str, final: bool = False):
138139
139140 if final :
140141 # Final message with artifact
141- parts = [Part ( root = TextPart ( text = message ) )]
142+ parts = [new_text_part ( message )]
142143 await task_updater .add_artifact (parts )
143144 await task_updater .complete ()
144145 else :
145146 # Progress update
146147 await task_updater .update_status (
147- TaskState .working ,
148- new_agent_text_message (
149- message ,
150- task_updater .context_id ,
151- task_updater .task_id ,
152- ),
148+ TaskState .TASK_STATE_WORKING ,
149+ task_updater .new_agent_message ([new_text_part (message )]),
153150 )
154151
155152 async def error_callback (message : str ):
156153 """Send error event and mark task as failed."""
157154 logger .info (f"Error event: { message } " )
158- parts = [Part ( root = TextPart ( text = message ) )]
155+ parts = [new_text_part ( message )]
159156 await task_updater .add_artifact (parts )
160157 await task_updater .failed ()
161158
@@ -234,16 +231,18 @@ def create_app(settings: Settings) -> Any:
234231 request_handler = DefaultRequestHandler (
235232 agent_executor = SimpleGeneralistExecutor (settings ),
236233 task_store = InMemoryTaskStore (),
237- )
238-
239- # Create A2A server
240- server = A2AStarletteApplication (
241234 agent_card = agent_card ,
242- http_handler = request_handler ,
243235 )
244236
245- # Build and return the app
246- app = server .build ()
237+ # a2a-sdk 1.x replaced A2AStarletteApplication with route factories that we
238+ # assemble into a Starlette app ourselves.
239+ routes = create_jsonrpc_routes (request_handler , rpc_url = "/" )
240+ # Serve the current well-known path (/.well-known/agent-card.json) plus the
241+ # legacy /.well-known/agent.json path for backward compatibility.
242+ routes += create_agent_card_routes (agent_card )
243+ routes += create_agent_card_routes (agent_card , card_url = "/.well-known/agent.json" )
244+
245+ app = Starlette (routes = routes )
247246 logger .info ("A2A server application created" )
248247
249248 return app
0 commit comments