jonmatumalpha
conceptosnotasexperimentosensayos

© 2026 Jonatan Mata · alpha · v0.1.0

Experimentos

Agente de Contenido con Strands y Bedrock

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.

evergreen#strands-agents#bedrock#claude#github-actions#terraform#oidc#automation#content-pipeline#python#multi-agent

¿Qué es?

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.

Arquitectura del sistema

Loading diagram...

Los tres agentes

QA Agent — auditor determinístico

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):

  • Conteo de palabras (700+ para conceptos evergreen)
  • Conteo de referencias (5+) y diversidad de tiers (2+)
  • Cross-references (3+) y cross-refs rotos
  • Secciones requeridas (¿Por qué importa?)
  • Accesibilidad en diagramas mermaid (accTitle, accDescr)
  • Encabezados en inglés dentro de archivos en español
  • Links externos que deberían ser internos (/concepts/slug)
  • Stubs placeholder en archivos .en.mdx

Revisión profunda (--deep, usa Bedrock):

  • Texto de relleno (frases genéricas intercambiables)
  • Afirmaciones sin fuente (estadísticas, precios, fechas)
  • Secciones débiles que repiten la definición
  • «¿Por qué importa?» genérico sin tradeoffs específicos
  • Pseudocódigo en lugar de ejemplos ejecutables
  • Tablas comparativas con categorías abstractas
# 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 issue

QA Fix Agent — correcciones quirúrgicas

El 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:

HallazgoEstrategia
refs — faltan referenciasBuscar fuente primaria, agregar a ES + EN, verificar URL
ref_tiers — poca diversidadIdentificar tier faltante, agregar referencia de ese tier
xrefs — pocas cross-refsLeer contenido, encontrar conceptos relacionados, agregar a frontmatter
broken_xref — ref rotaEliminar slug inexistente o reemplazar con uno válido
heading — encabezado en inglésTraducir al español manteniendo el nivel de heading
ext_link — link externoReemplazar URL externa con /concepts/slug en ES + EN
missing_section — sección faltanteAgregar sección con contenido substantivo
mermaid — sin accesibilidadAgregar 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 LLM

Content Agent — upgrades completos

El 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 LLM

Herramientas compartidas

Los 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 frontmatter

Patrón diamante en GitHub Actions

Los tres workflows usan el mismo patrón de ejecución — un «diamante» que descubre trabajo, lo distribuye en paralelo y consolida resultados:

Loading diagram...

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.

Gestión de límites de tasa

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.

Timeouts ajustados

WorkflowPlanTrabajoSummary
Content Agent3 min15 min2 min
QA Fix Agent3 min10 min2 min
QA Audit3 min5 min2 min

Autenticación sin secrets estáticos

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.

Resultados medidos

Datos de las ejecuciones del sistema:

MétricaValor
Conceptos auditados por ciclo QA40 evergreen
Hallazgos típicos por auditoría5-8 conceptos
Tiempo por auditoría estructuralMenos 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)

Lecciones aprendidas

  • OIDC elimina la gestión de credenciales: la integración GitHub Actions → AWS con OIDC se configura en 20 líneas de Terraform. Sin rotación, sin filtración.
  • El system prompt es el control de calidad: las reglas del AGENTS.md se inyectan como system prompt — el agente sigue estructura, idioma y estándares sin lógica adicional.
  • Validación post-generación es obligatoria: sin pnpm validate + pnpm lint:content después de escribir, el agente genera frontmatter con campos faltantes o contenido que no pasa el linter.
  • Serializar evita throttling: max-parallel: 1 en workflows con LLM elimina el problema de rate limits de Bedrock sin gastar minutos de CI en retries.
  • Agentes especializados superan a uno genérico: separar auditoría (determinística, sin costo), corrección (quirúrgica, barata) y upgrade (completo, más caro) permite optimizar costo y calidad por tipo de tarea.
  • MDX y angle brackets no se mezclan: <50% o <10 en contenido MDX se parsea como JSX. Los agentes deben usar prosa: «menos de 50%», «más de 10».
  • El modelo de herramientas de Strands simplifica la integración: definir @tool con docstrings genera automáticamente el esquema para el modelo — sin JSON Schema manual.

¿Por qué importa?

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.

Referencias

  • Strands Agents — Amazon Bedrock — Strands, 2025. Integración de Strands con Bedrock.
  • Strands Agents — Custom Tools — Strands, 2025. Definición de herramientas personalizadas con @tool.
  • Amazon Bedrock Documentation — AWS, 2025. Documentación oficial del servicio.
  • GitHub OIDC with AWS — GitHub, 2025. Configuración de OIDC para GitHub Actions con AWS.
  • Terraform AWS IAM OIDC Provider — HashiCorp, 2025. Recurso Terraform para OIDC.
  • GitHub Actions — Using a matrix for your jobs — GitHub, 2025. Documentación de estrategia matrix en workflows.

Contenido relacionado

  • Strands Agents

    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.

  • Agentes de IA

    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.

  • GitHub Actions

    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.

  • CI/CD

    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.

  • Infrastructure as Code

    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.

  • Terraform

    Herramienta de Infrastructure as Code de HashiCorp que permite definir, provisionar y gestionar infraestructura multi-cloud mediante archivos declarativos en HCL.

  • Sistemas Multi-Agente

    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.

  • Flujos de Trabajo Agénticos

    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.

Experimentos