DISC.ai / app.py
DHEIVER's picture
Update app.py
7f05f47 verified
raw
history blame
9.27 kB
import gradio as gr
import plotly.graph_objects as go
from sentence_transformers import SentenceTransformer
import numpy as np
model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
DISC_QUESTIONS = [
{"pergunta": "Em situações de trabalho em equipe, você geralmente:",
"opcoes": [("D", "Assume a liderança e toma decisões rápidas"),
("I", "Motiva o grupo e mantém o ambiente animado"),
("S", "Apoia os colegas e mantém a harmonia"),
("C", "Analisa detalhadamente antes de agir")]},
{"pergunta": "Quando enfrenta um desafio no trabalho, você:",
"opcoes": [("D", "Enfrenta diretamente e busca soluções imediatas"),
("I", "Discute com outros e busca diferentes perspectivas"),
("S", "Mantém a calma e segue um processo estabelecido"),
("C", "Pesquisa todas as informações disponíveis primeiro")]},
{"pergunta": "Em reuniões profissionais, você costuma:",
"opcoes": [("D", "Ir direto ao ponto e focar em resultados"),
("I", "Participar ativamente e compartilhar ideias"),
("S", "Ouvir atentamente e contribuir quando solicitado"),
("C", "Tomar notas e questionar os detalhes")]},
{"pergunta": "Ao lidar com mudanças no ambiente de trabalho, você:",
"opcoes": [("D", "Abraça a mudança e lidera a implementação"),
("I", "Entusiasma os outros sobre as novas possibilidades"),
("S", "Adapta-se gradualmente seguindo o processo"),
("C", "Analisa os impactos antes de aceitar")]},
{"pergunta": "Sob pressão no trabalho, você tende a:",
"opcoes": [("D", "Tornar-se mais direto e focado em resultados"),
("I", "Buscar apoio e interação com a equipe"),
("S", "Manter a calma e seguir metodicamente"),
("C", "Concentrar-se em detalhes e procedimentos")]}
]
DISC_INSIGHTS = {
'D': {'alto': ["Você demonstra forte capacidade de liderança e tomada de decisão",
"Sua orientação para resultados é uma característica marcante",
"Você tende a enfrentar desafios de forma direta e decisiva"],
'baixo': ["Você prefere uma abordagem mais colaborativa e consensual",
"Sua tendência é buscar harmonia nas relações profissionais",
"Você demonstra cuidado ao tomar decisões importantes"]},
'I': {'alto': ["Seu entusiasmo e otimismo são características marcantes",
"Você tem grande habilidade para inspirar e motivar pessoas",
"Sua comunicação expressiva é um diferencial importante"],
'baixo': ["Você prefere uma comunicação mais objetiva e focada",
"Sua abordagem analítica favorece resultados concretos",
"Você valoriza dados e fatos em suas interações"]},
'S': {'alto': ["Sua consistência e confiabilidade são pontos fortes",
"Você demonstra grande habilidade para trabalho em equipe",
"Sua paciência e capacidade de escuta são diferenciais"],
'baixo': ["Você se adapta facilmente a mudanças e novos cenários",
"Sua flexibilidade é um ponto forte em ambientes dinâmicos",
"Você lida bem com múltiplas tarefas simultâneas"]},
'C': {'alto': ["Sua precisão e atenção aos detalhes são notáveis",
"Você tem forte capacidade analítica e organizacional",
"Sua busca por qualidade é uma característica marcante"],
'baixo': ["Você demonstra flexibilidade com regras e processos",
"Sua praticidade favorece resultados rápidos",
"Você se adapta bem a ambientes menos estruturados"]}
}
def get_intensity_level(percentual):
if percentual >= 75: return "muito alto"
elif percentual >= 60: return "alto"
elif percentual >= 40: return "moderado"
elif percentual >= 25: return "baixo"
return "muito baixo"
def generate_semantic_insights(perfil, percentual):
nivel = "alto" if percentual >= 50 else "baixo"
insights = DISC_INSIGHTS[perfil][nivel]
profile_embedding = model.encode(" ".join(insights))
similarities = np.array([np.dot(profile_embedding, model.encode(insight)) for insight in insights])
return [insights[i] for i in similarities.argsort()[-3:]]
def calcular_perfil(respostas):
contagem = {k: sum(1 for r in respostas if r and r.startswith(k)) for k in 'DISC'}
total = sum(contagem.values())
return {k: (v/total)*100 if total > 0 else 0 for k, v in contagem.items()}
import gradio as gr
import plotly.graph_objects as go
from sentence_transformers import SentenceTransformer
import numpy as np
model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
# [Previous constants DISC_QUESTIONS and DISC_INSIGHTS remain the same]
def create_disc_plot(percentuais):
cores = {'D': '#FF4B4B', 'I': '#FFD700', 'S': '#4CAF50', 'C': '#2196F3'}
fig = go.Figure(data=[go.Bar(x=list(percentuais.keys()),
y=list(percentuais.values()),
marker_color=[cores[k] for k in percentuais.keys()],
text=[f'{v:.1f}%' for v in percentuais.values()],
textposition='auto')])
fig.update_layout(
title={
'text': 'Perfil DISC',
'y':0.95,
'x':0.5,
'xanchor': 'center',
'yanchor': 'top',
'font': {'size': 24, 'color': '#333333'}
},
yaxis_range=[0, 100],
template='plotly_white',
height=400,
margin=dict(l=40, r=40, t=60, b=40),
paper_bgcolor='rgba(0,0,0,0)',
plot_bgcolor='rgba(0,0,0,0)',
yaxis_title="Percentual (%)",
xaxis_title="Dimensões DISC"
)
return fig
def create_interface():
with gr.Blocks(theme=gr.themes.Soft(
primary_hue="blue",
secondary_hue="purple",
neutral_hue="slate",
font=["Inter", "ui-sans-serif", "system-ui"]
)) as iface:
gr.Markdown(
"""
# 🎯 Análise de Perfil DISC
### Descubra suas características comportamentais dominantes
Este teste ajuda a identificar seu estilo comportamental baseado na metodologia DISC:
- **D (Dominância)**: Foco em resultados e assertividade
- **I (Influência)**: Foco em relacionamentos e comunicação
- **S (Estabilidade)**: Foco em cooperação e consistência
- **C (Conformidade)**: Foco em qualidade e precisão
""")
with gr.Row():
with gr.Column():
radios = []
for i, q in enumerate(DISC_QUESTIONS):
with gr.Box():
radio = gr.Radio(
choices=[f"{p} - {d}" for p, d in q['opcoes']],
label=f"{i+1}. {q['pergunta']}",
container=True
)
radios.append(radio)
with gr.Row():
analyze_btn = gr.Button("📊 Analisar Perfil", size="lg", variant="primary")
reset_btn = gr.Button("🔄 Novo Teste", size="lg", variant="secondary")
with gr.Row():
with gr.Column():
plot = gr.Plot(label="Gráfico de Perfil DISC")
with gr.Row():
output = gr.Markdown()
def process_results(*answers):
if any(a is None for a in answers):
gr.Warning("Por favor, responda todas as questões antes de prosseguir.")
return None, None
perfil = calcular_perfil(answers)
plot = create_disc_plot(perfil)
report = gerar_relatorio(perfil)
return plot, report
analyze_btn.click(
fn=process_results,
inputs=radios,
outputs=[plot, output],
api_name="analyze"
)
reset_btn.click(
fn=lambda: [None]*(len(radios)+2),
outputs=radios+[plot, output],
api_name="reset"
)
# Add example inputs
gr.Examples(
examples=[
["D - Assume a liderança e toma decisões rápidas",
"I - Discute com outros e busca diferentes perspectivas",
"S - Ouvir atentamente e contribuir quando solicitado",
"C - Analisa os impactos antes de aceitar",
"D - Tornar-se mais direto e focado em resultados"]
],
inputs=radios,
outputs=[plot, output],
fn=process_results,
label="Exemplo de Respostas"
)
return iface
if __name__ == "__main__":
iface = create_interface()
iface.launch(
share=True,
show_error=True,
server_name="0.0.0.0",
server_port=7860,
)