DHEIVER commited on
Commit
0ee930b
·
verified ·
1 Parent(s): 8d70aef

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +140 -189
app.py CHANGED
@@ -5,156 +5,42 @@ import logging
5
  from typing import Tuple, Dict
6
  import warnings
7
  import json
8
- from pathlib import Path
 
9
  warnings.filterwarnings('ignore')
10
 
11
- logging.basicConfig(level=logging.INFO)
12
- logger = logging.getLogger(__name__)
13
 
14
- # Banco de passagens bíblicas por tema
15
- BIBLICAL_PASSAGES = {
16
- "casamento": [
17
- {
18
- "passagem": "Efésios 5:22-33",
19
- "texto": """Vós, mulheres, sujeitai-vos a vossos maridos, como ao Senhor; Porque o marido é a cabeça da mulher, como também Cristo é a cabeça da igreja... Assim devem os maridos amar as suas mulheres, como a seus próprios corpos. Quem ama a sua mulher, ama-se a si mesmo... Por isso deixará o homem seu pai e sua mãe, e se unirá a sua mulher; e serão dois numa só carne.""",
20
- "contexto": "Relacionamento conjugal e amor sacrificial"
21
- },
22
- {
23
- "passagem": "1 Coríntios 13:4-7",
24
- "texto": """O amor é paciente, o amor é bondoso. Não inveja, não se vangloria, não se orgulha. Não maltrata, não procura seus interesses, não se ira facilmente, não guarda rancor. O amor não se alegra com a injustiça, mas se alegra com a verdade. Tudo sofre, tudo crê, tudo espera, tudo suporta.""",
25
- "contexto": "Definição do amor verdadeiro"
26
- }
27
- ],
28
- "criacao_filhos": [
29
- {
30
- "passagem": "Provérbios 22:6",
31
- "texto": """Instrui o menino no caminho em que deve andar, e até quando envelhecer não se desviará dele.""",
32
- "contexto": "Educação dos filhos"
33
- },
34
- {
35
- "passagem": "Efésios 6:4",
36
- "texto": """E vós, pais, não provoqueis vossos filhos à ira, mas criai-os na disciplina e na admoestação do Senhor.""",
37
- "contexto": "Responsabilidade dos pais"
38
- }
39
- ],
40
- "papel_mulher": [
41
- {
42
- "passagem": "Provérbios 31:10-31",
43
- "texto": """Mulher virtuosa, quem a achará? O seu valor muito excede o de rubis... Abre a sua boca com sabedoria, e a lei da beneficência está na sua língua. Olha pelo governo de sua casa, e não come o pão da preguiça.""",
44
- "contexto": "Mulher virtuosa"
45
- },
46
- {
47
- "passagem": "Tito 2:4-5",
48
- "texto": """Para que ensinem as mulheres jovens a amarem seus maridos e filhos, a serem prudentes, castas, boas donas de casa, sujeitas a seus maridos, a fim de que a palavra de Deus não seja blasfemada.""",
49
- "contexto": "Papel da mulher na família"
50
- }
51
- ],
52
- "papel_homem": [
53
- {
54
- "passagem": "1 Timóteo 5:8",
55
- "texto": """Mas, se alguém não tem cuidado dos seus, e principalmente dos da sua família, negou a fé, e é pior do que o infiel.""",
56
- "contexto": "Responsabilidade do homem como provedor"
57
- },
58
- {
59
- "passagem": "Colossenses 3:19",
60
- "texto": """Vós, maridos, amai vossas mulheres, e não vos irriteis contra elas.""",
61
- "contexto": "Dever do marido"
62
- }
63
- ],
64
- "financas": [
65
- {
66
- "passagem": "Provérbios 3:9-10",
67
- "texto": """Honra ao Senhor com os teus bens, e com as primícias de toda a tua renda; E se encherão os teus celeiros abundantemente, e transbordarão de mosto os teus lagares.""",
68
- "contexto": "Mordomia financeira"
69
- }
70
- ],
71
- "trabalho": [
72
- {
73
- "passagem": "Colossenses 3:23",
74
- "texto": """E tudo quanto fizerdes, fazei-o de coração, como ao Senhor, e não aos homens.""",
75
- "contexto": "Ética do trabalho"
76
- }
77
- ]
78
- }
79
 
