victorafarias commited on
Commit
081aae5
·
1 Parent(s): 283dd8f

Correções e evoluções

Browse files
Files changed (1) hide show
  1. app.py +14 -41
app.py CHANGED
@@ -1,14 +1,13 @@
1
  # app.py
2
 
3
  from flask import Flask, render_template, request, Response
4
- import markdown2
5
  import json
6
  import time
7
  import os
8
  import uuid
9
  import threading
10
  import concurrent.futures
11
- import re # Importação para expressões regulares
12
 
13
  # Importações do LangChain
14
  from langchain.prompts import PromptTemplate
@@ -31,15 +30,6 @@ if not os.path.exists('uploads'):
31
 
32
  app.config['MAX_CONTENT_LENGTH'] = 100 * 1024 * 1024
33
 
34
- def is_html_empty(html: str) -> bool:
35
- """Verifica se uma string HTML não contém texto visível."""
36
- if not html:
37
- return True
38
- # Remove todas as tags HTML
39
- text_only = re.sub('<[^<]+?>', '', html)
40
- # Verifica se o texto restante é apenas espaço em branco
41
- return not text_only.strip()
42
-
43
  @app.route('/')
44
  def index():
45
  """Renderiza a página inicial da aplicação."""
@@ -68,7 +58,7 @@ def process():
68
 
69
  if current_mode == 'test':
70
  mock_text = form_data.get('mock_text', 'Este é um texto de simulação.')
71
- mock_html = markdown2.markdown(mock_text, extras=["fenced-code-blocks", "tables"])
72
  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"
73
  if processing_mode == 'atomic':
74
  yield f"data: {json.dumps({'partial_result': {'id': 'sonnet-output', 'content': mock_html}})}\n\n"
@@ -104,7 +94,6 @@ def process():
104
  except Exception as e:
105
  results[key] = f"Erro ao processar {key.upper()}: {e}"
106
 
107
- # ✅ CORREÇÃO: Aumenta o max_tokens para o Claude Sonnet também no modo atômico
108
  claude_atomic_llm = claude_llm.bind(max_tokens=20000)
109
  models = {'grok': grok_llm, 'sonnet': claude_atomic_llm, 'gemini': gemini_llm}
110
 
@@ -128,26 +117,15 @@ def process():
128
 
129
  yield f"data: {json.dumps({'progress': 80, 'message': 'Todos os modelos responderam. Formatando saídas...'})}\n\n"
130
 
131
- # GROK
132
  grok_text = results.get('grok', '')
133
- grok_html = markdown2.markdown(grok_text, extras=["fenced-code-blocks", "tables"])
134
- if is_html_empty(grok_html):
135
- grok_html = f"<pre>{grok_text}</pre>"
136
- yield f"data: {json.dumps({'partial_result': {'id': 'grok-output', 'content': grok_html}})}\n\n"
137
 
138
- # SONNET
139
  sonnet_text = results.get('sonnet', '')
140
- sonnet_html = markdown2.markdown(sonnet_text, extras=["fenced-code-blocks", "tables"])
141
- if is_html_empty(sonnet_html):
142
- sonnet_html = f"<pre>{sonnet_text}</pre>"
143
- yield f"data: {json.dumps({'partial_result': {'id': 'sonnet-output', 'content': sonnet_html}})}\n\n"
144
 
145
- # GEMINI
146
  gemini_text = results.get('gemini', '')
147
- gemini_html = markdown2.markdown(gemini_text, extras=["fenced-code-blocks", "tables"])
148
- if is_html_empty(gemini_html):
149
- gemini_html = f"<pre>{gemini_text}</pre>"
150
- yield f"data: {json.dumps({'partial_result': {'id': 'gemini-output', 'content': gemini_html}})}\n\n"
151
 
152
  yield f"data: {json.dumps({'progress': 100, 'message': 'Processamento Atômico concluído!', 'done': True, 'mode': 'atomic'})}\n\n"
153
 
@@ -162,10 +140,8 @@ def process():
162
  yield f"data: {json.dumps({'error': 'Falha no serviço GROK: Sem resposta.'})}\n\n"
