Fíjate en el orden del grafo exterior: la introducción y la conclusión se escriben las últimas, usando como contexto las secciones ya investigadas. Es exactamente lo que hace una persona que escribe bien, y lo contrario de lo que hace un modelo al que le pides el informe de una sola vez.
Varias secciones se investigan a la vez, y todas escriben en el mismo estado compartido. Eso normalmente es una receta para que la última sobrescriba a las demás. Lo que lo evita es una sola anotación:
class ReportState(TypedDict):
topic: str
sections: list[Section]
completed_sections: Annotated[list, operator.add] # ← acumulador
final_report: str
Ese Annotated[list, operator.add] le dice al grafo que, cuando dos ramas devuelvan
un valor para ese campo, no se elige uno: se suman. Es la diferencia entre un campo que se
reemplaza y uno que se acumula, y es lo único que separa un grafo secuencial de uno que se abre en
abanico sin conflictos.
Merece la pena retener el patrón más allá de este sistema: en cualquier grafo con ramas paralelas, la pregunta que hay que hacerse por cada campo del estado es ¿este se reemplaza o se acumula? Equivocarse no da error — da resultados que faltan.
// un campo que debía acumular y reemplaza pierde trabajo en silencioEntre el plan y la investigación hay un nodo que interrumpe la ejecución, enseña el plan propuesto y espera. El usuario aprueba —y el grafo continúa— o da retroalimentación —y el plan se regenera desde el principio.
No está ahí por prudencia genérica. Está ahí porque es el último punto barato: hasta entonces el sistema ha gastado una llamada de planificación; a partir de ahí gasta búsquedas y redacción por cada sección, en paralelo y con reintentos. Aprobar un plan malo cuesta minutos y dinero; corregirlo antes cuesta leer diez líneas.
Ese es el criterio general para colocar un humano dentro de un flujo automático: justo antes del punto donde el gasto se multiplica, no al final, donde ya solo sirve para lamentarse.
deep_research/» y el script arranca con from graph.graph import builder
— y esa carpeta no se entrega en ninguna parte. No hay repositorio, ni enlace, ni
git clone, ni el código del grafo en ninguna página. Ese builder es el
sistema entero: todos los nodos que describe el diagrama. El ejercicio, tal como está publicado,
falla en su primera línea con un error de módulo no encontrado, y ninguna fila de su tabla de
troubleshooting contempla ese caso. ¿Entrega la plataforma ese repositorio por otra vía que no
viaja con el PDF? Merece la pena averiguarlo antes de intentarlo — y mientras tanto, la
arquitectura de esta lección se puede dibujar y razonar sin ejecutar nada.
Coge una tarea repetitiva que hagas con un LLM y que se deje partir en piezas —revisar varios documentos, redactar varias fichas, analizar varios casos— y dibújala como este grafo: qué nodo planifica, qué se puede abrir en paralelo, dónde va la persona y qué campo del estado acumula.
Después marca en el dibujo el punto donde el gasto se multiplica. Si tu humano no está justo antes de ese punto, muévelo. Ese único cambio suele valer más que cualquier ajuste de prompt.