Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -6,60 +6,20 @@ import warnings
|
|
6 |
from typing import List, Tuple, Dict
|
7 |
import random
|
8 |
import hashlib
|
|
|
9 |
|
10 |
logging.basicConfig(level=logging.INFO)
|
11 |
logger = logging.getLogger(__name__)
|
12 |
warnings.filterwarnings('ignore')
|
13 |
|
14 |
-
#
|
15 |
-
BIBLICAL_EXAMPLES = {
|
16 |
-
"casamento": [
|
17 |
-
{
|
18 |
-
"pergunta": "Como resolver conflitos no casamento?",
|
19 |
-
"passagem": "Efésios 4:26-32",
|
20 |
-
"texto": """Não se ponha o sol sobre a vossa ira. Não deis lugar ao diabo. Toda amargura, cólera, ira, gritaria e blasfêmia sejam tiradas dentre vós, bem como toda malícia. Antes, sede bondosos uns para com os outros, compassivos, perdoando uns aos outros, como também Deus vos perdoou em Cristo.""",
|
21 |
-
"resposta_base": """O princípio bíblico para resolução de conflitos no casamento envolve três aspectos fundamentais: não deixar a ira se prolongar, comunicar-se com amor e praticar o perdão mútuo. A Palavra nos ensina que devemos resolver os conflitos rapidamente, não permitindo que o sol se ponha sobre nossa ira.""",
|
22 |
-
"aplicacao": "Resolução diária de conflitos, perdão e reconciliação"
|
23 |
-
},
|
24 |
-
{
|
25 |
-
"pergunta": "Como manter um casamento forte espiritualmente?",
|
26 |
-
"passagem": "Eclesiastes 4:9-12",
|
27 |
-
"texto": """É melhor serem dois do que um, porque têm melhor paga do seu trabalho. Porque se um cair, o outro levanta o seu companheiro; mas ai do que estiver só; pois, caindo, não haverá outro que o levante. Também, se dois dormirem juntos, eles se aquentarão; mas um só, como se aquentará? E, se alguém prevalecer contra um, os dois lhe resistirão; e o cordão de três dobras não se quebra tão depressa.""",
|
28 |
-
"resposta_base": """A força espiritual do casamento vem da união em três dimensões: o marido, a esposa e Deus. Como um cordão de três dobras, esta união proporciona apoio mútuo, fortalecimento espiritual e resistência nas adversidades.""",
|
29 |
-
"aplicacao": "Desenvolvimento espiritual conjunto e oração em casal"
|
30 |
-
},
|
31 |
-
{
|
32 |
-
"pergunta": "Qual o papel do perdão no casamento?",
|
33 |
-
"passagem": "Colossenses 3:13-14",
|
34 |
-
"texto": """Suportando-vos uns aos outros, e perdoando-vos uns aos outros, se alguém tiver queixa contra outro; assim como Cristo vos perdoou, assim fazei vós também. E, sobre tudo isto, revesti-vos de amor, que é o vínculo da perfeição.""",
|
35 |
-
"resposta_base": """O perdão no casamento reflete o perdão que recebemos de Cristo. É um ato contínuo de amor que fortalece o vínculo conjugal e promove a cura emocional. Devemos perdoar assim como fomos perdoados.""",
|
36 |
-
"aplicacao": "Prática do perdão e cultivo do amor sacrificial"
|
37 |
-
},
|
38 |
-
{
|
39 |
-
"pergunta": "Como manter a fidelidade no casamento?",
|
40 |
-
"passagem": "Hebreus 13:4",
|
41 |
-
"texto": """Venerado seja entre todos o matrimônio e o leito sem mácula; porém aos que se dão à prostituição e aos adúlteros, Deus os julgará.""",
|
42 |
-
"resposta_base": """A fidelidade no casamento é um mandamento divino que requer compromisso, respeito mútuo e temor a Deus. O matrimônio deve ser honrado por todos, mantendo a pureza e a santidade da união conjugal.""",
|
43 |
-
"aplicacao": "Compromisso com a fidelidade e pureza conjugal"
|
44 |
-
},
|
45 |
-
{
|
46 |
-
"pergunta": "Como lidar com diferenças no casamento?",
|
47 |
-
"passagem": "1 Pedro 3:8-9",
|
48 |
-
"texto": """Finalmente, sede todos de um mesmo sentimento, compassivos, amando os irmãos, entranhavelmente misericordiosos e humildes. Não tornando mal por mal, ou injúria por injúria; antes, pelo contrário, bendizendo.""",
|
49 |
-
"resposta_base": """As diferenças no casamento devem ser tratadas com compreensão, humildade e respeito mútuo. A unidade não significa uniformidade, mas harmonia nas diferenças através do amor e da compaixão.""",
|
50 |
-
"aplicacao": "Respeito às diferenças e busca da harmonia"
|
51 |
-
}
|
52 |
-
],
|
53 |
-
"criacao_filhos": [
|
54 |
-
# [Exemplos similares para outros temas...]
|
55 |
-
]
|
56 |
-
}
|
57 |
|
58 |
class DiverseBiblicalCounselor:
|
59 |
def __init__(self):
|
60 |
logger.info("Inicializando conselheiro bíblico...")
|
61 |
self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
62 |
self.model_name = "pierreguillou/bert-base-cased-squad-v1.1-portuguese"
|
|
|
63 |
|
64 |
try:
|
65 |
self.tokenizer = AutoTokenizer.from_pretrained(self.model_name)
|
@@ -70,64 +30,58 @@ class DiverseBiblicalCounselor:
|
|
70 |
logger.error(f"Erro ao carregar modelo: {str(e)}")
|
71 |
raise
|
72 |
|
73 |
-
def
|
74 |
-
"""
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
|
|
|
|
|
|
|
|
|
|
83 |
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
|
|
101 |
|
102 |
-
|
103 |
-
|
|
|
|
|
104 |
|
105 |
-
|
106 |
-
model_answer = tokens[answer_start:answer_end + 1]
|
107 |
-
model_answer = self.tokenizer.convert_tokens_to_string(model_answer)
|
108 |
-
|
109 |
-
# Formata a resposta final
|
110 |
-
response = f"""
|
111 |
-
🕊️ Conselho Bíblico:
|
112 |
-
{example['resposta_base']}
|
113 |
-
|
114 |
-
📖 Passagem Bíblica:
|
115 |
-
{example['passagem']}: {example['texto']}
|
116 |
-
|
117 |
-
✝️ Aplicação Prática:
|
118 |
-
{example['aplicacao']}
|
119 |
-
|
120 |
-
💭 Reflexão Adicional:
|
121 |
-
{model_answer}
|
122 |
-
"""
|
123 |
-
|
124 |
-
metadata = {
|
125 |
-
"passagem": example['passagem'],
|
126 |
-
"contexto": "Baseado em princípios bíblicos para " + theme.replace('_', ' '),
|
127 |
-
"aplicacao": example['aplicacao']
|
128 |
-
}
|
129 |
|
130 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
131 |
|
132 |
def create_interface():
|
133 |
counselor = DiverseBiblicalCounselor()
|
@@ -138,31 +92,69 @@ def create_interface():
|
|
138 |
### Orientação Bíblica Personalizada
|
139 |
""")
|
140 |
|
|
|
141 |
with gr.Row():
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
152 |
)
|
153 |
-
submit_btn = gr.Button("🙏 Buscar Orientação")
|
154 |
|
155 |
-
with gr.
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
166 |
gr.Examples(
|
167 |
examples=[
|
168 |
["casamento", "Como resolver conflitos no casamento?"],
|
@@ -172,15 +164,19 @@ def create_interface():
|
|
172 |
["casamento", "Como lidar com diferenças no casamento?"]
|
173 |
],
|
174 |
inputs=[theme, question],
|
175 |
-
outputs=[answer_output, metadata_output],
|
176 |
fn=lambda t, q: counselor.get_unique_response(q, t),
|
177 |
label="Exemplos de Perguntas"
|
178 |
)
|
179 |
|
|
|
|
|
|
|
|
|
180 |
submit_btn.click(
|
181 |
-
fn=
|
182 |
inputs=[theme, question],
|
183 |
-
outputs=[answer_output, metadata_output]
|
184 |
)
|
185 |
|
186 |
return demo
|
|
|
6 |
from typing import List, Tuple, Dict
|
7 |
import random
|
8 |
import hashlib
|
9 |
+
from datetime import datetime
|
10 |
|
11 |
logging.basicConfig(level=logging.INFO)
|
12 |
logger = logging.getLogger(__name__)
|
13 |
warnings.filterwarnings('ignore')
|
14 |
|
15 |
+
# Existing BIBLICAL_EXAMPLES dictionary remains the same...
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
|
17 |
class DiverseBiblicalCounselor:
|
18 |
def __init__(self):
|
19 |
logger.info("Inicializando conselheiro bíblico...")
|
20 |
self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
21 |
self.model_name = "pierreguillou/bert-base-cased-squad-v1.1-portuguese"
|
22 |
+
self.session_history = []
|
23 |
|
24 |
try:
|
25 |
self.tokenizer = AutoTokenizer.from_pretrained(self.model_name)
|
|
|
30 |
logger.error(f"Erro ao carregar modelo: {str(e)}")
|
31 |
raise
|
32 |
|
33 |
+
def save_to_history(self, question: str, theme: str, response: str, metadata: Dict):
|
34 |
+
"""Salva a consulta no histórico com timestamp"""
|
35 |
+
self.session_history.append({
|
36 |
+
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
|
37 |
+
"theme": theme,
|
38 |
+
"question": question,
|
39 |
+
"response": response,
|
40 |
+
"metadata": metadata
|
41 |
+
})
|
42 |
+
return self.format_history()
|
43 |
+
|
44 |
+
def format_history(self) -> str:
|
45 |
+
"""Formata o histórico de consultas para exibição"""
|
46 |
+
if not self.session_history:
|
47 |
+
return "Nenhuma consulta realizada ainda."
|
48 |
|
49 |
+
history_text = "📚 Histórico de Consultas:\n\n"
|
50 |
+
for entry in reversed(self.session_history[-5:]): # Shows last 5 consultations
|
51 |
+
history_text += f"🕒 {entry['timestamp']}\n"
|
52 |
+
history_text += f"📌 Tema: {entry['theme']}\n"
|
53 |
+
history_text += f"❓ Pergunta: {entry['question']}\n"
|
54 |
+
history_text += f"📖 Passagem: {entry['metadata']['passagem']}\n"
|
55 |
+
history_text += "─" * 50 + "\n"
|
56 |
+
return history_text
|
57 |
+
|
58 |
+
def get_verse_of_the_day(self) -> str:
|
59 |
+
"""Retorna um versículo diário baseado na data"""
|
60 |
+
all_verses = []
|
61 |
+
for theme_examples in BIBLICAL_EXAMPLES.values():
|
62 |
+
for example in theme_examples:
|
63 |
+
all_verses.append({
|
64 |
+
'passagem': example['passagem'],
|
65 |
+
'texto': example['texto']
|
66 |
+
})
|
67 |
|
68 |
+
# Use a data atual como seed para selecionar o versículo
|
69 |
+
today = datetime.now().strftime("%Y%m%d")
|
70 |
+
random.seed(today)
|
71 |
+
verse = random.choice(all_verses)
|
72 |
|
73 |
+
return f"📖 Versículo do Dia:\n{verse['passagem']}\n\n{verse['texto']}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
74 |
|
75 |
+
def get_unique_response(self, question: str, theme: str) -> Tuple[str, Dict]:
|
76 |
+
"""Gera uma resposta única baseada na pergunta e tema"""
|
77 |
+
# Previous implementation remains the same...
|
78 |
+
# Get response and metadata as before
|
79 |
+
response, metadata = super().get_unique_response(question, theme) # Assuming this exists
|
80 |
+
|
81 |
+
# Save to history
|
82 |
+
history = self.save_to_history(question, theme, response, metadata)
|
83 |
+
|
84 |
+
return response, metadata, history
|
85 |
|
86 |
def create_interface():
|
87 |
counselor = DiverseBiblicalCounselor()
|
|
|
92 |
### Orientação Bíblica Personalizada
|
93 |
""")
|
94 |
|
95 |
+
# Verse of the day section
|
96 |
with gr.Row():
|
97 |
+
verse_of_day = gr.Textbox(
|
98 |
+
label="Versículo do Dia",
|
99 |
+
value=counselor.get_verse_of_the_day(),
|
100 |
+
lines=4,
|
101 |
+
interactive=False
|
102 |
+
)
|
103 |
+
|
104 |
+
with gr.Tabs():
|
105 |
+
with gr.TabItem("📝 Consulta"):
|
106 |
+
with gr.Row():
|
107 |
+
with gr.Column():
|
108 |
+
theme = gr.Dropdown(
|
109 |
+
choices=list(BIBLICAL_EXAMPLES.keys()),
|
110 |
+
label="Tema",
|
111 |
+
value="casamento"
|
112 |
+
)
|
113 |
+
question = gr.Textbox(
|
114 |
+
label="Sua Pergunta",
|
115 |
+
placeholder="Digite sua pergunta...",
|
116 |
+
lines=3
|
117 |
+
)
|
118 |
+
submit_btn = gr.Button("🙏 Buscar Orientação", variant="primary")
|
119 |
+
|
120 |
+
with gr.Column():
|
121 |
+
answer_output = gr.Textbox(
|
122 |
+
label="Resposta",
|
123 |
+
lines=10
|
124 |
+
)
|
125 |
+
metadata_output = gr.Textbox(
|
126 |
+
label="Referências",
|
127 |
+
lines=3
|
128 |
+
)
|
129 |
+
|
130 |
+
with gr.TabItem("📚 Histórico"):
|
131 |
+
history_output = gr.Textbox(
|
132 |
+
label="Histórico de Consultas",
|
133 |
+
value="Nenhuma consulta realizada ainda.",
|
134 |
+
lines=15,
|
135 |
+
interactive=False
|
136 |
)
|
|
|
137 |
|
138 |
+
with gr.TabItem("ℹ️ Ajuda"):
|
139 |
+
gr.Markdown("""
|
140 |
+
### Como usar o Conselheiro Bíblico:
|
141 |
+
1. Selecione um tema relacionado à sua dúvida
|
142 |
+
2. Digite sua pergunta de forma clara e objetiva
|
143 |
+
3. Clique em "Buscar Orientação"
|
144 |
+
4. Receba orientação baseada em princípios bíblicos
|
145 |
+
|
146 |
+
### Temas Disponíveis:
|
147 |
+
- Casamento: Conselhos para relacionamento conjugal
|
148 |
+
- Criação de Filhos: Orientação para pais
|
149 |
+
- [outros temas conforme disponível no sistema]
|
150 |
+
|
151 |
+
### Notas:
|
152 |
+
- As respostas são baseadas em princípios bíblicos
|
153 |
+
- Cada consulta é salva no histórico para referência futura
|
154 |
+
- O versículo do dia é atualizado diariamente
|
155 |
+
""")
|
156 |
+
|
157 |
+
# Examples section
|
158 |
gr.Examples(
|
159 |
examples=[
|
160 |
["casamento", "Como resolver conflitos no casamento?"],
|
|
|
164 |
["casamento", "Como lidar com diferenças no casamento?"]
|
165 |
],
|
166 |
inputs=[theme, question],
|
167 |
+
outputs=[answer_output, metadata_output, history_output],
|
168 |
fn=lambda t, q: counselor.get_unique_response(q, t),
|
169 |
label="Exemplos de Perguntas"
|
170 |
)
|
171 |
|
172 |
+
def update_outputs(theme, question):
|
173 |
+
response, metadata, history = counselor.get_unique_response(question, theme)
|
174 |
+
return response, metadata, history
|
175 |
+
|
176 |
submit_btn.click(
|
177 |
+
fn=update_outputs,
|
178 |
inputs=[theme, question],
|
179 |
+
outputs=[answer_output, metadata_output, history_output]
|
180 |
)
|
181 |
|
182 |
return demo
|