163
  return
164
 
165
- grok_html = markdown2.markdown(resposta_grok, extras=["fenced-code-blocks", "tables"])
166
- if is_html_empty(grok_html):
167
- grok_html = f"<pre>{resposta_grok}</pre>"
168
- yield f"data: {json.dumps({'progress': 33, 'message': 'Claude Sonnet está processando...', 'partial_result': {'id': 'grok-output', 'content': grok_html}})}\n\n"
169
 
170
  prompt_sonnet = PromptTemplate(template=PROMPT_HIERARQUICO_SONNET, input_variables=["solicitacao_usuario", "texto_para_analise"])
171
  claude_with_max_tokens = claude_llm.bind(max_tokens=20000)
@@ -176,10 +152,8 @@ def process():
176
  yield f"data: {json.dumps({'error': 'Falha no serviço Claude Sonnet: Sem resposta.'})}\n\n"
177
  return
178
 
179
- sonnet_html = markdown2.markdown(resposta_sonnet, extras=["fenced-code-blocks", "tables"])
180
- if is_html_empty(sonnet_html):
181
- sonnet_html = f"<pre>{resposta_sonnet}</pre>"
182
- yield f"data: {json.dumps({'progress': 66, 'message': 'Gemini está processando...', 'partial_result': {'id': 'sonnet-output', 'content': sonnet_html}})}\n\n"
183
 
184
  prompt_gemini = PromptTemplate(template=PROMPT_HIERARQUICO_GEMINI, input_variables=["solicitacao_usuario", "texto_para_analise"])
185
  chain_gemini = LLMChain(llm=gemini_llm, prompt=prompt_gemini)
@@ -189,10 +163,8 @@ def process():
189
  yield f"data: {json.dumps({'error': 'Falha no serviço Gemini: Sem resposta.'})}\n\n"
190
  return
191
 
192
- gemini_html = markdown2.markdown(resposta_gemini, extras=["fenced-code-blocks", "tables"])
193
- if is_html_empty(gemini_html):
194
- gemini_html = f"<pre>{resposta_gemini}</pre>"
195
- yield f"data: {json.dumps({'progress': 100, 'message': 'Processamento concluído!', 'partial_result': {'id': 'gemini-output', 'content': gemini_html}, 'done': True, 'mode': 'hierarchical'})}\n\n"
196
 
197
  except Exception as e:
198
  print(f"Ocorreu um erro durante o processamento: {e}")
@@ -227,7 +199,8 @@ def merge():
227
  return
228
 
229
  word_count = len(resposta_merge.split())
230
- merge_html = markdown2.markdown(resposta_merge, extras=["fenced-code-blocks", "tables"])
 
231
 
232
  yield f"data: {json.dumps({'progress': 100, 'message': 'Merge concluído!', 'final_result': {'content': merge_html, 'word_count': word_count}, 'done': True})}\n\n"
233
 
 
1
  # app.py
2
 
3
  from flask import Flask, render_template, request, Response
 
4
  import json
5
  import time
6
  import os
7
  import uuid
8
  import threading
9
  import concurrent.futures
10
+ from html import escape # Importa a função escape para segurança
11
 
12
  # Importações do LangChain
13
  from langchain.prompts import PromptTemplate
 
30
 
31
  app.config['MAX_CONTENT_LENGTH'] = 100 * 1024 * 1024
32
 
 
 
 
 
 
 
 
 
 
33
  @app.route('/')
34
  def index():
35
  """Renderiza a página inicial da aplicação."""
 
58
 
59
  if current_mode == 'test':
60
  mock_text = form_data.get('mock_text', 'Este é um texto de simulação.')
61
+ mock_html = f"<pre>{escape(mock_text)}</pre>"
62
  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"
63
  if processing_mode == 'atomic':
64
  yield f"data: {json.dumps({'partial_result': {'id': 'sonnet-output', 'content': mock_html}})}\n\n"
 
94
  except Exception as e:
95
  results[key] = f"Erro ao processar {key.upper()}: {e}"
