Capítulo 7 · un agente es un ciclo while con un dict de despacho
"¿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.
DISPATCH = {"list_products": list_products,
"get_product": get_product}
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...})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.
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.
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.
Cada una es una app web de docker compose up.
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.
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.