import logging logger = logging.getLogger("ONYX") class TaskExecutor: def __init__(self, engines, pipeline_engine): self.engines = engines self.pipeline_engine = pipeline_engine # ========================= # GET ENGINE (LAZY LOADING) # ========================= def _get_engine(self, name): engine = self.engines.get(name) if engine is None: return None # si c'est une fonction → lazy loading if callable(engine): try: engine = engine() except Exception as e: logger.error(f"Lazy loading error for {name}: {e}") return None return engine # ========================= # EXECUTE PLAN # ========================= def execute(self, plan, context): objective = plan.get("objective") tasks = plan.get("tasks", []) logger.info(f"Executor objective: {objective}") logger.info(f"Executor tasks: {tasks}") result = { "script": None, "image": None } try: # ========================= # IMAGE GENERATION # ========================= if objective == "create_image": logger.info("Executing image pipeline") if self.pipeline_engine is None: result["script"] = "Pipeline de génération non disponible." return result pipeline_result = self.pipeline_engine.generate_video(context.theme) result["script"] = pipeline_result.get("script") result["image"] = pipeline_result.get("image") return result # ========================= # VIDEO GENERATION # ========================= if objective == "create_video": logger.info("Executing video pipeline") if self.pipeline_engine is None: result["script"] = "Pipeline vidéo non disponible." return result video_result = self.pipeline_engine.generate_video(context.theme) result["script"] = video_result.get("script") result["image"] = video_result.get("image") return result # ========================= # CODE GENERATION # ========================= if objective == "create_code": logger.info("Executing code engine") engine = self._get_engine("code_engine") if engine is None: result["script"] = "Code engine non disponible." return result project = engine.generate_project(context.theme) path = project.get("path") result["script"] = f"Projet généré dans : {path}" return result # ========================= # WEB SEARCH # ========================= if objective == "web_search": logger.info("Executing web engine") engine = self._get_engine("web_engine") if engine is None: result["script"] = "Web engine non disponible." return result results = engine.search(context.theme) analysis = engine.analyze_trend(context.theme) result["script"] = analysis result["web_results"] = results return result # ========================= # EXPLANATION # ========================= if objective == "explain": logger.info("Executing explanation engine") engine = self._get_engine("explanation_engine") if engine is None: result["script"] = "Explanation engine non disponible." return result explanation = engine.explain(context.theme) result["script"] = explanation return result # ========================= # FALLBACK → PIPELINE # ========================= logger.info("Fallback pipeline execution") if self.pipeline_engine: pipeline_result = self.pipeline_engine.generate_video(context.theme) result["script"] = pipeline_result.get("script") result["image"] = pipeline_result.get("image") return result except Exception as e: logger.error(f"Executor error: {e}") result["script"] = f"Erreur lors de l'exécution : {str(e)}" return result result["script"] = "Aucune tâche exécutée." return result