Anthropic acaba de publicar un PDF de 13 páginas sobre memoria para agentes de IA
5 capas para reducir un 90% el coste en tokens y hacer que tu agente aprenda de verdad// un nodo con contrato real: entrada acotada, salida validada, un solo trabajo
const ITEM = {
type: 'object',
additionalProperties: false,
properties: {
titulo: { type: 'string' },
url: { type: 'string' },
impacto: { type: 'string', enum: ['alto', 'medio', 'bajo'] },
},
required: ['titulo', 'url', 'impacto'],
};
const salida = await agent(fuente.prompt, {
label: `research:${fuente.key}`,
schema: ITEM,
agentType: 'general-purpose',
});phase('Research');
const bruto = await parallel(
FUENTES.map((f) => () =>
agent(f.prompt, {
label: `research:${f.key}`,
phase: 'Research',
schema: ITEM,
agentType: 'general-purpose',
}),
),
);
const recogido = bruto.filter(Boolean); // fuera los null de los agentes caídos// la arista: JS plano, sin agente, cero tokens
const plano = recogido.flatMap((c) => c.items);
log(`Recogidos ${plano.length} elementos`);
phase('Curar');
// el nodo barrera: necesita el conjunto ENTERO para deduplicar y ordenar
const curado = await agent(
`Deduplica y ordena estos por impacto:\n${JSON.stringify(plano)}`,
{ phase: 'Curar', schema: CURADO },
);// nodo router: un agente clasifica, el código elige la arista
const { severidad } = await agent(
`Clasifica el riesgo de este diff:\n${diff}`,
{ schema: {
type: 'object',
properties: { severidad: { enum: ['baja', 'alta'] } },
required: ['severidad'],
}},
);
let revision;
if (severidad === 'alta') {
revision = await parallel(ARCHIVOS.map((a) => () => agent(`Audita ${a}`)));
} else {
revision = await agent(`Revisión rápida de ${diff}`);
}const visto = new Set();
const confirmados = [];
let secas = 0;
while (secas < 2) { // para tras 2 rondas vacías
const encontrados = (await parallel(
BUSCADORES.map((b) => () => agent(b.prompt, { schema: BUGS }))
)).filter(Boolean).flatMap((r) => r.bugs);
const nuevos = encontrados.filter((b) => !visto.has(clave(b)));
if (!nuevos.length) { secas++; continue; } // nada nuevo → hacia seco
secas = 0;
nuevos.forEach((b) => visto.add(clave(b))); // dedupe vs VISTO, no confirmados
const juzgados = await parallel(nuevos.map((b) => () =>
parallel(['correcto', 'seguridad', 'repro'].map((lente) => () =>
agent(`Juzga "${b.desc}" desde ${lente}. ¿Es real?`, { schema: VEREDICTO })))
.then((v) => ({ b, real: v.filter(Boolean).filter((x) => x.real).length >= 2 }))
));
confirmados.push(...juzgados.filter((v) => v.real).map((v) => v.b));
}