From ad470da6f3317da5db5e74da5529bf76b7043e54 Mon Sep 17 00:00:00 2001 From: Syed Mohamed Hyder <67530504+SyedMohamedHyder@users.noreply.github.com> Date: Tue, 22 Jul 2025 20:08:55 +0530 Subject: [PATCH 1/4] fix: AgentCardBuilder field inconsistencies --- .../adk/a2a/utils/agent_card_builder.py | 39 +++++++++---------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/src/google/adk/a2a/utils/agent_card_builder.py b/src/google/adk/a2a/utils/agent_card_builder.py index b7294a1a3e..06e7757eba 100644 --- a/src/google/adk/a2a/utils/agent_card_builder.py +++ b/src/google/adk/a2a/utils/agent_card_builder.py @@ -59,7 +59,6 @@ def __init__( agent: BaseAgent, rpc_url: Optional[str] = None, capabilities: Optional[AgentCapabilities] = None, - doc_url: Optional[str] = None, provider: Optional[AgentProvider] = None, agent_version: Optional[str] = None, security_schemes: Optional[Dict[str, SecurityScheme]] = None, @@ -70,7 +69,6 @@ def __init__( self._agent = agent self._rpc_url = rpc_url or 'http://localhost:80/a2a' self._capabilities = capabilities or AgentCapabilities() - self._doc_url = doc_url self._provider = provider self._security_schemes = security_schemes self._agent_version = agent_version or '0.0.1' @@ -85,16 +83,15 @@ async def build(self) -> AgentCard: return AgentCard( name=self._agent.name, description=self._agent.description or 'An ADK Agent', - doc_url=self._doc_url, url=f"{self._rpc_url.rstrip('/')}", version=self._agent_version, capabilities=self._capabilities, skills=all_skills, - defaultInputModes=['text/plain'], - defaultOutputModes=['text/plain'], - supportsAuthenticatedExtendedCard=False, + default_input_modes=['text/plain'], + default_output_modes=['text/plain'], + supports_authenticated_extended_card=False, provider=self._provider, - securitySchemes=self._security_schemes, + security_schemes=self._security_schemes, ) except Exception as e: raise RuntimeError( @@ -125,8 +122,8 @@ async def _build_llm_agent_skills(agent: LlmAgent) -> List[AgentSkill]: name='model', description=agent_description, examples=agent_examples, - inputModes=_get_input_modes(agent), - outputModes=_get_output_modes(agent), + input_modes=_get_input_modes(agent), + output_modes=_get_output_modes(agent), tags=['llm'], ) ) @@ -160,8 +157,8 @@ async def _build_sub_agent_skills(agent: BaseAgent) -> List[AgentSkill]: name=f'{sub_agent.name}: {skill.name}', description=skill.description, examples=skill.examples, - inputModes=skill.inputModes, - outputModes=skill.outputModes, + input_modes=skill.input_modes, + output_modes=skill.output_modes, tags=[f'sub_agent:{sub_agent.name}'] + (skill.tags or []), ) sub_agent_skills.append(aggregated_skill) @@ -197,8 +194,8 @@ async def _build_tool_skills(agent: LlmAgent) -> List[AgentSkill]: name=tool_name, description=getattr(tool, 'description', f'Tool: {tool_name}'), examples=None, - inputModes=None, - outputModes=None, + input_modes=None, + output_modes=None, tags=['llm', 'tools'], ) ) @@ -213,8 +210,8 @@ def _build_planner_skill(agent: LlmAgent) -> AgentSkill: name='planning', description='Can think about the tasks to do and make plans', examples=None, - inputModes=None, - outputModes=None, + input_modes=None, + output_modes=None, tags=['llm', 'planning'], ) @@ -226,8 +223,8 @@ def _build_code_executor_skill(agent: LlmAgent) -> AgentSkill: name='code-execution', description='Can execute codes', examples=None, - inputModes=None, - outputModes=None, + input_modes=None, + output_modes=None, tags=['llm', 'code_execution'], ) @@ -250,8 +247,8 @@ async def _build_non_llm_agent_skills(agent: BaseAgent) -> List[AgentSkill]: name=agent_name, description=agent_description, examples=agent_examples, - inputModes=_get_input_modes(agent), - outputModes=_get_output_modes(agent), + input_modes=_get_input_modes(agent), + output_modes=_get_output_modes(agent), tags=[agent_type], ) ) @@ -282,8 +279,8 @@ def _build_orchestration_skill( name='sub-agents', description='Orchestrates: ' + '; '.join(sub_agent_descriptions), examples=None, - inputModes=None, - outputModes=None, + input_modes=None, + output_modes=None, tags=[agent_type, 'orchestration'], ) From 257645343bc1e8ce55e8854ec9bafdf4873e22d9 Mon Sep 17 00:00:00 2001 From: Syed Mohamed Hyder <67530504+SyedMohamedHyder@users.noreply.github.com> Date: Tue, 22 Jul 2025 20:09:58 +0530 Subject: [PATCH 2/4] fix: UTCs of AgentCardBuilder --- .../a2a/utils/test_agent_card_builder.py | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/tests/unittests/a2a/utils/test_agent_card_builder.py b/tests/unittests/a2a/utils/test_agent_card_builder.py index cbe525499a..80406c6016 100644 --- a/tests/unittests/a2a/utils/test_agent_card_builder.py +++ b/tests/unittests/a2a/utils/test_agent_card_builder.py @@ -107,7 +107,6 @@ def test_init_with_valid_agent(self): assert builder._agent == mock_agent assert builder._rpc_url == "http://localhost:80/a2a" assert isinstance(builder._capabilities, AgentCapabilities) - assert builder._doc_url is None assert builder._provider is None assert builder._security_schemes is None assert builder._agent_version == "0.0.1" @@ -126,7 +125,6 @@ def test_init_with_custom_parameters(self): agent=mock_agent, rpc_url="https://example.com/a2a", capabilities=mock_capabilities, - doc_url="https://docs.example.com", provider=mock_provider, agent_version="1.2.3", security_schemes=mock_security_schemes, @@ -136,7 +134,6 @@ def test_init_with_custom_parameters(self): assert builder._agent == mock_agent assert builder._rpc_url == "https://example.com/a2a" assert builder._capabilities == mock_capabilities - assert builder._doc_url == "https://docs.example.com" assert builder._provider == mock_provider assert builder._security_schemes == mock_security_schemes assert builder._agent_version == "1.2.3" @@ -181,15 +178,14 @@ async def test_build_success( assert isinstance(result, AgentCard) assert result.name == "test_agent" assert result.description == "Test agent description" - assert result.documentationUrl is None assert result.url == "http://localhost:80/a2a" assert result.version == "0.0.1" assert result.skills == [mock_primary_skill, mock_sub_skill] - assert result.defaultInputModes == ["text/plain"] - assert result.defaultOutputModes == ["text/plain"] - assert result.supportsAuthenticatedExtendedCard is False + assert result.default_input_modes == ["text/plain"] + assert result.default_output_modes == ["text/plain"] + assert result.supports_authenticated_extended_card is False assert result.provider is None - assert result.securitySchemes is None + assert result.security_schemes is None @patch("google.adk.a2a.utils.agent_card_builder._build_primary_skills") @patch("google.adk.a2a.utils.agent_card_builder._build_sub_agent_skills") @@ -213,7 +209,6 @@ async def test_build_with_custom_parameters( builder = AgentCardBuilder( agent=mock_agent, rpc_url="https://example.com/a2a/", - doc_url="https://docs.example.com", provider=mock_provider, agent_version="2.0.0", security_schemes=mock_security_schemes, @@ -225,15 +220,12 @@ async def test_build_with_custom_parameters( # Assert assert result.name == "test_agent" assert result.description == "An ADK Agent" # Default description - # The source code uses doc_url parameter but AgentCard expects documentationUrl - # Since the source code doesn't map doc_url to documentationUrl, it will be None - assert result.documentationUrl is None assert ( result.url == "https://example.com/a2a" ) # Should strip trailing slash assert result.version == "2.0.0" assert result.provider == mock_provider - assert result.securitySchemes == mock_security_schemes + assert result.security_schemes == mock_security_schemes @patch("google.adk.a2a.utils.agent_card_builder._build_primary_skills") @patch("google.adk.a2a.utils.agent_card_builder._build_sub_agent_skills") From c0da47b1b2757fbbcd32503af5a66cb0543afaec Mon Sep 17 00:00:00 2001 From: SyedMohamedHyder Date: Sat, 26 Jul 2025 11:56:35 +0530 Subject: [PATCH 3/4] Corrected documentation_url --- src/google/adk/a2a/utils/agent_card_builder.py | 3 +++ tests/unittests/a2a/utils/test_agent_card_builder.py | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/src/google/adk/a2a/utils/agent_card_builder.py b/src/google/adk/a2a/utils/agent_card_builder.py index 06e7757eba..16d5abfc61 100644 --- a/src/google/adk/a2a/utils/agent_card_builder.py +++ b/src/google/adk/a2a/utils/agent_card_builder.py @@ -59,6 +59,7 @@ def __init__( agent: BaseAgent, rpc_url: Optional[str] = None, capabilities: Optional[AgentCapabilities] = None, + documentation_url: Optional[str] = None, provider: Optional[AgentProvider] = None, agent_version: Optional[str] = None, security_schemes: Optional[Dict[str, SecurityScheme]] = None, @@ -69,6 +70,7 @@ def __init__( self._agent = agent self._rpc_url = rpc_url or 'http://localhost:80/a2a' self._capabilities = capabilities or AgentCapabilities() + self._documentation_url = documentation_url or "" self._provider = provider self._security_schemes = security_schemes self._agent_version = agent_version or '0.0.1' @@ -86,6 +88,7 @@ async def build(self) -> AgentCard: url=f"{self._rpc_url.rstrip('/')}", version=self._agent_version, capabilities=self._capabilities, + documentation_url=self._documentation_url, skills=all_skills, default_input_modes=['text/plain'], default_output_modes=['text/plain'], diff --git a/tests/unittests/a2a/utils/test_agent_card_builder.py b/tests/unittests/a2a/utils/test_agent_card_builder.py index 80406c6016..859c9f39ed 100644 --- a/tests/unittests/a2a/utils/test_agent_card_builder.py +++ b/tests/unittests/a2a/utils/test_agent_card_builder.py @@ -107,6 +107,7 @@ def test_init_with_valid_agent(self): assert builder._agent == mock_agent assert builder._rpc_url == "http://localhost:80/a2a" assert isinstance(builder._capabilities, AgentCapabilities) + assert builder._documentation_url == "" assert builder._provider is None assert builder._security_schemes is None assert builder._agent_version == "0.0.1" @@ -125,6 +126,7 @@ def test_init_with_custom_parameters(self): agent=mock_agent, rpc_url="https://example.com/a2a", capabilities=mock_capabilities, + documentation_url="https://docs.example.com", provider=mock_provider, agent_version="1.2.3", security_schemes=mock_security_schemes, @@ -134,6 +136,7 @@ def test_init_with_custom_parameters(self): assert builder._agent == mock_agent assert builder._rpc_url == "https://example.com/a2a" assert builder._capabilities == mock_capabilities + assert builder._documentation_url == "https://docs.example.com" assert builder._provider == mock_provider assert builder._security_schemes == mock_security_schemes assert builder._agent_version == "1.2.3" @@ -210,6 +213,7 @@ async def test_build_with_custom_parameters( agent=mock_agent, rpc_url="https://example.com/a2a/", provider=mock_provider, + documentation_url="https://docs.example.com", agent_version="2.0.0", security_schemes=mock_security_schemes, ) @@ -223,6 +227,7 @@ async def test_build_with_custom_parameters( assert ( result.url == "https://example.com/a2a" ) # Should strip trailing slash + assert result.documentation_url == "https://docs.example.com" assert result.version == "2.0.0" assert result.provider == mock_provider assert result.security_schemes == mock_security_schemes From a03e15dfcdf792c1fc5c4b8334124b5f84b7c6f0 Mon Sep 17 00:00:00 2001 From: SyedMohamedHyder Date: Sat, 26 Jul 2025 12:02:23 +0530 Subject: [PATCH 4/4] Fix UTCs --- tests/unittests/a2a/utils/test_agent_card_builder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unittests/a2a/utils/test_agent_card_builder.py b/tests/unittests/a2a/utils/test_agent_card_builder.py index f4fa5727d9..f8d918f99b 100644 --- a/tests/unittests/a2a/utils/test_agent_card_builder.py +++ b/tests/unittests/a2a/utils/test_agent_card_builder.py @@ -181,7 +181,7 @@ async def test_build_success( assert isinstance(result, AgentCard) assert result.name == "test_agent" assert result.description == "Test agent description" - assert result.documentation_url is None + assert result.documentation_url == "" assert result.url == "http://localhost:80/a2a" assert result.version == "0.0.1" assert result.skills == [mock_primary_skill, mock_sub_skill]