Spaces:
Sleeping
Sleeping
| # ================================================================ | |
| # THEVOIDKERNEL PORTABLE UNCENSORED AI - Android Native Installer (Llama.cpp) | |
| # ================================================================ | |
| # Natively compiles Llama.cpp on your device for max performance | |
| # and sets up the universal USB folder architecture. | |
| # ================================================================ | |
| # ---- Detect Termux ---- | |
| if [ -z "$TERMUX_VERSION" ] && [ ! -d "/data/data/com.termux" ]; then | |
| echo "ERROR: This script must run inside Termux!" | |
| echo "Install Termux from F-Droid: https://f-droid.org/en/packages/com.termux/" | |
| exit 1 | |
| fi | |
| SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" | |
| USB_ROOT="$(dirname "$SCRIPT_DIR")" | |
| SHARED_DIR="$USB_ROOT/Shared" | |
| SHARED_BIN="$SHARED_DIR/bin" | |
| MODELS_DIR="$SHARED_DIR/models" | |
| mkdir -p "$SHARED_BIN" "$MODELS_DIR" | |
| RED='\033[0;31m' | |
| YLW='\033[1;33m' | |
| GRN='\033[0;32m' | |
| CYN='\033[0;36m' | |
| MAG='\033[0;35m' | |
| GRY='\033[0;37m' | |
| DGR='\033[1;30m' | |
| WHT='\033[1;37m' | |
| RST='\033[0m' | |
| echo "" | |
| echo -e "${CYN}==========================================================${RST}" | |
| echo -e "${CYN} THEVOIDKERNEL PORTABLE AI - Android Native Setup (Llama.cpp) ${RST}" | |
| echo -e "${CYN}==========================================================${RST}" | |
| # ================================================================ | |
| # 1. System & Dependencies | |
| # ================================================================ | |
| echo -e "${YLW}[1/4] Preparing Termux environment...${RST}" | |
| # Grant storage permission | |
| if [ ! -d "$HOME/storage" ]; then | |
| echo -e "${DGR} Requesting storage permission...${RST}" | |
| termux-setup-storage 2>/dev/null || true | |
| sleep 2 | |
| fi | |
| echo -e "${DGR} Updating packages and installing build tools...${RST}" | |
| # Use apt instead of pkg to avoid caching bugs, full-upgrade ensures SSL libs are fixed | |
| apt update -y | |
| apt full-upgrade -y | |
| pkg install -y clang cmake git wget ninja python | |
| echo -e "${GRN} Dependencies installed!${RST}" | |
| TOTAL_RAM_KB=$(grep MemTotal /proc/meminfo 2>/dev/null | awk '{print $2}') | |
| TOTAL_RAM_GB=$(awk "BEGIN{printf \"%.1f\", $TOTAL_RAM_KB/1048576}") | |
| echo -e "${DGR} Device RAM: ${TOTAL_RAM_GB} GB${RST}" | |
| # ================================================================ | |
| # 2. Compile Llama.cpp natively | |
| # ================================================================ | |
| echo "" | |
| echo -e "${YLW}[2/4] Preparing Llama.cpp Engine...${RST}" | |
| cd "$SHARED_BIN" | |
| if [ ! -d "llama.cpp" ]; then | |
| echo -e "${DGR} Cloning llama.cpp source...${RST}" | |
| git clone https://github.com/ggerganov/llama.cpp.git | |
| fi | |
| cd llama.cpp | |
| if [ ! -f "build/bin/llama-server" ]; then | |
| echo -e "${MAG} Compiling engine natively for your processor...${RST}" | |
| echo -e "${MAG} (This takes 10 to 30 minutes! Do not close Termux)${RST}" | |
| # Acquire wakelock so Android doesn't kill compilation | |
| termux-wake-lock 2>/dev/null || true | |
| rm -rf build 2>/dev/null | |
| cmake -B build -GNinja -DLLAMA_BUILD_SERVER=ON -DLLAMA_BUILD_TESTS=OFF | |
| cmake --build build --config Release --target llama-server | |
| termux-wake-unlock 2>/dev/null || true | |
| echo -e "${GRN} Compilation complete!${RST}" | |
| else | |
| echo -e "${GRN} Engine already compiled! Skipping...${RST}" | |
| fi | |
| cp build/bin/llama-server "$SHARED_BIN/llama-server-android" 2>/dev/null || true | |
| # ================================================================ | |
| # 3. Model Retrieval | |
| # ================================================================ | |
| echo "" | |
| echo -e "${YLW}[3/4] AI Model Library...${RST}" | |
| echo -e " ${YLW}[1]${RST} Gemma 2 2B Abliterated (1.6 GB) ${RED}[UNCENSORED - FASTEST]${RST}" | |
| echo -e " ${YLW}[2]${RST} SmolLM2 1.7B Uncensored (1.0 GB) ${RED}[UNCENSORED - LIGHT]${RST}" | |
| echo -e " ${YLW}[3]${RST} Qwen2.5 1.5B Instruct (1.1 GB) ${CYN}[STANDARD - MULTILINGUAL]${RST}" | |
| echo -e " ${YLW}[4]${RST} Phi 3.5 Mini 3.8B (2.2 GB) ${CYN}[STANDARD - SMART]${RST}" | |
| echo -e " ${YLW}[5]${RST} Qwen 3.5 9B Uncensored (5.2 GB) ${MAG}[HEAVY - FOR 12GB+ RAM]${RST}" | |
| echo -e " ${GRN}[C]${RST} CUSTOM - Paste HuggingFace .gguf direct link" | |
| echo -e " ${DGR}[0]${RST} Skip downloading (I already have models in Shared/models/)" | |
| echo "" | |
| read -r -p " Select model (0-5 or C): " MODEL_CHOICE | |
| MODEL_URL="" | |
| case $(echo "$MODEL_CHOICE" | tr '[:upper:]' '[:lower:]') in | |
| 1) | |
| MODEL_URL="https://huggingface.co/bartowski/gemma-2-2b-it-abliterated-GGUF/resolve/main/gemma-2-2b-it-abliterated-Q4_K_M.gguf" | |
| MODEL_FILE="gemma-2-2b-it-abliterated-Q4_K_M.gguf" | |
| ;; | |
| 2) | |
| MODEL_URL="https://huggingface.co/bartowski/SmolLM2-1.7B-Instruct-Uncensored-GGUF/resolve/main/SmolLM2-1.7B-Instruct-Uncensored-Q4_K_M.gguf" | |
| MODEL_FILE="SmolLM2-1.7B-Instruct-Uncensored-Q4_K_M.gguf" | |
| ;; | |
| 3) | |
| MODEL_URL="https://huggingface.co/bartowski/Qwen2.5-1.5B-Instruct-GGUF/resolve/main/Qwen2.5-1.5B-Instruct-Q4_K_M.gguf" | |
| MODEL_FILE="Qwen2.5-1.5B-Instruct-Q4_K_M.gguf" | |
| ;; | |
| 4) | |
| MODEL_URL="https://huggingface.co/bartowski/Phi-3.5-mini-instruct-GGUF/resolve/main/Phi-3.5-mini-instruct-Q4_K_M.gguf" | |
| MODEL_FILE="Phi-3.5-mini-instruct-Q4_K_M.gguf" | |
| ;; | |
| 5) | |
| MODEL_URL="https://huggingface.co/HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/resolve/main/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf" | |
| MODEL_FILE="Qwen3.5-9B-Uncensored-Q4.gguf" | |
| ;; | |
| c|custom) | |
| read -r -p " Paste direct .gguf URL: " CUSTOM_URL | |
| if [ -n "$CUSTOM_URL" ]; then | |
| MODEL_URL="$CUSTOM_URL" | |
| MODEL_FILE=$(basename "${MODEL_URL%%\?*}") | |
| [[ "$MODEL_FILE" != *.gguf ]] && MODEL_FILE="${MODEL_FILE}.gguf" | |
| fi | |
| ;; | |
| 0|skip) | |
| echo -e "${GRN} Skipping download phase.${RST}" | |
| ;; | |
| *) | |
| echo -e "${YLW} Invalid choice. Defaulting to Gemma 2 2B.${RST}" | |
| MODEL_URL="https://huggingface.co/bartowski/gemma-2-2b-it-abliterated-GGUF/resolve/main/gemma-2-2b-it-abliterated-Q4_K_M.gguf" | |
| MODEL_FILE="gemma-2-2b-it-abliterated-Q4_K_M.gguf" | |
| ;; | |
| esac | |
| cd "$MODELS_DIR" || exit 1 | |
| if [ -n "$MODEL_URL" ]; then | |
| if [ -f "$MODEL_FILE" ]; then | |
| echo -e "${GRN} $MODEL_FILE already downloaded!${RST}" | |
| else | |
| echo -e "${MAG} Downloading $MODEL_FILE...${RST}" | |
| termux-wake-lock 2>/dev/null || true | |
| # Use wget -c to allow resuming broken downloads | |
| wget -c "$MODEL_URL" -O "$MODEL_FILE" | |
| termux-wake-unlock 2>/dev/null || true | |
| echo -e "${GRN} Download complete!${RST}" | |
| fi | |
| fi | |
| # ================================================================ | |
| # 4. Final Summary | |
| # ================================================================ | |
| echo "" | |
| echo -e "${CYN}==========================================================${RST}" | |
| echo -e "${GRN} ANDROID SETUP COMPLETE!${RST}" | |
| echo -e "${CYN}==========================================================${RST}" | |
| echo "" | |
| echo -e " Your engine has been natively compiled for your exact processor." | |
| echo -e " Models are universally stored in ${WHT}Shared/models/${RST}" | |
| echo "" | |
| echo -e " ${GRY}To start the AI, run:${RST}" | |
| echo -e " ${WHT}bash Android/start.sh${RST}" | |
| echo "" | |
| read -n 1 -s -r -p "Press any key to close this installer..." | |
| echo "" | |