Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions sdk/python/agentfield/agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 = {
Expand Down
4 changes: 4 additions & 0 deletions sdk/python/agentfield/agent_field_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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:
Expand Down
24 changes: 18 additions & 6 deletions sdk/python/agentfield/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -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": {
Expand All @@ -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,
},
}

Expand Down Expand Up @@ -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,
Expand All @@ -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,
},
}

Expand Down
2 changes: 2 additions & 0 deletions sdk/python/agentfield/connection_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
11 changes: 11 additions & 0 deletions sdk/python/tests/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
{
Expand All @@ -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}
Expand All @@ -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,
Expand All @@ -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(
Expand Down Expand Up @@ -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
Expand Down