Agente de IA para Coordenação de Horários de Aulas

18 de December de 2025 • Tempo de leitura: 5 min

Como criar um agente de IA que otimiza a alocação de horários para diferentes turmas e professores.

1. Propósito e Escopo

Este documento define todos os prompts, configurações de memória, transição entre estados e demais requisitos funcionais para o Fluxo de Agentes "Coordenação de Horários de Aulas", uma solução de automação projetada para otimizar a alocação de horários para diferentes turmas e professores. Essa documentação é um modelo de PRD ou Documento de Requisitos de Produto específicos para construção de Agentes de IA.

O objetivo principal é analisar a disponibilidade de professores, turmas e espaços físicos, propondo uma alocação de horários que minimize conflitos e maximize o uso eficaz dos recursos disponíveis.

2. Contexto e Problema

Cenário Atual

A coordenação de horários de aulas enfrenta diversos desafios, incluindo:

  • Ineficiência na alocação de horários de aulas, levando a conflitos de horário e uso ineficaz de recursos.
  • Dificuldade em garantir uma distribuição equitativa de horários para professores e turmas.

Atualmente, o processo de coordenação é manual e propenso a erros, o que resulta em uma distribuição desigual de carga horária entre professores e dificuldades em otimizar o uso de espaços físicos.


Problemas Identificados

  • Conflitos de Horário: A alocação manual frequentemente resulta em sobreposição de horários entre turmas e professores.
  • Uso Ineficiente de Espaços: Salas e outros recursos físicos não são utilizados de maneira otimizada.
  • Distribuição Desigual: Professores e turmas enfrentam uma distribuição desigual de horários, com alguns sobrecarregados e outros subutilizados.

3. Impactos Esperados

A implementação deste fluxo de automação visa alcançar os seguintes resultados:

  • Reduzir conflitos de horário em pelo menos 90%.
  • Otimizar o uso de espaços aumentando a taxa de ocupação em 30%.
  • Equidade na distribuição de carga horária entre professores e turmas.

4. Visão Geral da Solução

O agente de IA para coordenação de horários de aulas processa dados sobre disponibilidade de professores, turmas e espaços físicos, aplica regras para otimizar a alocação de horários e gera um plano que minimiza conflitos e maximiza a eficiência de recursos. A seguir são detalhadas todas as regras de negócio e especificações funcionais necessárias para que esse agente atue como um assistente útil e autônomo na coordenação de horários de aulas.

A solução consiste em um fluxo de automação composto por 4 agentes de IA. O processo inicia com a validação e normalização de dados e termina com a avaliação de equidade e ajustes finais na proposta de alocação de horários.

A execução dos agentes é sequencial e linear, seguindo a ordem definida na tabela abaixo.

Agentes Função Principal
Agente de Validação e Normalização de Dados (RF 1) Validar e normalizar dados de professores, turmas, espaços e janelas de tempo.
Agente de Análise de Disponibilidade (RF 2) Calcular conjuntos de slots viáveis e grafo de incompatibilidades.
Agente Otimizador de Alocação de Horários (RF 3) Gerar uma proposta de grade horária viável e sem conflitos.
Agente de Avaliação de Equidade e Ajustes Finais (RF 4) Auditar a proposta, medir equidade e aplicar ajustes.

5. Protótipos

Para proporcionar uma visão clara e tangível da solução proposta, criamos protótipos interativos que demonstram tanto o fluxo de trabalho dos agentes quanto o resultado final que a coordenação receberá. Explore os links abaixo para entender melhor a solução em ação.

6. Requisitos Funcionais

RF 1. Agente de Validação e Normalização de Dados

1.1 Tarefa do Agente

Validar a integridade, consistência e normalizar os dados de professores, turmas, espaços e janelas de tempo para um formato canônico.

1.2 Prompt ou Instruções do Agente
 # 1. Contexto e explicações sobre inputs iniciais
Você está recebendo um JSON bruto contendo arrays: professores[], turmas[], espacos[], tempos[] e, opcionalmente, preferencias[] e parametros_objetivo{}.

# 2. Objetivo
Validar e normalizar esses dados para que possam ser utilizados pelos agentes subsequentes no fluxo de coordenação de horários.

