Spaces:
Runtime error
Runtime error
File size: 16,225 Bytes
be139a9 a6d3af7 3d3112d f26a057 a6d3af7 f26a057 a25294a 8ad5fda b2fd8db a25294a 931beba a25294a f26a057 a6d3af7 a25294a a6d3af7 a25294a a6d3af7 a25294a a6d3af7 f26a057 a25294a a4889af a6d3af7 148625d a25294a 8328a9f 148625d a25294a 41c1961 148625d a6d3af7 a25294a a6d3af7 148625d a25294a a6d3af7 a25294a a6d3af7 a25294a 3d3112d a25294a 3d3112d a25294a a4889af a25294a a4889af a25294a f26a057 a25294a f26a057 a25294a f26a057 a25294a a6d3af7 a25294a f26a057 a25294a 49db22a f26a057 a25294a f26a057 a6d3af7 a25294a f26a057 a6d3af7 a25294a a6d3af7 a25294a a6d3af7 a25294a f26a057 a6d3af7 a25294a f26a057 a25294a a6d3af7 a25294a a6d3af7 a25294a a4889af a25294a a6d3af7 a25294a f26a057 3d3112d a25294a a6d3af7 a25294a a6d3af7 a25294a a4889af a25294a 49db22a a25294a a4889af a25294a a4889af a25294a a4889af a25294a a4889af a25294a a4889af a25294a a4889af 3d3112d a25294a a6d3af7 3d3112d a6d3af7 f26a057 3d3112d a6d3af7 a25294a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 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 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 |
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.get_connection())
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
}
@staticmethod
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:
def __init__(self):
self.db = DatabaseManager()
self.material_generator = StudyMaterialGenerator(self.db.get_connection())
self.planner = StudyPlanGenerator(self.db)
self.coach = MotivationalCoach()
self.analytics = StudyAnalytics(self.db.conn)
self.tracker = ProgressTracker(self.db.conn)
self.performance = PerformanceAnalyzer()
self.performance.set_db_connection(self.db.get_connection())
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() |