diff --git a/backend/agent/api.py b/backend/agent/api.py index 3cd1bbb9..4c7f3164 100644 --- a/backend/agent/api.py +++ b/backend/agent/api.py @@ -71,16 +71,17 @@ class MessageCreateRequest(BaseModel): class AgentCreateRequest(BaseModel): name: str description: Optional[str] = None - system_prompt: Optional[str] = None # Make optional to allow defaulting to Suna's system prompt + system_prompt: Optional[str] = None configured_mcps: Optional[List[Dict[str, Any]]] = [] custom_mcps: Optional[List[Dict[str, Any]]] = [] agentpress_tools: Optional[Dict[str, Any]] = {} is_default: Optional[bool] = False - # Deprecated, kept for backward-compat avatar: Optional[str] = None avatar_color: Optional[str] = None - # New profile image url (can be external or Supabase storage URL) profile_image_url: Optional[str] = None + icon_name: Optional[str] = None + icon_color: Optional[str] = None + icon_background: Optional[str] = None class AgentVersionResponse(BaseModel): version_id: str @@ -88,7 +89,7 @@ class AgentVersionResponse(BaseModel): version_number: int version_name: str system_prompt: str - model: Optional[str] = None # Add model field + model: Optional[str] = None configured_mcps: List[Dict[str, Any]] custom_mcps: List[Dict[str, Any]] agentpress_tools: Dict[str, Any] @@ -102,8 +103,8 @@ class AgentVersionCreateRequest(BaseModel): configured_mcps: Optional[List[Dict[str, Any]]] = [] custom_mcps: Optional[List[Dict[str, Any]]] = [] agentpress_tools: Optional[Dict[str, Any]] = {} - version_name: Optional[str] = None # Custom version name - description: Optional[str] = None # Version description + version_name: Optional[str] = None + description: Optional[str] = None class AgentUpdateRequest(BaseModel): name: Optional[str] = None @@ -113,12 +114,9 @@ class AgentUpdateRequest(BaseModel): custom_mcps: Optional[List[Dict[str, Any]]] = None agentpress_tools: Optional[Dict[str, Any]] = None is_default: Optional[bool] = None - # Deprecated, kept for backward-compat avatar: Optional[str] = None avatar_color: Optional[str] = None - # New profile image url (backward compatibility) profile_image_url: Optional[str] = None - # New icon system fields icon_name: Optional[str] = None icon_color: Optional[str] = None icon_background: Optional[str] = None @@ -132,19 +130,15 @@ class AgentResponse(BaseModel): custom_mcps: List[Dict[str, Any]] agentpress_tools: Dict[str, Any] is_default: bool - # Deprecated avatar: Optional[str] = None avatar_color: Optional[str] = None - # New profile_image_url: Optional[str] = None - # Icon system fields icon_name: Optional[str] = None icon_color: Optional[str] = None icon_background: Optional[str] = None created_at: str updated_at: Optional[str] = None is_public: Optional[bool] = False - tags: Optional[List[str]] = [] current_version_id: Optional[str] = None version_count: Optional[int] = 1 @@ -163,7 +157,7 @@ class AgentsResponse(BaseModel): class ThreadAgentResponse(BaseModel): agent: Optional[AgentResponse] - source: str # "thread", "default", "none", "missing" + source: str message: str class AgentExportData(BaseModel): @@ -1566,9 +1560,9 @@ async def get_agents( avatar=agent_config.get('avatar'), avatar_color=agent_config.get('avatar_color'), profile_image_url=agent_config.get('profile_image_url'), - icon_name=agent.get('icon_name'), - icon_color=agent.get('icon_color'), - icon_background=agent.get('icon_background'), + icon_name=agent_config.get('icon_name'), + icon_color=agent_config.get('icon_color'), + icon_background=agent_config.get('icon_background'), created_at=agent['created_at'], updated_at=agent['updated_at'], current_version_id=agent.get('current_version_id'), @@ -1694,9 +1688,9 @@ async def get_agent(agent_id: str, user_id: str = Depends(get_current_user_id_fr avatar=agent_config.get('avatar'), avatar_color=agent_config.get('avatar_color'), profile_image_url=agent_config.get('profile_image_url'), - icon_name=agent_data.get('icon_name'), - icon_color=agent_data.get('icon_color'), - icon_background=agent_data.get('icon_background'), + icon_name=agent_config.get('icon_name'), + icon_color=agent_config.get('icon_color'), + icon_background=agent_config.get('icon_background'), created_at=agent_data['created_at'], updated_at=agent_data.get('updated_at', agent_data['created_at']), current_version_id=agent_data.get('current_version_id'), @@ -2405,9 +2399,9 @@ async def update_agent( avatar=agent_config.get('avatar'), avatar_color=agent_config.get('avatar_color'), profile_image_url=agent_config.get('profile_image_url'), - icon_name=agent.get('icon_name'), - icon_color=agent.get('icon_color'), - icon_background=agent.get('icon_background'), + icon_name=agent_config.get('icon_name'), + icon_color=agent_config.get('icon_color'), + icon_background=agent_config.get('icon_background'), created_at=agent['created_at'], updated_at=agent.get('updated_at', agent['created_at']), current_version_id=agent.get('current_version_id'), diff --git a/backend/agent/config_helper.py b/backend/agent/config_helper.py index c1127529..973f4a1a 100644 --- a/backend/agent/config_helper.py +++ b/backend/agent/config_helper.py @@ -49,9 +49,7 @@ def _extract_suna_agent_config(agent_data: Dict[str, Any], version_data: Optiona } } - # Add user customizations from version or agent data if version_data: - # Get customizations from version data if version_data.get('config'): version_config = version_data['config'] tools = version_config.get('tools', {}) @@ -60,13 +58,11 @@ def _extract_suna_agent_config(agent_data: Dict[str, Any], version_data: Optiona config['workflows'] = version_config.get('workflows', []) config['triggers'] = version_config.get('triggers', []) else: - # Legacy version format config['configured_mcps'] = version_data.get('configured_mcps', []) config['custom_mcps'] = version_data.get('custom_mcps', []) config['workflows'] = [] config['triggers'] = [] else: - # Fallback to agent data or empty config['configured_mcps'] = agent_data.get('configured_mcps', []) config['custom_mcps'] = agent_data.get('custom_mcps', []) config['workflows'] = [] @@ -76,13 +72,11 @@ def _extract_suna_agent_config(agent_data: Dict[str, Any], version_data: Optiona def _extract_custom_agent_config(agent_data: Dict[str, Any], version_data: Optional[Dict[str, Any]] = None) -> Dict[str, Any]: - """Extract config for custom agents using versioning system.""" agent_id = agent_data.get('agent_id', 'Unknown') if version_data: logger.debug(f"Using version data for custom agent {agent_id} (version: {version_data.get('version_name', 'unknown')})") - # Extract from version data if version_data.get('config'): config = version_data['config'].copy() system_prompt = config.get('system_prompt', '') @@ -94,7 +88,6 @@ def _extract_custom_agent_config(agent_data: Dict[str, Any], version_data: Optio workflows = config.get('workflows', []) triggers = config.get('triggers', []) else: - # Legacy version format system_prompt = version_data.get('system_prompt', '') model = version_data.get('model') configured_mcps = version_data.get('configured_mcps', []) @@ -117,6 +110,9 @@ def _extract_custom_agent_config(agent_data: Dict[str, Any], version_data: Optio 'avatar': agent_data.get('avatar'), 'avatar_color': agent_data.get('avatar_color'), 'profile_image_url': agent_data.get('profile_image_url'), + 'icon_name': agent_data.get('icon_name'), + 'icon_color': agent_data.get('icon_color'), + 'icon_background': agent_data.get('icon_background'), 'is_default': agent_data.get('is_default', False), 'is_suna_default': False, 'centrally_managed': False, @@ -126,7 +122,6 @@ def _extract_custom_agent_config(agent_data: Dict[str, Any], version_data: Optio 'restrictions': {} } - # Fallback: create default config for custom agents without version data logger.warning(f"No version data found for custom agent {agent_id}, creating default configuration") return { @@ -143,6 +138,9 @@ def _extract_custom_agent_config(agent_data: Dict[str, Any], version_data: Optio 'avatar': agent_data.get('avatar'), 'avatar_color': agent_data.get('avatar_color'), 'profile_image_url': agent_data.get('profile_image_url'), + 'icon_name': agent_data.get('icon_name'), + 'icon_color': agent_data.get('icon_color'), + 'icon_background': agent_data.get('icon_background'), 'is_default': agent_data.get('is_default', False), 'is_suna_default': False, 'centrally_managed': False, diff --git a/frontend/src/app/(dashboard)/agents/config/[agentId]/page.tsx b/frontend/src/app/(dashboard)/agents/config/[agentId]/page.tsx index c4c435d6..666d6c50 100644 --- a/frontend/src/app/(dashboard)/agents/config/[agentId]/page.tsx +++ b/frontend/src/app/(dashboard)/agents/config/[agentId]/page.tsx @@ -293,7 +293,6 @@ function AgentConfigurationContent() { setFormData(prev => ({ ...prev, profile_image_url: profileImageUrl || '' })); setOriginalData(prev => ({ ...prev, profile_image_url: profileImageUrl || '' })); - toast.success('Profile picture updated'); } catch (error) { toast.error('Failed to update profile picture'); throw error; diff --git a/frontend/src/components/agents/custom-agents-page/agent-card.tsx b/frontend/src/components/agents/custom-agents-page/agent-card.tsx index 2bf375c5..efa0b68b 100644 --- a/frontend/src/components/agents/custom-agents-page/agent-card.tsx +++ b/frontend/src/components/agents/custom-agents-page/agent-card.tsx @@ -10,7 +10,6 @@ import { DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, - DropdownMenuSeparator, } from '@/components/ui/dropdown-menu'; import { AlertDialog, @@ -22,7 +21,6 @@ import { AlertDialogHeader, AlertDialogTitle, } from '@/components/ui/alert-dialog'; -import type { MarketplaceTemplate } from '@/components/agents/installation/types'; import { KortixLogo } from '@/components/sidebar/kortix-logo'; export type AgentCardMode = 'marketplace' | 'template' | 'agent'; diff --git a/sdk/kortix/api/agents.py b/sdk/kortix/api/agents.py index 40151c84..9ac4a844 100644 --- a/sdk/kortix/api/agents.py +++ b/sdk/kortix/api/agents.py @@ -35,6 +35,10 @@ class AgentCreateRequest: is_default: bool = False avatar: Optional[str] = None avatar_color: Optional[str] = None + profile_image_url: Optional[str] = None + icon_name: Optional[str] = None + icon_color: Optional[str] = None + icon_background: Optional[str] = None @dataclass @@ -47,6 +51,10 @@ class AgentUpdateRequest: is_default: Optional[bool] = None avatar: Optional[str] = None avatar_color: Optional[str] = None + profile_image_url: Optional[str] = None + icon_name: Optional[str] = None + icon_color: Optional[str] = None + icon_background: Optional[str] = None @dataclass