# 3. Regras que você deve seguir para gerar sua resposta
- Exigir chaves mínimas por entidade e tipagem:
  - professor: {id:string, nome:string, disponibilidade:[{dia_semana:1-7, inicio:"HH:MM", fim:"HH:MM"}], carga_semanal_max:int}
  - turma: {id:string, nome:string, tamanho:int, carga_semanal_necessaria:int, janelas_preferenciais?:[{dia_semana, inicio, fim}], restricoes?:{dias_indisponiveis?:[1-7], blocos_indisponiveis?:[...]}}
  - espaco: {id:string, nome:string, capacidade:int, recursos?:[string], indisponibilidades?:[{dia_semana,inicio,fim}]}
  - tempos: {grade_base?:"semanal", slots?:[{dia_semana,inicio,fim,duracao_min:int}]}. Se slots ausentes, gerar slots pelo passo duracao_min padrão = 50 ou valor informado.
- Normalizar horários para o formato 24h e garantir inicio < fim. Rejeitar/registrar issue quando inválido.
- Expandir disponibilidades em slots discretos: dividir cada janela em blocos contíguos de duracao_min. Produzir slots_normalizados[] com ids estáveis: slot_id = "D{dia}-H{inicio}-{fim}".
- Canonicalizar IDs (string) e garantir unicidade por tipo. Em caso de duplicata, renomear com sufixo incremental e registrar em issues[].
- Validar capacidades e tamanhos: tamanho > 0, capacidade > 0. Coagir strings numéricas para int quando possível; caso contrário, marcar data_status='invalid'.
- Remover espaços/horários indisponíveis cruzando indisponibilidades de espacos com slots.
- Validar carga_semanal: professor.carga_semanal_max >= 0; turma.carga_semanal_necessaria > 0.
- Preferências: aceitar tipos {tipo:"professor|turma|espaco", id:string, peso:1-10, regra:{evitar?:[slots], priorizar?:[slots], janela_continua?:bool, max_janelas_dia?:int}}; normalizar para arrays de slot_id. Se referenciar slot inexistente, descartar e registrar issue.
- Parametrizar objetivos com defaults quando ausentes: {peso_equidade:3, peso_uso_espaco:2, peso_preferencias:1, peso_compactacao_prof:2, peso_distribuicao_turma:2, limite_janelas_prof_por_dia:3, limite_aulas_turma_por_dia:6}.
- Saída deve conter: data_status, arrays normalizados e lista issues[] com {tipo, entidade, detalhes, severidade:'warning'|'error'}. Se houver qualquer 'error', data_status='invalid'. 
1.3 Configurações do Agente

1.3.1 Especificação do Input

  • Mecanismo de Acionamento: Este agente é o ponto de partida do fluxo e deve ser acionado pelo envio de um JSON bruto com dados de professores, turmas, espaços e janelas de tempo via API. Na fase de testes, o fluxo será iniciado pelo envio manual dos dados, que serão enviados para o agente diretamente por upload do JSON na interface da Prototipe AI, para acelerar o processo de validação.
  • Tipo do input: O input inicial para o fluxo é um JSON bruto.
  • Formatos Suportados: Esse agente deve ser capaz de receber inputs no formato: .json.
  • Número de caracteres esperado: Este agente deve ter capacidade para processar um input de texto com até 20.000 caracteres.

1.3.2 Especificação do Output

  • Formato de output: O output deve ser um JSON normalizado com arrays normalizados e lista de issues.
  • Exemplo de Estrutura de Output:
     {
      "data_status": "valid",
      "professores_normalizados": [...],
      "turmas_normalizadas": [...],
      "espacos_normalizados": [...],
      "slots_normalizados": [...],
      "issues": [{"tipo": "warning", "entidade": "professor", "detalhes": "Nome duplicado", "severidade": "warning"}]
    } 
  • Número de caracteres esperado: O JSON gerado deve ter um tamanho estimado em torno de 5.000 caracteres.

1.3.3 Parâmetros de Geração

  • Modelo: GPT-5
  • Temperatura: 0.6

1.3.4 Ferramentas do Agente

  • Documentos: Não consulta documentos externos.
  • Calculadora: Não utiliza.
  • Busca Online: Não utiliza.
  • Sistemas Externos: Não se conecta a sistemas externos.

1.3.5 Memória

1.3.6 Regras de Orquestração e Transição

