| """Context Optimizer — Regulates token homeostasis to prevent API cost overflow.""" | |
| import math | |
| from typing import List, Dict | |
| class TokenHomeostasis: | |
| def __init__(self, max_tokens: int = 4000, decay_rate: float = 0.1): | |
| self.max_tokens = max_tokens | |
| self.decay_rate = decay_rate | |
| def prune_context(self, history: List[Dict]) -> List[Dict]: | |
| """ | |
| Surgically removes low-importance memories to fit the budget. | |
| Priority: | |
| 1. Current Task Context (High) | |
| 2. Emotional State (Medium) | |
| 3. Raw Chat History (Low - Decays fastest) | |
| """ | |
| if not history: | |
| return [] | |
| # Sort by (Importance / Time_Elapsed) | |
| # This is the "Ebbinghaus Forgetting Curve" applied to tokens. | |
| optimized = sorted( | |
| history, | |
| key=lambda x: ( | |
| x.get("importance", 0.5) * math.exp(-self.decay_rate * x.get("age", 0)) | |
| ), | |
| reverse=True, | |
| ) | |
| # Only keep what fits in the 'survival budget' | |
| return optimized[:10] # Hard limit to 10 key context nodes | |
| def compress_prompt(text: str) -> str: | |
| """Removes filler words and conversational fluff before sending to API.""" | |
| # Simplified logic: remove common stop words and redundant phrases | |
| stop_words = {"the", "a", "is", "am", "please", "could", "you", "kindly"} | |
| words = text.split() | |
| return " ".join([w for w in words if w.lower() not in stop_words or len(w) > 3]) | |