LLM-as-Judge-Legal-BR-annot / label_oabench_practical.py
eduardocpacheco's picture
bug fix
6f2ce65
import streamlit as st
import pandas as pd
import json
import os
# Função para carregar usuários e senhas de um arquivo JSON
def carregar_usuarios(arquivo="users.json"):
if os.path.exists(arquivo):
with open(arquivo, "r", encoding="utf-8") as f:
return json.load(f)
return {}
# Função para carregar anotações de um arquivo específico para cada usuário
def carregar_anotacoes_usuario(usuario, pasta="anotacoes"):
if not os.path.exists(pasta):
os.makedirs(pasta)
arquivo_usuario = os.path.join(pasta, f"{usuario}_anotacoes_praticas.json")
if os.path.exists(arquivo_usuario):
with open(arquivo_usuario, "r", encoding="utf-8") as f:
return json.load(f)
return {}
# Função para salvar anotações de um usuário
def salvar_anotacoes_usuario(usuario, dados, pasta="anotacoes"):
arquivo_usuario = os.path.join(pasta, f"{usuario}_anotacoes_praticas.json")
with open(arquivo_usuario, "w", encoding="utf-8") as f:
json.dump(dados, f, ensure_ascii=False, indent=4)
# Função para autenticar o login
def autenticar(usuario, senha, usuarios):
return usuarios.get(usuario) == senha
# Função principal da aplicação
def run():
#st.set_page_config(layout="wide")
# Tela de login
usuarios = carregar_usuarios()
if "usuario" not in st.session_state:
st.session_state["usuario"] = None
if "selected_criterio" not in st.session_state:
st.session_state["selected_criterio"] = None
if st.session_state["usuario"] is None:
st.title("ICAIL - Benchmark jurídico OAB segunda fase")
st.markdown("Questões práticas")
usuario = st.text_input("Usuário")
senha = st.text_input("Senha", type="password")
if st.button("Entrar"):
if autenticar(usuario, senha, usuarios):
st.session_state["usuario"] = usuario
st.success(f"Bem-vindo, {usuario}!")
st.rerun()
else:
st.error("Usuário ou senha inválidos.")
else:
usuario = st.session_state["usuario"]
# Carregar anotações do usuário
anotacoes_salvas = carregar_anotacoes_usuario(usuario)
# Carregar os dados do arquivo pickle correspondente
dados_pickle = "df_evaluated.pkl"
df = pd.read_pickle(dados_pickle)
# Configuração da barra lateral para escolher a questão
st.sidebar.title(f"Usuário: {usuario}")
questao_id = st.sidebar.selectbox("Selecione a prova", df["id"].tolist())
# Filtrar o DataFrame para a questão selecionada
questao = df[df["id"] == questao_id].iloc[0]
# Inicializar o JSON para a questão selecionada, se não existir
if str(questao_id) not in anotacoes_salvas:
anotacoes_salvas[str(questao_id)] = {}
# Layout principal
col1, col2 = st.columns([2, 1])
with col1:
st.header("Leitura e Contexto")
st.write(f"{questao['exam']} º exame da OAB, área Direito {questao['area']} - prova aplicada em {questao['exam date']}")
tab1, tab2, tab3 = st.tabs(["Caso da Prova Prática", "Gabarito", "Resposta do Candidato"])
with tab1:
st.markdown(f"<div style='height: 400px; overflow-y: auto; border: 1px solid #ddd; padding: 10px;'>{questao['question']}</div>", unsafe_allow_html=True)
with tab2:
st.markdown(f"<div style='height: 400px; overflow-y: auto; border: 1px solid #ddd; padding: 10px;'>{questao['answer']}</div>", unsafe_allow_html=True)
with tab3:
st.markdown(f"<div style='height: 400px; overflow-y: auto; border: 1px solid #ddd; padding: 10px;'>{questao['model_answer']}</div>", unsafe_allow_html=True)
if st.session_state["selected_criterio"] is not None:
criterio = questao["formated_criteria"][st.session_state["selected_criterio"]]
identificador = f"Critério {criterio['numero']} - {criterio['parte']}"
st.subheader(identificador + f" - {criterio['titulo']}")
st.markdown(f"**Critério:**<br>{criterio['descricao']} (Peso: {criterio['pontos']})", unsafe_allow_html=True)
chave_anotacao = f"exame_{questao['exam']}_area_{questao['area']}_questao_numero_{criterio['numero']}_parte_{criterio['parte']}"
valor_salvo = anotacoes_salvas[str(questao_id)].get(chave_anotacao, "-")
# Atualizar imediatamente a anotação ao interagir com o rádio
atende = st.radio(
f"Cumpre o critério?",
options=["-", "Sim", "Não"],
index=["-", "Sim", "Não"].index(valor_salvo) if valor_salvo in ["-", "Sim", "Não"] else 0,
key=f"criterio_{questao_id}_{st.session_state['selected_criterio']}"
)
# Atualizar o valor no dicionário de anotações
anotacoes_salvas[str(questao_id)][chave_anotacao] = atende
# Botão para salvar todas as anotações no arquivo
if st.button("Gravar"):
salvar_anotacoes_usuario(usuario, anotacoes_salvas)
st.success("Anotações salvas com sucesso!")
st.json(anotacoes_salvas)
with col2:
st.header("Lista de Critérios")
for idx, criterio in enumerate(questao["formated_criteria"]):
texto_botao = f"Critério {criterio['numero']} - {criterio['parte']}"
if st.button(texto_botao, key=f"menu_criterio_{idx}"):
st.session_state["selected_criterio"] = idx
st.rerun()
# Logout
if st.sidebar.button("Logout"):
st.session_state["usuario"] = None
st.rerun()