Ao concluir sua execução, esse agente aciona o Agente de Análise de Disponibilidade (RF 2).

RF 2. Agente de Análise de Disponibilidade

2.1 Tarefa do Agente

Construir o domínio de alocação calculando conjuntos de slots viáveis por (turma, professor, espaço) e o grafo de incompatibilidades de recursos e tempos.

2.2 Prompt ou Instruções do Agente
 # 1. Contexto e explicações sobre inputs iniciais
Você está recebendo um JSON normalizado com data_status='valid' oriundo do Agente de Validação e Normalização.

# 2. Objetivo
Calcular conjuntos de slots viáveis e o grafo de incompatibilidades, preparando os dados para o próximo estágio de otimização de horários.

# 3. Regras que você deve seguir para gerar sua resposta
- Se data_status!='valid', retornar somente {erro:"input_invalid"}.
- Calcular viabilidade de slot: um slot é viável se pertence simultaneamente à disponibilidade do professor, da turma (ou não consta como indisponível) e do espaço, e se espaco.capacidade >= turma.tamanho.
- Remover combinações que violem restrições explícitas de turma (dias_indisponiveis, blocos_indisponiveis) e indisponibilidades do espaço.
- Gerar candidatos_alocacao ao cruzar {turma} x {professores elegíveis} x {espacos} x {slots viáveis}. Se não houver professor elegível listado, considerar todos por padrão; se lista de elegíveis existir (campo turma.professores_elegiveis[]), restringir a ela.
- Construir conflitos como pares que compartilhem: (mesmo professor e mesmo slot), (mesma turma e mesmo slot), (mesmo espaço e mesmo slot). Representar cada aloc como {turma_id, professor_id, espaco_id, slot_id}.
- Derivar restricoes_derivadas:
  - max_aulas_turma_por_dia conforme parametros_objetivo.limite_aulas_turma_por_dia.
  - max_janelas_prof_por_dia conforme parametros_objetivo.limite_janelas_prof_por_dia.
  - janela_continua preferencial para turmas com preferencia.janela_continua=true.
- Registrar para cada turma a necessidade de carga: carga_restante = turma.carga_semanal_necessaria.
- Se qualquer turma não possuir slots viáveis em nenhum espaço, incluir em restricoes_derivadas um bloqueio {turma_id, motivo:'sem_slot_viavel'}. 
2.3 Configurações do Agente

2.3.1 Especificação do Input

  • Mecanismo de Acionamento: Este agente deve ser acionado automaticamente após a conclusão bem-sucedida do agente anterior (RF 1).
  • Tipo do input: Este agente deve ser apto a receber como input um JSON normalizado.
  • Formatos Suportados: Esse agente deve ser capaz de receber inputs no formato: .json.
  • Número de caracteres esperado: Este agente deve ter capacidade para processar um input de texto com até 8.000 caracteres.

2.3.2 Especificação do Output

  • Formato de output: O output deve ser um JSON com o domínio de disponibilidade, candidatos à alocação e conflitos.
  • Exemplo de Estrutura de Output:
     {
      "dominio_disponibilidade": {
        "por_turma": {"turma_id": ["slot_id"]},
        "por_professor": {"prof_id": ["slot_id"]},
        "por_espaco": {"espaco_id": ["slot_id"]}
      },
      "candidatos_alocacao": [{"turma_id": "t1", "professor_id": "p1", "espaco_id": "e1", "slot_id": "s1"}],
      "conflitos": {"mesmo_professor": [["aloc1", "aloc2"]], "mesma_turma": [[...]], "mesmo_espaco": [[...]]},
      "restricoes_derivadas": []
    } 
  • Número de caracteres esperado: O JSON gerado deve ter um tamanho estimado em torno de 3.500 caracteres.

2.3.3 Parâmetros de Geração

  • Modelo: GPT-5
  • Temperatura: 0.6

2.3.4 Ferramentas do Agente

  • Documentos: Não consulta.
  • Calculadora: Não utiliza.
  • Busca Online: Não utiliza.
  • Sistemas Externos: Não utiliza.

2.3.5 Memória

2.3.6 Regras de Orquestração e Transição

Ao concluir sua execução, esse agente aciona o Agente Otimizador de Alocação de Horários (RF 3).

RF 3. Agente Otimizador de Alocação de Horários

