The 2026-10-09 wire aliases become the service names everywhere: systemd units, serve scripts, env files and FRANK_* variables, deploy-plan/deploy-remote service keys, container names, Prometheus job names + alert rules, Grafana dashboard queries, bats seams, runbook filenames, homepage/AGENTS lore, and historical prose. Rollback tags renamed in lockstep. Residue in the tree: zero. Retired frank-medium/small/npu names are history and stay. Known casualty: scripts/patches/*.patch context lines were rewritten; those retired-era vLLM-fork patches no longer apply byte-exact.
120 lines
5.1 KiB
Bash
Executable File
120 lines
5.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# download-frank-dragoon-flashnext.sh — fetch frank-dragoon's flash-server v2
|
|
# payload: the Quat3rnion abliterated Swift1.5 checkpoint of peonist's v2
|
|
# .hgn, the REQUIRED lookup table and the optional vision tower from
|
|
# peonist-ai/halogen-qwen3.8-flash-next (both at the revisions the model
|
|
# card pins), and the flat tokenizer the two repos share. All public, no
|
|
# token — and per the fleet secret law, none would ever touch argv.
|
|
#
|
|
# The fetch law, same as every sibling script: curl -f (an access error
|
|
# must not become a "successful" 153-byte artifact), exact byte count from
|
|
# the Hub tree API, LFS sha256 verification, --verify-only to re-check an
|
|
# existing payload without downloading.
|
|
#
|
|
# File manifest (verified against the Hub tree API on 2026-10-06):
|
|
# qwen38-flash-next-v2-swift15-abliterated.hgn 66,687,678,464 B sha256
|
|
# 9c880b8ba48deabfa06172eff1e7572e4fe465e09e97faec6e50c3f6fdcac037
|
|
# (Quat3rnion main; compacted r2 of the card's 89,775,868,032 B
|
|
# append-only original — byte-identical live tensors, dropped padding)
|
|
# qwen38-flash-next-ngram.hgn 51,200,246,144 B sha256
|
|
# 3450acada94e19aabad88bd49b45eb70304820949c2240fc178067b20ae5dffe
|
|
# (peonist @5cc17cea; REQUIRED — the engine reads it beside the
|
|
# checkpoint)
|
|
# qwen38-flash-next-vision.hgn 897,916,416 B sha256
|
|
# d62e0ae553fe88afd3833733d4a4c669f34d20fd8dfce4b9610525bed2134b10
|
|
# (peonist @e053f488; optional, enables image input)
|
|
# tokenizer/* @e053f488 — byte-identical to the 27B-era tokenizer
|
|
# already on disk (tokenizer.json LFS
|
|
# 0997f410c57a1f4e53b09e4be8f4a172d90edd9564368fb0847030937229b9f3);
|
|
# fetched fresh rather than symlinked, per the no-symlink law.
|
|
set -euo pipefail
|
|
|
|
DEST="${FRANK_DRAGOON_MODEL_DIR:-$HOME/models/halogen-flashnext-v2}"
|
|
ABLIT="https://huggingface.co/Quat3rnion/halogen-swift1.5-qwen3.8-flash-next-v2-abliterated/resolve/main"
|
|
PEONIST="https://huggingface.co/peonist-ai/halogen-qwen3.8-flash-next/resolve"
|
|
NGRAM_REV="5cc17cea1a10b502b4a5db41d8d2b1a0f22dba26"
|
|
TOK_REV="e053f488b120b99ed2525e6ac99f68c51b3b6179"
|
|
|
|
FILES=(qwen38-flash-next-v2-swift15-abliterated.hgn
|
|
qwen38-flash-next-ngram.hgn
|
|
qwen38-flash-next-vision.hgn
|
|
tokenizer/tokenizer.json
|
|
tokenizer/chat_template.jinja
|
|
tokenizer/generation_config.json
|
|
tokenizer/merges.txt
|
|
tokenizer/vocab.json
|
|
tokenizer/tokenizer_config.json)
|
|
SIZES=(66687678464
|
|
51200246144
|
|
897916416
|
|
12809320
|
|
8952
|
|
202
|
|
3353259
|
|
6722759
|
|
17928)
|
|
SHAS=(9c880b8ba48deabfa06172eff1e7572e4fe465e09e97faec6e50c3f6fdcac037
|
|
3450acada94e19aabad88bd49b45eb70304820949c2240fc178067b20ae5dffe
|
|
d62e0ae553fe88afd3833733d4a4c669f34d20fd8dfce4b9610525bed2134b10
|
|
0997f410c57a1f4e53b09e4be8f4a172d90edd9564368fb0847030937229b9f3
|
|
- - - - - -)
|
|
|
|
# Fetch source per file: repo base + revision (empty = ABLIT @main).
|
|
SRCS=("$ABLIT"
|
|
"$PEONIST/$NGRAM_REV"
|
|
"$PEONIST/$TOK_REV"
|
|
"$PEONIST/$TOK_REV"
|
|
"$PEONIST/$TOK_REV"
|
|
"$PEONIST/$TOK_REV"
|
|
"$PEONIST/$TOK_REV"
|
|
"$PEONIST/$TOK_REV"
|
|
"$PEONIST/$TOK_REV")
|
|
|
|
VERIFY_ONLY=0
|
|
[ "${1:-}" = "--verify-only" ] && VERIFY_ONLY=1
|
|
|
|
mkdir -p "$DEST"
|
|
|
|
for i in "${!FILES[@]}"; do
|
|
f="${FILES[$i]}"; want="${SIZES[$i]}"; sha="${SHAS[$i]}"; base="${SRCS[$i]}"
|
|
path="$DEST/$f"
|
|
mkdir -p "$(dirname "$path")"
|
|
if [ "$VERIFY_ONLY" -eq 0 ]; then
|
|
# A file already at the published size skips the fetch entirely:
|
|
# resuming it would ask the CDN for a range past EOF (416 -> curl
|
|
# error under set -e), and re-pulling 62 GiB to prove a point is
|
|
# not what --verify-only is for. sha256 below still decides.
|
|
if [ -f "$path" ] && [ "$(stat -c %s "$path")" = "$want" ]; then
|
|
echo "HAVE $f ($want bytes) — skipping fetch"
|
|
else
|
|
echo "FETCH $f -> $path"
|
|
# HF answers /resolve/ with a 302 to the Xet CDN and curl DROPS
|
|
# the Range header across redirects — a naive -C - then
|
|
# "resumes" by pulling the ~1 KB redirect body (measured
|
|
# 2026-10-05 on the 27B fetch: file frozen 14 MiB short, curl
|
|
# exit 0). Resolve the effective URL first, then resume
|
|
# against the CDN, which honors Range.
|
|
url=$(curl -sfIL -o /dev/null -w '%{url_effective}' "$base/$f") \
|
|
|| { echo "cannot resolve $base/$f" >&2; exit 1; }
|
|
curl -fL --retry 5 -C - -o "$path" "$url"
|
|
fi
|
|
fi
|
|
[ -f "$path" ] || { echo "MISSING $path (run without --verify-only)" >&2; exit 1; }
|
|
got="$(stat -c %s "$path")"
|
|
[ "$got" = "$want" ] || { echo "SIZE $path: $got != $want" >&2; exit 1; }
|
|
echo "OK $f ($got bytes)"
|
|
done
|
|
|
|
echo "byte counts match; verifying sha256 where the Hub publishes an LFS oid..."
|
|
for i in "${!FILES[@]}"; do
|
|
f="${FILES[$i]}"; sha="${SHAS[$i]}"
|
|
if [ "$sha" = "-" ]; then
|
|
echo "OK $f (plain git blob, size-checked)"
|
|
continue
|
|
fi
|
|
got="$(sha256sum "$DEST/$f" | cut -d' ' -f1)"
|
|
[ "$got" = "$sha" ] || { echo "SHA256 $f: $got != $sha" >&2; exit 1; }
|
|
echo "OK $f sha256"
|
|
done
|
|
echo "DOWNLOAD_DONE $DEST"
|