1313
1414
1515from a2a .server .agent_execution import AgentExecutor , RequestContext
16- from a2a .server .apps import A2AStarletteApplication
1716from a2a .server .events .event_queue import EventQueue
1817from a2a .server .request_handlers import DefaultRequestHandler
18+ from a2a .server .routes import create_agent_card_routes , create_jsonrpc_routes
1919from a2a .server .tasks import InMemoryTaskStore , TaskUpdater
20+ from a2a .helpers import new_task_from_user_message , new_text_part
2021from a2a .types import (
2122 AgentCapabilities ,
2223 AgentCard ,
24+ AgentInterface ,
2325 AgentSkill ,
2426 TaskState ,
25- TextPart ,
2627 SecurityScheme ,
2728 HTTPAuthSecurityScheme ,
2829)
29- from a2a .utils import new_agent_text_message , new_task
3030
31- from starlette .routing import Route
31+ from starlette .applications import Starlette
3232
3333from git_issue_agent .config import settings , Settings
3434from git_issue_agent .event import Event
@@ -51,20 +51,21 @@ def get_agent_card(host: str, port: int):
5151 "Show all issues assigned to me across any repository" ,
5252 ],
5353 )
54+ # Allow env var AGENT_ENDPOINT to override the URL in the agent card
55+ url = os .getenv ("AGENT_ENDPOINT" , f"http://{ host } :{ port } " ).rstrip ("/" ) + "/"
5456 return AgentCard (
5557 name = "Github issue agent" ,
5658 description = "Answer queries about Github issues" ,
57- # Allow env var AGENT_ENDPOINT to override the URL in the agent card
58- url = os .getenv ("AGENT_ENDPOINT" , f"http://{ host } :{ port } " ).rstrip ("/" ) + "/" ,
59+ supported_interfaces = [AgentInterface (url = url , protocol_binding = "JSONRPC" )],
5960 version = "1.0.0" ,
6061 default_input_modes = ["text" ],
6162 default_output_modes = ["text" ],
6263 capabilities = capabilities ,
6364 skills = [skill ],
64- securitySchemes = {
65+ security_schemes = {
6566 "Bearer" : SecurityScheme (
66- root = HTTPAuthSecurityScheme (
67- type = "http" , scheme = "bearer" , bearerFormat = "JWT" , description = "OAuth 2.0 JWT token"
67+ http_auth_security_scheme = HTTPAuthSecurityScheme (
68+ scheme = "bearer" , bearer_format = "JWT" , description = "OAuth 2.0 JWT token"
6869 )
6970 )
7071 },
@@ -99,17 +100,13 @@ async def emit_event(self, message: str, final: bool = False) -> None:
99100 logger .info ("Emitting event %s" , message )
100101
101102 if final :
102- parts = [TextPart ( text = message )]
103+ parts = [new_text_part ( message )]
103104 await self .task_updater .add_artifact (parts )
104105 await self .task_updater .complete ()
105106 else :
106107 await self .task_updater .update_status (
107- TaskState .working ,
108- new_agent_text_message (
109- message ,
110- self .task_updater .context_id ,
111- self .task_updater .task_id ,
112- ),
108+ TaskState .TASK_STATE_WORKING ,
109+ self .task_updater .new_agent_message ([new_text_part (message )]),
113110 )
114111
115112
@@ -153,7 +150,7 @@ async def execute(self, context: RequestContext, event_queue: EventQueue):
153150 user_input = [context .get_user_input ()]
154151 task = context .current_task
155152 if not task :
156- task = new_task (context .message )
153+ task = new_task_from_user_message (context .message )
157154 await event_queue .enqueue_event (task )
158155 task_updater = TaskUpdater (event_queue , task .id , task .context_id )
159156 event_emitter = A2AEvent (task_updater )
@@ -216,24 +213,17 @@ def run():
216213 request_handler = DefaultRequestHandler (
217214 agent_executor = GithubExecutor (),
218215 task_store = InMemoryTaskStore (),
219- )
220-
221- server = A2AStarletteApplication (
222216 agent_card = agent_card ,
223- http_handler = request_handler ,
224217 )
225218
226- app = server .build () # this returns a Starlette app
227-
228- # Add the new agent-card.json path alongside the legacy agent.json path
229- app .routes .insert (
230- 0 ,
231- Route (
232- "/.well-known/agent-card.json" ,
233- server ._handle_get_agent_card ,
234- methods = ["GET" ],
235- name = "agent_card_new" ,
236- ),
237- )
219+ # a2a-sdk 1.x replaced A2AStarletteApplication with route factories that we
220+ # assemble into a Starlette app ourselves.
221+ routes = create_jsonrpc_routes (request_handler , rpc_url = "/" )
222+ # Serve the current well-known path (/.well-known/agent-card.json) plus the
223+ # legacy /.well-known/agent.json path for backward compatibility.
224+ routes += create_agent_card_routes (agent_card )
225+ routes += create_agent_card_routes (agent_card , card_url = "/.well-known/agent.json" )
226+
227+ app = Starlette (routes = routes )
238228
239229 uvicorn .run (app , host = "0.0.0.0" , port = settings .SERVICE_PORT )
0 commit comments