import gradio as gr from sentence_transformers import SentenceTransformer from sklearn.metrics.pairwise import cosine_similarity import numpy as np import plotly.graph_objects as go # Initialize model model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2') # Questionário DISC 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") ] } ] # Enhanced knowledge base DISC_PROFILES = { 'D': { 'nome': 'Dominância', 'caracteristicas': { 'alto': [ "Focado em resultados e ação imediata", "Direto e assertivo na comunicação", "Competitivo e determinado", "Assume naturalmente posições de liderança", "Orientado para desafios e conquistas" ], 'baixo': [ "Mais colaborativo e menos confrontador", "Prefere ambientes harmoniosos", "Tende a evitar conflitos", "Mais cauteloso na tomada de decisões", "Busca consenso em vez de imposição" ] }, 'ambiente_ideal': { 'alto': [ "Ambientes competitivos", "Situações que exigem decisões rápidas", "Projetos desafiadores", "Autonomia na execução", "Oportunidades de liderança" ], 'baixo': [ "Ambientes colaborativos", "Trabalho em equipe", "Projetos estruturados", "Suporte de liderança", "Foco em cooperação" ] }, 'recomendacoes': { 'alto': [ "Desenvolver mais empatia e paciência", "Praticar escuta ativa", "Considerar diferentes perspectivas", "Equilibrar assertividade com diplomacia", "Fortalecer habilidades de trabalho em equipe" ], 'baixo': [ "Desenvolver mais assertividade", "Praticar tomada de decisão", "Expressar opiniões com mais confiança", "Assumir mais riscos calculados", "Fortalecer liderança situacional" ] } }, 'I': { 'nome': 'Influência', 'caracteristicas': { 'alto': [ "Comunicativo e expressivo", "Entusiasta e otimista", "Sociável e carismático", "Persuasivo e inspirador", "Criativo e inovador" ], 'baixo': [ "Mais reservado e analítico", "Prefere comunicação objetiva", "Foco em fatos e dados", "Mais formal nas relações", "Prioriza resultados sobre relacionamentos" ] }, 'ambiente_ideal': { 'alto': [ "Ambientes sociais e dinâmicos", "Oportunidades de networking", "Trabalho com pessoas", "Reconhecimento público", "Liberdade criativa" ], 'baixo': [ "Ambientes mais formais", "Trabalho individual", "Projetos técnicos", "Foco em processos", "Estrutura definida" ] }, 'recomendacoes': { 'alto': [ "Desenvolver foco e organização", "Melhorar gestão do tempo", "Praticar conclusão de tarefas", "Equilibrar socialização e produtividade", "Fortalecer análise de dados" ], 'baixo': [ "Desenvolver habilidades de networking", "Praticar comunicação expressiva", "Participar mais em grupos", "Explorar criatividade", "Fortalecer relações interpessoais" ] } }, 'S': { 'nome': 'Estabilidade', 'caracteristicas': { 'alto': [ "Paciente e consistente", "Colaborativo e prestativo", "Leal e confiável", "Bom ouvinte", "Focado em harmonia" ], 'baixo': [ "Mais flexível e adaptável", "Aberto a mudanças rápidas", "Multitarefa eficiente", "Dinâmico e versátil", "Aprecia variedade" ] }, 'ambiente_ideal': { 'alto': [ "Ambientes estáveis e previsíveis", "Trabalho em equipe", "Rotinas estabelecidas", "Mudanças graduais", "Relacionamentos duradouros" ], 'baixo': [ "Ambientes dinâmicos", "Mudanças frequentes", "Projetos variados", "Novos desafios", "Flexibilidade de rotina" ] }, 'recomendacoes': { 'alto': [ "Desenvolver adaptabilidade", "Praticar iniciativa", "Expressar opiniões", "Lidar melhor com mudanças", "Fortalecer tomada de decisão" ], 'baixo': [ "Desenvolver mais paciência", "Praticar consistência", "Fortalecer relacionamentos", "Melhorar escuta ativa", "Criar rotinas efetivas" ] } }, 'C': { 'nome': 'Conformidade', 'caracteristicas': { 'alto': [ "Analítico e preciso", "Organizado e sistemático", "Focado em qualidade", "Atento aos detalhes", "Orientado por dados" ], 'baixo': [ "Mais flexível com regras", "Foco em resultados rápidos", "Prático e objetivo", "Adaptável a mudanças", "Tolerante a ambiguidades" ] }, 'ambiente_ideal': { 'alto': [ "Ambientes estruturados", "Processos claros", "Foco em qualidade", "Análise detalhada", "Padrões definidos" ], 'baixo': [ "Ambientes flexíveis", "Liberdade de processo", "Foco em resultados", "Decisões rápidas", "Adaptabilidade" ] }, 'recomendacoes': { 'alto': [ "Desenvolver flexibilidade", "Praticar decisões rápidas", "Lidar melhor com ambiguidade", "Equilibrar análise e ação", "Fortalecer relacionamentos" ], 'baixo': [ "Desenvolver atenção aos detalhes", "Melhorar organização", "Criar sistemas e processos", "Fortalecer análise crítica", "Praticar planejamento" ] } } } def get_intensity_level(percentual): """Determina o nível de intensidade baseado no percentual.""" if percentual >= 75: return "muito alto" elif percentual >= 60: return "alto" elif percentual >= 40: return "moderado" elif percentual >= 25: return "baixo" else: return "muito baixo" def get_profile_description(perfil, percentual): """Gera descrição personalizada baseada no perfil e sua intensidade.""" nivel = "alto" if percentual >= 50 else "baixo" caracteristicas = DISC_PROFILES[perfil]['caracteristicas'][nivel] ambiente = DISC_PROFILES[perfil]['ambiente_ideal'][nivel] recomendacoes = DISC_PROFILES[perfil]['recomendacoes'][nivel] intensidade = get_intensity_level(percentual) return { 'nome': DISC_PROFILES[perfil]['nome'], 'intensidade': intensidade, 'caracteristicas': caracteristicas, 'ambiente': ambiente, 'recomendacoes': recomendacoes } def calcular_perfil(respostas): """Calcula os percentuais de cada perfil DISC.""" contagem = {'D': 0, 'I': 0, 'S': 0, 'C': 0} for resposta in respostas: if resposta: perfil = resposta.split()[0] contagem[perfil] += 1 total = sum(contagem.values()) if total > 0: percentuais = {k: (v/total) * 100 for k, v in contagem.items()} else: percentuais = {k: 0 for k in contagem.keys()} return percentuais def create_disc_plot(percentuais): """Cria um gráfico de barras para visualização do perfil DISC.""" colors = { 'D': '#FF4B4B', 'I': '#FFD700', 'S': '#4CAF50', 'C': '#2196F3' } fig = go.Figure(data=[ go.Bar( x=list(percentuais.keys()), y=list(percentuais.values()), marker_color=[colors[k] for k in percentuais.keys()], text=[f'{v:.1f}%' for v in percentuais.values()], textposition='auto', ) ]) fig.update_layout( title='Distribuição do Perfil DISC', yaxis_title='Percentual (%)', yaxis_range=[0, 100], showlegend=False, template='plotly_white', height=400 ) return fig def gerar_relatorio_personalizado(percentuais): """Gera relatório detalhado e personalizado baseado nos percentuais DISC.""" perfis_ordenados = dict(sorted(percentuais.items(), key=lambda x: x[1], reverse=True)) perfis_desc = {k: get_profile_description(k, v) for k, v in perfis_ordenados.items()} perfil_dominante = list(perfis_ordenados.keys())[0] perfil_secundario = list(perfis_ordenados.keys())[1] relatorio = f"""ANÁLISE DE PERFIL COMPORTAMENTAL DISC VISÃO GERAL Seu perfil apresenta uma combinação única de características, com {perfis_desc[perfil_dominante]['nome']} ({perfil_dominante}) como traço dominante em nível {perfis_desc[perfil_dominante]['intensidade']} ({perfis_ordenados[perfil_dominante]:.1f}%), seguido por {perfis_desc[perfil_secundario]['nome']} ({perfil_secundario}) em nível {perfis_desc[perfil_secundario]['intensidade']} ({perfis_ordenados[perfil_secundario]:.1f}%). CARACTERÍSTICAS PRINCIPAIS Seu estilo comportamental é marcado por: • {' e '.join(perfis_desc[perfil_dominante]['caracteristicas'][:3])} • Com influência secundária de: {' e '.join(perfis_desc[perfil_secundario]['caracteristicas'][:2])} AMBIENTE IDEAL DE TRABALHO Você tende a prosperar em ambientes que oferecem: • {' e '.join(perfis_desc[perfil_dominante]['ambiente'][:3])} • Complementados por: {' e '.join(perfis_desc[perfil_secundario]['ambiente'][:2])} RECOMENDAÇÕES PARA DESENVOLVIMENTO Para maximizar seu potencial, considere: • {' e '.join(perfis_desc[perfil_dominante]['recomendacoes'][:3])} • Adicionalmente: {' e '.join(perfis_desc[perfil_secundario]['recomendacoes'][:2])} DISTRIBUIÇÃO COMPLETA DO PERFIL DISC: {', '.join([f'{k} ({DISC_PROFILES[k]["nome"]}): {v:.1f}%' for k, v in perfis_ordenados.items()])} OBSERVAÇÃO: Este perfil representa suas tendências comportamentais naturais. Lembre-se que comportamentos podem ser adaptados conforme o contexto e as necessidades específicas de cada situação.""" return relatorio # Temas e estilos personalizados CUSTOM_CSS = """ .container { max-width: 800px; margin: auto; } .question-card { padding: 20px; margin: 15px 0; border-radius: 10px; background-color: #f8f9fa; } .result-card { padding: 25px; margin-top: 20px; border-radius: 10px; background-color: #ffffff; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); } .progress-bar { margin: 20px 0; padding: 10px; background: #eef2ff; border-radius: 8px; } .footer { margin-top: 30px; text-align: center; font-size: 0.9em; color: #666; } """ # Configuração do tema THEME = gr.themes.Soft( primary_hue="blue", secondary_hue="gray", neutral_hue="slate", font=["Source Sans Pro", "ui-sans-serif", "system-ui"] ).set( button_primary_background_fill="*primary_500", button_primary_background_fill_hover="*primary_600", button_secondary_background_fill="*neutral_100", block_label_text_size="lg", block_title_text_size="xl", ) def update_progress(progress, total_questions=5): """Atualiza a barra de progresso.""" answered = sum(1 for p in progress if p is not None) return f"{answered}/{total_questions} questões respondidas", answered / total_questions def reset_interface(): """Reinicia a interface para um novo teste.""" return [None] * 5 + [ gr.update(visible=False), gr.update(interactive=True), None, None, None, None, "0/5 questões respondidas", 0 ] def create_interface(): """Cria interface moderna do Gradio.""" with gr.Blocks(theme=THEME, css=CUSTOM_CSS) as iface: # Cabeçalho with gr.Row(): with gr.Column(): gr.Markdown(""" # 🎯 Análise de Perfil Comportamental DISC ### Descubra seu perfil comportamental único! Este teste ajudará você a entender melhor seu estilo de comportamento natural e como você pode aproveitar seus pontos fortes no ambiente profissional. #### Instruções: - Responda todas as questões pensando em seu comportamento mais natural - Não existe resposta certa ou errada - Escolha a opção que melhor representa como você normalmente age """) # Container principal with gr.Column(elem_classes="container"): # Barra de progresso with gr.Row(elem_classes="progress-bar"): progress_text = gr.Markdown("0/5 questões respondidas") progress_bar = gr.Progress() # Questões radio_components = [] for i, questao in enumerate(DISC_QUESTIONS, 1): with gr.Box(elem_classes="question-card"): gr.Markdown(f"### Questão {i}: {questao['pergunta']}") with gr.Column(): radio = gr.Radio( choices=[f"{perfil} - {desc}" for perfil, desc in questao['opcoes']], label="Selecione a opção mais adequada:", scale=0, interactive=True ) radio_components.append(radio) # Botão de análise with gr.Row(elem_classes="center"): analyze_btn = gr.Button( "📊 Analisar Perfil", variant="primary", scale=0, min_width=200 ) # Área de resultados with gr.Box(visible=False, elem_classes="result-card") as result_box: gr.Markdown("## 📊 Resultado da Análise") with gr.Row(): # Gráfico de distribuição plot = gr.Plot(label="Distribuição DISC") # Métricas principais with gr.Column(): with gr.Box(): gr.Markdown("### Perfis Principais") perfil_dominante = gr.Textbox( label="Perfil Dominante", show_label=True, interactive=False ) perfil_secundario = gr.Textbox( label="Perfil Secundário", show_label=True, interactive=False ) # Relatório detalhado with gr.Accordion("📝 Relatório Detalhado", open=True): output = gr.Markdown() # Botões de ação with gr.Row(): download_btn = gr.Button("⬇️ Baixar Relatório PDF", variant="secondary") reset_btn = gr.Button("🔄 Fazer Novo Teste", variant="secondary") share_btn = gr.Button("📤 Compartilhar Resultado", variant="secondary") # Footer with gr.Row(elem_classes="footer"): gr.Markdown(""" 💡 **Observação:** Este é um teste comportamental indicativo. Os resultados representam tendências naturais de comportamento, que podem variar dependendo do contexto e situação. """) # Event handlers def update_display(*answers): """Atualiza a visibilidade dos componentes baseado nas respostas.""" if all(a is not None for a in answers): return { result_box: gr.update(visible=True), analyze_btn: gr.update(interactive=False) } return { result_box: gr.update(visible=False), analyze_btn: gr.update(interactive=True) } # Event bindings for radio in radio_components: radio.change( lambda *args: update_progress(args), inputs=radio_components, outputs=[progress_text, progress_bar] ) radio.change( update_display, inputs=radio_components, outputs=[result_box, analyze_btn] ) analyze_btn.click( process_and_visualize, inputs=radio_components, outputs=[plot, perfil_dominante, perfil_secundario, output] ) reset_btn.click( reset_interface, outputs=radio_components + [ result_box, analyze_btn, plot, perfil_dominante, perfil_secundario, output, progress_text, progress_bar ] ) # Exemplo simples de geração de PDF (você precisará implementar a função real) def generate_pdf(report_text): # Implementar geração real de PDF aqui return "report.pdf" download_btn.click( generate_pdf, inputs=[output], outputs=gr.File() ) # Função de compartilhamento (exemplo) def share_results(): return gr.Info("Link de compartilhamento copiado!") share_btn.click(share_results) return iface if __name__ == "__main__": iface = create_interface() iface.launch(show_error=True)