#!/usr/bin/env bash #=============================================================================== # # WISDOM - AI Services Management Script # #=============================================================================== # # DESCRIPTION: # This script manages the AI backend services used by the "wisdom" system. # It provides commands to start, stop, restart, and check the status of: # # 1. OLLAMA SERVICE (Port 11434) # - Local LLM inference server # - Runs models like deepseek-r1:14b, qwen2.5:14b # - Managed via systemd (ollama.service) # - API endpoint: http://localhost:11434 # # 2. FASTER-WHISPER SERVER (Port 8000) # - Speech-to-text transcription server # - Uses OpenAI Whisper models with CTranslate2 optimization # - Runs as a uvicorn ASGI server # - Location: /root/faster-whisper-server # - API endpoint: http://localhost:8000 # # USAGE: # wisdom start | -l - Start/launch all AI services # wisdom stop | -c - Stop/close all AI services (frees RAM) # wisdom restart | -r - Restart all AI services # wisdom status | -s - Show status of all services # wisdom help | -h - Show this help message # # REQUIREMENTS: # - sudo access (for whisper server management) # - systemd (for ollama service) # - /root/faster-whisper-server directory with venv # # PORTS USED: # - 11434: Ollama API (localhost only) # - 8000: Faster-Whisper API # # MEMORY USAGE: # - Ollama: ~200MB idle, up to 8GB+ when running large models # - Whisper: ~500MB-2GB depending on model loaded # # AUTHOR: Generated for krisyotam's wisdom system # DATE: 2026-01-19 # #=============================================================================== set -e # Exit on error #------------------------------------------------------------------------------- # CONFIGURATION #------------------------------------------------------------------------------- # Ollama settings OLLAMA_SERVICE="ollama.service" OLLAMA_PORT=11434 OLLAMA_HOST="127.0.0.1" # Faster-Whisper settings WHISPER_DIR="/root/faster-whisper-server" WHISPER_VENV="$WHISPER_DIR/.venv" WHISPER_PORT=8000 # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color #------------------------------------------------------------------------------- # HELPER FUNCTIONS #------------------------------------------------------------------------------- # Print colored status messages print_status() { echo -e "${BLUE}[INFO]${NC} $1" } print_success() { echo -e "${GREEN}[OK]${NC} $1" } print_warning() { echo -e "${YELLOW}[WARN]${NC} $1" } print_error() { echo -e "${RED}[ERROR]${NC} $1" } # Check if a service is running on a specific port check_port() { local port=$1 ss -tlnp 2>/dev/null | grep -q ":$port " && return 0 || return 1 } # Get PID of process on port get_pid_on_port() { local port=$1 ss -tlnp 2>/dev/null | grep ":$port " | grep -oP 'pid=\K\d+' | head -1 } #------------------------------------------------------------------------------- # SERVICE MANAGEMENT FUNCTIONS #------------------------------------------------------------------------------- # # START OLLAMA # Uses systemd to start the ollama service # start_ollama() { print_status "Starting Ollama service..." if systemctl is-active --quiet "$OLLAMA_SERVICE"; then print_warning "Ollama is already running" else sudo systemctl start "$OLLAMA_SERVICE" sleep 2 if systemctl is-active --quiet "$OLLAMA_SERVICE"; then print_success "Ollama started successfully on port $OLLAMA_PORT" else print_error "Failed to start Ollama" return 1 fi fi } # # STOP OLLAMA # Uses systemd to stop the ollama service # stop_ollama() { print_status "Stopping Ollama service..." if ! systemctl is-active --quiet "$OLLAMA_SERVICE"; then print_warning "Ollama is not running" else sudo systemctl stop "$OLLAMA_SERVICE" print_success "Ollama stopped" fi } # # START FASTER-WHISPER SERVER # Starts the uvicorn server in the background # Requires sudo since it runs from /root # start_whisper() { print_status "Starting Faster-Whisper server..." # Check if already running if check_port $WHISPER_PORT; then print_warning "Whisper server is already running on port $WHISPER_PORT" return 0 fi # Check if the directory exists if [ ! -d "$WHISPER_DIR" ]; then print_error "Whisper server directory not found: $WHISPER_DIR" return 1 fi # Start the server using sudo # The server runs in the background with nohup sudo bash -c " cd $WHISPER_DIR && \ source $WHISPER_VENV/bin/activate && \ nohup uv run uvicorn --factory faster_whisper_server.main:create_app \ --host 0.0.0.0 \ --port $WHISPER_PORT \ > /var/log/whisper-server.log 2>&1 & " # Wait for server to start sleep 3 if check_port $WHISPER_PORT; then print_success "Whisper server started on port $WHISPER_PORT" else print_error "Failed to start Whisper server" print_status "Check logs: sudo cat /var/log/whisper-server.log" return 1 fi } # # STOP FASTER-WHISPER SERVER # Finds and kills the uvicorn process # stop_whisper() { print_status "Stopping Faster-Whisper server..." # Find processes related to faster-whisper-server local pids=$(pgrep -f "faster_whisper_server" 2>/dev/null || true) if [ -z "$pids" ]; then print_warning "Whisper server is not running" return 0 fi # Kill the processes for pid in $pids; do sudo kill "$pid" 2>/dev/null || true done sleep 1 # Force kill if still running pids=$(pgrep -f "faster_whisper_server" 2>/dev/null || true) if [ -n "$pids" ]; then for pid in $pids; do sudo kill -9 "$pid" 2>/dev/null || true done fi print_success "Whisper server stopped" } # # SHOW STATUS OF ALL SERVICES # show_status() { echo "" echo "========================================" echo " WISDOM AI SERVICES STATUS " echo "========================================" echo "" # Ollama status echo -e "${BLUE}OLLAMA SERVICE${NC}" echo " Port: $OLLAMA_PORT" if systemctl is-active --quiet "$OLLAMA_SERVICE"; then echo -e " Status: ${GREEN}RUNNING${NC}" # Show memory usage local ollama_mem=$(systemctl show "$OLLAMA_SERVICE" --property=MemoryCurrent 2>/dev/null | cut -d= -f2) if [ -n "$ollama_mem" ] && [ "$ollama_mem" != "[not set]" ]; then echo " Memory: $(numfmt --to=iec $ollama_mem 2>/dev/null || echo $ollama_mem)" fi # Show loaded models echo " Models:" curl -s "http://$OLLAMA_HOST:$OLLAMA_PORT/api/tags" 2>/dev/null | \ grep -oP '"name":"[^"]+' | cut -d'"' -f4 | while read model; do echo " - $model" done else echo -e " Status: ${RED}STOPPED${NC}" fi echo "" # Whisper status echo -e "${BLUE}FASTER-WHISPER SERVER${NC}" echo " Port: $WHISPER_PORT" if check_port $WHISPER_PORT; then echo -e " Status: ${GREEN}RUNNING${NC}" local pid=$(get_pid_on_port $WHISPER_PORT) if [ -n "$pid" ]; then local mem=$(ps -o rss= -p $pid 2>/dev/null | awk '{print $1*1024}') echo " Memory: $(numfmt --to=iec $mem 2>/dev/null || echo "unknown")" fi else echo -e " Status: ${RED}STOPPED${NC}" fi echo "" echo "========================================" } # # SHOW HELP MESSAGE # show_help() { echo "" echo "WISDOM - AI Services Management" echo "" echo "Usage: wisdom " echo "" echo "Commands:" echo " start, -l Start/launch all AI services (Ollama + Whisper)" echo " stop, -c Stop/close all AI services (frees RAM)" echo " restart, -r Restart all AI services" echo " status, -s Show status of all services" echo " help, -h Show this help message" echo "" echo "Services managed:" echo " - Ollama (LLM inference) - Port 11434" echo " - Faster-Whisper (Speech-to-text) - Port 8000" echo "" } #------------------------------------------------------------------------------- # MAIN COMMAND HANDLER #------------------------------------------------------------------------------- case "${1:-help}" in start|-l|--launch) echo "" print_status "Starting WISDOM AI services..." echo "" start_ollama start_whisper echo "" print_success "All services started!" show_status ;; stop|-c|--close) echo "" print_status "Stopping WISDOM AI services..." echo "" stop_whisper stop_ollama echo "" print_success "All services stopped. RAM freed." ;; restart|-r|--restart) echo "" print_status "Restarting WISDOM AI services..." echo "" stop_whisper stop_ollama sleep 2 start_ollama start_whisper echo "" print_success "All services restarted!" show_status ;; status|-s|--status) show_status ;; help|--help|-h) show_help ;; *) print_error "Unknown command: $1" show_help exit 1 ;; esac