danielraynaud commited on
Commit
49db22a
·
verified ·
1 Parent(s): 918f674

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +95 -327
app.py CHANGED
@@ -6,99 +6,17 @@ from datetime import datetime, timedelta
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,7 +28,6 @@ class MotivationalCoach:
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",
@@ -128,75 +45,18 @@ class MotivationalCoach:
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",
@@ -206,138 +66,50 @@ class CRMJABot:
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ê 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
 
@@ -345,91 +117,87 @@ As áreas disponíveis são:
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:
 
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
  "🌅 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",
 
45
  def get_study_tip(self) -> str:
46
  return random.choice(self.dicas_estudo)
47
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
  class CRMJABot:
 
 
49
  def __init__(self):
50
  self.db = DatabaseManager()
51
+
52
+ # Inicializa sistema de performance
53
+ self.performance, self.material_generator, self.tracker = initialize_performance_system(
54
+ self.db.get_connection()
55
+ )
56
+
57
  self.planner = StudyPlanGenerator(self.db)
58
  self.coach = MotivationalCoach()
59
+
 
 
 
 
60
  try:
61
  self.qa_pipeline = pipeline(
62
  "question-answering",
 
66
  except Exception as e:
67
  print(f"Erro ao carregar o modelo: {e}")
68
  self.qa_pipeline = None
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
69
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
  try:
71
+ with open('data/questoes_revalida.json', 'r', encoding='utf-8') as f:
72
+ questoes = json.load(f)
73
+ sucesso, mensagem = adicionar_lote_questoes(self.db, questoes)
74
+ print("Questões adicionadas com sucesso!" if sucesso else f"Erro: {mensagem}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
75
  except Exception as e:
76
+ print(f"Erro na inicialização: {str(e)}")
77
 
78
  def check_progress(self, message: str, user_id: str) -> str:
 
79
  try:
80
+ # Obtém métricas detalhadas usando o novo sistema
81
+ metrics = self.performance.get_performance_metrics(user_id)
82
+ streak_info = self.tracker.calculate_study_streak(user_id)
83
 
84
+ response = f"""📊 Análise Detalhada do seu Progresso:
85
 
86
+ Total de horas estudadas: {metrics['overall_metrics']['total_hours']:.1f}h
87
+ 🎯 Média de desempenho: {metrics['overall_metrics']['avg_performance']:.1f}%
88
+ 📅 Dias de estudo: {metrics['overall_metrics']['study_days']}
89
+ 🔥 Sequência atual: {streak_info['current_streak']} dias
90
+ 🏆 Maior sequência: {streak_info['longest_streak']} dias
91
 
92
  📈 Desempenho por área:"""
93
 
94
+ for topic, data in metrics['topic_metrics'].items():
95
+ avg_score = np.mean(data['scores']) if data['scores'] else 0
96
+ response += f"\n ▪ {topic}: {avg_score:.1f}% ({data['total_hours']}h)"
97
 
98
+ # Adiciona recomendações baseadas no desempenho
99
+ weak_topics = [topic for topic, data in metrics['topic_metrics'].items()
100
+ if np.mean(data['scores']) < 70]
101
 
102
+ if weak_topics:
103
+ response += "\n\n📚 Áreas que precisam de mais atenção:"
104
+ for topic in weak_topics:
105
+ resources = self.material_generator.get_recommended_resources(
106
+ topic, metrics['topic_metrics'][topic]
107
+ )
108
+ response += f"\n ▪ {topic}:"
109
+ for resource in resources[:2]: # Limita a 2 recursos por tópico
110
+ response += f"\n - {resource}"
111
+
112
+ response += f"\n\n{self.coach.get_motivational_message()}"
113
 
114
  return response
115
 
 
117
  return f"Erro ao verificar progresso: {str(e)}"
118
 
119
  def study_mode(self, message: str, user_id: str) -> str:
 
120
  try:
121
  parts = message.split()
122
  if len(parts) < 3:
123
  return """📚 Para registrar seu estudo:
124
+
125
  Formato: /estudo área horas
 
126
  Exemplo: /estudo ClínicaMédica 2.5"""
127
 
128
  area = parts[1]
129
  horas = float(parts[2])
130
 
131
+ # Registra a sessão
132
+ cursor = self.db.get_connection().cursor()
133
  cursor.execute('''
134
  INSERT INTO study_progress
135
+ (user_id, date, topic, horas_estudadas, performance_score)
136
+ VALUES (?, ?, ?, ?, ?)
137
+ ''', (user_id, datetime.now().date(), area, horas, 0.0))
138
+ self.db.get_connection().commit()
139
+
140
+ # Obtém métricas atualizadas
141
+ metrics = self.performance.get_performance_metrics(user_id)
142
+ streak_info = self.tracker.calculate_study_streak(user_id)
143
+
144
+ # Gera plano personalizado para próxima sessão
145
+ next_plan = self.material_generator.generate_daily_plan(
146
+ user_id, horas, metrics['topic_metrics']
147
+ )
148
 
149
  response = f"""✅ Ótimo trabalho! Registrei {horas}h de estudo em {area}
150
 
151
+ 📊 Status atual:
152
+ Total de horas: {metrics['overall_metrics']['total_hours']:.1f}h
153
+ 🔥 Sequência: {streak_info['current_streak']} dias
154
+ 🏆 Recorde: {streak_info['longest_streak']} dias
155
 
156
+ 📚 Sugestões para próxima sessão:"""
157
 
158
+ for area, horas in next_plan['distribuicao_horas'].items():
159
+ response += f"\n ▪ {area}: {horas}h"
160
+
161
+ response += f"\n\n{self.coach.get_motivational_message()}"
162
+ response += f"\n\n💡 Dica: {self.coach.get_study_tip()}"
163
 
164
  return response
165
 
166
  except Exception as e:
167
  return f"Erro ao registrar estudo: {str(e)}"
168
 
169
+ def get_summary(self, message: str, user_id: str) -> str:
170
+ try:
171
+ metrics = self.performance.get_performance_metrics(user_id)
172
+ streak_info = self.tracker.calculate_study_streak(user_id)
173
+
174
+ response = f"""📊 Resumo Completo do seu Desempenho:
175
 
176
+ ⏱ Métricas Gerais:
177
+ ▪ Total de horas estudadas: {metrics['overall_metrics']['total_hours']:.1f}h
178
+ ▪ Média de desempenho: {metrics['overall_metrics']['avg_performance']:.1f}%
179
+ ▪ Dias de estudo: {metrics['overall_metrics']['study_days']}
180
+ ▪ Sequência atual: {streak_info['current_streak']} dias
181
+ ▪ Maior sequência: {streak_info['longest_streak']} dias
182
 
183
+ 📈 Progresso por Área:"""
184
 
185
+ for topic, data in metrics['topic_metrics'].items():
186
+ avg_score = np.mean(data['scores']) if data['scores'] else 0
187
+ last_study = data['last_study']
188
+ response += f"\n\n📌 {topic}:"
189
+ response += f"\n ▪ Desempenho: {avg_score:.1f}%"
190
+ response += f"\n ▪ Horas dedicadas: {data['total_hours']}h"
191
+ response += f"\n ▪ Último estudo: {last_study}"
192
+
193
+ response += f"\n\n{self.coach.get_motivational_message()}"
194
 
195
+ return response
 
 
 
196
 
 
 
 
197
  except Exception as e:
198
+ return f"Erro ao gerar resumo: {str(e)}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
199
 
200
  def create_interface():
 
201
  bot = CRMJABot()
202
 
203
  with gr.Blocks(title="crmjaBot - Assistente Revalida") as interface: