Carlex22 commited on
Commit
ed5f314
·
1 Parent(s): 0c915a9

ParaAIV3.1

Browse files
config/pipeline_config.yaml CHANGED
@@ -59,4 +59,4 @@ global_config:
59
  batch_size: 50
60
  enable_retry: true
61
  max_retries: 3
62
- retry_delay: 2
 
59
  batch_size: 50
60
  enable_retry: true
61
  max_retries: 3
62
+ retry_delay: 2
core/__init__.py CHANGED
@@ -4,15 +4,15 @@ Core Module - Componentes principais da pipeline V13.6
4
  """
5
 
6
  from .orchestrator import PipelineOrchestrator
7
- from .base_specialist import BaseSpecialist
8
  from .context_builder import ContextBuilder
9
  from .validator import SchemaValidator
 
10
 
11
  __all__ = [
12
  'PipelineOrchestrator',
13
- 'BaseSpecialist',
14
  'ContextBuilder',
15
- 'SchemaValidator'
 
16
  ]
17
 
18
  __version__ = "13.6.0"
 
4
  """
5
 
6
  from .orchestrator import PipelineOrchestrator
 
7
  from .context_builder import ContextBuilder
8
  from .validator import SchemaValidator
9
+ from .specialist_wrapper import SpecialistWrapper
10
 
11
  __all__ = [
12
  'PipelineOrchestrator',
 
13
  'ContextBuilder',
14
+ 'SchemaValidator',
15
+ 'SpecialistWrapper'
16
  ]
17
 
18
  __version__ = "13.6.0"
core/specialist_wrapper.py ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ##PARA.AI/core/specialist_wrapper.py
2
+ """
3
+ Specialist Wrapper - Adaptador de compatibilidade V13.1 → V13.6
4
+ Permite que ProcessorBase antigo funcione com novo PipelineOrchestrator
5
+ """
6
+ import logging
7
+ from typing import Dict, Any, Optional
8
+
9
+ logger = logging.getLogger(__name__)
10
+
11
+
12
+ class SpecialistWrapper:
13
+ """
14
+ Wrapper para adaptar ProcessorBase V13.1 ao novo formato V13.6
15
+
16
+ PROBLEMA:
17
+ - V13.1: processor.process(acordao_data)
18
+ - V13.6: specialist.process(input_data=..., context=...)
19
+
20
+ SOLUÇÃO:
21
+ - Wrapper adapta a chamada mantendo compatibilidade
22
+ """
23
+
24
+ def __init__(self, processor_v13_1, specialist_id: int):
25
+ """
26
+ Args:
27
+ processor_v13_1: Instância de ProcessorBase (V13.1)
28
+ specialist_id: ID do especialista (1-7)
29
+ """
30
+ self.processor = processor_v13_1
31
+ self.id = specialist_id
32
+ self.name = processor_v13_1.__class__.__name__
33
+
34
+ logger.info(f"🔄 SpecialistWrapper criado para {self.name} (ID {self.id})")
35
+
36
+ async def process(
37
+ self,
38
+ input_data: Dict[str, Any],
39
+ context: Optional[Dict[str, Any]] = None
40
+ ) -> Dict[str, Any]:
41
+ """
42
+ Adapta chamada V13.6 → V13.1
43
+
44
+ Args:
45
+ input_data: Dados do acórdão (formato V13.6)
46
+ context: Contexto de especialistas anteriores (IGNORADO no V13.1)
47
+
48
+ Returns:
49
+ Resultado do processador V13.1
50
+ """
51
+ logger.debug(f"🔄 Wrapper adaptando chamada para {self.name}")
52
+
53
+ # ADAPTAÇÃO: V13.1 espera apenas acordao_data como argumento posicional
54
+ try:
55
+ # Chamar processor.process() com assinatura V13.1
56
+ result = await self.processor.process(input_data)
57
+
58
+ # Processar resultado
59
+ if result:
60
+ logger.debug(f"✅ {self.name} retornou resultado")
61
+ return result
62
+ else:
63
+ logger.warning(f"⚠️ {self.name} retornou None")
64
+ return {}
65
+
66
+ except Exception as e:
67
+ logger.error(f"❌ Erro no wrapper de {self.name}: {e}")
68
+ return {}
69
+
70
+ def __repr__(self):
71
+ return f"SpecialistWrapper({self.name}, ID={self.id})"
processors/processor_manager.py CHANGED
@@ -1,7 +1,7 @@
1
  ##PARA.AI/processors/processor_manager.py
