File size: 4,893 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
#!/data/data/com.termux/files/usr/bin/bash
# ===================================================
#  THEVOIDKERNEL Portable AI - Android (Llama.cpp Engine)
# ===================================================

echo "==================================================="
echo "    THEVOIDKERNEL Portable AI - Android Native Launcher"
echo "==================================================="
echo ""
echo "  Launches the natively compiled AI engine"
echo "  and beautifully serves the USB FastChatUI."
echo ""

# ---- Detect Termux ----
if [ -z "$TERMUX_VERSION" ] && [ ! -d "/data/data/com.termux" ]; then
    echo "ERROR: This script must run inside 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"

if [ ! -f "$SHARED_BIN/llama-server-android" ]; then
    echo "==================================================="
    echo "  ERROR: Android Native Engine Not Found!"
    echo "==================================================="
    echo "  Please run 'bash Android/install.sh' first"
    echo "  so the engine can compile for your processor."
    exit 1
fi

# Find the first .gguf file to load automatically
MODEL_FILE=$(ls "$MODELS_DIR"/*.gguf 2>/dev/null | head -n 1)

if [ -z "$MODEL_FILE" ]; then
    echo "ERROR: No .gguf models found in Shared/models/!"
    echo "Please download a model using install.sh first."
    exit 1
fi

echo "  Auto-selected model: $(basename "$MODEL_FILE")"
echo ""

# Acquire wakelock to prevent Android from killing the process
echo "Acquiring Termux wakelock (prevents sleep)..."
termux-wake-lock 2>/dev/null || true

# Check if Llama.cpp is already running
if curl -s http://127.0.0.1:8080/v1/models > /dev/null 2>&1; then
    echo "[OK] Llama engine is already running!"
else
    echo "Starting offline Android AI Engine (Llama-Server)..."
    
    # Run llama-server natively. -c 2048 limits context to fit in mobile RAM
    "$SHARED_BIN/llama-server-android" -m "$MODEL_FILE" -c 2048 -cb -np 4 --port 8080 > "$SHARED_DIR/llama-server.log" 2>&1 &
    LLAMA_PID=$!
    
    echo "Loading AI into memory (can take up to 20 seconds)..."
    WAIT_COUNT=0
    until curl -s http://127.0.0.1:8080/v1/models > /dev/null 2>&1; do
        sleep 1
        WAIT_COUNT=$((WAIT_COUNT + 1))
        if [ "$WAIT_COUNT" -ge 90 ]; then
            echo ""
            echo "ERROR: Engine failed to start after 90s!"
            echo "Device RAM might be too low, or Model is too large."
            echo "Check: cat $SHARED_DIR/llama-server.log"
            kill -9 $LLAMA_PID 2>/dev/null
            termux-wake-unlock 2>/dev/null || true
            exit 1
        fi
    done
    echo "[OK] Engine is online!"
fi

# ---- Detect local IP for LAN access ----
LOCAL_IP="127.0.0.1"
if command -v ip &> /dev/null; then
    LOCAL_IP=$(ip route get 1 2>/dev/null | awk '{for(i=1;i<=NF;i++)if($i=="src"){print $(i+1);exit}}')
elif command -v ifconfig &> /dev/null; then
    LOCAL_IP=$(ifconfig wlan0 2>/dev/null | grep 'inet ' | awk '{print $2}' | sed 's/addr://')
fi
[ -z "$LOCAL_IP" ] && LOCAL_IP="127.0.0.1"

echo ""
echo -e "\033[0;36m===================================================\033[0m"
echo -e "\033[0;32m  AI ENGINE IS FULLY ONLINE!\033[0m"
echo -e "\033[0;36m===================================================\033[0m"
echo ""
echo "  Which interface would you like to open?"
echo ""
echo -e "  \033[1;33m[1]\033[0m USB FastChat UI (Beautiful Dark Mode, Auto-Saves)"
echo -e "  \033[1;33m[2]\033[0m Llama.cpp Default UI (Classic Raw Developer UI)"
echo ""
read -r -p "  Enter your choice (1 or 2): " UI_CHOICE

if [ "$UI_CHOICE" = "2" ]; then
    echo "  Opening Llama Default UI..."
    TARGET_URL="http://localhost:8080"
else
    echo "  Opening USB FastChat UI..."
    TARGET_URL="http://localhost:3333"
fi

# Open selected UI automatically
am start -a android.intent.action.VIEW -d "$TARGET_URL" 2>/dev/null || \
    termux-open-url "$TARGET_URL" 2>/dev/null || \
    echo -e "  \033[0;31mCould not auto-open browser.\033[0m Please go to: $TARGET_URL"

echo ""
echo -e "\033[0;37m  Starting background server... Press Ctrl+C to shut down the AI.\033[0m"

# Start the python proxy server so FastChatUI works and saves history
if command -v python3 &> /dev/null; then
    python3 "$SHARED_DIR/chat_server.py" --no-browser --llama-cpp
elif command -v python &> /dev/null; then
    python "$SHARED_DIR/chat_server.py" --no-browser --llama-cpp
else
    echo "ERROR: Python not found! Install with: apt install python -y"
    # Cleanup
    if [ -n "$LLAMA_PID" ]; then
        kill -9 $LLAMA_PID 2>/dev/null
    fi
    termux-wake-unlock 2>/dev/null || true
    exit 1
fi

# Cleanup on exit
if [ -n "$LLAMA_PID" ]; then
    kill -9 $LLAMA_PID 2>/dev/null
fi
termux-wake-unlock 2>/dev/null || true
echo "Goodbye!"