suna/backend/agent/config_helper.py

269 lines
10 KiB
Python

from typing import Dict, Any, Optional, List
from utils.logger import logger
def extract_agent_config(agent_data: Dict[str, Any], version_data: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
agent_id = agent_data.get('agent_id', 'Unknown')
agent_has_config = bool(agent_data.get('config') and agent_data['config'] != {})
version_has_config = bool(version_data and version_data.get('config') and version_data['config'] != {})
metadata = agent_data.get('metadata', {})
is_suna_default = metadata.get('is_suna_default', False)
centrally_managed = metadata.get('centrally_managed', False)
restrictions = metadata.get('restrictions', {})
if version_data and ('configured_mcps' in version_data or 'custom_mcps' in version_data or 'system_prompt' in version_data):
logger.info(f"Using version data from version manager for agent {agent_id}")
if is_suna_default:
from agent.suna.config import SunaConfig
system_prompt = SunaConfig.get_system_prompt()
agentpress_tools = SunaConfig.DEFAULT_TOOLS
else:
system_prompt = version_data.get('system_prompt', '')
agentpress_tools = version_data.get('agentpress_tools', {})
config = {
'agent_id': agent_data['agent_id'],
'name': agent_data['name'],
'description': agent_data.get('description'),
'is_default': agent_data.get('is_default', False),
'account_id': agent_data.get('account_id'),
'current_version_id': agent_data.get('current_version_id'),
'version_name': version_data.get('version_name', 'v1'),
'system_prompt': system_prompt,
'configured_mcps': version_data.get('configured_mcps', []),
'custom_mcps': version_data.get('custom_mcps', []),
'agentpress_tools': agentpress_tools,
'avatar': agent_data.get('avatar'),
'avatar_color': agent_data.get('avatar_color'),
'tools': {
'agentpress': agentpress_tools,
'mcp': version_data.get('configured_mcps', []),
'custom_mcp': version_data.get('custom_mcps', [])
},
'metadata': {
'avatar': agent_data.get('avatar'),
'avatar_color': agent_data.get('avatar_color')
},
'is_suna_default': is_suna_default,
'centrally_managed': centrally_managed,
'restrictions': restrictions
}
return config
if version_data and version_data.get('config') and version_data['config'] != {}:
config = version_data['config'].copy()
config['agent_id'] = agent_data['agent_id']
config['name'] = agent_data['name']
config['description'] = agent_data.get('description')
config['is_default'] = agent_data.get('is_default', False)
config['account_id'] = agent_data.get('account_id')
config['current_version_id'] = agent_data.get('current_version_id')
config['version_name'] = version_data.get('version_name', 'v1')
if is_suna_default:
from agent.suna.config import SunaConfig
config['system_prompt'] = SunaConfig.get_system_prompt()
config['tools']['agentpress'] = SunaConfig.DEFAULT_TOOLS
metadata = config.get('metadata', {})
config['avatar'] = metadata.get('avatar', agent_data.get('avatar'))
config['avatar_color'] = metadata.get('avatar_color', agent_data.get('avatar_color'))
config['agentpress_tools'] = extract_tools_for_agent_run(config)
config['configured_mcps'] = config.get('tools', {}).get('mcp', [])
config['custom_mcps'] = config.get('tools', {}).get('custom_mcp', [])
config['is_suna_default'] = is_suna_default
config['centrally_managed'] = centrally_managed
config['restrictions'] = restrictions
return config
if agent_data.get('config') and agent_data['config'] != {}:
config = agent_data['config'].copy()
if 'tools' not in config:
config['tools'] = {
'agentpress': {},
'mcp': [],
'custom_mcp': []
}
if 'metadata' not in config:
config['metadata'] = {}
config['agent_id'] = agent_data['agent_id']
config['name'] = agent_data['name']
config['description'] = agent_data.get('description')
config['is_default'] = agent_data.get('is_default', False)
config['account_id'] = agent_data.get('account_id')
config['current_version_id'] = agent_data.get('current_version_id')
metadata = config.get('metadata', {})
config['avatar'] = metadata.get('avatar')
config['avatar_color'] = metadata.get('avatar_color')
config['agentpress_tools'] = extract_tools_for_agent_run(config)
config['configured_mcps'] = config.get('tools', {}).get('mcp', [])
config['custom_mcps'] = config.get('tools', {}).get('custom_mcp', [])
config['is_suna_default'] = is_suna_default
config['centrally_managed'] = centrally_managed
config['restrictions'] = restrictions
return config
source_data = version_data if version_data else agent_data
if is_suna_default:
from agent.suna.config import SunaConfig
system_prompt = SunaConfig.get_system_prompt()
legacy_tools = SunaConfig.DEFAULT_TOOLS
else:
system_prompt = source_data.get('system_prompt', '')
legacy_tools = source_data.get('agentpress_tools', {})
simplified_tools = {}
for tool_name, tool_config in legacy_tools.items():
if isinstance(tool_config, dict):
simplified_tools[tool_name] = tool_config.get('enabled', False)
elif isinstance(tool_config, bool):
simplified_tools[tool_name] = tool_config
config = {
'agent_id': agent_data['agent_id'],
'name': agent_data['name'],
'description': agent_data.get('description'),
'system_prompt': system_prompt,
'tools': {
'agentpress': simplified_tools,
'mcp': source_data.get('configured_mcps', []),
'custom_mcp': source_data.get('custom_mcps', [])
},
'metadata': {
'avatar': agent_data.get('avatar'),
'avatar_color': agent_data.get('avatar_color')
},
'is_default': agent_data.get('is_default', False),
'account_id': agent_data.get('account_id'),
'current_version_id': agent_data.get('current_version_id'),
'avatar': agent_data.get('avatar'),
'avatar_color': agent_data.get('avatar_color'),
'is_suna_default': is_suna_default,
'centrally_managed': centrally_managed,
'restrictions': restrictions
}
if version_data:
config['version_name'] = version_data.get('version_name', 'v1')
config['configured_mcps'] = source_data.get('configured_mcps', [])
config['custom_mcps'] = source_data.get('custom_mcps', [])
config['agentpress_tools'] = legacy_tools
return config
def build_unified_config(
system_prompt: str,
agentpress_tools: Dict[str, Any],
configured_mcps: List[Dict[str, Any]],
custom_mcps: Optional[List[Dict[str, Any]]] = None,
avatar: Optional[str] = None,
avatar_color: Optional[str] = None,
suna_metadata: Optional[Dict[str, Any]] = None
) -> Dict[str, Any]:
simplified_tools = {}
for tool_name, tool_config in agentpress_tools.items():
if isinstance(tool_config, dict):
simplified_tools[tool_name] = tool_config.get('enabled', False)
elif isinstance(tool_config, bool):
simplified_tools[tool_name] = tool_config
config = {
'system_prompt': system_prompt,
'tools': {
'agentpress': simplified_tools,
'mcp': configured_mcps or [],
'custom_mcp': custom_mcps or []
},
'metadata': {
'avatar': avatar,
'avatar_color': avatar_color
}
}
if suna_metadata:
config['suna_metadata'] = suna_metadata
return config
def extract_tools_for_agent_run(config: Dict[str, Any]) -> Dict[str, Any]:
tools = config.get('tools', {})
agentpress = tools.get('agentpress', {})
legacy_format = {}
for tool_name, enabled in agentpress.items():
if isinstance(enabled, bool):
legacy_format[tool_name] = {
'enabled': enabled,
'description': ''
}
elif isinstance(enabled, dict):
legacy_format[tool_name] = enabled
return legacy_format
def get_mcp_configs(config: Dict[str, Any]) -> List[Dict[str, Any]]:
tools = config.get('tools', {})
all_mcps = []
if 'configured_mcps' in config and config['configured_mcps']:
for mcp in config['configured_mcps']:
if mcp not in all_mcps:
all_mcps.append(mcp)
if 'custom_mcps' in config and config['custom_mcps']:
for mcp in config['custom_mcps']:
if mcp not in all_mcps:
all_mcps.append(mcp)
mcp_list = tools.get('mcp', [])
if mcp_list:
for mcp in mcp_list:
if mcp not in all_mcps:
all_mcps.append(mcp)
custom_mcp_list = tools.get('custom_mcp', [])
if custom_mcp_list:
for mcp in custom_mcp_list:
if mcp not in all_mcps:
all_mcps.append(mcp)
return all_mcps
def is_suna_default_agent(config: Dict[str, Any]) -> bool:
return config.get('is_suna_default', False)
def get_agent_restrictions(config: Dict[str, Any]) -> Dict[str, bool]:
return config.get('restrictions', {})
def can_edit_field(config: Dict[str, Any], field_name: str) -> bool:
if not is_suna_default_agent(config):
return True
restrictions = get_agent_restrictions(config)
return restrictions.get(field_name, True)
def get_default_system_prompt_for_suna_agent() -> str:
from agent.suna.config import SunaConfig
return SunaConfig.get_system_prompt()