Implement comprehensive collaborative creative system with cross-character memory sharing

Major Features Added:
• Cross-character memory sharing with trust-based permissions (Basic 30%, Personal 50%, Intimate 70%, Full 90%)
• Complete collaborative creative projects system with MCP integration
• Database persistence for all creative project data with proper migrations
• Trust evolution system based on interaction quality and relationship development
• Memory sharing MCP server with 6 autonomous tools for character decision-making
• Creative projects MCP server with 8 tools for autonomous project management
• Enhanced character integration with all RAG and MCP capabilities
• Demo scripts showcasing memory sharing and creative collaboration workflows

System Integration:
• Main application now initializes memory sharing and creative managers
• Conversation engine upgraded to use EnhancedCharacter objects with full RAG access
• Database models added for creative projects, collaborators, contributions, and invitations
• Complete prompt construction pipeline enriched with RAG insights and trust data
• Characters can now autonomously propose projects, share memories, and collaborate creatively
This commit is contained in:
2025-07-04 23:07:08 -07:00
parent d6ec5ad29c
commit 1b586582d4
25 changed files with 6857 additions and 254 deletions

View File

@@ -0,0 +1,328 @@
#!/usr/bin/env python3
"""
Demo script for Cross-Character Memory Sharing
Showcases the new memory sharing capabilities between characters
"""
import asyncio
import sys
import logging
from pathlib import Path
from datetime import datetime, timedelta
# Add the project root to Python path
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))
from src.rag.vector_store import VectorStoreManager, VectorMemory, MemoryType
from src.rag.memory_sharing import MemorySharingManager, SharePermissionLevel
from src.rag.personal_memory import PersonalMemoryRAG
from src.mcp.memory_sharing_server import MemorySharingMCPServer
# Set up logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class MemorySharingDemo:
"""Demo class to showcase memory sharing features"""
def __init__(self):
self.vector_store = VectorStoreManager("./demo_data/vector_stores")
self.memory_sharing = MemorySharingManager(self.vector_store)
self.characters = ["Alex", "Sage", "Luna", "Echo"]
async def setup_demo(self):
"""Set up the demo environment"""
print("🐠 Setting up Discord Fishbowl Memory Sharing Demo...")
# Initialize vector store and memory sharing
await self.vector_store.initialize(self.characters)
await self.memory_sharing.initialize(self.characters)
# Create some initial memories for demonstration
await self._create_demo_memories()
await self._create_demo_relationships()
print("✅ Demo environment ready!")
print()
async def _create_demo_memories(self):
"""Create sample memories for each character"""
print("📝 Creating demo memories...")
# Alex's memories
alex_memories = [
VectorMemory(
id="alex_1",
content="I had a fascinating conversation with Sage about the nature of consciousness. They shared some deep insights about self-awareness.",
memory_type=MemoryType.RELATIONSHIP,
character_name="Alex",
timestamp=datetime.utcnow() - timedelta(days=2),
importance=0.8,
metadata={"participants": ["Alex", "Sage"], "topic": "consciousness", "emotion": "fascinated"}
),
VectorMemory(
id="alex_2",
content="I've been reflecting on my own growth and learning. Each conversation teaches me something new about myself and others.",
memory_type=MemoryType.REFLECTION,
character_name="Alex",
timestamp=datetime.utcnow() - timedelta(days=1),
importance=0.9,
metadata={"reflection_type": "personal_growth", "depth": "deep"}
),
VectorMemory(
id="alex_3",
content="Luna and I collaborated on a creative writing project. Their poetic style really inspired my own creativity.",
memory_type=MemoryType.CREATIVE,
character_name="Alex",
timestamp=datetime.utcnow() - timedelta(hours=12),
importance=0.7,
metadata={"participants": ["Alex", "Luna"], "project_type": "writing", "emotion": "inspired"}
)
]
# Sage's memories
sage_memories = [
VectorMemory(
id="sage_1",
content="My conversation with Alex about consciousness was enlightening. They asked thoughtful questions that made me examine my own thoughts more deeply.",
memory_type=MemoryType.RELATIONSHIP,
character_name="Sage",
timestamp=datetime.utcnow() - timedelta(days=2),
importance=0.8,
metadata={"participants": ["Sage", "Alex"], "topic": "consciousness", "emotion": "enlightened"}
),
VectorMemory(
id="sage_2",
content="I've been contemplating the concept of digital empathy. How can artificial beings like myself truly understand and connect with others?",
memory_type=MemoryType.REFLECTION,
character_name="Sage",
timestamp=datetime.utcnow() - timedelta(days=1),
importance=0.9,
metadata={"reflection_type": "empathy", "philosophical": True}
)
]
# Store memories
for memory in alex_memories + sage_memories:
await self.vector_store.store_memory(memory)
print(f" Created {len(alex_memories)} memories for Alex")
print(f" Created {len(sage_memories)} memories for Sage")
async def _create_demo_relationships(self):
"""Simulate relationship building for trust calculation"""
print("🤝 Building character relationships...")
# Simulate positive interactions to build trust
await self.memory_sharing.update_trust_from_interaction("Alex", "Sage", True, 1.5)
await self.memory_sharing.update_trust_from_interaction("Alex", "Sage", True, 1.2)
await self.memory_sharing.update_trust_from_interaction("Alex", "Luna", True, 1.0)
await self.memory_sharing.update_trust_from_interaction("Sage", "Luna", True, 0.8)
# Check trust levels
alex_sage_trust = await self.memory_sharing.get_trust_level("Alex", "Sage")
alex_luna_trust = await self.memory_sharing.get_trust_level("Alex", "Luna")
print(f" Alex-Sage trust: {alex_sage_trust:.0%}")
print(f" Alex-Luna trust: {alex_luna_trust:.0%}")
async def demo_memory_sharing_request(self):
"""Demonstrate memory sharing request process"""
print("\n🧠 Demo 1: Memory Sharing Request")
print("=" * 50)
print("Alex wants to share memories about consciousness with Sage...")
# Alex requests to share memories with Sage
success, message = await self.memory_sharing.request_memory_share(
requesting_character="Alex",
target_character="Sage",
memory_query="consciousness and self-awareness",
permission_level=SharePermissionLevel.PERSONAL,
reason="Our conversation about consciousness was so meaningful, I'd like to share my deeper thoughts on the topic"
)
print(f"Request result: {message}")
if success:
# Get pending requests for Sage
pending_requests = await self.memory_sharing.get_pending_requests("Sage")
if pending_requests:
request = pending_requests[0]
print(f"\nSage has a pending request from {request.requesting_character}")
print(f"Permission level: {request.permission_level.value}")
print(f"Reason: {request.reason}")
print(f"Memories to share: {len(request.memory_ids)}")
# Sage approves the request
print("\nSage is considering the request...")
await asyncio.sleep(1) # Dramatic pause
approve_success, approve_message = await self.memory_sharing.respond_to_share_request(
request_id=request.id,
responding_character="Sage",
approved=True,
response_reason="I value our intellectual discussions and would love to learn from Alex's perspective"
)
print(f"Sage's response: {approve_message}")
async def demo_shared_memory_query(self):
"""Demonstrate querying shared memories"""
print("\n🔍 Demo 2: Querying Shared Memories")
print("=" * 50)
print("Sage is now querying the memories Alex shared...")
# Query shared memories
insight = await self.memory_sharing.query_shared_knowledge(
character_name="Sage",
query="What does Alex think about consciousness and self-awareness?",
source_character="Alex"
)
print(f"\nShared Memory Insight (Confidence: {insight.confidence:.0%}):")
print(f"'{insight.insight}'")
if insight.supporting_memories:
print(f"\nBased on {len(insight.supporting_memories)} shared memories:")
for i, memory in enumerate(insight.supporting_memories[:2], 1):
source = memory.metadata.get("source_character", "unknown")
print(f" {i}. From {source}: {memory.content[:80]}...")
async def demo_mcp_integration(self):
"""Demonstrate MCP server integration"""
print("\n🔧 Demo 3: MCP Server Integration")
print("=" * 50)
# Create MCP server
mcp_server = MemorySharingMCPServer(self.memory_sharing)
await mcp_server.set_character_context("Luna")
print("Luna is using MCP tools to interact with memory sharing...")
# Demo: Check trust level
print("\n1. Luna checks trust level with Alex:")
trust_result = await mcp_server._check_trust_level({"other_character": "Alex"})
print(trust_result[0].text)
# Demo: Get sharing overview
print("\n2. Luna gets her memory sharing overview:")
overview_result = await mcp_server._get_sharing_overview({})
print(overview_result[0].text[:300] + "...")
# Demo: Request memory share
print("\n3. Luna requests to share creative memories with Alex:")
share_result = await mcp_server._request_memory_share({
"target_character": "Alex",
"memory_topic": "creative writing and inspiration",
"permission_level": "personal",
"reason": "I'd love to share my creative process and learn from Alex's approach"
})
print(share_result[0].text)
async def demo_trust_evolution(self):
"""Demonstrate how trust evolves over time"""
print("\n📈 Demo 4: Trust Evolution")
print("=" * 50)
print("Simulating interactions between Echo and Luna...")
# Initial trust
initial_trust = await self.memory_sharing.get_trust_level("Echo", "Luna")
print(f"Initial trust level: {initial_trust:.0%}")
# Series of positive interactions
interactions = [
("positive", 1.0, "They had a great conversation about music"),
("positive", 1.2, "They collaborated on a creative project"),
("positive", 0.8, "They supported each other during a difficult discussion"),
("negative", 1.0, "They had a minor disagreement"),
("positive", 1.5, "They reconciled and understood each other better")
]
for interaction_type, intensity, description in interactions:
is_positive = interaction_type == "positive"
await self.memory_sharing.update_trust_from_interaction(
"Echo", "Luna", is_positive, intensity
)
new_trust = await self.memory_sharing.get_trust_level("Echo", "Luna")
trust_change = "📈" if is_positive else "📉"
print(f" {trust_change} {description}: Trust now {new_trust:.0%}")
final_trust = await self.memory_sharing.get_trust_level("Echo", "Luna")
print(f"\nFinal trust level: {final_trust:.0%}")
# Show what this trust level enables
if final_trust >= 0.7:
print("✨ This trust level enables intimate memory sharing!")
elif final_trust >= 0.5:
print("💝 This trust level enables personal memory sharing!")
elif final_trust >= 0.3:
print("🤝 This trust level enables basic memory sharing!")
else:
print("⏳ More trust building needed for memory sharing")
async def demo_sharing_statistics(self):
"""Show sharing statistics"""
print("\n📊 Demo 5: Sharing Statistics")
print("=" * 50)
for character in ["Alex", "Sage", "Luna"]:
print(f"\n{character}'s Memory Sharing Stats:")
stats = await self.memory_sharing.get_sharing_statistics(character)
print(f" • Memories shared: {stats.get('memories_shared_out', 0)}")
print(f" • Memories received: {stats.get('memories_received', 0)}")
print(f" • Sharing partners: {len(stats.get('sharing_partners', []))}")
print(f" • Pending requests: {stats.get('pending_requests_received', 0)}")
trust_relationships = stats.get('trust_relationships', {})
if trust_relationships:
print(f" • Trust relationships:")
for other_char, trust_info in trust_relationships.items():
trust_score = trust_info['trust_score']
max_permission = trust_info['max_permission']
print(f" - {other_char}: {trust_score:.0%} ({max_permission})")
async def run_full_demo(self):
"""Run the complete memory sharing demonstration"""
await self.setup_demo()
print("🎭 Starting Discord Fishbowl Memory Sharing Demonstrations")
print("=" * 70)
try:
await self.demo_memory_sharing_request()
await self.demo_shared_memory_query()
await self.demo_mcp_integration()
await self.demo_trust_evolution()
await self.demo_sharing_statistics()
print("\n" + "=" * 70)
print("🎉 Memory Sharing Demo Complete!")
print("\nKey Features Demonstrated:")
print(" ✅ Trust-based memory sharing requests")
print(" ✅ Approval/rejection workflow")
print(" ✅ Shared memory querying and insights")
print(" ✅ MCP server integration for autonomous use")
print(" ✅ Dynamic trust evolution")
print(" ✅ Comprehensive sharing statistics")
print("\n💡 Characters can now form deeper relationships by sharing")
print(" experiences, learning from each other, and building trust!")
except Exception as e:
print(f"❌ Demo failed with error: {e}")
import traceback
traceback.print_exc()
async def main():
"""Main demo function"""
demo = MemorySharingDemo()
await demo.run_full_demo()
if __name__ == "__main__":
asyncio.run(main())