El blog de Deska

Un Agent Loop desde cero en 200 líneas

Aprende a construir un agent loop desde cero con Python para entender la arquitectura central de los asistentes de IA y las herramientas de desarrollo.

· 11 min de lectura

Construir un agent loop desde cero es la forma más efectiva de entender cómo operan realmente los asistentes de programación modernos. Aunque los frameworks de alto nivel ofrecen comodidad, a menudo ocultan el ciclo fundamental de observación, razonamiento y acción que define a un sistema autónomo. Al eliminar las abstracciones, podemos ver que un agente funcional es esencialmente un bucle controlado donde un LLM tiene acceso a herramientas específicas y un mecanismo para interpretar los resultados de sus propias acciones.

La anatomía de un Agent Loop

En su núcleo, un agent loop es una máquina de estados. Comienza con una instrucción, entra en un ciclo de procesamiento y finaliza cuando se cumple una condición específica o se genera una respuesta final. El proceso sigue un patrón predecible a menudo llamado ReAct (Razonar y Actuar).

  1. Entrada: El usuario proporciona una tarea.
  2. Pensamiento: El modelo analiza la tarea y decide qué herramienta usar.
  3. Acción: El modelo genera una llamada estructurada para una herramienta.
  4. Observación: El sistema ejecuta la herramienta y devuelve el resultado al modelo.
  5. Evaluación: El modelo evalúa el resultado y decide si necesita más pasos.

Este ciclo continúa hasta que el modelo determina que tiene información suficiente para completar el pedido. La complejidad no reside en el bucle en sí, sino en cómo gestionas el historial y manejas los errores cuando una herramienta falla o una alucinación del modelo genera un comando inválido.

Implementación mínima en Python

Para construir un agent loop desde cero, necesitas una forma de gestionar el historial de la conversación y un registro de funciones que el modelo pueda llamar. A continuación se muestra una estructura conceptual para una implementación de 200 líneas. Usamos un bucle while simple y una lista de diccionarios para rastrear los mensajes.

import json

class AgenteSimple:
    def __init__(self, cliente_modelo, herramientas):
        self.cliente = cliente_modelo
        self.herramientas = {h.__name__: h for h in herramientas}
        self.mensajes = []

    def ejecutar(self, instruccion):
        self.mensajes.append({"role": "user", "content": instruccion})
        
        while True:
            respuesta = self.cliente.chat(messages=self.mensajes)
            mensaje = respuesta.mensaje
            self.mensajes.append(mensaje)

            if not mensaje.tool_calls:
                return mensaje.content

            for llamada in mensaje.tool_calls:
                resultado = self.ejecutar_herramienta(llamada)
                self.mensajes.append({
                    "role": "tool",
                    "tool_call_id": llamada.id,
                    "content": str(resultado)
                })

    def ejecutar_herramienta(self, llamada):
        func = self.herramientas[llamada.function.name]
        args = json.loads(llamada.function.arguments)
        return func(**args)

Este fragmento demuestra la lógica central. Debes definir tus herramientas como funciones estándar de Python y proporcionar sus esquemas al modelo. El bucle maneja el relevo entre el pensamiento del modelo y la ejecución local de código o comandos de terminal.

Consideraciones sobre herramientas y entorno

Un agente es tan útil como las herramientas a las que puede acceder. Para los desarrolladores, esto suele significar una terminal, un sistema de archivos y quizás un navegador web. Al construir tu propio bucle, la seguridad es una preocupación primordial. Ejecutar comandos de terminal arbitrarios en tu máquina anfitriona es riesgoso. Es por esto que muchos desarrolladores prefieren entornos local-first donde el agente opera dentro de un contexto controlado.

ComponenteResponsabilidadEnfoque recomendado
LLMRazonamiento y planificaciónGPT-4o o Claude 3.5 Sonnet
Ventana de contextoGestión de conversaciones largasResumen o ventana deslizante
Registro de herramientasMapeo de nombres a funcionesValidación con JSON Schema
SandboxEjecución de código peligrosoDocker o carpetas locales restringidas

Visualizando el espacio de trabajo con Deska

Una vez que tienes un agent loop desde cero funcional, el siguiente desafío es monitorearlo. Observar un flujo de logs en formato JSON en una terminal estándar dificulta la depuración de tareas complejas de varios pasos. Aquí es donde un espacio de trabajo especializado resulta valioso.

Deska ofrece un espacio de trabajo en un lienzo infinito diseñado para este propósito exacto. En lugar de una sola ventana, puedes colocar múltiples paneles en cualquier lugar de un plano con zoom. Cuando ejecutas agentes de programación como Claude Code u OpenCode, puedes verlos operando uno al lado del otro.

