Skip to content

Commit 3eccd4b

Browse files
committed
Upgrade git_issue_agent dependencies
Signed-off-by: Ed Snible <snible@us.ibm.com>
1 parent bac1b4a commit 3eccd4b

3 files changed

Lines changed: 99 additions & 38 deletions

File tree

a2a/git_issue_agent/a2a_agent.py

Lines changed: 23 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,22 @@
1313

1414

1515
from a2a.server.agent_execution import AgentExecutor, RequestContext
16-
from a2a.server.apps import A2AStarletteApplication
1716
from a2a.server.events.event_queue import EventQueue
1817
from a2a.server.request_handlers import DefaultRequestHandler
18+
from a2a.server.routes import create_agent_card_routes, create_jsonrpc_routes
1919
from a2a.server.tasks import InMemoryTaskStore, TaskUpdater
20+
from a2a.helpers import new_task_from_user_message, new_text_part
2021
from 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

3333
from git_issue_agent.config import settings, Settings
3434
from 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)

a2a/git_issue_agent/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ requires-python = ">=3.11,<3.13"
55
description = "Git issue Agent module"
66
dependencies = [
77
"python-dotenv>=1.2.2",
8-
"a2a-sdk>=0.2.16",
8+
"a2a-sdk>=1.1.0,<2",
99
# We use 1.6.1 instead of the latest because
1010
# crewai requires openai>=2.30.0
1111
# but litellm requires openai==2.24.0

a2a/git_issue_agent/uv.lock

Lines changed: 75 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)