danielraynaud commited on
Commit
a25294a
·
verified ·
1 Parent(s): 57ec62c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +345 -216
app.py CHANGED
@@ -6,17 +6,99 @@ from datetime import datetime, timedelta
6
  import pandas as pd
7
  import random
8
  from typing import Dict, List, Optional
 
 
 
9
  from database.db_manager import DatabaseManager
10
  from database.db_operations import adicionar_lote_questoes
11
- from study_generators import StudyPlanGenerator
12
- from performance_system import (
13
- PerformanceAnalyzer,
14
- StudyMaterialGenerator,
15
- ProgressTracker,
16
- initialize_performance_system
17
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
 
19
  class MotivationalCoach:
 
 
20
  def __init__(self):
21
  self.frases_motivacionais = [
22
  "🌟 Cada hora de estudo te aproxima mais do seu objetivo!",
@@ -28,10 +110,11 @@ class MotivationalCoach:
28
  "🌅 Um novo dia, uma nova oportunidade de aprender!",
29
  "🎓 Sua aprovação no Revalida está cada vez mais próxima!"
30
  ]
 
31
  self.dicas_estudo = [
32
  "📌 Faça pequenas pausas a cada 45 minutos de estudo",
33
  "💡 Revise o conteúdo do dia antes de dormir",
34
- "🎯 Estabeleça metas diárias pequenas e alcançáveis",
35
  "📊 Alterne entre diferentes tópicos para manter o interesse",
36
  "🌟 Pratique questões antigas do Revalida regularmente",
37
  "💪 Mantenha uma rotina regular de estudos",
@@ -45,267 +128,308 @@ class MotivationalCoach:
45
  def get_study_tip(self) -> str:
46
  return random.choice(self.dicas_estudo)
47
 
48
- class AdminPanel:
49
- def __init__(self, db: DatabaseManager):
50
- self.db = db
51
-
52
- def process_command(self, message: str, user_id: str) -> str:
53
- if not self.db.is_admin(user_id):
54
- return "Desculpe, apenas administradores têm acesso a este comando."
55
-
56
- command = message.split(maxsplit=1)[1].strip() if len(message.split()) > 1 else ""
57
-
58
- if command.startswith("adicionar_questao"):
59
- try:
60
- questao_data = json.loads(command.split(maxsplit=1)[1])
61
- self.db.add_question(questao_data)
62
- return "Questão adicionada com sucesso!"
63
- except (json.JSONDecodeError, KeyError, IndexError):
64
- return "Erro ao adicionar questão. Verifique o formato dos dados."
65
- elif command.startswith("atualizar_questao"):
66
- try:
67
- questao_id, questao_data = command.split(maxsplit=2)[1:]
68
- questao_data = json.loads(questao_data)
69
- self.db.update_question(int(questao_id), questao_data)
70
- return "Questão atualizada com sucesso!"
71
- except (json.JSONDecodeError, KeyError, IndexError, ValueError):
72
- return "Erro ao atualizar questão. Verifique o formato dos dados."
73
- elif command.startswith("remover_questao"):
74
- try:
75
- questao_id = int(command.split(maxsplit=1)[1])
76
- self.db.remove_question(questao_id)
77
- return "Questão removida com sucesso!"
78
- except (IndexError, ValueError):
79
- return "Erro ao remover questão. Verifique o ID fornecido."
80
- else:
81
- return "Comando inválido. Comandos disponíveis: adicionar_questao, atualizar_questao, remover_questao."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82
 
83
  class CRMJABot:
 
 
84
  def __init__(self):
85
- try:
86
- self.db = DatabaseManager()
87
- except Exception as e:
88
- print(f"Erro ao inicializar o DatabaseManager: {e}")
89
- return
90
-
91
- try:
92
- self.performance, self.material_generator, self.tracker = initialize_performance_system(
93
- self.db.get_connection()
94
- )
95
- except Exception as e:
96
- print(f"Erro ao inicializar o sistema de desempenho: {e}")
97
- return
98
-
99
  self.planner = StudyPlanGenerator(self.db)
100
  self.coach = MotivationalCoach()
101
- self.admin_panel = AdminPanel(self.db)
102
- self.user_info = {}
103
-
 
 
104
  try:
105
  self.qa_pipeline = pipeline(
106
  "question-answering",
107
- model="pierreguillou/bert-base-cased-squad-v1.1-portuguese",
108
  device=-1
109
  )
110
  except Exception as e:
111
- print(f"Erro ao carregar o modelo de perguntas e respostas: {e}")
112
  self.qa_pipeline = None
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
113
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
114
  try:
115
- with open('data/questoes_revalida.json', 'r', encoding='utf-8') as f:
116
- questoes = json.load(f)
117
- sucesso, mensagem = adicionar_lote_questoes(self.db, questoes)
118
- print("Questões adicionadas com sucesso!" if sucesso else f"Erro: {mensagem}")
119
- except Exception as e:
120
- print(f"Erro ao carregar as questões do arquivo JSON: {str(e)}")
121
 
122
- def process_message(self, message, user_id, history):
123
- if user_id not in self.user_info:
124
- self.user_info[user_id] = {'name': None, 'email': None}
125
 
126
- if not self.user_info[user_id]['name']:
127
- self.user_info[user_id]['name'] = message
128
- return f"Prazer em conhecê-lo(a), {message}! Por favor, me informe também seu email para que eu possa personalizar melhor sua experiência."
129
- elif not self.user_info[user_id]['email']:
130
- self.user_info[user_id]['email'] = message
131
- self.db.add_user(user_id, self.user_info[user_id]['name'], self.user_info[user_id]['email'])
132
- return f"Obrigado, {self.user_info[user_id]['name']}! Agora estou pronto para ajudá-lo(a) com sua preparação para o Revalida. O que você gostaria de fazer? Digite /help para ver as opções."
133
-
134
- if message.strip() == "":
135
- return ""
136
-
137
- if message.startswith("/"):
138
- command = message.split()[0]
139
- if command == "/start":
140
- return f"Bem-vindo de volta, {self.user_info[user_id]['name']}! Como posso ajudar hoje?"
141
- elif command == "/help":
142
- return """Comandos disponíveis:
143
- /start - Inicia o bot
144
- /help - Mostra os comandos disponíveis
145
- /progresso - Verifica seu progresso
146
- /resumo - Mostra um resumo do seu desempenho
147
- /estudo - Registra uma sessão de estudo
148
- /lembretes - Configura lembretes de estudo
149
- /admin - Acessa o painel de administração (apenas para administradores)"""
150
- elif command == "/progresso":
151
- return self.check_progress(user_id)
152
- elif command == "/resumo":
153
- return self.get_summary(user_id)
154
- elif command == "/estudo":
155
- return self.study_mode(message, user_id)
156
- elif command == "/lembretes":
157
- return self.set_reminders(message, user_id)
158
- elif command == "/admin":
159
- return self.admin_panel.process_command(message, user_id)
160
- else:
161
- return "Comando inválido. Digite /help para ver os comandos disponíveis."
162
- else:
163
- return self.generate_response(message, user_id, history)
164
-
165
- def generate_response(self, message, user_id, history):
166
- if self.qa_pipeline:
167
- try:
168
- question = message
169
- context = " ".join([msg[1] for msg in history[-5:]])
170
- answer = self.qa_pipeline(question=question, context=context)
171
- return answer['answer']
172
- except Exception as e:
173
- print(f"Erro ao gerar resposta: {e}")
174
- return "Desculpe, não consegui entender sua pergunta. Poderia reformular?"
175
- else:
176
- return "Desculpe, ainda estou aprendendo a responder perguntas gerais. Por enquanto, posso ajudar com comandos específicos. Digite /help para ver o que sei fazer!"
177
 
178
- def check_progress(self, user_id):
 
179
  try:
180
- metrics = self.performance.get_performance_metrics(user_id)
181
- streak_info = self.tracker.calculate_study_streak(user_id)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
182
 
183
- response = f"""📊 Análise Detalhada do seu Progresso:
184
- ⭐ Total de horas estudadas: {metrics['overall_metrics']['total_hours']:.1f}h
185
- 🎯 Média de desempenho: {metrics['overall_metrics']['avg_performance']:.1f}%
186
- 📅 Dias de estudo: {metrics['overall_metrics']['study_days']}
187
- 🔥 Sequência atual: {streak_info['current_streak']} dias
188
- 🏆 Maior sequência: {streak_info['longest_streak']} dias
189
- 📈 Desempenho por área:"""
190
 
191
- for topic, data in metrics['topic_metrics'].items():
192
- avg_score = pd.Series(data['scores']).mean() if data['scores'] else 0
193
- response += f"\n ▪ {topic}: {avg_score:.1f}% ({data['total_hours']}h)"
194
 
195
- weak_topics = [topic for topic, data in metrics['topic_metrics'].items()
196
- if pd.Series(data['scores']).mean() < 70]
 
 
 
 
 
 
 
 
197
 
198
- if weak_topics:
199
- response += "\n\n📚 Áreas que precisam de mais atenção:"
200
- for topic in weak_topics:
201
- resources = self.material_generator.get_recommended_resources(
202
- topic, metrics['topic_metrics'][topic]
203
- )
204
- response += f"\n ▪ {topic}:"
205
- for resource in resources[:2]:
206
- response += f"\n - {resource}"
 
 
 
 
 
 
 
 
 
 
207
 
208
  response += f"\n\n{self.coach.get_motivational_message()}"
209
 
 
 
 
210
  return response
211
 
212
  except Exception as e:
213
  return f"Erro ao verificar progresso: {str(e)}"
214
-
215
- def study_mode(self, message, user_id):
 
216
  try:
217
  parts = message.split()
218
  if len(parts) < 3:
219
  return """📚 Para registrar seu estudo:
220
-
221
  Formato: /estudo área horas
 
222
  Exemplo: /estudo ClínicaMédica 2.5"""
223
-
224
  area = parts[1]
225
  horas = float(parts[2])
226
-
227
- cursor = self.db.get_connection().cursor()
228
  cursor.execute('''
229
- INSERT INTO study_progress
230
- (user_id, date, topic, horas_estudadas, performance_score)
231
- VALUES (?, ?, ?, ?, ?)
232
- ''', (user_id, datetime.now().date(), area, horas, 0.0))
233
- self.db.get_connection().commit()
234
-
235
- metrics = self.performance.get_performance_metrics(user_id)
236
- streak_info = self.tracker.calculate_study_streak(user_id)
237
-
238
- next_plan = self.material_generator.generate_daily_plan(
239
- user_id, horas, metrics['topic_metrics']
240
- )
241
-
242
  response = f"""✅ Ótimo trabalho! Registrei {horas}h de estudo em {area}
243
 
244
- 📊 Status atual:
245
- Total de horas: {metrics['overall_metrics']['total_hours']:.1f}h
246
- 🔥 Sequência: {streak_info['current_streak']} dias
247
- 🏆 Recorde: {streak_info['longest_streak']} dias
248
 
249
- 📚 Sugestões para próxima sessão:"""
250
-
251
- for area, horas in next_plan['distribuicao_horas'].items():
252
- response += f"\n ▪ {area}: {horas}h"
253
-
254
- response += f"\n\n{self.coach.get_motivational_message()}"
255
- response += f"\n\n💡 Dica: {self.coach.get_study_tip()}"
256
 
 
 
257
  return response
258
-
259
  except Exception as e:
260
  return f"Erro ao registrar estudo: {str(e)}"
261
 
262
- def get_summary(self, user_id):
263
- try:
264
- metrics = self.performance.get_performance_metrics(user_id)
265
- streak_info = self.tracker.calculate_study_streak(user_id)
266
-
267
- response = f"""📊 Resumo Completo do seu Desempenho:
268
 
269
- ⏱ Métricas Gerais:
270
- ▪ Total de horas estudadas: {metrics['overall_metrics']['total_hours']:.1f}h
271
- ▪ Média de desempenho: {metrics['overall_metrics']['avg_performance']:.1f}%
272
- ▪ Dias de estudo: {metrics['overall_metrics']['study_days']}
273
- ▪ Sequência atual: {streak_info['current_streak']} dias
274
- ▪ Maior sequência: {streak_info['longest_streak']} dias
275
 
276
- 📈 Progresso por Área:"""
 
 
 
 
 
 
 
 
 
 
277
 
278
- for topic, data in metrics['topic_metrics'].items():
279
- avg_score = pd.Series(data['scores']).mean() if data['scores'] else 0
280
- last_study = data['last_study']
281
- response += f"\n\n📌 {topic}:"
282
- response += f"\n ▪ Desempenho: {avg_score:.1f}%"
283
- response += f"\n ▪ Horas dedicadas: {data['total_hours']}h"
284
- response += f"\n ▪ Último estudo: {last_study}"
285
 
286
- response += f"\n\n{self.coach.get_motivational_message()}"
 
 
287
 
288
- return response
 
 
 
289
 
290
- except Exception as e:
291
- return f"Erro ao gerar resumo: {str(e)}"
292
-
293
- def set_reminders(self, message, user_id):
294
- parts = message.split()
295
- if len(parts) < 3:
296
- return """📅 Para configurar lembretes de estudo:
297
-
298
- Formato: /lembretes hora frequência
299
- Exemplo: /lembretes 20:00 diariamente"""
300
 
301
- reminder_time = parts[1]
302
- frequency = parts[2]
 
303
 
304
- self.db.set_reminder(user_id, reminder_time, frequency)
 
 
305
 
306
- return f"✅ Lembrete de estudo configurado com sucesso para as {reminder_time}, {frequency}!"
307
 
308
  def create_interface():
 
309
  bot = CRMJABot()
310
 
311
  with gr.Blocks(title="crmjaBot - Assistente Revalida") as interface:
@@ -327,9 +451,14 @@ def create_interface():
327
  clear = gr.ClearButton([msg, chatbot])
328
 
329
  def respond(message, history):
330
- if message.strip() == "":
331
- return "", history
332
-
333
  bot_message = bot.process_message(message, user_id.value or "default_user", history)
334
  history.append((message, bot_message))
335
- return "", history
 
 
 
 
 
 
 
 
 
6
  import pandas as pd
7
  import random
8
  from typing import Dict, List, Optional
9
+ from performance_system import PerformanceAnalyzer
10
+ from simulado_system import SimuladoSystem, CasoClinicoSystem
11
+ import json
12
  from database.db_manager import DatabaseManager
13
  from database.db_operations import adicionar_lote_questoes
14
+ from study_generators import StudyMaterialGenerator, StudyPlanGenerator
15
+ from performance_analyzer import PerformanceAnalyzer
16
+ import json
17
+
18
+ class CRMJABot:
19
+ def __init__(self):
20
+ self.db = DatabaseManager()
21
+ self.material_generator = StudyMaterialGenerator(self.db)
22
+ self.planner = StudyPlanGenerator(self.db)
23
+ self.performance = PerformanceAnalyzer(self.db.get_connection()) # Corrigido aqui
24
+
25
+ try:
26
+ with open('data/questoes_revalida.json', 'r', encoding='utf-8') as f:
27
+ questoes = json.load(f)
28
+
29
+ sucesso, mensagem = adicionar_lote_questoes(self.db, questoes)
30
+
31
+ if sucesso:
32
+ print("Questões adicionadas com sucesso!")
33
+ else:
34
+ print(f"Erro: {mensagem}")
35
+
36
+ except Exception as e:
37
+ print(f"Erro na inicialização: {str(e)}")
38
+
39
+ def create_interface():
40
+ return CRMJABot()
41
+
42
+ if __name__ == "__main__":
43
+ interface = create_interface()
44
+ def buscar_questoes_para_simulado(db: DatabaseManager, usuario_id: str,
45
+ num_questoes: int = 10,
46
+ areas: list = None,
47
+ dificuldade: str = None):
48
+ """Busca questões para gerar simulado personalizado"""
49
+ try:
50
+ conn = db.get_connection()
51
+ cursor = conn.cursor()
52
+
53
+ # Busca áreas fracas do usuário
54
+ user_profile = db.get_user_profile(usuario_id)
55
+ weak_areas = user_profile.get('weak_areas', [])
56
+
57
+ # Monta a query
58
+ query = '''
59
+ SELECT * FROM previous_questions
60
+ WHERE 1=1
61
+ '''
62
+ params = []
63
+
64
+ if areas:
65
+ query += ' AND area IN ({})'.format(','.join(['?']*len(areas)))
66
+ params.extend(areas)
67
+
68
+ if dificuldade:
69
+ query += ' AND difficulty = ?'
70
+ params.append(dificuldade)
71
+
72
+ # Prioriza áreas fracas
73
+ if weak_areas:
74
+ query += f'''
75
+ ORDER BY
76
+ CASE
77
+ WHEN area IN ({','.join(['?']*len(weak_areas))}) THEN 1
78
+ ELSE 2
79
+ END,
80
+ RANDOM()
81
+ '''
82
+ params.extend(weak_areas)
83
+ else:
84
+ query += ' ORDER BY RANDOM()'
85
+
86
+ query += ' LIMIT ?'
87
+ params.append(num_questoes)
88
+
89
+ cursor.execute(query, params)
90
+ questoes = cursor.fetchall()
91
+
92
+ return [dict(q) for q in questoes]
93
+
94
+ except Exception as e:
95
+ logger.error(f"Erro ao buscar questões: {e}")
96
+ return []
97
+ from performance_system import PerformanceAnalyzer, StudyMaterialGenerator, ProgressTracker
98
 
99
  class MotivationalCoach:
100
+ """Classe para gerenciar mensagens e estratégias motivacionais"""
101
+
102
  def __init__(self):
103
  self.frases_motivacionais = [
104
  "🌟 Cada hora de estudo te aproxima mais do seu objetivo!",
 
110
  "🌅 Um novo dia, uma nova oportunidade de aprender!",
111
  "🎓 Sua aprovação no Revalida está cada vez mais próxima!"
112
  ]
113
+
114
  self.dicas_estudo = [
115
  "📌 Faça pequenas pausas a cada 45 minutos de estudo",
116
  "💡 Revise o conteúdo do dia antes de dormir",
117
+ "🎯 Estabeleça metas diárias pequenas e alcançáveis",
118
  "📊 Alterne entre diferentes tópicos para manter o interesse",
119
  "🌟 Pratique questões antigas do Revalida regularmente",
120
  "💪 Mantenha uma rotina regular de estudos",
 
128
  def get_study_tip(self) -> str:
129
  return random.choice(self.dicas_estudo)
130
 
131
+ class StudyAnalytics:
132
+ """Classe para análise avançada do progresso do estudante"""
133
+
134
+ def __init__(self, db_connection):
135
+ self.conn = db_connection
136
+
137
+ def calculate_study_metrics(self, user_id: str) -> Dict:
138
+ """Calcula métricas avançadas de estudo"""
139
+ cursor = self.conn.cursor()
140
+
141
+ # Horas totais de estudo
142
+ cursor.execute('''
143
+ SELECT SUM(horas_estudadas) FROM study_progress
144
+ WHERE user_id = ?
145
+ ''', (user_id,))
146
+ total_horas = cursor.fetchone()[0] or 0
147
+
148
+ # Desempenho por área
149
+ cursor.execute('''
150
+ SELECT topic, AVG(performance_score)
151
+ FROM study_progress
152
+ WHERE user_id = ?
153
+ GROUP BY topic
154
+ ''', (user_id,))
155
+ desempenho_por_area = dict(cursor.fetchall())
156
+
157
+ # Consistência de estudos (dias consecutivos)
158
+ cursor.execute('''
159
+ SELECT date FROM study_progress
160
+ WHERE user_id = ?
161
+ ORDER BY date DESC
162
+ ''', (user_id,))
163
+ datas = [row[0] for row in cursor.fetchall()]
164
+ dias_consecutivos = self.calculate_streak(datas)
165
+
166
+ return {
167
+ "total_horas": total_horas,
168
+ "desempenho_por_area": desempenho_por_area,
169
+ "dias_consecutivos": dias_consecutivos
170
+ }
171
+
172
+ @staticmethod
173
+ def calculate_streak(dates: List[str]) -> int:
174
+ if not dates:
175
+ return 0
176
+
177
+ dates = [datetime.strptime(d, '%Y-%m-%d').date() for d in dates]
178
+ dates.sort(reverse=True)
179
+
180
+ streak = 1
181
+ for i in range(len(dates)-1):
182
+ if (dates[i] - dates[i+1]).days == 1:
183
+ streak += 1
184
+ else:
185
+ break
186
+ return streak
187
 
188
  class CRMJABot:
189
+ """Assistente de estudos aprimorado para o Revalida"""
190
+
191
  def __init__(self):
192
+ self.db = DatabaseManager()
 
 
 
 
 
 
 
 
 
 
 
 
 
193
  self.planner = StudyPlanGenerator(self.db)
194
  self.coach = MotivationalCoach()
195
+ self.analytics = StudyAnalytics(self.db.conn)
196
+ self.performance = PerformanceAnalyzer(self.db.get_connection()) # Linha corrigida
197
+ self.material_gen = StudyMaterialGenerator(self.db.conn)
198
+ self.tracker = ProgressTracker(self.db.conn)
199
+
200
  try:
201
  self.qa_pipeline = pipeline(
202
  "question-answering",
203
+ model="pierreguillou/bert-base-cased-squad-v1.1-portuguese",
204
  device=-1
205
  )
206
  except Exception as e:
207
+ print(f"Erro ao carregar o modelo: {e}")
208
  self.qa_pipeline = None
209
+
210
+ self.commands = {
211
+ "/start": self.start_command,
212
+ "/plano": self.create_plan,
213
+ "/progresso": self.check_progress,
214
+ "/questoes": self.previous_questions,
215
+ "/estudo": self.study_mode,
216
+ "/dica": self.get_tip,
217
+ "/motiva": self.get_motivation,
218
+ "/resumo": self.get_summary,
219
+ "/ajuda": self.help_command,
220
+ "/simulado": self.start_simulado,
221
+ "/caso": self.start_caso_clinico,
222
+ "/bancoquestoes": self.banco_questoes,
223
+ "/revisao": self.modo_revisao,
224
+ "/meta": self.set_goal,
225
+ "/perfil": self.show_profile,
226
+ "/configurar": self.configure_preferences
227
+ }
228
+
229
+ def start_command(self, message: str, user_id: str) -> str:
230
+ """Mensagem inicial de boas-vindas"""
231
+ return f"""🌟 Olá! Eu sou o crmjaBot, seu assistente pessoal para o Revalida!
232
+
233
+ Estou aqui para te ajudar a alcançar seu objetivo de aprovação! Vamos juntos nessa jornada?
234
 
235
+ Comandos principais:
236
+ 📚 /plano - Criar plano de estudos personalizado
237
+ 📊 /progresso - Verificar seu progresso
238
+ 📝 /questoes - Praticar questões anteriores
239
+ ⏱ /estudo - Registrar sessão de estudo
240
+ 💡 /dica - Receber dica de estudo
241
+ 🌟 /motiva - Mensagem motivacional
242
+ 📋 /resumo - Resumo do seu desempenho
243
+ ❓ /ajuda - Ver todos os comandos
244
+
245
+ {self.coach.get_motivational_message()}
246
+
247
+ Como posso te ajudar hoje?"""
248
+
249
+ def get_tip(self, message: str, user_id: str) -> str:
250
+ """Fornece dica de estudo"""
251
+ return f"💡 Dica do dia:\n\n{self.coach.get_study_tip()}"
252
+
253
+ def get_motivation(self, message: str, user_id: str) -> str:
254
+ """Fornece mensagem motivacional"""
255
+ return f"✨ Mensagem motivacional:\n\n{self.coach.get_motivational_message()}"
256
+
257
+ def get_summary(self, message: str, user_id: str) -> str:
258
+ """Fornece resumo completo do progresso"""
259
  try:
260
+ metrics = self.analytics.calculate_study_metrics(user_id)
261
+
262
+ response = f"""📊 Resumo do seu desempenho:
263
+
264
+ Total de horas estudadas: {metrics['total_horas']:.1f}h
265
+ 🎯 Sequência atual: {metrics['dias_consecutivos']} dias consecutivos
266
 
267
+ 📈 Desempenho por área:"""
 
 
268
 
269
+ for area, score in metrics['desempenho_por_area'].items():
270
+ response += f"\n- {area}: {score:.1f}%"
271
+
272
+ response += f"\n\n{self.coach.get_motivational_message()}"
273
+
274
+ return response
275
+
276
+ except Exception as e:
277
+ return f"Erro ao gerar resumo: {str(e)}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
278
 
279
+ def create_plan(self, message: str, user_id: str) -> str:
280
+ """Criar plano de estudos personalizado com elementos motivacionais"""
281
  try:
282
+ parts = message.split()
283
+ if len(parts) < 3:
284
+ return """📚 Para criar seu plano personalizado, preciso de algumas informações:
285
+
286
+ Formato: /plano horas_diarias AAAA-MM-DD área1,área2
287
+
288
+ Exemplo: /plano 4 2024-07-15 ClínicaMédica,Cirurgia
289
+
290
+ As áreas disponíveis são:
291
+ - ClínicaMédica
292
+ - Cirurgia
293
+ - Pediatria
294
+ - GinecologiaObstetrícia
295
+ - MedicinaFamília
296
+ - SaúdeMental"""
297
+
298
+ horas = int(parts[1])
299
+ data_alvo = parts[2]
300
+ areas_fracas = parts[3].split(',') if len(parts) > 3 else []
301
 
302
+ plano = self.planner.create_study_plan(user_id, horas, data_alvo, areas_fracas)
 
 
 
 
 
 
303
 
304
+ response = f"""✨ Seu Plano de Estudos Personalizado está pronto!
 
 
305
 
306
+ {self.coach.get_motivational_message()}
307
+
308
+ 📚 Distribuição semanal:"""
309
+
310
+ for semana, topicos in plano.items():
311
+ response += f"\n\n📅 {semana}:"
312
+ for topico, horas in topicos.items():
313
+ response += f"\n ▪ {topico}: {horas}h"
314
+
315
+ response += f"\n\n💡 Dica: {self.coach.get_study_tip()}"
316
 
317
+ return response
318
+
319
+ except Exception as e:
320
+ return f"Erro ao criar plano: {str(e)}"
321
+
322
+ def check_progress(self, message: str, user_id: str) -> str:
323
+ """Verifica o progresso com feedback motivacional"""
324
+ try:
325
+ metrics = self.analytics.calculate_study_metrics(user_id)
326
+
327
+ response = f"""📊 Seu Progresso:
328
+
329
+ ⭐ Incrível! Você já estudou {metrics['total_horas']:.1f} horas no total!
330
+ 🎯 Sequência atual: {metrics['dias_consecutivos']} dias consecutivos
331
+
332
+ 📈 Desempenho por área:"""
333
+
334
+ for area, score in metrics['desempenho_por_area'].items():
335
+ response += f"\n ▪ {area}: {score:.1f}%"
336
 
337
  response += f"\n\n{self.coach.get_motivational_message()}"
338
 
339
+ if metrics['dias_consecutivos'] >= 7:
340
+ response += "\n\n🏆 Parabéns pela dedicação consistente!"
341
+
342
  return response
343
 
344
  except Exception as e:
345
  return f"Erro ao verificar progresso: {str(e)}"
346
+
347
+ def study_mode(self, message: str, user_id: str) -> str:
348
+ """Registra sessão de estudo com feedback motivacional"""
349
  try:
350
  parts = message.split()
351
  if len(parts) < 3:
352
  return """📚 Para registrar seu estudo:
353
+
354
  Formato: /estudo área horas
355
+
356
  Exemplo: /estudo ClínicaMédica 2.5"""
357
+
358
  area = parts[1]
359
  horas = float(parts[2])
360
+
361
+ cursor = self.db.conn.cursor()
362
  cursor.execute('''
363
+ INSERT INTO study_progress
364
+ (user_id, date, topic, horas_estudadas, questions_answered, performance_score)
365
+ VALUES (?, ?, ?, ?, ?, ?)
366
+ ''', (user_id, datetime.now().date(), area, horas, 0, 0.0))
367
+ self.db.conn.commit()
368
+
369
+ metrics = self.analytics.calculate_study_metrics(user_id)
370
+
 
 
 
 
 
371
  response = f"""✅ Ótimo trabalho! Registrei {horas}h de estudo em {area}
372
 
373
+ Total de horas estudadas: {metrics['total_horas']:.1f}h
374
+ 🎯 Sequência atual: {metrics['dias_consecutivos']} dias
 
 
375
 
376
+ {self.coach.get_motivational_message()}
 
 
 
 
 
 
377
 
378
+ 💡 Dica: {self.coach.get_study_tip()}"""
379
+
380
  return response
381
+
382
  except Exception as e:
383
  return f"Erro ao registrar estudo: {str(e)}"
384
 
385
+ def generate_response(self, message: str, history: List) -> str:
386
+ """Gera resposta personalizada usando o pipeline de QA"""
387
+ if not self.qa_pipeline:
388
+ return f"""Desculpe, o modelo de linguagem não está disponível no momento.
 
 
389
 
390
+ {self.coach.get_motivational_message()}
 
 
 
 
 
391
 
392
+ Use /ajuda para ver os comandos disponíveis!"""
393
+
394
+ try:
395
+ context = "\n".join([h[1] for h in history[-3:]] if history else "")
396
+
397
+ result = self.qa_pipeline(
398
+ question=message,
399
+ context=context or "Você é o crmjaBot, um assistente motivacional e educacional para o Revalida."
400
+ )
401
+
402
+ return f"""{result['answer']}
403
 
404
+ {self.coach.get_motivational_message()}"""
405
+ except Exception as e:
406
+ return f"Erro ao gerar resposta: {str(e)}"
 
 
 
 
407
 
408
+ def help_command(self, message: str, user_id: str) -> str:
409
+ """Mostra todos os comandos disponíveis"""
410
+ return """🤖 Comandos do crmjaBot:
411
 
412
+ 📚 Estudos:
413
+ /plano - Criar plano de estudos personalizado
414
+ /estudo - Registrar sessão de estudo
415
+ /questoes - Praticar questões anteriores
416
 
417
+ 📊 Acompanhamento:
418
+ /progresso - Ver seu progresso
419
+ /resumo - Resumo completo do desempenho
 
 
 
 
 
 
 
420
 
421
+ Motivacional:
422
+ /dica - Receber dica de estudo
423
+ /motiva - Mensagem motivacional
424
 
425
+ Ajuda:
426
+ /start - Iniciar/reiniciar bot
427
+ /ajuda - Ver esta mensagem
428
 
429
+ Estou aqui para te ajudar! Como posso ser útil hoje?"""
430
 
431
  def create_interface():
432
+ """Criar interface Gradio"""
433
  bot = CRMJABot()
434
 
435
  with gr.Blocks(title="crmjaBot - Assistente Revalida") as interface:
 
451
  clear = gr.ClearButton([msg, chatbot])
452
 
453
  def respond(message, history):
 
 
 
454
  bot_message = bot.process_message(message, user_id.value or "default_user", history)
455
  history.append((message, bot_message))
456
+ return "", history
457
+
458
+ msg.submit(respond, [msg, chatbot], [msg, chatbot])
459
+
460
+ return interface
461
+
462
+ if __name__ == "__main__":
463
+ interface = create_interface()
464
+ interface.launch()