victorafarias commited on
Commit
411fbac
·
1 Parent(s): b6dfa57

Correções e evoluções

Browse files
Files changed (2) hide show
  1. app.py +33 -6
  2. config.py +1 -1
app.py CHANGED
@@ -65,31 +65,55 @@ def process():
65
  rag_context = get_relevant_context(file_paths, solicitacao_usuario)
66
 
67
  if processing_mode == 'atomic':
 
68
  results = {}
69
  threads = []
70
  def run_chain(chain, inputs, key):
71
- try: results[key] = chain.invoke(inputs)['text']
72
- except Exception as e: results[key] = f"Erro ao processar {key}: {e}"
 
 
 
 
 
 
 
73
 
74
  models = {'grok': grok_llm, 'sonnet': claude_llm, 'gemini': gemini_llm}
75
  prompt = PromptTemplate(template=PROMPT_ATOMICO_INICIAL, input_variables=["solicitacao_usuario", "rag_context"])
76
  yield f"data: {json.dumps({'progress': 15, 'message': 'Iniciando processamento paralelo...'})}\n\n"
 
77
  for name, llm in models.items():
78
  chain = LLMChain(llm=llm, prompt=prompt)
79
  thread = threading.Thread(target=run_chain, args=(chain, {"solicitacao_usuario": solicitacao_usuario, "rag_context": rag_context}, name))
80
  threads.append(thread)
81
  thread.start()
 
82
  for thread in threads:
83
  thread.join()
 
 
 
 
 
 
 
 
 
 
 
84
  yield f"data: {json.dumps({'progress': 80, 'message': 'Todos os modelos responderam. Formatando saída...'})}\n\n"
85
- grok_html = markdown2.markdown(results.get('grok', 'Falha ao obter resposta.'), extras=["fenced-code-blocks", "tables"])
 
86
  yield f"data: {json.dumps({'partial_result': {'id': 'grok-output', 'content': grok_html}})}\n\n"
87
- sonnet_html = markdown2.markdown(results.get('sonnet', 'Falha ao obter resposta.'), extras=["fenced-code-blocks", "tables"])
88
  yield f"data: {json.dumps({'partial_result': {'id': 'sonnet-output', 'content': sonnet_html}})}\n\n"
89
- gemini_html = markdown2.markdown(results.get('gemini', 'Falha ao obter resposta.'), extras=["fenced-code-blocks", "tables"])
90
  yield f"data: {json.dumps({'partial_result': {'id': 'gemini-output', 'content': gemini_html}})}\n\n"
 
91
  yield f"data: {json.dumps({'progress': 100, 'message': 'Processamento Atômico concluído!', 'done': True, 'mode': 'atomic'})}\n\n"
92
  else:
 
93
  yield f"data: {json.dumps({'progress': 15, 'message': 'O GROK está processando sua solicitação com os arquivos...'})}\n\n"
94
  prompt_grok = PromptTemplate(template=PROMPT_HIERARQUICO_GROK, input_variables=["solicitacao_usuario", "rag_context"])
95
  chain_grok = LLMChain(llm=grok_llm, prompt=prompt_grok)
@@ -144,9 +168,12 @@ def merge():
144
  if not resposta_merge or not resposta_merge.strip():
145
  raise ValueError("Falha no serviço de Merge (GROK): Sem resposta.")
146
 
 
 
147
  merge_html = markdown2.markdown(resposta_merge, extras=["fenced-code-blocks", "tables"])
148
 
149
- yield f"data: {json.dumps({'progress': 100, 'message': 'Merge concluído!', 'final_result': {'content': merge_html}, 'done': True})}\n\n"
 
150
 
151
  except Exception as e:
152
  print(f"Erro no processo de merge: {e}")
 
65
  rag_context = get_relevant_context(file_paths, solicitacao_usuario)
66
 
67
  if processing_mode == 'atomic':
68
+ # --- LÓGICA ATÔMICA (PARALELA) CORRIGIDA ---
69
  results = {}
70
  threads = []
71
  def run_chain(chain, inputs, key):
72
+ try:
73
+ result = chain.invoke(inputs)['text']
74
+ # Validação dentro da thread
75
+ if not result or not result.strip():
76
+ results[key] = "Error:EmptyResponse"
77
+ else:
78
+ results[key] = result
79
+ except Exception as e:
80
+ results[key] = f"Erro ao processar {key}: {e}"
81
 
82
  models = {'grok': grok_llm, 'sonnet': claude_llm, 'gemini': gemini_llm}
83
  prompt = PromptTemplate(template=PROMPT_ATOMICO_INICIAL, input_variables=["solicitacao_usuario", "rag_context"])
84
  yield f"data: {json.dumps({'progress': 15, 'message': 'Iniciando processamento paralelo...'})}\n\n"
85
+
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
  for thread in threads:
93
  thread.join()
