Session State Multiple Users

This example demonstrates how to maintain state for each user in a multi-user environment.

1"""
2Session State Multiple Users
3=============================
4
5This example demonstrates how to maintain state for each user in a multi-user environment.
6"""
7
8import json
9
10from kern.agent import Agent
11from kern.db.sqlite import SqliteDb
12from kern.models.openai import OpenAIResponses
13from kern.run import RunContext
14
15# In-memory database to store user shopping lists
16# Organized by user ID and session ID
17shopping_list = {}
18
19
20def add_item(run_context: RunContext, item: str) -> str:
21 """Add an item to the current user's shopping list."""
22
23 current_user_id = run_context.session_state["current_user_id"]
24 current_session_id = run_context.session_state["current_session_id"]
25 shopping_list.setdefault(current_user_id, {}).setdefault(
26 current_session_id, []
27 ).append(item)
28
29 return f"Item {item} added to the shopping list"
30
31
32def remove_item(run_context: RunContext, item: str) -> str:
33 """Remove an item from the current user's shopping list."""
34
35 current_user_id = run_context.session_state["current_user_id"]
36 current_session_id = run_context.session_state["current_session_id"]
37
38 if (
39 current_user_id not in shopping_list
40 or current_session_id not in shopping_list[current_user_id]
41 ):
42 return f"No shopping list found for user {current_user_id} and session {current_session_id}"
43
44 if item not in shopping_list[current_user_id][current_session_id]:
45 return f"Item '{item}' not found in the shopping list for user {current_user_id} and session {current_session_id}"
46
47 shopping_list[current_user_id][current_session_id].remove(item)
48 return f"Item {item} removed from the shopping list"
49
50
51def get_shopping_list(run_context: RunContext) -> str:
52 """Get the current user's shopping list."""
53
54 if run_context.session_state is None:
55 run_context.session_state = {}
56
57 current_user_id = run_context.session_state["current_user_id"]
58 current_session_id = run_context.session_state["current_session_id"]
59 return f"Shopping list for user {current_user_id} and session {current_session_id}: \n{json.dumps(shopping_list[current_user_id][current_session_id], indent=2)}"
60
61
62# Create an Agent that maintains state
63# ---------------------------------------------------------------------------
64# Create Agent
65# ---------------------------------------------------------------------------
66agent = Agent(
67 model=OpenAIResponses(id="gpt-5-mini"),
68 db=SqliteDb(db_file="tmp/data.db"),
69 tools=[add_item, remove_item, get_shopping_list],
70 # Reference the in-memory database
71 instructions=[
72 "Current User ID: {current_user_id}",
73 "Current Session ID: {current_session_id}",
74 ],
75 markdown=True,
76)
77
78user_id_1 = "john_doe"
79user_id_2 = "mark_smith"
80user_id_3 = "carmen_sandiago"
81
82# ---------------------------------------------------------------------------
83# Run Agent
84# ---------------------------------------------------------------------------
85if __name__ == "__main__":
86 # Example usage
87 agent.print_response(
88 "Add milk, eggs, and bread to the shopping list",
89 stream=True,
90 user_id=user_id_1,
91 session_id="user_1_session_1",
92 )
93 agent.print_response(
94 "Add tacos to the shopping list",
95 stream=True,
96 user_id=user_id_2,
97 session_id="user_2_session_1",
98 )
99 agent.print_response(
100 "Add apples and grapes to the shopping list",
101 stream=True,
102 user_id=user_id_3,
103 session_id="user_3_session_1",
104 )
105 agent.print_response(
106 "Remove milk from the shopping list",
107 stream=True,
108 user_id=user_id_1,
109 session_id="user_1_session_1",
110 )
111 agent.print_response(
112 "Add minced beef to the shopping list",
113 stream=True,
114 user_id=user_id_2,
115 session_id="user_2_session_1",
116 )
117
118 # What is on Mark Smith's shopping list?
119 agent.print_response(
120 "What is on Mark Smith's shopping list?",
121 stream=True,
122 user_id=user_id_2,
123 session_id="user_2_session_1",
124 )
125
126 # New session, so new shopping list
127 agent.print_response(
128 "Add chicken and soup to my list.",
129 stream=True,
130 user_id=user_id_2,
131 session_id="user_3_session_2",
132 )
133
134 print(f"Final shopping lists: \n{json.dumps(shopping_list, indent=2)}")

Run the Example

1# Clone and setup repo
2git clone https://github.com/kern-ai/kern.git
3cd kern/cookbook/02_agents/05_state_and_session
4
5# Create and activate virtual environment
6./scripts/demo_setup.sh
7source .venvs/demo/bin/activate
8
9python session_state_multiple_users.py