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