#!/usr/bin/env bash # Download the frank-small payload for llama.cpp on the RTX 3090: # ukisai/Swift-1.5-Qwen3.8-27B-GSQ-RCO-GGUF:IQ3_S **with the MTP head in the # file** (the -mtp variant), plus a vision projector. No Swift repo ships a # projector — ukisai's release is language-model-only ("A Swift 27B vision # projector has not been verified for this release") — so this script fetches # unsloth's mmproj-F16.gguf built from the shared base Qwen/Qwen3.8-27B. # That substitution is proven, not assumed: on 2026-10-05 Swift-1.5's vision # stack was hash-compared against the base over HTTP range reads — 333/333 # visual tensor names and 6/6 sampled tensors byte-identical (merger fc1/fc2, # blocks 0/13/26) — so the base-model projector IS the model's own projector. # Public repos — no auth header, and never a token on the command line (it is # world-readable in /proc//cmdline). # # Fresh downloads, no resume (`curl -C -` once produced a 213 MB oversized file # on a 31 GiB payload); -f/--fail-with-body so an HTTP error is not a success, # then byte count and the Hub LFS sha256. Idempotent: complete files are # skipped. The projector is stored under a self-documenting dest name; the # URL name and sha stay pinned in the table below. # # 2026-10-05 (Frank, evening): the payload moved to Swift-1.5-27B GSQ-RCO # IQ3_S-mtp — a 27B on the 24 GiB card: ONE 131,072-token slot, q8_0 K + q8_0 # V, the in-file MTP head drafting 3. This supersedes the Ornith-1.5-9B Q8_0 # swap (commits 77decb5..380aafa, same day), which was committed but never # deployed — the live service was still MiMo-V2.6 Q6_K when Swift cut over. # Rollback payloads stay on disk: /home/dank/models/Ornith-Q8/ and # /home/dank/models/MiMo-Q6K/ (the payload that was live until this swap). # Their re-fetch recipes are in git history (predecessors of this script). # # Usage: # scripts/download-frank-small.sh [DEST_DIR] [--verify-only] set -euo pipefail DEST="" VERIFY_ONLY=0 for arg in "$@"; do case "$arg" in --verify-only) VERIFY_ONLY=1 ;; *) DEST="$arg" ;; esac done DEST="${DEST:-/home/dank/models/Swift15-IQ3S}" # repo | hub-name | dest-name | bytes | sha256 (the Hub LFS oid) FILES=( "ukisai/Swift-1.5-Qwen3.8-27B-GSQ-RCO-GGUF|Swift-1.5-Qwen3.8-27B-GSQ-RCO-IQ3_S-mtp.gguf|Swift-1.5-Qwen3.8-27B-GSQ-RCO-IQ3_S-mtp.gguf|12120016896|9aecf1cd41b2cb2f32a74e0d889e33855ebef43b26f43b43feb5720239e677e5" "unsloth/Qwen3.8-27B-GGUF|mmproj-F16.gguf|mmproj-Qwen3.8-27B-F16.gguf|927607488|cbb841a9ee0636b2ec172f5bb8df2ea8dfeb01e90fe7c6126581d662a0b4e43e" ) mkdir -p "$DEST" status=0 for entry in "${FILES[@]}"; do IFS='|' read -r repo hubname destname size sha <<<"$entry" url="https://huggingface.co/${repo}/resolve/main/${hubname}" f="$DEST/$destname" have=0 if [[ -f "$f" ]] && [[ "$(stat -c%s "$f")" == "$size" ]]; then if sha256sum -c --quiet <(printf '%s %s\n' "$sha" "$f"); then have=1 fi fi if (( have )); then echo "OK $destname" continue fi if (( VERIFY_ONLY )); then echo "MISSING $destname" status=1 continue fi echo "FETCHING $destname (from $repo)" tmp="$f.part" curl -fsSL --fail-with-body -o "$tmp" "$url" mv "$tmp" "$f" if [[ "$(stat -c%s "$f")" != "$size" ]]; then echo "SIZE FAIL $destname ($(stat -c%s "$f") != $size)" status=1 continue fi if ! sha256sum -c --quiet <(printf '%s %s\n' "$sha" "$f"); then echo "SHA FAIL $destname" status=1 continue fi echo "VERIFIED $destname" done if (( status == 0 )); then echo "DOWNLOAD_DONE $DEST" else echo "DOWNLOAD_FAILED $DEST" >&2 fi exit "$status"