Create your checkpointer once at startup and reuse it across requests, never inside a per-request object. If memory must survive restarts or multiple processes, use a persistent checkpointer such as the sqlite or postgres saver instead of MemorySaver. Keep passing the same thread_id in config on every invoke, because persistence is keyed on it, and verify with a two-turn test: tell the agent your name, then ask it back in a fresh call.

Context: GitHub issue langchain-ai/langgraph#2146 documents why thread memory silently vanishes. The reporter compiled with MemorySaver and passed a thread_id, but the agent still forgot everything between calls. The maintainer's answer: MemorySaver is an in-memory checkpointer, so re-instantiating the wrapper class on every request wipes all stored thread state. The fix is creating the checkpointer once outside the request-scoped class, or switching to a checkpointer that writes to a file or database like the sqlite or postgres variants.