diff --git a/run_agent.py b/run_agent.py index 349024155..33ea6d26b 100644 --- a/run_agent.py +++ b/run_agent.py @@ -1001,30 +1001,10 @@ class AIAgent: self._session_db = session_db self._parent_session_id = parent_session_id self._last_flushed_db_idx = 0 # tracks DB-write cursor to prevent duplicate writes - if self._session_db: - try: - self._session_db.create_session( - session_id=self.session_id, - source=self.platform or os.environ.get("HERMES_SESSION_SOURCE", "cli"), - model=self.model, - model_config={ - "max_iterations": self.max_iterations, - "reasoning_config": reasoning_config, - "max_tokens": max_tokens, - }, - user_id=None, - parent_session_id=self._parent_session_id, - ) - except Exception as e: - # Transient SQLite lock contention (e.g. CLI and gateway writing - # concurrently) must NOT permanently disable session_search for - # this agent. Keep _session_db alive — subsequent message - # flushes and session_search calls will still work once the - # lock clears. The session row may be missing from the index - # for this run, but that is recoverable (flushes upsert rows). - logger.warning( - "Session DB create_session failed (session_search still available): %s", e - ) + # Lazy session creation: defer until first message flush (#314). + # _flush_messages_to_session_db() calls ensure_session() which uses + # INSERT OR IGNORE — creating the row only when messages arrive. + # This eliminates 32% of sessions that are created but never used. # In-memory todo list for task planning (one per agent/session) from tools.todo_tool import TodoStore