Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -4,122 +4,17 @@ from sentence_transformers import SentenceTransformer
|
|
4 |
import numpy as np
|
5 |
from typing import Dict, List, Tuple
|
6 |
from textblob import TextBlob
|
|
|
7 |
|
8 |
# Load embeddings model
|
9 |
model = SentenceTransformer('all-MiniLM-L6-v2')
|
10 |
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
{
|
18 |
-
"categoria": "comunicacao",
|
19 |
-
"pergunta": "Como você adapta seu estilo de comunicação para diferentes membros da equipe?",
|
20 |
-
"contexto": "comunicação adaptação equipe feedback clareza",
|
21 |
-
},
|
22 |
-
{
|
23 |
-
"categoria": "decisao",
|
24 |
-
"pergunta": "Descreva uma decisão difícil recente e como você a tomou.",
|
25 |
-
"contexto": "decisão análise processo resultado impacto",
|
26 |
-
},
|
27 |
-
{
|
28 |
-
"categoria": "autoconhecimento",
|
29 |
-
"pergunta": "Como você identificou e desenvolveu seus pontos fortes como líder?",
|
30 |
-
"contexto": "fortalezas desenvolvimento crescimento reconhecimento",
|
31 |
-
},
|
32 |
-
{
|
33 |
-
"categoria": "comunicacao",
|
34 |
-
"pergunta": "Descreva uma situação em que você precisou dar feedback difícil. Como conduziu?",
|
35 |
-
"contexto": "feedback difícil comunicação empatia resolução",
|
36 |
-
}
|
37 |
-
]
|
38 |
-
|
39 |
-
TONE_PATTERNS = {
|
40 |
-
"confiante": ["certamente", "sem dúvida", "confio", "tenho certeza", "definitivamente"],
|
41 |
-
"reflexivo": ["penso que", "considero", "reflito", "analiso", "pondero"],
|
42 |
-
"hesitante": ["talvez", "pode ser", "não tenho certeza", "possivelmente", "acho que"],
|
43 |
-
"pragmatico": ["na prática", "concretamente", "efetivamente", "resultado", "implementei"],
|
44 |
-
"emocional": ["sinto", "emocionalmente", "impactado", "motivado", "frustrado"]
|
45 |
-
}
|
46 |
-
|
47 |
-
RESPOSTAS_COACH = {
|
48 |
-
"autoconhecimento": {
|
49 |
-
"positive": [
|
50 |
-
{
|
51 |
-
"context": "superacao_clara",
|
52 |
-
"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?",
|
53 |
-
"keywords": ["superei", "consegui", "aprendi", "mudei", "cresci"]
|
54 |
-
},
|
55 |
-
{
|
56 |
-
"context": "aprendizado_continuo",
|
57 |
-
"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?",
|
58 |
-
"keywords": ["desenvolvimento", "estudo", "aprendo", "busco", "evoluo"]
|
59 |
-
}
|
60 |
-
],
|
61 |
-
"neutral": [
|
62 |
-
{
|
63 |
-
"context": "em_processo",
|
64 |
-
"response": "Você está no caminho certo ao identificar esse desafio. Considerando que você {specific_action}, que recursos ou apoio adicional seriam úteis nesse momento?",
|
65 |
-
"keywords": ["tentando", "buscando", "desenvolvendo", "praticando"]
|
66 |
-
}
|
67 |
-
],
|
68 |
-
"improvement": [
|
69 |
-
{
|
70 |
-
"context": "dificuldade_identificada",
|
71 |
-
"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?",
|
72 |
-
"keywords": ["difícil", "complicado", "desafiador", "preciso melhorar"]
|
73 |
-
}
|
74 |
-
]
|
75 |
-
},
|
76 |
-
"comunicacao": {
|
77 |
-
"positive": [
|
78 |
-
{
|
79 |
-
"context": "adaptacao_efetiva",
|
80 |
-
"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?",
|
81 |
-
"keywords": ["adapto", "personalizo", "ajusto", "observo"]
|
82 |
-
}
|
83 |
-
],
|
84 |
-
"neutral": [
|
85 |
-
{
|
86 |
-
"context": "desenvolvendo_estilo",
|
87 |
-
"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?",
|
88 |
-
"keywords": ["testando", "experimentando", "tentando diferentes"]
|
89 |
-
}
|
90 |
-
],
|
91 |
-
"improvement": [
|
92 |
-
{
|
93 |
-
"context": "desafios_comunicacao",
|
94 |
-
"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?",
|
95 |
-
"keywords": ["difícil comunicar", "não consegui", "preciso melhorar"]
|
96 |
-
}
|
97 |
-
]
|
98 |
-
},
|
99 |
-
"decisao": {
|
100 |
-
"positive": [
|
101 |
-
{
|
102 |
-
"context": "processo_estruturado",
|
103 |
-
"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?",
|
104 |
-
"keywords": ["analisei", "considerei", "planejei", "estruturei"]
|
105 |
-
}
|
106 |
-
],
|
107 |
-
"neutral": [
|
108 |
-
{
|
109 |
-
"context": "balanceando_fatores",
|
110 |
-
"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?",
|
111 |
-
"keywords": ["pesando", "considerando", "avaliando"]
|
112 |
-
}
|
113 |
-
],
|
114 |
-
"improvement": [
|
115 |
-
{
|
116 |
-
"context": "decisao_desafiadora",
|
117 |
-
"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?",
|
118 |
-
"keywords": ["hesitei", "demorei", "incerto"]
|
119 |
-
}
|
120 |
-
]
|
121 |
-
}
|
122 |
-
}
|
123 |
|
124 |
class EnhancedCoach:
|
125 |
def __init__(self):
|
@@ -253,152 +148,9 @@ class EnhancedCoach:
|
|
253 |
melhor_resposta = template["response"]
|
254 |
|
255 |
return melhor_resposta.format(specific_action=acao_especifica.lower())
|
256 |
-
|
257 |
-
def gerar_resposta(self, texto_usuario: str) -> str:
|
258 |
-
quality_metrics = self.analyze_response_quality(texto_usuario)
|
259 |
-
|
260 |
-
if quality_metrics["depth"] < 0.15 and quality_metrics["specificity"] < 0.1:
|
261 |
-
return """### Feedback Inicial 💭
|
262 |
-
|
263 |
-
Para oferecer um feedback mais valioso, poderia compartilhar mais detalhes específicos sobre sua experiência?
|
264 |
-
Alguns aspectos que enriqueceriam sua reflexão:
|
265 |
-
- Exemplos concretos da situação
|
266 |
-
- Ações específicas tomadas
|
267 |
-
- Resultados observados"""
|
268 |
-
|
269 |
-
if self.sessao_completa:
|
270 |
-
self.__init__()
|
271 |
-
|
272 |
-
if self.pergunta_atual >= len(PERGUNTAS):
|
273 |
-
tempo = (datetime.now() - self.inicio).seconds // 60
|
274 |
-
return self.gerar_sumario_final(tempo)
|
275 |
-
|
276 |
-
tom_predominante, intensidade = self.analisar_tom(texto_usuario)
|
277 |
-
self.tone_history.append(tom_predominante)
|
278 |
-
|
279 |
-
pergunta_atual = PERGUNTAS[self.pergunta_atual]
|
280 |
-
self.historico_respostas.append(texto_usuario)
|
281 |
-
|
282 |
-
feedback = self.encontrar_melhor_resposta(
|
283 |
-
texto_usuario,
|
284 |
-
pergunta_atual["categoria"]
|
285 |
-
)
|
286 |
-
|
287 |
-
tom_insight = self._gerar_insight_tom(tom_predominante, intensidade)
|
288 |
-
padrao_identificado = self._analisar_padroes()
|
289 |
-
|
290 |
-
resposta = f"""### Feedback Personalizado 💭\n\n{feedback}{padrao_identificado}\n\n{tom_insight}"""
|
291 |
-
resposta += self._gerar_pontos_aprofundamento()
|
292 |
-
|
293 |
-
self.pergunta_atual += 1
|
294 |
-
if self.pergunta_atual < len(PERGUNTAS):
|
295 |
-
resposta += self._gerar_proxima_pergunta()
|
296 |
-
else:
|
297 |
-
self.sessao_completa = True
|
298 |
-
tempo = (datetime.now() - self.inicio).seconds // 60
|
299 |
-
resposta += self.gerar_sumario_final(tempo)
|
300 |
-
|
301 |
-
return resposta
|
302 |
-
|
303 |
-
def _gerar_insight_tom(self, tom: str, intensidade: float) -> str:
|
304 |
-
insights = {
|
305 |
-
"confiante": "Sua confiança ao abordar este tema é notável. Como você construiu esta segurança?",
|
306 |
-
"reflexivo": "Sua abordagem reflexiva traz profundidade à análise. Continue explorando diferentes perspectivas.",
|
307 |
-
"hesitante": "Percebo algumas incertezas naturais do processo. Que apoio ajudaria a fortalecer sua confiança?",
|
308 |
-
"pragmatico": "Seu foco em resultados práticos é valioso. Como você equilibra isso com visão de longo prazo?",
|
309 |
-
"emocional": "Sua conexão emocional com a liderança demonstra comprometimento genuíno."
|
310 |
-
}
|
311 |
-
|
312 |
-
if intensidade > 2:
|
313 |
-
return f"\n\n💡 {insights[tom]} Sua expressão é particularmente intensa neste aspecto."
|
314 |
-
return f"\n\n💡 {insights[tom]}"
|
315 |
-
|
316 |
-
def _analisar_padroes(self) -> str:
|
317 |
-
if len(self.historico_respostas) <= 1:
|
318 |
-
return ""
|
319 |
-
|
320 |
-
sentimento_atual = self.analisar_sentimento(self.historico_respostas[-1])
|
321 |
-
sentimento_anterior = self.analisar_sentimento(self.historico_respostas[-2])
|
322 |
-
|
323 |
-
if sentimento_atual == sentimento_anterior == "positive":
|
324 |
-
return "\n\n💡 Observo um padrão consistente de confiança em suas respostas. Continue desenvolvendo esses pontos fortes!"
|
325 |
-
elif sentimento_atual == sentimento_anterior == "improvement":
|
326 |
-
return "\n\n💡 Percebo que você está identificando áreas de desenvolvimento. Vamos focar em estratégias práticas para esses desafios."
|
327 |
-
return ""
|
328 |
-
|
329 |
-
def _gerar_pontos_aprofundamento(self) -> str:
|
330 |
-
return """
|
331 |
-
|
332 |
-
#### Pontos para Aprofundamento:
|
333 |
-
1. Como essa experiência se conecta com seus valores de liderança?
|
334 |
-
2. Que recursos específicos você identificou como necessários?
|
335 |
-
3. Qual seria o próximo marco de desenvolvimento nessa área?"""
|
336 |
-
|
337 |
-
def _gerar_proxima_pergunta(self) -> str:
|
338 |
-
proxima = PERGUNTAS[self.pergunta_atual]
|
339 |
-
return f"""\n\n### Próxima Reflexão: {proxima['categoria'].title()} 🎯\n\n{proxima['pergunta']}\n\nTome um momento para refletir e conectar com suas experiências..."""
|
340 |
-
|
341 |
-
def gerar_sumario_final(self, tempo: int) -> str:
|
342 |
-
sentimentos = [self.analisar_sentimento(resp) for resp in self.historico_respostas]
|
343 |
-
predominante = max(set(sentimentos), key=sentimentos.count)
|
344 |
-
|
345 |
-
tone_pattern = max(set(self.tone_history), key=self.tone_history.count)
|
346 |
-
tone_insight = f"\n\n#### Padrão de Comunicação:\nSeu estilo predominante é {tone_pattern}, o que sugere {self._interpretar_padrao_tom(tone_pattern)}"
|
347 |
-
|
348 |
-
avg_metrics = {
|
349 |
-
key: sum(m[key] for m in self.response_quality_metrics) / len(self.response_quality_metrics)
|
350 |
-
for key in ["depth", "clarity", "specificity", "actionability"]
|
351 |
-
}
|
352 |
-
|
353 |
-
quality_insights = "\n\n#### Insights de Qualidade das Respostas:"
|
354 |
-
if avg_metrics["depth"] > 0.7:
|
355 |
-
quality_insights += "\n- Suas reflexões demonstram profundidade significativa"
|
356 |
-
if avg_metrics["specificity"] > 0.7:
|
357 |
-
quality_insights += "\n- Você fornece exemplos concretos e detalhados"
|
358 |
-
if avg_metrics["actionability"] > 0.7:
|
359 |
-
quality_insights += "\n- Suas respostas são orientadas para ação"
|
360 |
-
|
361 |
-
if predominante == "positive":
|
362 |
-
perfil = "Você demonstra forte autoconhecimento e confiança em sua liderança."
|
363 |
-
elif predominante == "improvement":
|
364 |
-
perfil = "Você demonstra excelente capacidade de identificar oportunidades de desenvolvimento."
|
365 |
-
else:
|
366 |
-
perfil = "Você demonstra uma abordagem equilibrada entre conquistas e desafios."
|
367 |
-
|
368 |
-
return f"""
|
369 |
-
### 🎉 Jornada de Desenvolvimento Concluída!
|
370 |
-
|
371 |
-
⏱️ Tempo de reflexão: {tempo} minutos
|
372 |
-
📝 Temas explorados: {len(PERGUNTAS)}
|
373 |
-
|
374 |
-
#### Perfil de Liderança Observado:
|
375 |
-
{perfil}{tone_insight}{quality_insights}
|
376 |
-
|
377 |
-
#### Recomendações Personalizadas:
|
378 |
-
1. Implemente uma ação específica mencionada em suas reflexões esta semana
|
379 |
-
2. Mantenha um diário de liderança focado nos temas discutidos
|
380 |
-
3. Estabeleça checkpoints mensais para revisar seu progresso
|
381 |
-
|
382 |
-
Deseja iniciar uma nova jornada de desenvolvimento com outros temas?"""
|
383 |
-
|
384 |
-
def _interpretar_padrao_tom(self, tom: str) -> str:
|
385 |
-
interpretacoes = {
|
386 |
-
"confiante": "uma base sólida para influenciar e liderar equipes.",
|
387 |
-
"reflexivo": "uma capacidade valiosa de considerar múltiplas perspectivas.",
|
388 |
-
"hesitante": "uma oportunidade para fortalecer sua confiança através da prática.",
|
389 |
-
"pragmatico": "um foco valioso em resultados e implementação.",
|
390 |
-
"emocional": "uma forte conexão com o impacto humano da liderança."
|
391 |
-
}
|
392 |
-
return interpretacoes.get(tom, "um estilo único de liderança.")
|
393 |
-
|
394 |
-
def primeira_pergunta(self):
|
395 |
-
return f"""### 👋 Bem-vindo à sua Jornada de Desenvolvimento!
|
396 |
-
|
397 |
-
Vamos explorar aspectos importantes da sua liderança através de reflexões guiadas.
|
398 |
-
|
399 |
-
{PERGUNTAS[0]['pergunta']}
|
400 |
|
401 |
-
|
|
|
402 |
|
403 |
def criar_interface():
|
404 |
coach = EnhancedCoach()
|
|
|
4 |
import numpy as np
|
5 |
from typing import Dict, List, Tuple
|
6 |
from textblob import TextBlob
|
7 |
+
import json
|
8 |
|
9 |
# Load embeddings model
|
10 |
model = SentenceTransformer('all-MiniLM-L6-v2')
|
11 |
|
12 |
+
# Load data from JSON
|
13 |
+
with open('coach_data.json', 'r', encoding='utf-8') as f:
|
14 |
+
data = json.load(f)
|
15 |
+
PERGUNTAS = data['perguntas']
|
16 |
+
TONE_PATTERNS = data['tone_patterns']
|
17 |
+
RESPOSTAS_COACH = data['respostas_coach']
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
18 |
|
19 |
class EnhancedCoach:
|
20 |
def __init__(self):
|
|
|
148 |
melhor_resposta = template["response"]
|
149 |
|
150 |
return melhor_resposta.format(specific_action=acao_especifica.lower())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
151 |
|
152 |
+
# Rest of the methods remain the same...
|
153 |
+
# (Previous implementation of gerar_resposta, _gerar_insight_tom, etc.)
|
154 |
|
155 |
def criar_interface():
|
156 |
coach = EnhancedCoach()
|