#!/usr/bin/env python3 """ Setup script for Professional RAG Assistant. """ import os import sys import subprocess import urllib.request from pathlib import Path def run_command(command, description=""): """Run a shell command with error handling.""" print(f"Running: {command}") if description: print(f"Description: {description}") result = subprocess.run(command, shell=True, capture_output=True, text=True) if result.returncode != 0: print(f"Error running command: {command}") print(f"Error output: {result.stderr}") return False if result.stdout: print(result.stdout) return True def check_python_version(): """Check if Python version is compatible.""" if sys.version_info < (3, 8): print("Error: Python 3.8 or higher is required") return False print(f"Python version: {sys.version}") return True def install_requirements(): """Install Python requirements.""" print("Installing Python dependencies...") if not run_command("pip install -r requirements.txt", "Installing main dependencies"): return False # Install dev dependencies if requested if "--dev" in sys.argv: if not run_command("pip install -r requirements-dev.txt", "Installing dev dependencies"): return False return True def create_directories(): """Create necessary directories.""" directories = [ "logs", "cache", "static/uploads", "data", "models" ] for directory in directories: Path(directory).mkdir(parents=True, exist_ok=True) print(f"Created directory: {directory}") def download_sample_documents(): """Download sample documents for testing.""" if "--skip-samples" in sys.argv: return True print("Downloading sample documents...") sample_dir = Path("examples/sample_docs") sample_dir.mkdir(parents=True, exist_ok=True) # Create a sample text document sample_text = """ Professional RAG Assistant - Sample Document This is a sample document to demonstrate the capabilities of the Professional RAG Assistant. Key Features: - Multi-format document processing (PDF, DOCX, TXT) - Advanced hybrid search combining vector similarity and keyword search - Cross-encoder re-ranking for improved relevance - Comprehensive caching system for performance - Professional Gradio interface with analytics The system uses sentence-transformers for creating document embeddings and BM25 for keyword search. Results are re-ranked using cross-encoder models to provide the most relevant answers to user queries. This sample document can be used to test the upload and search functionality of the system. """ with open(sample_dir / "sample_document.txt", "w") as f: f.write(sample_text) print(f"Created sample document: {sample_dir / 'sample_document.txt'}") return True def setup_configuration(): """Setup configuration files.""" print("Setting up configuration...") # Check if config files exist if not Path("config.yaml").exists(): print("Warning: config.yaml not found. Using default configuration.") if not Path("config-local.yaml").exists(): print("Info: config-local.yaml not found. This is optional for local development.") return True def run_tests(): """Run test suite if requested.""" if "--test" not in sys.argv: return True print("Running test suite...") if not run_command("python -m pytest tests/ -v", "Running tests"): print("Warning: Some tests failed. The application should still work.") return True # Don't fail setup on test failures return True def main(): """Main setup function.""" print("Setting up Professional RAG Assistant...") print("=" * 50) # Check Python version if not check_python_version(): sys.exit(1) # Create directories create_directories() # Install requirements if not install_requirements(): print("Failed to install requirements") sys.exit(1) # Setup configuration if not setup_configuration(): print("Failed to setup configuration") sys.exit(1) # Download sample documents if not download_sample_documents(): print("Failed to download sample documents") sys.exit(1) # Run tests if requested if not run_tests(): print("Tests failed") sys.exit(1) print("\n" + "=" * 50) print("Setup completed successfully!") print("\nTo start the application:") print(" python app.py") print("\nTo start in debug mode:") print(" python app.py --debug") print("\nTo use local configuration:") print(" python app.py --config config-local.yaml") print("\nFor more options:") print(" python app.py --help") if __name__ == "__main__": main()