/ examples / managed-agents / persistence / redis_managed.py
redis_managed.py
 1  #!/usr/bin/env python3
 2  """
 3  ManagedAgent + Redis Persistence — Real conversation with session resume.
 4  
 5  Redis stores state/metadata; SQLite stores conversation history.
 6  
 7  Prerequisites:
 8      pip install praisonai praisonaiagents redis
 9      export OPENAI_API_KEY="sk-..."
10      # Redis running on localhost:6379
11  """
12  
13  import os
14  import sys
15  import tempfile
16  
17  import redis as redis_lib
18  
19  if not os.getenv("OPENAI_API_KEY"):
20      sys.exit("ERROR: OPENAI_API_KEY not set.")
21  
22  from praisonai import ManagedAgent, LocalManagedConfig, DB
23  from praisonaiagents import Agent
24  
25  REDIS_URL = os.getenv("REDIS_URL", "redis://:myredissecret@localhost:6379/0")
26  SQLITE_PATH = os.path.join(tempfile.gettempdir(), "managed_redis_conv.db")
27  print(f"ManagedAgent + Redis Persistence\nRedis: {REDIS_URL}\nSQLite: {SQLITE_PATH}\n")
28  
29  # ── Phase 1: Create agent, teach facts ──
30  print("=== Phase 1: First Session ===")
31  
32  db = DB(database_url=SQLITE_PATH, state_url=REDIS_URL)
33  managed = ManagedAgent(
34      provider="local", db=db,
35      config=LocalManagedConfig(
36          model="gpt-4o-mini", name="Redis Memory Agent",
37          system="You are a helpful assistant. Remember all facts the user tells you.",
38      ),
39  )
40  agent = Agent(name="User", backend=managed)
41  
42  result1 = agent.run("Remember: My cat Luna is a Siamese who loves tuna treats. Confirm.")
43  print(f"Agent: {result1[:200]}...")
44  print(f"Session ID: {managed.session_id}")
45  
46  result2 = agent.run("Also remember: Luna was adopted from a shelter in Portland, Oregon. Confirm.")
47  print(f"Agent: {result2[:200]}...")
48  
49  # ── Phase 2: Direct Redis Verification ──
50  print("\n=== Phase 2: Redis Verification ===")
51  rc = redis_lib.Redis(host="localhost", port=6379, password="myredissecret", decode_responses=True)
52  all_keys = rc.keys("*")
53  print(f"Total Redis keys: {len(all_keys)}")
54  
55  # ── Phase 3: Destroy instance ──
56  print("\n=== Phase 3: Instance Goes Idle ===")
57  saved_ids = managed.save_ids()
58  print(f"Saved IDs: {saved_ids}")
59  del agent, managed, db
60  print("Agent destroyed.\n")
61  
62  # ── Phase 4: Resume — no config needed ──
63  print("=== Phase 4: Resume Session ===")
64  db2 = DB(database_url=SQLITE_PATH, state_url=REDIS_URL)
65  managed2 = ManagedAgent(provider="local", db=db2)
66  managed2.resume_session(saved_ids["session_id"])
67  print(f"Resumed session: {managed2.session_id}")
68  
69  agent2 = Agent(name="User", backend=managed2)
70  result3 = agent2.run("What is my cat's name, breed, favourite treat, and adoption city?")
71  print(f"Agent: {result3[:300]}...")
72  
73  # ── Phase 5: Validate ──
74  print("\n=== Phase 5: Validation ===")
75  r = result3.lower()
76  checks = {
77      "Remembers 'Luna'": "luna" in r,
78      "Remembers 'Siamese'": "siamese" in r,
79      "Remembers 'tuna'": "tuna" in r,
80      "Remembers 'Portland'": "portland" in r,
81      "Session ID continuity": managed2.session_id == saved_ids["session_id"],
82  }
83  all_passed = True
84  for check, ok in checks.items():
85      print(f"  [{'PASS' if ok else 'FAIL'}] {check}")
86      if not ok:
87          all_passed = False
88  
89  os.unlink(SQLITE_PATH)
90  print(f"\n{'PASS' if all_passed else 'FAIL'}: Redis ManagedAgent persistence test")