Spaces:
Sleeping
Sleeping
import gradio as gr | |
from transformers import AutoTokenizer, AutoModelForQuestionAnswering | |
import torch | |
import logging | |
import warnings | |
from typing import List, Tuple, Dict | |
import random | |
import hashlib | |
from datetime import datetime | |
logging.basicConfig(level=logging.INFO) | |
logger = logging.getLogger(__name__) | |
warnings.filterwarnings('ignore') | |
# Existing BIBLICAL_EXAMPLES dictionary remains the same... | |
class DiverseBiblicalCounselor: | |
def __init__(self): | |
logger.info("Inicializando conselheiro bíblico...") | |
self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu") | |
self.model_name = "pierreguillou/bert-base-cased-squad-v1.1-portuguese" | |
self.session_history = [] | |
try: | |
self.tokenizer = AutoTokenizer.from_pretrained(self.model_name) | |
self.model = AutoModelForQuestionAnswering.from_pretrained(self.model_name) | |
self.model.to(self.device) | |
logger.info(f"Modelo carregado com sucesso no dispositivo: {self.device}") | |
except Exception as e: | |
logger.error(f"Erro ao carregar modelo: {str(e)}") | |
raise | |
def save_to_history(self, question: str, theme: str, response: str, metadata: Dict): | |
"""Salva a consulta no histórico com timestamp""" | |
self.session_history.append({ | |
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), | |
"theme": theme, | |
"question": question, | |
"response": response, | |
"metadata": metadata | |
}) | |
return self.format_history() | |
def format_history(self) -> str: | |
"""Formata o histórico de consultas para exibição""" | |
if not self.session_history: | |
return "Nenhuma consulta realizada ainda." | |
history_text = "📚 Histórico de Consultas:\n\n" | |
for entry in reversed(self.session_history[-5:]): # Shows last 5 consultations | |
history_text += f"🕒 {entry['timestamp']}\n" | |
history_text += f"📌 Tema: {entry['theme']}\n" | |
history_text += f"❓ Pergunta: {entry['question']}\n" | |
history_text += f"📖 Passagem: {entry['metadata']['passagem']}\n" | |
history_text += "─" * 50 + "\n" | |
return history_text | |
def get_verse_of_the_day(self) -> str: | |
"""Retorna um versículo diário baseado na data""" | |
all_verses = [] | |
for theme_examples in BIBLICAL_EXAMPLES.values(): | |
for example in theme_examples: | |
all_verses.append({ | |
'passagem': example['passagem'], | |
'texto': example['texto'] | |
}) | |
# Use a data atual como seed para selecionar o versículo | |
today = datetime.now().strftime("%Y%m%d") | |
random.seed(today) | |
verse = random.choice(all_verses) | |
return f"📖 Versículo do Dia:\n{verse['passagem']}\n\n{verse['texto']}" | |
def get_unique_response(self, question: str, theme: str) -> Tuple[str, Dict]: | |
"""Gera uma resposta única baseada na pergunta e tema""" | |
# Previous implementation remains the same... | |
# Get response and metadata as before | |
response, metadata = super().get_unique_response(question, theme) # Assuming this exists | |
# Save to history | |
history = self.save_to_history(question, theme, response, metadata) | |
return response, metadata, history | |
def create_interface(): | |
counselor = DiverseBiblicalCounselor() | |
with gr.Blocks(theme=gr.themes.Soft()) as demo: | |
gr.Markdown(""" | |
# 🕊️ Conselheiro Bíblico | |
### Orientação Bíblica Personalizada | |
""") | |
# Verse of the day section | |
with gr.Row(): | |
verse_of_day = gr.Textbox( | |
label="Versículo do Dia", | |
value=counselor.get_verse_of_the_day(), | |
lines=4, | |
interactive=False | |
) | |
with gr.Tabs(): | |
with gr.TabItem("📝 Consulta"): | |
with gr.Row(): | |
with gr.Column(): | |
theme = gr.Dropdown( | |
choices=list(BIBLICAL_EXAMPLES.keys()), | |
label="Tema", | |
value="casamento" | |
) | |
question = gr.Textbox( | |
label="Sua Pergunta", | |
placeholder="Digite sua pergunta...", | |
lines=3 | |
) | |
submit_btn = gr.Button("🙏 Buscar Orientação", variant="primary") | |
with gr.Column(): | |
answer_output = gr.Textbox( | |
label="Resposta", | |
lines=10 | |
) | |
metadata_output = gr.Textbox( | |
label="Referências", | |
lines=3 | |
) | |
with gr.TabItem("📚 Histórico"): | |
history_output = gr.Textbox( | |
label="Histórico de Consultas", | |
value="Nenhuma consulta realizada ainda.", | |
lines=15, | |
interactive=False | |
) | |
with gr.TabItem("ℹ️ Ajuda"): | |
gr.Markdown(""" | |
### Como usar o Conselheiro Bíblico: | |
1. Selecione um tema relacionado à sua dúvida | |
2. Digite sua pergunta de forma clara e objetiva | |
3. Clique em "Buscar Orientação" | |
4. Receba orientação baseada em princípios bíblicos | |
### Temas Disponíveis: | |
- Casamento: Conselhos para relacionamento conjugal | |
- Criação de Filhos: Orientação para pais | |
- [outros temas conforme disponível no sistema] | |
### Notas: | |
- As respostas são baseadas em princípios bíblicos | |
- Cada consulta é salva no histórico para referência futura | |
- O versículo do dia é atualizado diariamente | |
""") | |
# Examples section | |
gr.Examples( | |
examples=[ | |
["casamento", "Como resolver conflitos no casamento?"], | |
["casamento", "Como manter um casamento forte espiritualmente?"], | |
["casamento", "Qual o papel do perdão no casamento?"], | |
["casamento", "Como manter a fidelidade no casamento?"], | |
["casamento", "Como lidar com diferenças no casamento?"] | |
], | |
inputs=[theme, question], | |
outputs=[answer_output, metadata_output, history_output], | |
fn=lambda t, q: counselor.get_unique_response(q, t), | |
label="Exemplos de Perguntas" | |
) | |
def update_outputs(theme, question): | |
response, metadata, history = counselor.get_unique_response(question, theme) | |
return response, metadata, history | |
submit_btn.click( | |
fn=update_outputs, | |
inputs=[theme, question], | |
outputs=[answer_output, metadata_output, history_output] | |
) | |
return demo | |
if __name__ == "__main__": | |
try: | |
logger.info("Iniciando aplicação...") | |
demo = create_interface() | |
demo.launch( | |
server_name="0.0.0.0", | |
share=True, | |
show_error=True | |
) | |
except Exception as e: | |
logger.error(f"Erro ao iniciar aplicação: {str(e)}") | |
raise |