Суть
Каждый шаг графа сохраняется как чекпоинт. Имея историю, можно откатиться к нужному снимку и: повторить тот же ход (Replay) или подменить состояние и пойти по альтернативному пути (Fork). Это превращает недетерминированного агента в воспроизводимый процесс.
Зачем это нужно
Из-за недетерминизма LLM классическая отладка почти невозможна: один и тот же вход даёт разные ответы, баг не воспроизвести как в обычном backend. Time-travel решает это: фиксируем состояние до ошибки и проигрываем его сколько угодно раз, проверяя гипотезы.
Как работает
- Replay — воспроизведение state с прошлого чекпоинта (тот же
thread_id). - Fork — копируем состояние выбранного чекпоинта в новый
thread_idи запускаем альтернативную ветку:aupdate_state(fork_thread, old_state.values, checkpoint_id=...)→ainvoke(...). - История доступна через
aget_state_history(thread, limit=...)— список снимков сcheckpoint_idи значениями. - Стоимость replay: если на пути дорогие LLM-узлы, повторный проход недёшев — их результаты кэшируют в state, чтобы переигрывать только дешёвую часть (см. LangGraph Reliability, Agent CostControl).
Пример
history = [s async for s in app.aget_state_history(thread)]
old = history[1] # откат к checkpoint_2
fork = {"configurable": {"thread_id": "fork_456"}}
await app.aupdate_state(fork, old.values,
checkpoint_id=old.config["configurable"]["checkpoint_id"])
await app.ainvoke({"messages": "другой ввод"}, fork) # новая ветка «а что если?»
Связано с
- LangGraph Checkpointers — time-travel физически опирается на чекпоинты
- LangGraph Observability — дополняет трейсинг: не только смотреть, но и переигрывать
- LangGraph — одно из ключевых production-преимуществ перед цепочками
- LangGraph Reliability — кэширование результатов LLM-узлов удешевляет replay