From f1faee54b60ba49d7af6277082af4f552e3993cd Mon Sep 17 00:00:00 2001 From: Tanya Date: Wed, 18 Feb 2026 10:28:47 -0500 Subject: [PATCH] Add automated setup script for installation and configuration --- setup.sh | 397 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 397 insertions(+) create mode 100644 setup.sh diff --git a/setup.sh b/setup.sh new file mode 100644 index 0000000..ae8d73a --- /dev/null +++ b/setup.sh @@ -0,0 +1,397 @@ +#!/bin/bash +# Nanobot Setup Script +# Automates installation and configuration of nanobot with Ollama/AirLLM + +set -e # Exit on error + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Configuration +VENV_DIR="venv" +CONFIG_DIR="$HOME/.nanobot" +CONFIG_FILE="$CONFIG_DIR/config.json" +MODEL_DIR="$HOME/.local/models/llama3.2-3b-instruct" +MODEL_NAME="meta-llama/Llama-3.2-3B-Instruct" + +# Functions +print_header() { + echo -e "\n${BLUE}========================================${NC}" + echo -e "${BLUE}$1${NC}" + echo -e "${BLUE}========================================${NC}\n" +} + +print_success() { + echo -e "${GREEN}✓ $1${NC}" +} + +print_warning() { + echo -e "${YELLOW}⚠ $1${NC}" +} + +print_error() { + echo -e "${RED}✗ $1${NC}" +} + +print_info() { + echo -e "${BLUE}ℹ $1${NC}" +} + +# Check if command exists +command_exists() { + command -v "$1" >/dev/null 2>&1 +} + +# Check prerequisites +check_prerequisites() { + print_header "Checking Prerequisites" + + local missing=0 + + if ! command_exists python3; then + print_error "Python 3 is not installed" + missing=1 + else + PYTHON_VERSION=$(python3 --version 2>&1 | awk '{print $2}') + print_success "Python $PYTHON_VERSION found" + + # Check Python version (need 3.10+) + PYTHON_MAJOR=$(echo $PYTHON_VERSION | cut -d. -f1) + PYTHON_MINOR=$(echo $PYTHON_VERSION | cut -d. -f2) + if [ "$PYTHON_MAJOR" -lt 3 ] || ([ "$PYTHON_MAJOR" -eq 3 ] && [ "$PYTHON_MINOR" -lt 10 ]); then + print_error "Python 3.10+ required, found $PYTHON_VERSION" + missing=1 + fi + fi + + if ! command_exists git; then + print_warning "Git is not installed (optional, but recommended)" + else + print_success "Git found" + fi + + if ! command_exists pip3 && ! python3 -m pip --version >/dev/null 2>&1; then + print_error "pip is not installed" + missing=1 + else + print_success "pip found" + fi + + if [ $missing -eq 1 ]; then + print_error "Missing required prerequisites. Please install them first." + exit 1 + fi + + print_success "All prerequisites met" +} + +# Create virtual environment +setup_venv() { + print_header "Setting Up Virtual Environment" + + if [ -d "$VENV_DIR" ]; then + print_warning "Virtual environment already exists at $VENV_DIR" + read -p "Recreate it? (y/n): " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + rm -rf "$VENV_DIR" + print_info "Removed existing virtual environment" + else + print_info "Using existing virtual environment" + return + fi + fi + + print_info "Creating virtual environment..." + python3 -m venv "$VENV_DIR" + print_success "Virtual environment created" + + print_info "Activating virtual environment..." + source "$VENV_DIR/bin/activate" + print_success "Virtual environment activated" + + print_info "Upgrading pip..." + pip install --upgrade pip --quiet + print_success "pip upgraded" +} + +# Install dependencies +install_dependencies() { + print_header "Installing Dependencies" + + if [ -z "$VIRTUAL_ENV" ]; then + source "$VENV_DIR/bin/activate" + fi + + print_info "Installing nanobot and dependencies..." + pip install -e . --quiet + print_success "Nanobot installed" + + # Check if AirLLM should be installed + read -p "Do you want to use AirLLM? (y/n): " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + print_info "Installing AirLLM..." + pip install airllm bitsandbytes --quiet || { + print_warning "AirLLM installation had issues, but continuing..." + print_info "You can install it later with: pip install airllm bitsandbytes" + } + print_success "AirLLM installed (or attempted)" + USE_AIRLLM=true + else + USE_AIRLLM=false + fi +} + +# Check for Ollama +check_ollama() { + if command_exists ollama; then + print_success "Ollama is installed" + if ollama list >/dev/null 2>&1; then + print_success "Ollama is running" + return 0 + else + print_warning "Ollama is installed but not running" + return 1 + fi + else + print_warning "Ollama is not installed" + return 1 + fi +} + +# Setup Ollama configuration +setup_ollama() { + print_header "Setting Up Ollama" + + if ! check_ollama; then + print_info "Ollama is not installed or not running" + read -p "Do you want to install Ollama? (y/n): " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + print_info "Installing Ollama..." + curl -fsSL https://ollama.ai/install.sh | sh || { + print_error "Failed to install Ollama automatically" + print_info "Please install manually from: https://ollama.ai" + return 1 + } + print_success "Ollama installed" + else + return 1 + fi + fi + + # Check if llama3.2 is available + if ollama list | grep -q "llama3.2"; then + print_success "llama3.2 model found" + else + print_info "Downloading llama3.2 model (this may take a while)..." + ollama pull llama3.2:latest || { + print_error "Failed to pull llama3.2 model" + return 1 + } + print_success "llama3.2 model downloaded" + fi + + # Create config + mkdir -p "$CONFIG_DIR" + cat > "$CONFIG_FILE" << EOF +{ + "providers": { + "ollama": { + "apiKey": "dummy", + "apiBase": "http://localhost:11434/v1" + } + }, + "agents": { + "defaults": { + "model": "llama3.2:latest" + } + } +} +EOF + chmod 600 "$CONFIG_FILE" + print_success "Ollama configuration created at $CONFIG_FILE" + return 0 +} + +# Setup AirLLM configuration +setup_airllm() { + print_header "Setting Up AirLLM" + + # Check if model already exists + if [ -d "$MODEL_DIR" ] && [ -f "$MODEL_DIR/config.json" ]; then + print_success "Model already exists at $MODEL_DIR" + else + print_info "Model needs to be downloaded" + print_info "You'll need a Hugging Face token to download gated models" + echo + print_info "Steps:" + echo " 1. Get token: https://huggingface.co/settings/tokens" + echo " 2. Accept license: https://huggingface.co/$MODEL_NAME" + echo + read -p "Do you have a Hugging Face token? (y/n): " -n 1 -r + echo + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + print_warning "Skipping model download. You can download it later." + print_info "To download later, run:" + echo " huggingface-cli download $MODEL_NAME --local-dir $MODEL_DIR --token YOUR_TOKEN" + return 1 + fi + + read -p "Enter your Hugging Face token: " -s HF_TOKEN + echo + + if [ -z "$HF_TOKEN" ]; then + print_error "Token is required" + return 1 + fi + + # Install huggingface_hub if needed + if [ -z "$VIRTUAL_ENV" ]; then + source "$VENV_DIR/bin/activate" + fi + pip install huggingface_hub --quiet + + print_info "Downloading model (this may take a while, ~2GB)..." + mkdir -p "$MODEL_DIR" + huggingface-cli download "$MODEL_NAME" \ + --local-dir "$MODEL_DIR" \ + --token "$HF_TOKEN" \ + --local-dir-use-symlinks False || { + print_error "Failed to download model" + print_info "Make sure you've accepted the license at: https://huggingface.co/$MODEL_NAME" + return 1 + } + print_success "Model downloaded to $MODEL_DIR" + fi + + # Create config + mkdir -p "$CONFIG_DIR" + cat > "$CONFIG_FILE" << EOF +{ + "providers": { + "airllm": { + "apiKey": "$MODEL_DIR", + "apiBase": null, + "extraHeaders": {} + } + }, + "agents": { + "defaults": { + "model": "$MODEL_DIR" + } + } +} +EOF + chmod 600 "$CONFIG_FILE" + print_success "AirLLM configuration created at $CONFIG_FILE" + return 0 +} + +# Test installation +test_installation() { + print_header "Testing Installation" + + if [ -z "$VIRTUAL_ENV" ]; then + source "$VENV_DIR/bin/activate" + fi + + print_info "Testing nanobot installation..." + if nanobot --help >/dev/null 2>&1; then + print_success "Nanobot is installed and working" + else + print_error "Nanobot test failed" + return 1 + fi + + print_info "Testing with a simple query..." + if nanobot agent -m "Hello, what is 2+5?" >/dev/null 2>&1; then + print_success "Test query successful!" + else + print_warning "Test query had issues (this might be normal if model is still loading)" + print_info "Try running manually: nanobot agent -m 'Hello'" + fi +} + +# Main setup flow +main() { + print_header "Nanobot Setup Script" + print_info "This script will set up nanobot with Ollama or AirLLM" + echo + + # Check prerequisites + check_prerequisites + + # Setup virtual environment + setup_venv + + # Install dependencies + install_dependencies + + # Choose provider + echo + print_header "Choose Provider" + echo "1. Ollama (easiest, no tokens needed)" + echo "2. AirLLM (direct local inference, no HTTP server)" + echo "3. Both (configure both, use either)" + echo + read -p "Choose option (1-3): " -n 1 -r + echo + + PROVIDER_SETUP=false + + case $REPLY in + 1) + if setup_ollama; then + PROVIDER_SETUP=true + fi + ;; + 2) + if setup_airllm; then + PROVIDER_SETUP=true + fi + ;; + 3) + if setup_ollama || setup_airllm; then + PROVIDER_SETUP=true + fi + ;; + *) + print_warning "Invalid choice, skipping provider setup" + ;; + esac + + if [ "$PROVIDER_SETUP" = false ]; then + print_warning "Provider setup incomplete. You can configure manually later." + print_info "Config file location: $CONFIG_FILE" + fi + + # Test installation + test_installation + + # Final instructions + echo + print_header "Setup Complete!" + echo + print_success "Nanobot is ready to use!" + echo + print_info "To activate the virtual environment:" + echo " source $VENV_DIR/bin/activate" + echo + print_info "To use nanobot:" + echo " nanobot agent -m 'Your message here'" + echo + print_info "Configuration file: $CONFIG_FILE" + echo + print_info "For more information, see SETUP.md" + echo +} + +# Run main function +main +