Spaces:
Sleeping
Sleeping
File size: 5,487 Bytes
0628cbb 226da61 0628cbb 40b71eb 0628cbb 1ab74f5 8dfb503 1ab74f5 8dfb503 069e614 4a84d58 1ab74f5 8dfb503 1ab74f5 4a84d58 8bfb7cc 4a84d58 24f8abc 4a84d58 24f8abc 4a84d58 8dfb503 0d46e19 1ab74f5 4a84d58 8dfb503 4a84d58 1ab74f5 0d46e19 8dfb503 4a84d58 24f8abc 8bfb7cc 1ab74f5 8bfb7cc 8dfb503 4a84d58 8bfb7cc 5d2245e 4a84d58 069e614 226da61 4a84d58 069e614 d2770d0 069e614 4a84d58 5d2245e 226da61 4a84d58 069e614 58224c2 4a84d58 8bfb7cc 8dfb503 4a84d58 069e614 17a737c 4a84d58 727124b 4a84d58 727124b 8ecb645 4a84d58 8ecb645 727124b 58224c2 8bfb7cc 0628cbb 17a737c 069e614 8ecb645 069e614 4a84d58 069e614 4a84d58 069e614 4a84d58 069e614 4a84d58 069e614 17a737c e36ffb0 17a737c |
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 |
import streamlit as st
import time
# FIRST: Set page config before ANY other Streamlit command
st.set_page_config(page_title="Indian Spiritual RAG")
# Initialize ALL session state variables right at the beginning
if 'initialized' not in st.session_state:
st.session_state.initialized = False
if 'model' not in st.session_state:
st.session_state.model = None
if 'tokenizer' not in st.session_state:
st.session_state.tokenizer = None
if 'last_query' not in st.session_state:
st.session_state.last_query = ""
if 'submit_clicked' not in st.session_state:
st.session_state.submit_clicked = False
if 'init_time' not in st.session_state:
st.session_state.init_time = None
if 'query_answered' not in st.session_state:
st.session_state.query_answered = False # Tracks if the query has been answered
# THEN: Import your modules
from rag_engine import process_query, load_model
from utils import setup_all_auth
# Create a placeholder for our initialization message
init_message = st.empty()
# Custom styling (CSS)
st.markdown("""
<style>
/* Styling for the main title */
.main-title {
font-size: 2.5rem;
color: #FF5722;
text-align: center;
margin-bottom: 1rem;
}
/* Styling for the submit button */
.stButton>button {
border: 2px solid #FF5722 !important;
border-radius: 8px !important;
}
/* β
Initially green border */
div[data-baseweb="input"] {
border: 2px solid #4CAF50 !important;
border-radius: 8px !important;
transition: border 0.3s ease-in-out;
}
/* π΄ Change to red while typing */
div[data-baseweb="input"]:focus-within {
border: 2px solid #FF5722 !important;
}
/* β
Revert to green after submission */
div.answered-query {
border: 2px solid #4CAF50 !important;
}
</style>
<div class="main-title">Indian Spiritual Texts Q&A</div>
""", unsafe_allow_html=True)
# Handle initialization and success message timing
if not st.session_state.initialized:
init_message.info("Hang in there! We are setting the system up for you. π")
try:
# Setup authentication
setup_all_auth()
# Load the model
load_model()
# Mark as initialized and record time
st.session_state.initialized = True
st.session_state.init_time = time.time()
# Show success message
init_message.success("System initialized successfully!")
# Force rerun to start the timer for removing the message
time.sleep(0.1) # Small delay to ensure message appears
st.rerun()
except Exception as e:
init_message.error(f"Error initializing: {str(e)}")
# Check if we need to hide the success message (after initialization)
elif st.session_state.init_time is not None:
elapsed_time = time.time() - st.session_state.init_time
if elapsed_time >= 2.0:
init_message.empty()
st.session_state.init_time = None # Reset timer after clearing
# Handle form submission - ensures input is cleared and focus is removed
if 'form_submitted' not in st.session_state:
st.session_state.form_submitted = False
# Function to handle form submission
def handle_form_submit():
if st.session_state.query_input:
st.session_state.last_query = st.session_state.query_input
st.session_state.submit_clicked = True
st.session_state.form_submitted = True
st.session_state.query_answered = False # Mark as not yet answered
# Create a form for handling the user input
with st.form(key="query_form"):
# Apply CSS class dynamically based on submission status
css_class = "answered-query" if st.session_state.query_answered else ""
query = st.text_input(
"Ask your question:", key="query_input", value="", placeholder="Type here...",
)
# Submit button within the form
submit_button = st.form_submit_button("Get Answer", on_click=handle_form_submit)
# Force a rerun after form submission to reset the input field and focus
if st.session_state.form_submitted:
st.session_state.form_submitted = False
st.rerun()
# Display the current question if there is one
if st.session_state.last_query:
st.markdown("### Current Question:")
st.info(st.session_state.last_query)
# Sliders for customization
col1, col2 = st.columns(2)
with col1:
top_k = st.slider("Number of sources:", 3, 10, 5)
with col2:
word_limit = st.slider("Word limit:", 50, 500, 200)
# Only process the query if explicitly submitted
if st.session_state.submit_clicked and st.session_state.last_query:
# Reset the submit flag
st.session_state.submit_clicked = False
# Process the query
with st.spinner("Processing your question..."):
try:
result = process_query(st.session_state.last_query, top_k=top_k, word_limit=word_limit)
st.subheader("Answer:")
st.write(result["answer_with_rag"])
st.subheader("Sources:")
for citation in result["citations"].split("\n"):
st.write(citation)
# Mark the query as answered
st.session_state.query_answered = True
except Exception as e:
st.error(f"Error processing query: {str(e)}")
# Add helpful information
st.markdown("---")
st.markdown("""
### About this app
This application uses a Retrieval-Augmented Generation (RAG) system to answer questions about Indian spiritual texts.
It searches through a database of texts to find relevant passages and generates answers based on those passages.
""") |