Construcción de un Agente con Tool-Use y Function Calling Usando la API de OpenAI y LangGraph en 2026

La evolución de los modelos de lenguaje masivo ha transitado a través de tres estadios bien definidos: primero fueron oráculos pasivos que generaban texto en respuesta a una instrucción directa; luego se transformaron en motores de recuperación contextual mediante tuberías RAG; y en el presente año 2026, han alcanzado su madurez operativa como agentes de decisión autónomos y semi-autónomos capaces de interactuar con el mundo físico y digital mediante el uso de herramientas computacionales externas (Tool-Use).

No obstante, la primera generación de agentes basada en cadenas lineales o bucles ReAct monolíticos adolecía de una fragilidad crítica: los agentes quedaban atrapados en bucles infinitos, no podían pausar su ejecución para solicitar confirmación humana en acciones de alto riesgo (como realizar una transferencia bancaria o borrar una base de datos) y perdían el estado del sistema ante cualquier excepción no controlada. Para solucionar estas limitaciones, la industria ha adoptado LangGraph, el framework de orquestación basado en grafos cíclicos dirigidos que proporciona gestión de estado persistente, puntos de control (checkpoints) e integración nativa con Function Calling de la API de OpenAI.

De acuerdo con investigaciones sobre arquitecturas agénticas publicadas en ACM Digital Library y el repositorio oficial en GitHub de LangGraph, los sistemas de agentes estructurados en grafos de estados reducen los fallos de convergencia de tareas en más de un 60% frente a agentes basados en bucles de texto plano. Como hemos analizado al profundizar en agentes multi-step con LangGraph y Open Interpreter y los casos de agentes de IA en entornos corporativos con ROI, la ingeniería de grafos es hoy el estándar de facto para la automatización cognitiva.

1. De Cadenas Lineales a Grafos Cíclicos: La Necesidad Arquitectónica de LangGraph

Las librerías de primera generación como LangChain clásico basaban su flujo de control en Grafos Acíclicos Dirigidos (DAGs) o secuencias de tubería (chain = prompt | model | parser). Este enfoque funcionaba aceptablemente para tareas de una sola pasada —como resumir un texto o clasificar un correo—, pero colapsaba al intentar programar un agente que debía intentar ejecutar una acción, analizar el error si la llamada fallaba, corregir los parámetros y reintentar la operación en un bucle adaptativo.

LangGraph redefine el problema modelando la lógica del agente como una máquina de estados finitos computable. El sistema está compuesto por tres primitivas matemáticas esenciales:

  • Estado (State): Una estructura de datos central que almacena el contexto global, el historial de mensajes acumulados y las variables de negocio de la sesión.
  • Nodos (Nodes): Funciones de Python puras o llamadas a modelos LLM que reciben el estado actual, realizan un cómputo o ejecutan una herramienta y devuelven un conjunto de actualizaciones que se fusionan en el estado.
  • Aristas (Edges): Conexiones que determinan qué nodo debe ejecutarse a continuación. Las aristas condicionales permiten inspeccionar la última salida del LLM para decidir si el flujo debe bifurcar hacia la ejecución de una herramienta o finalizar devolviendo la respuesta al usuario.
Diagrama conceptual de circuitos y nodos conectados en red de procesamiento

LangGraph estructura la toma de decisiones agéntica en grafos cíclicos con gestión de estado inmutable.

2. Definición Tipada de Herramientas (Tools) con Pydantic y Function Calling

Para que un modelo de lenguaje invoque una función de Python de manera fiable, debe recibir una descripción semántica precisa de sus argumentos y tipos de datos. Con el decorador @tool de LangChain y esquemas Pydantic, la definición de herramientas alcanza una robustez total:

from langchain_core.tools import tool
from pydantic import BaseModel, Field

class ConsultaInventarioInput(BaseModel):
    sku: str = Field(description="Código alfanumérico único del producto en formato SKU-XXXX")
    almacen_id: int = Field(description="Identificador numérico del almacén central (1 a 5)")

@tool(args_schema=ConsultaInventarioInput)
def consultar_stock_almacen(sku: str, almacen_id: int) -> str:
    '''Consulta el stock disponible y reservas de un producto en un almacén específico.'''
    # Simulación de consulta a base de datos ERP empresarial
    return f"Stock disponible para {sku} en almacén {almacen_id}: 42 unidades (12 reservadas)."

