InspiraLead / app.py
DHEIVER's picture
Create app.py
32e190b verified
raw
history blame
10.2 kB
def analyze_sentiment_trend(respostas: List[str]) -> plt.Figure:
"""Generate sentiment analysis plot"""
coach = EnhancedCoach()
sentimentos = [coach.analisar_sentimento(resp) for resp in respostas]
# Convert sentiments to numeric values
valor_sentimento = {
'positive': 1,
'neutral': 0,
'improvement': -1
}
valores = [valor_sentimento[s] for s in sentimentos]
# Create the plot
fig, ax = plt.subplots(figsize=(8, 4))
sns.lineplot(data=valores, marker='o', ax=ax)
ax.set_title('Tendência de Sentimento nas Respostas')
ax.set_xlabel('Número da Resposta')
ax.set_ylabel('Sentimento')
ax.set_ylim(-1.5, 1.5)
ax.grid(True)
# Add horizontal lines for reference
ax.axhline(y=0, color='gray', linestyle='--', alpha=0.5)
return fig
def generate_word_cloud(respostas: List[str]) -> plt.Figure:
"""Generate word cloud visualization"""
# Combine all responses
texto_completo = ' '.join(respostas)
# Create word cloud
wordcloud = WordCloud(
width=800,
height=400,
background_color='white',
colormap='viridis',
max_words=100
).generate(texto_completo)
# Create the plot
fig, ax = plt.subplots(figsize=(10, 5))
ax.imshow(wordcloud, interpolation='bilinear')
ax.axis('off')
ax.set_title('Nuvem de Palavras das Reflexões')
return fig
def analyze_themes(respostas: List[str]) -> Tuple[str, str]:
"""Analyze strong themes and development areas"""
coach = EnhancedCoach()
temas_fortes = []
areas_desenvolvimento = []
for resp in respostas:
sentimento = coach.analisar_sentimento(resp)
if sentimento == "positive":
temas_fortes.append("- " + coach.extrair_acao_especifica(resp))
elif sentimento == "improvement":
areas_desenvolvimento.append("- " + coach.extrair_acao_especifica(resp))
temas_fortes_str = "\n".join(temas_fortes[:3]) if temas_fortes else "Análise em andamento..."
areas_desenvolvimento_str = "\n".join(areas_desenvolvimento[:3]) if areas_desenvolvimento else "Análise em andamento..."
return temas_fortes_str, areas_desenvolvimento_str
def criar_interface():
coach = EnhancedCoach()
with gr.Blocks(title="Coach de Liderança", theme=gr.themes.Soft()) as app:
with gr.Row():
with gr.Column(scale=2):
gr.Markdown("""
# 🚀 Coach de Liderança
Desenvolva sua liderança através de reflexão guiada e feedback personalizado.
""")
with gr.Column(scale=1):
timer = gr.Number(
value=0,
label="⏱️ Tempo de Reflexão (minutos)",
interactive=False
)
progress = gr.Slider(
value=0,
minimum=0,
maximum=len(PERGUNTAS),
step=1,
label="📊 Progresso",
interactive=False
)
with gr.Tabs() as tabs:
with gr.Tab("💭 Sessão Atual"):
chat = gr.Chatbot(
value=[[None, coach.primeira_pergunta()]],
height=500,
show_label=False,
type="messages"
)
with gr.Row():
with gr.Column(scale=4):
txt = gr.Textbox(
placeholder="Compartilhe sua reflexão aqui...",
lines=4,
label="Sua Resposta"
)
with gr.Column(scale=1, min_width=100):
with gr.Row():
btn = gr.Button("Enviar", variant="primary")
clear = gr.Button("Limpar")
with gr.Row():
tema_atual = gr.Textbox(
value="Autoconhecimento",
label="🎯 Tema Atual",
interactive=False
)
tempo_resposta = gr.Textbox(
value="0:00",
label="⏱️ Tempo nesta resposta",
interactive=False
)
with gr.Tab("📊 Insights"):
with gr.Row():
with gr.Column():
sentiment_chart = gr.Plot(label="Análise de Sentimento")
with gr.Column():
word_cloud = gr.Plot(label="Nuvem de Palavras")
with gr.Row():
temas_fortes = gr.Textbox(
label="💪 Temas com Mais Confiança",
interactive=False,
lines=3
)
areas_desenvolvimento = gr.Textbox(
label="🎯 Áreas para Desenvolvimento",
interactive=False,
lines=3
)
with gr.Tab("📝 Notas & Recursos"):
with gr.Row():
notas = gr.Textbox(
placeholder="Faça anotações durante sua jornada...",
label="📝 Minhas Notas",
lines=5
)
with gr.Row():
with gr.Accordion("📚 Recursos por Tema", open=False):
gr.Markdown("""
### 🎯 Autoconhecimento
- [Artigo] Desenvolvendo Autoconsciência na Liderança
- [Exercício] Reflexão sobre Valores e Propósito
- [Ferramenta] Template de Diário de Liderança
### 💬 Comunicação
- [Guia] Comunicação Assertiva na Liderança
- [Checklist] Preparação para Feedbacks Difíceis
- [Framework] Estrutura de Comunicação Situacional
### 🤔 Tomada de Decisão
- [Modelo] Framework para Decisões Complexas
- [Exercício] Análise de Decisões Passadas
- [Template] Documentação de Decisões Importantes
""")
def atualizar_timer():
"""Update session timer"""
tempo = int((datetime.now() - coach.inicio).total_seconds() / 60)
return tempo
def responder(mensagem, historico):
"""Process user response and update interface"""
if not mensagem.strip():
return {
txt: "",
chat: historico
}
# Format user message
msg_usuario = {
"role": "user",
"content": mensagem
}
# Generate and format coach response
resposta = coach.gerar_resposta(mensagem)
# Update history
historico.append([msg_usuario, resposta])
# Update visualizations
sentiment_analysis = None
word_cloud_plot = None
strong_themes = ""
development_areas = ""
if len(coach.historico_respostas) > 1:
sentiment_analysis = analyze_sentiment_trend(coach.historico_respostas)
word_cloud_plot = generate_word_cloud(coach.historico_respostas)
strong_themes, development_areas = analyze_themes(coach.historico_respostas)
tempo_atual = int((datetime.now() - coach.inicio).total_seconds() / 60)
return {
txt: "",
chat: historico,
timer: tempo_atual,
progress: coach.pergunta_atual,
tema_atual: PERGUNTAS[min(coach.pergunta_atual, len(PERGUNTAS)-1)]["categoria"].title(),
tempo_resposta: "0:00",
sentiment_chart: sentiment_analysis,
word_cloud: word_cloud_plot,
temas_fortes: strong_themes,
areas_desenvolvimento: development_areas
}
def limpar_chat():
"""Reset chat and all related components"""
coach.__init__()
primeira_mensagem = coach.primeira_pergunta()
return {
chat: [[None, primeira_mensagem]],
txt: "",
progress: 0,
tema_atual: "Autoconhecimento",
tempo_resposta: "0:00",
sentiment_chart: None,
word_cloud: None,
temas_fortes: "",
areas_desenvolvimento: ""
}
# Event handlers
txt.submit(
responder,
[txt, chat],
[txt, chat, timer, progress, tema_atual, tempo_resposta,
sentiment_chart, word_cloud, temas_fortes, areas_desenvolvimento]
)
btn.click(
responder,
[txt, chat],
[txt, chat, timer, progress, tema_atual, tempo_resposta,
sentiment_chart, word_cloud, temas_fortes, areas_desenvolvimento]
)
clear.click(
limpar_chat,
None,
[chat, txt, progress, tema_atual, tempo_resposta,
sentiment_chart, word_cloud, temas_fortes, areas_desenvolvimento]
)
# Timer update
gr.on(
triggers=[gr.EventListener(every=1)],
fn=atualizar_timer,
outputs=[timer]
)
return app
if __name__ == "__main__":
app = criar_interface()
app.launch()