rag_hydro / streamlit.py
baderanas's picture
show context
8646d16 verified
import streamlit as st
import logging
import asyncio
from contextlib import asynccontextmanager
from app import QueryRequest # Import the request model
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# Set page config
st.set_page_config(page_title="Certification Chat", layout="wide")
st.title("πŸŽ“ Hydrogen Certification Chat Assistant")
# Create a function to handle the async call
async def async_query(query_text):
from app import handle_query # Import here to avoid circular imports
request = QueryRequest(query=query_text)
return await handle_query(request)
# Function to run async code in Streamlit
def run_async(coroutine):
try:
loop = asyncio.get_event_loop()
except RuntimeError:
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
return loop.run_until_complete(coroutine)
# User input
user_input = st.text_area("πŸ’¬ Enter your question about hydrogen certification:", height=100)
if user_input:
try:
# Use try-except to handle errors
with st.spinner("Processing your query..."):
# Run the async function
result = run_async(async_query(user_input))
# Display output in tabs
st.markdown("## 🧠 Response")
# Certification info
st.subheader(f"Detected Certification: {result['certification']}")
# Create tabs for answers and contexts
tab1, tab2, tab3, tab4 = st.tabs([
"Answers",
"Context Details",
"Raw Context (Dot Chunking)",
"Raw Context (Hybrid Chunking)"
])
with tab1:
st.markdown("### Basic Chunking Answer:")
st.write(result["certif_index"])
st.markdown("### Hybrid Chunking Answer:")
st.write(result["certification_index"])
with tab2:
col1, col2 = st.columns(2)
with col1:
st.markdown("### Basic Chunking Context Sources:")
for i, context_item in enumerate(result["context_certif"]):
with st.expander(f"Source {i+1}"):
st.write(context_item)
with col2:
st.markdown("### Hybrid Chunking Context Sources:")
for i, context_item in enumerate(result["context_certifications"]):
with st.expander(f"Source {i+1}"):
st.write(context_item)
with tab3:
st.markdown("### Raw Context (Dot Chunking):")
for i, chunk in enumerate(result["context_certif"]):
st.text_area(f"Chunk {i+1}", chunk, height=150)
with tab4:
st.markdown("### Raw Context (Hybrid Chunking):")
for i, chunk in enumerate(result["context_certifications"]):
st.text_area(f"Chunk {i+1}", chunk, height=150)
# Add a section for feedback
st.markdown("---")
st.markdown("### Feedback")
feedback = st.radio(
"How helpful was this response?",
["Very helpful", "Somewhat helpful", "Not helpful"]
)
feedback_text = st.text_area("Additional feedback (optional):", height=100)
if st.button("Submit Feedback"):
st.success("Thank you for your feedback!")
except Exception as e:
st.error(f"An error occurred: {str(e)}")
logger.error(f"Error processing query: {e}", exc_info=True)
else:
st.info("πŸ‘† Enter your question about hydrogen certifications above to get started!")
# Add sidebar with information
with st.sidebar:
st.markdown("## About")
st.markdown("""
This tool helps answer questions about hydrogen certification standards using
a Retrieval-Augmented Generation (RAG) system.
The system:
1. Classifies which certification your question is about
2. Optimizes your query
3. Retrieves relevant information
4. Generates a precise answer
""")
st.markdown("## Available Certifications")
try:
from app import list_certifications
certifications = run_async(list_certifications())
for cert in certifications:
st.markdown(f"- {cert}")
except Exception as e:
st.warning("Could not load certification list")