chemgraph-loop / src /ui /state.py
rockyaaos's picture
ChemGraph Loop: guarded real-agent API (EMT/TBLite single-point energy)
c509967 verified
Raw
History Blame Contribute Delete
2.73 kB
"""Streamlit session-state initialisation for the ChemGraph UI."""
import logging
import streamlit as st
from ui.config import load_config
logger = logging.getLogger(__name__)
def init_session_state() -> None:
"""Ensure all required session-state keys exist with sensible defaults.
This function is idempotent -- calling it multiple times is safe.
"""
defaults = {
"agent": None,
"conversation_history": [],
"last_config": None,
"config": None, # loaded lazily below
"last_run_error": None,
"last_run_result": None,
"last_run_query": None,
"ui_notice": None,
"active_model": None,
"active_workflow": None,
"ui_log_root": None,
"current_chat_log_dir": None,
"active_query_log_dir": None,
"active_graph_thread_id": None,
"agent_running": False,
"agent_run_lock_acquired": False,
"pending_agent_submission": None,
# Session persistence
"session_store": None, # SessionStore instance (created lazily)
"current_session_id": None, # active session ID (str or None)
"session_created": False, # True once the DB row has been created
# Human-in-the-loop interrupt state
"pending_human_question": None, # str: question from HumanInputRequired
"pending_interrupt_config": None, # dict: LangGraph config for resume
"pending_interrupt_query": None, # str: original user query
"pending_interrupt_thread_id": None, # int: thread_id for interrupted run
"pending_interrupt_prev_msg_count": 0, # int: msg count before query started
"pending_interrupt_model": None, # str: model active when query started
"pending_interrupt_workflow": None, # str: workflow active when query started
"pending_interrupt_log_dir": None, # str: log dir active when query started
"interrupt_count": 0, # int: safety counter for sequential interrupts
"interrupt_exchanges": [], # list of {"question": str, "answer": str}
}
for key, value in defaults.items():
if key not in st.session_state:
st.session_state[key] = value
# Load config from disk on first run
if st.session_state.config is None:
st.session_state.config = load_config()
# Initialise SessionStore on first run
if st.session_state.session_store is None:
try:
from chemgraph.memory.store import SessionStore
st.session_state.session_store = SessionStore()
except Exception as exc:
logger.warning("Failed to initialise SessionStore: %s", exc)
# Memory will be unavailable; the UI continues without it.