Un solo nodo con cincuenta herramientas y un prompt de tres páginas es lento, caro y fácil de confundir. Cada instrucción compite con las demás por la atención del modelo, y cuando falla no sabes cuál de las cincuenta lo estropeó.
builder.add_conditional_edges(
"router",
lambda s: s["intencion"],
{"MATEMATICAS": "mates", "CHISTE": "chiste", "GENERAL": "general"},
)
Mecanismo idéntico al de la lección 02. Lo que cambia es quién
rellena intencion: ya no un if sobre un entero, sino un modelo.
El mejor especialista para «50 + 50» no es un modelo: es Python. Un nodo determinista es más barato, más rápido y no alucina el resultado. El grafo no distingue entre un nodo que llama a un LLM y uno que hace una división — los dos reciben el estado y devuelven un parche.
// no es «qué modelo pongo en cada rama», sino «qué ramas no necesitan modelo».| Router-Specialist | Supervisor-Workers | |
|---|---|---|
| Forma de la tarea | Una intención → un experto | Una tarea → varias sub-tareas |
| Quién vuelve a decidir | Nadie: se ramifica una vez | El supervisor, tras cada worker |
| Topología | Árbol, sin ciclo | Estrella con ciclo de vuelta |
| Coste típico | Una llamada de clasificación | Una llamada de supervisión por ronda |
| Ejemplo | soporte / ventas / facturación | investiga X y escribe un informe |
El supervisor es, estructuralmente, el ciclo ReAct de la lección 05 con agentes en lugar de herramientas: decide, delega, lee el resultado, vuelve a decidir. Y hereda el mismo riesgo — sin contador de rondas, gira.
Pedirle a un modelo que responda «SOLO con la categoría» y meter ese
texto directamente en el mapa de aristas es una promesa que el modelo no ha firmado.
Devuelve MATH, o Matemáticas, o la categoría con
un punto final, y el grafo revienta con
ValueError: Edge mapping missing key.
Las tres defensas, ordenadas por cuánto delegan la garantía fuera del
prompt. La tercera es with_structured_output sobre un esquema con un campo
Literal.
La lección vende el patrón como ahorro de costes — «modelo
pequeño para enrutar, grande para ejecutar» — pero en su propio
ejemplo el router y el especialista general son el mismo modelo,
gpt-4o-mini, y el tercer especialista usa gpt-3.5-turbo. El
modelo caro no aparece en ninguna parte.
Comprueba dos cosas: si gpt-3.5-turbo sigue disponible en tu proveedor y a
qué precio, y si con esa configuración el ejemplo demuestra realmente el
ahorro que anuncia o solo lo describe. Un patrón de optimización cuyo
ejemplo no mide nada merece la duda.
Pasa por el router una pregunta deliberadamente ambigua: «Cuéntame algo
curioso sobre el número 7». Imprime la categoría cruda que
devuelve el modelo, sin .strip().upper(), y compárala con las claves
del mapa carácter a carácter.
Después fuerza el fallo: cambia una clave del mapa a "MATEMATICA"
(sin la S) y ejecuta el caso de mates. Anota si el error aparece al compilar o al
invocar, y qué te dice eso sobre qué valida compile().