Aplicação desktop (Windows) que transforma os materiais reais de uma disciplina — PDFs, slides, código, links, Moodle — em um repositório Markdown estruturado, curado e pronto para uso com tutores baseados em LLM (Claude, GPT, Gemini).
O diferencial: o repositório gerado não é só uma pilha de markdowns. Ele carrega contexto pedagógico — cronograma da disciplina, mapeamento arquivo→aula, escopo de provas, estado do aluno — para que o tutor saiba onde o aluno está no semestre e o que importa agora.
- Principais Recursos
- Como Funciona
- Início Rápido
- Arquitetura
- Pipeline de Processamento
- Backends de Extração
- Perfis de Processamento
- Cronograma e Mapeamento Automático
- Importação Moodle / M365
- Curadoria
- Image Curator e Vision
- Resumos via Gemini (opcional)
- Arquitetura Low-Token
- Repositório Gerado
- Configuração
- Testes
- Roadmap
- Licença
| Recurso | Descrição | |
|---|---|---|
| 📥 | Importação multiformato | PDFs, imagens, código (.py, .ipynb, .dfy…), ZIPs, repositórios GitHub, URLs e import direto do Moodle (incluindo OneDrive/M365) |
| 🧠 | Extração híbrida de PDF | Seleção automática de backend por perfil do documento: PyMuPDF para texto simples, Datalab/Marker/Docling para material matemático ou escaneado |
| 📅 | Cronograma inteligente | Parse do cronograma institucional, classificação de blocos (aula, prova, revisão, feriado), escopo automático de avaliações e mapeamento arquivo→aula com score de confiança |
| 🏷️ | Mapeamento com aprendizado | Correções manuais alimentam um perfil de tags por matéria que melhora os mapeamentos futuros |
| 🖼️ | Curadoria visual | Image Curator com descrições via Ollama ou captions do Datalab; Curator Studio para revisão de extrações difíceis |
| 🤖 | Enriquecimento via Gemini | Resumos de código e referências bibliográficas com cache por hash (reprocessar não custa tokens) |
| 🎓 | Estado do aluno | Perfil, personalidade e progresso por tópico (STUDENT_STATE.md) consumidos pelo tutor para calibrar profundidade |
| ⚙️ | Operação resiliente | Fila de tasks persistente, builds retomáveis, arquivos ausentes não abortam o build, limpeza automática de curadoria órfã |
Importar materiais (PDF, código, links, Moodle)
→ classificar e configurar entries na fila
→ processar: extração + sanitização + assets
→ mapear cada arquivo para unidade/bloco do cronograma
→ revisar casos difíceis (manual-review, curadores)
→ enriquecer: resumos Gemini, descrições de imagem
→ gerar repositório: índices, mapas, instruções por plataforma
Fluxo típico no app:
- Criar ou selecionar uma matéria (cronograma + plano de ensino + pasta do repositório).
- Importar arquivos, links ou puxar direto do Moodle.
- Processar a fila (ou enfileirar como task de repositório).
- Revisar saídas problemáticas em
manual-review/e nos curadores. - Ajustar mapeamentos na aba Cronograma ou no editor de Backlog.
- Build/Reprocessar — regenera todos os artefatos pedagógicos com o código atual, sem reextrair PDFs.
A fila é persistente entre sessões; builds e reprocessamentos podem ser retomados.
git clone <URL_DO_REPOSITORIO>
cd GPT-Tutor-Generator
python -m venv .venv
& .\.venv\Scripts\Activate.ps1
python -m pip install -U pip setuptools wheel
pip install -e .[dev]
# backends avançados de PDF (opcionais)
pip install docling marker-pdf
python app.pyValidação do ambiente: no app, abra Status e confira Datalab API, docling CLI, marker CLI, TESSDATA e Vision.
- Windows 10/11, Python 3.11+ com
tkinter - Dependências principais:
pymupdf,pymupdf4llm,pdfplumber,Pillow,requests,beautifulsoup4 - Opcionais: Ollama (vision local), Tesseract (OCR), Datalab (PDF cloud), Gemini (resumos),
docling/marker-pdf(backends locais avançados)
app.py # bootstrap
src/
├── builder/
│ ├── engine.py # façade — ponto único de entrada; backends e BackendSelector
│ ├── ops/ # orquestração: build completo, incremental, regeneração, fila
│ ├── core/ # importers (código/zip/github), resumos LLM, resolução de imagens
│ ├── timeline/ # índice do cronograma, classificador de blocos, escopo de provas
│ ├── extraction/ # taxonomia de conteúdo, sinais de entry, tags automáticas
│ ├── artifacts/ # geradores de markdown: mapas, índices, instruções, health
│ ├── routing/ # scoring arquivo × unidade/bloco (FILE_MAP)
│ ├── pdf/ # perfil de documento, pipeline PDF, assets
│ ├── runtime/ # clientes externos: Datalab, Gemini, Marker/Docling config
│ ├── sources/ # Moodle e Microsoft 365
│ ├── text/ # normalização e sanitização
│ ├── vision/ # cliente Ollama, classificação visual, evidência de cards
│ └── facade/ # wiring de aliases usado pela façade
├── models/ # FileEntry, perfis, RepoTask (fila persistida)
├── ui/ # janela principal, 8 abas, dialogs, curadores
└── utils/ # helpers, parse de cronograma HTML, OCR, power management
Camadas: a UI conversa com o builder exclusivamente via engine.py (façade estável). O engine orquestra ops → domínio (timeline, extraction, artifacts, routing) → base (text, models, utils).
Abas da UI: Fila a Processar · Tasks de Repositório · Backlog · Dashboard · Cronograma · Códigos · Manutenção · Log.
① ENTRADA process_entry() roteia por tipo e copia o bruto para raw/
② PERFIL _profile_pdf() → densidade de texto, scan suspeito, tabelas
BackendSelector decide base + avançado conforme o perfil
③ EXTRAÇÃO base (PyMuPDF/PyMuPDF4LLM) e/ou avançada (Datalab, Marker, Docling)
→ staging/markdown-auto/ (com chunking e fallback automático)
④ SANITIZAÇÃO detecção de corrupção LaTeX, híbrido marker+base,
normalização matemática, extração de imagens com filtro de ruído
⑤ ROTEAMENTO manual → card Moodle → léxico → conteúdo (scoring com confiança)
resultado no manifest: unidade, bloco, banda, razões
⑥ LLM (opc.) resumos de código e referências via Gemini (cache por hash)
⑦ TIMELINE classificação de blocos, escopo de avaliações, taxonomia, tags
⑧ ARTEFATOS 87+ arquivos: mapas, índices, instruções, relatórios, export
- Arquivo-fonte ausente não aborta o build: entry vai para
failed_entriescomerror_type=missing_sourcee a UI lista os ausentes ao final. - Curadoria órfã é podada automaticamente no reprocessamento (
prune_stale_image_curation): descrições de imagens deletadas são removidas, páginas vazias são limpas. - Fallback de backend: timeout no Marker dispara retry com chunking; indisponibilidade cai para o próximo backend do perfil.
| Backend | Tipo | Quando usar |
|---|---|---|
pymupdf4llm / pymupdf |
base, local | texto digital simples — rápido e grátis |
datalab |
avançado, cloud | melhor opção para math_heavy — fórmulas, layout complexo (requer DATALAB_API_KEY; cobrança por página) |
marker |
avançado, local | alternativa local com suporte a LLM auxiliar; chunking e fallback automáticos |
docling / docling_python |
avançado, local | comparação e processamento local |
A opção Pular backends base (Configurações → Processamento) força ir direto ao backend avançado, útil quando a extração base nunca é aproveitada para um perfil de material.
Saídas do Datalab ficam em staging/markdown-auto/datalab/<entry>/ com markdown, imagens extraídas e datalab-run.json (metadados, custo, qualidade do parse).
Perfis nomeados unificam modo de processamento + backend preferido + modo Datalab + perfil de documento num seletor único (toolbar e por entry). O mapeamento perfil→backend usado pelo roteamento automático é derivado dos próprios perfis — fonte única de configuração, sem tabelas paralelas.
- Modos:
auto,quick,high_fidelity,manual_assisted - Perfis de documento:
auto,math_heavy,diagram_heavy,scanned - Modos Datalab:
fast,balanced,accurate
Perfis são gerenciáveis em Gerenciar Matérias → Gerenciar perfis e podem ser definidos por matéria e sobrescritos por entry.
O app converte a tabela de aulas do portal acadêmico da PUCRS (ASPNET, tabela dgAulas) diretamente em markdown estruturado:
- Portal → matéria → Cronograma de Aulas → DevTools (
F12) - Copiar o
outerHTMLda<table id="dgAulas"> - No app: Importar Cronograma (HTML) → colar → Importar para Markdown
O parser reconhece automaticamente suspensões (linha vermelha → {kind=suspension} ⊘), feriados (amarela), provas (azul → {kind=exam}) e recursos de sala (@Laboratório…). Dias marcados com ⊘ são ignorados no mapeamento de arquivos.
Outras instituições: o app funciona normalmente, mas o campo Cronograma da matéria é preenchido manualmente. Para adaptar o parser:
src/utils/helpers.py→parse_html_schedule().
O índice do cronograma (course/.timeline_index.json) classifica cada bloco como aula, avaliação, revisão, feriado ou reservado, com regras como:
- Sessões de revisão só permanecem como REVIEW se precedem uma avaliação; revisões de conteúdo no meio do semestre viram aula normal e herdam a unidade vizinha.
- Avaliações ganham escopo automático: as unidades cobertas são derivadas da janela cronológica desde a última avaliação.
- Overrides manuais (tipo, unidade, tópico) são preservados entre rebuilds.
O mapeamento arquivo→unidade/bloco usa precedência manual → card Moodle → léxico → conteúdo, com confiança relativa (margem entre o vencedor e o segundo colocado, threshold de aceite ≥ 0.65 e não-ambíguo). Correções manuais alimentam course/.tag_profile.json — boosts por matéria que reduzem erros recorrentes. O perfil é isolado por matéria e os tooltips da UI mostram as razões de cada sugestão.
Visualização da alocação por bloco: accordion com data/título, badges de confiança, marcador ✎ para overrides, seção de não-mapeados e reatribuição manual via dropdown (grava manual_timeline_block_id no manifest na hora; o botão 🔄 Reprocessar aplica nos artefatos).
Pelo diálogo Aluno → Conectar e escolher cursos:
- Login no Moodle institucional (a senha nunca é persistida — apenas o token de sessão)
- Seleção de cursos com download automático de PDFs
- Suporte a arquivos hospedados no OneDrive/M365 via device-code flow; o refresh token fica fora do repositório, protegido pelo Windows (DPAPI) — ver
.mex/context/setup.md - Cards do Moodle viram evidência de mapeamento (
source_section), usada na atribuição de bloco
| Ferramenta | Função |
|---|---|
| Backlog (aba) | Editar entries já processados: título, categoria, tags, unidade/subunidade manual. Mostra valores automáticos, sugestões de baixa confiança e a seção de origem do Moodle |
| Curator Studio | Revisão de extrações difíceis em manual-review/: preview do PDF com zoom, comparação base × avançada × template, editor markdown, aprovar/reprovar |
| Image Curator | Curadoria de imagens extraídas (ver abaixo) |
| Códigos (aba) | Gerenciar code_curation.json: gerar resumos Gemini, editar, atribuir aula |
| Manutenção (aba) | Detectar e limpar resíduos: curadorias órfãs, sidecars desatualizados |
| Student State Curator | Importar registro de sessão do tutor e atualizar progresso por tópico em student/batteries/ |
Opera sobre as imagens extraídas dos PDFs: agrupamento por página, preview do PDF, captura manual de regiões, classificação heurística (diagrama, tabela, fórmula, código, decorativa…), descrição acadêmica e extração de texto+matemática em Markdown/LaTeX.
Dois modos, controlados por Fonte de descrição de imagens nas Configurações:
- Ollama (padrão): vision local descreve cada imagem sob demanda (
qwen3-vlrecomendado) - Datalab: descrições vêm das captions extraídas durante o processamento do PDF — sem custo adicional de vision
ollama serve
ollama pull qwen3-vl:8b # local
ollama pull qwen3-vl:235b-cloud # cloud via OllamaValidação: Status → Vision → Validar Vision.
Com pip install google-genai e uma chave em Configurações → Gemini, o app enriquece:
- Código: título inferido, linguagem, papel pedagógico, conceitos, resumo e vinculação automática ao bloco do cronograma — persistido em
course/code_curation.jsoncom cache por hash (re-executar sem mudanças = 0 chamadas) - Referências bibliográficas: conceitos e relevância por unidade —
course/.reference_curation.json
Aparece no cabeçalho de cada código, no CODE_INDEX.md agrupado por aula, no CRONOGRAMA_DETALHADO.md e no CODE_HEALTH.md (cobertura e órfãos). Custo típico: ~$0.03 por matéria com gemini-2.5-flash. Sem chave, tudo funciona com fallback byte-equal.
Os artefatos são desenhados para baixo custo de contexto em LLMs web (map-first):
- Começar por
course/COURSE_MAP.md(mapa pedagógico curto) - Consultar
student/STUDENT_STATE.mdpara calibrar profundidade - Usar
course/FILE_MAP.mdcomo índice de roteamento - Abrir markdowns longos só quando os artefatos curtos não bastarem
Descrições de imagem são injetadas de forma compacta e bundle.seed.json fica seletivo, focado em metadados de alto sinal.
{repo-root}/
├── manifest.json # índice master de entries
├── course/ # COURSE_MAP, FILE_MAP, GLOSSARY, CRONOGRAMA_DETALHADO,
│ # índices internos (.timeline_index, .tag_profile, code_curation…)
├── content/ # markdown consolidado + images/
├── code/ # códigos com resumos, agrupados por origem
├── exercises/ exams/ # índices e materiais por categoria
├── assignments/
├── student/ # STUDENT_STATE, perfil, batteries por unidade
├── setup/ # instruções prontas para Claude, GPT e Gemini
├── system/ # política do tutor, pedagogia, modos
├── build/ # BUILD_REPORT, bundles, guias de curadoria
├── manual-review/ # revisão humana guiada
├── staging/ # saídas intermediárias dos backends
└── raw/ # cópias dos arquivos originais
DATALAB_API_KEY= # necessária para o backend datalab
DATALAB_BASE_URL=https://www.datalab.to~/.gpt_tutor_config.json — gerenciada pela UI (Configurações). Campos relevantes: tema, modo/OCR/backend padrão, perfis de processamento, skip_base_backends, timeouts e opções do Marker, vision (vision_model, ollama_base_url, image_description_source), Gemini (gemini_api_key, gemini_model, gemini_auto_summarize), prevent_sleep_during_build.
Configuração por matéria (modo, backend, OCR, perfil, pastas) vive no gerenciador de matérias e tem precedência sobre o padrão global.
| Executável | Obrigatório | Função |
|---|---|---|
python |
sim | rodar o app |
ollama |
para vision local | descrições de imagem |
tesseract |
não | OCR local |
docling / marker_single |
não | backends PDF locais avançados |
Se a autodetecção do Tesseract falhar:
[Environment]::SetEnvironmentVariable("TESSDATA_PREFIX", "C:\Program Files\Tesseract-OCR\tessdata", "User")pytest tests -q # suíte completa (1.100+ testes)Roadmap completo em ROADMAP.md. Próximos focos:
| Tema | Descrição |
|---|---|
| Cronograma editável | Tabela com edição inline de tipo/unidade e escopo manual de avaliações (spec em docs/specs/Feitos/) |
| Tutor proativo | Contexto de "semana atual" nas instruções, prontidão pré-prova (escopo × progresso do aluno) |
| Desempenho | Paralelização de chunks do Datalab, retry com backoff nas integrações |
| Novos destinos | Export NotebookLM além de Claude/GPT/Gemini |
MIT