Módulo 1: Por qué multi-agente (y cuándo no)
Mini-proyecto: decide single o multi
Descripción
Siete lecciones te dejaron con un criterio completo: qué es un sistema multi-agente (02), cuánto cuesta coordinarlo, medido con una fórmula (03), el árbitro entre un agente con más tools y varios agentes con menos tools cada uno (04), la comparación ejecutada que probó, con números reales, que una tarea no separable cuesta más con multi-agente (05), las tres señales que sí lo justifican (06), y el mapa de los cinco patrones que vienen (07). Este mini-proyecto no agrega ningún concepto nuevo — te da cinco escenarios de Reservo que nunca viste, y te pide aplicar todo lo anterior para decidir, con evidencia, si cada uno necesita un agente o un sistema multi-agente.
El entregable de esta lección es una función de decisión —should_go_multi_agent— que tú mismo
ejecutas contra los cinco escenarios, más el juicio para cuestionar su resultado cuando la
heurística no alcanza. La función cuenta señales; el criterio completo del módulo —incluido el
costo real que puede revertir una decisión aunque el score diga "multi-agente"— sigue siendo tuyo.
Conexión con el módulo
Este mini-proyecto es la síntesis de las siete lecciones anteriores, no una lección nueva. De la 02 usas la definición formal de sistema multi-agente. De la 03, el vocabulario de costo —llamadas, hops— para pesar cualquier resultado de la heurística. De la 04, el árbitro entre crecer un agente o repartir tools. De la 05, la evidencia de que "más agentes" no es sinónimo de "mejor" sin medirlo. De la 06, las tres señales exactas —separabilidad, expertise distinto, aislamiento— que la función de esta lección cuenta. De la 07, el mapa de patrones para cuando la decisión sí es multi-agente. Cuando termines, el Módulo 2 toma el primer patrón —supervisor/router— y lo construye de punta a punta, sobre el mismo Reservo.
El encargo
Reservo te pasa cinco escenarios que llegaron la misma semana, cada uno como lo describió el equipo de producto:
Escenario A: "Cotiza Focus pro 3h y resérvala para Ana."
Escenario B: "Cotiza Focus pro 3h y dime la política de cancelación."
Escenario C: "Resume este párrafo de bienvenida con un 'CEO', un 'investigador' y un 'crítico'."
Escenario D: "Onboarding de un socio nuevo: dile la política de HR interna de su empresa
Y resérvale su primera sala."
Escenario E: "Compara el precio de Focus, Studio y Boardroom, todos pro, 3 horas."
Tu encargo tiene dos entregables:
a) Para cada escenario, aplica las tres señales de la lección 06 (separabilidad, expertise
distinto, necesidad de aislamiento) y ejecuta should_go_multi_agent para obtener un veredicto
inicial.
b) Para CADA veredicto de "multi-agente", cuestiónalo con el costo de la lección 03/05 antes de aceptarlo como decisión final — un score alto no es un permiso automático, es una señal de que vale la pena medir.
Antes de empezar: la función de decisión
La misma heurística que ya viste de pasada en las lecciones anteriores, ahora completa: cuenta cuántas de las tres señales de la lección 06 están presentes, y sugiere un veredicto.
def should_go_multi_agent(scenario):
"""Heurística de decisión (Módulo 1): cuenta cuántas de las 3 señales de
separabilidad/aislamiento están presentes. Un agente con un buen set de
tools alcanza con 0 o 1 señal; multi-agente empieza a justificarse con 2
o más -- y aun con 2+, el costo de coordinación (lecciones 03 y 05) hay
que pesarlo contra el beneficio, nunca asumirlo gratis."""
signals = [
scenario["separable_subtasks"],
scenario["distinct_expertise"],
scenario["needs_isolation"],
]
score = sum(signals)
verdict = "multi-agente (a evaluar el costo)" if score >= 2 else "un agente"
return verdict, score
Antes de aplicarla tú mismo, repasa las tres señales con sus preguntas exactas de la lección 06:
separable_subtasks -> ¿el resultado de una sub-tarea depende del resultado de la otra?
(si SÍ depende, la señal es False -- no son independientes)
distinct_expertise -> ¿las tools de cada mitad viven en dominios de datos que NUNCA
podrían colisionar en input_schema?
needs_isolation -> ¿mezclar el contenido de las dos mitades en un mismo contexto
"contaminaría" a una con información que la otra no necesita?
Con esas tres preguntas, completa tú mismo las señales de los cinco escenarios del encargo antes de mirar la solución.
La solución completa (el entregable)
Ver la solución completa
SCENARIOS = {
"A: cotiza y reserva Focus pro 3h": {
"separable_subtasks": False, # book_room depende del precio que trajo get_quote
"distinct_expertise": False, # las dos tools ya viven en el mismo booking_agent
"needs_isolation": False, # nada que aislar -- un solo dominio, numérico
},
"B: cotiza Focus pro 3h y dime la política de cancelación": {
"separable_subtasks": True, # ninguna sub-pregunta depende del resultado de la otra
"distinct_expertise": True, # números de reserva vs. texto de políticas
"needs_isolation": False, # el stub de search_docs es chico -- no hay corpus real que aislar aquí
},
"C: resume este párrafo con un 'CEO', un 'investigador' y un 'crítico'": {
"separable_subtasks": False, # es UNA tarea de resumen, no varias tareas reales
"distinct_expertise": False, # ninguno de los tres tiene una tool que el otro no tenga
"needs_isolation": False, # no hay ningún dominio de datos que aislar entre "roles"
},
"D: onboarding (política de HR interna + reserva de la primera sala)": {
"separable_subtasks": True, # la política de HR no depende de qué sala se reserva, ni viceversa
"distinct_expertise": True, # documentos de HR vs. números de reserva -- dominios distintos
"needs_isolation": True, # un documento de HR largo, específico de cada empresa, no debe colar en booking_agent
},
"E: compara el precio de Focus, Studio y Boardroom, todos pro, 3h": {
"separable_subtasks": True, # las tres cotizaciones son independientes entre sí
"distinct_expertise": False, # las tres llaman la MISMA tool, get_quote -- ningún dominio nuevo
"needs_isolation": False, # nada que aislar -- todo vive en el mismo dominio numérico
},
}
for name, scenario in SCENARIOS.items():
verdict, score = should_go_multi_agent(scenario)
print(f"{name}\n señales presentes: {score}/3 -> {verdict}\n")
Qué esperar:
A: cotiza y reserva Focus pro 3h
señales presentes: 0/3 -> un agente
B: cotiza Focus pro 3h y dime la política de cancelación
señales presentes: 2/3 -> multi-agente (a evaluar el costo)
C: resume este párrafo con un 'CEO', un 'investigador' y un 'crítico'
señales presentes: 0/3 -> un agente
D: onboarding (política de HR interna + reserva de la primera sala)
señales presentes: 3/3 -> multi-agente (a evaluar el costo)
E: compara el precio de Focus, Studio y Boardroom, todos pro, 3h
señales presentes: 1/3 -> un agente
El razonamiento por escenario:
Escenario A — un agente. Es exactamente la lección 05, medida. book_room necesita el
price_cents que get_quote devuelve — no son independientes, así que la primera señal ya cae.
El sistema de dos agentes de la lección 05 costó 2 llamadas y 2 hops de más, sin ganar nada.
Escenario B — multi-agente, y el costo SÍ se justifica. Las tres señales que la lección 06
midió en detalle: get_quote y search_docs corren en paralelo (lo ejecutaste con
dispatch_parallel), viven en dominios que nunca colisionan (0 pares, aun fusionados), y en un
sistema de producción real —con el corpus completo, no el stub— el aislamiento de contexto
evitaría que booking_agent cargara con texto de políticas en cada request.
Escenario C — un agente, y es el caso de "roles decorativos" de la lección 01. Ninguna señal se cumple: es una sola tarea de resumen, sin sub-tareas reales que separar, y ninguno de los tres "roles" tiene una tool o un dominio de datos que lo distinga de los otros dos. Montarle tres agentes encima —CEO, investigador, crítico— no cambia el hecho de que la tarea sigue siendo: resumir un párrafo. Es el ejemplo textual de la trampa 2 de la lección 01: "roles sin una tool o expertise real detrás son decoración, no arquitectura".
Escenario D — multi-agente, el caso más fuerte del lote (3/3). Es el mismo escenario que
diseñaste en el Ejercicio 3 de la lección 06: billing_agent/HR-policy-agent y booking_agent
resuelven sub-preguntas independientes, en dominios que nunca colisionan, y un documento de HR
específico de cada empresa contaminaría el contexto de booking_agent si viviera en el mismo
agente.
Escenario E — un agente, y es la nota que ya adelantó la lección 02. Las tres cotizaciones sí
son independientes entre sí (separable_subtasks=True) — podrían despacharse en paralelo con
dispatch_parallel, igual que en la lección 06 — pero las tres llaman exactamente la misma tool,
get_quote, sin ningún dominio de datos nuevo (distinct_expertise=False) y sin nada que aislar
(needs_isolation=False). Con 1 de 3 señales, el veredicto de la heurística es "un agente" —
y esto es coherente con algo que la lección 02 ya señaló sobre pricing_agent: su "expertise" no
es una tool nueva, es una forma distinta de componer una tool que ya existe. pricing_agent
sigue siendo parte del elenco de esta guía —los Módulos 2 a 8 lo usan como ejemplo de fan-out
DENTRO de un agente—, pero el criterio estricto del Módulo 1, aplicado a este escenario puntual y
aislado, no exige un agente separado para resolverlo: un solo agente, despachando tres
get_quote en paralelo con dispatch_parallel —el mismo mecanismo de la lección 06, sin
necesidad de un segundo agente—, ya lo resuelve completo.
Errores comunes
-
Aceptar el veredicto de
should_go_multi_agentsin pesar el costo. Un score de 2 o 3 dice "las señales están presentes", no "constrúyelo ya". El Escenario D, con 3/3, todavía necesita la cuenta de la lección 03 —cuántas llamadas y hops cuesta realmente— antes de justificar la inversión de ingeniería de un sistema completo. -
Ejecutar el runner completo (
run_agent_parallel) para "completar" este mini-proyecto. No hace falta, y no es el objetivo: la tarea es decidir, con las señales y el criterio del módulo, no construir el sistema. Ejecutarlo aquí adelantaría el Módulo 2, que construye el patrón supervisor completo. -
Confundir el Escenario E con una excepción al criterio. No lo es — es el criterio funcionando exactamente como debería: una señal sola (separabilidad) no alcanza para justificar un agente nuevo si las otras dos están ausentes.
pricing_agent, como especialista del elenco completo de la guía, se justifica por continuidad pedagógica con los Módulos 2-8, no porque este escenario aislado, por sí solo, lo exija. -
Pensar que la lista de señales de (a) es exhaustiva para cualquier sistema real. Las tres señales de la lección 06 son las que este módulo pudo medir y ejecutar con Reservo — un sistema de producción real puede tener señales adicionales (cumplimiento regulatorio, necesidad de auditoría separada por agente) que esta guía no cubre.
-
Olvidar que el Escenario C no es "menos válido" solo por tener 0/3. Un veredicto de "un agente" no es un resultado pobre — es el resultado correcto cuando corresponde, y evitarlo es justamente lo que la lección 01 advirtió como el error más caro: sumar agentes que no aportan nada, solo porque "suena más sofisticado".
Ejercicios
Ejercicio 1: Confirma tu propia ejecución (Fácil)
Ejecuta should_go_multi_agent sobre los cinco escenarios del encargo y compara tu salida, línea
por línea, con la de la solución completa. Para el Escenario D, escribe en una frase adicional
por qué las tres señales, juntas, hacen que sea el caso más fuerte del lote.
Ver solución
No hay una única "solución de código" para la primera parte — es una verificación: si tu salida coincide con la de la solución completa, aplicaste las tres señales correctamente a los cinco escenarios.
Sobre el Escenario D: las tres señales refuerzan la misma conclusión desde ángulos distintos —
separabilidad dice que no hace falta esperar a que una termine para empezar la otra;
expertise distinto dice que nunca habrá confusión de tools entre las dos; aislamiento dice
que mezclarlas activamente perjudicaría a una de las dos partes. Cuando las tres apuntan en
la misma dirección, el caso para multi-agente deja de depender de una sola métrica — es el patrón
que hace que valga la pena pagar el costo medido en la lección 03, a diferencia del Escenario B,
que tiene 2/3 pero no la señal de aislamiento (el stub de search_docs es chico, sin un corpus
real que proteger todavía).
Ejercicio 2: Agrega un sexto escenario con score 1 distinto a E (Medio)
Diseña un sexto escenario de Reservo —distinto al Escenario E— que también obtenga exactamente
1/3 en should_go_multi_agent, pero con una señal diferente activa (no separable_subtasks
como en E, sino distinct_expertise o needs_isolation solas). Justifica en una frase por qué,
aun con una señal presente, el veredicto sigue siendo "un agente".
Ver solución
SCENARIOS["F: agrega una nota interna sobre un socio difícil, visible solo para el equipo de Reservo"] = {
"separable_subtasks": False, # es una sola acción: agregar la nota, no hay nada que paralelizar
"distinct_expertise": False, # sigue viviendo en el dominio de booking, no hay tool de otro dominio
"needs_isolation": True, # la nota interna no debería aparecer en la respuesta que ve el socio -- hay que aislar QUIÉN la lee, no un dominio de tools distinto
}
verdict, score = should_go_multi_agent(SCENARIOS["F: agrega una nota interna sobre un socio difícil, visible solo para el equipo de Reservo"])
print(f"señales presentes: {score}/3 -> {verdict}")
Salida esperada:
señales presentes: 1/3 -> un agente
Explicación: con solo needs_isolation=True, el veredicto sigue siendo "un agente" — la
misma conclusión que el Escenario E, pero por una razón distinta. Aquí el aislamiento que hace
falta no es "un dominio de datos que contamina a otro" (el sentido que le dio la lección 06) sino
quién puede ver qué —una nota interna no debería filtrarse en una respuesta al socio—. Eso es
un problema real, pero de un tipo distinto: control de acceso sobre lo que un agente muestra,
no una razón para dividir su trabajo en dos agentes. Ese tipo de control —qué información expone
un agente y a quién— es terreno de agent-security-and-sandboxing-guide, nombrada aquí sin
construirse, no una señal que por sí sola justifique un segundo especialista.
Ejercicio 3: Añade el costo de coordinación como cuarto criterio (Difícil)
Extiende should_go_multi_agent para que, además de contar señales, reciba un parámetro
estimated_extra_calls (el número de llamadas de más que costaría el patrón de coordinación
correspondiente, calculado con supervised_cost de la lección 03) y un parámetro
estimated_frequency (cuántas veces por día se espera que esta tarea se ejecute). La nueva
función debe advertir explícitamente cuando el score sugiere "multi-agente" pero el costo total
diario (estimated_extra_calls * estimated_frequency) supera un umbral que tú definas —por
ejemplo, 500 llamadas de más por día—. Ejecútala sobre el Escenario B con dos frecuencias
distintas: 10 veces al día y 1000 veces al día.
Ver solución
def should_go_multi_agent_with_cost(scenario, estimated_extra_calls, estimated_frequency,
daily_threshold=500):
signals = [scenario["separable_subtasks"], scenario["distinct_expertise"],
scenario["needs_isolation"]]
score = sum(signals)
daily_extra_calls = estimated_extra_calls * estimated_frequency
if score < 2:
return "un agente", score, daily_extra_calls
if daily_extra_calls > daily_threshold:
return (f"multi-agente JUSTIFICADO por señales, pero el costo diario "
f"({daily_extra_calls} llamadas de más) supera el umbral -- "
f"revisar si un pipeline (M3) cuesta menos que un supervisor (M2) "
f"antes de construir"), score, daily_extra_calls
return "multi-agente (costo diario aceptable)", score, daily_extra_calls
scenario_b = SCENARIOS["B: cotiza Focus pro 3h y dime la política de cancelación"]
# Con supervised_cost(n_specialists=2) de la lección 03: 2 llamadas de más.
for frequency in (10, 1000):
verdict, score, daily = should_go_multi_agent_with_cost(
scenario_b, estimated_extra_calls=2, estimated_frequency=frequency,
)
print(f"frecuencia={frequency}/día -> señales={score}/3, costo diario={daily}, veredicto: {verdict}")
Salida esperada:
frecuencia=10/día -> señales=2/3, costo diario=20, veredicto: multi-agente (costo diario aceptable)
frecuencia=1000/día -> señales=2/3, costo diario=2000, veredicto: multi-agente JUSTIFICADO por señales, pero el costo diario (2000 llamadas de más) supera el umbral -- revisar si un pipeline (M3) cuesta menos que un supervisor (M2) antes de construir
Explicación: las señales de la lección 06 no cambian con la frecuencia —el Escenario B sigue teniendo 2/3 en los dos casos—, pero el costo acumulado sí depende de cuántas veces al día se ejecuta la tarea. A 10 veces al día, 20 llamadas de más es un costo trivial; a 1000 veces al día, 2000 llamadas de más empieza a justificar buscar un patrón de coordinación más barato —el pipeline de la lección 03 (Ejercicio 3), con menos hops que un supervisor para el mismo número de etapas—. Este ejercicio es exactamente el punto de la trampa 1 de los Errores comunes de esta lección: un score alto es una señal para investigar, no una autorización automática para construir el patrón más caro sin comparar alternativas.
Resumen y siguiente paso
- El mini-proyecto no agregó ningún concepto nuevo: aplicó las siete lecciones anteriores —qué es un sistema multi-agente, el costo de coordinar, el árbitro de tools, la comparación ejecutada, las tres señales, el mapa de patrones— sobre cinco escenarios de Reservo nuevos.
- Clasificamos los cinco con
should_go_multi_agent: A (0/3, un agente — el caso medido en la lección 05), B (2/3, multi-agente justificado — el caso de la lección 06), C (0/3, un agente — el caso de "roles decorativos" de la lección 01), D (3/3, el caso más fuerte), E (1/3, un agente — una señal sola no alcanza, ni siquiera parapricing_agent). - La lección insistió en un punto que atraviesa todo el módulo: un score alto de la heurística es una invitación a medir el costo real (lecciones 03 y 05), nunca un permiso automático para construir el patrón más caro sin comparar alternativas.
- El criterio completo de este módulo —definición, costo, señales, mapa de patrones— es la base que cada módulo siguiente va a reusar: cada patrón nuevo se justifica contra la alternativa de no usarlo, no se asume necesario por default.
Con esto termina el Módulo 1. Ya sabes qué es un sistema multi-agente, cuánto cuesta coordinarlo
—medido, no estimado—, cuándo ese costo se justifica, y tienes un mapa de los cinco patrones que
vienen. En el Módulo 2 construimos el primero de punta a punta: el patrón supervisor/router
— un coordinador central que recibe la petición, decide (concepto) a qué especialista delegar
entre booking_agent, policy_agent y pricing_agent, y agrega el resultado antes de responder,
con el enrutamiento determinista y por decisión del modelo, ejecutado sobre Reservo.
Recursos adicionales
- Anthropic — Building effective agents — El principio de usar la solución más simple que resuelva la tarea, y sumar agentes solo cuando la medición lo justifica; el criterio detrás de todo este mini-proyecto.
- Anthropic — Multi-agent research system — Un caso real donde el costo de coordinar (medido, no asumido) determinó el diseño final del sistema — la misma disciplina que aplicaste en el Ejercicio 3.
- Anthropic — Agent SDK overview — Cómo se ve, en código real, el sistema multi-agente cuyo criterio de decisión acabas de practicar; el destino del Módulo 8 de esta guía.
- Python — Diccionarios y funciones — La estructura detrás de
SCENARIOSyshould_go_multi_agent, la base de la heurística de esta lección.