3.1 Tarefa do Agente

Gerar uma proposta de grade horária viável, sem conflitos, atendendo carga necessária por turma e maximizando métricas de qualidade e equidade.

3.2 Prompt ou Instruções do Agente
 # 1. Contexto e explicações sobre inputs iniciais
Você está recebendo um JSON do domínio com candidatos_alocacao, conflitos, restricoes_derivadas e parametros_objetivo_normalizados.

# 2. Objetivo
Gerar uma proposta de grade horária viável que maximize a utilização dos recursos e equidade entre os participantes.

# 3. Regras que você deve seguir para gerar sua resposta
- Prioridades rígidas (hard constraints) em ordem: (1) zero conflitos de professor/turma/espaco no mesmo slot; (2) respeitar indisponibilidades; (3) atender capacidade de sala; (4) respeitar carga_semanal_necessaria por turma como alvo, sem ultrapassar carga_semanal_max do professor.
- Objetivo composto (maximizar score_global) com pesos padrão quando não fornecidos:
  score = 2*compactacao_prof + 2*distribuicao_turma + 2*uso_espaco + 1*satisfacao_preferencias - 1*penalidade_gaps - 1*desbalanceamento_prof.
  - uso_espaco: média de (turma.tamanho/espaco.capacidade) nas alocações, truncada em 1.0.
  - compactacao_prof: penalizar janelas vazias por dia acima do limite; gap = somatório de buracos entre slots do professor no dia.
  - distribuicao_turma: penalizar concentração acima de limite_aulas_turma_por_dia; bonificar espalhamento equilibrado na semana.
  - satisfacao_preferencias: proporção de alocações que caem em slots priorizados; penalizar em slots evitados.
  - desbalanceamento_prof: variância da carga atribuída vs. média, normalizada; menor é melhor.
- Regras de desempate determinísticas: (1) priorizar slots marcados como preferenciais da turma; (2) depois preferências do professor; (3) maior razão tamanho/capacidade (melhor encaixe); (4) menor impacto em gaps_do_professor; (5) ID lexical mais baixo do espaço.
- Limites operacionais:
  - Respeitar limite_janelas_prof_por_dia: se ultrapassar, realocar para reduzir janelas ou mover para outro dia.
  - Não exceder limite_aulas_turma_por_dia; excedentes devem ser remanejados para outros dias.
- Produzir nao_alocadas quando não houver candidato viável, com motivo em {'sem_slot_viavel','sem_professor_disponivel','sem_espaco_adequado'}.
- Calcular metricas e score_global na saída. Garantir conflitos:0. Se impossível, retornar alocacoes parciais e explicitar restricoes_irresolviveis[]. 
3.3 Configurações do Agente

3.3.1 Especificação do Input

  • Mecanismo de Acionamento: Este agente deve ser acionado automaticamente após a conclusão do agente anterior (RF 2).
  • Tipo do input: Este agente deve ser apto a receber como input um JSON contendo candidatos à alocação e conflitos.
  • Formatos Suportados: Esse agente deve ser capaz de receber inputs no formato: .json.
  • Número de caracteres esperado: Este agente deve ter capacidade para processar um input de texto com até 10.000 caracteres.

3.3.2 Especificação do Output

  • Formato de output: O output deve ser um JSON com a proposta de alocação de horários e métricas de qualidade.
  • Exemplo de Estrutura de Output:
     {
      "alocacoes": [{"turma_id": "t1", "professor_id": "p1", "espaco_id": "e1", "slot_id": "s1"}],
      "nao_alocadas": [{"turma_id": "t2", "motivo": "sem_slot_viavel"}],
      "metricas": {
        "conflitos": 0,
        "utilizacao_media_espacos": 0.85,
        "variancia_carga_prof": 0.02,
        "gaps_medios_prof": 1.5,
        "satisfacao_preferencias": 0.9,
        "distribuicao_turma_balanceada": 0.95,
        "score_global": 8.5
      },
      "justificativas": [{"decisao": "alocar", "criterio": "melhor uso do espaço", "detalhes": "Turma t1 em espaço e1"}]
    } 
  • Número de caracteres esperado: O JSON gerado deve ter um tamanho estimado em torno de 4.000 caracteres.

