Todos daban por hecho que los frameworks de agentes IA seguirían cojeando con las rarezas de checkpoint-replay de LangGraph: ya sabes, volver a ejecutar nodos enteros al reanudar, retorciendo el código en pretzels idempotentes. Pero Selectools acaba de soltar la v0.20.1 y es un golpe de pip al status quo: gráficos multiagente, llamadas a herramientas, RAG, 50 evaluadores, anonimización de PII. Todo integrado, código abierto Apache-2.0, compatible con OpenAI, Anthropic, Gemini, Ollama.
Esto lo cambia todo para los desarrolladores hartos de pegar abstracciones con goteras.
Por qué las interrupciones de LangGraph vuelven locos a los creadores
La función interrupt() de LangGraph —por diseño— reproduce todo el cuerpo del nodo después de pausar. ¿La solución oficial? Haz que los side effects sean idempotentes, mete operaciones caras después de la llamada o las fragmentas río abajo. Bien en teoría. Un infierno en la práctica. Cada nodo con humano en el loop se deforma alrededor de las semánticas de reanudación. Tan filtrante como una puerta mosquitera.
¿Selectools? Generadores de Python. Yield un InterruptRequest. Reanuda con generator.send() —justo en el yield. Sin reejecución. ¿Análisis LLM caro? Se ejecuta una sola vez. Limpio.
Mira esto:
async def review_node(state):
analysis = await expensive_llm_analysis(state.data["draft"]) # runs once
decision = yield InterruptRequest(prompt="Approve?", payload=analysis)
state.data["approved"] = (decision == "yes") # resumes here
¡Pum!
“Se reanuda en el punto exacto del yield (LangGraph reinicia todo el nodo).”
Directo del changelog de su v0.18.0. Sin hype: puro código que dice la verdad.
Mi veredicto: este truco de generadores recuerda a los coroutines de Node.js tempranos domando el caos async. Selectools no reinventa la rueda; allana el camino por donde ruedan los agentes. ¿Predicción? Para Q2 2025 atraerá en masa a usuarios de LangGraph, rompiendo el mito del ‘framework único’ como Kubernetes hizo con los Docker swarms.
¿Cómo maneja Selectools los gráficos multiagente?
AgentGraph: grafo dirigido para nodos de agentes. ¿Enrutamiento? Funciones Python puras —sin ruleta de LLM, sin hinchazón de DSL. Flujo determinista, los LLM razonan dentro de los nodos. Inteligente.
ContextMode mantiene el historial cuerdo: LAST_MESSAGE (por defecto), LAST_N, FULL, SUMMARY, CUSTOM. Nada de ahogar a los agentes downstream con ruido upstream.
Ejecución paralela con MergePolicy — LAST_WINS, FIRST_WINS, APPEND. Fan-out, fan-in, sin dramas.
¿Loops? ¿Stalls? El hashing de estado detecta cambios nulos. A prueba de deadlocks.
Pero espera: SupervisorAgent sube la apuesta. Cuatro estrategias:
| Estrategia | Descripción | Ideal para |
|---|---|---|
| plan_and_execute | Plan JSON de LLM, ejecución secuencial | Tareas estructuradas |
| round_robin | Turnos, supervisor verifica | Refinamiento iterativo |
| dynamic | LLM elige agente por paso | Tareas heterogéneas |
| magentic | Magentic-One con ledgers + replan | Investigación autónoma |
Magentic imita el patrón de Microsoft Research. ¿ModelSplit? Planificadores en GPT-4o, ejecutores en Llama: 70-90% más barato. Astucia lista para producción.
¿Es útil de verdad el suite de evaluadores de Selectools?
50 evaluadores listos para usar. Sin servicios pagos de evals. 30 determinísticos (coincidencia exacta, regex), 20 juzgados por LLM (estilo G-Eval).
¿Anonimización PII? Integrada, escanea salidas pre-despliegue. ¿RAG? Tiendas vectoriales, cadenas de recuperación —conecta Ollama o Pinecone. ¿Llamadas a herramientas? Estructuradas, paralelas.
No es un batiburrillo. El framework de evals se ata a AgentGraph: ejecuta suites en gráficos, agrega scores. Los devs obtienen baselines sin vendor lock.
¿Escéptico? Yo también, al principio. Pero el ‘cómo’ brilla: evals como nodos de primera clase en el grafo. Interrumpe mid-eval para ajustes. Reanuda con precisión.
Un párrafo c