El problema
Construir un grafo de LangGraph desde cero tiene mucho código repetitivo: definir el estado, los nodos, las aristas condicionales y, sobre todo, los tests. Quería describir lo que necesito en lenguaje natural y que un agente hiciera ese trabajo, pero sin darle vía libre para escribir y ejecutar código en mi máquina.
La solución
Agente Graphos combina dos frameworks: LangGraph orquesta el flujo con estado y CrewAI pone a trabajar tripulaciones de agentes por roles (diseño y codificación).
Tests en rojo: vuelve a codificar con el error como contexto, hasta 3 veces.
- Diseña el esquema del grafo (nodos, aristas, estado) y un diagrama Mermaid.
- Me pide aprobación con
interrupt()de LangGraph, enseñándome el contenido de los ficheros, no solo sus nombres, antes de tocar el disco. - Genera el
StateGraphy su suite de tests en un workspace aislado por sesión. - Valida: analiza el AST y ejecuta los tests en un subproceso aislado. Si fallan, vuelve a codificar con el error como contexto, hasta tres veces, y vuelve a pedirme aprobación antes de reescribir.
Seguridad en profundidad
Un agente que escribe y ejecuta código es de lo más arriesgado que se puede construir, así que puse varias capas:
- Workspace confinado: cada ruta se resuelve y se comprueba que no escapa del directorio de la sesión (incluidos los saltos entre unidades en Windows).
- Filtro AST: bloquea imports de red y de sistema (
socket,requests,subprocess,ctypes…) y llamadas comoeval,execo__import__. - Subproceso aislado:
python -I, directorio de trabajo confinado, entorno saneado por lista blanca (sin claves ni tokens) ypytestcon la raíz fijada al sandbox. - Timeout estricto de 30 segundos para cortar bucles infinitos.
Stack desglosado
- Orquestación: LangGraph (
StateGraph,interrupt,Command). - Agentes por roles: CrewAI.
- Validación: Pydantic para estado y configuración.
- Modelos: Anthropic, OpenAI, Gemini, OpenRouter, Ollama y Groq, autodetectados por las claves presentes y con Ollama local como respaldo.
- Tests: arnés a coste 0 con un LLM falso, sin llamadas a APIs.
Estado y aprendizajes
Por qué está en pausa: lo que aprendí aquí lo llevé a langgraph-template y a mi agente auditor de código, que hoy son mi forma de construir agentes LangGraph. Lo retomaré para añadir persistencia de hilos en SQLite.
Lo que aprendí: a combinar dos frameworks de agentes con responsabilidades claras (LangGraph manda y CrewAI ejecuta) y a diseñar el human-in-the-loop como una pieza del grafo, no como un input() suelto.