3.3.3 Parâmetros de Geração

  • Modelo: GPT-5
  • Temperatura: 0.6

3.3.4 Ferramentas do Agente

  • Documentos: Não consulta.
  • Calculadora: Não utiliza.
  • Busca Online: Não utiliza.
  • Sistemas Externos: Não utiliza.

3.3.5 Memória

3.3.6 Regras de Orquestração e Transição

Ao concluir sua execução, esse agente aciona o Agente de Avaliação de Equidade e Ajustes Finais (RF 4).

RF 4. Agente de Avaliação de Equidade e Ajustes Finais

4.1 Tarefa do Agente

Auditar a proposta, medir equidade e sugerir/aplicar ajustes locais que aumentem o score sem introduzir conflitos.

4.2 Prompt ou Instruções do Agente
 # 1. Contexto e explicações sobre inputs iniciais
Você está recebendo a proposta de alocação do Otimizador e o domínio de disponibilidade.

# 2. Objetivo
Revisar a proposta de alocação para garantir equidade e aplicar ajustes que aumentem o score sem introduzir novos conflitos.

# 3. Regras que você deve seguir para gerar sua resposta
- Recomputar métricas e identificar oportunidades locais de melhoria:
  - Swaps entre turmas no mesmo slot/dia para reduzir desbalanceamento_prof ou aumentar uso_espaco sem criar conflito.
  - Moves para slots equivalentes (mesmo dia/turno) que reduzam gaps_medios_prof mantendo limites.
- Aplicar no máximo K=10 ajustes com ganho_score > 0.01 cada, na ordem de maior ganho.
- Não alterar alocações marcadas como fixas se houver campo justificativas[].decisao=='fixo' ou preferencia com peso máximo.
- Garantir após ajustes: conflitos:0, limites por dia atendidos, cargas preservadas.
- Emitir relatorio_equidade com: variancia_carga_prof, histograma de aulas por dia por professor, distribuição de turnos (manhã/tarde/noite) por turma; sinalizar outliers (2 desvios-padrão). 
4.3 Configurações do Agente

4.3.1 Especificação do Input

  • Mecanismo de Acionamento: Este agente deve ser acionado automaticamente após a conclusão do agente anterior (RF 3).
  • Tipo do input: Este agente deve ser apto a receber como input a proposta de alocação e o domínio de disponibilidade.
  • Formatos Suportados: Esse agente deve ser capaz de receber inputs no formato: .json.
  • Número de caracteres esperado: Este agente deve ter capacidade para processar um input de texto com até 12.000 caracteres.

4.3.2 Especificação do Output

  • Formato de output: O output deve ser um JSON final com a grade horária, melhorias aplicadas e métricas finais.
  • Exemplo de Estrutura de Output:
     {
      "grade_horaria": [{"turma_id": "t1", "professor_id": "p1", "espaco_id": "e1", "slot_id": "s1"}],
      "melhoria_aplicada": true,
      "melhorias_propostas": [{"tipo": "swap", "antes": {"turma_id": "t1", "slot_id": "s1"}, "depois": {"turma_id": "t2", "slot_id": "s2"}, "ganho_score": 0.05}],
      "metricas_finais": {...},
      "relatorio_equidade": {"professores": {"carga": [...], "variancia": 0.02, "janelas": [...]}, "turmas": {"distribuicao_semanal": [...], "picos_por_dia": [...]}}
    } 
  • Número de caracteres esperado: O JSON gerado deve ter um tamanho estimado em torno de 5.500 caracteres.

4.3.3 Parâmetros de Geração

  • Modelo: GPT-5
  • Temperatura: 0.6

4.3.4 Ferramentas do Agente

  • Documentos: Não consulta.
  • Calculadora: Não utiliza.
  • Busca Online: Não utiliza.
  • Sistemas Externos: Não utiliza.

4.3.5 Memória

  • Visibilidade das Instruções (Prompt): As instruções deste agente não são visíveis para agentes subsequentes.
  • Visibilidade da Resposta: A resposta gerada por este agente é o entregável final e não é passada para outros agentes internos.

4.3.6 Regras de Orquestração e Transição

A execução deste agente finaliza o fluxo. O JSON gerado é o resultado que deve ser disponibilizado à coordenação de horários para implementação.

© 2025 prototipe.ai. Todos os direitos reservados.