80
- class BiblicalCounselorModel:
81
- def __init__(self):
82
- logger.info("Inicializando conselheiro bíblico...")
83
- self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
84
- self.model_name = "pierreguillou/bert-base-cased-squad-v1.1-portuguese"
85
- self.tokenizer = AutoTokenizer.from_pretrained(self.model_name)
86
- self.model = AutoModelForQuestionAnswering.from_pretrained(self.model_name)
87
- self.model.to(self.device)
88
- logger.info(f"Modelo carregado no dispositivo: {self.device}")
89
 
90
- def get_biblical_context(self, theme: str, question: str) -> str:
91
- """Retorna passagens bíblicas relevantes para o tema"""
92
  if theme in BIBLICAL_PASSAGES:
93
  passages = BIBLICAL_PASSAGES[theme]
94
- combined_text = "\n\n".join([
95
- f"{p['passagem']}: {p['texto']} (Contexto: {p['contexto']})"
96
- for p in passages
97
- ])
98
- return combined_text
99
- return ""
100
-
101
- def format_pastoral_response(self, answer: str, theme: str, passage_ref: str) -> str:
102
- """Formata a resposta em estilo pastoral com referência bíblica"""
103
- pastoral_prefixes = [
104
- "Amado(a) irmão(ã), baseado nas Escrituras, ",
105
- "A palavra de Deus nos ensina que ",
106
- "De acordo com as Sagradas Escrituras, ",
107
- "Em sabedoria, a Bíblia nos revela que ",
108
- "Na luz da palavra de Deus, "
109
- ]
110
-
111
- pastoral_conclusions = [
112
- f"\n\nQue o Espírito Santo ilumine seu entendimento sobre esta verdade. ({passage_ref})",
113
- f"\n\nMedite nesta palavra e permita que Deus fale ao seu coração. ({passage_ref})",
114
- f"\n\nQue esta verdade bíblica traga direção para sua vida. ({passage_ref})",
115
- f"\n\nBusque sempre a orientação divina através das Escrituras. ({passage_ref})",
116
- ]
117
-
118
- from random import choice
119
- return f"{choice(pastoral_prefixes)}{answer}{choice(pastoral_conclusions)}"
120
-
121
- def answer_question(self, theme: str, question: str) -> Tuple[str, Dict]:
122
- context = self.get_biblical_context(theme, question)
123
- if not context:
124
- return "Perdoe-me, não encontrei passagens específicas para este tema.", {}
125
-
126
- inputs = self.tokenizer.encode_plus(
127
- question, context,
128
- add_special_tokens=True,
129
- return_tensors="pt",
130
- max_length=512,
131
- truncation=True,
132
- padding="max_length"
133
- ).to(self.device)
134
-
135
- with torch.no_grad():
136
- outputs = self.model(**inputs)
137
-
138
- answer_start = torch.argmax(outputs.start_logits)
139
- answer_end = torch.argmax(outputs.end_logits)
140
-
141
- tokens = self.tokenizer.convert_ids_to_tokens(inputs["input_ids"][0])
142
- answer = tokens[answer_start:answer_end + 1]
143
- answer = self.tokenizer.convert_tokens_to_string(answer)
144
-
145
- # Encontra a referência da passagem usada
146
- passage_ref = context.split(':')[0] if ':' in context else "Bíblia Sagrada"
147
-
148
- pastoral_answer = self.format_pastoral_response(answer, theme, passage_ref)
149
-
150
- return pastoral_answer, {
151
- "tema": theme,
152
- "passagem": passage_ref,
153
- "contexto_completo": context[:200] + "..."
154
- }
155
-
156
- def create_biblical_counselor_interface():
157
- qa_model = BiblicalCounselorModel()
158
 
159
  def process_counseling(theme: str, question: str) -> Tuple[str, str]:
160
  try:
@@ -169,56 +55,121 @@ def create_biblical_counselor_interface():
169
  logger.error(f"Erro ao processar pergunta: {str(e)}")
170
  return "Perdoe-nos, houve uma dificuldade em processar sua pergunta. Vamos orar e tentar novamente.", "N/A"
171
 
