Spaces:
Sleeping
Sleeping
Add comprehensive debrief functionality
Browse files- src/streamlit_app.py +64 -10
src/streamlit_app.py
CHANGED
|
@@ -60,6 +60,10 @@ if 'setup_complete' not in st.session_state:
|
|
| 60 |
st.session_state.setup_complete = False
|
| 61 |
if 'system_message' not in st.session_state:
|
| 62 |
st.session_state.system_message = ""
|
|
|
|
|
|
|
|
|
|
|
|
|
| 63 |
|
| 64 |
# Main page header
|
| 65 |
st.title("Attachment Style Roleplay Simulator")
|
|
@@ -146,6 +150,14 @@ with st.form("setup_form"):
|
|
| 146 |
submitted = st.form_submit_button("Start Simulation")
|
| 147 |
|
| 148 |
if submitted:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 149 |
# Prepare system message with simulation parameters
|
| 150 |
st.session_state.system_message = f"""
|
| 151 |
You are a conversational partner helping someone practice difficult conversations.
|
|
@@ -154,11 +166,30 @@ with st.form("setup_form"):
|
|
| 154 |
Respond in a {tone} manner. Help them achieve their goals: {goals}
|
| 155 |
|
| 156 |
Maintain a realistic conversation while providing gentle guidance when needed.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 157 |
"""
|
| 158 |
|
| 159 |
-
# Reset message history
|
| 160 |
st.session_state.messages = []
|
| 161 |
st.session_state.setup_complete = True
|
|
|
|
| 162 |
st.rerun()
|
| 163 |
|
| 164 |
# Display status or chat interface
|
|
@@ -171,7 +202,28 @@ else:
|
|
| 171 |
st.markdown(message["content"])
|
| 172 |
|
| 173 |
# Chat input
|
| 174 |
-
if prompt := st.chat_input("Type your message here
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 175 |
# Add user message to chat history
|
| 176 |
st.session_state.messages.append({"role": "user", "content": prompt})
|
| 177 |
|
|
@@ -182,14 +234,6 @@ else:
|
|
| 182 |
# Get AI response
|
| 183 |
with st.chat_message("assistant"):
|
| 184 |
with st.spinner("Thinking..."):
|
| 185 |
-
# Construct conversation history
|
| 186 |
-
messages = []
|
| 187 |
-
if st.session_state.system_message:
|
| 188 |
-
messages.append({"role": "system", "content": st.session_state.system_message})
|
| 189 |
-
for msg in st.session_state.messages:
|
| 190 |
-
messages.append({"role": msg["role"], "content": msg["content"]})
|
| 191 |
-
|
| 192 |
-
# Get completion
|
| 193 |
try:
|
| 194 |
message = c.messages.create(
|
| 195 |
model="claude-3-opus-20240229",
|
|
@@ -212,6 +256,16 @@ else:
|
|
| 212 |
st.error(f"Error getting AI response: {str(e)}")
|
| 213 |
st.error("Please try again or contact support if the issue persists.")
|
| 214 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 215 |
# Footer
|
| 216 |
st.markdown("---")
|
| 217 |
st.markdown(
|
|
|
|
| 60 |
st.session_state.setup_complete = False
|
| 61 |
if 'system_message' not in st.session_state:
|
| 62 |
st.session_state.system_message = ""
|
| 63 |
+
if 'simulation_params' not in st.session_state:
|
| 64 |
+
st.session_state.simulation_params = {}
|
| 65 |
+
if 'in_debrief' not in st.session_state:
|
| 66 |
+
st.session_state.in_debrief = False
|
| 67 |
|
| 68 |
# Main page header
|
| 69 |
st.title("Attachment Style Roleplay Simulator")
|
|
|
|
| 150 |
submitted = st.form_submit_button("Start Simulation")
|
| 151 |
|
| 152 |
if submitted:
|
| 153 |
+
# Store simulation parameters for debrief
|
| 154 |
+
st.session_state.simulation_params = {
|
| 155 |
+
"attachment_style": attachment_style,
|
| 156 |
+
"scenario": scenario,
|
| 157 |
+
"tone": tone,
|
| 158 |
+
"goals": goals
|
| 159 |
+
}
|
| 160 |
+
|
| 161 |
# Prepare system message with simulation parameters
|
| 162 |
st.session_state.system_message = f"""
|
| 163 |
You are a conversational partner helping someone practice difficult conversations.
|
|
|
|
| 166 |
Respond in a {tone} manner. Help them achieve their goals: {goals}
|
| 167 |
|
| 168 |
Maintain a realistic conversation while providing gentle guidance when needed.
|
| 169 |
+
|
| 170 |
+
IMPORTANT: If the user types "debrief" or "end roleplay", switch to debrief mode using this format:
|
| 171 |
+
|
| 172 |
+
📝 DEBRIEF SUMMARY
|
| 173 |
+
|
| 174 |
+
**Emotional Arc**: [Analyze how the user shifted emotionally during the interaction, noting moments of courage, freeze, protest, backtracking, or people-pleasing]
|
| 175 |
+
|
| 176 |
+
**Goal Alignment**: [Reflect on how well they stayed aligned with their stated goal. Note small wins and struggles, affirm effort and awareness]
|
| 177 |
+
|
| 178 |
+
**Attachment Insight**: [Offer one insight based on their {attachment_style} attachment style. Normalize the response as protective. Gently suggest a next growth step without shaming]
|
| 179 |
+
|
| 180 |
+
**Practical Tool**: [Offer a brief NVC or DBT tool they could try next time (e.g., needs check-in, opposite action, self-validation, distress tolerance)]
|
| 181 |
+
|
| 182 |
+
**Bold Reframe**: [Offer one bold, loving sentence they might say if they trusted their relational worth]
|
| 183 |
+
|
| 184 |
+
**Journaling Prompt**: [Suggest one reflective question or embodied inquiry for integration]
|
| 185 |
+
|
| 186 |
+
Speak warmly and with psychological precision, like an emotionally attuned therapist.
|
| 187 |
"""
|
| 188 |
|
| 189 |
+
# Reset message history and state
|
| 190 |
st.session_state.messages = []
|
| 191 |
st.session_state.setup_complete = True
|
| 192 |
+
st.session_state.in_debrief = False
|
| 193 |
st.rerun()
|
| 194 |
|
| 195 |
# Display status or chat interface
|
|
|
|
| 202 |
st.markdown(message["content"])
|
| 203 |
|
| 204 |
# Chat input
|
| 205 |
+
if prompt := st.chat_input("Type your message here (type 'debrief' or 'end roleplay' when ready to reflect)"):
|
| 206 |
+
# Check for debrief trigger
|
| 207 |
+
if prompt.lower() in ["debrief", "end roleplay"] and not st.session_state.in_debrief:
|
| 208 |
+
st.session_state.in_debrief = True
|
| 209 |
+
# Construct conversation summary
|
| 210 |
+
conversation_summary = "\n".join([
|
| 211 |
+
f"{msg['role']}: {msg['content']}"
|
| 212 |
+
for msg in st.session_state.messages
|
| 213 |
+
])
|
| 214 |
+
|
| 215 |
+
# Add debrief request to messages
|
| 216 |
+
prompt = f"""Please provide a therapeutic debrief for this roleplay session using:
|
| 217 |
+
|
| 218 |
+
Attachment Style: {st.session_state.simulation_params['attachment_style']}
|
| 219 |
+
Scenario: {st.session_state.simulation_params['scenario']}
|
| 220 |
+
Goals: {st.session_state.simulation_params['goals']}
|
| 221 |
+
AI Tone: {st.session_state.simulation_params['tone']}
|
| 222 |
+
|
| 223 |
+
Conversation Summary:
|
| 224 |
+
{conversation_summary}
|
| 225 |
+
"""
|
| 226 |
+
|
| 227 |
# Add user message to chat history
|
| 228 |
st.session_state.messages.append({"role": "user", "content": prompt})
|
| 229 |
|
|
|
|
| 234 |
# Get AI response
|
| 235 |
with st.chat_message("assistant"):
|
| 236 |
with st.spinner("Thinking..."):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 237 |
try:
|
| 238 |
message = c.messages.create(
|
| 239 |
model="claude-3-opus-20240229",
|
|
|
|
| 256 |
st.error(f"Error getting AI response: {str(e)}")
|
| 257 |
st.error("Please try again or contact support if the issue persists.")
|
| 258 |
|
| 259 |
+
# Add restart button after debrief
|
| 260 |
+
if st.session_state.in_debrief:
|
| 261 |
+
if st.button("Start New Roleplay"):
|
| 262 |
+
st.session_state.setup_complete = False
|
| 263 |
+
st.session_state.in_debrief = False
|
| 264 |
+
st.session_state.messages = []
|
| 265 |
+
st.session_state.system_message = ""
|
| 266 |
+
st.session_state.simulation_params = {}
|
| 267 |
+
st.rerun()
|
| 268 |
+
|
| 269 |
# Footer
|
| 270 |
st.markdown("---")
|
| 271 |
st.markdown(
|