El canvas te permite organizar un panel de terminal, un editor de código que usa Monaco y un panel de navegador en una sola vista. Este diseño te ayuda a rastrear el agent loop en tiempo real. Si el agente modifica un archivo, lo ves en el editor. Si inicia un servidor local, puedes ver el resultado en el panel del navegador. Esta visibilidad es crucial cuando tu agent loop realiza operaciones complejas como refactorizar un repositorio o depurar una suite de pruebas.

Desarrollo local-first y privacidad

Un obstáculo importante en la ingeniería de agentes es la privacidad de los datos. Muchos desarrolladores dudan en enviar todo su código fuente a un servicio en la nube. Deska soluciona esto siendo local-first. Tu código, archivos e incluso los datos de la sesión del agente permanecen en tu máquina.

Si usas el nivel de por vida, puedes usar tus propias llaves de API. Esto significa que el espacio de trabajo no actúa como intermediario para tus datos. Para quienes prefieren una experiencia gestionada, Deska también ofrece inferencia gestionada para suscriptores. En ambos casos, la lógica de los paneles y la coordinación de las terminales ocurren localmente en Mac, Windows o Linux.

Funciones avanzadas: Ask Deska y Mobile

Construir un bucle básico es solo el comienzo. Los sistemas sofisticados a menudo requieren una forma de dirigir el propio espacio de trabajo. Deska incluye una función llamada Ask Deska, que es un asistente de voz y chat. A diferencia de un agent loop estándar que solo habla con un LLM, Ask Deska puede manipular el entorno. Puede abrir nuevos paneles, ejecutar comandos específicos y verificar el estado de las sesiones activas.

Además, monitorear un agent loop que tarda mucho tiempo desde un escritorio no siempre es práctico. La aplicación mobile de Deska te permite monitorear y continuar tu trabajo a través de un relevo seguro. Los dispositivos se emparejan directamente, lo que significa que no se exponen puertos a la internet pública. Esta es una ventaja significativa sobre las configuraciones caseras que requieren VPNs complejas o túneles SSH para revisar un proceso en ejecución.

Comparación entre frameworks y bucles personalizados

Al decidir si usar un framework como LangChain o construir un agent loop desde cero, considera los pros y contras.

  • Bucles personalizados: Ofrecen control total, sin sobrecarga oculta y una depuración más sencilla de la lógica central. Son ideales para aprender y para tareas muy especializadas.
  • Frameworks: Proporcionan integraciones preconfiguradas para cientos de herramientas y bases de datos. Son mejores para aplicaciones empresariales donde se requiere una integración rápida con sistemas legados.
  • El enfoque de Deska: Deska se sitúa en el medio al proporcionar el entorno donde tanto los bucles personalizados como los agentes de programación estándar pueden ejecutarse. No te obliga a usar una librería específica, sino que te da las herramientas visuales para gestionar los agentes que elijas usar.

FAQ

¿Cómo evitar bucles infinitos de agentes?

Para evitar que un agente se ejecute indefinidamente, debes implementar un contador de iteraciones máximas en tu código. Una vez que el bucle exceda un número establecido (por ejemplo, 10 o 20 pasos), el sistema debe forzar una detención y pedir la intervención del usuario. También debes monitorear los costos de la API si no usas un LLM local.

¿Cuál es el mejor LLM para llamar herramientas?

Actualmente, modelos como Claude 3.5 Sonnet y GPT-4o son considerados los líderes para la llamada a herramientas. Han sido entrenados específicamente para generar JSON válido y seguir instrucciones complejas. Si trabajas localmente, modelos de muchos parámetros como Llama 3 70B también pueden funcionar bien, siempre que tengas el hardware para ejecutarlos.

¿Puede un agent loop ejecutarse en una terminal?

Sí, la mayoría de los agent loops están diseñados para ejecutarse en un entorno de terminal. En Deska, puedes ejecutar estos agentes dentro de terminales dedicadas mientras ves los cambios en los archivos reflejados instantáneamente en el editor de código lateral. Esto hace que la salida de la terminal sea mucho más fácil de interpretar.

Construye tu entorno

Construir la lógica de un agente es solo la mitad de la batalla. La otra mitad es crear un entorno donde ese agente pueda ser productivo sin comprometer tu seguridad o productividad. Al enfocarte en un enfoque local-first y usar un espacio de trabajo visual, puedes cerrar la brecha entre un simple script de Python y un flujo de trabajo de desarrollo profesional.

Para comenzar a construir y ejecutar tus propios agentes en un lienzo infinito y flexible, descarga Deska para tu plataforma hoy mismo.

💡 Ideas+🐛 BugsPropón una feature o reporta un bug