2
  """
3
  Processor Manager - REFATORADO para usar PipelineOrchestrator V13.6
4
- MUDANÇA: Este arquivo agora é apenas um wrapper para manter compatibilidade
5
  """
6
  import logging
7
  import yaml
@@ -9,8 +9,9 @@ from typing import Dict, Any, List, Optional
9
 
10
  from core.orchestrator import PipelineOrchestrator
11
  from core.validator import SchemaValidator
 
12
 
13
- # Importar especialistas (mantidos do V13.1, serão refatorados na FASE 2)
14
  from processors.processor_metadados import ProcessorMetadados
15
  from processors.processor_segmentacao import ProcessorSegmentacao
16
  from processors.processor_relatorio import ProcessorRelatorio
@@ -25,11 +26,11 @@ logger = logging.getLogger(__name__)
25
  class ProcessorManager:
26
  """
27
  Gerenciador de processadores - WRAPPER para PipelineOrchestrator
28
-
29
  MUDANÇA V13.6:
30
- - Este arquivo agora delega para PipelineOrchestrator
31
- - Mantém compatibilidade com código existente
32
- - Especialistas serão migrados gradualmente para novo formato
33
  """
34
 
35
  def __init__(self, llm_manager, max_workers: int = 3):
@@ -42,11 +43,17 @@ class ProcessorManager:
42
  self.max_workers = max_workers
43
 
44
  # Carregar configuração da pipeline
45
- with open('config/pipeline_config.yaml', 'r', encoding='utf-8') as f:
46
- self.pipeline_config = yaml.safe_load(f)
 
 
 
 
 
47
 
48
- # Inicializar especialistas (mapeamento temporário V13.1 → V13.6)
49
- self.specialists = {
 
50
  1: ProcessorSegmentacao(llm_manager), # Segmentador
51
  2: ProcessorMetadados(llm_manager), # Metadados
52
  3: ProcessorContexto(llm_manager), # Classificador (renomear depois)
@@ -56,6 +63,11 @@ class ProcessorManager:
56
  7: ProcessorArquivo(llm_manager), # Arquivista
57
  }
58
 
 
 
 
 
 
59
  # Inicializar orquestrador V13.6
60
  self.orchestrator = PipelineOrchestrator(
61
  config=self.pipeline_config,
@@ -64,9 +76,27 @@ class ProcessorManager:
64
  )
65
 
66
  logger.info(
67
- f"✅ ProcessorManager V13.6: Orquestração refatorada com {len(self.specialists)} especialistas"
 
68
  )
69
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
  async def process_acordao_sequential(
71
  self,
72
  acordao_data: Dict[str, Any],
@@ -74,19 +104,24 @@ class ProcessorManager:
74
  ) -> Dict[str, Any]:
75
  """
76
  Processa acórdão sequencialmente (compatibilidade V13.1)
77
-
78
- MUDANÇA: Delega para PipelineOrchestrator
 
 
 
 
 
79
  """
80
- logger.info("🔄 process_acordao_sequential() → delegando para PipelineOrchestrator")
81
-
82
- # Se specialist_ids fornecido, processar apenas fases específicas
83
  if specialist_ids:
84
  fase_inicial = min(specialist_ids)
85
  fase_final = max(specialist_ids)
86
  else:
87
  fase_inicial = 1
88
  fase_final = 6
