Spaces:
Runtime error
Runtime error
import gradio as gr | |
from transformers import pipeline | |
import json | |
import sqlite3 | |
from datetime import datetime, timedelta | |
import pandas as pd | |
import random | |
from typing import Dict, List, Optional | |
from performance_system import PerformanceAnalyzer | |
from simulado_system import SimuladoSystem, CasoClinicoSystem | |
import json | |
from database.db_manager import DatabaseManager | |
from database.db_operations import adicionar_lote_questoes | |
from study_generators import StudyMaterialGenerator, StudyPlanGenerator | |
from performance_analyzer import PerformanceAnalyzer | |
import json | |
class CRMJABot: | |
def __init__(self): | |
self.db = DatabaseManager() | |
self.material_generator = StudyMaterialGenerator(self.db) | |
self.planner = StudyPlanGenerator(self.db) | |
self.performance = PerformanceAnalyzer(self.db.get_connection()) # Corrigido aqui | |
try: | |
with open('data/questoes_revalida.json', 'r', encoding='utf-8') as f: | |
questoes = json.load(f) | |
sucesso, mensagem = adicionar_lote_questoes(self.db, questoes) | |
if sucesso: | |
print("Questões adicionadas com sucesso!") | |
else: | |
print(f"Erro: {mensagem}") | |
except Exception as e: | |
print(f"Erro na inicialização: {str(e)}") | |
def create_interface(): | |
return CRMJABot() | |
if __name__ == "__main__": | |
interface = create_interface() | |
def buscar_questoes_para_simulado(db: DatabaseManager, usuario_id: str, | |
num_questoes: int = 10, | |
areas: list = None, | |
dificuldade: str = None): | |
"""Busca questões para gerar simulado personalizado""" | |
try: | |
conn = db.get_connection() | |
cursor = conn.cursor() | |
# Busca áreas fracas do usuário | |
user_profile = db.get_user_profile(usuario_id) | |
weak_areas = user_profile.get('weak_areas', []) | |
# Monta a query | |
query = ''' | |
SELECT * FROM previous_questions | |
WHERE 1=1 | |
''' | |
params = [] | |
if areas: | |
query += ' AND area IN ({})'.format(','.join(['?']*len(areas))) | |
params.extend(areas) | |
if dificuldade: | |
query += ' AND difficulty = ?' | |
params.append(dificuldade) | |
# Prioriza áreas fracas | |
if weak_areas: | |
query += f''' | |
ORDER BY | |
CASE | |
WHEN area IN ({','.join(['?']*len(weak_areas))}) THEN 1 | |
ELSE 2 | |
END, | |
RANDOM() | |
''' | |
params.extend(weak_areas) | |
else: | |
query += ' ORDER BY RANDOM()' | |
query += ' LIMIT ?' | |
params.append(num_questoes) | |
cursor.execute(query, params) | |
questoes = cursor.fetchall() | |
return [dict(q) for q in questoes] | |
except Exception as e: | |
logger.error(f"Erro ao buscar questões: {e}") | |
return [] | |
from performance_system import PerformanceAnalyzer, StudyMaterialGenerator, ProgressTracker | |
class MotivationalCoach: | |
"""Classe para gerenciar mensagens e estratégias motivacionais""" | |
def __init__(self): | |
self.frases_motivacionais = [ | |
"🌟 Cada hora de estudo te aproxima mais do seu objetivo!", | |
"💪 Você está construindo seu futuro a cada dia!", | |
"🎯 Mantenha o foco! O Revalida é só uma etapa da sua jornada de sucesso!", | |
"⭐ Sua dedicação é inspiradora! Continue assim!", | |
"🌈 Acredite no seu potencial! Você está no caminho certo!", | |
"📚 Conhecimento é poder, e você está ficando mais forte a cada dia!", | |
"🌅 Um novo dia, uma nova oportunidade de aprender!", | |
"🎓 Sua aprovação no Revalida está cada vez mais próxima!" | |
] | |
self.dicas_estudo = [ | |
"📌 Faça pequenas pausas a cada 45 minutos de estudo", | |
"💡 Revise o conteúdo do dia antes de dormir", | |
"🎯 Estabeleça metas diárias pequenas e alcançáveis", | |
"📊 Alterne entre diferentes tópicos para manter o interesse", | |
"🌟 Pratique questões antigas do Revalida regularmente", | |
"💪 Mantenha uma rotina regular de estudos", | |
"🧠 Use mapas mentais para conectar conceitos", | |
"📝 Faça resumos ativos do conteúdo estudado" | |
] | |
def get_motivational_message(self) -> str: | |
return random.choice(self.frases_motivacionais) | |
def get_study_tip(self) -> str: | |
return random.choice(self.dicas_estudo) | |
class StudyAnalytics: | |
"""Classe para análise avançada do progresso do estudante""" | |
def __init__(self, db_connection): | |
self.conn = db_connection | |
def calculate_study_metrics(self, user_id: str) -> Dict: | |
"""Calcula métricas avançadas de estudo""" | |
cursor = self.conn.cursor() | |
# Horas totais de estudo | |
cursor.execute(''' | |
SELECT SUM(horas_estudadas) FROM study_progress | |
WHERE user_id = ? | |
''', (user_id,)) | |
total_horas = cursor.fetchone()[0] or 0 | |
# Desempenho por área | |
cursor.execute(''' | |
SELECT topic, AVG(performance_score) | |
FROM study_progress | |
WHERE user_id = ? | |
GROUP BY topic | |
''', (user_id,)) | |
desempenho_por_area = dict(cursor.fetchall()) | |
# Consistência de estudos (dias consecutivos) | |
cursor.execute(''' | |
SELECT date FROM study_progress | |
WHERE user_id = ? | |
ORDER BY date DESC | |
''', (user_id,)) | |
datas = [row[0] for row in cursor.fetchall()] | |
dias_consecutivos = self.calculate_streak(datas) | |
return { | |
"total_horas": total_horas, | |
"desempenho_por_area": desempenho_por_area, | |
"dias_consecutivos": dias_consecutivos | |
} | |
def calculate_streak(dates: List[str]) -> int: | |
if not dates: | |
return 0 | |
dates = [datetime.strptime(d, '%Y-%m-%d').date() for d in dates] | |
dates.sort(reverse=True) | |
streak = 1 | |
for i in range(len(dates)-1): | |
if (dates[i] - dates[i+1]).days == 1: | |
streak += 1 | |
else: | |
break | |
return streak | |
class CRMJABot: | |
"""Assistente de estudos aprimorado para o Revalida""" | |
def __init__(self): | |
self.db = DatabaseManager() | |
self.planner = StudyPlanGenerator(self.db) | |
self.coach = MotivationalCoach() | |
self.analytics = StudyAnalytics(self.db.conn) | |
self.performance = PerformanceAnalyzer(self.db.get_connection()) # Linha corrigida | |
self.material_gen = StudyMaterialGenerator(self.db.conn) | |
self.tracker = ProgressTracker(self.db.conn) | |
try: | |
self.qa_pipeline = pipeline( | |
"question-answering", | |
model="pierreguillou/bert-base-cased-squad-v1.1-portuguese", | |
device=-1 | |
) | |
except Exception as e: | |
print(f"Erro ao carregar o modelo: {e}") | |
self.qa_pipeline = None | |
self.commands = { | |
"/start": self.start_command, | |
"/plano": self.create_plan, | |
"/progresso": self.check_progress, | |
"/questoes": self.previous_questions, | |
"/estudo": self.study_mode, | |
"/dica": self.get_tip, | |
"/motiva": self.get_motivation, | |
"/resumo": self.get_summary, | |
"/ajuda": self.help_command, | |
"/simulado": self.start_simulado, | |
"/caso": self.start_caso_clinico, | |
"/bancoquestoes": self.banco_questoes, | |
"/revisao": self.modo_revisao, | |
"/meta": self.set_goal, | |
"/perfil": self.show_profile, | |
"/configurar": self.configure_preferences | |
} | |
def start_command(self, message: str, user_id: str) -> str: | |
"""Mensagem inicial de boas-vindas""" | |
return f"""🌟 Olá! Eu sou o crmjaBot, seu assistente pessoal para o Revalida! | |
Estou aqui para te ajudar a alcançar seu objetivo de aprovação! Vamos juntos nessa jornada? | |
Comandos principais: | |
📚 /plano - Criar plano de estudos personalizado | |
📊 /progresso - Verificar seu progresso | |
📝 /questoes - Praticar questões anteriores | |
⏱ /estudo - Registrar sessão de estudo | |
💡 /dica - Receber dica de estudo | |
🌟 /motiva - Mensagem motivacional | |
📋 /resumo - Resumo do seu desempenho | |
❓ /ajuda - Ver todos os comandos | |
{self.coach.get_motivational_message()} | |
Como posso te ajudar hoje?""" | |
def get_tip(self, message: str, user_id: str) -> str: | |
"""Fornece dica de estudo""" | |
return f"💡 Dica do dia:\n\n{self.coach.get_study_tip()}" | |
def get_motivation(self, message: str, user_id: str) -> str: | |
"""Fornece mensagem motivacional""" | |
return f"✨ Mensagem motivacional:\n\n{self.coach.get_motivational_message()}" | |
def get_summary(self, message: str, user_id: str) -> str: | |
"""Fornece resumo completo do progresso""" | |
try: | |
metrics = self.analytics.calculate_study_metrics(user_id) | |
response = f"""📊 Resumo do seu desempenho: | |
⏱ Total de horas estudadas: {metrics['total_horas']:.1f}h | |
🎯 Sequência atual: {metrics['dias_consecutivos']} dias consecutivos | |
📈 Desempenho por área:""" | |
for area, score in metrics['desempenho_por_area'].items(): | |
response += f"\n- {area}: {score:.1f}%" | |
response += f"\n\n{self.coach.get_motivational_message()}" | |
return response | |
except Exception as e: | |
return f"Erro ao gerar resumo: {str(e)}" | |
def create_plan(self, message: str, user_id: str) -> str: | |
"""Criar plano de estudos personalizado com elementos motivacionais""" | |
try: | |
parts = message.split() | |
if len(parts) < 3: | |
return """📚 Para criar seu plano personalizado, preciso de algumas informações: | |
Formato: /plano horas_diarias AAAA-MM-DD área1,área2 | |
Exemplo: /plano 4 2024-07-15 ClínicaMédica,Cirurgia | |
As áreas disponíveis são: | |
- ClínicaMédica | |
- Cirurgia | |
- Pediatria | |
- GinecologiaObstetrícia | |
- MedicinaFamília | |
- SaúdeMental""" | |
horas = int(parts[1]) | |
data_alvo = parts[2] | |
areas_fracas = parts[3].split(',') if len(parts) > 3 else [] | |
plano = self.planner.create_study_plan(user_id, horas, data_alvo, areas_fracas) | |
response = f"""✨ Seu Plano de Estudos Personalizado está pronto! | |
{self.coach.get_motivational_message()} | |
📚 Distribuição semanal:""" | |
for semana, topicos in plano.items(): | |
response += f"\n\n📅 {semana}:" | |
for topico, horas in topicos.items(): | |
response += f"\n ▪ {topico}: {horas}h" | |
response += f"\n\n💡 Dica: {self.coach.get_study_tip()}" | |
return response | |
except Exception as e: | |
return f"Erro ao criar plano: {str(e)}" | |
def check_progress(self, message: str, user_id: str) -> str: | |
"""Verifica o progresso com feedback motivacional""" | |
try: | |
metrics = self.analytics.calculate_study_metrics(user_id) | |
response = f"""📊 Seu Progresso: | |
⭐ Incrível! Você já estudou {metrics['total_horas']:.1f} horas no total! | |
🎯 Sequência atual: {metrics['dias_consecutivos']} dias consecutivos | |
📈 Desempenho por área:""" | |
for area, score in metrics['desempenho_por_area'].items(): | |
response += f"\n ▪ {area}: {score:.1f}%" | |
response += f"\n\n{self.coach.get_motivational_message()}" | |
if metrics['dias_consecutivos'] >= 7: | |
response += "\n\n🏆 Parabéns pela dedicação consistente!" | |
return response | |
except Exception as e: | |
return f"Erro ao verificar progresso: {str(e)}" | |
def study_mode(self, message: str, user_id: str) -> str: | |
"""Registra sessão de estudo com feedback motivacional""" | |
try: | |
parts = message.split() | |
if len(parts) < 3: | |
return """📚 Para registrar seu estudo: | |
Formato: /estudo área horas | |
Exemplo: /estudo ClínicaMédica 2.5""" | |
area = parts[1] | |
horas = float(parts[2]) | |
cursor = self.db.conn.cursor() | |
cursor.execute(''' | |
INSERT INTO study_progress | |
(user_id, date, topic, horas_estudadas, questions_answered, performance_score) | |
VALUES (?, ?, ?, ?, ?, ?) | |
''', (user_id, datetime.now().date(), area, horas, 0, 0.0)) | |
self.db.conn.commit() | |
metrics = self.analytics.calculate_study_metrics(user_id) | |
response = f"""✅ Ótimo trabalho! Registrei {horas}h de estudo em {area} | |
⭐ Total de horas estudadas: {metrics['total_horas']:.1f}h | |
🎯 Sequência atual: {metrics['dias_consecutivos']} dias | |
{self.coach.get_motivational_message()} | |
💡 Dica: {self.coach.get_study_tip()}""" | |
return response | |
except Exception as e: | |
return f"Erro ao registrar estudo: {str(e)}" | |
def generate_response(self, message: str, history: List) -> str: | |
"""Gera resposta personalizada usando o pipeline de QA""" | |
if not self.qa_pipeline: | |
return f"""Desculpe, o modelo de linguagem não está disponível no momento. | |
{self.coach.get_motivational_message()} | |
Use /ajuda para ver os comandos disponíveis!""" | |
try: | |
context = "\n".join([h[1] for h in history[-3:]] if history else "") | |
result = self.qa_pipeline( | |
question=message, | |
context=context or "Você é o crmjaBot, um assistente motivacional e educacional para o Revalida." | |
) | |
return f"""{result['answer']} | |
{self.coach.get_motivational_message()}""" | |
except Exception as e: | |
return f"Erro ao gerar resposta: {str(e)}" | |
def help_command(self, message: str, user_id: str) -> str: | |
"""Mostra todos os comandos disponíveis""" | |
return """🤖 Comandos do crmjaBot: | |
📚 Estudos: | |
/plano - Criar plano de estudos personalizado | |
/estudo - Registrar sessão de estudo | |
/questoes - Praticar questões anteriores | |
📊 Acompanhamento: | |
/progresso - Ver seu progresso | |
/resumo - Resumo completo do desempenho | |
✨ Motivacional: | |
/dica - Receber dica de estudo | |
/motiva - Mensagem motivacional | |
❓ Ajuda: | |
/start - Iniciar/reiniciar bot | |
/ajuda - Ver esta mensagem | |
Estou aqui para te ajudar! Como posso ser útil hoje?""" | |
def create_interface(): | |
"""Criar interface Gradio""" | |
bot = CRMJABot() | |
with gr.Blocks(title="crmjaBot - Assistente Revalida") as interface: | |
gr.Markdown("# 🏥 crmjaBot") | |
gr.Markdown("### Seu mentor personalizado para o Revalida") | |
with gr.Row(): | |
with gr.Column(): | |
user_id = gr.Textbox( | |
label="Seu ID (email ou telefone)", | |
placeholder="Digite seu ID único..." | |
) | |
chatbot = gr.Chatbot() | |
msg = gr.Textbox( | |
placeholder="Digite sua mensagem ou comando aqui...", | |
show_label=False | |
) | |
clear = gr.ClearButton([msg, chatbot]) | |
def respond(message, history): | |
bot_message = bot.process_message(message, user_id.value or "default_user", history) | |
history.append((message, bot_message)) | |
return "", history | |
msg.submit(respond, [msg, chatbot], [msg, chatbot]) | |
return interface | |
if __name__ == "__main__": | |
interface = create_interface() | |
interface.launch() |