DHEIVER commited on
Commit
959324b
1 Parent(s): 3b81c1d

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +550 -0
app.py ADDED
@@ -0,0 +1,550 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ from datetime import datetime
3
+ from sentence_transformers import SentenceTransformer
4
+ import numpy as np
5
+ from typing import Dict, List, Tuple
6
+ import matplotlib.pyplot as plt
7
+ from wordcloud import WordCloud
8
+ import seaborn as sns
9
+ import pandas as pd
10
+ from collections import Counter
11
+
12
+ # Load embeddings model
13
+ model = SentenceTransformer('all-MiniLM-L6-v2')
14
+
15
+ # Define questions with categories and context
16
+ PERGUNTAS = [
17
+ {
18
+ "categoria": "autoconhecimento",
19
+ "pergunta": "Qual foi seu maior desafio como líder e como você o superou?",
20
+ "contexto": "desafios liderança superação aprendizado desenvolvimento",
21
+ },
22
+ {
23
+ "categoria": "comunicacao",
24
+ "pergunta": "Como você adapta seu estilo de comunicação para diferentes membros da equipe?",
25
+ "contexto": "comunicação adaptação equipe feedback clareza",
26
+ },
27
+ {
28
+ "categoria": "decisao",
29
+ "pergunta": "Descreva uma decisão difícil recente e como você a tomou.",
30
+ "contexto": "decisão análise processo resultado impacto",
31
+ },
32
+ {
33
+ "categoria": "autoconhecimento",
34
+ "pergunta": "Como você identificou e desenvolveu seus pontos fortes como líder?",
35
+ "contexto": "fortalezas desenvolvimento crescimento reconhecimento",
36
+ },
37
+ {
38
+ "categoria": "comunicacao",
39
+ "pergunta": "Descreva uma situação em que você precisou dar feedback difícil. Como conduziu?",
40
+ "contexto": "feedback difícil comunicação empatia resolução",
41
+ }
42
+ ]
43
+
44
+ # Enhanced response system with more context and situation-specific feedback
45
+ RESPOSTAS_COACH = {
46
+ "autoconhecimento": {
47
+ "positive": [
48
+ {
49
+ "context": "superacao_clara",
50
+ "response": "Sua capacidade de superar esse desafio demonstra resiliência. Especialmente interessante foi como você {specific_action}. Como você pode usar essa experiência para orientar outros líderes em situações similares?",
51
+ "keywords": ["superei", "consegui", "aprendi", "mudei", "cresci"]
52
+ },
53
+ {
54
+ "context": "aprendizado_continuo",
55
+ "response": "Sua jornada de autodesenvolvimento é notável. O fato de você {specific_action} mostra maturidade. Que outros aspectos de liderança essa experiência te motivou a explorar?",
56
+ "keywords": ["desenvolvimento", "estudo", "aprendo", "busco", "evoluo"]
57
+ }
58
+ ],
59
+ "neutral": [
60
+ {
61
+ "context": "em_processo",
62
+ "response": "Você está no caminho certo ao identificar esse desafio. Considerando que você {specific_action}, que recursos ou apoio adicional seriam úteis nesse momento?",
63
+ "keywords": ["tentando", "buscando", "desenvolvendo", "praticando"]
64
+ }
65
+ ],
66
+ "improvement": [
67
+ {
68
+ "context": "dificuldade_identificada",
69
+ "response": "É importante reconhecer áreas de desenvolvimento. Sua menção sobre {specific_action} sugere autoconsciência. Vamos explorar estratégias específicas para fortalecer esse aspecto?",
70
+ "keywords": ["difícil", "complicado", "desafiador", "preciso melhorar"]
71
+ }
72
+ ]
73
+ },
74
+ "comunicacao": {
75
+ "positive": [
76
+ {
77
+ "context": "adaptacao_efetiva",
78
+ "response": "Sua abordagem adaptativa é exemplar. O exemplo de como você {specific_action} demonstra sensibilidade às diferentes necessidades. Como você avalia a efetividade dessas adaptações?",
79
+ "keywords": ["adapto", "personalizo", "ajusto", "observo"]
80
+ }
81
+ ],
82
+ "neutral": [
83
+ {
84
+ "context": "desenvolvendo_estilo",
85
+ "response": "Você está desenvolvendo um repertório interessante de estilos de comunicação. Sua estratégia de {specific_action} tem potencial. Que outros métodos você gostaria de experimentar?",
86
+ "keywords": ["testando", "experimentando", "tentando diferentes"]
87
+ }
88
+ ],
89
+ "improvement": [
90
+ {
91
+ "context": "desafios_comunicacao",
92
+ "response": "Reconhecer desafios na comunicação é o primeiro passo. Considerando sua experiência com {specific_action}, que aspectos específicos você gostaria de desenvolver primeiro?",
93
+ "keywords": ["difícil comunicar", "não consegui", "preciso melhorar"]
94
+ }
95
+ ]
96
+ },
97
+ "decisao": {
98
+ "positive": [
99
+ {
100
+ "context": "processo_estruturado",
101
+ "response": "Seu processo decisório é bem estruturado. A forma como você {specific_action} demonstra pensamento sistêmico. Como você poderia documentar essas práticas para futuras referências?",
102
+ "keywords": ["analisei", "considerei", "planejei", "estruturei"]
103
+ }
104
+ ],
105
+ "neutral": [
106
+ {
107
+ "context": "balanceando_fatores",
108
+ "response": "Você está equilibrando diferentes fatores em suas decisões. Sua menção sobre {specific_action} mostra consciência. Que frameworks de decisão você conhece que poderiam complementar sua abordagem?",
109
+ "keywords": ["pesando", "considerando", "avaliando"]
110
+ }
111
+ ],
112
+ "improvement": [
113
+ {
114
+ "context": "decisao_desafiadora",
115
+ "response": "Decisões complexas exigem coragem. Sua experiência com {specific_action} oferece aprendizados valiosos. Que apoio ou recursos adicionais teriam sido úteis nesse momento?",
116
+ "keywords": ["hesitei", "demorei", "incerto"]
117
+ }
118
+ ]
119
+ }
120
+ }
121
+
122
+ class EnhancedCoach:
123
+ def __init__(self):
124
+ self.pergunta_atual = 0
125
+ self.inicio = datetime.now()
126
+ self.historico_respostas = []
127
+ self.tempo_ultima_resposta = datetime.now()
128
+
129
+ def analisar_sentimento(self, texto: str) -> str:
130
+ """Analisa o sentimento geral da resposta."""
131
+ positive_words = ["consegui", "superei", "aprendi", "melhorei", "efetivo"]
132
+ negative_words = ["difícil", "desafiador", "complicado", "problema", "falha"]
133
+
134
+ texto_lower = texto.lower()
135
+ positive_count = sum(1 for word in positive_words if word in texto_lower)
136
+ negative_count = sum(1 for word in negative_words if word in texto_lower)
137
+
138
+ if positive_count > negative_count:
139
+ return "positive"
140
+ elif negative_count > positive_count:
141
+ return "improvement"
142
+ return "neutral"
143
+
144
+ def extrair_acao_especifica(self, texto: str) -> str:
145
+ """Extrai uma ação específica mencionada na resposta."""
146
+ sentences = texto.split('.')
147
+ for sentence in sentences:
148
+ if any(action in sentence.lower() for action in ["eu", "minha", "realizei", "fiz"]):
149
+ return sentence.strip()
150
+ return texto.split('.')[0].strip()
151
+
152
+ def encontrar_melhor_resposta(self, texto_usuario: str, categoria: str) -> str:
153
+ sentimento = self.analisar_sentimento(texto_usuario)
154
+ acao_especifica = self.extrair_acao_especifica(texto_usuario)
155
+
156
+ respostas_categoria = RESPOSTAS_COACH[categoria][sentimento]
157
+ user_embedding = model.encode(texto_usuario)
158
+
159
+ melhor_resposta = None
160
+ maior_similaridade = -1
161
+
162
+ for template in respostas_categoria:
163
+ context_embedding = model.encode(template["context"])
164
+ similaridade = np.dot(user_embedding, context_embedding)
165
+
166
+ if similaridade > maior_similaridade:
167
+ maior_similaridade = similaridade
168
+ melhor_resposta = template["response"]
169
+
170
+ return melhor_resposta.format(specific_action=acao_especifica.lower())
171
+
172
+ def gerar_resposta(self, texto_usuario: str) -> str:
173
+ self.tempo_ultima_resposta = datetime.now()
174
+ pergunta_atual = PERGUNTAS[self.pergunta_atual]
175
+ self.historico_respostas.append(texto_usuario)
176
+
177
+ feedback = self.encontrar_melhor_resposta(
178
+ texto_usuario,
179
+ pergunta_atual["categoria"]
180
+ )
181
+
182
+ # Analisa padrões nas respostas anteriores
183
+ padrao_identificado = ""
184
+ if len(self.historico_respostas) > 1:
185
+ sentimento_atual = self.analisar_sentimento(texto_usuario)
186
+ sentimento_anterior = self.analisar_sentimento(self.historico_respostas[-2])
187
+
188
+ if sentimento_atual == sentimento_anterior == "positive":
189
+ padrao_identificado = "\n\n💡 Observo um padrão consistente de confiança em suas respostas. Continue desenvolvendo esses pontos fortes!"
190
+ elif sentimento_atual == sentimento_anterior == "improvement":
191
+ padrao_identificado = "\n\n💡 Percebo que você está identificando áreas de desenvolvimento. Vamos focar em estratégias práticas para esses desafios."
192
+
193
+ resposta = f"""### Feedback Personalizado 💭
194
+
195
+ {feedback}{padrao_identificado}
196
+
197
+ #### Pontos para Aprofundamento:
198
+ 1. Como essa experiência se conecta com seus valores de liderança?
199
+ 2. Que recursos específicos você identificou como necessários?
200
+ 3. Qual seria o próximo marco de desenvolvimento nessa área?"""
201
+
202
+ self.pergunta_atual += 1
203
+ if self.pergunta_atual < len(PERGUNTAS):
204
+ proxima = PERGUNTAS[self.pergunta_atual]
205
+ resposta += f"""
206
+
207
+ ### Próxima Reflexão: {proxima['categoria'].title()} 🎯
208
+
209
+ {proxima['pergunta']}
210
+
211
+ Tome um momento para refletir e conectar com suas experiências..."""
212
+ else:
213
+ tempo = (datetime.now() - self.inicio).seconds // 60
214
+ resposta += self.gerar_sumario_final(tempo)
215
+
216
+ return resposta
217
+
218
+ def get_tempo_ultima_resposta(self) -> str:
219
+ """Calcula o tempo desde a última resposta."""
220
+ delta = datetime.now() - self.tempo_ultima_resposta
221
+ minutos = delta.seconds // 60
222
+ segundos = delta.seconds % 60
223
+ return f"{minutos}:{segundos:02d}"
224
+
225
+ def gerar_sumario_final(self, tempo: int) -> str:
226
+ # Analisa padrões gerais nas respostas
227
+ sentimentos = [self.analisar_sentimento(resp) for resp in self.historico_respostas]
228
+ predominante = max(set(sentimentos), key=sentimentos.count)
229
+
230
+ if predominante == "positive":
231
+ perfil = "Você demonstra forte autoconhecimento e confiança em sua liderança."
232
+ elif predominante == "improvement":
233
+ perfil = "Você demonstra excelente capacidade de identificar oportunidades de desenvolvimento."
234
+ else:
235
+ perfil = "Você demonstra uma abordagem equilibrada entre conquistas e desafios."
236
+
237
+ return f"""
238
+
239
+ ### 🎉 Jornada de Desenvolvimento Concluída!
240
+
241
+ ⏱️ Tempo de reflexão: {tempo} minutos
242
+ 📝 Temas explorados: {len(PERGUNTAS)}
243
+
244
+ #### Perfil de Liderança Observado:
245
+ {perfil}
246
+
247
+ #### Recomendações Personalizadas:
248
+ 1. Implemente uma ação específica mencionada em suas reflexões esta semana
249
+ 2. Mantenha um diário de liderança focado nos temas discutidos
250
+ 3. Estabeleça checkpoints mensais para revisar seu progresso
251
+
252
+ Deseja iniciar uma nova jornada de desenvolvimento com outros temas?"""
253
+
254
+ def primeira_pergunta(self):
255
+ return f"""### 👋 Bem-vindo à sua Jornada de Desenvolvimento!
256
+
257
+ Vamos explorar aspectos importantes da sua liderança através de reflexões guiadas.
258
+
259
+ {PERGUNTAS[0]['pergunta']}
260
+
261
+ Tome um momento para conectar com suas experiências e compartilhe sua perspectiva..."""
262
+
263
+ def analyze_sentiment_trend(respostas: List[str]) -> plt.Figure:
264
+ """Generate sentiment analysis plot"""
265
+ coach = EnhancedCoach()
266
+ sentimentos = [coach.analisar_sentimento(resp) for resp in respostas]
267
+
268
+ # Convert sentiments to numeric values
269
+ valor_sentimento = {
270
+ 'positive': 1,
271
+ 'neutral': 0,
272
+ 'improvement': -1
273
+ }
274
+ valores = [valor_sentimento[s] for s in sentimentos]
275
+
276
+ # Create the plot
277
+ fig, ax = plt.subplots(figsize=(8, 4))
278
+ sns.lineplot(data=valores, marker='o', ax=ax)
279
+
280
+ ax.set_title('Tendência de Sentimento nas Respostas')
281
+ ax.set_xlabel('Número da Resposta')
282
+ ax.set_ylabel('Sentimento')
283
+ ax.set_ylim(-1.5, 1.5)
284
+ ax.grid(True)
285
+
286
+ # Add horizontal lines for reference
287
+ ax.axhline(y=0, color='gray', linestyle='--', alpha=0.5)
288
+
289
+ return fig
290
+
291
+ def generate_word_cloud(respostas: List[str]) -> plt.Figure:
292
+ """Generate word cloud visualization"""
293
+ # Combine all responses
294
+ texto_completo = ' '.join(respostas)
295
+
296
+ # Create word cloud
297
+ wordcloud = WordCloud(
298
+ width=800,
299
+ height=400,
300
+ background_color='white',
301
+ colormap='viridis',
302
+ max_words=100
303
+ ).generate(texto_completo)
304
+
305
+ # Create the plot
306
+ fig, ax = plt.subplots(figsize=(10, 5))
307
+ ax.imshow(wordcloud, interpolation='bilinear')
308
+ ax.axis('off')
309
+ ax.set_title('Nuvem de Palavras das Reflexões')
310
+
311
+ return fig
312
+
313
+ def analyze_themes(respostas: List[str]) -> Tuple[str, str]:
314
+ """Analyze strong themes and development areas"""
315
+ coach = EnhancedCoach()
316
+ temas_fortes = []
317
+ areas_desenvolvimento = []
318
+
319
+ for resp in respostas:
320
+ sentimento = coach.analisar_sentimento(resp)
321
+ if sentimento == "positive":
322
+ temas_fortes.append("- " + coach.extrair_acao_especifica(resp))
323
+ elif sentimento == "improvement":
324
+ areas_desenvolvimento.append("- " + coach.extrair_acao_especifica(resp))
325
+
326
+ temas_fortes_str = "\n".join(temas_fortes[:3]) if temas_fortes else "Análise em andamento..."
327
+ areas_desenvolvimento_str = "\n".join(areas_desenvolvimento[:3]) if areas_desenvolvimento else "Análise em andamento..."
328
+
329
+ return temas_fortes_str, areas_desenvolvimento_str
330
+
331
+ def criar_interface():
332
+ coach = EnhancedCoach()
333
+
334
+ with gr.Blocks(title="Coach de Liderança", theme=gr.themes.Soft()) as app:
335
+ with gr.Row():
336
+ with gr.Column(scale=2):
337
+ gr.Markdown("""
338
+ # 🚀 Coach de Liderança
339
+
340
+ Desenvolva sua liderança através de reflexão guiada e feedback personalizado.
341
+ """)
342
+
343
+ with gr.Column(scale=1):
344
+ timer = gr.Number(value=0, label="⏱️ Tempo de Reflexão (minutos)", interactive=False)
345
+ progress = gr.Slider(
346
+ value=0,
347
+ minimum=0,
348
+ maximum=len(PERGUNTAS),
349
+ step=1,
350
+ label="📊 Progresso",
351
+ interactive=False
352
+ )
353
+
354
+ with gr.Tabs() as tabs:
355
+ with gr.Tab("💭 Sessão Atual"):
356
+ chat = gr.Chatbot(
357
+ value=[[None, coach.primeira_pergunta()]],
358
+ height=500,
359
+ show_label=False
360
+ )
361
+
362
+ with gr.Row():
363
+ with gr.Column(scale=4):
364
+ txt = gr.Textbox(
365
+ placeholder="Compartilhe sua reflexão aqui...",
366
+ lines=4,
367
+ label="Sua Resposta"
368
+ )
369
+
370
+ with gr.Column(scale=1, min_width=100):
371
+ with gr.Row():
372
+ btn = gr.Button("Enviar", variant="primary")
373
+ clear = gr.Button("Limpar")
374
+
375
+ with gr.Row():
376
+ tema_atual = gr.Textbox(
377
+ value="Autoconhecimento",
378
+ label="🎯 Tema Atual",
379
+ interactive=False
380
+ )
381
+ tempo_resposta = gr.Textbox(
382
+ value="0:00",
383
+ label="⏱️ Tempo nesta resposta",
384
+ interactive=False
385
+ )
386
+
387
+ with gr.Tab("📊 Insights"):
388
+ with gr.Row():
389
+ with gr.Column():
390
+ sentiment_chart = gr.Plot(label="Análise de Sentimento")
391
+ with gr.Column():
392
+ word_cloud = gr.Plot(label="Nuvem de Palavras")
393
+
394
+ with gr.Row():
395
+ temas_fortes = gr.Textbox(
396
+ label="💪 Temas com Mais Confiança",
397
+ interactive=False,
398
+ lines=3
399
+ )
400
+ areas_desenvolvimento = gr.Textbox(
401
+ label="🎯 Áreas para Desenvolvimento",
402
+ interactive=False,
403
+ lines=3
404
+ )
405
+
406
+ with gr.Tab("📝 Notas & Recursos"):
407
+ with gr.Row():
408
+ notas = gr.Textbox(
409
+ placeholder="Faça anotações durante sua jornada...",
410
+ label="📝 Minhas Notas",
411
+ lines=5
412
+ )
413
+
414
+ with gr.Row():
415
+ with gr.Accordion("📚 Recursos por Tema", open=False):
416
+ gr.Markdown("""
417
+ ### 🎯 Autoconhecimento
418
+ - [Artigo] Desenvolvendo Autoconsciência na Liderança
419
+ - [Exercício] Reflexão sobre Valores e Propósito
420
+ - [Ferramenta] Template de Diário de Liderança
421
+
422
+ ### 💬 Comunicação
423
+ - [Guia] Comunicação Assertiva na Liderança
424
+ - [Checklist] Preparação para Feedbacks Difíceis
425
+ - [Framework] Estrutura de Comunicação Situacional
426
+
427
+ ### 🤔 Tomada de Decisão
428
+ - [Modelo] Framework para Decisões Complexas
429
+ - [Exercício] Análise de Decisões Passadas
430
+ - [Template] Documentação de Decisões Importantes
431
+ """)
432
+
433
+ with gr.Row():
434
+ with gr.Accordion("🔄 Práticas Recomendadas", open=False):
435
+ gr.Markdown("""
436
+ ### 📝 Dicas para Reflexão Efetiva
437
+ 1. Reserve um momento tranquilo para suas reflexões
438
+ 2. Seja específico em seus exemplos
439
+ 3. Conecte suas experiências com aprendizados
440
+ 4. Considere diferentes perspectivas
441
+ 5. Anote insights importantes
442
+
443
+ ### 🎯 Como Aproveitar o Feedback
444
+ 1. Revise os pontos destacados
445
+ 2. Faça conexões com situações atuais
446
+ 3. Defina ações práticas
447
+ 4. Estabeleça prazos para implementação
448
+ 5. Acompanhe seu progresso
449
+ """)
450
+
451
+ def atualizar_timer():
452
+ """Update session timer"""
453
+ return gr.update(value=int((datetime.now() - coach.inicio).total_seconds() / 60))
454
+
455
+ def atualizar_progresso():
456
+ """Update progress bar"""
457
+ return gr.update(value=coach.pergunta_atual)
458
+
459
+ def atualizar_tema():
460
+ """Update current theme"""
461
+ if coach.pergunta_atual < len(PERGUNTAS):
462
+ return PERGUNTAS[coach.pergunta_atual]["categoria"].title()
463
+ return "Jornada Concluída"
464
+
465
+ def atualizar_tempo_resposta():
466
+ """Update response timer"""
467
+ return coach.get_tempo_ultima_resposta()
468
+
469
+ def limpar_chat():
470
+ """Reset chat and all related components"""
471
+ coach.__init__() # Reset coach state
472
+ return {
473
+ chat: [[None, coach.primeira_pergunta()]],
474
+ txt: "",
475
+ progress: 0,
476
+ tema_atual: "Autoconhecimento",
477
+ tempo_resposta: "0:00",
478
+ sentiment_chart: None,
479
+ word_cloud: None,
480
+ temas_fortes: "",
481
+ areas_desenvolvimento: ""
482
+ }
483
+
484
+ def responder(mensagem, historico):
485
+ """Process user response and update interface"""
486
+ if not mensagem.strip():
487
+ return {
488
+ txt: "",
489
+ chat: historico
490
+ }
491
+
492
+ # Generate response
493
+ resposta = coach.gerar_resposta(mensagem)
494
+ historico.append([mensagem, resposta])
495
+
496
+ # Update visualizations
497
+ sentiment_analysis = None
498
+ word_cloud_plot = None
499
+ strong_themes = ""
500
+ development_areas = ""
501
+
502
+ if len(coach.historico_respostas) > 1:
503
+ sentiment_analysis = analyze_sentiment_trend(coach.historico_respostas)
504
+ word_cloud_plot = generate_word_cloud(coach.historico_respostas)
505
+ strong_themes, development_areas = analyze_themes(coach.historico_respostas)
506
+
507
+ return {
508
+ txt: "",
509
+ chat: historico,
510
+ timer: int((datetime.now() - coach.inicio).total_seconds() / 60),
511
+ progress: coach.pergunta_atual,
512
+ tema_atual: atualizar_tema(),
513
+ tempo_resposta: "0:00",
514
+ sentiment_chart: sentiment_analysis,
515
+ word_cloud: word_cloud_plot,
516
+ temas_fortes: strong_themes,
517
+ areas_desenvolvimento: development_areas
518
+ }
519
+
520
+ # Event handlers
521
+ txt.submit(
522
+ responder,
523
+ [txt, chat],
524
+ [txt, chat, timer, progress, tema_atual, tempo_resposta,
525
+ sentiment_chart, word_cloud, temas_fortes, areas_desenvolvimento]
526
+ )
527
+
528
+ btn.click(
529
+ responder,
530
+ [txt, chat],
531
+ [txt, chat, timer, progress, tema_atual, tempo_resposta,
532
+ sentiment_chart, word_cloud, temas_fortes, areas_desenvolvimento]
533
+ )
534
+
535
+ clear.click(
536
+ limpar_chat,
537
+ None,
538
+ [chat, txt, progress, tema_atual, tempo_resposta,
539
+ sentiment_chart, word_cloud, temas_fortes, areas_desenvolvimento]
540
+ )
541
+
542
+ # Periodic updates
543
+ timer.update(atualizar_timer, every=60) # Update timer every minute
544
+ tempo_resposta.update(atualizar_tempo_resposta, every=1) # Update response timer every second
545
+
546
+ return app
547
+
548
+ if __name__ == "__main__":
549
+ app = criar_interface()
550
+ app.launch()