Tool Orchestration en AI Agents: El Patrón de 3 Fases que Secuencia y Paraleliza Tool Calls sin Romper el Loop

Tool Orchestration en AI Agents: El Patrón de 3 Fases que Secuencia y Paraleliza Tool Calls sin Romper el Loop

Programming· 6 min read

El 90% de los AI Agents que ves en GitHub ejecutan tool calls como si fueran 1999

Llaman a una API. Esperan. Llaman a otra. Esperan. Siguiente.

*Eso no es un agente. Es un script secuencial con esteroides. *

El problema no es el LLM. No es el prompt. No es el framework.

Es que tratáis el loop del agente como una lista de tareas plana cuando debería ser un grafo de dependencias.

He revisado decenas de repos de AI Agents en 2026. El patrón dominante sigue siendo el más básico: ejecutar tool calls en serie, una detrás de otra, esperando a que cada una termine para empezar la siguiente.

Funciona en demos. En producción, tu agente:

  • Se queda en bucle infinito porque una tool call depende de otra que nunca llegó.
  • Quema tokens esperando respuestas que podrían ejecutarse en paralelo.
  • Sobrescribe datos porque dos tool calls modificaron el mismo recurso sin coordinación.

*El verdadero salto de calidad en un AI Agent no está en el modelo. Está en cómo orquestas sus herramientas. *

El Problema: Creéis que un Agent Loop es una Lista de Tareas

Cuando preguntas a la mayoría de los desarrolladores cómo estructuran las tool calls de su agente, describen esto:

El enfoque ingenuo (el que ves en todos los tutorials de 2024):

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

Este patrón tiene tres fallos fatales:

  • Desperdicio de latencia: si Tool A y Tool B son independientes, ejecutarlas en serie duplica el tiempo de respuesta.
  • Pérdida de contexto: entre cada tool call, el LLM tiene que re-procesar el resultado anterior en la ventana de contexto. Cada iteración cuesta tokens.
  • Sin gestión de dependencias: el agente no sabe qué tools pueden ejecutarse juntas y cuáles deben esperar. Confía en que el LLM lo decida sobre la marcha.

Y el LLM no lo decide bien. Los modelos de lenguaje no están entrenados para optimizar grafos de dependencias. Están entrenados para generar texto coherente.

*Pedirle a un LLM que planifique tool calls óptimas es como pedirle a un poeta que construya un puente. *

La Evidencia: Lo que Pasa Cuando No Orquestas

Trabajé en un agente que debía:

  1. Buscar un cliente en la base de datos (read).
  2. Si existe, obtener su plan de suscripción (read).
  3. Si el plan lo permite, crear una factura (write).
  4. Enviar un email al cliente (write).
  5. Registrar la acción en un log de auditoría (write).

El equipo implementó el loop ingenuo. Cada tool call se ejecutaba en serie. El agente tardaba una media de 12 segundos por transacción.

El problema real no era la latencia. Era que entre el paso 2 y el paso 3, otro proceso modificaba el plan del cliente. El agente creaba una factura basada en datos obsoletos.

*El error silencioso. *

No hay try-catch que lo detecte. No hay excepción. Solo una factura incorrecta en producción.

Reestructuramos el loop con un sistema de fases. Mismo LLM. Mismas tools. La latencia cayó a 4 segundos. Cero errores de consistencia.

El Framework: Patrón de 3 Fases de Orquestación

Este patrón organiza las tool calls en tres fases dentro del mismo loop del agente. No necesitas cambiar de framework. No necesitas un orquestador externo. Solo una estructura de decisión dentro de tu agent loop.

Fase 1: Secuenciación Obligada

No todas las tools pueden ejecutarse en paralelo. Algunas dependen del resultado de otras.

La regla es simple: *si una tool call necesita el output de otra para funcionar, ejecútalas en serie. Si no, no. *

Ejemplo en TypeScript con un agente simple:

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

Este pequeño orquestador:

  • Ejecuta tools independientes en paralelo con Promise.all.
  • Ejecuta tools dependientes en serie, respetando el orden.
  • Detecta dependencias circulares y lanza error.
  • Reduce la latencia total al mínimo posible dado el grafo de dependencias.

Fase 2: Paralelización Segura

Aquí viene el truco que la mayoría ignora: *no todas las tool calls independientes pueden ejecutarse realmente en paralelo. *

Dos tools que leen de la misma fuente son independientes. Dos tools que escriben en el mismo recurso... no lo son tanto.

Reglas de paralelización segura:

  • Read-Read: siempre paralelizable.
  • Read-Write: paralelizable solo si la escritura no depende de la lectura.
  • Write-Write: NUNCA en paralelo si comparten recurso. Una sobreescribirá a la otra.
  • Write-Read secuencial: si Tool A escribe y Tool B lee lo que A escribió, no son independientes. Dependencia oculta.

Implementa una función de análisis de conflictos antes de paralelizar:

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

Este paso evita el error más común en 2026: paralelizar tools que compiten por el mismo recurso y acabar con datos corruptos.

Fase 3: Fusión de Contexto

Una vez ejecutadas todas las tool calls de la iteración, llega el momento crítico: *fusionar los resultados en un solo contexto que el LLM pueda procesar. *

El error típico es pasar los resultados tal cual:

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

El LLM tiene que unir mentalmente estos fragmentos. Gasta tokens y contexto. Y se equivoca.

En lugar de eso, fusiona los resultados antes de pasarlos al LLM:

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

El contexto que recibe el LLM ahora es:

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

El LLM procesa esto en una sola pasada. Menos tokens. Menos errores. Decisiones más rápidas.

El Pipeline Completo: Cómo se Integra Todo

El loop del agente con el Patrón de 3 Fases se ve así:

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

Cada iteración del loop ejecuta un batch completo de tool calls. No una. No dos. Todas las que puedan ejecutarse en esa fase.

El resultado: menos iteraciones, menos tokens, menos latencia.

Lo que Cambia en Producción

Cuando implanté este patrón en un agente real (el de búsqueda de profesionales para gestoriascercademi.com), los números fueron claros:

  • Reducción de iteraciones del loop: de 8-12 a 3-4.
  • Latencia media por request: bajó drásticamente.
  • Errores de consistencia: cero tras la implantación.

El cambio no fue el modelo. Fue la orquestación.

*Construir AI Agents en 2026 no va de elegir el mejor LLM. Va de diseñar el loop que los gobierna. *

El Patrón de 3 Fases de Orquestación —Secuenciar, Paralelizar, Fusionar— es la diferencia entre un agente que parece listo en una demo y uno que realmente funciona en producción.

No necesitas un nuevo framework. No necesitas un orquestador externo. Necesitas dejar de tratar las tool calls como una lista plana y empezar a tratarlas como un grafo de dependencias.

Tu agente te lo agradecerá. Tus usuarios también.

Artículos relacionados

---

¿Quieres recibir contenido como este cada semana? Suscríbete a mi newsletter

Brian Mena

Brian Mena

Software engineer building profitable digital products: SaaS, directories and AI agents. All from scratch, all in production.

LinkedIn