Agentes

Un agente es un modelo ejecutándose en un bucle, eligiendo la siguiente herramienta a llamar hasta que se complete una tarea. El resto de este capítulo explica qué significa eso, dónde rinde sus frutos, y dónde silenciosamente te cuesta.
El bucle del agente
En uso de herramientas el modelo llamaba una función y tú enviabas el resultado de vuelta. Pero algunas tareas toman varios pasos, y no conoces los pasos con anticipación. "Encuentra el vuelo más barato y resérvalo" podría significar buscar, comparar, revisar un calendario, luego reservar, y el modelo tiene que elaborar esa secuencia sobre la marcha.
Entonces en lugar de manejar una única llamada de herramienta, pones todo en un bucle. Este ciclo repetido es el bucle del agente, un turno repetido hasta que se complete la tarea:
- Envía la conversación y las herramientas disponibles al modelo.
- El modelo llamará a una herramienta o dará una respuesta final.
- Si llamó a una herramienta, ejecútala, añade el resultado a la conversación, y vuelve al paso 1.
- Si dio una respuesta final, detén.
Cada turno el modelo ve todo lo que sucedió hasta ahora, incluyendo resultados previos de herramientas, y decide el siguiente movimiento. Esa es la única diferencia del uso de herramientas: mantienes el bucle hasta que el modelo crea que ha terminado.
El cambio real es quién está dirigiendo. En cada capítulo hasta ahora, tu código decidía el flujo de control: tú elegías cuándo llamar al modelo, cuándo ejecutar una herramienta, qué venía después. Un agente entrega esa decisión al modelo. El bucle sigue preguntando "¿qué debería suceder ahora?" y la predicción del modelo es la respuesta cada vez. Cambias control por flexibilidad, y ese cambio es la fuente tanto del alcance como del riesgo.
Debajo de todo, nada nuevo está sucediendo. Es la misma predicción sobre un contexto creciente, el viaje de ida y vuelta del uso de herramientas repetido. El modelo no elabora un plan y lo sigue. Cada turno predice el único mejor siguiente paso a partir de lo que puede ver ahora mismo, luego el bucle se ejecuta de nuevo.
Cuando eso funciona, se ve como razonamiento hacia una meta. Cuando no, el agente se buclea en sí mismo o deambula por un callejón sin salida, porque ninguna parte del sistema está manteniendo el plan general.
Un agente mínimo
Aquí está el bucle en código. Reutiliza las definiciones de herramientas e implementaciones del uso de herramientas y las envuelve en un bucle que se ejecuta hasta que el modelo deja de pedir herramientas.
import json
def run_agent(user_text, tools, tool_impls, max_steps=6):
messages = [{"role": "user", "content": user_text}]
step = 0
while step < max_steps:
response = client.chat.completions.create(model=MODEL, messages=messages, tools=tools)
message = response.choices[0].message
messages.append(message)
calls = message.tool_calls
if not calls:
return message.content # ninguna herramienta solicitada: esta es la respuesta final
# ejecuta cada herramienta solicitada y alimenta los resultados de vuelta
for call in calls:
args = json.loads(call.function.arguments)
result = tool_impls[call.function.name](args)
messages.append({"role": "tool", "tool_call_id": call.id, "content": json.dumps(result)})
step += 1
return "Stopped: the agent reached its step limit." # red de seguridadLéelo de arriba a abajo: llama al modelo, empuja su mensaje a la conversación, y si pidió herramientas, ejecuta todas ellas y añade los resultados, luego haz bucle de nuevo. Cuando el modelo devuelve texto en lugar de una llamada de herramienta, ese texto es la respuesta final y lo devuelves.
El valor de max_steps establece un límite de pasos, la red de seguridad que mantiene el bucle de escaparse, sobre lo cual la siguiente sección trata. La forma aquí coincide con SDK de un proveedor; los nombres de campo difieren entre proveedores, pero el bucle es el mismo en todas partes.
Detener y guardrails
Un bucle que deja que un modelo decida cuándo parar puede fallar en parar. Podría llamar herramientas por siempre, repetirse, o perseguir un callejón sin salida. Porque cada paso es una llamada de modelo facturada por tokens, un agente desbocado quema dinero y tiempo rápidamente.
Así que guardrails, los límites que pones alrededor del bucle, son parte del diseño, no un paso de pulido que añades al final:
- Un límite de pasos. Limita el número de bucles, la forma que
max_stepshace. Cuando se golpea, detén y devuelve. - Valida entradas de herramientas. El modelo elige los argumentos, así verifica antes de ejecutar cualquier cosa con consecuencias reales.
- Limita lo que las herramientas pueden hacer. Dale al agente el menos poder que necesita. Una herramienta que lee es más segura que una que elimina.
- Observa el costo. Varias llamadas de modelo por tarea se multiplican rápidamente, así rastrea tokens y establece un presupuesto.
El hilo que ata estos: el modelo está improvisando el camino, así pones los límites en lugar de que no los haya. Asume que el agente hará lo incorrecto al menos una vez, y haz que sea survivible.
Cuándo un flujo de trabajo vence un agente
Los agentes son emocionantes, lo que lo hace tentador alcanzar uno cuando no lo necesitas. La regla simple: si ya conoces los pasos, no uses un agente. Escríbelos como código simple, un flujo de trabajo, donde cada paso se ejecuta en un orden fijo.
Un flujo de trabajo es más confiable, más barato, y mucho más fácil de depurar, porque controlas el camino en lugar de esperar que el modelo lo encuentre. Guarda agentes para tareas abiertas donde los pasos dependen de lo que se descubre en el camino.
Muchas características que se ven como si necesitaran un agente son mejores como una llamada de salida estructurada o una búsqueda RAG conectadas a mano. Alcanza un agente solo cuando no puedas escribir los pasos con anticipación.
En la práctica
La función run_agent arriba es el todo. Dale una pregunta, un conjunto de herramientas, e sus implementaciones, y hace bucle hasta que se haga o hasta que golpee el límite de pasos. Una pequeña tarea muestra el bucle ganando su lugar:
answer = run_agent(
"¿Cuál es el clima en Buenos Aires y debería traer un paraguas?",
tools, # incluye get_weather del capítulo de uso de herramientas
tool_impls, # {"get_weather": ...}
)
# El agente llama get_weather, lee "nublado", luego responde en un turno final:
# "Está nublado en Buenos Aires a 18 grados, así que un paraguas es una idea sensata."Una herramienta, un bucle, una respuesta. La misma estructura escala a varias herramientas y varios pasos sin cambiar forma. Una vez puedas construir cosas esta capaces, la siguiente pregunta es cómo sabes que realmente funcionan, que es lo que evals trata.
run_agent es el patrón entero: dale una pregunta, herramientas, e sus implementaciones, y hace bucle hasta que el modelo deja de pedir herramientas o golpea el límite. Una herramienta y un bucle escalan a muchas sin cambiar forma. La siguiente pregunta es cómo sabes que realmente funciona, que es evals. 
