GabrielGD commited on
Commit
cb44a19
·
verified ·
1 Parent(s): 9322210

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +33 -38
app.py CHANGED
@@ -22,7 +22,7 @@ GEMINI_API_KEY = os.getenv("GEMINI_API_KEY")
22
  if GEMINI_API_KEY:
23
  genai.configure(api_key=GEMINI_API_KEY)
24
 
25
- # --- CONFIGURAÇÃO IA ---
26
  MODEL_NAME = "gemini-3-flash-preview"
27
 
28
  GENERATION_CONFIG = {
@@ -215,60 +215,43 @@ def get_system_instruction(area, modo="geracao"):
215
  if modo == "geracao":
216
  return base + """
217
  OBJETIVO: Criar uma prova de NÍVEL DIFÍCIL, com múltiplas teses e pegadinhas processuais.
218
-
219
  ESTRUTURA JSON DE SAÍDA:
220
  {
221
- "peca_enunciado": "Texto longo (min. 400 palavras) com datas, valores, locais e conflito detalhado...",
222
  "q1_enunciado": "...", "q2_enunciado": "...", "q3_enunciado": "...", "q4_enunciado": "...",
223
  "gabarito_oculto": { ... }
224
  }
225
  """
226
- else: # MODO CORREÇÃO E GABARITO
227
  return base + """
228
- OBJETIVO: Agir como o MELHOR PROFESSOR DE CURSINHO PREPARATÓRIO DO BRASIL.
229
-
230
- DIRETRIZES PARA O GABARITO MODELO (FUNDAMENTAL):
231
- 1. NÃO RESUMA. Escreva a peça INTEIRA, linha por linha.
232
- 2. Use linguagem jurídica culta e técnica (Ex: "Data venia", "Impende destacar", "Fulcro no art...").
233
- 3. Estruture em Tópicos: I - Preliminares; II - Prejudiciais; III - Mérito; IV - Pedidos.
234
- 4. Na fundamentação, use o SILOGISMO:
235
- - Premissa Maior (A Lei/Súmula diz X);
236
- - Premissa Menor (O caso narra Y);
237
- - Conclusão (Logo, deve-se aplicar Z).
238
 
239
- DIRETRIZES PARA CORREÇÃO:
240
- 1. Seja rigoroso na pontuação (0.00 a 10.00).
241
- 2. Se o aluno não citou o artigo exato, desconte ponto.
242
 
243
- ESTRUTURA JSON DE SAÍDA:
244
  {
245
- "tabela_notas": [ ... ],
246
- "nota_final": "...",
247
- "gabarito_modelo": "TEXTO COMPLETO DA PEÇA IDEAL (Como se fosse para protocolar no tribunal) + RESPOSTAS COMPLETAS DAS QUESTÕES.",
 
 
 
248
  "mentor_vade_mecum": "..."
249
  }
250
  """
251
 
252
  def get_prompt_gerador(area, peca_alvo):
253
- instrucao = f"Peça obrigatória: {peca_alvo}" if "Aleatória" not in peca_alvo else "Escolha peça aleatória baseada no histórico FGV."
254
- return f"""
255
- Gere um SIMULADO COMPLETO de {area}.
256
- {instrucao}.
257
- IMPORTANTE: O caso deve ser rico em detalhes fáticos para permitir uma defesa/acusação extensa.
258
- """
259
 
260
  def get_prompt_correcao(area, gabarito, respostas):
261
  return f"""
262
- REALIZA A CORREÇÃO DETALHADA E A GERAÇÃO DO GABARITO PERFEITO.
263
-
264
- GABARITO ESPERADO (TÓPICOS): {json.dumps(gabarito, ensure_ascii=False)}
265
- RESPOSTAS DO ALUNO: {json.dumps(respostas, ensure_ascii=False)}
266
-
267
- ATENÇÃO AO GERAR O 'GABARITO MODELO':
268
- Eu quero que você ESCREVA A PEÇA INTEIRA que gabaritaria a prova.
269
- Comece pelo Endereçamento ("Excelentíssimo Senhor..."), pule linhas, faça a Qualificação ("Fulano, já qualificado..."), abra tópico das Preliminares (escreva o parágrafo inteiro argumentando), tópico do Mérito (argumente fato+fundamento+pedido) e os Pedidos Finais (alínea por alínea).
270
-
271
- Nas questões (Q1 a Q4), escreva a resposta completa: "A resposta é [Sim/Não]. O fundamento legal é o Artigo X, que dispõe Y. No caso concreto, ocorreu Z..."
272
  """
273
 
274
  # --- BACKEND ---
@@ -306,7 +289,19 @@ def corrigir_simulado(gabarito, area, r_peca, r_q1, r_q2, r_q3, r_q4, enc_peca,
306
  try:
307
  response = model.generate_content(get_prompt_correcao(area, gabarito, respostas))
308
  dados = limpar_json(response.text)
309
- tabela_md = "| Item | Valor | Nota | Motivo |\n|---|---|---|---|\n"
 
 
 
 
 
 
 
 
 
 
 
 
310
  for l in dados.get("tabela_notas", []):
311
  tabela_md += f"| {l.get('item','')} | {l.get('valor','')} | {l.get('nota_aluno','')} | {l.get('motivo','')} |\n"
312
 
 
22
  if GEMINI_API_KEY:
23
  genai.configure(api_key=GEMINI_API_KEY)
24
 
25
+ # --- CONFIGURAÇÃO IA (USE UM MODELO ESTÁVEL) ---
26
  MODEL_NAME = "gemini-3-flash-preview"
27
 
28
  GENERATION_CONFIG = {
 
215
  if modo == "geracao":
216
  return base + """
217
  OBJETIVO: Criar uma prova de NÍVEL DIFÍCIL, com múltiplas teses e pegadinhas processuais.
 
218
  ESTRUTURA JSON DE SAÍDA:
219
  {
220
+ "peca_enunciado": "Texto longo (min. 400 palavras)...",
221
  "q1_enunciado": "...", "q2_enunciado": "...", "q3_enunciado": "...", "q4_enunciado": "...",
222
  "gabarito_oculto": { ... }
223
  }
224
  """
225
+ else: # MODO CORREÇÃO
226
  return base + """
227
+ OBJETIVO: Agir como o MELHOR PROFESSOR DE CURSINHO.
 
 
 
 
 
 
 
 
 
228
 
229
+ DIRETRIZES CORREÇÃO:
230
+ 1. Gere uma lista JSON 'tabela_notas' onde cada item tem 'item', 'valor', 'nota_aluno' (numérico) e 'motivo'.
231
+ 2. 'nota_final' deve ser a soma exata.
232
 
233
+ ESTRUTURA JSON OBRIGATÓRIA:
234
  {
235
+ "tabela_notas": [
236
+ {"item": "Endereçamento", "valor": "0.10", "nota_aluno": "0.10", "motivo": "Correto"},
237
+ {"item": "Mérito - Tese X", "valor": "0.50", "nota_aluno": "0.00", "motivo": "Não citou Art. Y"}
238
+ ],
239
+ "nota_final": "4.50",
240
+ "gabarito_modelo": "Texto completo...",
241
  "mentor_vade_mecum": "..."
242
  }
243
  """
244
 
245
  def get_prompt_gerador(area, peca_alvo):
246
+ instrucao = f"Peça obrigatória: {peca_alvo}" if "Aleatória" not in peca_alvo else "Escolha peça aleatória."
247
+ extra_penal = "Para Penal: Defina crime, pena em abstrato e o exato momento processual." if area == "Direito Penal" else ""
248
+ return f"Gere simulado de {area}. {instrucao}. Inclua datas, valores e pegadinhas. {extra_penal}"
 
 
 
249
 
250
  def get_prompt_correcao(area, gabarito, respostas):
251
  return f"""
252
+ Corrija a prova comparando com o Gabarito.
253
+ GABARITO: {json.dumps(gabarito, ensure_ascii=False)}
254
+ RESPOSTAS ALUNO: {json.dumps(respostas, ensure_ascii=False)}
 
 
 
 
 
 
 
255
  """
256
 
257
  # --- BACKEND ---
 
289
  try:
290
  response = model.generate_content(get_prompt_correcao(area, gabarito, respostas))
291
  dados = limpar_json(response.text)
292
+
293
+ # Garante o calculo da nota final se a IA falhar
294
+ nota_final = dados.get("nota_final", "0.0")
295
+ if nota_final == "0.0" or nota_final == "":
296
+ try:
297
+ soma = sum([float(x.get('nota_aluno', 0)) for x in dados.get('tabela_notas', [])])
298
+ nota_final = f"{soma:.2f}"
299
+ dados['nota_final'] = nota_final
300
+ except: pass
301
+
302
+ # Constrói o Markdown para a tela com a nota em destaque
303
+ tabela_md = f"# 🏆 NOTA FINAL: {nota_final} / 10.0\n\n"
304
+ tabela_md += "| Item Avaliado | Valor Máx | Sua Nota | Comentário |\n|---|---|---|---|\n"
305
  for l in dados.get("tabela_notas", []):
306
  tabela_md += f"| {l.get('item','')} | {l.get('valor','')} | {l.get('nota_aluno','')} | {l.get('motivo','')} |\n"
307