inemaSEO 5 — Con Agentes: Claude Code y Codex haciendo el trabajo repetitivo|INEMA.CLUB-PRO

Clase 3 · 18 min

Extracción por la suscripción y el control que descarta

Ficha de catálogo, cuerpo de noticia, resumen de página: el agente escribe a partir de una fuente, en lote. El riesgo es que adorne e invente. Aquí llamas al modelo por la suscripción, en modo de solo lectura, lees el primer JSON de la respuesta y lo pasas todo por un control que descarta el ítem inventado.

Comenzar la lección
Técnica de control de calidad separa muestras en dos bandejas de acero, comparando cada una con una ficha de referencia.

En esta lección vas a

  1. 1La llamada del Codex en modo de solo lectura, sin API
  2. 2Por qué leer solo el primer JSON de la respuesta
  3. 3El control: título, palabras y números en la fuente
  4. 4Descartar no es perder: es lo que mantiene limpio el lote

Objetivo: llamar al Codex o a Claude por la suscripción para extraer de una fuente y descartar, sin arreglar, el ítem que falla en el control.

01De la fuente al ítem que puede salir al aire

Toca cada bloque.

Haz clic en cada bloque del diagrama para ver qué hace.

El modelo puede reescribir y organizar; el control garantiza que no creó hechos.

02Cómo lo hace INEMA en lote

Toca cada paso.

1. La llamada

El generador de textos de noticias de INEMA llama al Codex con el pedido por la entrada estándar, sandbox de solo lectura, sesión efímera y salida en un archivo. Cierra la entrada después de mandar el pedido: sin eso el proceso se queda esperando.

En Claude Code, el mismo pedido corre en la carpeta del proyecto, con el AGENTS.md prohibiendo escribir fuera de la carpeta de salida.

03La llamada, el primer JSON y el control en el lote

pedido.txt = prompt extractivo (curso 2, clase 5) + el texto de la fuente. valida-ficha.mjs es un modelo que usa la biblioteca de validar_extracao.mjs.

Llamar a Codex por la suscripción (solo lectura)
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)
// pasa cada ítem de la ficha por el control (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 (del generador de textos de 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')
}
Ejemplo del repositorio
$ 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)

Fragmento. La fuente era la página de ejemplo de un curso de cerámica de torno, con 4 módulos y "8 encuentros de 3 horas".

04Práctica: una extracción con control

Elige un ítem de tu sitio que tenga página propia con texto.

E1 · Extraer por la suscripción

30 min

Guarda el texto de la página en fonte.txt, arma el pedido.txt con el prompt extractivo y ejecuta la llamada de Codex (o el mismo pedido en Claude Code). Repite con un pedido libre, "de forma atractiva", para comparar.

Listo cuando: tienes saida.txt y saida-livre.txt, las dos en JSON, y no se usó ninguna clave de API.

E2 · Ejecutar el control

20 min

Copia validar_extracao.mjs y valida-ficha.mjs a la carpeta y ejecútalos en las dos salidas. Anota qué se descartó y por qué.

Listo cuando: una anotación lista cada ítem descartado con el motivo (título, palabras o número fuera de la fuente), y solo la ficha con 3 o más módulos válidos está marcada para publicar.

05Prueba lo que aprendiste

La explicación aparece después de tu respuesta.

Pregunta 1 de 4

¿Para qué sirve la opción de sandbox de solo lectura en la llamada de Codex?competencia

06Para llevar

Por la suscripción, solo lecturacodex exec con sandbox read-only, sesión efímera y salida en un archivo.
Primer JSONUna respuesta torcida no puede derribar todo el lote.
Descarta, no arreglaTítulo, palabras y números verificados en la fuente; lo reprobado se descarta.
La vara de 2026El contenido no commodity viene del dato propio de la página real, no de un texto más "atractivo".

Para ir más allá

Clase anteriorSiguiente clase