89
-
90
  return await self.orchestrator.process_acordao(
91
  acordao_bruto=acordao_data,
92
  fase_inicial=fase_inicial,
@@ -100,17 +135,41 @@ class ProcessorManager:
100
  ) -> Dict[str, Any]:
101
  """
102
  Processa acórdão em paralelo (compatibilidade V13.1)
103
-
104
- MUDANÇA: Paralelo é controlado por fase no V13.6
105
  """
106
- logger.info("🔄 process_acordao_parallel() → delegando para PipelineOrchestrator")
107
-
108
  return await self.orchestrator.process_acordao(
109
  acordao_bruto=acordao_data,
110
  fase_inicial=1,
111
  fase_final=6
112
  )
113
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
114
  def get_processor(self, specialist_id: int):
115
  """Retorna especialista específico (compatibilidade V13.1)"""
116
  return self.specialists.get(specialist_id)
@@ -121,4 +180,4 @@ class ProcessorManager:
121
 
122
  def get_processors_info(self) -> Dict[str, Any]:
123
  """Retorna informações sobre todos os especialistas"""
124
- return self.orchestrator.get_pipeline_status()
 
1
  ##PARA.AI/processors/processor_manager.py
2
  """
3
  Processor Manager - REFATORADO para usar PipelineOrchestrator V13.6
4
+ MUDANÇA: Usa SpecialistWrapper para compatibilidade com ProcessorBase V13.1
5
  """
6
  import logging
7
  import yaml
 
9
 
10
  from core.orchestrator import PipelineOrchestrator
11
  from core.validator import SchemaValidator
12
+ from core.specialist_wrapper import SpecialistWrapper
13
 
14
+ # Importar processadores V13.1 (serão refatorados na FASE 2)
15
  from processors.processor_metadados import ProcessorMetadados
16
  from processors.processor_segmentacao import ProcessorSegmentacao
17
  from processors.processor_relatorio import ProcessorRelatorio
 
26
  class ProcessorManager:
27
  """
28
  Gerenciador de processadores - WRAPPER para PipelineOrchestrator
29
+
30
  MUDANÇA V13.6:
31
+ - Delega para PipelineOrchestrator
32
+ - Usa SpecialistWrapper para adaptar ProcessorBase V13.1
33
+ - Mantém compatibilidade total com código existente
34
  """
35
 
36
  def __init__(self, llm_manager, max_workers: int = 3):
 
43
  self.max_workers = max_workers
44
 
45
  # Carregar configuração da pipeline
46
+ try:
47
+ with open('config/pipeline_config.yaml', 'r', encoding='utf-8') as f:
48
+ self.pipeline_config = yaml.safe_load(f)
49
+ except FileNotFoundError:
50
+ # Fallback: usar config padrão se arquivo não existir
51
+ logger.warning("⚠️ config/pipeline_config.yaml não encontrado, usando config padrão")
52
+ self.pipeline_config = self._get_default_config()
53
 
54
+ # Inicializar processadores V13.1
55
+ logger.info("🔄 Inicializando processadores V13.1...")
56
+ processor_instances = {
57
  1: ProcessorSegmentacao(llm_manager), # Segmentador
58
  2: ProcessorMetadados(llm_manager), # Metadados
59
  3: ProcessorContexto(llm_manager), # Classificador (renomear depois)
 
63
  7: ProcessorArquivo(llm_manager), # Arquivista
64
  }
65
 
66
+ # Envolver cada processador em SpecialistWrapper
67
+ self.specialists = {}
68
+ for spec_id, processor in processor_instances.items():
69
+ self.specialists[spec_id] = SpecialistWrapper(processor, spec_id)
70
+
71
  # Inicializar orquestrador V13.6
72
  self.orchestrator = PipelineOrchestrator(
73
  config=self.pipeline_config,
 
76
  )
77
 
78
  logger.info(
79
+ f"✅ ProcessorManager V13.6: {len(self.specialists)} especialistas "
80
+ f"com SpecialistWrapper (compatibilidade V13.1)"
81
  )
