Lumen × LangGraph × Kova
Objetivo: cambiar el Checkpointer de un Agent de LangGraph de SqliteSaver a LumenCheckpointer, desplegarlo en Kova y observar la comparación de la recuperación tras un fallo.
Antes / Después
Una sola máquina, sin copia de seguridad remota · Requiere bloqueo entre procesos · Recuperación tras fallo en milisegundos · Sin seguimiento de costes.
Recuperación tras fallo en microsegundos (motor WAL de Kova) · Seguridad multiproceso nativa · Trace + Cost automáticos · Persistencia remota.
Antes
from langgraph.checkpoint.sqlite import SqliteSaver
graph = wf.compile(checkpointer=SqliteSaver.from_conn_string("./state.db"))Después
from lumen_ai import LumenCheckpointer, LumenTracer
from kova import KovaClient
kova = KovaClient("kova://prod-cluster")
graph = wf.compile(
checkpointer=LumenCheckpointer(kova_client=kova),
callbacks=[LumenTracer()],
)Validación local
Arrancar Kova en local
bashdocker run -d --name kova -p 9999:9999 ghcr.io/hanmahong5-arch/kova:latestEjecutar tu Agent
bashpython my_agent.pySimular un fallo
bashkill -9 $(pgrep -f my_agent)Reiniciar — continuar desde el punto de interrupción
bashpython my_agent.py
Desplegar en Kova
# agent.yaml
name: my-research-agent
entry: python my_agent.py
replicas: 3
checkpointer: lumen
wal:
retention: 7dlumen deploy --target kova://prod-clusterExperimento de comparación de recuperación tras un fallo
| Métrica | SqliteSaver | Lumen + Kova |
|---|---|---|
| Latencia de recuperación | 8 ms (una sola máquina) | microsegundos |
| Múltiples réplicas | Requiere bloqueo adicional | nativo |
| Entre centros de datos | Copia manual | replicación asíncrona integrada |
| Rellamada al LLM | Se rellama si falla la escritura en SQLite | nunca se rellama |
| Trace | Ninguno | correlación automática |
De dónde viene la recuperación en microsegundos
La latencia de planificación del motor Kova baja hasta los 3 μs (pipeline FIFO completo, benchmark de Criterion de 3,17 μs, 315K ops/s). LumenCheckpointer delega la escritura del checkpoint de LangGraph al WAL de Kova: la recuperación se realiza mediante la reproducción del WAL a nivel de motor en lugar de a nivel de archivo de SQLite, por lo que es de microsegundos, mucho más rápida que los milisegundos de SQLite en una sola máquina.