From e2bf4311796b7b65351b43981738b1402742ada4 Mon Sep 17 00:00:00 2001 From: Abir Abbas Date: Fri, 30 Jan 2026 09:56:40 -0500 Subject: [PATCH] fix(sdk/python): use actual version and metadata in agent registration The registration payload hardcoded version to "1.0.0" and did not include agent metadata (description, tags, author). This passes the agent's actual version and metadata through to the control plane registration endpoint. Also fixes hardcoded sdk_version in deployment tags to use the real package version from agentfield.__version__. Fixes #148 Co-Authored-By: Claude Opus 4.5 --- sdk/python/agentfield/agent.py | 17 ++++++++++++++ sdk/python/agentfield/agent_field_handler.py | 4 ++++ sdk/python/agentfield/client.py | 24 +++++++++++++++----- sdk/python/agentfield/connection_manager.py | 2 ++ sdk/python/tests/helpers.py | 11 +++++++++ 5 files changed, 52 insertions(+), 6 deletions(-) diff --git a/sdk/python/agentfield/agent.py b/sdk/python/agentfield/agent.py index 2357bd1e..461e8ea9 100644 --- a/sdk/python/agentfield/agent.py +++ b/sdk/python/agentfield/agent.py @@ -392,6 +392,9 @@ def __init__( node_id: str, agentfield_server: str = "http://localhost:8080", version: str = "1.0.0", + description: Optional[str] = None, + tags: Optional[List[str]] = None, + author: Optional[Dict[str, str]] = None, ai_config: Optional[AIConfig] = None, memory_config: Optional[MemoryConfig] = None, dev_mode: bool = False, @@ -479,6 +482,9 @@ def __init__( self.node_id = node_id self.agentfield_server = agentfield_server self.version = version + self.description = description + self.agent_tags = tags or [] + self.author = author # Memory-efficient handler registries (replaces old list-based storage) # Using Dict[str, Entry] with __slots__ dataclasses for minimal footprint @@ -1269,6 +1275,17 @@ def _should_generate_vc( return False return self._effective_component_vc_setting(component_id, overrides) + def _build_agent_metadata(self) -> Optional[Dict[str, Any]]: + """Build agent metadata (description, tags, author) for registration payload.""" + metadata: Dict[str, Any] = {} + if self.description: + metadata["description"] = self.description + if self.agent_tags: + metadata["tags"] = self.agent_tags + if self.author: + metadata["author"] = self.author + return metadata if metadata else None + def _build_vc_metadata(self) -> Dict[str, Any]: """Produce a serializable VC policy snapshot for control-plane visibility.""" effective_reasoners = { diff --git a/sdk/python/agentfield/agent_field_handler.py b/sdk/python/agentfield/agent_field_handler.py index b1fbe7b3..376552d7 100644 --- a/sdk/python/agentfield/agent_field_handler.py +++ b/sdk/python/agentfield/agent_field_handler.py @@ -129,6 +129,8 @@ async def register_with_agentfield_server(self, port: int): base_url=self.agent.base_url, discovery=discovery_payload, vc_metadata=self.agent._build_vc_metadata(), + version=self.agent.version, + agent_metadata=self.agent._build_agent_metadata(), ) if success: if payload: @@ -427,6 +429,8 @@ async def register_with_fast_lifecycle( status=AgentStatus.STARTING, discovery=discovery_payload, vc_metadata=self.agent._build_vc_metadata(), + version=self.agent.version, + agent_metadata=self.agent._build_agent_metadata(), ) if success: diff --git a/sdk/python/agentfield/client.py b/sdk/python/agentfield/client.py index 064bb43c..db7ead4c 100644 --- a/sdk/python/agentfield/client.py +++ b/sdk/python/agentfield/client.py @@ -525,14 +525,20 @@ async def register_agent( base_url: str, discovery: Optional[Dict[str, Any]] = None, vc_metadata: Optional[Dict[str, Any]] = None, + version: str = "1.0.0", + agent_metadata: Optional[Dict[str, Any]] = None, ) -> Tuple[bool, Optional[Dict[str, Any]]]: """Register or update agent information with AgentField server.""" try: + custom_metadata: Dict[str, Any] = {} + if agent_metadata: + custom_metadata.update(agent_metadata) + registration_data = { "id": node_id, "team_id": "default", "base_url": base_url, - "version": "1.0.0", + "version": version, "reasoners": reasoners, "skills": skills, "communication_config": { @@ -556,10 +562,10 @@ async def register_agent( "environment": "development", "platform": "python", "region": "local", - "tags": {"sdk_version": "1.0.0", "language": "python"}, + "tags": {"sdk_version": importlib.import_module("agentfield").__version__, "language": "python"}, }, "performance": {"latency_ms": 0, "throughput_ps": 0}, - "custom": {}, + "custom": custom_metadata, }, } @@ -1013,14 +1019,20 @@ async def register_agent_with_status( discovery: Optional[Dict[str, Any]] = None, suppress_errors: bool = False, vc_metadata: Optional[Dict[str, Any]] = None, + version: str = "1.0.0", + agent_metadata: Optional[Dict[str, Any]] = None, ) -> Tuple[bool, Optional[Dict[str, Any]]]: """Register agent with immediate status reporting for fast lifecycle.""" try: + custom_metadata: Dict[str, Any] = {} + if agent_metadata: + custom_metadata.update(agent_metadata) + registration_data = { "id": node_id, "team_id": "default", "base_url": base_url, - "version": "1.0.0", + "version": version, "reasoners": reasoners, "skills": skills, "lifecycle_status": status.value, @@ -1045,10 +1057,10 @@ async def register_agent_with_status( "environment": "development", "platform": "python", "region": "local", - "tags": {"sdk_version": "1.0.0", "language": "python"}, + "tags": {"sdk_version": importlib.import_module("agentfield").__version__, "language": "python"}, }, "performance": {"latency_ms": 0, "throughput_ps": 0}, - "custom": {}, + "custom": custom_metadata, }, } diff --git a/sdk/python/agentfield/connection_manager.py b/sdk/python/agentfield/connection_manager.py index 4c414fc6..65a063cf 100644 --- a/sdk/python/agentfield/connection_manager.py +++ b/sdk/python/agentfield/connection_manager.py @@ -141,6 +141,8 @@ async def _attempt_connection(self) -> bool: discovery=discovery_payload, suppress_errors=True, # Suppress verbose error logging for connection attempts vc_metadata=self.agent._build_vc_metadata(), + version=self.agent.version, + agent_metadata=self.agent._build_agent_metadata(), ) finally: # Restore original logging levels diff --git a/sdk/python/tests/helpers.py b/sdk/python/tests/helpers.py index d775ab37..49dd9e90 100644 --- a/sdk/python/tests/helpers.py +++ b/sdk/python/tests/helpers.py @@ -28,6 +28,8 @@ async def register_agent( base_url: str, discovery=None, vc_metadata=None, + version: str = "1.0.0", + agent_metadata=None, ) -> Tuple[bool, Optional[Dict[str, Any]]]: self.register_calls.append( { @@ -37,6 +39,8 @@ async def register_agent( "base_url": base_url, "discovery": discovery, "vc_metadata": vc_metadata, + "version": version, + "agent_metadata": agent_metadata, } ) return True, {"resolved_base_url": base_url} @@ -51,6 +55,8 @@ async def register_agent_with_status( discovery=None, suppress_errors: bool = False, vc_metadata=None, + version: str = "1.0.0", + agent_metadata=None, ) -> Tuple[bool, Optional[Dict[str, Any]]]: return await self.register_agent( node_id=node_id, @@ -59,6 +65,8 @@ async def register_agent_with_status( base_url=base_url, discovery=discovery, vc_metadata=vc_metadata, + version=version, + agent_metadata=agent_metadata, ) async def send_enhanced_heartbeat( @@ -105,6 +113,9 @@ class StubAgent: def _build_vc_metadata(self): return {"agent_default": True} + def _build_agent_metadata(self): + return None + def __post_init__(self): self._heartbeat_stop_event = threading.Event() self._heartbeat_thread = None