Spaces:
Runtime error
Runtime error
# model_setup.sh - Script to setup and manage Ollama models | |
set -e | |
# Function to log with timestamp | |
log() { | |
echo “[$(date ‘+%Y-%m-%d %H:%M:%S’)] MODEL_SETUP: $1” | |
} | |
# Function to check if Ollama is running | |
check_ollama() { | |
curl -s http://localhost:11434/api/tags > /dev/null 2>&1 | |
} | |
# Function to pull a model with retry logic | |
pull_model() { | |
local model_name=$1 | |
local max_retries=${2:-3} | |
local retry_count=0 | |
``` | |
log "Attempting to pull model: $model_name" | |
while [ $retry_count -lt $max_retries ]; do | |
if ollama pull "$model_name"; then | |
log "Successfully pulled model: $model_name" | |
return 0 | |
else | |
retry_count=$((retry_count + 1)) | |
log "Failed to pull $model_name (attempt $retry_count/$max_retries)" | |
if [ $retry_count -lt $max_retries ]; then | |
log "Retrying in 10 seconds..." | |
sleep 10 | |
fi | |
fi | |
done | |
log "ERROR: Failed to pull model $model_name after $max_retries attempts" | |
return 1 | |
``` | |
} | |
# Function to list available models | |
list_models() { | |
log “Available models:” | |
ollama list 2>/dev/null || log “No models installed yet” | |
} | |
# Wait for Ollama to be ready | |
log “Waiting for Ollama service…” | |
timeout=60 | |
elapsed=0 | |
while ! check_ollama && [ $elapsed -lt $timeout ]; do | |
sleep 2 | |
elapsed=$((elapsed + 2)) | |
done | |
if ! check_ollama; then | |
log “ERROR: Ollama service is not ready after ${timeout}s” | |
exit 1 | |
fi | |
log “Ollama service is ready!” | |
# Define models to install (in order of preference) | |
MODELS_TO_INSTALL=( | |
“llama3.1:8b” # General purpose, good balance | |
“codellama:7b” # Coding specialized | |
“mistral:7b” # Fast and efficient | |
“qwen2.5:7b” # Alternative general model | |
) | |
# Alternative lightweight models if the above fail | |
LIGHTWEIGHT_MODELS=( | |
“llama3.1:7b” | |
“mistral:7b-instruct” | |
“codellama:7b-instruct” | |
“phi3:3.8b” | |
) | |
log “Starting model installation process…” | |
# Try to install at least one model from the primary list | |
model_installed=false | |
for model in “${MODELS_TO_INSTALL[@]}”; do | |
log “Trying to install: $model” | |
if pull_model “$model” 2; then | |
model_installed=true | |
log “✅ Successfully installed: $model” | |
break | |
else | |
log “❌ Failed to install: $model” | |
fi | |
done | |
# If no primary model was installed, try lightweight alternatives | |
if [ “$model_installed” = false ]; then | |
log “Primary models failed, trying lightweight alternatives…” | |
for model in “${LIGHTWEIGHT_MODELS[@]}”; do | |
log “Trying lightweight model: $model” | |
if pull_model “$model” 1; then | |
model_installed=true | |
log “✅ Successfully installed lightweight model: $model” | |
break | |
else | |
log “❌ Failed to install lightweight model: $model” | |
fi | |
done | |
fi | |
# Final check | |
if [ “$model_installed” = false ]; then | |
log “⚠️ WARNING: No models were successfully installed!” | |
log “The application will start but won’t be able to generate responses until a model is manually installed.” | |
else | |
log “✅ Model setup completed successfully!” | |
fi | |
# List all installed models | |
log “Final model inventory:” | |
list_models | |
# Create a status file for the main app to check | |
if [ “$model_installed” = true ]; then | |
echo “success” > /app/model_setup_status | |
log “Created success status file” | |
else | |
echo “failed” > /app/model_setup_status | |
log “Created failed status file” | |
fi | |
log “Model setup script completed” |