From 98eb6ed2022dd70949ad23a2cb2ed0604029cc4e Mon Sep 17 00:00:00 2001 From: Luis Novo Date: Sat, 31 Jan 2026 19:25:11 -0300 Subject: [PATCH] fix: use sync get_state() for SqliteSaver compatibility (#519) SqliteSaver does not support async methods like aget_state(). Use asyncio.to_thread() to run the sync get_state() call from async context, maintaining compatibility with the existing sync graph invocations. Closes #509 --- open_notebook/utils/graph_utils.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/open_notebook/utils/graph_utils.py b/open_notebook/utils/graph_utils.py index 02aae2e..8f44c4f 100644 --- a/open_notebook/utils/graph_utils.py +++ b/open_notebook/utils/graph_utils.py @@ -1,11 +1,16 @@ +import asyncio + from langchain_core.runnables import RunnableConfig from loguru import logger + async def get_session_message_count(graph, session_id: str) -> int: """Get message count from LangGraph state, returns 0 on error.""" try: - thread_state = await graph.aget_state( # async version - config=RunnableConfig(configurable={"thread_id": session_id}) + # Use sync get_state() in a thread (SqliteSaver doesn't support async) + thread_state = await asyncio.to_thread( + graph.get_state, + config=RunnableConfig(configurable={"thread_id": session_id}), ) if ( thread_state