#!/usr/bin/env bash # Evrmind: Start the local AI server with web UI set -e SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" PORT=8080 HOST="127.0.0.1" NGL=99 # Parse flags for arg in "$@"; do case "$arg" in --network) HOST="0.0.0.0" ;; --port=*) PORT="${arg#*=}" ;; --cpu) NGL=0 ;; *) ;; esac done # Find model file MODEL="" for f in "$SCRIPT_DIR"/*.gguf; do [ -f "$f" ] && MODEL="$f" && break done if [ -z "$MODEL" ]; then echo "Error: No .gguf model file found in $SCRIPT_DIR" echo "Place your model file (e.g. evr-llama-3.1-8b-instruct.gguf) in this directory." exit 1 fi # Detect platform BIN_DIR="" if [ -d "$SCRIPT_DIR/linux-cuda" ] && [ -f "$SCRIPT_DIR/linux-cuda/llama-server" ]; then BIN_DIR="$SCRIPT_DIR/linux-cuda" elif [ -d "$SCRIPT_DIR/linux-vulkan" ] && [ -f "$SCRIPT_DIR/linux-vulkan/llama-server" ]; then BIN_DIR="$SCRIPT_DIR/linux-vulkan" elif [ -d "$SCRIPT_DIR/metal" ] && [ -f "$SCRIPT_DIR/metal/llama-server" ]; then BIN_DIR="$SCRIPT_DIR/metal" elif [ -d "$SCRIPT_DIR/android-vulkan" ] && [ -f "$SCRIPT_DIR/android-vulkan/llama-server" ]; then BIN_DIR="$SCRIPT_DIR/android-vulkan" else echo "Error: No llama-server binary found." echo "Expected in one of: linux-cuda/, linux-vulkan/, metal/, android-vulkan/" echo "" echo "Download a platform binary from:" echo " https://github.com/evrmind-uk/evr-llama/releases/tag/v1.0.0" echo "" echo "Then extract it into the matching directory name, e.g.:" echo " mkdir -p linux-cuda && tar xzf evrmind-linux-cuda.tar.gz -C linux-cuda" exit 1 fi SERVER="$BIN_DIR/llama-server" # Set library path if [[ "$OSTYPE" == "darwin"* ]]; then export DYLD_LIBRARY_PATH="$BIN_DIR:${DYLD_LIBRARY_PATH:-}" else export LD_LIBRARY_PATH="$BIN_DIR:${LD_LIBRARY_PATH:-}" fi # Clean shutdown cleanup() { echo "" echo "Shutting down..." kill "$SERVER_PID" 2>/dev/null wait "$SERVER_PID" 2>/dev/null exit 0 } trap cleanup INT TERM # Start server echo "" echo " ╔═══════════════════════════════════════╗" echo " ║ E V R M I N D ║" echo " ╚═══════════════════════════════════════╝" echo "" echo " Model: $(basename "$MODEL")" echo " Server: $HOST:$PORT" echo " GPU: $( [ "$NGL" -gt 0 ] && echo "Yes (-ngl $NGL)" || echo "CPU only" )" echo "" "$SERVER" \ -m "$MODEL" \ -ngl "$NGL" \ --host "$HOST" \ --port "$PORT" \ --path "$SCRIPT_DIR/webui" \ 2>&1 & SERVER_PID=$! # Wait for server to be ready echo -n " Starting server..." for i in $(seq 1 120); do if ! kill -0 "$SERVER_PID" 2>/dev/null; then echo " FAILED (server exited)" exit 1 fi if curl -sf "http://127.0.0.1:$PORT/health" > /dev/null 2>&1; then echo " ready!" echo "" if [ "$HOST" = "0.0.0.0" ]; then LOCAL_IP=$(hostname -I 2>/dev/null | awk '{print $1}') echo " Open in your browser:" echo " Local: http://localhost:$PORT" echo " Network: http://$LOCAL_IP:$PORT" echo "" echo " Access from your phone on the same WiFi:" echo " http://$LOCAL_IP:$PORT" else echo " Open in your browser:" echo " http://localhost:$PORT" fi echo "" echo " Press Ctrl+C to stop." echo "" wait "$SERVER_PID" exit 0 fi sleep 1 [ $((i % 10)) -eq 0 ] && echo -n "." done echo " TIMEOUT (server did not start in 120s)" kill "$SERVER_PID" 2>/dev/null exit 1