Spaces:
Sleeping
Sleeping
File size: 8,264 Bytes
28295d6 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 |
import os
import streamlit as st
import requests
import uuid
import time
from datetime import datetime, timedelta
# Get the API URL from environment variable
API_URL = os.getenv('API_URL')
if not API_URL:
st.error("API_URL environment variable is not set. Please configure the API URL.")
st.stop()
# Set session timeout to 15 minutes
SESSION_TIMEOUT = 15 * 60 # 15 minutes in seconds
# Set API request timeout to 2 minutes for Render (cold starts can be slow)
API_TIMEOUT = 120 # seconds
st.title("Longevity Assistant")
# Initialize session state
if "messages" not in st.session_state:
st.session_state.messages = []
st.session_state.session_id = str(uuid.uuid4())
st.session_state.last_activity = datetime.now()
# Get welcome message from API
try:
with st.spinner("Connecting to server..."):
welcome_response = requests.get(f"{API_URL}/welcome", timeout=API_TIMEOUT)
if welcome_response.status_code == 200:
welcome_data = welcome_response.json()
# Add assistant welcome message to chat history
st.session_state.messages.append({
"role": "assistant",
"content": welcome_data["welcome_message"],
"links": []
})
# Store suggested questions
st.session_state.suggested_questions = welcome_data.get("suggested_questions", [])
else:
raise Exception(f"Server returned status code: {welcome_response.status_code}")
except requests.Timeout:
st.error("Server is taking too long to respond. This might be due to a cold start. Please refresh the page.")
st.session_state.messages.append({
"role": "assistant",
"content": "The server is warming up. Please wait a moment and refresh the page.",
"links": []
})
st.session_state.suggested_questions = []
except Exception as e:
st.error(f"Error connecting to the server: {str(e)}")
st.session_state.messages.append({
"role": "assistant",
"content": "Welcome to the Longevity Assistant! How can I help you today?",
"links": []
})
st.session_state.suggested_questions = []
elif "last_activity" in st.session_state:
# Check if session has expired
time_inactive = (datetime.now() - st.session_state.last_activity).total_seconds()
if time_inactive > SESSION_TIMEOUT:
# Reset session
st.session_state.messages = []
st.session_state.session_id = str(uuid.uuid4())
# Update last activity time
st.session_state.last_activity = datetime.now()
# Display chat messages
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.write(message["content"])
if "links" in message and message["links"]:
for link in message["links"]:
st.markdown(f"[{link['name']}]({link['url']})")
# Display suggested questions as buttons (only if no messages from user yet)
if len(st.session_state.messages) == 1 and hasattr(st.session_state, 'suggested_questions'):
st.write("Try asking about:")
cols = st.columns(2)
for i, question in enumerate(st.session_state.suggested_questions):
with cols[i % 2]:
if st.button(question, key=f"suggested_{i}"):
# Add user message to chat history
st.session_state.messages.append({"role": "user", "content": question})
# Display user message immediately
with st.chat_message("user"):
st.write(question)
# Process the question (reusing the chat input logic)
with st.chat_message("assistant"):
with st.spinner("Thinking..."):
try:
response = requests.post(
f"{API_URL}/chat",
json={"session_id": st.session_state.session_id, "message": question},
timeout=API_TIMEOUT
)
if response.status_code == 200:
response_data = response.json()
# Store response for history
st.session_state.messages.append({
"role": "assistant",
"content": response_data["response"],
"links": response_data["links"]
})
# Display the response
st.write(response_data["response"])
if response_data["links"]:
for link in response_data["links"]:
st.markdown(f"[{link['name']}]({link['url']})")
else:
st.error(f"Error: {response.status_code}")
st.session_state.messages.append({
"role": "assistant",
"content": "Sorry, I encountered an error while processing your request.",
"links": []
})
except Exception as e:
st.error(f"Error connecting to the server: {str(e)}")
st.session_state.messages.append({
"role": "assistant",
"content": "Sorry, I'm having trouble connecting to the server.",
"links": []
})
# Force a rerun to update the UI
st.rerun()
# Chat input
if prompt := st.chat_input():
# Add user message to chat history
st.session_state.messages.append({"role": "user", "content": prompt})
# Display user message immediately
with st.chat_message("user"):
st.write(prompt)
# Display assistant "thinking" message with spinner
with st.chat_message("assistant"):
with st.spinner("Thinking..."):
# Get bot response
try:
response = requests.post(
f"{API_URL}/chat",
json={"session_id": st.session_state.session_id, "message": prompt},
timeout=API_TIMEOUT
)
if response.status_code == 200:
response_data = response.json()
# Store response for history
st.session_state.messages.append({
"role": "assistant",
"content": response_data["response"],
"links": response_data["links"]
})
# Display the response
st.write(response_data["response"])
if response_data["links"]:
for link in response_data["links"]:
st.markdown(f"[{link['name']}]({link['url']})")
else:
st.error(f"Error: {response.status_code}")
st.session_state.messages.append({
"role": "assistant",
"content": "Sorry, I encountered an error while processing your request.",
"links": []
})
except Exception as e:
st.error(f"Error connecting to the server: {str(e)}")
st.session_state.messages.append({
"role": "assistant",
"content": "Sorry, I'm having trouble connecting to the server.",
"links": []
}) |