Production Stack: Cómo construir sistemas de agentes confiables

Production Stack combina Runtime, tools, memory, policy, HITL, containerization y límites multi-tenant en un sistema gobernado.
En esta página
  1. La idea en 30 segundos
  2. Problema
  3. Solución
  4. Cómo funciona Production Stack
  5. En código se ve así
  6. Cómo se ve durante la ejecución
  7. Cuándo encaja y cuándo no
  8. Encaja
  9. No encaja
  10. Problemas y fallos típicos
  11. Cómo se combina con otros patrones
  12. En resumen
  13. FAQ
  14. Qué sigue

La idea en 30 segundos

Production Stack no es un solo componente, sino un conjunto coordinado de capas arquitectónicas que, juntas, hacen que un sistema de agentes sea gobernable en producción.

Esto no es "más prompts". Son límites explícitos de responsabilidad:

  • quién toma decisiones;
  • quién permite o bloquea una acción;
  • dónde se almacena el estado;
  • cómo se controlan riesgos, presupuestos y fallos.

Cuándo se necesita: cuando el agente debe funcionar por largo tiempo, ejecutar acciones que cambian estado, atender muchos clientes y mantenerse predecible bajo carga.

El LLM propone el siguiente paso, pero Production Stack decide si ese paso se puede ejecutar, dónde se ejecuta y cómo detener el proceso de forma segura.


Problema

Si construyes un agente como "modelo + algunos tool calls", el sistema se vuelve frágil muy rápido.

Consecuencias típicas:

  • no hay stop conditions claras, así que el agente se queda en bucles;
  • no hay límites de policy, así que acciones riesgosas pasan sin control;
  • no hay calidad de memoria, así que aparecen duplicados, ruido o personalización incorrecta;
  • no hay aislamiento tenant, así que crece el riesgo de fugas cross-tenant;
  • no hay disciplina operativa, así que rollout, rollback y respuesta a incidentes se vuelven caóticos;
  • no hay auditoría end-to-end, así que tras un fallo es difícil explicar qué pasó.

En producción, esto normalmente significa incidentes de seguridad, sobrecostes y calidad inestable de respuestas.

Solución

Agregar Production Stack como un esquema arquitectónico explícito donde cada capa tiene un contrato claro y su propia zona de responsabilidad.

Composición típica del stack:

  1. Ingress + Auth (resolver actor/tenant);
  2. Orchestration Topology (route, handoff, stop);
  3. Agent Runtime (steps, límites, reason_code);
  4. Tool Execution Layer (validación y control de side effects, es decir cambios de estado);
  5. Memory Layer (lectura/escritura de memoria gobernada);
  6. Policy Boundaries + Human-in-the-Loop (permitir, bloquear, aprobar);
  7. Containerization + Observability + Operations (ejecución reproducible, health checks, rollback);
  8. Multi-Tenant Isolation (aislamiento de contexto, accesos y recursos).

Analogía: como un aeropuerto moderno.

Tiene check-in, control de seguridad, enrutamiento, despacho, registro de eventos y procedimientos de emergencia.

Production Stack convierte igual "un módulo inteligente" en un sistema gobernado con reglas de ejecución.

Cómo funciona Production Stack

Production Stack conecta todos los límites clave en un ciclo gobernado: desde la solicitud de entrada hasta la ejecución controlada, auditoría y recuperación.

Diagram
Resumen del flujo completo: Identify → Plan → Decide → Gate → Execute → Learn → Observe → Recover

Identify
Ingress resuelve actor, tenant, request_id y límites iniciales.

Plan
Orchestration Topology elige la ruta de la tarea: un agente, varios agentes o pipeline.

Decide
Agent Runtime forma el siguiente paso considerando el estado actual y la memoria.

Gate
Policy/HITL evalúa riesgo, allowlist, scopes, presupuesto y decide: allow, require_approval, deny.

Execute
Tool Execution Layer valida argumentos, ejecuta la acción y devuelve un resultado normalizado.

Learn
Memory Layer guarda solo hechos útiles y seguros con TTL, sin acumular ruido.

Observe
Trace y auditoría registran decisiones, reason_code, contexto y resultado de ejecución o bloqueo.

Recover
La capa Container/Ops proporciona health checks, rollback, kill switch y restart controlado.

Este ciclo elimina la "magia" del sistema de agentes y lo vuelve predecible bajo carga real.

En código se ve así

