Construtor de Súmula Curricular FAPESP a partir de múltiplas fontes, com saída em Markdown e envio por e mail via MailerSend.
Referência do formato e regras da súmula FAPESP. (FAPESP)
- Receber arquivos e links que descrevem a trajetória acadêmica de uma pessoa.
- Extrair texto com bibliotecas, limpar e curar o conteúdo em TXT estruturado.
- Gerar a Súmula Curricular no formato FAPESP em Markdown usando LLM apenas sobre TXT curado.
- Enviar o Markdown por e mail via MailerSend de forma assíncrona, sem cadastro.
- Não exigir login.
- Não delegar parsing de PDF para a LLM.
- Não garantir extração de PDFs escaneados no MVP.
- Não executar scraping agressivo de Google Scholar no MVP.
O Markdown deve iniciar com os campos abaixo. (FAPESP)
- Nome
- Orcid, obrigatório, com link
- Currículo Lattes, com link
- Web of Science, com link
- MyCitation Google Scholar, com link
A súmula deve conter seis seções, nesta ordem, e todas devem ser preenchidas, mesmo que com “NADA A DECLARAR”. (FAPESP)
- Formação
- Histórico Profissional Acadêmico
- Contribuições à Ciência
- Financiamentos à Pesquisa
- Indicadores Quantitativos
- Outras Informações Relevantes
- 1.1 Formação, Informações Adicionais (FAPESP)
- 6.a Informações biográficas dos últimos dez anos (FAPESP)
- 6.b Experiência internacional após doutorado (FAPESP)
- 6.c Prêmios, distinções, honrarias (FAPESP)
Tipos aceitos no MVP:
- XLS, XLSX
- TXT, MD
- PDF adicional
Limites:
- Tamanho máximo por arquivo via env
- Quantidade máxima de arquivos por submissão via env
Campos:
- Lattes
- ORCID
- DBLP
- Google Scholar
- Web of Science
- Site pessoal
Regra de Scholar:
- MVP aceita BibTeX colado como entrada primária, além de URL, para reduzir falhas
Campo para:
- Correções e preferências do usuário
- Destaques que o usuário quer ver em Contribuições
- Informações ausentes nas fontes
- Markdown final da súmula, arquivo
sumula.md - Envio por e mail via MailerSend com anexo
sumula.mde corpo com texto quando couber
Componentes:
- Campo e mail obrigatório
- Upload múltiplo
- Campos de links
- Campo BibTeX opcional
- Campo texto livre
- Botão para gerar
Após submit:
- Mostrar mensagem de processamento assíncrono e envio por e mail
- Exibir Job ID e link de status
- Exibir estado atual do job
- Exibir eventos por etapa
- Não exibir conteúdo dos documentos
Estados:
- RECEIVED
- EXTRACTING
- CURATING
- ENRICHING
- GENERATING
- VALIDATING
- SENDING_EMAIL
- DONE
- ERROR
- Web app em Python com FastAPI
- Worker assíncrono em Python
- Redis para fila
- Postgres para jobs, eventos e artefatos
- Storage local no Fly volume para arquivos do job
- Processo web
- Processo worker
- Redis
- Postgres
JSON persistido por job:
- arquivos com nome, tipo, hash, path
- urls por tipo
- bibtex colado quando informado
- texto livre
- locale, default pt BR
Regra central:
- A LLM só recebe o TXT curado, nunca recebe PDF, XLSX, HTML bruto
Formato obrigatório:
-
META
- job_id
- created_at
- locale
-
IDENTIFIERS
- nome
- orcid
- lattes_url
- dblp_url
- scholar_url
- wos_url
- site_url
-
RAW_BLOCKS
- FORMACAO_RAW
- HISTORICO_RAW
- CONTRIBUICOES_RAW
- FINANCIAMENTOS_RAW
- INDICADORES_RAW
- OUTRAS_RAW
-
EVIDENCE Linhas no formato:
EVID <id> | SRC=<source_id> | LOC=<page_or_row> | TEXT=<snippet>
Regras do curador:
- Remover duplicatas por hash de sentença
- Normalizar datas para mês e ano quando houver
- Preservar rastreabilidade em EVID para trechos usados
Regras do gerador:
- Cabeçalho com os cinco links
- Seções 1 a 6 na ordem FAPESP (FAPESP)
- Subitens 1.1 e 6.a 6.b 6.c (FAPESP)
- Seções sem dados devem conter “NADA A DECLARAR” (FAPESP)
- Markdown estrito, sem HTML
-
PDF
- Extrair texto com PyMuPDF ou pdfplumber
- Registrar origem por página
-
XLSX
- Ler com pandas e openpyxl
- Registrar origem por aba e linha
-
Site pessoal
- Extrair texto principal com trafilatura
-
DBLP
- Preferir export BibTeX quando disponível
- Fallback: extrair HTML e converter em texto
-
Scholar
- Preferir BibTeX colado
- Se só URL, registrar link e seguir sem falhar
- Remover cabeçalhos e rodapés repetidos por frequência
- Remover quebras de linha artificiais
- Normalizar espaços e bullets
- Detectar blocos por padrões de seção
- Gerar EVIDs com localização
- Consolidar publicações duplicadas por título normalizado e ano
- Calcular contagens para indicadores quando possível
- Registrar evidências para itens agregados
Entrada:
- Instruções fixas
- Template alvo em Markdown no modelo FAPESP (FAPESP)
- TXT curado
Regras:
- Não inventar dados ausentes
- Preencher todas as seções
- Respeitar limites do template quando houver
- Justificar itens em Contribuições usando evidências
Validações:
- Seis seções presentes e na ordem (FAPESP)
- Nenhuma seção vazia
- Subitens 1.1 e 6.a 6.b 6.c presentes
- Cabeçalho com ORCID e links
Reparo:
- Se falhar, rodar etapa de correção usando apenas o Markdown gerado e a lista de erros, sem documentos brutos
- GET /
- POST /submit
- GET /status/{job_id}
- GET /api/jobs/{job_id}/events
- POST /api/jobs/{job_id}/retry
- Executar pipeline por job
- Persistir eventos por etapa
- Atualizar status do job
- Gerar artefatos e registrar no banco
- Enviar e mail via MailerSend
Retentativas:
- Backoff em chamadas externas
- Limites por etapa via env
-
jobs
- id
- status
- created_at
- updated_at
- error_code
- error_message
- input_manifest_json
- output_manifest_json
-
artifacts
- id
- job_id
- kind, raw_file, extracted_txt, curated_txt, output_md
- path
- sha256
- size_bytes
- created_at
-
events
- id
- job_id
- step
- message
- created_at
Env vars:
- MAILERSEND_API_KEY
- MAILERSEND_FROM_EMAIL
- MAILERSEND_FROM_NAME
- Assunto: Súmula Curricular FAPESP em Markdown
- Corpo: status final, resumo das fontes usadas, job_id
- Anexo:
sumula.md
Env vars:
- OPENAI_API_KEY
- OPENAI_MODEL
- OPENAI_MAX_TOKENS
- REDIS_URL
- DATABASE_URL
- MAX_UPLOAD_MB
- MAX_FILES
- WORKDIR_PATH
- MAILERSEND_API_KEY
- MAILERSEND_FROM_EMAIL
- MAILERSEND_FROM_NAME
- Sanitizar HTML do site pessoal
- Validar MIME type e extensão no upload
- Logs sem conteúdo de documentos
- Rate limit por IP em /submit
- Logs estruturados por job_id
- Eventos por etapa persistidos
- Métricas básicas, contagem por status e duração por etapa
- Submeter URL Lattes e receber e-mail com
sumula.mdcom as seis seções (FAPESP) - Submeter Lattes XLSX e receber e mail com
sumula.mdcom as seis seções (FAPESP) - Seção vazia vira “NADA A DECLARAR” (FAPESP)
- 6.a 6.b 6.c presentes em Outras Informações Relevantes (FAPESP)
- Processamento assíncrono com status page
- LLM opera apenas sobre TXT curado
- Você gera somente Markdown.
- Você usa somente o TXT curado fornecido.
- Se não houver evidência, escreva “NADA A DECLARAR” na seção aplicável.
- Preserve a estrutura FAPESP com seções 1 a 6 e subitens 1.1 e 6.a 6.b 6.c. (FAPESP)
- Não incluir HTML
- Não incluir links não informados no TXT curado
- Não inventar números de indicadores
- Não criar seções fora do template