← capítulo

Múltiples herramientas y ciclos de herramientas

Capítulo 7 · un agente es un ciclo while con un dict de despacho

La hora

El problema

"¿Qué artículos de menos de $30 hay en stock, y cuánto costaría uno de cada uno?"

Ninguna llamada sola responde eso. Primero descubre, luego cotiza, luego filtra, luego suma.

Las tres piezas móviles

DISPATCH = {"list_products": list_products,
            "get_product": get_product}
  1. Un dict de despacho: nombre de tool → función de Python
  2. Una conversación a la que sigues agregando
  3. Un ciclo while acotado

El ciclo (OpenAI)

for _ in range(10):                # the safety rail
    response = client.responses.create(
        model="gpt-5.4-nano",
        input=input_list, tools=TOOLS)
    calls = [i for i in response.output
             if i.type == "function_call"]
    if not calls:
        break                      # no calls = the answer
    input_list += response.output
    for call in calls:
        result = DISPATCH[call.name](
            **json.loads(call.arguments))
        input_list.append({...call_id, output...})

El ciclo (Gemini)

for _ in range(10):
    response = client.models.generate_content(
        model="gemini-3.1-flash-lite",
        contents=contents, config=CONFIG)
    if not response.function_calls:
        break
    contents.append(response.candidates[0].content)
    # one function_response part per call, batched

Los modelos agrupan varias llamadas por turno — maneja una lista.

Los errores son datos

return {"error": f"no product called {name!r}"}

El modelo lo lee, corrige el nombre, reintenta. Lanza la excepción, y un error recuperable se vuelve un 500.

Nunca despliegues un ciclo abierto

range(10), no while True.

Un modelo confundido va a pedir la misma tool por siempre. El tope es la diferencia entre una mala respuesta y una caída.

Ponlo a trabajar — tres apps

Cada una es una app web de docker compose up.

Verifica los efectos secundarios desde el estado

La respuesta de automatización del hogar agrega un diff antes/después calculado en Python. Los modelos reportan mal lo que hicieron; el estado no.

Conclusión

Un agente es un ciclo while con un dict de despacho. Digno de producción significa: acotado, errores-como-datos, efectos secundarios verificados desde el estado calculado.