PYTHON
class ProductionStack:
    def __init__(self, ingress, topology, runtime, memory, policy, hitl, tools, audit):
        self.ingress = ingress
        self.topology = topology
        self.runtime = runtime
        self.memory = memory
        self.policy = policy
        self.hitl = hitl
        self.tools = tools
        self.audit = audit

    def run(self, request, auth_token):
        ctx = self.ingress.identify(request=request, auth_token=auth_token)
        if not ctx.get("ok", False):
            return {"ok": False, "reason_code": ctx.get("reason_code", "auth_failed")}

        state = self.runtime.start(
            request=request,
            tenant_id=ctx["tenant_id"],
            budgets=ctx["budgets"],
        )

        while not self.runtime.should_stop(state):
            route = self.topology.next_step(state=state)
            route_mode = route.get("mode")

            if route_mode == "finish":
                return {
                    "ok": True,
                    "result": route.get("final_answer", ""),
                    "reason_code": "completed",
                }
            if route_mode != "action":
                return {"ok": False, "reason_code": "unknown_route_mode"}

            memory_items = self.memory.retrieve(
                tenant_id=ctx["tenant_id"],
                query=route["query"],
                top_k=4,
                min_score=0.7,
                exclude_expired=True,
            )

            action = self.runtime.decide(route=route, memory_items=memory_items)
            decision = self.policy.check(action=action, context=ctx)
            mode = decision.get("mode")

            if mode == "deny":
                self.audit.log(context=ctx, action=action, outcome="blocked", reason_code=decision.get("reason_code", "policy_denied"))
                return {"ok": False, "reason_code": decision.get("reason_code", "policy_denied")}
            elif mode == "require_approval":
                approval = self.hitl.review(action=action, context=ctx)
                if not approval.get("approved", False):
                    reason = approval.get("reason_code", "approval_rejected")
                    self.audit.log(context=ctx, action=action, outcome="blocked", reason_code=reason)
                    return {"ok": False, "reason_code": reason}
                action = approval.get("action_override", action)
            elif mode != "allow":
                reason = decision.get("reason_code", "policy_mode_invalid")
                self.audit.log(context=ctx, action=action, outcome="blocked", reason_code=reason)
                return {"ok": False, "reason_code": reason}

            result = self.tools.execute(action=action, context=ctx)
            self.audit.log(
                context=ctx,
                action=action,
                outcome="executed" if result.get("ok", False) else "failed",
                reason_code=result.get("reason_code", "tool_unknown"),
            )

            self.runtime.observe(state=state, action=action, result=result)
            self.memory.write_if_useful(
                tenant_id=ctx["tenant_id"],
                state=state,
                result=result,
            )

        return {"ok": False, "reason_code": self.runtime.stop_reason(state)}

Cómo se ve durante la ejecución

TEXT
Solicitud: "Prepara una propuesta comercial, alinea los puntos de riesgo y envía la versión final al cliente"

Step 1
Ingress + Auth: resuelve actor, tenant, budgets y request_id
Orchestration Topology: divide la tarea en etapas "recopilar", "borrador", "finalizar"

Step 2
Agent Runtime: forma action
Policy + HITL: activa require_approval para el envío al cliente
Human aprueba la versión final

Step 3
Tool Execution Layer: ejecuta la acción aprobada
Memory Layer: guarda hechos importantes con TTL
Audit + Trace: registra decision, reason_code, outcome

Production Stack no reemplaza patrones individuales. Los conecta en un sistema de producción gobernado.

Cuándo encaja y cuándo no

Production Stack se necesita donde el agente debe funcionar como servicio, no como script demo de una sola vez.

Encaja

SituaciónPor qué Production Stack encaja
El agente ejecuta acciones que cambian estado en sistemas externosEl stack añade compuertas policy/HITL, control de side effects y auditoría.
El servicio trabaja con varios clientes y distintos permisos de accesoLímites multi-tenant, scoped credentials y límites por tenant reducen el riesgo de fugas.
Se requiere previsibilidad, SLO y postmortem claro tras fallosStop reasons explícitos, trace y reglas operativas hacen controlables los fallos.

No encaja

SituaciónPor qué Production Stack no encaja
Demo one-shot de solo lectura con una herramienta seguraEl stack completo añade complejidad que no compensa en esta fase.
Prototipo interno corto sin requisitos de compliance, auditoría ni SLAAl inicio suele bastar Runtime + límites básicos, y luego añadir el resto de capas por etapas.

