rdune71 commited on
Commit
e2ee43d
·
1 Parent(s): fb8e0ac

Fix Streamlit session state issues with explicit widget keys and robust state management

Browse files
Files changed (1) hide show
  1. app.py +73 -27
app.py CHANGED
@@ -1,4 +1,4 @@
1
- # Force redeploy trigger - version 2.1
2
  import streamlit as st
3
  from utils.config import config
4
  import requests
@@ -9,28 +9,38 @@ from core.memory import load_user_state, check_redis_health
9
  # Set page config
10
  st.set_page_config(page_title="AI Life Coach", page_icon="🧘", layout="centered")
11
 
12
- # Initialize session state
13
- if 'ngrok_url' not in st.session_state:
14
- st.session_state.ngrok_url = config.ollama_host
15
- if 'model_status' not in st.session_state:
16
- st.session_state.model_status = "checking"
17
- if 'available_models' not in st.session_state:
18
- st.session_state.available_models = []
19
- if 'selected_model' not in st.session_state:
20
- st.session_state.selected_model = config.local_model_name
 
 
 
 
21
 
22
  # Sidebar for user selection
23
  st.sidebar.title("🧘 AI Life Coach")
24
- user = st.sidebar.selectbox("Select User", ["Rob", "Sarah"])
25
 
26
- # Ngrok URL input in sidebar
27
  st.sidebar.markdown("---")
28
  st.sidebar.subheader("Ollama Connection")
29
- ngrok_input = st.sidebar.text_input("Ngrok URL", value=st.session_state.ngrok_url)
30
- if st.sidebar.button("Update Ngrok URL"):
 
 
 
 
 
31
  st.session_state.ngrok_url = ngrok_input
32
  st.session_state.model_status = "checking"
33
  st.session_state.available_models = []
 
34
  st.sidebar.success("Ngrok URL updated!")
35
  st.experimental_rerun()
36
 
@@ -63,22 +73,45 @@ if st.session_state.ngrok_url and st.session_state.model_status != "unreachable"
63
  # If current selected model not in list, select the first one
64
  if st.session_state.selected_model not in model_names:
65
  st.session_state.selected_model = model_names[0]
 
66
 
67
- # Model selector dropdown
68
  st.sidebar.markdown("---")
69
  st.sidebar.subheader("Model Selection")
 
 
 
 
 
70
  if st.session_state.available_models:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
71
  selected_model = st.sidebar.selectbox(
72
  "Select Model",
73
  st.session_state.available_models,
74
- index=st.session_state.available_models.index(st.session_state.selected_model)
75
- if st.session_state.selected_model in st.session_state.available_models
76
- else 0
77
  )
78
  st.session_state.selected_model = selected_model
79
  else:
80
  st.sidebar.warning("No models available - check Ollama connection")
81
- model_input = st.sidebar.text_input("Or enter model name", value=st.session_state.selected_model)
 
 
 
 
82
  st.session_state.selected_model = model_input
83
 
84
  st.sidebar.markdown("---")
@@ -308,9 +341,18 @@ for msg in conversation:
308
  content = msg["content"]
309
  st.markdown(f"**{role}:** {content}")
310
 
311
- # Chat input
312
- user_input = st.text_input("Your message...", key="input")
313
- if st.button("Send"):
 
 
 
 
 
 
 
 
 
314
  if user_input.strip() == "":
315
  st.warning("Please enter a message.")
316
  else:
@@ -334,8 +376,12 @@ if st.button("Send"):
334
  st.session_state.selected_model
335
  )
336
  backend_used = "Ollama"
337
-
338
- if ai_response:
339
- st.markdown(f"**AI Coach ({backend_used}):** {ai_response}")
340
- else:
341
- st.error(f"Failed to get response from {backend_used}.")
 
 
 
 
 
1
+ # Force redeploy trigger - version 2.2
2
  import streamlit as st
3
  from utils.config import config
4
  import requests
 
9
  # Set page config
10
  st.set_page_config(page_title="AI Life Coach", page_icon="🧘", layout="centered")
11
 
12
+ # Comprehensive session state initialization
13
+ session_keys_defaults = {
14
+ 'ngrok_url': config.ollama_host,
15
+ 'model_status': "checking",
16
+ 'available_models': [],
17
+ 'selected_model': config.local_model_name,
18
+ 'selected_model_index': 0,
19
+ 'user_message_input': ""
20
+ }
21
+
22
+ for key, default_value in session_keys_defaults.items():
23
+ if key not in st.session_state:
24
+ st.session_state[key] = default_value
25
 
