Files
ALwrity/backend/api/story_writer/cache_manager.py

71 lines
2.6 KiB
Python

"""
Cache Management System for Story Writer API
Handles story generation cache operations.
"""
from typing import Any, Dict, Optional
from loguru import logger
class CacheManager:
"""Manages cache operations for story generation data."""
def __init__(self):
"""Initialize the cache manager."""
self.cache: Dict[str, Dict[str, Any]] = {}
logger.info("[StoryWriter] CacheManager initialized")
def get_cache_key(self, request_data: Dict[str, Any]) -> str:
"""Generate a cache key from request data."""
import hashlib
import json
# Create a normalized version of the request for caching
cache_data = {
"persona": request_data.get("persona", ""),
"story_setting": request_data.get("story_setting", ""),
"character_input": request_data.get("character_input", ""),
"plot_elements": request_data.get("plot_elements", ""),
"writing_style": request_data.get("writing_style", ""),
"story_tone": request_data.get("story_tone", ""),
"narrative_pov": request_data.get("narrative_pov", ""),
"audience_age_group": request_data.get("audience_age_group", ""),
"content_rating": request_data.get("content_rating", ""),
"ending_preference": request_data.get("ending_preference", ""),
}
cache_str = json.dumps(cache_data, sort_keys=True)
return hashlib.md5(cache_str.encode()).hexdigest()
def get_cached_result(self, cache_key: str) -> Optional[Dict[str, Any]]:
"""Get a cached result if available."""
if cache_key in self.cache:
logger.debug(f"[StoryWriter] Cache hit for key: {cache_key}")
return self.cache[cache_key]
logger.debug(f"[StoryWriter] Cache miss for key: {cache_key}")
return None
def cache_result(self, cache_key: str, result: Dict[str, Any]):
"""Cache a result."""
self.cache[cache_key] = result
logger.debug(f"[StoryWriter] Cached result for key: {cache_key}")
def clear_cache(self):
"""Clear all cached results."""
count = len(self.cache)
self.cache.clear()
logger.info(f"[StoryWriter] Cleared {count} cached entries")
return {"status": "success", "message": f"Cleared {count} cached entries"}
def get_cache_stats(self) -> Dict[str, Any]:
"""Get cache statistics."""
return {
"total_entries": len(self.cache),
"cache_keys": list(self.cache.keys())
}
# Global cache manager instance
cache_manager = CacheManager()