agentsclimarketplace

Using streamlit session state

Skill mouadja02/skills/skills/streamlit/developing-with-streamlit/skills/using-streamlit-session-state

A curated collection of agent skills for your AI agents - engineering craft, prompt engineering, design, growth marketing, ...

Install
npx -y skills add mouadja02/skills --skill using-streamlit-session-state

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

2 things to look at

  • no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
  • 8 stars8 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Using st.session_state to manage state across Streamlit reruns

The file declares its own license as Apache-2.0. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.

SKILL.md

4.0 KB, as published. Nobody here has run it

Attribution: Sourced from streamlit/agent-skills by Streamlit.

Using Streamlit session state

Streamlit reruns scripts top-to-bottom on every interaction. Without session state, variables reset each time. Use st.session_state to persist values across reruns.

Basic usage

Session state is a dictionary-like object supporting attribute and bracket notation:

# Initialize with setdefault (preferred)
st.session_state.setdefault("count", 0)

# Alternative: check before setting
if "count" not in st.session_state:
    st.session_state.count = 0

# Read
current = st.session_state.count

# Update
st.session_state.count += 1
st.session_state["count"] = 5  # Bracket notation also works

# Delete
del st.session_state.count

Accessing uninitialized keys raises KeyError. Use st.session_state.get("key", default) for safe access.

Widget-state association

Every widget with a key parameter automatically syncs to session state:

name = st.text_input("Name", key="user_name")
# st.session_state.user_name contains the same value as `name`

Callbacks

Callbacks execute before the script reruns, allowing immediate state changes. Use on_change or on_click with optional args and kwargs:

def increment(amount):
    st.session_state.count += amount

st.button("Add 5", on_click=increment, args=(5,))

Access a widget's value in its own callback via st.session_state.key, not the return variable.

Initialization patterns

Initialize all state at the top of your app for clarity:

st.session_state.setdefault("user", None)
st.session_state.setdefault("page", "home")
st.session_state.setdefault("filters", {})

Multipage state

Widgets are NOT stateful across pages. Their values reset when navigating between pages.

Sharing state

Use session state variables (not widget keys) to share data:

# Page 1: Store value
st.session_state.selected_user = st.selectbox("User", users)

# Page 2: Read stored value
if "selected_user" in st.session_state:
    st.write(f"Selected: {st.session_state.selected_user}")

Shared widgets pattern

Put common widgets in the entrypoint file (before nav.run()):

# app.py (entrypoint)
with st.sidebar:
    st.session_state.theme = st.selectbox("Theme", ["Light", "Dark"])

nav = st.navigation(pages)
nav.run()

Common mistakes

Module-level mutable state

# BAD: In imported modules, this is shared across ALL users
# utils.py
cache = {}  # Persists across reruns AND users!

# GOOD: Use session state for per-user data
st.session_state.setdefault("cache", {})

Modifying state after widget creation

Cannot assign to a widget's state after the widget has rendered:

st.slider("Value", key="my_slider")
st.session_state.my_slider = 50  # Raises StreamlitAPIException!

Mixing value parameter and session state

Don't set both—it causes warnings:

# BAD: Conflicting sources
st.session_state.setdefault("name", "Alice")
st.text_input("Name", value="Bob", key="name")  # Warning!

# GOOD: Use one or the other
st.session_state.setdefault("name", "Alice")
st.text_input("Name", key="name")

Session characteristics

  • Per-user, per-tab: Each browser tab has its own session
  • Temporary: Lost when tab closes or server restarts
  • Not suitable for persistence: Use databases for permanent storage

References

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.