import streamlit as st
import getsession
import io
import base64
import json
import llm_chain
from PIL import Image
from datetime import datetime
# Initialize Snowflake session
session = getsession.create_session_object()
st.set_page_config(layout="wide") # Wide layout
# Function to retrieve and encode PDF files from Snowflake
def get_pdf_base64(relative_path):
try:
session = getsession.create_session_object()
stage_path = "@schema.stage"
file_stream = session.file.get_stream(f"{stage_path}/{relative_path}")
pdf_bytes = io.BytesIO(file_stream.read())
file_stream.close()
return base64.b64encode(pdf_bytes.getvalue()).decode("utf-8")
except Exception as e:
st.error(f"Error retrieving PDF: {e}")
return None
# Function to display PDF in iframe
def display_pdf(pdf_base64):
if pdf_base64:
pdf_display = f'<iframe src="data:application/pdf;base64,{pdf_base64}" width="800" height="1000"></iframe>'
st.markdown(pdf_display, unsafe_allow_html=True)
# Load icons & logo
USER_ICON = Image.open("images/person.png")
AI_ICON = Image.open("images/bot.png")
org_logo = Image.open("images/dfpcl_logo_final.png")
# **Top Bar UI**
def write_top_bar():
st.markdown(
"""
<style>
.top-bar {
background-color: #f0f2f6;
padding: 15px;
border-radius: 10px;
text-align: center;
font-size: 20px;
font-weight: bold;
color: #333333;
box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.1);
}
</style>
<div class="top-bar">
Welcome to βοΈ, your virtual assistant!
</div>
""",
unsafe_allow_html=True
)
st.markdown(" " * 3)
write_top_bar()
# **Initialize Session State Variables**
if "messages" not in st.session_state:
st.session_state.messages = []
if "conversation_history" not in st.session_state:
st.session_state.conversation_history = []
if "session_id" not in st.session_state:
st.session_state.session_id = str(datetime.now().strftime("%Y%m%d%H%M%S"))
if "selected_pdf" not in st.session_state:
st.session_state.selected_pdf = None
if "pdf_base64" not in st.session_state:
st.session_state.pdf_base64 = None
if "doc_selector" not in st.session_state:
st.session_state.doc_selector = None # To store radio button selection
# **Sidebar UI**
with st.sidebar:
st.image(org_logo, use_container_width=True)
if st.button("π New Chat", use_container_width=True):
st.session_state.messages = []
st.session_state.conversation_history = []
st.session_state.session_id = str(datetime.now().strftime("%Y%m%d%H%M%S"))
st.session_state.selected_pdf = None
st.session_state.pdf_base64 = None
st.session_state.doc_selector = None
st.rerun()
# **Chat Input**
query = st.chat_input("Ask a question:")
if query:
st.session_state.messages.append({"content": query, "is_user": True})
with st.chat_message("user"):
st.write(query)
try:
# Retrieve the last 3 conversation messages for context
conversation_history = st.session_state.conversation_history[-3:] if st.session_state.conversation_history else []
with st.spinner("β³ Generating response..."):
result, query_type = llm_chain.build_chain(query, session)
# Store conversation history
st.session_state.conversation_history.append((query, result))
if query_type == "procedure_search":
st.write("### Relevant Documents:")
# **Use radio button instead of button for document selection**
selected_doc = st.radio(
"Select a document:",
result,
key="doc_selector"
)
# π Debugging: Print selected document before updating state
st.write(f"Currently Selected Doc: {selected_doc}")
print(f"Selected PDF (Before Update): {st.session_state.get('selected_pdf', None)}")
# Only update session state if selection changes
if selected_doc and selected_doc != st.session_state.get("selected_pdf"):
st.session_state.selected_pdf = selected_doc
st.session_state.pdf_base64 = get_pdf_base64(selected_doc)
print(f"Selected PDF (After Update): {st.session_state.selected_pdf}")
st.rerun() # Refresh UI
# **Display the Selected PDF**
if st.session_state.selected_pdf:
st.write(f"### Viewing: {st.session_state.selected_pdf}")
display_pdf(st.session_state.pdf_base64)
else:
st.write("### Answer:")
st.write(result)
except Exception as e:
st.error(f"β Error processing query: {e}")
finally:
if 'session' in locals():
session.close()
print("β
Snowpark session closed successfully.")
In the provided code, when the radio buttons appear on the screen, clicking the button should display the PDF. However, the screen goes blank instead, and no errors are shown. Please help resolve this issue.