Spaces:
Sleeping
Sleeping
Commit
·
411fbac
1
Parent(s):
b6dfa57
Correções e evoluções
Browse files
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:
|
| 72 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
|
|
|
| 86 |
yield f"data: {json.dumps({'partial_result': {'id': 'grok-output', 'content': grok_html}})}\n\n"
|
| 87 |
-
sonnet_html = markdown2.markdown(results.get('sonnet', '
|
| 88 |
yield f"data: {json.dumps({'partial_result': {'id': 'sonnet-output', 'content': sonnet_html}})}\n\n"
|
| 89 |
-
gemini_html = markdown2.markdown(results.get('gemini', '
|
| 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 |
-
|
|
|
|
| 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.
|