Utilizzare un vecchio cellulare come SERVER AI
Ecco una guida completa per trasformare il tuo Samsung Galaxy Note 9 in un vero server AI locale con Qwen.
⚠️ Prima cosa: realtà sull’hardware del Note 9
Il Note 9 ha Snapdragon 845 (o Exynos 9810 in Europa), con 6 GB o 8 GB di RAM. Questo significa che puoi girare modelli piccoli e quantizzati (0.6B, 1.7B, max 4B) con prestazioni limitate ma funzionali. Non aspettarti GPT-4, ma per un server AI personale offline funziona.
🛠️ Metodo 1 — Ollama + Termux (più semplice)
1. Installa Termux
La versione di Termux sul Google Play Store è obsoleta — scaricala da F-Droid o direttamente da GitHub (github.com/termux/termux-app/releases).
2. Aggiorna Termux e installa Ollama
pkg update && pkg upgrade -y
pkg install ollama
3. Avvia il server Ollama in background
# In una sessione Termux
ollama serve &
4. Scarica Qwen3 (modelli consigliati per 6/8 GB RAM)
Puoi scegliere la dimensione più adatta: ollama run qwen3:0.6b oppure ollama run qwen3:1.7b
ollama pull qwen3:0.6b # ~400 MB — veloce
ollama pull qwen3:1.7b # ~1.1 GB — migliore qualità
Con 8 GB di RAM puoi osare anche il qwen3:4b (~2.5 GB).
5. Ollama è già un server OpenAI-compatibile
Ollama espone automaticamente http://localhost:11434 con endpoint compatibili con OpenAI. Puoi testarlo con:
curl http://localhost:11434/v1/chat/completions
-H "Content-Type: application/json"
-d '{"model":"qwen3:1.7b","messages":[{"role":"user","content":"Ciao!"}]}'
🛠️ Metodo 2 — llama.cpp diretto (più controllo)
Se vuoi più controllo o usare Qwen3.5:
pkg update && pkg upgrade -y
pkg install git cmake clang
# Clona llama.cpp
git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp
cmake -B build
cmake --build build --config Release -j4
# Scarica il modello GGUF da HuggingFace
pkg install wget
wget https://huggingface.co/Qwen/Qwen3-1.7B-GGUF/resolve/main/qwen3-1.7b-q4_k_m.gguf
Avvia come server HTTP (API OpenAI-compatibile):
./build/bin/llama-server
-m qwen3-1.7b-q4_k_m.gguf
--port 8080
--ctx-size 4096
--host 0.0.0.0
Avviando il server con --host 0.0.0.0, potrai accedere alle sue capacità AI non solo dal telefono stesso ma anche da altri dispositivi sulla stessa rete, come altri app o terminali.
🌐 Renderlo accessibile dalla rete locale
Una volta avviato il server, qualsiasi device sulla stessa Wi-Fi può usarlo come backend AI:
http://IP_DEL_NOTE9:8080/v1/chat/completions
Puoi trovare l’IP del telefono con:
ip addr show wlan0
💡 Trucchi importanti per Android
- Disabilita l’ottimizzazione batteria per Termux nelle impostazioni Android, altrimenti il processo viene killato
- Disabilita le restrizioni “phantom process” nelle opzioni sviluppatore del telefono
- Usa una microSD veloce per salvare i modelli (il Note 9 supporta fino a 1 TB)
- Tieni il telefono in carica durante l’uso intensivo
- Con 6 GB di RAM, chiudi tutte le altre app prima di avviare il server
📊 Aspettative realistiche
| Modello | RAM usata | Token/sec (CPU) | Qualità |
|---|---|---|---|
| Qwen3-0.6B | ~1 GB | 8-15 t/s | base |
| Qwen3-1.7B | ~2 GB | 4-8 t/s | buona |
| Qwen3-4B | ~4 GB | 2-4 t/s | ottima |
Per Qwen3.5 (il più recente), il modello da 2B è così compresso da poter girare su smartphone, mentre le varianti più grandi richiedono hardware più potente.
#!/data/data/com.termux/files/usr/bin/bash
# ╔══════════════════════════════════════════════════════╗
# ║ NOTE 9 AI SERVER — INSTALLER v1.0 ║
# ║ by Claude • Qwen3 su Termux + llama.cpp ║
# ╚══════════════════════════════════════════════════════╝
# ─── Colori ───────────────────────────────────────────
RED=’33[0;31m’
GREEN=’33[0;32m’
YELLOW=’33[1;33m’
CYAN=’33[0;36m’
BOLD=’33[1m’
RESET=’33[0m’
# ─── Variabili configurabili ──────────────────────────
SERVER_PORT=8080
MODEL_DIR=”$HOME/ai_models”
LOG_FILE=”$HOME/ai_server.log”
SERVICE_SCRIPT=”$HOME/start_ai_server.sh”
# ─── Funzioni di stampa ───────────────────────────────
print_banner() {
echo -e “${CYAN}”
echo ” ╔══════════════════════════════════════╗”
echo ” ║ 📱 NOTE 9 — AI SERVER INSTALLER ║”
echo ” ║ Qwen3 • llama.cpp • API ║”
echo ” ╚══════════════════════════════════════╝”
echo -e “${RESET}”
}
step() { echo -e “n${CYAN}${BOLD}[STEP $1]${RESET} $2”; }
ok() { echo -e “${GREEN} ✔ $1${RESET}”; }
warn() { echo -e “${YELLOW} ⚠ $1${RESET}”; }
err() { echo -e “${RED} ✗ $1${RESET}”; }
info() { echo -e ” → $1″; }
# ─── Selezione modello ────────────────────────────────
choose_model() {
echo -e “n${BOLD}Scegli il modello Qwen3 da installare:${RESET}”
echo “”
echo ” [1] Qwen3-0.6B (~400 MB) — Leggero, veloce, RAM < 2 GB”
echo ” [2] Qwen3-1.7B (~1.1 GB) — Bilanciato ★ Consigliato per Note 9″
echo ” [3] Qwen3-4B (~2.5 GB) — Ottima qualità, serve 8 GB RAM”
echo ” [4] Qwen3-8B (~5.0 GB) — Solo con RAM ≥ 8 GB + storage libero”
echo “”
read -p ” Scelta [1-4] (default: 2): ” MODEL_CHOICE
MODEL_CHOICE=${MODEL_CHOICE:-2}
case $MODEL_CHOICE in
1)
MODEL_SIZE=”0.6b”
MODEL_FILE=”qwen3-0.6b-q4_k_m.gguf”
MODEL_URL=”https://huggingface.co/Qwen/Qwen3-0.6B-GGUF/resolve/main/qwen3-0.6b-q4_k_m.gguf”
;;
2)
MODEL_SIZE=”1.7b”
MODEL_FILE=”qwen3-1.7b-q4_k_m.gguf”
MODEL_URL=”https://huggingface.co/Qwen/Qwen3-1.7B-GGUF/resolve/main/qwen3-1.7b-q4_k_m.gguf”
;;
3)
MODEL_SIZE=”4b”
MODEL_FILE=”qwen3-4b-q4_k_m.gguf”
MODEL_URL=”https://huggingface.co/Qwen/Qwen3-4B-GGUF/resolve/main/qwen3-4b-q4_k_m.gguf”
;;
4)
MODEL_SIZE=”8b”
MODEL_FILE=”qwen3-8b-q4_k_m.gguf”
MODEL_URL=”https://huggingface.co/Qwen/Qwen3-8B-GGUF/resolve/main/qwen3-8b-q4_k_m.gguf”
;;
*)
warn “Scelta non valida. Uso modello 1.7B di default.”
MODEL_SIZE=”1.7b”
MODEL_FILE=”qwen3-1.7b-q4_k_m.gguf”
MODEL_URL=”https://huggingface.co/Qwen/Qwen3-1.7B-GGUF/resolve/main/qwen3-1.7b-q4_k_m.gguf”
;;
esac
ok “Modello selezionato: Qwen3-${MODEL_SIZE}”
}
# ─── Controllo RAM disponibile ────────────────────────
check_ram() {
TOTAL_RAM_KB=$(grep MemTotal /proc/meminfo | awk ‘{print $2}’)
TOTAL_RAM_GB=$(echo “scale=1; $TOTAL_RAM_KB / 1024 / 1024” | bc)
FREE_RAM_KB=$(grep MemAvailable /proc/meminfo | awk ‘{print $2}’)
FREE_RAM_GB=$(echo “scale=1; $FREE_RAM_KB / 1024 / 1024” | bc)
info “RAM totale: ${TOTAL_RAM_GB} GB | RAM libera: ${FREE_RAM_GB} GB”
if [ “$TOTAL_RAM_KB” -lt 4000000 ]; then
warn “Meno di 4 GB RAM! Il modello 0.6B è l’unica opzione sicura.”
fi
}
# ─── Controllo storage ────────────────────────────────
check_storage() {
FREE_STORAGE=$(df -h “$HOME” | awk ‘NR==2{print $4}’)
info “Storage libero in HOME: $FREE_STORAGE”
}
# ─── Step 1: Aggiornamento pacchetti ──────────────────
step 1 “Aggiornamento repository Termux…”
pkg update -y 2>&1 | tail -3
pkg upgrade -y 2>&1 | tail -3
ok “Repository aggiornato”
# ─── Step 2: Dipendenze base ──────────────────────────
step 2 “Installazione dipendenze (git, cmake, clang, wget, bc)…”
pkg install -y git cmake clang wget bc make 2>&1 | tail -5
ok “Dipendenze installate”
# ─── Step 3: Info sistema ─────────────────────────────
step 3 “Analisi hardware del dispositivo…”
check_ram
check_storage
CPU_CORES=$(nproc)
info “Core CPU disponibili: $CPU_CORES”
# ─── Step 4: Scelta modello ───────────────────────────
step 4 “Selezione modello AI…”
choose_model
# ─── Step 5: Compilazione llama.cpp ───────────────────
step 5 “Download e compilazione llama.cpp…”
if [ -d “$HOME/llama.cpp” ]; then
warn “Cartella llama.cpp già esistente. Aggiornamento…”
cd “$HOME/llama.cpp” && git pull 2>&1 | tail -3
else
info “Clonazione repository llama.cpp…”
git clone https://github.com/ggml-org/llama.cpp “$HOME/llama.cpp” 2>&1 | tail -5
fi
cd “$HOME/llama.cpp”
info “Compilazione in corso (può richiedere 5-10 minuti)…”
cmake -B build -DLLAMA_CURL=OFF 2>&1 | tail -3
cmake –build build –config Release -j”$CPU_CORES” 2>&1 | tail -5
if [ -f “$HOME/llama.cpp/build/bin/llama-server” ]; then
ok “llama.cpp compilato con successo!”
else
err “Compilazione fallita. Controlla il log.”
exit 1
fi
# ─── Step 6: Download modello ─────────────────────────
step 6 “Download modello Qwen3-${MODEL_SIZE}…”
mkdir -p “$MODEL_DIR”
MODEL_PATH=”$MODEL_DIR/$MODEL_FILE”
if [ -f “$MODEL_PATH” ]; then
ok “Modello già presente: $MODEL_PATH”
else
info “Download da HuggingFace… (potrebbe volerci del tempo)”
wget -q –show-progress -O “$MODEL_PATH” “$MODEL_URL”
if [ $? -eq 0 ]; then
ok “Modello scaricato: $MODEL_PATH”
else
err “Download fallito! Verifica connessione internet.”
rm -f “$MODEL_PATH”
exit 1
fi
fi
# ─── Step 7: Generazione script di avvio ──────────────
step 7 “Creazione script di avvio server…”
cat > “$SERVICE_SCRIPT” << STARTSCRIPT
#!/data/data/com.termux/files/usr/bin/bash
# ─── AI SERVER AVVIO RAPIDO ───────────────────────────
MODEL_PATH=”$MODEL_PATH”
SERVER_BIN=”$HOME/llama.cpp/build/bin/llama-server”
PORT=$SERVER_PORT
LOG=”$LOG_FILE”
echo “🤖 Avvio AI Server su porta $PORT…”
echo ” Modello: $(basename $MODEL_PATH)”
echo ” Endpoint: http://$(ip route get 1 | awk ‘{print $7; exit}’):$PORT”
echo ” API: http://localhost:$PORT/v1/chat/completions”
echo “”
echo ” Premi CTRL+C per fermare il server”
echo “”
$SERVER_BIN
–model “$MODEL_PATH”
–port “$PORT”
–host 0.0.0.0
–ctx-size 4096
–n-predict 512
–threads $(nproc)
–log-file “$LOG”
-ngl 0
STARTSCRIPT
chmod +x “$SERVICE_SCRIPT”
ok “Script di avvio creato: $SERVICE_SCRIPT”
# ─── Step 8: Script di test ───────────────────────────
step 8 “Creazione script di test API…”
cat > “$HOME/test_ai.sh” << ‘TESTSCRIPT’
#!/data/data/com.termux/files/usr/bin/bash
PORT=8080
echo “🧪 Test chiamata API al server locale…”
curl -s http://localhost:$PORT/v1/chat/completions
-H “Content-Type: application/json”
-d ‘{
“model”: “qwen3”,
“messages”: [{“role”:”user”,”content”:”Rispondi in italiano: chi sei e cosa puoi fare?”}],
“max_tokens”: 200
}’ | python3 -c ”
import sys, json
try:
data = json.load(sys.stdin)
msg = data[‘choices’][0][‘message’][‘content’]
print(‘n✅ Risposta AI:n’)
print(msg)
except Exception as e:
print(‘❌ Errore:’, e)
print(‘Raw:’, sys.stdin.read())
”
TESTSCRIPT
chmod +x “$HOME/test_ai.sh”
ok “Script di test creato: ~/test_ai.sh”
# ─── Step 9: Alias utili ──────────────────────────────
step 9 “Configurazione alias rapidi in ~/.bashrc…”
grep -q “# AI Server aliases” “$HOME/.bashrc” 2>/dev/null || cat >> “$HOME/.bashrc” << ‘ALIASES’
# AI Server aliases
alias ai-start=’bash ~/start_ai_server.sh’
alias ai-test=’bash ~/test_ai.sh’
alias ai-log=’tail -f ~/ai_server.log’
alias ai-ip=’ip route get 1 | awk “{print $7; exit}”‘
ALIASES
ok “Alias aggiunti: ai-start, ai-test, ai-log, ai-ip”
# ─── Riepilogo finale ─────────────────────────────────
echo “”
echo -e “${GREEN}${BOLD}”
echo ” ╔═══════════════════════════════════════════╗”
echo ” ║ ✅ INSTALLAZIONE COMPLETATA! ║”
echo ” ╚═══════════════════════════════════════════╝”
echo -e “${RESET}”
echo “”
echo -e ” ${BOLD}COMANDI DISPONIBILI:${RESET}”
echo “”
echo -e ” ${CYAN}ai-start${RESET} → Avvia il server AI”
echo -e ” ${CYAN}ai-test${RESET} → Testa che il server risponda”
echo -e ” ${CYAN}ai-log${RESET} → Mostra i log in tempo reale”
echo -e ” ${CYAN}ai-ip${RESET} → Mostra l’IP del telefono”
echo “”
echo -e ” ${BOLD}ENDPOINT API (OpenAI-compatibile):${RESET}”
echo -e ” ${YELLOW}http://localhost:$SERVER_PORT/v1/chat/completions${RESET}”
echo -e ” ${YELLOW}http://$(ip route get 1 2>/dev/null | awk ‘{print $7; exit}’ || echo ‘IP_TELEFONO’):$SERVER_PORT/v1/chat/completions${RESET}”
echo “”
echo -e ” ${BOLD}AVVIO RAPIDO:${RESET}”
echo -e ” ${GREEN}source ~/.bashrc && ai-start${RESET}”
echo “”
echo -e ” ${BOLD}⚠ IMPORTANTE:${RESET}”
echo -e ” Vai in Impostazioni Android → App → Termux”
echo -e ” → Batteria → disabilita ‘Ottimizzazione batteria’”
echo “”
Ecco i due file creati:
note9_ai_server_install.sh — Lo script bash completo che fa tutto automaticamente:
- Aggiorna i pacchetti Termux
- Installa tutte le dipendenze (git, cmake, clang, ecc.)
- Controlla la RAM disponibile
- Ti fa scegliere il modello Qwen3 (0.6B / 1.7B / 4B / 8B)
- Compila llama.cpp direttamente sul telefono
- Scarica il modello da HuggingFace
- Crea
start_ai_server.shetest_ai.sh - Aggiunge gli alias
ai-start,ai-test,ai-log,ai-ip
Come usarlo sul Note 9:
- Copia lo script
.shsul telefono via USB o cloud - Apri Termux (da F-Droid, non Play Store!)
- Esegui:
bash
bash /sdcard/Download/note9_ai_server_install.sh
- Segui le istruzioni a schermo (~10-15 min per la compilazione)
- Poi basta digitare
ai-startper avviare il server ogni volta
Guida interattiva da aprire nel browser del Note 9, con tutti i comandi da copiare con un tap.
Note 9 AI Server
Qwen3 • llama.cpp • OpenAI API
Installa Termux da F-Droid per iniziare
① Scegli il modello ⚡ Qwen3-0.6B ~400 MB · 8-15 token/sec · RAM min 2 GB Veloce ⭐ Qwen3-1.7B ~1.1 GB · 4-8 token/sec · RAM min 3 GB Consigliato 🔥 Qwen3-4B ~2.5 GB · 2-4 token/sec · RAM min 6 GB 6 GB RAM 💎 Qwen3-8B ~5.0 GB · 1-2 token/sec · RAM 8 GB Solo 8 GB
② Segui i passaggi
1 Installa Termux ▼ ⚠ NON usare la versione del Play Store (obsoleta). Scarica da F-Droid. 🌐 Link download
https://f-droid.org/packages/com.termux/
Apri il link nel browser, scarica e installa l’APK. Abilita “Sorgenti sconosciute” se richiesto.
2 Scarica lo script installer ▼
Apri Termux e incolla questo comando:
💻 Termux
wget -O install_ai.sh "https://tuo-server/note9_ai_server_install.sh" && bash install_ai.sh
✓ In alternativa: copia lo script sul telefono via USB e salvalo come ~/install_ai.sh
3 Installa manualmente (opzione alternativa) ▼ 💻 1 — Aggiorna e installa dipendenze
pkg update -y && pkg upgrade -y pkg install -y git cmake clang wget bc make
💻 2 — Compila llama.cpp
git clone https://github.com/ggml-org/llama.cpp ~/llama.cpp cd ~/llama.cpp cmake -B build -DLLAMA_CURL=OFF cmake --build build --config Release -j$(nproc)
💻 3 — Scarica Qwen3-1.7B
mkdir -p ~/ai_models wget -O ~/ai_models/qwen3-1.7b-q4_k_m.gguf "https://huggingface.co/Qwen/Qwen3-1.7B-GGUF/resolve/main/qwen3-1.7b-q4_k_m.gguf"
💻 4 — Avvia il server
~/llama.cpp/build/bin/llama-server --model ~/ai_models/qwen3-1.7b-q4_k_m.gguf --port 8080 --host 0.0.0.0 --ctx-size 4096 --threads $(nproc)
4 Disabilita ottimizzazione batteria ▼ ⚠ Android può killare Termux in background. Questo step è fondamentale!
Impostazioni → App → Termux → Batteria
→ seleziona “Nessuna restrizione”
Anche: Impostazioni Sviluppatore → disabilita “Limit phantom processes”
5 Testa il server ▼ 💻 Test API
curl http://localhost:8080/v1/chat/completions
-H "Content-Type: application/json"
-d '{"model":"qwen3","messages":[{"role":"user","content":"Ciao!"}],"max_tokens":100}'
✓ Se vedi una risposta JSON con “choices”, il server funziona! 🎉
Comandi rapidi (dopo installazione)
Endpoint API (OpenAI-compatibile)
http://localhost:8080/v1/chat/completions http://IP_TELEFONO:8080/v1/chat/completions
Usa questo endpoint come “base URL” in qualsiasi app compatibile con OpenAI API (OpenWebUI, Obsidian, ecc.)
✓ Copiato!
[/fsn_text][/fsn_column][/fsn_row]





