Skip to content

Commit 862daef

Browse files
Jaison PaulJaison Paul
authored andcommitted
fix: update a2a-sdk compatibility
update Python packages to depend on a2a-sdk >=1.0.2 and refresh uv.lock to 1.0.3 move KAgent's internal A2A model usage to the SDK v0.3 compatibility namespace add compatibility shims for removed a2a-sdk 0.3 server app helpers and google-adk imports while wiring 1.x request handlers/cards update remote A2A tool middleware handling for the a2a-sdk 1.x client interceptor API Signed-off-by: Jaison Paul <jaison.paul@capitalone.com>
1 parent f85ad95 commit 862daef

34 files changed

Lines changed: 286 additions & 85 deletions

python/packages/kagent-adk/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ dependencies = [
2929
"pydantic>=2.5.0",
3030
"typing-extensions>=4.8.0",
3131
"jsonref>=1.1.0",
32-
"a2a-sdk>=0.3.23",
32+
"a2a-sdk>=1.0.2,<2.0",
3333
# Security: pin minimum versions for CVE fixes in transitive dependencies
3434
"urllib3>=2.6.3", # CVE-2025-66418, CVE-2025-66471, CVE-2026-21441: unbounded decompression DoS
3535
"filelock>=3.20.3", # CVE-2025-68146, CVE-2026-22701: TOCTOU symlink race condition

python/packages/kagent-adk/src/kagent/adk/_a2a.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
from typing import Any, Callable, List, Optional
66

77
import httpx
8-
from a2a.server.apps import A2AFastAPIApplication
8+
from a2a.compat.v0_3.conversions import to_core_agent_card
9+
from a2a.compat.v0_3.types import AgentCard
910
from a2a.server.request_handlers import DefaultRequestHandler
1011
from a2a.server.tasks import InMemoryTaskStore
11-
from a2a.types import AgentCard
1212
from agentsts.adk import ADKSTSIntegration, ADKTokenPropagationPlugin
1313
from fastapi import FastAPI, Request
1414
from fastapi.responses import PlainTextResponse
@@ -25,6 +25,7 @@
2525
KAgentTaskStore,
2626
get_a2a_max_content_length,
2727
)
28+
from kagent.core.a2a._server_apps import A2AFastAPIApplication
2829

2930
from ._agent_executor import A2aAgentExecutor, A2aAgentExecutorConfig
3031
from ._lifespan import LifespanManager
@@ -147,6 +148,7 @@ def create_runner() -> Runner:
147148
request_handler = DefaultRequestHandler(
148149
agent_executor=agent_executor,
149150
task_store=task_store,
151+
agent_card=to_core_agent_card(self.agent_card),
150152
request_context_builder=request_context_builder,
151153
)
152154

python/packages/kagent-adk/src/kagent/adk/_agent_executor.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import annotations
22

3+
# ruff: noqa: E402
34
import asyncio
45
import inspect
56
import logging
@@ -8,9 +9,7 @@
89
from datetime import datetime, timezone
910
from typing import Any, Awaitable, Callable, Optional
1011

