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