96
 
 
97
  claude_atomic_llm = claude_llm.bind(max_tokens=20000)
98
  models = {'grok': grok_llm, 'sonnet': claude_atomic_llm, 'gemini': gemini_llm}
99
 
 
117
 
118
  yield f"data: {json.dumps({'progress': 80, 'message': 'Todos os modelos responderam. Formatando saídas...'})}\n\n"
119
 
120
+ # ✅ MUDANÇA: Exibe texto bruto pré-formatado
121
  grok_text = results.get('grok', '')
122
+ yield f"data: {json.dumps({'partial_result': {'id': 'grok-output', 'content': f'<pre>{escape(grok_text)}</pre>'}})}\n\n"
 
 
 
123
 
 
124
  sonnet_text = results.get('sonnet', '')
125
+ yield f"data: {json.dumps({'partial_result': {'id': 'sonnet-output', 'content': f'<pre>{escape(sonnet_text)}</pre>'}})}\n\n"
 
 
 
126
 
 
127
  gemini_text = results.get('gemini', '')
128
+ yield f"data: {json.dumps({'partial_result': {'id': 'gemini-output', 'content': f'<pre>{escape(gemini_text)}</pre>'}})}\n\n"
 
 
 
129
 
130
  yield f"data: {json.dumps({'progress': 100, 'message': 'Processamento Atômico concluído!', 'done': True, 'mode': 'atomic'})}\n\n"
131
 
 
140
  yield f"data: {json.dumps({'error': 'Falha no serviço GROK: Sem resposta.'})}\n\n"
141
  return
142
 
143
+ # MUDANÇA: Exibe texto bruto pré-formatado
144
+ yield f"data: {json.dumps({'progress': 33, 'message': 'Claude Sonnet está processando...', 'partial_result': {'id': 'grok-output', 'content': f'<pre>{escape(resposta_grok)}</pre>'}})}\n\n"
 
 
145
 
146
  prompt_sonnet = PromptTemplate(template=PROMPT_HIERARQUICO_SONNET, input_variables=["solicitacao_usuario", "texto_para_analise"])
147
  claude_with_max_tokens = claude_llm.bind(max_tokens=20000)
 
152
  yield f"data: {json.dumps({'error': 'Falha no serviço Claude Sonnet: Sem resposta.'})}\n\n"
153
  return
154
 
155
+ # MUDANÇA: Exibe texto bruto pré-formatado
156
+ yield f"data: {json.dumps({'progress': 66, 'message': 'Gemini está processando...', 'partial_result': {'id': 'sonnet-output', 'content': f'<pre>{escape(resposta_sonnet)}</pre>'}})}\n\n"
 
 
157
 
158
  prompt_gemini = PromptTemplate(template=PROMPT_HIERARQUICO_GEMINI, input_variables=["solicitacao_usuario", "texto_para_analise"])
159
  chain_gemini = LLMChain(llm=gemini_llm, prompt=prompt_gemini)
 
163
  yield f"data: {json.dumps({'error': 'Falha no serviço Gemini: Sem resposta.'})}\n\n"
164
  return
165
 
166
+ # MUDANÇA: Exibe texto bruto pré-formatado
167
+ yield f"data: {json.dumps({'progress': 100, 'message': 'Processamento concluído!', 'partial_result': {'id': 'gemini-output', 'content': f'<pre>{escape(resposta_gemini)}</pre>'}, 'done': True, 'mode': 'hierarchical'})}\n\n"
 
 
168
 
169
  except Exception as e:
170
  print(f"Ocorreu um erro durante o processamento: {e}")
 
199
  return
200
 
201
  word_count = len(resposta_merge.split())
202
+ # MUDANÇA: Exibe texto bruto pré-formatado
203
+ merge_html = f"<pre>{escape(resposta_merge)}</pre>"
204
 
205
  yield f"data: {json.dumps({'progress': 100, 'message': 'Merge concluído!', 'final_result': {'content': merge_html, 'word_count': word_count}, 'done': True})}\n\n"
206