TutorLoom
The learning platform for companies, colleges and training institutes. Free and open source, with an Enterprise edition.
翻译准备中
尚未收集仓库信息。
尚未检测到更新。GitHub 发布版本后会显示在这里。
Planejador e gerador de aulas semanais compatíveis com Aula Studio.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗Aplicação para transformar um briefing de curso em uma trilha semanal de aulas compatível com o ClassAtelier. A interface combina uma área de planejamento editorial com uma prévia organizada por semanas. A linguagem visual se inspira na clareza do ClassAtelier — papel, tipografia editorial, barra de progresso, blocos e sumário — sem copiar a aplicação.
Versão atual: 1.2.1 (Versionamento Semântico). O histórico está em CHANGELOG.md; o número aparece no rodapé do aplicativo e em /api/health.
O Manual Class descreve os três aplicativos (ClassAuthor, ClassAtelier e ClassAcervo), cada menu, janela e caminho até o Moodle, com 87 capturas de tela: manual/manual-class.html (página) e manual/manual-class.pdf (impressão).
Os assets de marca ficam versionados para uso no cabeçalho, favicon, capas e compartilhamento:
public/brand/classauthor-mark.svg: símbolo quadrado;public/brand/classauthor-mark.png: símbolo raster de alta resolução;public/brand/classauthor-logo.svg: logo horizontal;public/brand/classauthor-logo.png: logo raster para documentos e apresentações;public/brand/classauthor-cover.svg: capa editorial horizontal;public/brand/classauthor-cover.png: capa PNG para redes sociais e compartilhamento;public/favicon.svg e public/favicon-32.png: favicons SVG e PNG;public/apple-touch-icon.png: ícone para iPhone/iPad;public/site.webmanifest: metadados de instalação como aplicativo.public/brand/ifsc-institutional-mark.png: marca institucional do IFSC usada na capa;public/brand/inovalab-signature.png e public/brand/inovalab-symbol.png: assinatura e símbolo do INOVALAB usados no crédito de desenvolvimento da capa.O ClassAtelier (em https://rgbittencourt.github.io/classatelier/, repositório classatelier) tem a marca da janela em arco, sem a caneta, em public/brand/classatelier-mark.svg; ela aparece no botão Abrir ClassAtelier.
.env versionado ou nesta conversa.O navegador salva automaticamente o briefing e, durante a geração distribuída, cada semana concluída imediatamente, além do Planejamento Geral, do Material de Mediação e do estado de validação em localStorage. Ao reabrir a aplicação no mesmo navegador e dispositivo, aparecerá a opção Retomar planejamento.
Se uma semana falhar depois de outras já concluídas, as anteriores continuam visíveis nos cards e ficam preservadas no rascunho. O botão Gerar com IA muda para Continuar da semana N: uma nova tentativa envia somente a semana interrompida e, depois, consolida o curso, sem reiniciar o que já foi produzido. O backend mantém retries para erros transitórios; o navegador limita a duas tentativas para não multiplicar chamadas longas depois de um timeout.
Para uma proteção adicional, use Baixar backup antes de fechar o navegador ou depois de uma geração importante. O arquivo JSON baixado pode ser recuperado com Restaurar backup. Para reabrir uma única semana baixada como SemanaNN-título-ClassAuthor.json, use Abrir semana salva: ela entra no lugar da mesma semana do planejamento aberto (ou como a próxima, se for a seguinte à última) e a liberação volta a ficar pendente. Por segurança, o código de acesso da IA nunca é salvo no autosave nem no backup.
O autosave local protege contra atualização da página, fechamento acidental, queda de energia e reinício do navegador, desde que os dados do site não sejam apagados. Ele não substitui o backup manual quando o planejamento for importante, nem sincroniza automaticamente entre dispositivos ou navegadores diferentes.
A assinatura do ChatGPT e o uso da API são gerenciados em áreas diferentes da OpenAI. Para o ClassAuthor, é necessária uma API key da plataforma de desenvolvedores.
classauthor-vercel.Se a plataforma solicitar configuração de cobrança ou limites de uso, faça essa configuração diretamente no painel da OpenAI. O código da aplicação não configura cobrança.
O ClassAuthor agora mantém uma camada compatível com OpenAI e Anthropic. A OpenAI continua sendo o padrão para não interromper a implantação atual. Para testar Claude, crie uma chave em https://console.anthropic.com/settings/keys e cadastre, na Vercel, AI_PROVIDER=anthropic, ANTHROPIC_API_KEY e ANTHROPIC_MODEL=claude-sonnet-5-5. O código nunca coloca a chave no navegador ou no GitHub.
Depois do Redeploy, o endpoint /api/health mostrará provider: "anthropic" e o modelo efetivo. A geração semanal, a assistência do briefing, a refação e as mensagens de mediação continuam usando o mesmo contrato JSON do ClassAuthor. A troca é reversível: remova AI_PROVIDER ou use AI_PROVIDER=openai para voltar à OpenAI.
Claude pode ser melhor para coerência e redação longa em alguns testes, mas não é uma garantia automática. A Anthropic também aplica limites de RPM, tokens de entrada/saída por minuto e gasto mensal. Por isso, a comparação correta deve ser feita com o mesmo briefing, mesma quantidade de semanas e uma avaliação das semanas geradas, não apenas pela ausência de um erro de limite.
rgbittencourt/classauthor.rgbittencourt/classauthor e clique em Import.npm install como instalação automática.| Nome | Valor | Ambiente recomendado |
|---|---|---|
OPENAI_API_KEY | a chave criada na etapa anterior | Production, Preview e Development |
OPENAI_BASE_URL | https://api.openai.com/v1 | Production, Preview e Development |
OPENAI_MODEL | gpt-4o-mini | Production, Preview e Development |
OPENAI_CONTENT_MODEL | opcional; modelo mais capaz para texto longo | Production, Preview e Development |
OPENAI_MAX_TOKENS | 16000 | Production, Preview e Development |
OPENAI_ASSIST_MAX_TOKENS | 6000 para Preencher vazios com IA | Production, Preview e Development |
OPENAI_REQUEST_TOKEN_BUDGET | 28000 para manter entrada + saída abaixo do limite de 30.000 TPM | Production, Preview e Development |
OPENAI_REGEN_MAX_TOKENS | 10000 para refazer uma semana | Production, Preview e Development |
AULA_SINGLE_PASS | true | Production, Preview e Development |
AULA_RESEARCH_TIMEOUT_MS | 8000 | Production, Preview e Development |
OPENAI_MAX_RETRIES | 3 | Production, Preview e Development |
AI_PROVIDER | openai (padrão) ou anthropic | Production, Preview e Development |
ANTHROPIC_API_KEY | chave secreta da Anthropic, somente se AI_PROVIDER=anthropic | Production, Preview e Development |
ANTHROPIC_MODEL | claude-sonnet-5-5 | Production, Preview e Development |
ANTHROPIC_MAX_TOKENS | 16000 | Production, Preview e Development |
ANTHROPIC_ASSIST_MAX_TOKENS |
AULA_ACCESS_CODE estiver configurado, informe esse código no campo de acesso da interface. Ele não é a chave da OpenAI nem da Anthropic.Depois de alterar qualquer variável, abra Deployments, escolha a implantação mais recente e faça Redeploy para que a função receba os valores novos.
Se aparecer uma mensagem como Limit 30000, Used 23843, Requested 8631 ou Request too large for gpt-4.1 in organization ..., a chave está funcionando, mas a organização atingiu temporariamente o limite de tokens por minuto do modelo. Não adianta criar outra chave dentro da mesma organização: o limite é aplicado à organização/projeto/modelo.
O botão Preencher vazios com IA não envia mais o briefing bruto inteiro. A aplicação remove configurações de cálculo e composição que não são necessárias nessa etapa, limita textos/listas extensos e usa um orçamento separado de saída (OPENAI_ASSIST_MAX_TOKENS, padrão 6000). Assim, esse erro não deve mais ocorrer apenas porque o formulário contém muitas semanas, materiais ou webpráticas. Se o provedor ainda indicar excesso de contexto, a resposta agora informa a causa sem repetir tentativas inúteis.
Na geração semanal, o prompt também é compactado: o modelo recebe o foco da semana, um índice resumido das demais semanas, o perfil acadêmico, o briefing essencial e somente as webpráticas agendadas naquela semana. O cliente calcula uma margem de segurança e reduz max_tokens quando a soma estimada da entrada e da saída se aproxima de OPENAI_REQUEST_TOKEN_BUDGET (padrão 28000). Isso evita a mensagem Limit 30000 ... Requested 44732 sem transformar a aula em um resumo; o texto do aluno continua sendo a prioridade.
Para ampliar o limite:
OPENAI_API_KEY.gpt-4.1.O código já reduz o pico usando uma semana por vez (AULA_AI_BATCH_SIZE=1) e faz novas tentativas somente em respostas transitórias. O cliente interpreta Retry-After e resets como 6m0s; quando a espera é longa, ele encerra a chamada e informa o tempo, em vez de repetir a solicitação imediatamente. Um excesso real de contexto não é repetido automaticamente. Isso vale para OpenAI e Anthropic, embora os nomes dos limites sejam diferentes.
Ao usar Refazer esta semana com IA, o sistema envia somente um briefing essencial e uma versão compacta da semana selecionada. Com AULA_SINGLE_PASS=true, a regeneração faz uma única chamada de redação e não dispara planejamento/revisão/reparo extras. O orçamento separado OPENAI_REGEN_MAX_TOKENS evita que uma regeneração ultrapasse o limite de tokens por minuto mesmo quando OPENAI_MAX_TOKENS está configurado para aulas novas mais longas.
O fluxo começa pelo briefing, mas o resultado não é uma lista fixa de seções. A IA escolhe o arco didático que combina com o conteúdo: descoberta conceitual, estudo de caso, oficina aplicada, análise de dados, debate orientado, revisão e síntese, ou combinação justificada. Uma semana pode ter diagnóstico, vídeo, leitura, atividade ou quiz quando isso tiver função pedagógica; não é obrigatório repetir todos esses elementos em todas as semanas.
Na interface, a capa exige o preenchimento de Nome, Instituição e Código de acesso de IA antes de entrar no workspace. Em telas amplas, o workspace fica dividido em três colunas: resumo e ações à esquerda, formulário e RESULTADO no centro e navegação do projeto à direita. A introdução “Do tema geral...” também fica no alto da coluna central. Logo abaixo de NAVEGAR PELO PROJETO existe um segundo menu separado, BACKUP E RECUPERAÇÃO, com Retomar planejamento, Baixar backup, Restaurar backup e Abrir semana salva quando aplicável. A navegação direita pode ser recolhida pelo controle Recolher; nesse estado, a coluna vira somente uma aba coral vertical. Clique na aba para expandir novamente. Ao recolher, a área central recebe todo o espaço liberado. A preferência fica salva neste navegador. A rolagem global é bloqueada no desktop: o centro concentra a leitura e cada coluna só rola se o próprio conteúdo ultrapassar sua altura. Em tablets e telas menores, as áreas passam para uma disposição vertical e cada uma mantém sua própria rolagem quando necessário, sem arrastar as demais junto. O resumo compacto traz os comandos Preencher vazios com IA, Gerar com IA, Recalcular qualidade, Material de Mediação PDF e Pacote completo ZIP. O menu superior fixo, que aparece somente depois da entrada pela capa, traz o atalho branded Abrir ClassAtelier em nova aba. Apenas Identidade do curso começa expandida; os demais setores do briefing começam recolhidos. Ao apresentar uma geração, o bloco externo RESULTADO e as quatro seções internas — Carga por atividade, Carga aberta por atividade, Checklists e Semanas planejadas — começam recolhidos. Cada cabeçalho tem um símbolo no canto superior direito para expandir ou recolher. A navegação lateral leva diretamente aos setores dentro da coluna central.
Em monitores largos, o workspace amplia sua largura útil: os menus laterais permanecem com largura fixa e a coluna central recebe todo o espaço restante para leitura, formulários e resultados. Em tablets e telas menores, o layout passa para a disposição vertical responsiva.
Durante o uso, clicar no logo ClassAuthor inicia um novo projeto de disciplina sem voltar à capa: limpa somente os formulários e resultados em edição, mantém Nome, Instituição e código na sessão atual e preserva o planejamento salvo, o botão Retomar planejamento e as opções de backup. Para encerrar a sessão e pedir novos dados de acesso, use o botão Trocar acesso no cabeçalho; ele limpa o planejamento local e retorna à capa vazia.
A semana produzida é uma unidade completa: abertura, conteúdo desenvolvido, seções e subseções, exemplos, reflexões, recursos no ponto de uso, síntese, avaliação, conexão com a semana seguinte e cálculo posterior da carga. Vídeos, imagens, diagramas e leituras ficam associados ao trecho ou conceito que motivou seu uso. Cada recurso leva sectionNumber e um bridgeParagraph: um parágrafo que explica a ligação com o conceito naquele ponto, o que o estudante deve observar e por que o recurso é pertinente. A leitura do aluno não termina com uma galeria de links separada.
O botão de assistência completa somente campos vazios do briefing. A geração final trabalha sobre o briefing revisado. A redação da semana é devolvida e salva primeiro; a pesquisa de candidatos reais de vídeo, imagem/diagrama e leitura ocorre em uma etapa complementar separada, que pode ser adiada sem apagar a aula.
Antes de considerar uma semana pronta, o ClassAuthor verifica título específico, abertura, pelo menos quatro objetivos, seções desenvolvidas, síntese, avaliação, blocos compatíveis com o ClassAtelier e alinhamento entre objetivo, atividade, evidência e avaliação. A meta configurada no Perfil acadêmico é tratada como piso de palavras úteis: uma meta de 3.000 exige pelo menos 3.000 palavras na medição da aula. O prompt distribui esse volume por seções e a tela mostra palavras, seções, objetivos, nota estrutural e pendências. Conteúdo insuficiente fica reservado para texto realmente curto ou estrutura didática ausente; pendências de referências, recursos ou revisão pedagógica aparecem como revisão recomendada, não como se a aula tivesse poucas palavras. Na rota distribuída, a versão inicial é salva antes de qualquer reparo: se houver pendência textual, ela aparece como reparo textual pendente e pode ser corrigida pela prévia sem colocar em risco as semanas anteriores.
Na seção Webpráticas síncronas, informe a quantidade desejada e clique em Criar sessões. Os cartões existentes são preservados; depois, use Preencher vazios com IA para completar cada item individualmente. A IA recebe a quantidade exata e não pode reduzir uma lista de duas ou mais práticas a apenas uma. No Planejamento geral, os recursos pendentes e os itens do checklist possuem caixas de seleção de conferência manual. Os itens que a IA já aprovou aparecem marcados inicialmente; desmarque um item aprovado quando quiser refazê-lo ou revisá-lo novamente. A marcação fica no salvamento local/backup e não substitui a correção de uma pendência pedagógica.
O checklist automático também verifica se cada vídeo, imagem ou leitura usado dentro de uma seção possui posição de uso e bridgeParagraph com ligação pedagógica suficiente. A aprovação automática significa que a estrutura e os metadados passaram pela checagem; ainda cabe ao professor abrir o recurso e confirmar se ele é realmente coerente, atual, acessível e adequado ao público.
Se um resultado antigo ainda exibir a classificação anterior, use Recalcular qualidade na área de resultados. Essa operação apenas reconsolida as semanas e não chama a IA. Quando a geração estiver parcial, o botão já pode ser usado com as semanas disponíveis: por exemplo, duas de seis são recalculadas sem fabricar as quatro ausentes. Depois, Gerar com IA continua da próxima semana pendente. Depois de conferir uma semana, use Liberar após conferência no cartão; a prévia passa a indicar que ela foi liberada manualmente, enquanto as observações automáticas permanecem visíveis como informação.
O resultado agora organiza as conferências em quatro listas: Checklist pedagógico (diagnóstico, checagens formativas, avaliação somativa, webprática quando houver, diferenciação, acessibilidade, recursos contextualizados e autoavaliação), Checklist acadêmico (rigor, evidências, coerência conceitual e revisão crítica), Checklist de recursos e acessibilidade (links, duração/páginas, coerência, acessibilidade e licença) e Checklist de qualidade e liberação (suficiência textual, pendências críticas e situação de cada semana). Uma semana bloqueada deve ser refeita antes do uso no ClassAtelier.
As semanas não são mais geradas apenas contra a lista geral de objetivos do curso. O backend constrói um mapa longitudinal com tema, pergunta central, conceitos novos, objetivos específicos, sequência editorial, ponte entre semanas, marco de evidência e arco didático preferencial. Para o percurso de Tecnologias para Gestão Educacional, por exemplo, a sequência é: fundamentos; Governo Digital; SIGE; dados e Learning Analytics; dashboards; Vibe Coding e governança.
Cada nova chamada recebe um resumo das semanas anteriores e uma regra explícita do que não deve ser repetido. A validação também compara títulos e objetivos entre semanas. Na geração distribuída, POST /api/generate-week faz uma única redação e devolve a primeira versão; ele não inicia reparo ou resgate longo dentro da mesma invocação. Se a semana ficar curta, o estado generationMeta.repairPending aparece na revisão e o professor usa Refazer esta semana com IA depois que o rascunho estiver salvo. A refação explícita devolve somente lessonPlan, usa quotas por seção e só aceita a versão se ela atingir o piso ou apresentar ganho substancial. Um acréscimo de 25, 45 ou 50 palavras não é tratado como correção.
O briefing possui um Perfil acadêmico do conteúdo com meta de palavras, mínimo de seções, referências, fontes acadêmicas/oficiais, escopo histórico, autores, quadros teóricos, tópicos a evitar e regras de contraponto, comparação e estudo de caso. Tema/área, público, nível da turma e profundidade são herdados automaticamente da Identidade do curso, sem preenchimento duplicado. Esses dados entram nos prompts e no checklist; não são apenas campos decorativos.
Para evitar a geração superficial, a IA possui um pipeline acadêmico completo:
claimEvidence e referências estruturadas.Os prompts efetivos e o contrato JSON de cada fase estão em src/ai.js. A produção usa por padrão AULA_SINGLE_PASS=true: o prompt acadêmico completo é executado uma semana por vez, com mapa longitudinal e continuidade das semanas anteriores. A rota distribuída devolve a primeira versão e registra pendências; o reparo acontece somente quando o professor solicitar a refação da semana já salva. O pipeline de planejamento, revisão e reparo acadêmico adicionais pode ser ativado em fluxos internos quando houver margem de duração na hospedagem, mas não é executado dentro da rota protegida de geração semanal.
Uma turma com várias semanas e revisão acadêmica pode gerar um volume grande de texto e chamar vários provedores externos. Fazer redação, reparo e curadoria na mesma função serverless aumenta o risco de a Vercel encerrar a requisição e o navegador receber apenas o texto genérico An error occurred with this application.. Por isso, Gerar com IA chama POST /api/generate-week para cada semana, salva a redação imediatamente, usa POST /api/enrich-week em uma etapa complementar para pesquisar recursos e somente depois chama POST /api/assemble-course para calcular os totais e montar o Planejamento Geral. Se a curadoria exceder seu próprio limite, a semana continua preservada e a geração prossegue. A documentação oficial da Vercel registra HTTP 504 FUNCTION_INVOCATION_TIMEOUT quando uma função ultrapassa sua duração; no plano Hobby, o máximo atual é 300 segundos. A correção aplicada é limitar o trabalho de cada invocação, não apenas aumentar maxDuration.
A semana não é mais gerada como um JSON de ~40 campos. O modo padrão (AULA_WRITER=prose) faz duas chamadas:
src/claude-writer.js): o texto da aula sai em Markdown corrido, com boas-vindas, objetivos, seções numeradas, callouts no ponto do texto (🔎 Veja mais aqui, 💭 Para refletir, 💡 Em uma frase, ⚠️ Atenção), síntese, "O que vem por aí", glossário, referências e Pontos a conferir (as afirmações específicas que o professor precisa verificar). O guia de voz e um trecho de aula aprovada (Semana 3 de TGE) ficam em src/writer-voice.js. Na Anthropic, esse bloco usa cache de prompt, então só a primeira semana paga o preço cheio por ele.O analisador src/writer-markdown.js converte o Markdown em lessonPlan sem usar IA, e o resto do sistema (blocos do ClassAtelier, ponte entre semanas, pesquisa de recursos, qualidade) continua igual. Detalhes que valem saber:
busca, que a pesquisa de recursos resolve depois. Só links que o professor colocou no briefing podem aparecer, e URL inventada é descartada.required e ainda ausentes são completados. Blocos genéricos de reserva não são mais inseridos.AULA_WRITER_PARALLEL=false volta à chamada única. Os modelos de semana (AULA_WRITER_MODELS) ficam em cache de prompt e valem para todas as partes.> 🖼️ **Figura** [diagrama | descrição: "…"]: legenda; depois do texto e dos recursos, /api/illustrate (despachado por api/regenerate-week.js) pede ao Claude o SVG de cada figura, limpa o SVG (sem script, imagem nem link externo) e o coloca como bloco imagem logo depois do corpo da seção, com a legenda “Ilustração criada por IA” e crédito de IA. Figura que falha fica pendente e aparece como “Figura prevista” na prévia; o aluno só recebe figuras prontas.AULA_WRITER=json volta ao modo anterior. AULA_WRITER_MAX_TOKENS ajusta o limite de saída da redação (padrão calculado a partir da meta de palavras, até 16000).Por padrão, Gerar com IA escreve uma semana e para: a prévia abre sozinha e a semana seguinte só é gerada depois que você aprova a atual (botão Aprovar e gerar a semana N) ou a refaz quantas vezes quiser. O seletor Aprovar cada semana antes de gerar a próxima fica acima do botão; desmarcado, o comportamento volta a ser gerar todas em sequência.
Ao aprovar, o sistema grava um contrato de ponte (src/bridge.js): os conceitos realmente ensinados, o exemplo-âncora, a pergunta deixada em aberto e o gancho prometido no fechamento. A semana seguinte recebe esse resumo, e não o texto completo; a abertura dela precisa cumprir o gancho. O resumo é derivado do próprio texto (POST /api/bridge, ação summary), sem custo de IA, e o contexto cresce pouco ao longo do curso.
Se você refizer uma semana já escrita, o sistema compara a ponte nova com a anterior e com aquela sobre a qual a semana vizinha foi construída. Há três resultados:
| Resultado | O que acontece |
|---|---|
| Nada mudou na ponte | Nenhuma outra semana é tocada. |
| O gancho ou o exemplo mudou | A vizinha ganha o aviso Abertura precisa de ajuste (ou Fechamento…). Ajustar a abertura reescreve só esse trecho, em uma chamada curta (POST /api/bridge, ação adjust), sem mexer no corpo da aula. |
| Os conceitos centrais mudaram | A vizinha fica Desatualizada: ajustar a abertura continua possível, e refazer a semana é decisão sua. |
Manter como está dispensa o aviso. O estado (aprovações, resumos e avisos) vai no salvamento local e no backup. O fechamento de cada semana, o gancho para a próxima, agora também aparece no bloco de síntese que o estudante lê (Na próxima semana:), e não só no lessonPlan.
Na prévia, o seletor O que alterar oferece três modos: Só o título da semana; Ajuste pontual no texto (padrão: a IA devolve só os blocos a trocar, apagar ou inserir e eles são aplicados por cima do texto, preservando questões, recursos, figuras, glossário, referências e mediação); e Refazer a semana inteira (reescreve tudo, como antes). Os dois primeiros rodam em /api/regenerate-week com action: "edit" (src/week-edit.js).
Os checklists seguem a mesma regra: cada item tem uma ação restrita ao que aponta — prompt específico no modo pontual (título, objetivos, pendência acadêmica…), botão que gera de novo só a parte indicada (questões, atividades/paradas ou mediação, via parts em /api/derivatives) e, nos recursos, o ajuste pontual também edita a ligação, a função pedagógica, o texto alternativo e o link de cada recurso (o link só é trocado se você o colar no pedido). Nenhum item pede mais a “semana completa”.
Não existe uma sequência rígida para todas as semanas. A IA escolhe um arco adequado — descoberta conceitual, caso, oficina, análise de dados, debate ou síntese — e registra quais fases estão ativas: abertura, diagnóstico, explicação, exemplo, prática guiada, prática independente, reflexão, avaliação e síntese. Quando uma fase é omitida, a omissão recebe justificativa. Vídeos, imagens e leituras entram dentro do tópico/conceito que os torna úteis; não são despejados em uma galeria final.
O briefing possui um painel Recursos e leituras por semana. Nele, defina quantos vídeos, artigos acadêmicos e leituras obrigatórias devem ser procurados por semana, além do nível da leitura obrigatória. A tabela de distribuição permite substituir o padrão em semanas específicas: use 0 para não solicitar aquele recurso em uma semana e deixe Padrão para herdar a configuração geral. Artigos podem contar como leituras obrigatórias, evitando duplicação.
Essas metas entram no prompt semanal, na curadoria da IA e nas solicitações ao YouTube/Crossref. A pesquisa só insere URLs retornadas por provedores ou fornecidas no briefing; quando não há candidatos suficientes, a pendência fica marcada para revisão humana. A curadoria elimina duplicatas pela URL real e registra requested, candidates, selected e materialized em lessonPlan.resourceResearch.coverage. Assim, Vídeos: 3 solicitados · 3 encontrados só aparece quando existem três URLs reais e três players materializados; não há preenchimento artificial com links repetidos ou inventados. Imagens continuam sendo pesquisadas como enriquecimento contextual, e todos os recursos selecionados viram blocos editáveis na prévia e no JSON do aluno.
No Planejamento geral, Carga por atividade resume as metas, o cálculo total, as categorias e o arco didático; já Carga aberta por atividade mostra, em minutos e horas, o que veio do texto-base, de artigos/leituras obrigatórios, de leituras complementares, de vídeos obrigatórios ou extras, de imagens, quiz, fórum, revisão, projeto e webprática. A mesma separação aparece ao abrir Ver aula. Assim, a carga não fica escondida em um único total.
O painel Composição da aula no ClassAtelier permite definir uma quantidade padrão de blocos por semana e alterar exceções semanais. A lista inclui destaques, atenção, reflexão, citações, imagens com legenda, casos, tabelas, acordeões, flashcards, sliders, linhas do tempo, colunas comparativas, quiz formativo e conteúdo externo. A política Obrigatório pede o bloco; Preferir trata a quantidade como orientação pedagógica; Não usar desativa o tipo.
Os blocos são contextualizados pela IA e posicionados na seção indicada, depois do texto que lhes dá sentido. O servidor materializa a propriedade lessonPlan.composition em blocos editáveis compatíveis com o ClassAtelier; não são contados como texto-base. A prévia mostra cada bloco no ponto da seção e a carga aberta acrescenta o tempo estimado dos interativos. Ao refazer uma semana, pedidos explícitos como “acrescente 1 quiz” também atualizam a exceção de composição daquela semana e materializam o bloco no card e no JSON devolvido. A contagem exibida no card vem da composição normalizada; o quiz precisa conter pergunta, alternativas, resposta e explicação específicas, mesmo quando a resposta da IA omitir a entrada de composição e o servidor usar o fallback contextualizado.
Os quatro checklists exibem todos os itens disponíveis e iniciam marcados os que a análise automática aprovou. Clique no texto do item — pedagógico, acadêmico, de recursos/acessibilidade ou de qualidade/liberação — para abrir um painel com o que verificar, critérios de aceite e um prompt estruturado específico para refazer a semana. A caixa de seleção tem somente a função de marcar ou desmarcar o item. O prompt pode ser copiado ou carregado diretamente na prévia da semana pelo botão Abrir refação da semana. Ao desmarcar um item, ele passa a representar uma conferência/refação manual. As listas mantêm a posição de rolagem e o foco após cada marcação, inclusive quando o item está distante do início; as marcações de recursos, revisão acadêmica e qualidade também entram no salvamento local e no backup.
Depois de escrever a semana, o ClassAuthor procura no texto valores em R$, percentuais, anos, quantidades, leis/portarias e citações diretas e confere se o número aparece no briefing ou nas semanas já geradas. O que não aparece em nenhum lugar entra em evidências a conferir (claimEvidence, status needs-human-review), com a frase, a seção e o motivo, além do que o próprio autor listou em "Pontos a conferir". É uma checagem local, sem custo de IA, feita em src/fact-check.js. Ela não prova que o número é falso; só avisa que ele não veio de uma fonte que você forneceu.
A aplicação produz duas camadas diferentes:
SemanaNN-titulo-ClassAtelier.json) compatível com o botão Abrir do ClassAtelier. Ele contém apenas a experiência de aprendizagem do aluno: texto, objetivos, recursos contextualizados, atividades, avaliação, síntese e referências necessárias. O arquivo não leva alinhamento pedagógico, parágrafos internos de ligação, justificativas de curadoria, status de revisão, cálculo de tempo, ajustes de carga ou mensagens de acompanhamento. lessonPlan.webPractices é sempre [].explain dos derivados; em semanas antigas, o botão Completar explicações do Material de Mediação na prévia gera só essa parte, sem tocar no texto. Emojis e símbolos que a fonte do PDF não tem são omitidos.teacherGuide.webPracticeProjects e exportada como DOCX editável próprio, sem ser inserida no texto-base semanal.Na tela de resultados, o app se chama ClassAuthor. Todos os arquivos levam o crédito “Conteúdo elaborado com ClassAuthor, uma ferramenta de planejamento pedagógico desenvolvida por Rogério Bittencourt, INOVALAB - IFSC.”: como último bloco da aula do ClassAtelier (rodapé de autoria), nos campos aiTool, aiUse e generatedBy do meta, no JSON do ClassAuthor, na categoria do Moodle XML, na capa do PDF e na planilha de produção, além do nome e da instituição de quem preencheu a capa. Cada semana tem três downloads, com o destino no nome: JSON ClassAtelier (SemanaNN-titulo-ClassAtelier.json, para abrir no ClassAtelier, sem o quiz; as referências saem como texto), JSON ClassAuthor (SemanaNN-titulo-ClassAuthor.json, a semana completa com quiz, feedbacks e guia do professor) e Quiz XML (SemanaNN-titulo-Quiz.xml, para importar no banco de questões do Moodle). O painel separado Webpráticas programadas mostra a agenda e oferece Baixar DOCX para cada sessão. Material de Mediação PDF baixa o documento de mediação. Pacote completo ZIP reúne os JSONs, o Planejamento Geral, o Material de Mediação em PDF e os projetos de webprática em Markdown, JSON, arquivos auxiliares e DOCX.
Abrir no ClassAtelier. O botão Abrir ClassAtelier, no cabeçalho, abre o editor em outra aba e, ao lado dele, a lista com define qual semana já entra carregada (ou editor em branco). Cada cartão de semana também tem Abrir esta semana no ClassAtelier. A semana segue por postMessage só para a aba que o ClassAuthor abriu; a aula que estava aberta no editor vai para a Biblioteca do ClassAtelier (nada se perde); só se a mesma semana já estiver lá, com edições, ele pergunta antes de substituir. Se o editor não responder em 25 s, o arquivo da semana é baixado para você usar em Abrir projeto.
Receber de volta a aula editada. Depois de editar a semana no ClassAtelier, o menu Exportar → Enviar de volta ao ClassAuthor devolve o projeto editado e o texto corrido para a aba do ClassAuthor que o abriu (postMessage, só entre os dois sites). O cartão da semana ganha o aviso Versão editada no ClassAtelier, e essa passa a ser a versão usada em Abrir esta semana no ClassAtelier, em JSON ClassAtelier e no ZIP; o aviso também oferece Baixar o texto (.txt) e Voltar à versão gerada. O quiz, o guia do professor e a carga horária continuam os da geração, e a edição fica guardada no rascunho do navegador. Se a semana for refeita pela IA, a edição daquela semana é descartada, porque deixaria de corresponder ao conteúdo novo.
Webprática não é obrigatória em toda semana. Ela é uma aula síncrona ou laboratório prático independente, em que os estudantes usam uma ferramenta, constroem um artefato, testam uma hipótese ou resolvem uma situação-problema. No formulário, cada sessão precisa de título e de semana ou data; também pode receber dia, horário, plataforma, ferramenta, objetivo, contexto, preparação, materiais, etapas, produto, evidências, rubrica, prompts, acessibilidade e plano B. A IA só desenvolve o projeto na semana em que ele está agendado; não inventa uma webprática para completar a estrutura.
Nada da webprática entra na aula-base do aluno: não entra no texto, nos blocos, nas atividades ou no .aula.json. O projeto completo fica em teacherGuide.webPracticeProjects, é descrito no Material de Mediação em PDF e vai para webpraticas/ no ZIP como roteiro-webpratica.docx, Markdown, JSON e arquivos auxiliares.
Os cálculos vivem no código, em src/formula-profile.js e src/calculations.js, sem leitura ou vínculo com planilhas externas. A carga é calculada depois que a semana foi escrita: conteúdo digital usa palavras, leituras usam páginas/palavras e o tipo de texto, vídeos usam duração conferida, fóruns usam a regra configurada de comunicação, e avaliações/práticas entram como itens próprios. Recursos sem dados suficientes ficam sinalizados para revisão.
O Planejamento Geral considera o total do curso, apresenta meta, carga calculada, diferença, categorias, itens obrigatórios/opcionais, arcos usados e pendências de conferência. Se as regras mudarem, a alteração será feita diretamente no código, acompanhada por testes e publicada como nova versão do perfil interno.
Após a geração textual, o sistema consulta YouTube Data API v3 para vídeos, Wikimedia Commons para imagens e diagramas com metadados de crédito/licença e Crossref para referências acadêmicas. Quando o Crossref retorna poucos candidatos, o adaptador consulta automaticamente o OpenAlex como fallback público; nenhuma nova chave é necessária. A IA recebe os candidatos retornados pelos provedores, escolhe os mais adequados e registra justificativa pedagógica, fonte, URL, duração e licença quando disponíveis. As alternativas permanecem no campo lessonPlan.resourceResearch para conferência.
A arquitetura agora separa três responsabilidades: src/ai-client.js faz chamadas JSON, retries e recuperação de respostas inválidas; src/resource-curator.js pede à IA apenas a seleção entre candidatos reais; e src/resource-providers.js mantém o registro extensível de provedores. Assim, adicionar outro catálogo de vídeos, imagens ou referências não exige alterar o contrato semanal nem a redação da aula.
Os recursos selecionados viram blocos editáveis do ClassAtelier: video, imagem ou materiais. Isso permite abrir a aula e editar o texto, trocar/remover uma imagem ou vídeo, inserir outro bloco e reorganizar a leitura sem transformar o conteúdo em HTML achatado. Cada recurso possui estado candidate-found, selected-by-ai ou approved, além de pendências de licença, atualidade, acessibilidade, duração e adequação ao idioma. A aprovação final continua humana. Sugestões que ainda não têm URL real permanecem visíveis para conferência no Material de Mediação e na prévia do professor, mas são removidas da fronteira de exportação: não entram no JSON do ClassAtelier como vídeo, imagem ou material vazio.
YOUTUBE_API_KEY, tipo Secret, em Production./api/health: o campo youtubeConfigured deve aparecer como true.Sem YOUTUBE_API_KEY, o ClassAuthor continua pesquisando imagens/diagramas e leituras; vídeos sem dados ficam pendentes e não são inventados. AULA_RESOURCE_RESEARCH=false desativa o enriquecimento para diagnóstico.
O fallback OpenAlex fica ligado por padrão e aparece como openAlexFallback: true em /api/health. Ele só é acionado quando o Crossref retorna menos de três candidatos para uma busca. Para desligá-lo, cadastre AULA_OPENALEX_ENABLED=false e faça Redeploy.
| Rota | Função |
|---|---|
GET /api/health | informa o estado das chaves e do modelo |
POST /api/assist-briefing | preenche campos vazios do briefing |
POST /api/generate | gera semanas do aluno, guias do professor e Planejamento Geral |
POST /api/generate-week | gera uma semana isolada, com pesquisa de recursos e guia correspondente |
POST /api/assemble-course | consolida semanas já geradas e calcula o Planejamento Geral |
POST /api/regenerate-week | refaz somente uma semana com instrução do professor e recalcula o curso |
POST /api/regenerate-message | refaz uma mensagem de WhatsApp ou Moodle com tom e instruções próprias |
POST /api/teacher-pdf | devolve somente o PDF do Material de Mediação |
POST /api/webpractice-docx | devolve o DOCX editável de uma webprática por practiceId ou índice |
POST /api/production | roteiros de vídeo, slides e narração de uma semana (scope: "week") ou da UC (scope: "course"); roda dentro de api/regenerate-week.js (action: "production") |
POST /api/zip | devolve o pacote completo, incluindo PDF, DOCX, webpráticas e a planilha de produção |
cp .env.example .env
# edite .env e preencha OPENAI_API_KEY, YOUTUBE_API_KEY e AULA_ACCESS_CODE, se desejar
npm install
npm run dev
Abra http://127.0.0.1:4310.
Variáveis principais:
AI_PROVIDER=openai
ANTHROPIC_API_KEY=
ANTHROPIC_MODEL=claude-sonnet-5-5
OPENAI_API_KEY=chave-local-nunca-commitada
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_MODEL=gpt-4o-mini
OPENAI_CONTENT_MODEL=
OPENAI_MAX_TOKENS=16000
OPENAI_ASSIST_MAX_TOKENS=6000
AULA_SINGLE_PASS=true
AULA_RESEARCH_TIMEOUT_MS=8000
OPENAI_MAX_RETRIES=3
AULA_AI_BATCH_SIZE=1
AULA_ACADEMIC_PIPELINE=true
AULA_ACADEMIC_REVIEW=true
AULA_AUTO_REPAIR=true
AULA_ACCESS_CODE=um-codigo-privado-opcional
YOUTUBE_API_KEY=chave-do-youtube-opcional
AULA_RESOURCE_RESEARCH=true
HOST=127.0.0.1
PORT=4310
A chave é usada apenas pelo backend e nunca é enviada ao navegador.
scripts/smoke-ai.mjs escreve uma semana com o provedor configurado e mostra o que o professor precisa conferir: referências fora do padrão ABNT NBR 6023 (com o motivo de cada uma), citações no texto sem correspondência na lista de referências, citações diretas longas e as pendências do próprio ClassAuthor.
AI_PROVIDER=anthropic ANTHROPIC_API_KEY=... ANTHROPIC_MODEL=claude-sonnet-5-5 node scripts/smoke-ai.mjs
node scripts/smoke-ai.mjs --semana 2 --tema "Learning analytics na gestão escolar" --salvar saida.json
A chave vem do .env ou do ambiente e nunca é impressa. Sem chave, o script avisa e não faz nada.
classatelier/Semana01-titulo-ClassAtelier.json
classatelier/Semana02-titulo-ClassAtelier.json
classauthor/Semana01-titulo-ClassAuthor.json
classauthor/Semana02-titulo-ClassAuthor.json
moodle/Semana01-titulo-Quiz.xml
moodle/Semana02-titulo-Quiz.xml
moodle/todas-as-semanas-quiz.xml
planejamento-geral.json
professor/material-de-mediacao.pdf
webpraticas/01-tema/guia-e-roteiro.md
webpraticas/01-tema/pacote.json
webpraticas/01-tema/roteiro-webpratica.docx
webpraticas/01-tema/arquivos/*
producao/planilha-de-producao.xlsx (se já houver roteiros gerados)
producao/roteiros-de-video.md
Os nomes seguem o padrão que o próprio ClassAtelier usa nos projetos: SemanaNN- + título sem acento e sem palavras soltas no fim (até 60 letras) + destino (ClassAtelier.json, ClassAuthor.json, Quiz.xml). Assim o arquivo baixado daqui, o projeto salvo no ClassAtelier e o publicado no acervo têm o mesmo nome-base, e o ClassAtelier troca sozinho a versão antiga da mesma semana quando o título muda.
Na prévia de cada semana liberada, Gerar roteiros e slides desta semana escreve, a partir do texto aprovado: o vídeo de abertura do Moodle (3–4 min), o vídeo curto de WhatsApp (~30 s, mesmo cenário) e a apresentação de slides com a narração slide a slide para a voz clonada. Os vídeos da UC (abertura da sala no Moodle, aviso de WhatsApp e encerramento) têm um quadro próprio no fim dos resultados e só são liberados depois que todas as semanas estiverem liberadas. A planilha .xlsx (abas Produção, Roteiros, Slides, Narração) acumula tudo, com “Como produzir” (HeyGen, gravação própria, slides + voz clonada) e “Status” em listas suspensas. O estado fica no rascunho salvo e vai no ZIP.
Cada semana traz 6 questões de múltipla escolha com 5 alternativas e feedback em todas elas, certas ou erradas (a certa explica por quê; cada errada aponta o equívoco e a seção a reler). Verdadeiro/falso não é mais usado.
O quiz não vai no JSON do ClassAtelier: sai em Moodle XML, na pasta moodle/ (e fica completo no JSON do ClassAuthor, com feedback em todas as alternativas): um arquivo por semana e um todas-as-semanas-quiz.xml, com uma categoria $course$/top/<Curso>/Semana N por semana. Para importar: Moodle → Banco de questões → Importar → formato Moodle XML. As questões são de resposta única, com alternativas embaralhadas e feedback por alternativa.
Depois de revisar o JSON no ClassAtelier, use Exportar → Pacote SCORM (.zip) para enviar a aula ao Moodle. O ClassAuthor prepara a autoria e o planejamento; a publicação SCORM continua sendo feita no ClassAtelier.
npm install
npm test
A suíte cobre contrato do aluno, separação do Material de Mediação, arcos didáticos, recursos inseridos dentro do tópico, fórmulas internas, geração de PDF e conteúdo do ZIP. É necessário informar primeiro o Tema geral ou título do curso, pois ele dá contexto para as sugestões; depois, a IA também pode completar objetivos, conteúdo, webpráticas, materiais e termos de busca. Durante qualquer chamada demorada — Preencher vazios com IA, Gerar com IA, Recalcular qualidade ou Refazer esta semana com IA — aparece um painel visual no topo com spinner, etapa atual e barra de progresso. O botão em execução fica desabilitado para evitar chamadas duplicadas; ao terminar, o painel confirma o sucesso ou mantém uma mensagem de erro legível. Se o provedor devolver um erro de modelo, limite ou autenticação, a mensagem técnica agora é mostrada em vez de aparecer apenas como “resposta vazia”.
6000 |
| Production, Preview e Development |
ANTHROPIC_REQUEST_TOKEN_BUDGET | 28000 como margem local do ClassAuthor | Production, Preview e Development |
ANTHROPIC_REGEN_MAX_TOKENS | 10000 | Production, Preview e Development |
ANTHROPIC_MAX_RETRIES | 3 | Production, Preview e Development |
AULA_AI_BATCH_SIZE | 1 | Production, Preview e Development |
AULA_ACADEMIC_PIPELINE | true | Production, Preview e Development |
AULA_ACADEMIC_REVIEW | true | Production, Preview e Development |
AULA_AUTO_REPAIR | true | Production, Preview e Development |
AULA_ACCESS_CODE | uma frase/código privado seu | Production, Preview e Development |
AULA_CORS_ORIGINS | (opcional) endereços extras que podem pedir figuras ao /api/figure, separados por vírgula. O GitHub Pages do autor e o localhost já são aceitos | Production, Preview e Development |
YOUTUBE_API_KEY | chave opcional do YouTube Data API | Production e, se desejar, Preview |
AULA_OPENALEX_ENABLED | true por padrão; use false para desativar o fallback acadêmico | Production, Preview e Development |