Spaces:
No application file
No application file
Liss, Alex (NYC-HUG)
commited on
Commit
·
c74750f
1
Parent(s):
af031a0
added functioning radio buttons!
Browse files- docs/Phase 1/Task 1.3 Memory & Persona Implementation.md +260 -0
- gradio_agent.py +21 -7
- gradio_app.py +44 -6
docs/Phase 1/Task 1.3 Memory & Persona Implementation.md
CHANGED
@@ -136,6 +136,35 @@ The user will execute **one step at a time** and confirm each works before proce
|
|
136 |
2. Pass that ID into the `ZepMemory()` object.
|
137 |
3. Re‑run app, switch personas, confirm different histories load.
|
138 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
139 |
---
|
140 |
|
141 |
### 6 │ Strict Gradio Rule
|
@@ -143,6 +172,21 @@ The user will execute **one step at a time** and confirm each works before proce
|
|
143 |
* **DO NOT** change any other settings or components in the app.
|
144 |
* Changes must be incremental and easily revertible.
|
145 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
146 |
---
|
147 |
|
148 |
### 7 │ Documentation Update
|
@@ -188,8 +232,224 @@ The user will execute **one step at a time** and confirm each works before proce
|
|
188 |
| Development Workflow | Follow a structured pattern: read instructions → develop plan → review with user → execute after approval | Presented radio button implementation plan before making changes |
|
189 |
| Minimal Surgical Changes | Make the smallest possible changes to achieve the goal with minimal risk | Added only the necessary code for the radio button without modifying existing functionality |
|
190 |
| Rigorous Testing | Test changes immediately after implementation to catch issues early | Ran the application after adding the radio button to verify it works |
|
|
|
|
|
191 |
|
192 |
---
|
193 |
|
194 |
> **Remember:** *One tiny change → test → commit. Repeat.*
|
195 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
136 |
2. Pass that ID into the `ZepMemory()` object.
|
137 |
3. Re‑run app, switch personas, confirm different histories load.
|
138 |
|
139 |
+
**Status Update:**
|
140 |
+
✅ Created a global variable architecture in `gradio_agent.py` to track:
|
141 |
+
- Current memory session ID (`memory_session_id`)
|
142 |
+
- Current persona name (`current_persona`) for improved logging
|
143 |
+
✅ Added clear comments explaining the global variable pattern for future maintenance
|
144 |
+
✅ Implemented a `set_memory_session_id()` function to update the memory state
|
145 |
+
✅ Modified `initialize_memory_from_zep()` to use the current global session ID
|
146 |
+
✅ Improved logging with consistent prefixes (`[PERSONA CHANGE]`, `[MEMORY LOAD]`, `[UI EVENT]`)
|
147 |
+
✅ Added a feedback textbox to the UI to show the current active persona to users
|
148 |
+
✅ Loaded persona-to-session-ID mapping from `persona_session_ids.json`
|
149 |
+
✅ Updated the radio button change handler to:
|
150 |
+
- Load session IDs from JSON
|
151 |
+
- Map selection to correct session ID
|
152 |
+
- Call `set_memory_session_id()` to update the agent
|
153 |
+
- Display feedback in the UI
|
154 |
+
✅ Ran the app and verified that:
|
155 |
+
- Persona selection works correctly
|
156 |
+
- Session IDs are properly mapped
|
157 |
+
- Memory is loaded from the correct persona's history
|
158 |
+
- UI updates to show current persona
|
159 |
+
- Multiple questions work as expected with each persona's context
|
160 |
+
|
161 |
+
**Implementation Approach:**
|
162 |
+
1. Analyzed data flow from UI selection to memory retrieval
|
163 |
+
2. Created detailed implementation plan with debugging steps
|
164 |
+
3. Made surgical changes to minimum number of files
|
165 |
+
4. Added comprehensive logging for troubleshooting
|
166 |
+
5. Tested complete flow from UI to agent response
|
167 |
+
|
168 |
---
|
169 |
|
170 |
### 6 │ Strict Gradio Rule
|
|
|
172 |
* **DO NOT** change any other settings or components in the app.
|
173 |
* Changes must be incremental and easily revertible.
|
174 |
|
175 |
+
**Status Update:**
|
176 |
+
✅ Successfully adhered to "DO NO HARM" principle
|
177 |
+
✅ Made minimal changes to existing code:
|
178 |
+
- Kept original hardcoded session ID as default value for backward compatibility
|
179 |
+
- Maintained function signatures and return values to prevent interface breaks
|
180 |
+
- Only added new functions and variables without removing or restructuring existing code
|
181 |
+
✅ Added proper error handling and fallbacks to prevent regressions
|
182 |
+
✅ Used clear variable naming and consistent coding patterns
|
183 |
+
✅ Added explanatory comments to clarify the purpose of changes
|
184 |
+
✅ Our implementation could be easily reversed by:
|
185 |
+
- Removing the `set_memory_session_id()` function
|
186 |
+
- Restoring the original `initialize_memory_from_zep()` function
|
187 |
+
- Removing the radio button change handler code
|
188 |
+
- Removing the UI feedback textbox
|
189 |
+
|
190 |
---
|
191 |
|
192 |
### 7 │ Documentation Update
|
|
|
232 |
| Development Workflow | Follow a structured pattern: read instructions → develop plan → review with user → execute after approval | Presented radio button implementation plan before making changes |
|
233 |
| Minimal Surgical Changes | Make the smallest possible changes to achieve the goal with minimal risk | Added only the necessary code for the radio button without modifying existing functionality |
|
234 |
| Rigorous Testing | Test changes immediately after implementation to catch issues early | Ran the application after adding the radio button to verify it works |
|
235 |
+
| Clear Documentation | Document design decisions and patterns | Added comments explaining why global variables are declared before functions that use them |
|
236 |
+
| Consistent Logging | Use consistent prefixes for log messages to aid debugging | Added prefixes like "[PERSONA CHANGE]" and "[MEMORY LOAD]" |
|
237 |
|
238 |
---
|
239 |
|
240 |
> **Remember:** *One tiny change → test → commit. Repeat.*
|
241 |
|
242 |
+
---
|
243 |
+
|
244 |
+
## Appendix: Examples of First Principles in Action
|
245 |
+
|
246 |
+
### Exhibit A: Data Flow Explanation for Radio Button to Memory Retrieval (Created as part of Step 5)
|
247 |
+
|
248 |
+
```
|
249 |
+
## Data Flow Explanation: Radio Button to Memory Retrieval
|
250 |
+
|
251 |
+
Here's the complete data flow from user selection to memory retrieval:
|
252 |
+
|
253 |
+
1. **User Interaction**
|
254 |
+
- User selects either "Casual Fan" or "Super Fan" from radio button in gradio_app.py
|
255 |
+
- The UI triggers the `on_persona_change` event handler function
|
256 |
+
|
257 |
+
2. **Event Handling & Session ID Mapping**
|
258 |
+
- `on_persona_change` receives the selected persona name
|
259 |
+
- It loads the persona-to-session-ID mapping from persona_session_ids.json
|
260 |
+
- It retrieves the correct session ID based on the selection
|
261 |
+
|
262 |
+
3. **Session ID Communication**
|
263 |
+
- `on_persona_change` calls `set_memory_session_id` in gradio_agent.py
|
264 |
+
- This updates the global `memory_session_id` variable in gradio_agent.py
|
265 |
+
- The function confirms the switch with a console log
|
266 |
+
|
267 |
+
4. **Memory Retrieval When User Sends Message**
|
268 |
+
- When user sends a message, `generate_response` is called
|
269 |
+
- `generate_response` calls `initialize_memory_from_zep`
|
270 |
+
- `initialize_memory_from_zep` uses the global `memory_session_id` variable to:
|
271 |
+
- Connect to Zep Cloud
|
272 |
+
- Retrieve message history for the specific persona
|
273 |
+
- Convert Zep messages to LangChain format
|
274 |
+
- Create a ConversationBufferMemory object
|
275 |
+
|
276 |
+
5. **Memory Usage in Agent**
|
277 |
+
- The ConversationBufferMemory is passed to the AgentExecutor
|
278 |
+
- The agent now has access to the selected persona's message history
|
279 |
+
- The agent responds with context from that persona's memory
|
280 |
+
|
281 |
+
At each step of this flow, we maintain the session ID to ensure the right persona's memories are retrieved and used by the agent. The global variable acts as the "source of truth" for which persona is currently active.
|
282 |
+
```
|
283 |
+
|
284 |
+
### Exhibit B: Proposed Code Updates with Debugging Approach (Created and executed as part of Step 5)
|
285 |
+
|
286 |
+
```
|
287 |
+
# Proposed Code Updates with Debugging Approach
|
288 |
+
|
289 |
+
## 1. Update `memory_session_id` in gradio_agent.py
|
290 |
+
|
291 |
+
```python
|
292 |
+
# Change from constant to variable with default value
|
293 |
+
memory_session_id = "241b3478c7634492abee9f178b5341cb" # Default to Casual Fan
|
294 |
+
current_persona = "Casual Fan" # Track the persona name for debugging
|
295 |
+
```
|
296 |
+
|
297 |
+
**How it works**: The variable can now be updated while maintaining the default.
|
298 |
+
|
299 |
+
**Debugging**: Added a `current_persona` tracking variable to make logs more readable.
|
300 |
+
|
301 |
+
## 2. Add Session ID Update Function in gradio_agent.py
|
302 |
+
|
303 |
+
```python
|
304 |
+
def set_memory_session_id(new_session_id, persona_name):
|
305 |
+
"""Update the global memory_session_id variable when persona changes"""
|
306 |
+
global memory_session_id, current_persona
|
307 |
+
memory_session_id = new_session_id
|
308 |
+
current_persona = persona_name
|
309 |
+
print(f"[PERSONA CHANGE] Switched to {persona_name} persona with session ID: {new_session_id}")
|
310 |
+
return f"Persona switched to {persona_name}"
|
311 |
+
```
|
312 |
+
|
313 |
+
**How it works**: This function allows the UI to update the agent's session ID.
|
314 |
+
|
315 |
+
**Debugging**: The "[PERSONA CHANGE]" prefix makes it easy to find this message in logs.
|
316 |
+
|
317 |
+
## 3. Update initialize_memory_from_zep in gradio_agent.py
|
318 |
+
|
319 |
+
```python
|
320 |
+
def initialize_memory_from_zep(session_id):
|
321 |
+
"""Initialize a LangChain memory object with history from Zep"""
|
322 |
+
try:
|
323 |
+
# Get history from Zep using the global session ID, not the parameter
|
324 |
+
zep = Zep(api_key=os.environ.get("ZEP_API_KEY"))
|
325 |
+
# Use global memory_session_id instead of the parameter
|
326 |
+
print(f"[MEMORY LOAD] Attempting to get memory for {current_persona} persona (ID: {memory_session_id})")
|
327 |
+
memory = zep.memory.get(session_id=memory_session_id)
|
328 |
+
|
329 |
+
# Create a conversation memory with the history
|
330 |
+
conversation_memory = ConversationBufferMemory(
|
331 |
+
memory_key="chat_history",
|
332 |
+
return_messages=True
|
333 |
+
)
|
334 |
+
|
335 |
+
if memory and memory.messages:
|
336 |
+
print(f"[MEMORY LOAD] Loading {len(memory.messages)} messages from Zep for {current_persona} persona")
|
337 |
+
|
338 |
+
# Add messages to the conversation memory
|
339 |
+
for msg in memory.messages:
|
340 |
+
if msg.role_type == "user":
|
341 |
+
conversation_memory.chat_memory.add_user_message(msg.content)
|
342 |
+
elif msg.role_type == "assistant":
|
343 |
+
conversation_memory.chat_memory.add_ai_message(msg.content)
|
344 |
+
|
345 |
+
print("[MEMORY LOAD] Successfully loaded message history from Zep")
|
346 |
+
else:
|
347 |
+
print("[MEMORY LOAD] No message history found in Zep, starting fresh")
|
348 |
+
|
349 |
+
return conversation_memory
|
350 |
+
except Exception as e:
|
351 |
+
print(f"[ERROR] Error loading history from Zep: {e}")
|
352 |
+
# Return empty memory if there's an error
|
353 |
+
return ConversationBufferMemory(
|
354 |
+
memory_key="chat_history",
|
355 |
+
return_messages=True
|
356 |
+
)
|
357 |
+
```
|
358 |
+
|
359 |
+
**How it works**: Uses the global `memory_session_id` instead of parameter and improves logging.
|
360 |
+
|
361 |
+
**Debugging**: Added "[MEMORY LOAD]" prefixes and includes persona name in logs for clarity.
|
362 |
+
|
363 |
+
## 4. Add Radio Button Handler in gradio_app.py
|
364 |
+
|
365 |
+
```python
|
366 |
+
# Near the top of the file, import the setter function
|
367 |
+
from gradio_agent import set_memory_session_id
|
368 |
+
|
369 |
+
# Add this with other imports
|
370 |
+
import json
|
371 |
+
import os
|
372 |
+
|
373 |
+
# Load persona session IDs
|
374 |
+
def load_persona_session_ids():
|
375 |
+
"""Load persona session IDs from JSON file"""
|
376 |
+
try:
|
377 |
+
with open("z_utils/persona_session_ids.json", "r") as f:
|
378 |
+
return json.load(f)
|
379 |
+
except Exception as e:
|
380 |
+
print(f"[ERROR] Failed to load persona_session_ids.json: {e}")
|
381 |
+
# Fallback to hardcoded values if file can't be loaded
|
382 |
+
return {
|
383 |
+
"Casual Fan": "241b3478c7634492abee9f178b5341cb",
|
384 |
+
"Super Fan": "dedcf5cb0d71475f976f4f66d98d6400"
|
385 |
+
}
|
386 |
+
|
387 |
+
# In the UI section where you define the radio button:
|
388 |
+
with gr.Row():
|
389 |
+
persona_selector = gr.Radio(
|
390 |
+
choices=["Casual Fan", "Super Fan"],
|
391 |
+
value="Casual Fan",
|
392 |
+
label="Select Fan Persona",
|
393 |
+
info="Choose which fan perspective to chat from"
|
394 |
+
)
|
395 |
+
|
396 |
+
# Define the handler function
|
397 |
+
def on_persona_change(persona_choice):
|
398 |
+
"""Handle changes to the persona selection"""
|
399 |
+
print(f"[UI EVENT] Persona selection changed to: {persona_choice}")
|
400 |
+
|
401 |
+
# Load session IDs from file
|
402 |
+
persona_ids = load_persona_session_ids()
|
403 |
+
|
404 |
+
# Verify the persona exists in our mapping
|
405 |
+
if persona_choice not in persona_ids:
|
406 |
+
print(f"[ERROR] Unknown persona selected: {persona_choice}")
|
407 |
+
return f"Error: Unknown persona '{persona_choice}'"
|
408 |
+
|
409 |
+
# Get the session ID for this persona
|
410 |
+
session_id = persona_ids[persona_choice]
|
411 |
+
print(f"[UI EVENT] Mapping {persona_choice} to session ID: {session_id}")
|
412 |
+
|
413 |
+
# Update the agent's session ID
|
414 |
+
feedback = set_memory_session_id(session_id, persona_choice)
|
415 |
+
|
416 |
+
# Return feedback to display in the UI
|
417 |
+
return feedback
|
418 |
+
|
419 |
+
# Connect the handler to the radio button
|
420 |
+
persona_selector.change(on_persona_change, persona_selector, gradio.outputs.Textbox())
|
421 |
+
```
|
422 |
+
|
423 |
+
**How it works**: Creates a radio button UI element, loads session IDs from file, and updates the agent's session ID when changed.
|
424 |
+
|
425 |
+
**Debugging**: Added "[UI EVENT]" prefixes to logs and returns feedback that will be displayed to the user.
|
426 |
+
|
427 |
+
## Debugging the Complete Pipeline
|
428 |
+
|
429 |
+
Here's how we'll debug the system when running:
|
430 |
+
|
431 |
+
1. **Test Persona Selection**:
|
432 |
+
- Start the app and check console logs for "[UI EVENT]" messages
|
433 |
+
- Verify "Persona selection changed to: X" messages appear
|
434 |
+
- Confirm "Mapping X to session ID: Y" shows correct session ID
|
435 |
+
- Look for "[PERSONA CHANGE]" confirmation message
|
436 |
+
|
437 |
+
2. **Verify Memory Loading**:
|
438 |
+
- Send a chat message after selecting a persona
|
439 |
+
- Check for "[MEMORY LOAD]" messages in the console
|
440 |
+
- Verify correct persona name and session ID in logs
|
441 |
+
- Confirm "Loading X messages from Zep for Y persona" appears
|
442 |
+
|
443 |
+
3. **Check Agent Response**:
|
444 |
+
- Observe the agent's reply in the chat window
|
445 |
+
- Verify it has contextual knowledge appropriate for the selected persona
|
446 |
+
- For Casual Fan: Expect basic team info responses
|
447 |
+
- For Super Fan: Expect more detailed, stats-heavy responses
|
448 |
+
|
449 |
+
4. **Error Testing**:
|
450 |
+
- If any issues arise, look for "[ERROR]" prefixed messages
|
451 |
+
- Test switching back and forth between personas
|
452 |
+
|
453 |
+
This structured debugging approach will help us verify that each step of the pipeline is working correctly.
|
454 |
+
```
|
455 |
+
|
gradio_agent.py
CHANGED
@@ -131,7 +131,20 @@ Do NOT use for any 49ers-specific questions.""",
|
|
131 |
)
|
132 |
]
|
133 |
|
134 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
135 |
|
136 |
# Create the memory manager
|
137 |
def get_memory(session_id):
|
@@ -167,9 +180,10 @@ chat_agent = RunnableWithMessageHistory(
|
|
167 |
def initialize_memory_from_zep(session_id):
|
168 |
"""Initialize a LangChain memory object with history from Zep"""
|
169 |
try:
|
170 |
-
# Get history from Zep
|
171 |
zep = Zep(api_key=os.environ.get("ZEP_API_KEY"))
|
172 |
-
|
|
|
173 |
memory = zep.memory.get(session_id=memory_session_id)
|
174 |
|
175 |
# Create a conversation memory with the history
|
@@ -179,7 +193,7 @@ def initialize_memory_from_zep(session_id):
|
|
179 |
)
|
180 |
|
181 |
if memory and memory.messages:
|
182 |
-
print(f"Loading {len(memory.messages)} messages from Zep for
|
183 |
|
184 |
# Add messages to the conversation memory
|
185 |
for msg in memory.messages:
|
@@ -188,13 +202,13 @@ def initialize_memory_from_zep(session_id):
|
|
188 |
elif msg.role_type == "assistant":
|
189 |
conversation_memory.chat_memory.add_ai_message(msg.content)
|
190 |
|
191 |
-
print("Successfully loaded message history from Zep")
|
192 |
else:
|
193 |
-
print("No message history found in Zep, starting fresh")
|
194 |
|
195 |
return conversation_memory
|
196 |
except Exception as e:
|
197 |
-
print(f"Error loading history from Zep: {e}")
|
198 |
# Return empty memory if there's an error
|
199 |
return ConversationBufferMemory(
|
200 |
memory_key="chat_history",
|
|
|
131 |
)
|
132 |
]
|
133 |
|
134 |
+
# Global variables are declared before functions that use them
|
135 |
+
# This creates clarity about shared state and follows the pattern:
|
136 |
+
# "declare shared state first, then define functions that interact with it"
|
137 |
+
# Change from constant to variable with default value
|
138 |
+
memory_session_id = "241b3478c7634492abee9f178b5341cb" # Default to Casual Fan
|
139 |
+
current_persona = "Casual Fan" # Track the persona name for debugging
|
140 |
+
|
141 |
+
def set_memory_session_id(new_session_id, persona_name):
|
142 |
+
"""Update the global memory_session_id variable when persona changes"""
|
143 |
+
global memory_session_id, current_persona
|
144 |
+
memory_session_id = new_session_id
|
145 |
+
current_persona = persona_name
|
146 |
+
print(f"[PERSONA CHANGE] Switched to {persona_name} persona with session ID: {new_session_id}")
|
147 |
+
return f"Persona switched to {persona_name}"
|
148 |
|
149 |
# Create the memory manager
|
150 |
def get_memory(session_id):
|
|
|
180 |
def initialize_memory_from_zep(session_id):
|
181 |
"""Initialize a LangChain memory object with history from Zep"""
|
182 |
try:
|
183 |
+
# Get history from Zep using the global session ID, not the parameter
|
184 |
zep = Zep(api_key=os.environ.get("ZEP_API_KEY"))
|
185 |
+
# Use global memory_session_id instead of the parameter
|
186 |
+
print(f"[MEMORY LOAD] Attempting to get memory for {current_persona} persona (ID: {memory_session_id})")
|
187 |
memory = zep.memory.get(session_id=memory_session_id)
|
188 |
|
189 |
# Create a conversation memory with the history
|
|
|
193 |
)
|
194 |
|
195 |
if memory and memory.messages:
|
196 |
+
print(f"[MEMORY LOAD] Loading {len(memory.messages)} messages from Zep for {current_persona} persona")
|
197 |
|
198 |
# Add messages to the conversation memory
|
199 |
for msg in memory.messages:
|
|
|
202 |
elif msg.role_type == "assistant":
|
203 |
conversation_memory.chat_memory.add_ai_message(msg.content)
|
204 |
|
205 |
+
print("[MEMORY LOAD] Successfully loaded message history from Zep")
|
206 |
else:
|
207 |
+
print("[MEMORY LOAD] No message history found in Zep, starting fresh")
|
208 |
|
209 |
return conversation_memory
|
210 |
except Exception as e:
|
211 |
+
print(f"[ERROR] Error loading history from Zep: {e}")
|
212 |
# Return empty memory if there's an error
|
213 |
return ConversationBufferMemory(
|
214 |
memory_key="chat_history",
|
gradio_app.py
CHANGED
@@ -1,6 +1,7 @@
|
|
1 |
import os
|
2 |
import uuid
|
3 |
import asyncio
|
|
|
4 |
import gradio as gr
|
5 |
from zep_cloud.client import AsyncZep
|
6 |
from zep_cloud.types import Message
|
@@ -15,7 +16,7 @@ from components.team_story_component import create_team_story_component
|
|
15 |
|
16 |
# Import the Gradio-compatible agent instead of the original agent
|
17 |
import gradio_agent
|
18 |
-
from gradio_agent import generate_response
|
19 |
|
20 |
# Import cache getter functions
|
21 |
from tools.game_recap import get_last_game_data
|
@@ -25,6 +26,20 @@ from tools.team_story import get_last_team_story_data
|
|
25 |
# --- IMPORTANT: Need access to the lists themselves to clear them --- #
|
26 |
from tools import game_recap, player_search, team_story
|
27 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
28 |
# Define CSS directly
|
29 |
css = """
|
30 |
/* Base styles */
|
@@ -322,16 +337,39 @@ with gr.Blocks(title="49ers FanAI Hub", css=css) as demo:
|
|
322 |
scale=6
|
323 |
)
|
324 |
submit_btn = gr.Button("Send", scale=1) # Renamed for clarity
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
325 |
|
326 |
# Handle persona selection changes - Step 4 (skeleton only)
|
327 |
def on_persona_change(persona_choice):
|
328 |
-
"""Handle changes to the persona selection radio button
|
329 |
-
print(f"Persona changed to: {persona_choice}")
|
330 |
-
|
331 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
332 |
|
333 |
# Set up persona change event listener
|
334 |
-
persona_radio.change(on_persona_change, inputs=[persona_radio], outputs=[])
|
335 |
|
336 |
# Define a combined function for user input and bot response
|
337 |
async def process_and_respond(message, history):
|
|
|
1 |
import os
|
2 |
import uuid
|
3 |
import asyncio
|
4 |
+
import json
|
5 |
import gradio as gr
|
6 |
from zep_cloud.client import AsyncZep
|
7 |
from zep_cloud.types import Message
|
|
|
16 |
|
17 |
# Import the Gradio-compatible agent instead of the original agent
|
18 |
import gradio_agent
|
19 |
+
from gradio_agent import generate_response, set_memory_session_id
|
20 |
|
21 |
# Import cache getter functions
|
22 |
from tools.game_recap import get_last_game_data
|
|
|
26 |
# --- IMPORTANT: Need access to the lists themselves to clear them --- #
|
27 |
from tools import game_recap, player_search, team_story
|
28 |
|
29 |
+
# Load persona session IDs
|
30 |
+
def load_persona_session_ids():
|
31 |
+
"""Load persona session IDs from JSON file"""
|
32 |
+
try:
|
33 |
+
with open("z_utils/persona_session_ids.json", "r") as f:
|
34 |
+
return json.load(f)
|
35 |
+
except Exception as e:
|
36 |
+
print(f"[ERROR] Failed to load persona_session_ids.json: {e}")
|
37 |
+
# Fallback to hardcoded values if file can't be loaded
|
38 |
+
return {
|
39 |
+
"Casual Fan": "241b3478c7634492abee9f178b5341cb",
|
40 |
+
"Super Fan": "dedcf5cb0d71475f976f4f66d98d6400"
|
41 |
+
}
|
42 |
+
|
43 |
# Define CSS directly
|
44 |
css = """
|
45 |
/* Base styles */
|
|
|
337 |
scale=6
|
338 |
)
|
339 |
submit_btn = gr.Button("Send", scale=1) # Renamed for clarity
|
340 |
+
|
341 |
+
# Feedback area for persona changes
|
342 |
+
persona_feedback = gr.Textbox(
|
343 |
+
label="Persona Status",
|
344 |
+
value="Current Persona: Casual Fan",
|
345 |
+
interactive=False
|
346 |
+
)
|
347 |
|
348 |
# Handle persona selection changes - Step 4 (skeleton only)
|
349 |
def on_persona_change(persona_choice):
|
350 |
+
"""Handle changes to the persona selection radio button"""
|
351 |
+
print(f"[UI EVENT] Persona selection changed to: {persona_choice}")
|
352 |
+
|
353 |
+
# Load session IDs from file
|
354 |
+
persona_ids = load_persona_session_ids()
|
355 |
+
|
356 |
+
# Verify the persona exists in our mapping
|
357 |
+
if persona_choice not in persona_ids:
|
358 |
+
print(f"[ERROR] Unknown persona selected: {persona_choice}")
|
359 |
+
return f"Error: Unknown persona '{persona_choice}'"
|
360 |
+
|
361 |
+
# Get the session ID for this persona
|
362 |
+
session_id = persona_ids[persona_choice]
|
363 |
+
print(f"[UI EVENT] Mapping {persona_choice} to session ID: {session_id}")
|
364 |
+
|
365 |
+
# Update the agent's session ID
|
366 |
+
feedback = set_memory_session_id(session_id, persona_choice)
|
367 |
+
|
368 |
+
# Return feedback to display in the UI
|
369 |
+
return feedback
|
370 |
|
371 |
# Set up persona change event listener
|
372 |
+
persona_radio.change(on_persona_change, inputs=[persona_radio], outputs=[persona_feedback])
|
373 |
|
374 |
# Define a combined function for user input and bot response
|
375 |
async def process_and_respond(message, history):
|