Spaces:
Sleeping
Sleeping
| # =============================================================== | |
| # Hugging Face Deployment Script | |
| # =============================================================== | |
| # This script deploys your model to Hugging Face. | |
| # | |
| # SECURITY NOTICE: | |
| # - NEVER hardcode tokens or secrets in this script | |
| # - Use environment variables for sensitive information | |
| # - Store secrets in a secure location, not in your code | |
| # | |
| # Required environment variables from .env file in project root: | |
| # - HUGGING_FACE_TOKEN: Your Hugging Face API token | |
| # - HUGGING_FACE_SPACE: Your Hugging Face space name | |
| # | |
| # How to use: | |
| # 1. Make sure .env file exists in project root with proper variables | |
| # | |
| # 2. Run the script: | |
| # ./scripts/deploy_to_hf.sh | |
| # =============================================================== | |
| # Color definitions for better readability | |
| RED="\033[0;31m" | |
| GREEN="\033[0;32m" | |
| YELLOW="\033[0;33m" | |
| BLUE="\033[0;34m" | |
| PURPLE="\033[0;35m" | |
| CYAN="\033[0;36m" | |
| NC="\033[0m" # No Color | |
| # Function for logging messages with color | |
| log_info() { | |
| echo -e "${BLUE}[INFO]${NC} $1" | |
| } | |
| log_success() { | |
| echo -e "${GREEN}[SUCCESS]${NC} $1" | |
| } | |
| log_warning() { | |
| echo -e "${YELLOW}[WARNING]${NC} $1" | |
| } | |
| log_error() { | |
| echo -e "${RED}[ERROR]${NC} $1" | |
| } | |
| log_section() { | |
| echo -e "\n${PURPLE}=== $1 ===${NC}" | |
| } | |
| # Function to check if a command exists | |
| command_exists() { | |
| command -v "$1" >/dev/null 2>&1 | |
| } | |
| # Function to validate token format (basic check) | |
| validate_token() { | |
| local token="$1" | |
| # Check if token starts with "hf_" prefix (typical for Hugging Face tokens) | |
| if [[ ! "$token" =~ ^hf_[a-zA-Z0-9]+$ ]]; then | |
| return 1 | |
| fi | |
| return 0 | |
| } | |
| # Exit on any error | |
| set -e | |
| # Script directory | |
| SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" | |
| PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" | |
| # Change to project root directory | |
| cd "$PROJECT_ROOT" || { | |
| log_error "Failed to change to project root directory: $PROJECT_ROOT" | |
| exit 1 | |
| } | |
| log_section "Starting Hugging Face Deployment" | |
| # Check for required dependencies | |
| log_info "Checking dependencies..." | |
| MISSING_DEPS=0 | |
| for cmd in git huggingface-cli python pip; do | |
| if ! command_exists "$cmd"; then | |
| log_error "Required command not found: $cmd" | |
| MISSING_DEPS=1 | |
| fi | |
| done | |
| if [ $MISSING_DEPS -eq 1 ]; then | |
| log_error "Please install missing dependencies and try again." | |
| exit 1 | |
| fi | |
| # Load environment variables from .env file | |
| log_info "Loading environment variables from .env file..." | |
| if [ -f "$PROJECT_ROOT/.env" ]; then | |
| source "$PROJECT_ROOT/.env" | |
| else | |
| log_error ".env file not found in project root directory!" | |
| exit 1 | |
| fi | |
| # Check for required environment variables | |
| log_info "Checking environment variables..." | |
| if [ -z "$HUGGING_FACE_TOKEN" ]; then | |
| log_error "HUGGING_FACE_TOKEN environment variable is not set in .env file!" | |
| exit 1 | |
| fi | |
| if [ -z "$HUGGING_FACE_SPACE" ]; then | |
| log_error "HUGGING_FACE_SPACE environment variable is not set in .env file!" | |
| exit 1 | |
| fi | |
| # Validate token format | |
| if ! validate_token "$HUGGING_FACE_TOKEN"; then | |
| log_warning "The HUGGING_FACE_TOKEN format doesn't appear valid (should start with 'hf_')." | |
| read -p "Continue anyway? (y/n): " -n 1 -r | |
| echo | |
| if [[ ! $REPLY =~ ^[Yy]$ ]]; then | |
| log_info "Deployment canceled." | |
| exit 1 | |
| fi | |
| fi | |
| log_info "Deploying to Hugging Face space: $HUGGING_FACE_SPACE" | |
| # Login to Hugging Face | |
| log_info "Logging in to Hugging Face..." | |
| if ! HUGGINGFACE_HUB_TOKEN="$HUGGING_FACE_TOKEN" huggingface-cli login --token "$HUGGING_FACE_TOKEN" 2>/dev/null; then | |
| log_error "Failed to log in to Hugging Face. Please check your token." | |
| exit 1 | |
| fi | |
| log_success "Logged in to Hugging Face successfully." | |
| # Check if we're in a git repository | |
| if [ ! -d .git ]; then | |
| log_warning "Not in a git repository. Initializing..." | |
| git init | |
| git config --local user.name "HIM Deployment" | |
| git config --local user.email "no-reply@teleologyhi.com" | |
| fi | |
| # Check if repository is configured properly | |
| if ! git remote -v | grep -q "$HUGGING_FACE_SPACE"; then | |
| log_info "Setting up git remote for Hugging Face..." | |
| git remote add huggingface "https://huggingface.co/spaces/$HUGGING_FACE_SPACE" | |
| # Alternatively, use the token in the URL (less secure but sometimes needed) | |
| # git remote add huggingface "https://USER:$HUGGING_FACE_TOKEN@huggingface.co/spaces/$HUGGING_FACE_SPACE" | |
| fi | |
| # Make sure dependencies are installed | |
| log_info "Checking if requirements.txt exists..." | |
| if [ -f requirements.txt ]; then | |
| log_info "Installing dependencies from requirements.txt..." | |
| if ! pip install -r requirements.txt; then | |
| log_warning "Some dependencies could not be installed. This might cause deployment issues." | |
| fi | |
| else | |
| log_warning "requirements.txt not found. Make sure all dependencies are installed." | |
| fi | |
| # Prepare deployment | |
| log_section "Preparing Deployment" | |
| # Check for untracked files | |
| UNTRACKED_FILES=$(git ls-files --others --exclude-standard) | |
| if [ -n "$UNTRACKED_FILES" ]; then | |
| log_warning "Untracked files found:" | |
| echo "$UNTRACKED_FILES" | |
| read -p "Add these files to git? (y/n): " -n 1 -r | |
| echo | |
| if [[ $REPLY =~ ^[Yy]$ ]]; then | |
| git add . | |
| log_success "Files added to git." | |
| else | |
| log_warning "Continuing without adding untracked files." | |
| fi | |
| fi | |
| # Commit changes if needed | |
| if ! git diff-index --quiet HEAD --; then | |
| log_info "Changes detected, creating a commit..." | |
| read -p "Enter commit message (default: 'Update deployment'): " COMMIT_MSG | |
| COMMIT_MSG=${COMMIT_MSG:-"Update deployment"} | |
| git commit -am "$COMMIT_MSG" | |
| log_success "Changes committed." | |
| fi | |
| # Deploy to Hugging Face | |
| log_section "Deploying to Hugging Face" | |
| log_info "Pushing to Hugging Face Space: $HUGGING_FACE_SPACE" | |
| if ! git push -u huggingface main; then | |
| log_error "Failed to push to Hugging Face." | |
| log_info "Try running: git push -u huggingface main --force" | |
| exit 1 | |
| fi | |
| log_success "Deployment successful!" | |
| log_info "Your model is now available at: https://huggingface.co/spaces/$HUGGING_FACE_SPACE" | |
| # Optional: Generate a client usage example | |
| log_section "Client Usage Example" | |
| cat << EOF | |
| Python client example: | |
| from gradio_client import Client | |
| client = Client("$HUGGING_FACE_SPACE") | |
| result = client.predict( | |
| message="Hello!!", | |
| system_message="You are a friendly Chatbot.", | |
| max_tokens=512, | |
| temperature=0.7, | |
| top_p=0.95, | |
| api_name="/chat" | |
| ) | |
| print(result) | |
| EOF | |
| exit 0 | |