82
 
83
+ def _get_default_config(self) -> Dict[str, Any]:
84
+ """Retorna configuração padrão caso YAML não exista"""
85
+ return {
86
+ 'pipeline': {
87
+ 'name': 'Para.AI V13.6 Pipeline',
88
+ 'version': 'v13.6',
89
+ 'phases': [
90
+ {'id': 1, 'name': 'Segmentação', 'parallel': False, 'specialists': [1], 'depends_on': []},
91
+ {'id': 2, 'name': 'Metadados', 'parallel': False, 'specialists': [2], 'depends_on': [1]},
92
+ {'id': 3, 'name': 'Classificação', 'parallel': False, 'specialists': [3], 'depends_on': [2]},
93
+ {'id': 4, 'name': 'Tripartite', 'parallel': True, 'specialists': [4, 5, 6], 'depends_on': [1, 2, 3]},
94
+ {'id': 5, 'name': 'Arquivista', 'parallel': False, 'specialists': [7], 'depends_on': [4]},
95
+ {'id': 6, 'name': 'Validação', 'parallel': False, 'specialists': [], 'depends_on': [5]},
96
+ ]
97
+ }
98
+ }
99
+
100
  async def process_acordao_sequential(
101
  self,
102
  acordao_data: Dict[str, Any],
 
104
  ) -> Dict[str, Any]:
105
  """
106
  Processa acórdão sequencialmente (compatibilidade V13.1)
107
+
108
+ Args:
109
+ acordao_data: Dados do acórdão
110
+ specialist_ids: IDs dos especialistas (None = todos)
111
+
112
+ Returns:
113
+ Resultado completo da pipeline
114
  """
115
+ logger.info("🔄 process_acordao_sequential() → PipelineOrchestrator")
116
+
117
+ # Determinar fases a executar
118
  if specialist_ids:
119
  fase_inicial = min(specialist_ids)
120
  fase_final = max(specialist_ids)
121
  else:
122
  fase_inicial = 1
123
  fase_final = 6
124
+
125
  return await self.orchestrator.process_acordao(
126
  acordao_bruto=acordao_data,
127
  fase_inicial=fase_inicial,
 
135
  ) -> Dict[str, Any]:
136
  """
137
  Processa acórdão em paralelo (compatibilidade V13.1)
138
+
139
+ NOTA: Paralelismo é controlado por fase no V13.6 (FASE 4)
140
  """
141
+ logger.info("🔄 process_acordao_parallel() → PipelineOrchestrator")
142
+
143
  return await self.orchestrator.process_acordao(
144
  acordao_bruto=acordao_data,
145
  fase_inicial=1,
146
  fase_final=6
147
  )
148
 
149
+ async def process_acordao_batch(
150
+ self,
151
+ acordaos_data: List[Dict[str, Any]],
152
+ specialist_ids: Optional[List[int]] = None
153
+ ) -> List[Dict[str, Any]]:
154
+ """
155
+ Processa múltiplos acórdãos em batch (compatibilidade V13.1)
156
+
157
+ Args:
158
+ acordaos_data: Lista de acórdãos
159
+ specialist_ids: IDs dos especialistas (None = todos)
160
+
161
+ Returns:
162
+ Lista de resultados
163
+ """
164
+ logger.info(f"🔄 process_acordao_batch() com {len(acordaos_data)} acórdãos")
165
+
166
+ results = []
167
+ for acordao in acordaos_data:
168
+ result = await self.process_acordao_sequential(acordao, specialist_ids)
169
+ results.append(result)
170
+
171
+ return results
172
+
173
  def get_processor(self, specialist_id: int):
174
  """Retorna especialista específico (compatibilidade V13.1)"""
175
  return self.specialists.get(specialist_id)
 
180
 
181
  def get_processors_info(self) -> Dict[str, Any]:
182
  """Retorna informações sobre todos os especialistas"""
183
+ return self.orchestrator.get_pipeline_status()