From 67e3620c5cd83f8a1e31a42f8f017cea03e47d38 Mon Sep 17 00:00:00 2001 From: Teknium <127238744+teknium1@users.noreply.github.com> Date: Fri, 3 Apr 2026 10:31:11 -0700 Subject: [PATCH] fix: persist API server sessions to shared SessionDB (state.db) (#4802) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The API server adapter created AIAgent instances without passing session_db, so conversations via Open WebUI and other OpenAI-compatible frontends were never persisted to state.db. This meant 'hermes sessions list' showed no API server sessions — they were effectively stateless. Changes: - Add _ensure_session_db() helper for lazy SessionDB initialization - Pass session_db=self._ensure_session_db() in _create_agent() - Refactor existing X-Hermes-Session-Id handler to use the shared helper Sessions now persist with source='api_server' and are visible alongside CLI and gateway sessions in hermes sessions list/search. --- gateway/platforms/api_server.py | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/gateway/platforms/api_server.py b/gateway/platforms/api_server.py index 2059a1aa6..86af84307 100644 --- a/gateway/platforms/api_server.py +++ b/gateway/platforms/api_server.py @@ -372,6 +372,24 @@ class APIServerAdapter(BasePlatformAdapter): status=401, ) + # ------------------------------------------------------------------ + # Session DB helper + # ------------------------------------------------------------------ + + def _ensure_session_db(self): + """Lazily initialise and return the shared SessionDB instance. + + Sessions are persisted to ``state.db`` so that ``hermes sessions list`` + shows API-server conversations alongside CLI and gateway ones. + """ + if self._session_db is None: + try: + from hermes_state import SessionDB + self._session_db = SessionDB() + except Exception as e: + logger.debug("SessionDB unavailable for API server: %s", e) + return self._session_db + # ------------------------------------------------------------------ # Agent creation helper # ------------------------------------------------------------------ @@ -415,6 +433,7 @@ class APIServerAdapter(BasePlatformAdapter): platform="api_server", stream_delta_callback=stream_delta_callback, tool_progress_callback=tool_progress_callback, + session_db=self._ensure_session_db(), ) return agent @@ -503,10 +522,9 @@ class APIServerAdapter(BasePlatformAdapter): if provided_session_id: session_id = provided_session_id try: - if self._session_db is None: - from hermes_state import SessionDB - self._session_db = SessionDB() - history = self._session_db.get_messages_as_conversation(session_id) + db = self._ensure_session_db() + if db is not None: + history = db.get_messages_as_conversation(session_id) except Exception as e: logger.warning("Failed to load session history for %s: %s", session_id, e) history = []