Sistema de tres agentes que automatiza el ciclo de vida de contenido MDX bilingüe: auditoría QA determinística, correcciones quirúrgicas y upgrades completos — todo orquestado con Strands Agents, Claude Sonnet 4 en Amazon Bedrock y GitHub Actions con patrón diamante.
Un sistema de tres agentes de IA que automatiza el ciclo de vida completo de contenido en una base de conocimiento bilingüe (español/inglés). Los agentes corren en GitHub Actions, usan Strands Agents como framework de orquestación y Claude Sonnet 4 en Amazon Bedrock como modelo de lenguaje.
El sistema implementa un bucle de retroalimentación continuo: un agente QA audita el contenido y abre issues → un agente de corrección aplica fixes quirúrgicos → un agente de contenido genera upgrades completos → un humano revisa y aprueba los PRs.
El agente QA (agents/qa_agent.py) ejecuta verificaciones estructurales sin LLM y opcionalmente una revisión profunda con Claude. No modifica archivos — solo abre issues.
Verificaciones estructurales (sin LLM, sin costo):
¿Por qué importa?)accTitle, accDescr)/concepts/slug).en.mdxRevisión profunda (--deep, usa Bedrock):
# Ejecución local
python -m agents.qa_agent --dry-run --status evergreen # auditoría sin crear issues
python -m agents.qa_agent --deep --slug serverless # revisión LLM de un concepto
python -m agents.qa_agent --discover # matriz JSON para CI
python -m agents.qa_agent --single git # auditar uno + crear issueEl agente de corrección (agents/qa_fix_agent.py) procesa issues QA con cambios mínimos. No reescribe contenido — solo corrige lo que el issue describe.
Estrategias de corrección por tipo de hallazgo:
| Hallazgo | Estrategia |
|---|---|
refs — faltan referencias | Buscar fuente primaria, agregar a ES + EN, verificar URL |
ref_tiers — poca diversidad | Identificar tier faltante, agregar referencia de ese tier |
xrefs — pocas cross-refs | Leer contenido, encontrar conceptos relacionados, agregar a frontmatter |
broken_xref — ref rota | Eliminar slug inexistente o reemplazar con uno válido |
heading — encabezado en inglés | Traducir al español manteniendo el nivel de heading |
ext_link — link externo | Reemplazar URL externa con /concepts/slug en ES + EN |
missing_section — sección faltante | Agregar sección con contenido substantivo |
mermaid — sin accesibilidad | Agregar accTitle: y accDescr: al diagrama |
python -m agents.qa_fix_agent --issue 175 # corregir un issue QA
python -m agents.qa_fix_agent --batch 5 # corregir 5 issues
python -m agents.qa_fix_agent --dry-run # probar sin LLMEl agente de contenido (agents/content_agent.py) genera reescrituras completas para llevar contenido de seed/growing a evergreen. Procesa issues upgrade: y qa:.
python -m agents.content_agent --issue 143 # procesar un issue
python -m agents.content_agent --batch 3 # procesar 3 issues
python -m agents.content_agent --dry-run # probar sin LLMLos tres agentes comparten cuatro herramientas definidas con el decorador @tool de Strands:
from strands import Agent, tool
from strands.models import BedrockModel
@tool
def verify_url(url: str) -> str:
"""Verifica que una URL retorne HTTP 200."""
r = httpx.head(url, follow_redirects=True, timeout=10)
return f"{url} → HTTP {r.status_code}"
@tool
def read_file(path: str) -> str:
"""Lee un archivo del repositorio."""
with open(os.path.join(os.environ["REPO_ROOT"], path)) as f:
return f.read()
@tool
def write_file(path: str, content: str) -> str:
"""Escribe contenido a un archivo."""
with open(os.path.join(os.environ["REPO_ROOT"], path), "w") as f:
f.write(content)
return f"Written: {path}"
@tool
def list_concept_files() -> str:
"""Lista conceptos existentes para cross-references."""
# retorna slugs disponibles para el array concepts: del frontmatterLos tres workflows usan el mismo patrón de ejecución — un «diamante» que descubre trabajo, lo distribuye en paralelo y consolida resultados:
Plan — descubre qué procesar (issues abiertos o conceptos con hallazgos), genera una matriz JSON.
Matrix — cada item se procesa en un job aislado. Si uno falla, los demás continúan (fail-fast: false).
Summary — descarga artefactos de todos los jobs, escribe un resumen en el job summary de GitHub.
Los workflows que usan LLM (content agent, QA fix agent) serializan los jobs de la matriz (max-parallel: 1) para evitar throttling de Bedrock. El QA agent estructural — que no usa LLM — mantiene paralelismo alto (max-parallel: 5). El QA agent en modo deep serializa a 1.
# content-agent.yml — serializado para evitar throttling
strategy:
fail-fast: false
max-parallel: 1
matrix: ${{ fromJson(needs.plan.outputs.matrix) }}
# content-qa.yml — dinámico según modo
strategy:
fail-fast: false
max-parallel: ${{ inputs.deep == true && 1 || 5 }}
matrix: ${{ fromJson(needs.plan.outputs.matrix) }}Como respaldo, los agentes incluyen un retry con backoff corto (1 intento, 10 segundos) que falla rápido para no consumir minutos de CI innecesariamente.
| Workflow | Plan | Trabajo | Summary |
|---|---|---|---|
| Content Agent | 3 min | 15 min | 2 min |
| QA Fix Agent | 3 min | 10 min | 2 min |
| QA Audit | 3 min | 5 min | 2 min |
La autenticación usa OIDC — GitHub Actions obtiene un token JWT efímero que intercambia por credenciales temporales de AWS:
resource "aws_iam_role" "content_agent" {
name = "jonmatum-content-agent"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Principal = { Federated = aws_iam_openid_connect_provider.github.arn }
Action = "sts:AssumeRoleWithWebIdentity"
Condition = {
StringEquals = {
"token.actions.githubusercontent.com:aud" = "sts.amazonaws.com"
}
StringLike = {
"token.actions.githubusercontent.com:sub" = "repo:jonmatum/jonmatum.com:*"
}
}
}]
})
}
resource "aws_iam_role_policy" "bedrock_invoke" {
role = aws_iam_role.content_agent.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Action = ["bedrock:InvokeModel", "bedrock:InvokeModelWithResponseStream"]
Resource = [
"arn:aws:bedrock:*::foundation-model/anthropic.claude-sonnet-4-*",
"arn:aws:bedrock:*:*:inference-profile/us.anthropic.claude-sonnet-4-*"
]
}]
})
}Sin API keys almacenadas, sin rotación de credenciales, sin riesgo de filtración. El rol solo permite InvokeModel en Bedrock.
Datos de las ejecuciones del sistema:
| Métrica | Valor |
|---|---|
| Conceptos auditados por ciclo QA | 40 evergreen |
| Hallazgos típicos por auditoría | 5-8 conceptos |
| Tiempo por auditoría estructural | Menos de 2 min (sin LLM) |
| Tiempo por revisión deep (LLM) | ~1 min por concepto |
| Tiempo por upgrade completo | ~5 min por concepto |
| Tiempo por fix quirúrgico | ~2 min por concepto |
| Costo por upgrade (Sonnet 4) | ~$0.10-0.15 |
| Costo por fix quirúrgico | ~$0.03-0.05 |
| Costo por revisión deep | ~$0.05 |
| Tasa de validación exitosa | ~85% (el 15% falla en lint y se descarta) |
pnpm validate + pnpm lint:content después de escribir, el agente genera frontmatter con campos faltantes o contenido que no pasa el linter.max-parallel: 1 en workflows con LLM elimina el problema de rate limits de Bedrock sin gastar minutos de CI en retries.<50% o <10 en contenido MDX se parsea como JSX. Los agentes deben usar prosa: «menos de 50%», «más de 10».@tool con docstrings genera automáticamente el esquema para el modelo — sin JSON Schema manual.Este sistema demuestra que un conjunto de agentes especializados con herramientas simples (lectura/escritura de archivos, verificación HTTP) puede mantener una base de conocimiento de forma autónoma. El patrón es replicable: cualquier repositorio con contenido estructurado y reglas de calidad documentadas puede implementar el mismo bucle — auditar, corregir, mejorar, revisar. El humano pasa de escritor a editor: revisa PRs en lugar de escribir contenido desde cero.
@tool.SDK open source de AWS para construir agentes de IA con un enfoque model-driven. Agentes funcionales en pocas líneas de código, con soporte multi-modelo, herramientas personalizadas, MCP, multi-agente y observabilidad integrada.
Sistemas autónomos que combinan modelos de lenguaje con razonamiento, memoria y uso de herramientas para ejecutar tareas complejas de múltiples pasos con mínima intervención humana.
Plataforma de CI/CD nativa de GitHub. Workflows declarativos en YAML que automatizan build, test, deploy y cualquier tarea del ciclo de desarrollo — directamente desde el repositorio.
Continuous Integration y Continuous Delivery/Deployment — prácticas que automatizan la integración de código, testing y entrega a producción. Fundamento de la ingeniería de software moderna.
Práctica de definir y gestionar infraestructura mediante archivos de configuración versionados en lugar de procesos manuales. Fundamento de la automatización moderna de operaciones.
Herramienta de Infrastructure as Code de HashiCorp que permite definir, provisionar y gestionar infraestructura multi-cloud mediante archivos declarativos en HCL.
Arquitecturas donde múltiples agentes de IA especializados colaboran, compiten o se coordinan para resolver problemas complejos que exceden la capacidad de un solo agente.
Patrones de diseño donde agentes de IA ejecutan tareas complejas de múltiples pasos de forma autónoma, combinando razonamiento, uso de herramientas y toma de decisiones iterativa.