Spaces:
Sleeping
Sleeping
Create app.py
Browse files
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()
|