victorafarias commited on
Commit
9301d0e
·
1 Parent(s): 0e0a17d

Correção do Processamento Paralelo

Browse files
Files changed (1) hide show
  1. app.py +26 -26
app.py CHANGED
@@ -49,11 +49,14 @@ def process():
49
  solicitacao_usuario = form_data.get('solicitacao', '')
50
 
51
  if current_mode == 'test':
52
- # Lógica de simulação (simplificada para focar na lógica real)
53
  mock_text = form_data.get('mock_text', 'Este é um texto de simulação.')
54
  mock_html = markdown2.markdown(mock_text, extras=["fenced-code-blocks", "tables"])
55
  yield f"data: {json.dumps({'progress': 100, 'message': 'Simulação concluída!', 'partial_result': {'id': 'grok-output', 'content': mock_html}, 'done': True, 'mode': 'atomic' if processing_mode == 'atomic' else 'hierarchical'})}\n\n"
56
-
 
 
 
 
57
  else:
58
  if not solicitacao_usuario:
59
  yield f"data: {json.dumps({'error': 'Solicitação não fornecida.'})}\n\n"
@@ -64,7 +67,7 @@ def process():
64
  rag_context = get_relevant_context(file_paths, solicitacao_usuario)
65
 
66
  if processing_mode == 'atomic':
67
- # --- LÓGICA ATÔMICA (PARALELA) ---
68
  results = {}
69
  threads = []
70
 
@@ -74,37 +77,38 @@ def process():
74
  except Exception as e:
75
  results[key] = f"Erro ao processar {key}: {e}"
76
 
77
- # Configurar e iniciar threads
78
  models = {'grok': grok_llm, 'sonnet': claude_llm, 'gemini': gemini_llm}
79
  prompt = PromptTemplate(template=PROMPT_ATOMICO_INICIAL, input_variables=["solicitacao_usuario", "rag_context"])
80
 
 
 
 
81
  for name, llm in models.items():
82
  chain = LLMChain(llm=llm, prompt=prompt)
83
  thread = threading.Thread(target=run_chain, args=(chain, {"solicitacao_usuario": solicitacao_usuario, "rag_context": rag_context}, name))
84
  threads.append(thread)
85
  thread.start()
86
 
87
- # Monitorar e enviar resultados conforme chegam
88
- completed_threads = 0
89
- while completed_threads < len(threads):
90
- for i, thread in enumerate(threads):
91
- key = list(models.keys())[i]
92
- if not thread.is_alive() and key not in results:
93
- # Se a thread terminou mas não resultado, algo deu errado
94
- results[key] = f"Falha na thread para {key}."
95
-
96
- if key in results:
97
- html_content = markdown2.markdown(results[key], extras=["fenced-code-blocks", "tables"])
98
- yield f"data: {json.dumps({'progress': int((len(results)/len(threads))*100), 'message': f'Modelo {key.upper()} concluiu.', 'partial_result': {'id': f'{key}-output', 'content': html_content}})}\n\n"
99
- threads.pop(i) # Remove para não processar de novo
100
- completed_threads += 1
101
- time.sleep(1)
102
 
103
  yield f"data: {json.dumps({'progress': 100, 'message': 'Processamento Atômico concluído!', 'done': True, 'mode': 'atomic'})}\n\n"
104
 
105
  else:
106
  # --- LÓGICA HIERÁRQUICA (SEQUENCIAL) ---
107
- # (Mesma lógica de antes, com nomes de prompts atualizados)
108
  yield f"data: {json.dumps({'progress': 15, 'message': 'O GROK está processando sua solicitação com os arquivos...'})}\n\n"
109
  prompt_grok = PromptTemplate(template=PROMPT_HIERARQUICO_GROK, input_variables=["solicitacao_usuario", "rag_context"])
110
  chain_grok = LLMChain(llm=grok_llm, prompt=prompt_grok)
@@ -134,19 +138,16 @@ def process():
134
 
135
  return Response(generate_stream(mode, form_data, temp_file_paths), mimetype='text/event-stream')
136
 
137
- # --- NOVA ROTA PARA O MERGE ---
138
  @app.route('/merge', methods=['POST'])
139
  def merge():
140
  data = request.get_json()
141
  try:
142
- # Cria o prompt e a chain para o merge
143
  prompt_merge = PromptTemplate(template=PROMPT_ATOMICO_MERGE, input_variables=["solicitacao_usuario", "texto_para_analise_grok", "texto_para_analise_sonnet", "texto_para_analise_gemini"])
144
 
145
- # O merge será feito pelo Claude Sonnet com limite de tokens alto
146
- claude_with_max_tokens = claude_llm.bind(max_tokens=8000)
147
  chain_merge = LLMChain(llm=claude_with_max_tokens, prompt=prompt_merge)
148
 
