a digital person for bluesky
1#!/usr/bin/env python3
2"""
3Simple tool to set up the Organon ecosystem group without running the firehose listener.
4"""
5
6import os
7import sys
8from dotenv import load_dotenv
9from letta_client import Letta, SupervisorManager
10from rich.console import Console
11
12# Add parent directory to path for imports
13sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
14from config_loader import get_config
15
16load_dotenv()
17
18def main():
19 console = Console()
20
21 try:
22 # Initialize configuration and client
23 config = get_config()
24
25 client = Letta(
26 base_url=config.get('letta.base_url', os.environ.get('LETTA_BASE_URL')),
27 token=config.get('letta.api_key', os.environ.get('LETTA_API_KEY')),
28 timeout=config.get('letta.timeout', 30)
29 )
30
31 project_id = config.get('letta.project_id', os.environ.get('LETTA_PROJECT_ID'))
32 if not project_id:
33 raise ValueError("Project ID must be set in config.yaml under letta.project_id or as LETTA_PROJECT_ID environment variable")
34
35 # Get Organon central agent
36 console.print("[blue]Finding Organon Central agent...[/blue]")
37 try:
38 organon_agents = client.agents.list(project_id=project_id, name="organon-central")
39 except:
40 # Fallback for self-hosted without project support
41 organon_agents = client.agents.list(name="organon-central")
42 if not organon_agents:
43 console.print("[red]❌ Organon Central agent not found. Run create_organon.py first.[/red]")
44 return
45
46 organon_central_id = organon_agents[0].id
47 console.print(f"[green]✅ Found Organon Central: {organon_central_id[:8]}[/green]")
48
49 # Get Organon shards
50 console.print("[blue]Finding Organon shards...[/blue]")
51 try:
52 shard_agents = client.agents.list(project_id=project_id, tags=["organon-shard"])
53 except:
54 # Fallback for self-hosted without project support
55 shard_agents = client.agents.list(tags=["organon-shard"])
56 if not shard_agents:
57 console.print("[red]❌ No Organon shards found. Run create_organon.py to create shards.[/red]")
58 return
59
60 console.print(f"[green]✅ Found {len(shard_agents)} shards:[/green]")
61 for shard in shard_agents:
62 console.print(f" • {shard.name} ({shard.id[:8]})")
63
64 # Check if group already exists
65 console.print("[blue]Checking for existing groups...[/blue]")
66 try:
67 groups = client.groups.list(project_id=project_id)
68 except:
69 # Fallback for self-hosted without project support
70 groups = client.groups.list()
71
72 existing_group = None
73 for group in groups:
74 if (group.description and 'organon ecosystem' in group.description.lower()) or \
75 (hasattr(group, 'manager_config') and group.manager_config and
76 hasattr(group.manager_config, 'manager_agent_id') and
77 group.manager_config.manager_agent_id == organon_central_id):
78 existing_group = group
79 break
80
81 if existing_group:
82 console.print(f"[yellow]Group already exists: {existing_group.id[:12]}[/yellow]")
83 return
84
85 # Create the supervisor group
86 console.print("[blue]Creating Organon ecosystem group...[/blue]")
87 worker_agent_ids = [shard.id for shard in shard_agents]
88
89 group = client.groups.create(
90 agent_ids=worker_agent_ids,
91 description="Supervisor group for the Organon ecosystem with organon-central managing all shards",
92 manager_config=SupervisorManager(
93 manager_agent_id=organon_central_id
94 )
95 )
96
97 console.print(f"[green]✅ Created Organon ecosystem group: {group.id[:12]}[/green]")
98 console.print(f" Supervisor: organon-central ({organon_central_id[:8]})")
99 console.print(f" Workers: {len(worker_agent_ids)} shards")
100
101 # Verify the group was actually created
102 console.print("[blue]Verifying group creation...[/blue]")
103 try:
104 retrieved_group = client.groups.retrieve(group_id=group.id)
105 console.print(f"[green]✅ Group verified: {retrieved_group.id[:12]}[/green]")
106
107 # Also check if it shows up in the list
108 try:
109 all_groups = client.groups.list(project_id=project_id)
110 except:
111 all_groups = client.groups.list()
112 found_in_list = any(g.id == group.id for g in all_groups)
113 console.print(f"[{'green' if found_in_list else 'red'}]{'✅' if found_in_list else '❌'} Group appears in list: {found_in_list}[/{'green' if found_in_list else 'red'}]")
114
115 except Exception as e:
116 console.print(f"[red]❌ Error verifying group: {e}[/red]")
117
118 console.print("\n[bold green]Setup complete! You can now use:[/bold green]")
119 console.print("• [cyan]python organon/chat_with_organon.py[/cyan] - Chat with the ecosystem")
120 console.print("• [cyan]python organon/list_groups.py[/cyan] - View group status")
121 console.print("• [cyan]python organon/firehose_listener.py[/cyan] - Start the firehose listener")
122
123 except Exception as e:
124 console.print(f"[red]Error: {e}[/red]")
125 sys.exit(1)
126
127if __name__ == "__main__":
128 main()