import streamlit as st import os from pathlib import Path from PIL import Image from rag_sec.document_search_system import DocumentSearchSystem from chainguard.blockchain_logger import BlockchainLogger from rag_sec.document_search_system import main import streamlit as st from rag_sec.document_retriver import DocumentRetriever # Blockchain Logger blockchain_logger = BlockchainLogger() # Initialize DocumentSearchSystem home_dir = Path(os.getenv("HOME", "/")) data_dir = home_dir / "data-sets/aclImdb/train" system = DocumentSearchSystem( neo4j_uri="neo4j+s://0ca71b10.databases.neo4j.io", neo4j_user="neo4j", neo4j_password="HwGDOxyGS1-79nLeTiX5bx5ohoFSpvHCmTv8IRgt-lY" ) system.retriever.load_documents() # Directory for storing uploaded files UPLOAD_DIR = "uploaded_files" os.makedirs(UPLOAD_DIR, exist_ok=True) # Streamlit Layout st.title("Memora: Secure File Upload with Blockchain & Neo4j") st.subheader("Securely upload, organize, and query your files") # File Upload uploaded_files = st.file_uploader("Upload your files", accept_multiple_files=True, type=['jpg', 'jpeg', 'png', 'mp4', 'avi']) if uploaded_files: for uploaded_file in uploaded_files: # Save file locally file_path = os.path.join(UPLOAD_DIR, uploaded_file.name) with open(file_path, "wb") as f: f.write(uploaded_file.getbuffer()) st.success(f"File saved locally: {file_path}") # Display file details if uploaded_file.type.startswith('image'): image = Image.open(uploaded_file) st.image(image, caption=uploaded_file.name, use_column_width=True) # Metadata Input album = st.text_input(f"Album for {uploaded_file.name}", "Default Album") tags = st.text_input(f"Tags for {uploaded_file.name} (comma-separated)", "") # Log Metadata if st.button(f"Log Metadata for {uploaded_file.name}"): metadata = {"file_name": uploaded_file.name, "tags": tags.split(','), "album": album} blockchain_details = blockchain_logger.log_data(metadata) blockchain_hash = blockchain_details.get("block_hash", "N/A") # Use Neo4jHandler from DocumentSearchSystem to log transaction system.neo4j_handler.log_transaction(uploaded_file.name, file_path, blockchain_hash) st.write(f"Metadata logged successfully! Blockchain Details: {blockchain_details}") # Blockchain Integrity Validation if st.button("Validate Blockchain Integrity"): is_valid = blockchain_logger.is_blockchain_valid() st.write("Blockchain Integrity:", "Valid ✅" if is_valid else "Invalid ❌") # Query System st.subheader("Query Files") # Initialize DocumentRetriever retriever = DocumentRetriever() @st.cache(allow_output_mutation=True) def load_retriever(): """Load documents into the retriever.""" retriever.load_documents() return retriever # Load the retriever and documents st.write("Loading documents...") retriever = load_retriever() st.write("Documents successfully loaded!") # Streamlit UI st.title("Document Search App") st.subheader("Enter a query to search for related documents") # Query Input query = st.text_input("Enter your query (e.g., 'sports news', 'machine learning')") if st.button("Search"): if query: # Retrieve documents results = retriever.retrieve(query) if results == ["Document retrieval is not initialized."]: st.error("Document retrieval is not initialized. Please reload the app.") elif not results: st.warning("No relevant documents found for your query.") else: st.success(f"Found {len(results)} relevant document(s).") for idx, doc in enumerate(results, start=1): st.write(f"### Document {idx}") st.write(doc[:500]) # Display first 500 characters of each document else: st.warning("Please enter a query to search.") # Debugging Section if st.checkbox("Show Debug Information"): st.write(f"Total documents loaded: {len(retriever.documents)}")