import json import logging from datetime import datetime from pathlib import Path from agents.learning_loop import query_knowledge_base class LoopManager: def __init__(self, agent_name): self.agent = agent_name self.log_dir = Path(f"/opt/agentic/logs/feedback/{datetime.now().strftime('%Y-%m-%d')}") self.log_dir.mkdir(parents=True, exist_ok=True) logging.basicConfig( filename=self.log_dir / f"{self.agent}_loop_debug.log", level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s" ) def run_loop(self, initial_input): loop_id = datetime.now().strftime("%H%M%S") logging.info(f"Starting feedback loop: {loop_id}") phase1 = self._generate_output(initial_input) self._log_phase(loop_id, 1, phase1) phase2 = self._reflect(phase1, cycle=1) self._log_phase(loop_id, 2, phase2) phase3 = self._reflect(phase2, cycle=2) self._log_phase(loop_id, 3, phase3) phase4 = self._research(phase3) self._log_phase(loop_id, 4, phase4) final = self._finalize(phase4) self._log_phase(loop_id, 5, final, is_final=True) logging.info(f"Completed feedback loop: {loop_id}") return final def _log_phase(self, loop_id, phase_num, data, is_final=False): log_file = self.log_dir / f"{self.agent}_{loop_id}.json" phase_key = "final" if is_final else f"phase_{phase_num}" try: if log_file.exists(): with open(log_file, 'r+') as f: log_data = json.load(f) log_data[phase_key] = data f.seek(0) json.dump(log_data, f, indent=2) f.truncate() else: with open(log_file, 'w') as f: json.dump({phase_key: data}, f, indent=2) except Exception as e: logging.error(f"Failed to log phase {phase_num}: {str(e)}") def _generate_output(self, task_input): return { "input": task_input, "output": f"Initial output for: {task_input}", "meta": {"agent": self.agent, "stage": "initial"} } def _reflect(self, previous_output, cycle): text = previous_output.get("output", "") reflection = f"Reflection {cycle} applied to: {text}" return { "input": text, "output": reflection, "meta": { "agent": self.agent, "stage": f"reflection_{cycle}", "notes": f"Refined for clarity and impact, pass {cycle}" } } def _research(self, refined_output): query = refined_output.get("output", "") inspiration = query_knowledge_base(query) integrated = f"{refined_output['output']} + Research Applied: {inspiration}" return { "input": query, "output": integrated, "meta": { "agent": self.agent, "stage": "research", "source": "internal_kb" } } def _finalize(self, researched_output): summary = researched_output.get("output", "") return { "input": researched_output["input"], "output": summary, "meta": { "agent": self.agent, "stage": "final", "timestamp": datetime.now().isoformat() } }