26
  # Sidebar for user selection
27
  st.sidebar.title("🧘 AI Life Coach")
28
+ user = st.sidebar.selectbox("Select User", ["Rob", "Sarah"], key="user_selector")
29
 
30
+ # Ngrok URL input in sidebar - UPDATED VERSION
31
  st.sidebar.markdown("---")
32
  st.sidebar.subheader("Ollama Connection")
33
+ ngrok_input = st.sidebar.text_input(
34
+ "Ngrok URL",
35
+ value=st.session_state.ngrok_url,
36
+ key="ngrok_url_input" # Explicit key
37
+ )
38
+
39
+ if st.sidebar.button("Update Ngrok URL", key="update_ngrok_button"): # Explicit key
40
  st.session_state.ngrok_url = ngrok_input
41
  st.session_state.model_status = "checking"
42
  st.session_state.available_models = []
43
+ st.session_state.selected_model_index = 0 # Reset model index
44
  st.sidebar.success("Ngrok URL updated!")
45
  st.experimental_rerun()
46
 
 
73
  # If current selected model not in list, select the first one
74
  if st.session_state.selected_model not in model_names:
75
  st.session_state.selected_model = model_names[0]
76
+ st.session_state.selected_model_index = 0
77
 
78
+ # Model selector dropdown - REPLACED ENTIRE SECTION
79
  st.sidebar.markdown("---")
80
  st.sidebar.subheader("Model Selection")
81
+
82
+ # Initialize selected_model_index in session state if not present
83
+ if 'selected_model_index' not in st.session_state:
84
+ st.session_state.selected_model_index = 0
85
+
86
  if st.session_state.available_models:
87
+ # Ensure selected_model_index is within bounds
88
+ if st.session_state.selected_model_index >= len(st.session_state.available_models):
89
+ st.session_state.selected_model_index = 0
90
+
91
+ # Find index of currently selected model
92
+ if st.session_state.selected_model in st.session_state.available_models:
93
+ st.session_state.selected_model_index = st.session_state.available_models.index(st.session_state.selected_model)
94
+ else:
95
+ # If current model not available, select first one
96
+ st.session_state.selected_model_index = 0
97
+ if st.session_state.available_models:
98
+ st.session_state.selected_model = st.session_state.available_models[0]
99
+
100
+ # Use index-based selection to avoid widget key issues
101
  selected_model = st.sidebar.selectbox(
102
  "Select Model",
103
  st.session_state.available_models,
104
+ index=st.session_state.selected_model_index,
105
+ key="model_selector" # Explicit key to prevent conflicts
 
106
  )
107
  st.session_state.selected_model = selected_model
108
  else:
109
  st.sidebar.warning("No models available - check Ollama connection")
110
+ model_input = st.sidebar.text_input(
111
+ "Or enter model name",
112
+ value=st.session_state.selected_model,
113
+ key="manual_model_input" # Explicit key
114
+ )
115
  st.session_state.selected_model = model_input
116
 
117
  st.sidebar.markdown("---")
 
341
  content = msg["content"]
342
  st.markdown(f"**{role}:** {content}")
343
 
344
+ # Chat input - REPLACED SECTION
345
+ user_input = st.text_input(
346
+ "Your message...",
347
+ key="user_message_input", # Explicit key
348
+ placeholder="Type your message here...",
349
+ value=st.session_state.user_message_input
350
+ )
351
+
352
+ # Use a separate key for the button to avoid conflicts
353
+ send_button = st.button("Send", key="send_message_button")
354
+
355
+ if send_button:
356
  if user_input.strip() == "":
357
  st.warning("Please enter a message.")
358
  else:
 
376
  st.session_state.selected_model
377
  )
378
  backend_used = "Ollama"
379
+
380
+ if ai_response:
381
+ st.markdown(f"**AI Coach ({backend_used}):** {ai_response}")
382
+ else:
383
+ st.error(f"Failed to get response from {backend_used}.")
384
+
385
+ # Clear input after sending (this helps prevent duplicate sends)
386
+ st.session_state.user_message_input = ""
387
+ st.experimental_rerun()