Skip to content

Commit fa0d66d

Browse files
Merge pull request #367 from cnoe-io/support-any-remote-agent
feat: allow supervisor agent to work with any remote agent
2 parents e341bbd + 316b3d4 commit fa0d66d

File tree

9 files changed

+198
-364
lines changed

9 files changed

+198
-364
lines changed

ai_platform_engineering/multi_agents/__init__.py

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,3 @@
77
This module provides the main entry point for the multi-agent system,
88
including the AgentRegistry and related functionality.
99
"""
10-
11-
from .agent_registry import AgentRegistry
12-
13-
# Create a convenience function for backward compatibility
14-
def get_enabled_agents(validate_imports: bool = True):
15-
"""Convenience function to get enabled agents using AgentRegistry.get_enabled_agents()"""
16-
return AgentRegistry.get_enabled_agents(validate_imports=validate_imports)
17-
18-
# Re-export for backward compatibility
19-
__all__ = [
20-
"AgentRegistry",
21-
"get_enabled_agents",
22-
]

ai_platform_engineering/multi_agents/agent_registry.py

Lines changed: 173 additions & 291 deletions
Large diffs are not rendered by default.

ai_platform_engineering/multi_agents/incident_engineer/__init__.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import os
77
import logging
88

9-
from ai_platform_engineering.multi_agents import AgentRegistry
9+
from ai_platform_engineering.multi_agents.agent_registry import AgentRegistry
1010

1111

1212
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
@@ -37,10 +37,5 @@
3737
if WEBEX_AGENT_ENABLED:
3838
AGENT_NAMES.append("webex")
3939

40-
class IncidentRegistry(AgentRegistry):
41-
"""Registry for incident engineer multi-agent system."""
42-
43-
AGENT_NAMES = AGENT_NAMES
44-
45-
# Create the incident registry instance
46-
incident_registry = IncidentRegistry()
40+
# Create the incident registry instance with custom agent list
41+
incident_registry = AgentRegistry()

ai_platform_engineering/multi_agents/platform_engineer/__init__.py

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,14 @@
2121
# =====================================================
2222

2323
# Import after tracing is properly configured
24-
from ai_platform_engineering.multi_agents import AgentRegistry # noqa: E402
24+
from ai_platform_engineering.multi_agents.agent_registry import AgentRegistry # noqa: E402
2525

2626
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
2727
logger = logging.getLogger(__name__)
2828

29-
# Get enabled agents using the class method
30-
AGENT_NAMES = AgentRegistry.get_enabled_agents()
29+
# Create the platform registry instance - it will automatically get enabled agents from env
30+
platform_registry = AgentRegistry()
3131

32-
for agent_name in AGENT_NAMES:
32+
# Log enabled agents
33+
for agent_name in platform_registry.AGENT_NAMES:
3334
logger.info("🤖 Agent enabled: %s", agent_name)
34-
35-
class PlatformRegistry(AgentRegistry):
36-
"""Registry for platform engineer multi-agent system."""
37-
AGENT_NAMES = AGENT_NAMES
38-
39-
# Create the platform registry instance
40-
platform_registry = PlatformRegistry()

ai_platform_engineering/multi_agents/platform_engineer/deep_agent.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
from ai_platform_engineering.multi_agents.platform_engineer import platform_registry
1515

16-
from ai_platform_engineering.multi_agents.platform_engineer.prompts import system_prompt, generate_subagents
16+
from ai_platform_engineering.multi_agents.platform_engineer.prompts import system_prompt, subagents
1717
from deepagents import async_create_deep_agent
1818

1919
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
@@ -96,8 +96,6 @@ def _build_graph(self) -> None:
9696

9797
all_agents = platform_registry.get_all_agents()
9898

99-
subagents = generate_subagents()
100-
10199
logger.info(f'sub_agents: {subagents}')
102100

103101
# Create the Deep Agent

ai_platform_engineering/multi_agents/platform_engineer/prompts.py

Lines changed: 10 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,16 @@ def load_prompt_config(path="prompt_config.yaml"):
4747
agent_skill_examples.extend(agent_examples_from_config.get("general"))
4848

4949
# Include sub-agent examples from config ONLY IF the sub-agent is enabled
50-
for agent_name, agent in agents.items():
51-
if agent is not None:
50+
for agent_name, agent_card in agents.items():
51+
if agent_card is not None:
5252
try:
5353
agent_eg = agent_examples_from_config.get(agent_name)
5454
if agent_eg:
55-
logger.info("Agent examples config found for agent:", agent_name)
55+
logger.info("Agent examples config found for agent: %s", agent_name)
5656
agent_skill_examples.extend(agent_eg)
5757
else: # If no examples are provided in the config, use the agent's own examples
58-
logger.info("Agent examples config not found for agent:", agent_name)
59-
agent_skill_examples.extend(agent.get_skill_examples())
58+
logger.info("Agent examples config not found for agent: %s", agent_name)
59+
agent_skill_examples.extend(platform_registry.get_agent_examples(agent_name))
6060
except Exception as e:
6161
logger.warning(f"Error getting skill examples from agent: {e}")
6262
continue
@@ -69,46 +69,26 @@ def load_prompt_config(path="prompt_config.yaml"):
6969
)
7070
)
7171

72-
def generate_subagents():
73-
"""
74-
Build DeepAgents-compatible subagent definitions (without tools) from the platform registry.
75-
Each subagent contains: name, description, and prompt.
76-
The 'tools' field is intentionally omitted so DeepAgents can populate access later.
77-
"""
78-
subagents = []
79-
for agent_key, agent in agents.items():
80-
# Prefer system_prompt override from prompt config; fallback to agent description
81-
system_prompt_override = agent_prompts.get(agent_key, {}).get("system_prompt")
82-
description = getattr(agent.agent_card(), "description", agent_key)
83-
prompt = system_prompt_override or description
84-
sub_agent = {
85-
"name": agent_key,
86-
"description": description,
87-
"prompt": prompt
88-
# "tool": agent
89-
}
90-
logger.info(f'sub_agent: {sub_agent}')
91-
subagents.append(sub_agent)
92-
return subagents
72+
subagents = platform_registry.generate_subagents(agent_prompts)
9373

9474
# Generate system prompt dynamically based on tools and their tasks
9575
def generate_system_prompt(agents: Dict[str, Any]):
9676
tool_instructions = []
97-
for agent_key, agent in agents.items():
77+
for agent_key, agent_card in agents.items():
9878

9979
logger.info(f"Generating tool instruction for agent_key: {agent_key}")
10080

10181
# Check if agent and agent_card are available
102-
if agent is None:
82+
if agent_card is None:
10383
logger.warning(f"Agent {agent_key} is None, skipping...")
10484
continue
10585

10686
try:
107-
agent_card = agent.agent_card()
10887
if agent_card is None:
10988
logger.warning(f"Agent {agent_key} has no agent card, skipping...")
11089
continue
111-
description = agent_card.description
90+
print(f"agent_card 1: {agent_card}")
91+
description = agent_card['description']
11292
except AttributeError as e:
11393
logger.warning(f"Agent {agent_key} does not have agent_card method or description: {e}, skipping...")
11494
continue

ai_platform_engineering/multi_agents/platform_engineer/protocol_bindings/a2a/main.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,13 @@
2929
agent_description,
3030
agent_skill_examples
3131
)
32-
from ai_platform_engineering.multi_agents import AgentRegistry
32+
from ai_platform_engineering.multi_agents.platform_engineer import platform_registry
3333

3434
def get_agent_card(host: str, port: int, external_url: str = None):
3535
capabilities = AgentCapabilities(streaming=True, pushNotifications=True)
3636

3737
# Get enabled agents and add 'devops' as a base tag
38-
tags = AgentRegistry.get_enabled_agents()
38+
tags = platform_registry.AGENT_NAMES # this is just a list of agent names
3939

4040
skill = AgentSkill(
4141
id='ai_platform_engineer',

ai_platform_engineering/multi_agents/tests/test_agent_registry.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -446,21 +446,21 @@ def tearDown(self):
446446

447447
def test_convenience_function_exists(self):
448448
"""Test that get_enabled_agents convenience function exists."""
449-
from ai_platform_engineering.multi_agents import get_enabled_agents
450-
self.assertIsNotNone(get_enabled_agents)
449+
from ai_platform_engineering.multi_agents.agent_registry import AgentRegistry
450+
self.assertIsNotNone(AgentRegistry.get_enabled_agents)
451451
print("✓ Convenience function exists")
452452

453453
def test_convenience_function_works(self):
454454
"""Test that convenience function works correctly."""
455-
from ai_platform_engineering.multi_agents import get_enabled_agents
455+
from ai_platform_engineering.multi_agents.agent_registry import AgentRegistry
456456

457457
# Clear all
458458
for key in list(os.environ.keys()):
459459
if key.startswith('ENABLE_'):
460460
del os.environ[key]
461461

462462
os.environ['ENABLE_GITHUB'] = 'true'
463-
enabled = get_enabled_agents()
463+
enabled = AgentRegistry.get_enabled_agents()
464464

465465
self.assertIn('github', enabled)
466466
print("✓ Convenience function works correctly")

ai_platform_engineering/utils/__init__.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,5 @@
77
This package contains common utility functions shared across the AI Platform Engineering codebase.
88
"""
99

10-
# Note: get_enabled_agents has been moved to multi_agents.agent_registry
11-
# for better organization and integration with the AgentRegistry class.
1210

1311
__all__ = []

0 commit comments

Comments
 (0)