Al pasar esta función a la API de OpenAI, la librería convierte automáticamente el modelo Pydantic en una especificación JSON Schema que la red neuronal procesa de forma nativa durante su fase de atención.

3. El Estado del Grafo (AgentState) y Canales de Reducción de Mensajes

El corazón de un agente en LangGraph es su esquema de estado. Definimos un TypedDict que utiliza el reductor add_messages para acumular el historial de conversación sin sobrescribir las interacciones previas:

from typing import TypedDict, Annotated, Sequence
from langchain_core.messages import BaseMessage
from langgraph.graph.message import add_messages

class AgentState(TypedDict):
    # La anotación add_messages concatena los nuevos mensajes al historial existente
    messages: Annotated[Sequence[BaseMessage], add_messages]
    usuario_autenticado: bool
    nivel_privilegio: str

Este patrón garantiza que cada nodo del grafo tenga acceso completo tanto a la conversación como a variables de seguridad críticas (como si el usuario tiene permisos de administrador para ejecutar una acción destructiva).

Pantalla de analítica de datos con líneas de estado y flujos de ejecución en tiempo real

Los canales de reducción de LangGraph aseguran que el estado global se sincronice limpiamente entre nodos de ejecución.

4. Nodos de Decisión y Aristas Condicionales: Deber de Llamar a Herramienta

Ensamblamos el grafo definiendo el nodo del modelo de lenguaje, el nodo ejecutor de herramientas y la arista condicional que rige el bucle reflexivo:

from langgraph.graph import StateGraph, END
from langgraph.prebuilt import ToolNode
from langchain_openai import ChatOpenAI

# 1. Configurar modelo con herramientas vinculadas
tools = [consultar_stock_almacen]
model = ChatOpenAI(model="gpt-4o", temperature=0).bind_tools(tools)

# 2. Definir función del nodo del agente
def call_model(state: AgentState):
    response = model.invoke(state["messages"])
    return {"messages": [response]}

# 3. Función de bifurcación condicional
def should_continue(state: AgentState) -> str:
    last_message = state["messages"][-1]
    # Si el modelo generó una llamada a herramienta, derivar al nodo 'tools'
    if last_message.tool_calls:
        return "tools"
    # En caso contrario, terminar la ejecución devolviendo respuesta
    return END

# 4. Construir y compilar el grafo
workflow = StateGraph(AgentState)
workflow.add_node("agent", call_model)
workflow.add_node("tools", ToolNode(tools))

workflow.set_entry_point("agent")
workflow.add_conditional_edges("agent", should_continue, {"tools": "tools", END: END})
workflow.add_edge("tools", "agent")  # Bucle: tras ejecutar herramienta, volver a consultar al agente

app = workflow.compile()

Este bucle cíclico permite que el agente consulte el inventario, reciba el resultado del almacén y luego redacte una respuesta natural y fluida para el cliente final.

5. Puntos de Control (Checkpointers): Memoria a Corto y Largo Plazo en SQLite/Postgres

En aplicaciones de misión crítica, la ejecución de un agente no puede depender de variables volátiles en memoria. LangGraph proporciona Checkpointers (como SqliteSaver o PostgresSaver), que serializan el estado completo del grafo tras cada paso atómico.

Esto aporta dos ventajas técnicas extraordinarias:

Recuperación ante Caídas (Fault Tolerance): Si el servidor web se reinicia o se pierde la conexión de red en mitad de un flujo multi-paso, el sistema puede reanudar la ejecución exactamente en el último nodo completado sin tener que volver a facturar tokens ni repetir las llamadas a APIs externas ya ejecutadas.

Viaje en el Tiempo (Time Travel): Los desarrolladores pueden inspeccionar el estado histórico del agente en cualquier interacción pasada (forking), modificar manualmente una variable del contexto y re-ejecutar el grafo desde ese punto exacto para depurar fallos o evaluar caminos alternativos.

Consola de programación mostrando ejecución de scripts y checkpoints de persistencia

Los checkpointers en PostgreSQL permiten auditar cada paso del razonamiento agéntico y reanudar flujos interrumpidos.

6. Tabla Comparativa: LangGraph vs. CrewAI vs. AutoGen vs. OpenAI Assistants API

