inemaSEO 5 — Com Agentes: Claude Code e Codex fazendo o trabalho repetitivo|INEMA.CLUB-PRO

Aula 3 · 18 min

Extração pela assinatura e a trava que descarta

Ficha de catálogo, corpo de notícia, resumo de página: o agente escreve a partir de uma fonte, em lote. O risco é ele enfeitar e inventar. Aqui você chama o modelo pela assinatura, em modo só de leitura, lê o primeiro JSON da resposta e passa tudo por uma trava que descarta o item inventado.

Começar a aula
Técnica de controle de qualidade separa amostras em duas bandejas de aço, comparando cada uma com uma ficha de referência.

Nesta aula você vai

  1. 1A chamada do Codex em modo só de leitura, sem API
  2. 2Por que ler só o primeiro JSON da resposta
  3. 3A trava: título, palavras e números na fonte
  4. 4Descartar não é perder: é o que mantém o lote limpo

Objetivo: chamar o Codex ou o Claude pela assinatura para extrair de uma fonte e descartar, sem consertar, o item que falha na trava.

01Da fonte ao item que pode ir ao ar

Clique em cada bloco.

Clique em cada bloco do diagrama para ver o que ele faz.

O modelo pode reescrever e organizar; a trava garante que ele não criou fatos.

02Como o INEMA faz em lote

Clique em cada passo.

1. A chamada

O gerador de textos de notícias do INEMA chama o Codex com o pedido pela entrada padrão, sandbox só de leitura, sessão efêmera e saída num arquivo. Feche a entrada depois de mandar o pedido: sem isso o processo fica esperando.

No Claude Code, o mesmo pedido roda na pasta do projeto, com o AGENTS.md proibindo escrita fora da pasta de saída.

03A chamada, o primeiro JSON e a trava no lote

pedido.txt = prompt extrativo (curso 2, aula 5) + o texto da fonte. valida-ficha.mjs é um modelo que usa a biblioteca do validar_extracao.mjs.

Chamar o Codex pela assinatura (só leitura)
codex exec --skip-git-repo-check --ephemeral --sandbox read-only -C "$PWD" -o saida.txt - < pedido.txt
node valida-ficha.mjs fonte.txt saida.txt
valida-ficha.mjs (modelo)
// passa cada item da ficha pela trava (usa validar_extracao.mjs como biblioteca)
import fs from 'node:fs'
import { apoiada, numerosNaFonte, tituloNaFonte } from './validar_extracao.mjs'
const [fonteArq, fichaArq] = process.argv.slice(2)
const fonte = fs.readFileSync(fonteArq, 'utf8')
const ficha = JSON.parse(fs.readFileSync(fichaArq, 'utf8'))
let validos = 0
for (const m of ficha.estrutura || []) {
  const ok = tituloNaFonte(m.titulo, fonte) && numerosNaFonte(m.detalhe || '', fonte)
  console.log(`${ok ? '✓' : '✗ descarta'}  módulo: ${m.titulo}`)
  if (ok) validos++
}
for (const campo of ['aprende', 'publico', 'constroi']) {
  for (const f of ficha[campo] || []) {
    const ok = apoiada(f, fonte) && numerosNaFonte(f, fonte)
    console.log(`${ok ? '✓' : '✗ descarta'}  ${campo}: ${f}`)
  }
}
console.log(validos >= 3 ? `ficha enriquecida (${validos} módulos válidos)` : `não publica como enriquecida (${validos} módulos válidos)`)
primeiroJson (do gerador de textos do INEMA)
function primeiroJson(txt) {
  const ini = txt.indexOf('{')
  let prof = 0, str = false, esc = false
  for (let i = ini; i < txt.length; i++) {
    const c = txt[i]
    if (str) { if (esc) esc = false; else if (c === '\\') esc = true; else if (c === '"') str = false; continue }
    if (c === '"') str = true
    else if (c === '{') prof++
    else if (c === '}' && --prof === 0) return JSON.parse(txt.slice(ini, i + 1))
  }
  throw new Error('JSON incompleto')
}
Exemplo do repositório
$ node valida-ficha.mjs fonte.txt saida.txt
✓  módulo: Módulo 1: Preparar o barro
✓  módulo: Módulo 2: Centralizar no torno
✓  módulo: Módulo 3: Abrir e levantar a peça
✓  módulo: Módulo 4: Acabamento e secagem
✓  aprende: Amassar, tirar o ar e pesar as bolas de argila.
✓  publico: quem nunca sentou num torno e quer fazer as primeiras peças utilitárias.
✓  constroi: copos e tigelas simples, prontos para esmaltar.
ficha enriquecida (4 módulos válidos)

Trecho. A fonte era a página de exemplo de um curso de cerâmica de torno, com 4 módulos e "8 encontros de 3 horas".

04Prática: uma extração com trava

Escolha um item do seu site que tem página própria com texto.

E1 · Extrair pela assinatura

30 min

Salve o texto da página em fonte.txt, monte o pedido.txt com o prompt extrativo e rode a chamada do Codex (ou o mesmo pedido no Claude Code). Repita com um pedido livre, "de forma atraente", para comparar.

Pronto quando: você tem saida.txt e saida-livre.txt, as duas em JSON, e nenhuma chave de API foi usada.

E2 · Rodar a trava

20 min

Copie o validar_extracao.mjs e o valida-ficha.mjs para a pasta e rode nas duas saídas. Anote o que foi descartado e por quê.

Pronto quando: uma anotação lista cada item descartado com o motivo (título, palavras ou número fora da fonte), e só a ficha com 3 ou mais módulos válidos está marcada para publicar.

05Teste o que aprendeu

A explicação aparece depois da sua resposta.

Pergunta 1 de 4

Para que serve a opção de sandbox só de leitura na chamada do Codex?competência

06Para levar

Assinatura, só leituracodex exec com sandbox read-only, sessão efêmera e saída num arquivo.
Primeiro JSONUma resposta torta não pode derrubar o lote inteiro.
Descarta, não consertaTítulo, palavras e números conferidos na fonte; o reprovado sai.
Régua de 2026Conteúdo não-commodity vem do dado próprio da página real, não de um texto mais "atraente".

Para ir além

Aula anteriorPróxima aula