Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import os | |
| from utils.pdf_utils import PDFProcessor | |
| from utils.embeddings_utils import EmbeddingsManager | |
| from utils.qa_utils import QASystem | |
| from dotenv import load_dotenv | |
| import openai | |
| def initialize_session_state(): | |
| if 'pdf_processor' not in st.session_state: | |
| st.session_state['pdf_processor'] = None | |
| if 'embeddings_manager' not in st.session_state: | |
| st.session_state['embeddings_manager'] = None | |
| if 'qa_system' not in st.session_state: | |
| st.session_state['qa_system'] = None | |
| if 'processed_pdfs' not in st.session_state: | |
| st.session_state['processed_pdfs'] = set() | |
| if 'all_text_chunks' not in st.session_state: | |
| st.session_state['all_text_chunks'] = [] | |
| def main(): | |
| load_dotenv() | |
| st.set_page_config(page_title="AI-Powered PDF Assistant", layout="wide") | |
| initialize_session_state() | |
| # Header Section | |
| st.markdown( | |
| """ | |
| <style> | |
| .main-header { | |
| font-size: 2.5rem; | |
| color: #1F77B4; | |
| text-align: center; | |
| margin-bottom: 1rem; | |
| } | |
| .sub-header { | |
| font-size: 1.25rem; | |
| color: #555; | |
| text-align: center; | |
| margin-bottom: 2rem; | |
| } | |
| </style> | |
| <div class="main-header">π AI-Powered PDF Assistant</div> | |
| <div class="sub-header">Upload, Analyze, and Interact with Your Documents</div> | |
| """, | |
| unsafe_allow_html=True | |
| ) | |
| # Navigation Menu | |
| selected_page = st.sidebar.radio( | |
| "Navigate", ["Upload PDFs", "Ask Questions", "About"] | |
| ) | |
| api_key = os.getenv("OPENAI_API_KEY") | |
| if not api_key: | |
| st.sidebar.error("OpenAI API key not found in .env file!") | |
| return | |
| openai.api_key = api_key | |
| if not st.session_state['pdf_processor']: | |
| st.session_state['pdf_processor'] = PDFProcessor() | |
| if not st.session_state['embeddings_manager']: | |
| st.session_state['embeddings_manager'] = EmbeddingsManager(api_key) | |
| if not st.session_state['qa_system']: | |
| st.session_state['qa_system'] = QASystem(api_key) | |
| if selected_page == "Upload PDFs": | |
| st.header("π€ Upload PDFs") | |
| st.markdown( | |
| """<p style='font-size: 1.1rem;'>Drag and drop your PDF files below to extract and process content for analysis.</p>""", | |
| unsafe_allow_html=True | |
| ) | |
| uploaded_files = st.file_uploader( | |
| "Upload PDF files", type=['pdf'], accept_multiple_files=True | |
| ) | |
| if uploaded_files: | |
| new_files = [f for f in uploaded_files if f.name not in st.session_state['processed_pdfs']] | |
| if new_files: | |
| with st.spinner("Processing PDFs..."): | |
| for pdf_file in new_files: | |
| try: | |
| pages = st.session_state['pdf_processor'].extract_text(pdf_file) | |
| for page_text in pages.values(): | |
| chunks = st.session_state['pdf_processor'].chunk_text(page_text) | |
| st.session_state['all_text_chunks'].extend(chunks) | |
| st.session_state['processed_pdfs'].add(pdf_file.name) | |
| except Exception as e: | |
| st.error(f"Error processing {pdf_file.name}: {str(e)}") | |
| continue | |
| with st.spinner("Generating embeddings..."): | |
| try: | |
| st.session_state['embeddings_manager'].generate_embeddings( | |
| st.session_state['all_text_chunks'] | |
| ) | |
| st.success("β Documents processed successfully!") | |
| except Exception as e: | |
| st.error(f"Error generating embeddings: {str(e)}") | |
| elif selected_page == "Ask Questions": | |
| st.header("β Ask Questions") | |
| st.markdown( | |
| """<p style='font-size: 1.1rem;'>Query your uploaded documents and get precise answers backed by AI-powered analysis.</p>""", | |
| unsafe_allow_html=True | |
| ) | |
| if st.session_state['all_text_chunks']: | |
| question = st.text_input("Enter your question:") | |
| if question: | |
| try: | |
| with st.spinner("Finding relevant information..."): | |
| relevant_chunks = st.session_state['embeddings_manager'].find_relevant_chunks( | |
| question, k=3 | |
| ) | |
| answer = st.session_state['qa_system'].generate_answer( | |
| question, relevant_chunks | |
| ) | |
| st.markdown("### π€ Answer") | |
| st.write(answer) | |
| with st.expander("π View Source Context"): | |
| for i, chunk in enumerate(relevant_chunks, 1): | |
| st.markdown(f"**Context {i}:**") | |
| st.write(chunk) | |
| st.markdown("---") | |
| except openai.error.RateLimitError: | |
| st.error("Rate limit exceeded. Please try again later.") | |
| except Exception as e: | |
| st.error(f"Error: {str(e)}") | |
| else: | |
| st.warning("Please upload and process documents in the 'Upload PDFs' section first.") | |
| elif selected_page == "About": | |
| st.header("βΉοΈ About This App") | |
| st.markdown( | |
| """ | |
| <p style='font-size: 1.1rem;'> | |
| <b>AI-Powered PDF Assistant</b> is a smart solution for extracting and querying information from PDF files. With powerful AI integrations, | |
| this tool allows seamless document analysis and interaction. | |
| </p> | |
| <h3>π Key Features</h3> | |
| <ul> | |
| <li>Upload and process multiple PDF files</li> | |
| <li>Generate embeddings for precise content retrieval</li> | |
| <li>Query documents and receive context-aware answers</li> | |
| </ul> | |
| <h3>π οΈ Technologies Used</h3> | |
| <ul> | |
| <li>Streamlit for interactive UI</li> | |
| <li>OpenAI GPT API for Q&A</li> | |
| <li>Custom PDF processing and embedding tools</li> | |
| </ul> | |
| <p style='text-align: center;'> | |
| Built with β€οΈ by [Your Name] | |
| </p> | |
| """, | |
| unsafe_allow_html=True | |
| ) | |
| if __name__ == "__main__": | |
| main() | |