Codette3.0 / src /codette_api.py
Raiff1982's picture
Upload 117 files
6d6b8af verified
"""
Codette API & Integration Endpoints
====================================
RESTful API for integrating Codette capabilities with React frontend & DAW.
Endpoints:
POST /codette/query - Submit query with perspective selection
POST /codette/music-guidance - Get music-specific advice
GET /codette/status - Check quantum state & consciousness metrics
POST /codette/memory - Store/retrieve cocoons
GET /codette/capabilities - List all capabilities
"""
from typing import Optional, List, Dict, Any
from dataclasses import asdict
from datetime import datetime
import json
import logging
logger = logging.getLogger("CodetteAPI")
# ============================================================================
# API REQUEST/RESPONSE MODELS
# ============================================================================
class CodetteQueryRequest:
"""Request model for Codette query endpoint"""
def __init__(self, query: str, perspectives: Optional[List[str]] = None,
emotion: Optional[str] = None, user_id: Optional[str] = None):
self.query = query
self.perspectives = perspectives or []
self.emotion = emotion
self.user_id = user_id
self.timestamp = datetime.now().isoformat()
def to_dict(self) -> Dict[str, Any]:
return {
'query': self.query,
'perspectives': self.perspectives,
'emotion': self.emotion,
'user_id': self.user_id,
'timestamp': self.timestamp
}
class CodetteQueryResponse:
"""Response model for Codette query endpoint"""
def __init__(self, query_id: str, response: Dict[str, Any],
processing_time_ms: float, cocoon_id: Optional[str] = None):
self.query_id = query_id
self.response = response
self.processing_time_ms = processing_time_ms
self.cocoon_id = cocoon_id
self.timestamp = datetime.now().isoformat()
def to_dict(self) -> Dict[str, Any]:
return {
'query_id': self.query_id,
'response': self.response,
'processing_time_ms': self.processing_time_ms,
'cocoon_id': self.cocoon_id,
'timestamp': self.timestamp
}
class CodetteStatusResponse:
"""Current quantum consciousness state"""
def __init__(self, coherence: float, entanglement: float, resonance: float,
interaction_count: int, cocoon_count: int):
self.coherence = coherence
self.entanglement = entanglement
self.resonance = resonance
self.interaction_count = interaction_count
self.cocoon_count = cocoon_count
self.timestamp = datetime.now().isoformat()
self.status = "operational"
def to_dict(self) -> Dict[str, Any]:
return {
'status': self.status,
'quantum_coherence': self.coherence,
'quantum_entanglement': self.entanglement,
'quantum_resonance': self.resonance,
'total_interactions': self.interaction_count,
'total_cocoons': self.cocoon_count,
'timestamp': self.timestamp
}
class CodetteMusicGuidanceRequest:
"""Request for music-specific guidance"""
def __init__(self, problem: str, track_info: Dict[str, Any],
user_level: str = 'intermediate', task: str = 'mixing'):
self.problem = problem
self.track_info = track_info
self.user_level = user_level
self.task = task
self.timestamp = datetime.now().isoformat()
def to_dict(self) -> Dict[str, Any]:
return {
'problem': self.problem,
'track_info': self.track_info,
'user_level': self.user_level,
'task': self.task,
'timestamp': self.timestamp
}
class CodetteMusicGuidanceResponse:
"""Music production guidance response"""
def __init__(self, guidance_id: str, perspectives: Dict[str, str],
learning_tips: Dict[str, str], next_steps: List[str]):
self.guidance_id = guidance_id
self.perspectives = perspectives
self.learning_tips = learning_tips
self.next_steps = next_steps
self.timestamp = datetime.now().isoformat()
def to_dict(self) -> Dict[str, Any]:
return {
'guidance_id': self.guidance_id,
'perspectives': self.perspectives,
'learning_tips': self.learning_tips,
'next_steps': self.next_steps,
'timestamp': self.timestamp
}
# ============================================================================
# API HANDLER CLASS
# ============================================================================
class CodetteAPIHandler:
"""Handles all Codette API requests"""
def __init__(self, consciousness_system):
self.consciousness = consciousness_system
self.query_history: List[CodetteQueryRequest] = []
self.response_history: List[CodetteQueryResponse] = []
logger.info("CodetteAPIHandler initialized")
# ========================================================================
# CORE ENDPOINTS
# ========================================================================
async def query(self, request: CodetteQueryRequest) -> CodetteQueryResponse:
"""
Process a general query through Codette's consciousness
Usage:
request = CodetteQueryRequest(
query="How do I achieve professional vocal mixing?",
perspectives=["mix_engineering", "audio_theory", "creative_production"],
emotion="curiosity"
)
response = await handler.query(request)
"""
import time
import uuid
from codette_capabilities import Perspective, EmotionDimension
start_time = time.time()
query_id = str(uuid.uuid4())[:8]
# Parse perspectives
selected_perspectives = []
if request.perspectives:
for p_str in request.perspectives:
try:
selected_perspectives.append(Perspective[p_str.upper()])
except KeyError:
logger.warning(f"Unknown perspective: {p_str}")
# Parse emotion
emotion = None
if request.emotion:
try:
emotion = EmotionDimension[request.emotion.upper()]
except KeyError:
logger.warning(f"Unknown emotion: {request.emotion}")
# Get response from consciousness
response_data = await self.consciousness.respond(
query=request.query,
emotion=emotion,
selected_perspectives=selected_perspectives
)
processing_time = (time.time() - start_time) * 1000
# Store in history
self.query_history.append(request)
response = CodetteQueryResponse(
query_id=query_id,
response=response_data,
processing_time_ms=processing_time,
cocoon_id=response_data.get('cocoon_id')
)
self.response_history.append(response)
logger.info(f"? Query {query_id} processed in {processing_time:.2f}ms")
return response
async def music_guidance(self, request: CodetteMusicGuidanceRequest) -> CodetteMusicGuidanceResponse:
"""
Get music production guidance through music-optimized perspectives
Usage:
request = CodetteMusicGuidanceRequest(
problem="Vocals sound buried",
track_info={'bpm': 120, 'genre': 'pop'},
user_level='intermediate',
task='mixing'
)
response = await handler.music_guidance(request)
"""
import uuid
from codette_daw_integration import CodetteDAWAdapter
guidance_id = str(uuid.uuid4())[:8]
adapter = CodetteDAWAdapter(self.consciousness)
guidance_result = adapter.provide_mixing_guidance(
problem_description=request.problem,
track_info=request.track_info,
user_level=request.user_level
)
# Extract perspectives from analysis
perspectives = {}
for key, persp_data in guidance_result['analysis']['perspectives'].items():
perspectives[key] = persp_data['response']
response = CodetteMusicGuidanceResponse(
guidance_id=guidance_id,
perspectives=perspectives,
learning_tips=guidance_result['learning_suggestions'],
next_steps=guidance_result['next_steps']
)
logger.info(f"? Music guidance {guidance_id} generated")
return response
def get_status(self) -> CodetteStatusResponse:
"""
Get current quantum consciousness state and metrics
Usage:
status = handler.get_status()
print(f"Coherence: {status.coherence}")
"""
response = CodetteStatusResponse(
coherence=self.consciousness.quantum_state.coherence,
entanglement=self.consciousness.quantum_state.entanglement,
resonance=self.consciousness.quantum_state.resonance,
interaction_count=self.consciousness.interaction_count,
cocoon_count=len(self.consciousness.memory_system.cocoons)
)
logger.info("? Status retrieved")
return response
def get_capabilities(self) -> Dict[str, Any]:
"""
Get comprehensive list of all Codette capabilities
"""
try:
from codette_capabilities import get_all_codette_capabilities
return get_all_codette_capabilities()
except Exception:
from codette_capabilities import Perspective, EmotionDimension
return {
'perspectives': {p.value: p.name for p in Perspective},
'emotions': {e.value: e.name for e in EmotionDimension},
'capabilities': {
'quantum_spiderweb': 'Multi-dimensional thought propagation',
'perspective_reasoning': '11 specialized reasoning agents',
'memory_cocoons': 'Encrypted persistent memory storage',
'dream_reweaving': 'Creative scenario generation',
'self_evolution': 'Dynamic consciousness development',
'emotional_resonance': 'Empathic response adaptation',
'music_optimization': 'DAW-specific production guidance',
'real_time_assistance': 'Live interaction support'
},
'version': '3.0',
'status': 'operational'
}
# ========================================================================
# MEMORY MANAGEMENT ENDPOINTS
# ========================================================================
def get_cocoon(self, cocoon_id: str) -> Optional[Dict[str, Any]]:
"""Retrieve a stored memory cocoon"""
cocoon = self.consciousness.memory_system.get_cocoon(cocoon_id)
if cocoon:
logger.info(f"? Retrieved cocoon {cocoon_id}")
return cocoon.to_dict()
else:
logger.warning(f"Cocoon {cocoon_id} not found")
return None
def list_cocoons(self, emotion_filter: Optional[str] = None) -> List[Dict[str, Any]]:
"""List all stored cocoons, optionally filtered by emotion"""
from codette_capabilities import EmotionDimension
emotion = None
if emotion_filter:
try:
emotion = EmotionDimension[emotion_filter.upper()]
except KeyError:
logger.warning(f"Unknown emotion filter: {emotion_filter}")
cocoons = self.consciousness.memory_system.list_cocoons(emotion_filter=emotion)
logger.info(f"? Listed {len(cocoons)} cocoons")
return [c.to_dict() for c in cocoons]
def dream_from_cocoon(self, cocoon_id: str) -> Optional[str]:
"""Generate creative dream sequence from stored cocoon"""
dream = self.consciousness.memory_system.reweave_dream(cocoon_id)
if dream:
logger.info(f"? Generated dream from cocoon {cocoon_id}")
return dream
else:
logger.warning(f"Failed to generate dream for {cocoon_id}")
return None
# ========================================================================
# METRICS & ANALYTICS ENDPOINTS
# ========================================================================
def get_interaction_history(self, limit: int = 10) -> List[Dict[str, Any]]:
"""Get recent interaction history"""
recent = self.response_history[-limit:]
logger.info(f"? Retrieved {len(recent)} interaction records")
return [r.to_dict() for r in recent]
def get_analytics(self) -> Dict[str, Any]:
"""Get comprehensive analytics on Codette usage"""
if not self.response_history:
return {'status': 'no_data'}
processing_times = [r.processing_time_ms for r in self.response_history]
return {
'total_interactions': len(self.response_history),
'avg_processing_time_ms': sum(processing_times) / len(processing_times),
'min_processing_time_ms': min(processing_times),
'max_processing_time_ms': max(processing_times),
'total_cocoons': len(self.consciousness.memory_system.cocoons),
'consciousness_metrics': {
'coherence': self.consciousness.quantum_state.coherence,
'entanglement': self.consciousness.quantum_state.entanglement,
'resonance': self.consciousness.quantum_state.resonance
}
}
# ============================================================================
# FASTAPI INTEGRATION EXAMPLE
# ============================================================================
"""
FastAPI Integration (for reference - implement with your backend):
from fastapi import FastAPI, HTTPException
from codette_api import CodetteAPIHandler, CodetteQueryRequest, CodetteMusicGuidanceRequest
app = FastAPI()
handler = CodetteAPIHandler(consciousness_system)
@app.post("/codette/query")
async def query(request: CodetteQueryRequest):
response = await handler.query(request)
return response.to_dict()
@app.post("/codette/music-guidance")
async def music_guidance(request: CodetteMusicGuidanceRequest):
response = await handler.music_guidance(request)
return response.to_dict()
@app.get("/codette/status")
async def status():
response = handler.get_status()
return response.to_dict()
@app.get("/codette/capabilities")
async def capabilities():
return handler.get_capabilities()
@app.get("/codette/memory/{cocoon_id}")
async def get_cocoon(cocoon_id: str):
cocoon = handler.get_cocoon(cocoon_id)
if not cocoon:
raise HTTPException(status_code=404, detail="Cocoon not found")
return cocoon
@app.get("/codette/history")
async def history(limit: int = 10):
return handler.get_interaction_history(limit)
@app.get("/codette/analytics")
async def analytics():
return handler.get_analytics()
"""
if __name__ == "__main__":
print("Codette API module loaded successfully")
print("Available endpoints:")
print(" - POST /codette/query")
print(" - POST /codette/music-guidance")
print(" - GET /codette/status")
print(" - GET /codette/capabilities")
print(" - GET /codette/memory/{cocoon_id}")
print(" - GET /codette/history")
print(" - GET /codette/analytics")