Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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)
|
| 222 |
"q1_enunciado": "...", "q2_enunciado": "...", "q3_enunciado": "...", "q4_enunciado": "...",
|
| 223 |
"gabarito_oculto": { ... }
|
| 224 |
}
|
| 225 |
"""
|
| 226 |
-
else: # MODO CORREÇÃO
|
| 227 |
return base + """
|
| 228 |
-
OBJETIVO: Agir como o MELHOR PROFESSOR DE CURSINHO
|
| 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
|
| 240 |
-
1.
|
| 241 |
-
2.
|
| 242 |
|
| 243 |
-
ESTRUTURA JSON
|
| 244 |
{
|
| 245 |
-
"tabela_notas": [
|
| 246 |
-
|
| 247 |
-
|
|
|
|
|
|
|
|
|
|
| 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
|
| 254 |
-
|
| 255 |
-
Gere
|
| 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 |
-
|
| 263 |
-
|
| 264 |
-
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
|