149
- # Invoca a chain com os dados recebidos
150
  resposta_merge = chain_merge.invoke({
151
  "solicitacao_usuario": data.get('solicitacao_usuario'),
152
  "texto_para_analise_grok": data.get('grok_text'),
@@ -157,7 +158,6 @@ def merge():
157
  if not resposta_merge or not resposta_merge.strip():
158
  raise ValueError("Falha no serviço de Merge (Claude Sonnet): Sem resposta.")
159
 
160
- # Retorna o resultado como HTML
161
  merge_html = markdown2.markdown(resposta_merge, extras=["fenced-code-blocks", "tables"])
162
  return jsonify({"success": True, "content": merge_html})
163
 
 
49
  solicitacao_usuario = form_data.get('solicitacao', '')
50
 
51
  if current_mode == 'test':
 
52
  mock_text = form_data.get('mock_text', 'Este é um texto de simulação.')
53
  mock_html = markdown2.markdown(mock_text, extras=["fenced-code-blocks", "tables"])
54
  yield f"data: {json.dumps({'progress': 100, 'message': 'Simulação concluída!', 'partial_result': {'id': 'grok-output', 'content': mock_html}, 'done': True, 'mode': 'atomic' if processing_mode == 'atomic' else 'hierarchical'})}\n\n"
55
+ # Simula o preenchimento de todas as caixas no modo teste
56
+ if processing_mode == 'atomic':
57
+ yield f"data: {json.dumps({'partial_result': {'id': 'sonnet-output', 'content': mock_html}})}\n\n"
58
+ yield f"data: {json.dumps({'partial_result': {'id': 'gemini-output', 'content': mock_html}})}\n\n"
59
+
60
  else:
61
  if not solicitacao_usuario:
62
  yield f"data: {json.dumps({'error': 'Solicitação não fornecida.'})}\n\n"
 
67
  rag_context = get_relevant_context(file_paths, solicitacao_usuario)
68
 
69
  if processing_mode == 'atomic':
70
+ # --- LÓGICA ATÔMICA (PARALELA) CORRIGIDA ---
71
  results = {}
72
  threads = []
73
 
 
77
  except Exception as e:
78
  results[key] = f"Erro ao processar {key}: {e}"
79
 
 
80
  models = {'grok': grok_llm, 'sonnet': claude_llm, 'gemini': gemini_llm}
81
  prompt = PromptTemplate(template=PROMPT_ATOMICO_INICIAL, input_variables=["solicitacao_usuario", "rag_context"])
82
 
83
+ yield f"data: {json.dumps({'progress': 15, 'message': 'Iniciando processamento paralelo...'})}\n\n"
84
+
85
+ # 1. Inicia todas as threads
86
  for name, llm in models.items():
87
  chain = LLMChain(llm=llm, prompt=prompt)
88
  thread = threading.Thread(target=run_chain, args=(chain, {"solicitacao_usuario": solicitacao_usuario, "rag_context": rag_context}, name))
89
  threads.append(thread)
90
  thread.start()
91
 
92
+ # 2. Aguarda a conclusão de todas as threads
93
+ for thread in threads:
94
+ thread.join()
95
+
96
+ yield f"data: {json.dumps({'progress': 80, 'message': 'Todos os modelos responderam. Formatando saída...'})}\n\n"
97
+
98
+ # 3. Envia todos os resultados de uma vez, agora que estão prontos
99
+ grok_html = markdown2.markdown(results.get('grok', 'Falha ao obter resposta.'), extras=["fenced-code-blocks", "tables"])
100
+ yield f"data: {json.dumps({'partial_result': {'id': 'grok-output', 'content': grok_html}})}\n\n"
101
+
102
+ sonnet_html = markdown2.markdown(results.get('sonnet', 'Falha ao obter resposta.'), extras=["fenced-code-blocks", "tables"])
103
+ yield f"data: {json.dumps({'partial_result': {'id': 'sonnet-output', 'content': sonnet_html}})}\n\n"
104
+
105
+ gemini_html = markdown2.markdown(results.get('gemini', 'Falha ao obter resposta.'), extras=["fenced-code-blocks", "tables"])
106
+ yield f"data: {json.dumps({'partial_result': {'id': 'gemini-output', 'content': gemini_html}})}\n\n"
107
 
108
  yield f"data: {json.dumps({'progress': 100, 'message': 'Processamento Atômico concluído!', 'done': True, 'mode': 'atomic'})}\n\n"
109
 
110
  else:
111
  # --- LÓGICA HIERÁRQUICA (SEQUENCIAL) ---
 
112
  yield f"data: {json.dumps({'progress': 15, 'message': 'O GROK está processando sua solicitação com os arquivos...'})}\n\n"
113
  prompt_grok = PromptTemplate(template=PROMPT_HIERARQUICO_GROK, input_variables=["solicitacao_usuario", "rag_context"])
114
  chain_grok = LLMChain(llm=grok_llm, prompt=prompt_grok)
 
138
 
139
  return Response(generate_stream(mode, form_data, temp_file_paths), mimetype='text/event-stream')
140
 
141
+ # --- ROTA PARA O MERGE ---
142
  @app.route('/merge', methods=['POST'])
143
  def merge():
144
  data = request.get_json()
145
  try:
 
146
  prompt_merge = PromptTemplate(template=PROMPT_ATOMICO_MERGE, input_variables=["solicitacao_usuario", "texto_para_analise_grok", "texto_para_analise_sonnet", "texto_para_analise_gemini"])
147
 
148
+ claude_with_max_tokens = claude_llm.bind(max_tokens=12000)
 
149
  chain_merge = LLMChain(llm=claude_with_max_tokens, prompt=prompt_merge)
150
 
 
151
  resposta_merge = chain_merge.invoke({
152
  "solicitacao_usuario": data.get('solicitacao_usuario'),
153
  "texto_para_analise_grok": data.get('grok_text'),
 
158
  if not resposta_merge or not resposta_merge.strip():
159
  raise ValueError("Falha no serviço de Merge (Claude Sonnet): Sem resposta.")
160
 
 
161
  merge_html = markdown2.markdown(resposta_merge, extras=["fenced-code-blocks", "tables"])
162
  return jsonify({"success": True, "content": merge_html})
163