Carlexxx
commited on
Commit
·
b159b68
1
Parent(s):
69f4dbd
feat: Implement self-contained specialist managers
Browse files
aduc_framework/engineers/deformes3D.py
CHANGED
|
@@ -183,11 +183,4 @@ class Deformes3DEngine:
|
|
| 183 |
Image.fromarray(image_np).save(path)
|
| 184 |
|
| 185 |
# --- Singleton Instantiation ---
|
| 186 |
-
|
| 187 |
-
with open("config.yaml", 'r') as f:
|
| 188 |
-
config = yaml.safe_load(f)
|
| 189 |
-
WORKSPACE_DIR = config['application']['workspace_dir']
|
| 190 |
-
deformes3d_engine_singleton = Deformes3DEngine(workspace_dir=WORKSPACE_DIR)
|
| 191 |
-
except Exception as e:
|
| 192 |
-
logger.error(f"Could not initialize Deformes3DEngine: {e}", exc_info=True)
|
| 193 |
-
deformes3d_engine_singleton = None
|
|
|
|
| 183 |
Image.fromarray(image_np).save(path)
|
| 184 |
|
| 185 |
# --- Singleton Instantiation ---
|
| 186 |
+
deformes3d_engine_singleton = Deformes3DEngine()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
aduc_framework/engineers/deformes7D.py
CHANGED
|
@@ -299,18 +299,4 @@ class Deformes7DEngine:
|
|
| 299 |
logger.error(f"Audio generation failed: {e}", exc_info=True)
|
| 300 |
raise gr.Error(f"Audio generation failed. Details: {e}")
|
| 301 |
|
| 302 |
-
|
| 303 |
-
try:
|
| 304 |
-
config_path = Path(__file__).resolve().parent.parent / "config.yaml"
|
| 305 |
-
with open(config_path, 'r') as f:
|
| 306 |
-
config = yaml.safe_load(f)
|
| 307 |
-
WORKSPACE_DIR = config['application']['workspace_dir']
|
| 308 |
-
deformes7d_engine_singleton = Deformes7DEngine(workspace_dir=WORKSPACE_DIR)
|
| 309 |
-
# <--- INÍCIO DA CORREÇÃO --->
|
| 310 |
-
except Exception as e:
|
| 311 |
-
# Loga o erro como CRÍTICO, pois a aplicação não pode funcionar sem este motor.
|
| 312 |
-
logger.critical(f"CRITICAL: Failed to initialize the Deformes7DEngine singleton from {config_path}: {e}", exc_info=True)
|
| 313 |
-
# Relança a exceção para parar a aplicação imediatamente.
|
| 314 |
-
# Isso evita o erro 'NoneType' mais tarde e fornece um ponto claro de falha.
|
| 315 |
-
raise
|
| 316 |
-
# <--- FIM DA CORREÇÃO --->
|
|
|
|
| 299 |
logger.error(f"Audio generation failed: {e}", exc_info=True)
|
| 300 |
raise gr.Error(f"Audio generation failed. Details: {e}")
|
| 301 |
|
| 302 |
+
deformes7d_engine_singleton = Deformes7DEngine()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
aduc_framework/orchestrator.py
CHANGED
|
@@ -2,22 +2,27 @@
|
|
| 2 |
#
|
| 3 |
# Copyright (C) August 4, 2025 Carlos Rodrigues dos Santos
|
| 4 |
#
|
| 5 |
-
# Versão 3.
|
| 6 |
#
|
| 7 |
# Esta versão representa a camada de orquestração do Aduc Framework.
|
| 8 |
# Ela é agnóstica a qualquer interface (UI ou API) e opera com
|
| 9 |
# tipos de dados bem definidos (Pydantic) e um estado de geração central.
|
|
|
|
| 10 |
|
| 11 |
import logging
|
| 12 |
from typing import List, Dict, Any, Tuple, Callable, Optional
|
| 13 |
-
|
| 14 |
from PIL import Image, ImageOps
|
| 15 |
import os
|
| 16 |
|
| 17 |
# Importa componentes internos do framework
|
| 18 |
from .director import AducDirector
|
| 19 |
from .types import GenerationState, PreProductionParams, ProductionParams
|
| 20 |
-
from .engineers import
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
|
| 22 |
logger = logging.getLogger(__name__)
|
| 23 |
|
|
@@ -38,9 +43,16 @@ class AducOrchestrator:
|
|
| 38 |
workspace_dir (str): O diretório raiz para salvar todos os artefatos gerados.
|
| 39 |
"""
|
| 40 |
self.director = AducDirector(workspace_dir)
|
| 41 |
-
|
| 42 |
-
self.editor
|
|
|
|
|
|
|
| 43 |
self.painter = deformes3d_engine_singleton
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 44 |
logger.info("ADUC Maestro (Framework Core) está no pódio. Engenheiros especialistas prontos.")
|
| 45 |
|
| 46 |
def get_current_state(self) -> GenerationState:
|
|
@@ -69,22 +81,11 @@ class AducOrchestrator:
|
|
| 69 |
def task_pre_production(self, params: PreProductionParams, progress_callback: ProgressCallback = None) -> Tuple[List[str], List[str], GenerationState]:
|
| 70 |
"""
|
| 71 |
Executa o fluxo completo de pré-produção: storyboard e geração de keyframes.
|
| 72 |
-
|
| 73 |
-
Args:
|
| 74 |
-
params (PreProductionParams): Objeto Pydantic com todos os parâmetros da UI/API.
|
| 75 |
-
progress_callback (callable, optional): Uma função que aceita (fração, descrição) para reportar progresso.
|
| 76 |
-
|
| 77 |
-
Returns:
|
| 78 |
-
Tuple[List[str], List[str], GenerationState]: Uma tupla contendo a lista de atos do storyboard,
|
| 79 |
-
a lista de caminhos dos keyframes gerados, e o estado
|
| 80 |
-
de geração completo e atualizado.
|
| 81 |
"""
|
| 82 |
logger.info("Maestro: Iniciando tarefa de Pré-Produção.")
|
| 83 |
|
| 84 |
-
# 1. Atualiza o estado com os parâmetros recebidos
|
| 85 |
self.director.update_parameters("pre_producao", params)
|
| 86 |
|
| 87 |
-
# 2. Gera o storyboard
|
| 88 |
if progress_callback: progress_callback(0.1, "Gerando storyboard...")
|
| 89 |
|
| 90 |
storyboard_list = deformes2d_thinker_singleton.generate_storyboard(
|
|
@@ -94,17 +95,14 @@ class AducOrchestrator:
|
|
| 94 |
)
|
| 95 |
self.director.update_pre_production_state(params.prompt, params.ref_paths, storyboard_list)
|
| 96 |
|
| 97 |
-
# 3. Gera os keyframes
|
| 98 |
if progress_callback: progress_callback(0.2, "Iniciando geração de keyframes...")
|
| 99 |
|
| 100 |
-
# O engenheiro agora recebe o estado completo e o callback genérico
|
| 101 |
keyframes_detailed_data = self.painter.generate_keyframes_from_storyboard(
|
| 102 |
generation_state=self.director.get_full_state_as_dict(),
|
| 103 |
progress_callback=progress_callback
|
| 104 |
)
|
| 105 |
self.director.update_keyframes_state(keyframes_detailed_data)
|
| 106 |
|
| 107 |
-
# 4. Prepara o retorno
|
| 108 |
final_keyframe_paths = [kf["caminho_pixel"] for kf in keyframes_detailed_data]
|
| 109 |
final_state = self.director.get_full_state()
|
| 110 |
|
|
@@ -115,32 +113,18 @@ class AducOrchestrator:
|
|
| 115 |
def task_produce_original_movie(self, params: ProductionParams, progress_callback: ProgressCallback = None) -> Tuple[str, List[str], GenerationState]:
|
| 116 |
"""
|
| 117 |
Executa o fluxo de produção do vídeo principal.
|
| 118 |
-
|
| 119 |
-
Args:
|
| 120 |
-
params (ProductionParams): Objeto Pydantic com todos os parâmetros de produção.
|
| 121 |
-
progress_callback (callable, optional): Função para reportar progresso.
|
| 122 |
-
|
| 123 |
-
Returns:
|
| 124 |
-
Tuple[str, List[str], GenerationState]: Uma tupla contendo o caminho do vídeo final,
|
| 125 |
-
a lista de caminhos dos latentes dos fragmentos,
|
| 126 |
-
e o estado de geração completo e atualizado.
|
| 127 |
"""
|
| 128 |
logger.info("Maestro: Iniciando tarefa de Produção do Filme Original.")
|
| 129 |
|
| 130 |
-
# 1. Atualiza o estado com os novos parâmetros
|
| 131 |
self.director.update_parameters("producao", params)
|
| 132 |
|
| 133 |
-
# 2. Delega a produção para o Deformes4DEngine
|
| 134 |
-
# O editor agora recebe o estado completo, que já contém os parâmetros que acabamos de salvar.
|
| 135 |
result_data = self.editor.generate_original_movie(
|
| 136 |
full_generation_state=self.director.get_full_state_as_dict(),
|
| 137 |
progress_callback=progress_callback
|
| 138 |
)
|
| 139 |
|
| 140 |
-
# 3. Atualiza o estado com os resultados da produção
|
| 141 |
self.director.update_video_state(result_data["video_data"])
|
| 142 |
|
| 143 |
-
# 4. Prepara o retorno
|
| 144 |
final_video_path = result_data["final_path"]
|
| 145 |
latent_paths = result_data["latent_paths"]
|
| 146 |
final_state = self.director.get_full_state()
|
|
@@ -148,15 +132,22 @@ class AducOrchestrator:
|
|
| 148 |
logger.info("Maestro: Tarefa de Produção do Filme Original concluída.")
|
| 149 |
return final_video_path, latent_paths, final_state
|
| 150 |
|
| 151 |
-
# --- TAREFAS DE PÓS-PRODUÇÃO (Exemplos) ---
|
| 152 |
-
# (A serem refatoradas no futuro para seguir o mesmo padrão)
|
| 153 |
|
| 154 |
def task_run_hd_mastering(self, source_video_path: str, hd_params: Dict[str, Any], progress_callback: ProgressCallback = None) -> str:
|
| 155 |
-
# Placeholder para futura refatoração
|
| 156 |
logger.info(f"Maestro: Delegando tarefa de masterização HD.")
|
| 157 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 158 |
|
| 159 |
def task_run_audio_generation(self, source_video_path: str, audio_params: Dict[str, Any], progress_callback: ProgressCallback = None) -> str:
|
| 160 |
-
# Placeholder para futura refatoração
|
| 161 |
logger.info(f"Maestro: Delegando tarefa de geração de áudio.")
|
| 162 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2 |
#
|
| 3 |
# Copyright (C) August 4, 2025 Carlos Rodrigues dos Santos
|
| 4 |
#
|
| 5 |
+
# Versão 3.1.0 (Framework Core com Inicialização Centralizada)
|
| 6 |
#
|
| 7 |
# Esta versão representa a camada de orquestração do Aduc Framework.
|
| 8 |
# Ela é agnóstica a qualquer interface (UI ou API) e opera com
|
| 9 |
# tipos de dados bem definidos (Pydantic) e um estado de geração central.
|
| 10 |
+
# Agora, é responsável por inicializar os singletons dos engenheiros.
|
| 11 |
|
| 12 |
import logging
|
| 13 |
from typing import List, Dict, Any, Tuple, Callable, Optional
|
|
|
|
| 14 |
from PIL import Image, ImageOps
|
| 15 |
import os
|
| 16 |
|
| 17 |
# Importa componentes internos do framework
|
| 18 |
from .director import AducDirector
|
| 19 |
from .types import GenerationState, PreProductionParams, ProductionParams
|
| 20 |
+
from .engineers import (
|
| 21 |
+
deformes2d_thinker_singleton,
|
| 22 |
+
deformes3d_engine_singleton,
|
| 23 |
+
deformes7d_engine_singleton,
|
| 24 |
+
Deformes4DEngine
|
| 25 |
+
)
|
| 26 |
|
| 27 |
logger = logging.getLogger(__name__)
|
| 28 |
|
|
|
|
| 43 |
workspace_dir (str): O diretório raiz para salvar todos os artefatos gerados.
|
| 44 |
"""
|
| 45 |
self.director = AducDirector(workspace_dir)
|
| 46 |
+
self.editor = Deformes4DEngine() # Instancia o editor
|
| 47 |
+
self.editor.initialize(workspace_dir) # E o inicializa
|
| 48 |
+
|
| 49 |
+
# Inicializa os singletons globais com a configuração necessária
|
| 50 |
self.painter = deformes3d_engine_singleton
|
| 51 |
+
self.painter.initialize(workspace_dir)
|
| 52 |
+
|
| 53 |
+
self.unified_painter = deformes7d_engine_singleton
|
| 54 |
+
self.unified_painter.initialize(workspace_dir)
|
| 55 |
+
|
| 56 |
logger.info("ADUC Maestro (Framework Core) está no pódio. Engenheiros especialistas prontos.")
|
| 57 |
|
| 58 |
def get_current_state(self) -> GenerationState:
|
|
|
|
| 81 |
def task_pre_production(self, params: PreProductionParams, progress_callback: ProgressCallback = None) -> Tuple[List[str], List[str], GenerationState]:
|
| 82 |
"""
|
| 83 |
Executa o fluxo completo de pré-produção: storyboard e geração de keyframes.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 84 |
"""
|
| 85 |
logger.info("Maestro: Iniciando tarefa de Pré-Produção.")
|
| 86 |
|
|
|
|
| 87 |
self.director.update_parameters("pre_producao", params)
|
| 88 |
|
|
|
|
| 89 |
if progress_callback: progress_callback(0.1, "Gerando storyboard...")
|
| 90 |
|
| 91 |
storyboard_list = deformes2d_thinker_singleton.generate_storyboard(
|
|
|
|
| 95 |
)
|
| 96 |
self.director.update_pre_production_state(params.prompt, params.ref_paths, storyboard_list)
|
| 97 |
|
|
|
|
| 98 |
if progress_callback: progress_callback(0.2, "Iniciando geração de keyframes...")
|
| 99 |
|
|
|
|
| 100 |
keyframes_detailed_data = self.painter.generate_keyframes_from_storyboard(
|
| 101 |
generation_state=self.director.get_full_state_as_dict(),
|
| 102 |
progress_callback=progress_callback
|
| 103 |
)
|
| 104 |
self.director.update_keyframes_state(keyframes_detailed_data)
|
| 105 |
|
|
|
|
| 106 |
final_keyframe_paths = [kf["caminho_pixel"] for kf in keyframes_detailed_data]
|
| 107 |
final_state = self.director.get_full_state()
|
| 108 |
|
|
|
|
| 113 |
def task_produce_original_movie(self, params: ProductionParams, progress_callback: ProgressCallback = None) -> Tuple[str, List[str], GenerationState]:
|
| 114 |
"""
|
| 115 |
Executa o fluxo de produção do vídeo principal.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 116 |
"""
|
| 117 |
logger.info("Maestro: Iniciando tarefa de Produção do Filme Original.")
|
| 118 |
|
|
|
|
| 119 |
self.director.update_parameters("producao", params)
|
| 120 |
|
|
|
|
|
|
|
| 121 |
result_data = self.editor.generate_original_movie(
|
| 122 |
full_generation_state=self.director.get_full_state_as_dict(),
|
| 123 |
progress_callback=progress_callback
|
| 124 |
)
|
| 125 |
|
|
|
|
| 126 |
self.director.update_video_state(result_data["video_data"])
|
| 127 |
|
|
|
|
| 128 |
final_video_path = result_data["final_path"]
|
| 129 |
latent_paths = result_data["latent_paths"]
|
| 130 |
final_state = self.director.get_full_state()
|
|
|
|
| 132 |
logger.info("Maestro: Tarefa de Produção do Filme Original concluída.")
|
| 133 |
return final_video_path, latent_paths, final_state
|
| 134 |
|
| 135 |
+
# --- TAREFAS DE PÓS-PRODUÇÃO (Exemplos para futura refatoração) ---
|
|
|
|
| 136 |
|
| 137 |
def task_run_hd_mastering(self, source_video_path: str, hd_params: Dict[str, Any], progress_callback: ProgressCallback = None) -> str:
|
|
|
|
| 138 |
logger.info(f"Maestro: Delegando tarefa de masterização HD.")
|
| 139 |
+
# Lógica futura:
|
| 140 |
+
# self.director.update_parameters("pos_producao", {"hd_mastering": hd_params})
|
| 141 |
+
# final_path = self.editor.master_video_hd(...)
|
| 142 |
+
# self.director.update_pos_production_results(...)
|
| 143 |
+
# return final_path
|
| 144 |
+
return "" # Placeholder
|
| 145 |
|
| 146 |
def task_run_audio_generation(self, source_video_path: str, audio_params: Dict[str, Any], progress_callback: ProgressCallback = None) -> str:
|
|
|
|
| 147 |
logger.info(f"Maestro: Delegando tarefa de geração de áudio.")
|
| 148 |
+
# Lógica futura:
|
| 149 |
+
# self.director.update_parameters("pos_producao", {"audio_generation": audio_params})
|
| 150 |
+
# final_path = self.editor.generate_audio_for_final_video(...)
|
| 151 |
+
# self.director.update_pos_production_results(...)
|
| 152 |
+
# return final_path
|
| 153 |
+
return "" # Placeholder
|