94
+
95
+ # --- NOVA VALIDAÇÃO APÓS A CONCLUSÃO DAS THREADS ---
96
+ for key, result in results.items():
97
+ if result == "Error:EmptyResponse":
98
+ error_msg = f"Falha no serviço {key.upper()}: Sem resposta."
99
+ yield f"data: {json.dumps({'error': error_msg})}\n\n"
100
+ return # Interrompe o processo
101
+ elif isinstance(result, str) and result.startswith("Erro ao processar"):
102
+ yield f"data: {json.dumps({'error': result})}\n\n"
103
+ return # Interrompe o processo
104
+
105
  yield f"data: {json.dumps({'progress': 80, 'message': 'Todos os modelos responderam. Formatando saída...'})}\n\n"
106
+
107
+ grok_html = markdown2.markdown(results.get('grok', ''), extras=["fenced-code-blocks", "tables"])
108
  yield f"data: {json.dumps({'partial_result': {'id': 'grok-output', 'content': grok_html}})}\n\n"
109
+ sonnet_html = markdown2.markdown(results.get('sonnet', ''), extras=["fenced-code-blocks", "tables"])
110
  yield f"data: {json.dumps({'partial_result': {'id': 'sonnet-output', 'content': sonnet_html}})}\n\n"
111
+ gemini_html = markdown2.markdown(results.get('gemini', ''), extras=["fenced-code-blocks", "tables"])
112
  yield f"data: {json.dumps({'partial_result': {'id': 'gemini-output', 'content': gemini_html}})}\n\n"
113
+
114
  yield f"data: {json.dumps({'progress': 100, 'message': 'Processamento Atômico concluído!', 'done': True, 'mode': 'atomic'})}\n\n"
115
  else:
116
+ # --- LÓGICA HIERÁRQUICA (SEQUENCIAL) ---
117
  yield f"data: {json.dumps({'progress': 15, 'message': 'O GROK está processando sua solicitação com os arquivos...'})}\n\n"
118
  prompt_grok = PromptTemplate(template=PROMPT_HIERARQUICO_GROK, input_variables=["solicitacao_usuario", "rag_context"])
119
  chain_grok = LLMChain(llm=grok_llm, prompt=prompt_grok)
 
168
  if not resposta_merge or not resposta_merge.strip():
169
  raise ValueError("Falha no serviço de Merge (GROK): Sem resposta.")
170
 
171
+ # --- NOVA LÓGICA: CALCULAR PALAVRAS ---
172
+ word_count = len(resposta_merge.split())
173
  merge_html = markdown2.markdown(resposta_merge, extras=["fenced-code-blocks", "tables"])
174
 
175
+ # Envia o resultado final junto com a contagem de palavras
176
+ yield f"data: {json.dumps({'progress': 100, 'message': 'Merge concluído!', 'final_result': {'content': merge_html, 'word_count': word_count}, 'done': True})}\n\n"
177
 
178
  except Exception as e:
179
  print(f"Erro no processo de merge: {e}")
config.py CHANGED
@@ -172,7 +172,7 @@ Com base na solicitação original do usuário e nos textos-base fornecidos, sua
172
  - **Analise o texto:** Verifique a coesão, coerência e profundidade dos argumentos.
173
  - **Consolidação:** Identifique os pontos fortes de cada texto e gere um texto final consolidado. Cuide para o que texto não fique redundante. Ou seja, voltando nos mesmos assuntos e conceitos.
174
  - **Faça Correções:** Corrija eventuais imprecisões conceituais ou argumentativas.
175
- - **Não Resuma ou Reduza:** Seu objetivo é expandir e aprofundar, nunca encurtar o texto. O resultado final deve ser uma versão mais completa e robusta do que a original.
176
  - **Mantenha o Estilo:** Respeite o estilo de linguagem e o tom do texto original.
177
  - **Evite usar um estilo de escrita muito característico de textos gerados com IA, como por exemplo: "Não é mera..., mas é...". Coisas assim. Seja mais direto.
178
  - **Verificar se todo o texto, incluindo citações, estão na lingua Português do Brasil. Traduza as que não estiverem.
 
172
  - **Analise o texto:** Verifique a coesão, coerência e profundidade dos argumentos.
173
  - **Consolidação:** Identifique os pontos fortes de cada texto e gere um texto final consolidado. Cuide para o que texto não fique redundante. Ou seja, voltando nos mesmos assuntos e conceitos.
174
  - **Faça Correções:** Corrija eventuais imprecisões conceituais ou argumentativas.
175
+ - **Não Resuma ou Reduza o texto:** Seu objetivo é expandir e aprofundar, nunca encurtar o texto. O resultado final deve ser uma versão mais completa e robusta do que a original, e deve obedecer o mínimo de 4000 palavras.
176
  - **Mantenha o Estilo:** Respeite o estilo de linguagem e o tom do texto original.
177
  - **Evite usar um estilo de escrita muito característico de textos gerados com IA, como por exemplo: "Não é mera..., mas é...". Coisas assim. Seja mais direto.
178
  - **Verificar se todo o texto, incluindo citações, estão na lingua Português do Brasil. Traduza as que não estiverem.