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
- try:
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
- # --- Singleton Instantiation ---
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.0.0 (Framework Core)
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 deformes2d_thinker_singleton, deformes3d_engine_singleton, Deformes4DEngine
 
 
 
 
 
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
- # O Deformes4D é instanciado aqui pois não é um singleton complexo
42
- self.editor = Deformes4DEngine(workspace_dir)
 
 
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
- return ""
 
 
 
 
 
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
- return ""
 
 
 
 
 
 
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