11-
from a2a.server.agent_execution.context import RequestContext
12-
from a2a.server.events.event_queue import EventQueue
13-
from a2a.types import (
12+
from a2a.compat.v0_3.types import (
1413
Artifact,
1514
Message,
1615
Part,
@@ -21,12 +20,23 @@
2120
TaskStatusUpdateEvent,
2221
TextPart,
2322
)
23+
from a2a.server.agent_execution.context import RequestContext
24+
from a2a.server.events.event_queue import EventQueue
25+
from kagent.core.a2a._compat import install_v03_type_aliases, restore_a2a_type_aliases
26+
27+
# google-adk imports v0.3 A2A types from a2a.types during module import.
28+
# Keep these imports below the temporary alias install, then restore the 1.x
29+
# namespace so a2a-sdk internals continue to see their native protobuf types.
30+
_a2a_type_originals = install_v03_type_aliases(overwrite=True)
31+
2432
from google.adk.a2a.executor.a2a_agent_executor import (
2533
A2aAgentExecutor as UpstreamA2aAgentExecutor,
2634
)
2735
from google.adk.a2a.executor.a2a_agent_executor import (
2836
A2aAgentExecutorConfig as UpstreamA2aAgentExecutorConfig,
2937
)
38+
39+
restore_a2a_type_aliases(_a2a_type_originals)
3040
from google.adk.events import Event, EventActions
3141
from google.adk.flows.llm_flows.functions import REQUEST_CONFIRMATION_FUNCTION_CALL_NAME
3242
from google.adk.runners import Runner

python/packages/kagent-adk/src/kagent/adk/_remote_a2a_tool.py

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,33 +11,39 @@
1111
This is a BaseToolset wrapper around KAgentRemoteA2ATool for runner cleanup purposes.
1212
"""
1313

14+
# ruff: noqa: E402
15+
1416
import logging
1517
import uuid
1618
from typing import Any, Callable, Optional, Protocol, runtime_checkable
1719
from urllib.parse import urlparse
1820

1921
import httpx
22+
from kagent.core.a2a._compat import install_v03_type_aliases
23+
24+
install_v03_type_aliases()
25+
2026
from a2a.client import Client as A2AClient
2127
from a2a.client.card_resolver import A2ACardResolver
2228
from a2a.client.client import ClientConfig as A2AClientConfig
2329
from a2a.client.client_factory import ClientFactory as A2AClientFactory
2430
from a2a.client.errors import A2AClientHTTPError
2531
from a2a.client.middleware import ClientCallContext, ClientCallInterceptor
26-
from a2a.types import (
32+
from a2a.compat.v0_3.types import (
2733
AgentCard,
2834
DataPart,
2935
Role,
3036
Task,
3137
TaskState,
3238
TextPart,
3339
)
34-
from a2a.types import (
40+
from a2a.compat.v0_3.types import (
3541
Message as A2AMessage,
3642
)
37-
from a2a.types import (
43+
from a2a.compat.v0_3.types import (
3844
Part as A2APart,
3945
)
40-
from a2a.types import (
46+
from a2a.compat.v0_3.types import (
4147
TransportProtocol as A2ATransport,
4248
)
4349
from google.adk.agents.readonly_context import ReadonlyContext
@@ -70,18 +76,23 @@ class _SubagentInterceptor(ClientCallInterceptor):
7076
headers stored in the call context state under ``_EXTRA_HEADERS_CONTEXT_KEY``.
7177
"""
7278

73-
async def intercept(self, method_name, request_payload, http_kwargs, agent_card, context):
74-
headers = dict(http_kwargs.get("headers", {}))
79+
async def before(self, args) -> None:
80+
context = args.context
81+
if context is None:
82+
return
83+
headers = dict(context.service_parameters or {})
7584
headers[_SOURCE_HEADER] = _SOURCE_SUBAGENT
7685

77-
if context:
78-
if _USER_ID_CONTEXT_KEY in context.state:
79-
headers["x-user-id"] = context.state[_USER_ID_CONTEXT_KEY]
80-
extra = context.state.get(_EXTRA_HEADERS_CONTEXT_KEY)
81-
if extra:
82-
headers.update(extra)
83-
http_kwargs["headers"] = headers
84-
return request_payload, http_kwargs
86+
if _USER_ID_CONTEXT_KEY in context.state:
87+
headers["x-user-id"] = context.state[_USER_ID_CONTEXT_KEY]
88+
extra = context.state.get(_EXTRA_HEADERS_CONTEXT_KEY)
89+
if extra:
90+
headers.update(extra)
91+
92+
context.service_parameters = headers
93+
94+
async def after(self, args) -> None:
95+
return None
8596

8697

8798
def _extract_text_from_task(task: Task) -> str:

python/packages/kagent-adk/src/kagent/adk/cli.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import typer
99
import uvicorn
10-
from a2a.types import AgentCard
10+
from a2a.compat.v0_3.types import AgentCard
1111
from agentsts.adk import ADKSTSIntegration, ADKTokenPropagationPlugin
1212
from google.adk.agents import BaseAgent
1313
from google.adk.cli.utils.agent_loader import AgentLoader

python/packages/kagent-adk/src/kagent/adk/converters/event_converter.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
from datetime import datetime, timezone
66
from typing import Any, Dict, List, Optional
77

8+
from a2a.compat.v0_3.types import DataPart, Message, Role, Task, TaskState, TaskStatus, TaskStatusUpdateEvent, TextPart
9+
from a2a.compat.v0_3.types import Part as A2APart
810
from a2a.server.events import Event as A2AEvent
9-
from a2a.types import DataPart, Message, Role, Task, TaskState, TaskStatus, TaskStatusUpdateEvent, TextPart
10-
from a2a.types import Part as A2APart
1111
from google.adk.agents.invocation_context import InvocationContext
1212
from google.adk.events.event import Event
1313
from google.adk.flows.llm_flows.functions import REQUEST_EUC_FUNCTION_CALL_NAME

python/packages/kagent-adk/src/kagent/adk/converters/part_converter.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
import logging
2424
from typing import Optional
2525

26-
from a2a import types as a2a_types
26+
from a2a.compat.v0_3 import types as a2a_types
2727
from google.genai import types as genai_types
2828
from kagent.core.a2a import (
2929
A2A_DATA_PART_METADATA_TYPE_CODE_EXECUTION_RESULT,

python/packages/kagent-adk/src/kagent/adk/types.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
1+
# ruff: noqa: E402
2+
13
import logging
24
from typing import Any, Callable, Literal, Optional, Union
35

46
import httpx
57
from agentsts.adk import ADKTokenPropagationPlugin
8+
from kagent.core.a2a._compat import install_v03_type_aliases
9+
10+
# google-adk's RemoteA2aAgent still imports the removed v0.3 model names from
11+
# a2a.types. This import-order guard keeps that transitive import working with
12+
# a2a-sdk 1.x; keep the google.adk imports below this call.
13+
install_v03_type_aliases(overwrite=True)
14+
615
from google.adk.agents import Agent
716
from google.adk.agents.callback_context import CallbackContext
817
from google.adk.agents.llm_agent import ToolUnion

python/packages/kagent-adk/tests/unittests/converters/test_event_converter.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from unittest.mock import Mock
22

33
import pytest
4-
from a2a.types import TaskState, TaskStatusUpdateEvent
4+
from a2a.compat.v0_3.types import TaskState, TaskStatusUpdateEvent
55
from google.genai import types as genai_types
66
from kagent.core.a2a import get_kagent_metadata_key
77

python/packages/kagent-adk/tests/unittests/models/test_sap_ai_core.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
_parse_orchestration_chunk,
1818
)
1919

20-
2120
# ---------------------------------------------------------------------------
2221
# Helpers
2322
# ---------------------------------------------------------------------------

0 commit comments

Comments
 (0)