Add automated setup script for installation and configuration
This commit is contained in:
parent
2f8205150f
commit
f1faee54b6
397
setup.sh
Normal file
397
setup.sh
Normal file
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user