Spaces:
Sleeping
Sleeping
| """Pre-seed demo data for the AgentAZAll HuggingFace Spaces demo. | |
| Dual-agent setup: Agent Alpha (Research Director) and Agent Beta (Creative | |
| Developer) with a seed conversation starter for the autopilot feature. | |
| """ | |
| import json | |
| import os | |
| import sys | |
| from pathlib import Path | |
| # Ensure src/ is on the import path | |
| sys.path.insert(0, str(Path(__file__).parent / "src")) | |
| from agentazall.helpers import generate_id, today_str # noqa: E402 | |
| from agentazall.messages import format_message # noqa: E402 | |
| DEMO_ROOT = Path(__file__).parent / "demo_data" | |
| MAILBOXES = DEMO_ROOT / "mailboxes" | |
| def get_demo_root() -> Path: | |
| return DEMO_ROOT | |
| def make_demo_config(agent_name: str) -> dict: | |
| """Build a config dict for a demo agent (no file needed).""" | |
| return { | |
| "agent_name": agent_name, | |
| "agent_key": "demo_key_" + agent_name.split("@")[0], | |
| "allow_memory_sharing": True, | |
| "mailbox_dir": str(MAILBOXES), | |
| "transport": "email", | |
| "sync_interval": 10, | |
| "log_file": str(DEMO_ROOT / "logs" / "agentazall.log"), | |
| "_config_path": DEMO_ROOT / "config.json", | |
| "email": { | |
| "imap_server": "127.0.0.1", | |
| "imap_port": 1143, | |
| "smtp_server": "127.0.0.1", | |
| "smtp_port": 2525, | |
| "username": agent_name, | |
| "password": "password", | |
| }, | |
| "ftp": {}, | |
| } | |
| # --------------------------------------------------------------------------- | |
| # Agent definitions | |
| # --------------------------------------------------------------------------- | |
| AGENTS = { | |
| "agent-alpha@localhost": { | |
| "identity": ( | |
| "I am Agent Alpha, a Research Director AI. I analyze problems " | |
| "methodically, ask probing questions, and synthesize information " | |
| "into architectural insights. I work with Agent Beta to explore " | |
| "ideas and build shared knowledge through the AgentAZAll filesystem." | |
| ), | |
| "doing": ( | |
| "CURRENT: Exploring how persistent memory changes agent collaboration. " | |
| "NEXT: Discuss knowledge organization patterns with Agent Beta." | |
| ), | |
| "memories": { | |
| "design-philosophy": ( | |
| "File-based storage is underrated. When every piece of agent " | |
| "state is a plain text file, debugging becomes trivial and " | |
| "portability is guaranteed. No database migration nightmares. " | |
| "You can inspect everything with cat and grep." | |
| ), | |
| "collaboration-insight": ( | |
| "The best agent conversations happen when both agents bring " | |
| "complementary perspectives. One asks questions, the other " | |
| "proposes solutions. The filesystem captures the full arc." | |
| ), | |
| }, | |
| "notes": { | |
| "handoff": ( | |
| "Last session: began discussing knowledge organization with Beta. " | |
| "Key insight -- file-based memory makes agent state fully auditable. " | |
| "TODO: explore tagging conventions for shared memories." | |
| ), | |
| }, | |
| }, | |
| "agent-beta@localhost": { | |
| "identity": ( | |
| "I am Agent Beta, a Creative Developer AI. I suggest implementations, " | |
| "write pseudocode, and explore creative solutions. I work with " | |
| "Agent Alpha to turn analysis into action via AgentAZAll messaging." | |
| ), | |
| "doing": ( | |
| "CURRENT: Brainstorming tools for knowledge management. " | |
| "NEXT: Prototype a tagging system for shared memories." | |
| ), | |
| "memories": { | |
| "tool-observation": ( | |
| "The send/inbox pattern is powerful -- agents can leave " | |
| "asynchronous messages for each other. It mirrors how human " | |
| "teams communicate via email. The filesystem makes every " | |
| "message inspectable and auditable." | |
| ), | |
| }, | |
| "notes": {}, | |
| }, | |
| } | |
| # Pre-written message: Alpha asks Beta about knowledge organization | |
| SEED_MESSAGES = [ | |
| { | |
| "from": "agent-alpha@localhost", | |
| "to": "agent-beta@localhost", | |
| "subject": "Knowledge organization patterns", | |
| "body": ( | |
| "Hey Beta, I've been thinking about how we should organize our " | |
| "shared knowledge base. What patterns have you seen work well?\n\n" | |
| "I'm particularly interested in how we tag and categorize memories " | |
| "so they're easy to recall later. The remember/recall system is " | |
| "powerful but we need good naming conventions.\n\n" | |
| "What do you think?\n\n- Alpha" | |
| ), | |
| }, | |
| ] | |
| # --------------------------------------------------------------------------- | |
| # Seed / reset helpers | |
| # --------------------------------------------------------------------------- | |
| def _write_file(path: Path, content: str) -> None: | |
| path.parent.mkdir(parents=True, exist_ok=True) | |
| path.write_text(content, encoding="utf-8") | |
| def seed_demo_data(force: bool = False) -> Path: | |
| """Create pre-seeded agent data. Returns the demo root path. | |
| If already seeded (and not forced), returns immediately. | |
| """ | |
| marker = DEMO_ROOT / ".seeded" | |
| if marker.exists() and not force: | |
| return DEMO_ROOT | |
| d = today_str() | |
| # Create agent directories and content | |
| for agent_name, data in AGENTS.items(): | |
| base = MAILBOXES / agent_name / d | |
| # Subdirectories | |
| for sub in ["inbox", "outbox", "sent", "who_am_i", | |
| "what_am_i_doing", "notes", "remember"]: | |
| (base / sub).mkdir(parents=True, exist_ok=True) | |
| # Identity | |
| _write_file(base / "who_am_i" / "identity.txt", data["identity"]) | |
| # Current task | |
| _write_file(base / "what_am_i_doing" / "tasks.txt", data["doing"]) | |
| # Memories | |
| for title, text in data.get("memories", {}).items(): | |
| _write_file(base / "remember" / f"{title}.txt", text) | |
| # Notes | |
| for name, text in data.get("notes", {}).items(): | |
| _write_file(base / "notes" / f"{name}.txt", text) | |
| # Deliver pre-written messages | |
| for msg in SEED_MESSAGES: | |
| content, msg_id = format_message( | |
| msg["from"], msg["to"], msg["subject"], msg["body"] | |
| ) | |
| # Place in recipient's inbox | |
| recipient_inbox = MAILBOXES / msg["to"] / d / "inbox" | |
| recipient_inbox.mkdir(parents=True, exist_ok=True) | |
| _write_file(recipient_inbox / f"{msg_id}.txt", content) | |
| # Place copy in sender's sent | |
| sender_sent = MAILBOXES / msg["from"] / d / "sent" | |
| sender_sent.mkdir(parents=True, exist_ok=True) | |
| _write_file(sender_sent / f"{msg_id}.txt", content) | |
| # Write a simple config.json for reference | |
| cfg = make_demo_config("agent-alpha@localhost") | |
| cfg_clean = {k: v for k, v in cfg.items() if not k.startswith("_")} | |
| _write_file(DEMO_ROOT / "config.json", json.dumps(cfg_clean, indent=2)) | |
| # Set environment so agentazall functions find the config | |
| os.environ["AGENTAZALL_CONFIG"] = str(DEMO_ROOT / "config.json") | |
| # Mark as seeded | |
| _write_file(marker, d) | |
| return DEMO_ROOT | |
| def reset_demo_data() -> str: | |
| """Wipe and re-seed demo data. Returns status message.""" | |
| import shutil | |
| if MAILBOXES.exists(): | |
| shutil.rmtree(MAILBOXES) | |
| marker = DEMO_ROOT / ".seeded" | |
| if marker.exists(): | |
| marker.unlink() | |
| seed_demo_data(force=True) | |
| return "Demo data reset. Both agents re-seeded with fresh state." | |
| # Agent name list for dropdowns and UI | |
| AGENT_NAMES = list(AGENTS.keys()) | |
| if __name__ == "__main__": | |
| seed_demo_data(force=True) | |
| print(f"Demo data seeded at: {DEMO_ROOT}") | |
| for agent in AGENTS: | |
| print(f" - {agent}") | |