import gradio as gr import re from typing import List, Dict, Set from difflib import SequenceMatcher from datetime import datetime, timedelta import logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) class AssistenteBiblico: def __init__(self): self.dados_biblia = [ {"referencia": "Filipenses 4:6-7", "texto": "Não andeis ansiosos por coisa alguma...", "palavras_chave": ["ansiedade", "paz"], "topicos": ["Ansiedade", "Paz"]}, {"referencia": "1 Pedro 5:7", "texto": "Lancem sobre ele toda a sua ansiedade...", "palavras_chave": ["ansiedade", "cuidado"], "topicos": ["Ansiedade", "Confiança"]}, {"referencia": "Efésios 6:4", "texto": "E vós, pais, não provoqueis vossos filhos...", "palavras_chave": ["filhos", "família"], "topicos": ["Família", "Educação"]}, {"referencia": "1 Coríntios 13:4-7", "texto": "O amor é paciente, o amor é bondoso...", "palavras_chave": ["amor", "relacionamento"], "topicos": ["Amor", "Relacionamentos"]}, {"referencia": "Efésios 5:25", "texto": "Maridos, amai vossas mulheres, como também Cristo amou a igreja...", "palavras_chave": ["casamento", "amor"], "topicos": ["Casamento", "Amor"]}, {"referencia": "Gênesis 2:24", "texto": "Por isso, deixa o homem pai e mãe e se une à sua mulher, tornando-se os dois uma só carne.", "palavras_chave": ["casamento", "união"], "topicos": ["Casamento", "União"]}, {"referencia": "Provérbios 31:10", "texto": "Mulher virtuosa, quem a achará? O seu valor muito excede o de rubis.", "palavras_chave": ["casamento", "virtude"], "topicos": ["Casamento", "Virtude"]} ] self.cache_pesquisa = {} self.max_cache_size = 100 self.cache_expiry = timedelta(hours=24) def _expandir_palavras_chave(self, palavras: List[str]) -> Set[str]: sinonimos = { "ansiedade": ["preocupação", "aflição"], "amor": ["afeição", "carinho"], "família": ["parentes", "lar"], "casamento": ["matrimônio", "união", "casal", "cônjuge"] } expandidas = set(palavra.lower() for palavra in palavras) for palavra in palavras: if palavra in sinonimos: expandidas.update(sinonimos[palavra]) return expandidas def calcular_relevancia(self, texto_busca: str, versiculo: Dict) -> float: if not texto_busca or not versiculo: return 0.0 texto_busca = texto_busca.lower().strip() palavras_busca = set(re.findall(r'\w+', texto_busca)) pesos = {'palavras_chave': 1.0, 'topicos': 0.8, 'texto': 0.3} pontuacao = 0.0 matches_palavras = palavras_busca.intersection(set(v.lower() for v in versiculo['palavras_chave'])) pontuacao += len(matches_palavras) * pesos['palavras_chave'] matches_topicos = palavras_busca.intersection(set(v.lower() for v in versiculo['topicos'])) pontuacao += len(matches_topicos) * pesos['topicos'] similaridade_texto = SequenceMatcher(None, texto_busca, versiculo['texto'].lower()).ratio() pontuacao += similaridade_texto * pesos['texto'] return pontuacao def buscar_versiculos(self, texto: str, max_versiculos: int = 3) -> List[Dict]: if not texto or max_versiculos < 1: return [] cache_key = texto.lower().strip() if cache_key in self.cache_pesquisa and datetime.now() - self.cache_pesquisa[cache_key]['timestamp'] < self.cache_expiry: return self.cache_pesquisa[cache_key]['resultados'] resultados = [(self.calcular_relevancia(texto, v), v) for v in self.dados_biblia] resultados.sort(reverse=True) versiculos = [v[1] for v in resultados[:max_versiculos]] self.cache_pesquisa[cache_key] = {'timestamp': datetime.now(), 'resultados': versiculos} if len(self.cache_pesquisa) > self.max_cache_size: chaves_antigas = sorted(self.cache_pesquisa.keys(), key=lambda k: self.cache_pesquisa[k]['timestamp'])[:-self.max_cache_size] for k in chaves_antigas: del self.cache_pesquisa[k] return versiculos def gerar_resposta(self, pergunta: str) -> str: if not pergunta: return "Por favor, forneça uma pergunta válida." try: versiculos = self.buscar_versiculos(pergunta) if not versiculos: return "🤔 Não encontrei versículos específicos para sua pergunta." resposta = "📖 Encontrei estas palavras de sabedoria:\n\n" for i, v in enumerate(versiculos, 1): resposta += f"#{i} {v['referencia']}\n{v['texto']}\n\n" resposta += "🙏 Reflita sobre estas palavras." return resposta except Exception as e: logger.error(f"Erro: {str(e)}") return "Desculpe, ocorreu um erro. Tente novamente." def criar_interface(): assistente = AssistenteBiblico() def processar_prompt(prompt: str, historico: List) -> List: if not prompt or len(prompt.strip()) < 3: return historico + [(prompt, "Por favor, digite uma pergunta mais detalhada.")] try: resposta = assistente.gerar_resposta(prompt) novo_historico = historico + [(prompt, resposta)] return novo_historico[-10:] # Mantém últimas 10 interações except Exception as e: logger.error(f"Erro: {str(e)}") return historico + [(prompt, "Erro ao processar pergunta.")] with gr.Blocks(title="Assistente Bíblico") as demo: gr.HTML("""

🙏 Conselheiro Bíblico

Encontre orientação nas Escrituras

""") with gr.Row(): with gr.Column(scale=2): chatbot = gr.Chatbot(height=500, label="Diálogo") with gr.Row(): msg = gr.Textbox(show_label=False, placeholder="Digite sua dúvida...") clear = gr.Button("🔄 Recomeçar") with gr.Column(scale=1): gr.Markdown("### 📚 Perguntas sobre Casamento") perguntas_casamento = [ "Como ter um casamento abençoado?", "Qual o papel do marido no casamento?", "Qual o papel da esposa no casamento?", "Como resolver conflitos no casamento?", "O que a Bíblia diz sobre amor conjugal?", "Como manter a união no casamento?", "Como superar crises no casamento?", "Como ter um casamento segundo Deus?", "Como perdoar no casamento?", "Como cultivar intimidade no casamento?" ] for pergunta in perguntas_casamento: gr.Button(pergunta).click( fn=processar_prompt, inputs=[gr.Textbox(value=pergunta, visible=False), chatbot], outputs=[chatbot] ) gr.Markdown("### 💡 Outras Sugestões") sugestoes = ["Como encontrar paz?", "Orientação para família", "Sobre amor e relacionamentos"] for sugestao in sugestoes: gr.Button(sugestao).click( fn=processar_prompt, inputs=[gr.Textbox(value=sugestao, visible=False), chatbot], outputs=[chatbot] ) msg.submit(processar_prompt, [msg, chatbot], [chatbot]) clear.click(lambda: [], None, chatbot, queue=False) return demo if __name__ == "__main__": demo = criar_interface() demo.launch(share=True, server_name="0.0.0.0", server_port=7860)