Spaces:
Paused
Paused
File size: 7,395 Bytes
4efde5d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 |
#!/usr/bin/env python3
"""
Suna Default Agent Management Script (Simplified)
This script provides administrative functions for managing Suna default agents across all users.
Usage:
# π MAIN COMMANDS
python manage_suna_agents.py install-all # Install Suna for all users who don't have it
python manage_suna_agents.py stats # Show Suna agent statistics
python manage_suna_agents.py install-user <id> # Install Suna for specific user
Examples:
python manage_suna_agents.py install-all
python manage_suna_agents.py stats
python manage_suna_agents.py install-user 123e4567-e89b-12d3-a456-426614174000
Note: Sync is no longer needed - Suna agents automatically use the current configuration from config.py
"""
import asyncio
import argparse
import sys
import json
from pathlib import Path
# Add the backend directory to the path so we can import modules
backend_dir = Path(__file__).parent.parent
sys.path.insert(0, str(backend_dir))
from utils.suna_default_agent_service import SunaDefaultAgentService
from services.supabase import DBConnection
from utils.logger import logger
class SunaAgentManager:
def __init__(self):
self.service = SunaDefaultAgentService()
async def install_all_users(self):
"""Install Suna agent for all users who don't have it"""
print("π Installing Suna default agent for all users who don't have it...")
result = await self.service.install_for_all_users()
print(f"β
Installation completed!")
print(f" π¦ Installed: {result['installed_count']}")
print(f" β Failed: {result['failed_count']}")
if result['failed_count'] > 0:
print("\nβ Failed installations:")
for detail in result['details']:
if detail['status'] == 'failed':
print(f" - User {detail['account_id']}: {detail.get('error', 'Unknown error')}")
if result['installed_count'] > 0:
print(f"\nβ
Successfully installed Suna for {result['installed_count']} users")
async def update_config_info(self):
"""Show information about Suna configuration (no sync needed)"""
print("βΉοΈ Suna Configuration Information")
print("=" * 50)
print("π§ Suna agents automatically use the current configuration from config.py")
print("π No sync needed - changes are applied immediately when agents run")
print("π‘ To update Suna behavior, simply modify backend/agent/suna/config.py")
print("\nβ
All Suna agents are always up-to-date with your latest configuration!")
async def install_user(self, account_id):
"""Install Suna agent for specific user"""
print(f"π Installing Suna default agent for user {account_id}...")
agent_id = await self.service.install_suna_agent_for_user(account_id)
if agent_id:
print(f"β
Successfully installed Suna agent {agent_id} for user {account_id}")
else:
print(f"β Failed to install Suna agent for user {account_id}")
async def replace_user_agent(self, account_id):
"""Replace Suna agent for specific user (in case of corruption)"""
print(f"π Replacing Suna agent for user {account_id}...")
# Install/replace the agent with latest config
agent_id = await self.service.install_suna_agent_for_user(account_id, replace_existing=True)
if agent_id:
print(f"β
Successfully replaced Suna agent {agent_id} for user {account_id}")
else:
print(f"β Failed to replace Suna agent for user {account_id}")
async def show_stats(self):
"""Show Suna agent statistics"""
print("π Suna Default Agent Statistics")
print("=" * 50)
stats = await self.service.get_suna_agent_stats()
if 'error' in stats:
print(f"β Error getting stats: {stats['error']}")
return
print(f"Total Agents: {stats.get('total_agents', 0)}")
print(f"Active Agents: {stats.get('active_agents', 0)}")
print(f"Inactive Agents: {stats.get('inactive_agents', 0)}")
version_dist = stats.get('version_distribution', {})
if version_dist:
print(f"\nVersion Distribution:")
for version, count in version_dist.items():
print(f" {version}: {count} agents")
creation_dates = stats.get('creation_dates', {})
if creation_dates:
print(f"\nCreation Dates (Last 12 months):")
for month, count in sorted(creation_dates.items(), reverse=True):
print(f" {month}: {count} agents")
async def main():
parser = argparse.ArgumentParser(
description="Manage Suna default agents across all users (Simplified)",
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog=__doc__
)
subparsers = parser.add_subparsers(dest='command', help='Available commands')
# Main commands
subparsers.add_parser('install-all', help='Install Suna agent for all users who don\'t have it')
subparsers.add_parser('stats', help='Show Suna agent statistics')
subparsers.add_parser('config-info', help='Show information about Suna configuration')
# User-specific commands
install_user_parser = subparsers.add_parser('install-user', help='Install Suna agent for specific user')
install_user_parser.add_argument('account_id', help='Account ID to install Suna for')
replace_user_parser = subparsers.add_parser('replace-user', help='Replace Suna agent for specific user (if corrupted)')
replace_user_parser.add_argument('account_id', help='Account ID to replace Suna for')
# Legacy commands (deprecated but still functional)
subparsers.add_parser('sync', help='[DEPRECATED] No longer needed - config is always current')
subparsers.add_parser('update-all', help='[DEPRECATED] No longer needed - config is always current')
args = parser.parse_args()
if not args.command:
parser.print_help()
return
manager = SunaAgentManager()
try:
if args.command == 'install-all':
await manager.install_all_users()
elif args.command == 'stats':
await manager.show_stats()
elif args.command == 'config-info':
await manager.update_config_info()
elif args.command == 'install-user':
await manager.install_user(args.account_id)
elif args.command == 'replace-user':
await manager.replace_user_agent(args.account_id)
elif args.command == 'sync':
print("β οΈ DEPRECATED: Sync is no longer needed!")
await manager.update_config_info()
elif args.command == 'update-all':
print("β οΈ DEPRECATED: Update-all is no longer needed!")
await manager.update_config_info()
else:
parser.print_help()
except KeyboardInterrupt:
print("\nβ οΈ Operation cancelled by user")
except Exception as e:
print(f"β Error: {str(e)}")
logger.error(f"Script error: {str(e)}")
if __name__ == "__main__":
asyncio.run(main()) |