File size: 7,339 Bytes
e8ba22d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
#!/data/data/com.termux/files/usr/bin/bash
# ================================================================
#  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 ""