172
- themes = [
173
- "casamento",
174
- "criacao_filhos",
175
- "papel_mulher",
176
- "papel_homem",
177
- "financas",
178
- "trabalho"
179
- ]
180
-
181
- demo = gr.Interface(
182
- fn=process_counseling,
183
- inputs=[
184
- gr.Dropdown(
185
- choices=themes,
186
- label="Tema de Aconselhamento",
187
- value="casamento"
188
- ),
189
- gr.Textbox(
190
- label="Sua Pergunta",
191
- placeholder="Qual sua dúvida sobre este tema? Como posso ajudá-lo com base na Palavra de Deus?",
192
- lines=2
193
- )
194
- ],
195
- outputs=[
196
- gr.Textbox(label="Conselho Bíblico", lines=5),
197
- gr.Textbox(label="Referências Bíblicas", lines=3)
198
- ],
199
- title="🕊️ Conselheiro Bíblico - Temas da Vida Cristã",
200
- description="""
201
- Bem-vindo ao nosso ministério de aconselhamento bíblico.
202
- Selecione um tema e faça sua pergunta para receber orientação baseada nas Sagradas Escrituras.
203
- "Toda a Escritura é inspirada por Deus e útil para o ensino, para a repreensão,
204
- para a correção e para a instrução na justiça." - 2 Timóteo 3:16
205
- """,
206
- examples=[
207
- ["casamento", "Como manter um casamento saudável segundo a Bíblia?"],
208
- ["criacao_filhos", "Como educar meus filhos no caminho do Senhor?"],
209
- ["papel_mulher", "Qual o papel da esposa no casamento cristão?"],
210
- ["papel_homem", "Quais as responsabilidades do marido cristão?"],
211
- ["financas", "Como administrar as finanças segundo a Bíblia?"],
212
- ["trabalho", "Como honrar a Deus no ambiente de trabalho?"]
213
- ],
214
- theme=gr.themes.Soft()
215
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
216
 
217
  return demo
218
 
219
  if __name__ == "__main__":
220
- logger.info("Iniciando ministério de aconselhamento bíblico...")
221
- demo = create_biblical_counselor_interface()
222
  demo.launch(
223
  server_name="0.0.0.0",
224
  share=True,
 
5
  from typing import Tuple, Dict
6
  import warnings
7
  import json
8
+ from datetime import datetime
9
+ import random
10
  warnings.filterwarnings('ignore')
11
 
12
+ # [O código das constantes BIBLICAL_PASSAGES permanece o mesmo]
13
+ # [A classe BiblicalCounselorModel permanece a mesma]
14
 
15
+ def create_enhanced_interface():
16
+ qa_model = BiblicalCounselorModel()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
 
18
+ def get_verse_of_day():
19
+ """Retorna um versículo diário aleatório"""
20
+ all_verses = []
21
+ for theme_verses in BIBLICAL_PASSAGES.values():
22
+ all_verses.extend(theme_verses)
23
+ verse = random.choice(all_verses)
24
+ return f"📖 {verse['passagem']}\n\n{verse['texto']}"
 
 
25
 
26
+ def get_theme_summary(theme: str) -> str:
27
+ """Retorna um resumo das passagens bíblicas do tema"""
28
  if theme in BIBLICAL_PASSAGES:
29
  passages = BIBLICAL_PASSAGES[theme]
30
+ summary = f"📚 Principais passagens sobre {theme.replace('_', ' ').title()}:\n\n"
31
+ for p in passages:
32
+ summary += f"• {p['passagem']}: {p['texto'][:100]}...\n\n"
33
+ return summary
34
+ return "Tema não encontrado."
35
+
36
+ def save_testimony(testimony: str) -> str:
37
+ """Salva um testemunho compartilhado"""
38
+ if testimony.strip():
39
+ timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
40
+ with open("testimonies.txt", "a", encoding="utf-8") as f:
41
+ f.write(f"\n[{timestamp}] {testimony}\n")
42
+ return "🙏 Obrigado por compartilhar seu testemunho! Que ele possa edificar outros irmãos."
43
+ return "Por favor, escreva seu testemunho antes de enviar."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
 
45
  def process_counseling(theme: str, question: str) -> Tuple[str, str]:
46
  try:
 
55
  logger.error(f"Erro ao processar pergunta: {str(e)}")
56
  return "Perdoe-nos, houve uma dificuldade em processar sua pergunta. Vamos orar e tentar novamente.", "N/A"
57
 
58
+ with gr.Blocks(theme=gr.themes.Soft()) as demo:
59
+ gr.Markdown(
60
+ """
61
+ # 🕊️ Conselheiro Bíblico Virtual
62
+ ### Centro de Aconselhamento e Edificação
63
+
64
+ _"Toda a Escritura é inspirada por Deus e útil para o ensino, para a repreensão,
65
+ para a correção e para a instrução na justiça." - 2 Timóteo 3:16_
66
+ """
67
+ )
68
+
69
+ with gr.Tabs():
70
+ # Aba de Aconselhamento
71
+ with gr.Tab("📚 Aconselhamento Bíblico"):
72
+ with gr.Row():
73
+ with gr.Column():
74
+ theme = gr.Dropdown(
75
+ choices=[
76
+ "casamento",
77
+ "criacao_filhos",
78
+ "papel_mulher",
79
+ "papel_homem",
80
+ "financas",
81
+ "trabalho"
82
+ ],
83
+ label="Tema de Aconselhamento",
84
+ value="casamento"
85
+ )
86
+ question = gr.Textbox(
87
+ label="Sua Pergunta",
88
+ placeholder="Qual sua dúvida sobre este tema?",
89
+ lines=2
90
+ )
91
+ submit_btn = gr.Button("🙏 Buscar Orientação Bíblica", variant="primary")
92
+
93
+ with gr.Column():
94
+ theme_info = gr.Textbox(
95
+ label="Passagens Relacionadas ao Tema",
96
+ lines=5
97
+ )
98
+ theme.change(fn=get_theme_summary, inputs=[theme], outputs=[theme_info])
99
+
100
+ counseling_output = gr.Textbox(label="Conselho Bíblico", lines=5)
101
+ references = gr.Textbox(label="Referências Bíblicas", lines=3)
102
+
103
+ submit_btn.click(
104
+ fn=process_counseling,
105
+ inputs=[theme, question],
106
+ outputs=[counseling_output, references]
107
+ )
108
+
109
+ # Aba de Versículo do Dia
110
+ with gr.Tab("✨ Versículo do Dia"):
111
+ gr.Markdown("### Palavra para Reflexão")
112
+ verse_output = gr.Textbox(label="", lines=4)
113
+ refresh_btn = gr.Button("🔄 Novo Versículo")
114
+ refresh_btn.click(fn=get_verse_of_day, inputs=[], outputs=[verse_output])
115
+
116
+ # Aba de Testemunhos
117
+ with gr.Tab("💝 Compartilhe seu Testemunho"):
118
+ gr.Markdown("""
119
+ ### Compartilhe sua Experiência
120
+ Conte como a Palavra de Deus tem transformado sua vida
121
+ """)
122
+ testimony_input = gr.Textbox(
123
+ label="Seu Testemunho",
124
+ placeholder="Compartilhe aqui sua experiência...",
125
+ lines=5
126
+ )
127
+ share_btn = gr.Button("❤️ Compartilhar Testemunho")
128
+ testimony_output = gr.Textbox(label="Status")
129
+ share_btn.click(
130
+ fn=save_testimony,
131
+ inputs=[testimony_input],
132
+ outputs=[testimony_output]
133
+ )
134
+
135
+ # Aba de Recursos
136
+ with gr.Tab("📖 Recursos"):
137
+ gr.Markdown("""
138
+ ### Recursos para Estudo Bíblico
139
+
140
+ #### 📚 Temas Disponíveis:
141
+ - Casamento e Família
142
+ - Criação de Filhos
143
+ - Papel da Mulher
144
+ - Papel do Homem
145
+ - Finanças
146
+ - Trabalho e Vocação
147
+
148
+ #### 🙏 Como Usar:
149
+ 1. Escolha um tema de seu interesse
150
+ 2. Faça sua pergunta específica
151
+ 3. Receba orientação baseada nas Escrituras
152
+ 4. Medite nas passagens fornecidas
153
+
154
+ #### ✝️ Lembre-se:
155
+ - Ore antes de buscar orientação
156
+ - Leia o contexto completo das passagens
157
+ - Busque aconselhamento pastoral presencial quando necessário
158
+ """)
159
+
160
+ # Rodapé
161
+ gr.Markdown("""
162
+ ---
163
+ 💖 Desenvolvido para edificação do Corpo de Cristo | Versão 2.0
164
+
165
+ _"Porque a palavra de Deus é viva e eficaz..." - Hebreus 4:12_
166
+ """)
167
 
168
  return demo
169
 
170
  if __name__ == "__main__":
171
+ logger.info("Iniciando ministério de aconselhamento bíblico aprimorado...")
172
+ demo = create_enhanced_interface()
173
  demo.launch(
174
  server_name="0.0.0.0",
175
  share=True,