Evaluamos los principales marcos de desarrollo agéntico disponibles en el ecosistema actual:

Framework Modelo de Control Human-in-the-Loop Persistencia / Checkpoints Agnóstico al Proveedor LLM
LangGraph (LangChain) Grafo de Estados Cíclico Determinista 🏆 Nativo (breakpoints por nodo) 🏆 Integrado (SQLite, Postgres, Redis) Total (OpenAI, Anthropic, Ollama, etc.)
CrewAI Roles y Cuadrillas de Agentes Básico (delegación manual) Memoria a corto plazo en memoria Sí (vía LangChain/LiteLLM)
Microsoft AutoGen Conversación Multi-Agente Asíncrona Sí (UserProxyAgent) Limitado (requiere custom code) Sí (OpenAI, Azure, APIs locales)
OpenAI Assistants API Servicio Cloud Gestionado (Black-box) Vía requires_action polling Gestionado por OpenAI (Threads) No (Exclusivo modelos de OpenAI)

7. Intervención Humana en el Bucle (Human-in-the-Loop): Pausas y Autorizaciones

El mayor riesgo de los agentes autónomos en producción es el impacto no deseado de acciones irreversibles. Si un agente financiero decide ordenar una compra de acciones por 500.000 euros, la ejecución debe congelarse obligatoriamente hasta que un supervisor humano pulse un botón de aprobación.

LangGraph resuelve este requerimiento mediante Breakpoints Dinámicos al compilar el grafo:

# Compilar con interrupción previa al nodo de ejecución de herramientas
app = workflow.compile(
    checkpointer=memory_saver,
    interrupt_before=["tools"]  # Pausar antes de ejecutar cualquier herramienta
)

# 1. El usuario envía la petición
config = {"configurable": {"thread_id": "sesion-42"}}
for event in app.stream({"messages": [("user", "Transfiere 10.000€ al proveedor Acme")]}, config):
    print(event)

# 2. El grafo se congela y guarda el estado en el checkpointer
estado_actual = app.get_state(config)
print("ACCIÓN PENDIENTE DE APROBACIÓN HUMANA:", estado_actual.next)

# 3. El supervisor aprueba y se reanuda la ejecución con None
app.invoke(None, config)

Este mecanismo permite implementar interfaces de auditoría donde los operadores inspeccionan los parámetros exactos calculados por la IA antes de permitir que la mutación se propague a los sistemas transaccionales de la empresa.

8. Preguntas Frecuentes sobre LangGraph, Agentes y Function Calling

¿Qué sucede si una herramienta externa arroja una excepción o devuelve un código de error 500?

En LangGraph, el nodo de herramientas captura las excepciones y devuelve un mensaje de tipo ToolMessage que contiene la descripción del error. El grafo reenvía este mensaje al nodo del modelo de lenguaje, permitiendo que el LLM lea la traza del fallo, comprenda la causa del error y decida reintentar la llamada con parámetros alternativos o informar amablemente al usuario.

¿Es posible ejecutar agentes construidos en LangGraph con modelos de código abierto como LLaMA 3.1?

Sí. LangGraph es enteramente agnóstico respecto al modelo fundacional. Puedes vincular herramientas a cualquier modelo desplegado en Ollama, vLLM o Groq que ofrezca soporte para Tool Calling nativo, manteniendo exactamente la misma estructura de nodos, aristas condicionales y checkpointers de persistencia.

¿Cómo se evita que un agente entre en un bucle infinito de llamadas repetitivas?

Existen dos salvaguardas arquitectónicas indispensables: en primer lugar, LangGraph permite fijar el parámetro de configuración recursion_limit (por defecto establecido en 25 pasos); en segundo lugar, se puede programar un contador de iteraciones dentro del propio AgentState que obligue a la arista condicional a derivar directamente al nodo final si se superan, por ejemplo, cinco intentos fallidos consecutivos.

¿Cuál es la diferencia entre LangGraph y LangGraph Cloud (LangSmith Deployments)?

LangGraph es la librería de software open-source que puedes instalar y ejecutar en cualquier servidor propio. LangGraph Cloud es la plataforma gestionada de LangChain que ofrece infraestructura serverless para desplegar, monitorizar, escalar horizontalmente y depurar grafos de LangGraph con interfaz gráfica de observabilidad y colas de tareas en background listas para producción.