Para un prototipo mínimo, a veces basta una ejecución simple:

PYTHON
result = runtime.run(task=request["text"], max_steps=8, max_seconds=20)

Problemas y fallos típicos

ProblemaQué ocurreCómo prevenirlo
Límites de capas poco clarosLa lógica de policy, memory y runtime se mezcla en un solo lugarContratos explícitos entre capas: quién decide, quién ejecuta, quién registra
Sin límites globalesEl agente gasta tokens, pasos o presupuesto de másLímites duros de steps/time/cost y stop_reason estandarizado
Contexto de policy débilEl policy check decide sin actor/tenant/scopesPasar contexto completo: actor, tenant, resource, risk, budget
Baja calidad de memoriaEl agente personaliza la respuesta con hechos obsoletos o débilesReglas de calidad de memoria: relevance, freshness, source, sensitivity, TTL
Aislamiento tenant débilCache, memoria o credentials se mezclan entre clientesNamespace tenant-scoped, claves de acceso y presupuestos por tenant
Inestabilidad operativaTras el deploy cambia el comportamiento por image mutable o dependencias sin pinningImmutable images, pinned dependencies, health checks, canary y rollback rápido

La mayoría de problemas de producción no ocurre por un único "error del modelo", sino por límites débiles entre capas arquitectónicas.

Cómo se combina con otros patrones

Production Stack no compite con otros patrones. Los integra en un sistema coherente.

En otras palabras:

  • Production Stack define cómo todas estas capas trabajan juntas como un solo sistema
  • Cada patrón individual cubre su tipo específico de riesgo

En resumen

En resumen

Production Stack:

  • transforma un agente de demo en un sistema de producción gobernado
  • separa responsabilidades entre Runtime, policy, tools, memory y ops
  • añade control de riesgo con presupuestos, compuertas de aprobación y auditoría
  • hace predecible el comportamiento del agente bajo carga

FAQ

Q: ¿Por dónde empezar si no hay recursos para todo el stack de una vez?
A: Empieza por Runtime (límites + stop reasons), Tool Execution Layer (validación + timeout) y auditoría. Luego añade por fases policy/HITL, calidad de memoria y aislamiento multi-tenant.

Q: ¿Se puede tener Production Stack con un solo agente, sin topología multi-agent?
A: Sí. La topología puede ser simple, pero las demás capas siguen siendo necesarias si hay acciones riesgosas o carga de producción.

Q: ¿Production Stack reemplaza observability o prácticas SRE?
A: No. Las incluye como parte de la arquitectura, pero sigue requiriendo disciplina operativa: monitoreo, alertas, rollout e incident response.

Q: ¿Qué se rompe primero cuando el stack está incompleto?
A: Lo más frecuente es que se rompan los límites de ejecución: tool calls no controlados, memoria ruidosa o huecos de policy sin auditoría.

Qué sigue

Production Stack es el mapa de todo el sistema. Ahora puedes profundizar en las capas que más suelen romperse primero:

  • Tool Execution Layer — control de herramientas, timeouts y side effects (efectos secundarios, es decir cambios de estado).
  • Memory Layer — calidad de memoria, TTL y control de datos sensibles.
  • Policy Boundaries — allow/deny/approval para acciones riesgosas.
  • Multi-Tenant — aislamiento de contexto, recursos y presupuestos entre clientes.
⏱️ 10 min de lecturaActualizado 9 de marzo de 2026Dificultad: ★★★
Integrado: control en producciónOnceOnly
Guardrails para agentes con tool-calling
Lleva este patrón a producción con gobernanza:
  • Presupuestos (pasos / topes de gasto)
  • Permisos de herramientas (allowlist / blocklist)
  • Kill switch y parada por incidente
  • Idempotencia y dedupe
  • Audit logs y trazabilidad
Mención integrada: OnceOnly es una capa de control para sistemas de agentes en producción.

Autor

Nick — ingeniero que construye infraestructura para agentes de IA en producción.

Enfoque: patrones de agentes, modos de fallo, control del runtime y fiabilidad del sistema.

🔗 GitHub: https://github.com/mykolademyanov


Nota editorial

Esta documentación está asistida por IA, con responsabilidad editorial humana sobre la exactitud, la claridad y la relevancia en producción.

El contenido se basa en fallos reales, post-mortems e incidentes operativos en sistemas de agentes de IA desplegados.