Skip to main content
Alpha Notice: These docs cover the v1-alpha release. Content is incomplete and subject to change.For the latest stable version, see the v0 LangChain Python or LangChain JavaScript docs.

Overview

LangChain agents use LangGraph persistence to enable long-term memory. This is a more advanced topic and requires knowledge of LangGraph to use.

Memory storage

LangGraph stores long-term memories as JSON documents in a store. Each memory is organized under a custom namespace (similar to a folder) and a distinct key (like a file name). Namespaces often include user or org IDs or other labels that makes it easier to organize information. This structure enables hierarchical organization of memories. Cross-namespace searching is then supported through content filters.
from langgraph.store.memory import InMemoryStore   def embed(texts: list[str]) -> list[list[float]]:  # Replace with an actual embedding function or LangChain embeddings object  return [[1.0, 2.0] * len(texts)]   # InMemoryStore saves data to an in-memory dictionary. Use a DB-backed store in production use. store = InMemoryStore(index={"embed": embed, "dims": 2})  user_id = "my-user" application_context = "chitchat" namespace = (user_id, application_context)  store.put(   namespace,  "a-memory",  {  "rules": [  "User likes short, direct language",  "User only speaks English & python",  ],  "my-key": "my-value",  }, ) # get the "memory" by ID item = store.get(namespace, "a-memory")  # search for "memories" within this namespace, filtering on content equivalence, sorted by vector similarity items = store.search(   namespace, filter={"my-key": "my-value"}, query="language preferences" ) 
For more information about the memory store, see the Persistence guide.

Read long-term memory in tools

A tool the agent can use to look up user information
from dataclasses import dataclass  from langchain_core.runnables import RunnableConfig from langchain.agents import create_agent from langgraph.config import get_store from langgraph.runtime import get_runtime from langgraph.store.memory import InMemoryStore  @dataclass class Context:  user_id: str  # InMemoryStore saves data to an in-memory dictionary. Use a DB-backed store in production. store = InMemoryStore()   # Write sample data to the store using the put method store.put(   ("users",), # Namespace to group related data together (users namespace for user data)  "user_123", # Key within the namespace (user ID as key)  {  "name": "John Smith",  "language": "English",  } # Data to store for the given user )  def get_user_info() -> str:  """Look up user info."""  # Access the store - same as that provided to `create_agent`  store = get_runtime().store   user_id = get_runtime(Context).context.user_id  # Retrieve data from store - returns StoreValue object with value and metadata  user_info = store.get(("users",), user_id)   return str(user_info.value) if user_info else "Unknown user"  agent = create_agent(  model="anthropic:claude-3-7-sonnet-latest",  tools=[get_user_info],  # Pass store to agent - enables agent to access store when running tools  store=store,   context_schema=Context )  # Run the agent agent.invoke(  {"messages": [{"role": "user", "content": "look up user information"}]},  context=Context(user_id="user_123")  ) 

Write long-term memory from tools

Example of a tool that updates user information
from typing_extensions import TypedDict  from langchain_core.runnables import RunnableConfig from langchain.agents import create_agent from langgraph.config import get_store from langgraph.store.memory import InMemoryStore  # InMemoryStore saves data to an in-memory dictionary. Use a DB-backed store in production. store = InMemoryStore()   # TypedDict defines the structure of user information for the LLM class UserInfo(TypedDict):  name: str  # Tool that allows agent to update user information (useful for chat applications) def save_user_info(user_info: UserInfo, config: RunnableConfig) -> str:  """Save user info."""  # Access the store - same as that provided to `create_agent`  store = get_store()   user_id = config["configurable"].get("user_id")  # Store data in the store (namespace, key, data)  store.put(("users",), user_id, user_info)   return "Successfully saved user info."  agent = create_agent(  model="anthropic:claude-3-7-sonnet-latest",  tools=[save_user_info],  store=store  )  # Run the agent agent.invoke(  {"messages": [{"role": "user", "content": "My name is John Smith"}]},  # user_id passed in config to identify whose information is being updated  config={"configurable": {"user_id": "user_123"}}  )  # You can access the store directly to get the value store.get(("users",), "user_123").value 

⌘I