File size: 4,618 Bytes
0628cbb
226da61
0628cbb
40b71eb
0628cbb
 
17d5dd8
8dfb503
 
1ab74f5
 
 
 
8dfb503
 
 
 
4a84d58
9ac9057
1ab74f5
 
 
 
8dfb503
9ac9057
1ab74f5
 
9ac9057
8bfb7cc
 
9ac9057
 
0d46e19
1ab74f5
4a84d58
8dfb503
4a84d58
 
9ac9057
0d46e19
8dfb503
4a84d58
9ac9057
 
4a84d58
24f8abc
17d5dd8
9ac9057
17d5dd8
9ac9057
538e101
9ac9057
17d5dd8
9ac9057
 
 
 
17d5dd8
8bfb7cc
 
 
9ac9057
8bfb7cc
8dfb503
4a84d58
8bfb7cc
5d2245e
226da61
d2770d0
9ac9057
226da61
9ac9057
 
8bfb7cc
8dfb503
4a84d58
727124b
 
 
 
 
9ac9057
 
 
ca9cc5e
9ac9057
538e101
 
ca9cc5e
9ac9057
8ecb645
9ac9057
727124b
 
9ac9057
ca9cc5e
b8a9661
538e101
8bfb7cc
 
0628cbb
17a737c
 
 
 
 
 
 
b8a9661
069e614
b8a9661
4a84d58
069e614
 
 
4a84d58
069e614
 
4a84d58
069e614
 
 
4a84d58
b8a9661
9ac9057
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
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
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 'query_answered' not in st.session_state:
    st.session_state.query_answered = False  # Tracks if query was answered

# THEN: Import your modules
from rag_engine import process_query, load_model
from utils import setup_all_auth

# Create a placeholder for initialization message
init_message = st.empty()

# βœ… Custom CSS for border & button fixes
st.markdown("""
<style>
/* βœ… Green border by default */
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;
}

/* βœ… Ensure it turns green again AFTER submission */
.answered div[data-baseweb="input"] {
    border: 2px solid #4CAF50 !important;
}

/* βœ… Fully green button */
.stButton>button {
    background-color: #4CAF50 !important;
    color: white !important;
    border: none !important;
    border-radius: 8px !important;
    padding: 8px 16px;
    font-size: 16px;
    font-weight: bold;
    cursor: pointer;
}
</style>
""", unsafe_allow_html=True)

# Handle initialization
if not st.session_state.initialized:
    init_message.info("Hang in there! We are setting the system up for you. 😊")

    try:
        setup_all_auth()
        load_model()
        st.session_state.initialized = True
        st.session_state.query_answered = False  # Reset query state
        init_message.success("System initialized successfully!")
        time.sleep(1)
        init_message.empty()
    except Exception as e:
        init_message.error(f"Error initializing: {str(e)}")

# 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.query_answered = True  # βœ… Ensure it resets to green
        st.session_state.query_input = ""  # βœ… Clear input
        st.experimental_rerun()  # βœ… Refresh UI properly

# βœ… Wrap the text input inside a div for styling
css_class = "answered" if st.session_state.query_answered else ""
st.markdown(f'<div class="{css_class}">', unsafe_allow_html=True)

# βœ… Create a form for user input
with st.form(key="query_form"):
    query = st.text_input("Ask your question:", key="query_input", placeholder="Type here...")
    submit_button = st.form_submit_button("Get Answer", on_click=handle_form_submit)

st.markdown("</div>", unsafe_allow_html=True)  # βœ… Close styling div

# βœ… Display the last question after submission
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)

# βœ… Process the query if submitted
if st.session_state.submit_clicked and st.session_state.last_query:
    st.session_state.submit_clicked = False  # Reset flag

    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)

            st.session_state.query_answered = True  # βœ… Mark query as answered
            st.experimental_rerun()  # βœ… Proper rerun to refresh UI

        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.
""")