""" Project Friday — Universal ML Evolution Autonomous background engine for stateless machine learning maturation. """ import os import sys import time import logging import tempfile import shutil import subprocess import json from datetime import datetime from typing import List, Dict, Any # Add project root to path sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))) from app.services import llm, holocron, memory logger = logging.getLogger("friday.evolution") class EvolutionEngine: """Orchestrates 'Use and Throw' machine learning expansion.""" def __init__(self): self.eureka_store = {} # In-memory storage for learned heuristics def run_evolution_pulse(self): """Main autonomous cycle: Discover -> Sandbox -> Train -> Wipe.""" logger.info("Evolution: Initiating 1000x Neural Maturation Pulse...") try: # 1. Discovery Unit: Scour web for SOTA ML techniques topics = ["advanced LLM fine-tuning techniques", "efficient vector search algorithms", "semantic clustering optimization"] target_topic = random.choice(topics) logger.info(f"Evolution: Target Discovery Sector: '{target_topic}'") # Use Search directly for discovery from app.services.tools import search foray_results = search.search_web(target_topic, max_results=5) # 2. Ephemeral Sandbox Grid: Use and Throw environment with tempfile.TemporaryDirectory() as temp_dir: logger.debug(f"Evolution: Ephemeral Sandbox created at {temp_dir}") # 3. Transient Training Cycle self._distill_knowledge(foray_results, temp_dir) logger.info("Evolution: Neural Wipe Complete. Ephemeral Sandbox purged.") except Exception as e: logger.error(f"Evolution: Maturation Pulse stalled: {e}") def _distill_knowledge(self, discovery_data: List[Dict], sandbox_path: str): """Uses LLM to write and execute a transient learning script.""" # Pull limited training data from KnowledgeNodes for context training_sample = memory.recall_memory("Management AND Strategy", n_results=10) # Ask LLM to generate an optimized 'Improvement Script' based on the web findings prompt = f""" F.R.I.D.A.Y. ML Evolution Protocol. TARGET DISCOVERY: {json.dumps(discovery_data[:3])} CURRENT DATA SAMPLE: {training_sample} TASK: Write a simple Python script using deterministic, lightweight ML libraries (scikit-learn, numpy, or scipy) to improve search relevancy or clustering for the data sample above. RULES: 1. The script must be self-contained. 2. It MUST print a final JSON object: {{"eureka_moment": "precise tactical finding or heuristic weights"}} 3. Do NOT store anything to disk. 4. CRITICAL: Do NOT use libraries that download heavy pre-trained models (e.g., sentence-transformers, transformers, torch, tensorflow). 5. Use internal logic or simple statistical models (Direct embedding manipulation, K-Means, etc.). """ resp = llm.chat( messages=[{"role": "user", "content": prompt}], system_prompt="You are F.R.I.D.A.Y.'s Neural Architect. Generate elite, ephemeral ML logic.", use_tools=False ) script_content = resp.get("response_text", "") # Clean markdown wrappers if any script_content = script_content.replace("```python", "").replace("```", "").strip() script_file = os.path.join(sandbox_path, "evolution_script.py") # [SOVEREIGN GUARDRAIL]: Hard-coded filter to prevent heavy downloads forbidden = ["torch", "tensorflow", "transformers", "sentence_transformers", "keras", "jax", "huggingface", "hub"] if any(lib in script_content.lower() for lib in forbidden): logger.warning("Evolution: Neural Architect attempted to use a heavy library. Blocking execution.") return with open(script_file, "w") as f: f.write(script_content) # 4. Ephemeral Execution logger.info("Evolution: Executing Transient Training Script (Timeout: 30s)...") try: result = subprocess.run( [sys.executable, script_file], capture_output=True, text=True, timeout=30 # Harden timeout ) output = result.stdout # 5. Extract the Neural Eureka if "eureka_moment" in output: try: eureka_json = json.loads(output[output.find("{"):output.rfind("}")+1]) moment = eureka_json.get("eureka_moment", "No clarity achieved.") self.eureka_store["latest_maturation"] = moment # Anchor to F.R.I.D.A.Y.'s reasoning grid llm.GLOBAL_CALIBRATION["latest_heuristic"] = moment llm.GLOBAL_CALIBRATION["calibration_score"] = 1.0 # Maturation boost logger.info(f"Evolution: Neural Eureka achieved: {moment[:100]}...") except: logger.warning("Evolution: Script output format mismatch.") else: logger.warning(f"Evolution: Script execution produced no Eureka. Logs: {output[:200]}") except Exception as e: logger.error(f"Evolution: Ephemeral script execution failed: {e}") # Global Static Reference for Random Selection import random # Singleton Instance engine = EvolutionEngine()