src / render_app.py
msz-archive's picture
Upload folder using huggingface_hub
28295d6 verified
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": []
})