Thanatos-27B / scripts /build.sh
FoolDev's picture
Rename back: Thanatos-27B-Heretic → Thanatos-27B (HF repo also renamed)
7197abd
#!/usr/bin/env bash
# Thanatos-27B — fetch a Qwen 3.6 27B GGUF and build the Ollama model.
#
# Usage:
# ./scripts/build.sh # default: Q4_K_M
# ./scripts/build.sh Q5_K_M # different quant
# QUANT=Q6_K ./scripts/build.sh
#
# Skip the download by pointing at a GGUF you already have:
# GGUF_PATH=/path/to/Qwen3.6-27B-Q4_K_M.gguf ./scripts/build.sh Q4_K_M
#
# Requires: huggingface-cli (or hf), ollama, awk.
set -euo pipefail
QUANT="${1:-${QUANT:-Q4_K_M}}"
REPO_ID="${REPO_ID:-unsloth/Qwen3.6-27B-GGUF}"
# Upstream uses dashes, e.g. Qwen3.6-27B-Q4_K_M.gguf. Quants known to exist
# at unsloth/Qwen3.6-27B-GGUF (as of 2026-04):
# Q3_K_S Q3_K_M Q4_0 Q4_1 Q4_K_S Q4_K_M Q5_K_S Q5_K_M Q6_K Q8_0
# IQ4_XS IQ4_NL
# UD-IQ2_XXS UD-IQ2_M UD-Q2_K_XL UD-IQ3_XXS UD-Q3_K_XL UD-Q4_K_XL
# UD-Q5_K_XL UD-Q6_K_XL UD-Q8_K_XL
GGUF_NAME="Qwen3.6-27B-${QUANT}.gguf"
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
# GGUF_PATH defaults to ${ROOT}/${GGUF_NAME}, but can be overridden so users
# with cached weights elsewhere don't have to copy or symlink anything.
GGUF_PATH="${GGUF_PATH:-${ROOT}/${GGUF_NAME}}"
MODELFILE="${ROOT}/Modelfile"
TAG="${TAG:-thanatos-27b}"
echo "[*] repo: ${REPO_ID}"
echo "[*] quant: ${QUANT}"
echo "[*] tag: ${TAG}"
echo "[*] modelfile:${MODELFILE}"
echo "[*] gguf: ${GGUF_PATH}"
# ---- 1. Sanity ---------------------------------------------------------------
if ! command -v ollama >/dev/null 2>&1; then
echo "[!] ollama not found in PATH" >&2; exit 1
fi
if [[ ! -f "${MODELFILE}" ]]; then
echo "[!] Missing ${MODELFILE}" >&2; exit 1
fi
# ---- 2. Download GGUF if missing --------------------------------------------
if [[ -f "${GGUF_PATH}" ]]; then
echo "[=] GGUF already present at ${GGUF_PATH}, skipping download."
else
# Need a HF CLI to fetch the file.
HF=""
if command -v hf >/dev/null 2>&1; then
HF="hf"
elif command -v huggingface-cli >/dev/null 2>&1; then
HF="huggingface-cli"
else
echo "[!] ${GGUF_PATH} not found, and neither 'hf' nor" >&2
echo " 'huggingface-cli' is installed to download it." >&2
echo " Either:" >&2
echo " pip install -U huggingface_hub" >&2
echo " or set GGUF_PATH to an existing GGUF and rerun." >&2
exit 1
fi
echo "[*] Downloading ${GGUF_NAME} from ${REPO_ID} ..."
DEST_DIR="$(dirname "${GGUF_PATH}")"
mkdir -p "${DEST_DIR}"
case "${HF}" in
hf) hf download "${REPO_ID}" "${GGUF_NAME}" --local-dir "${DEST_DIR}" ;;
huggingface-cli) huggingface-cli download "${REPO_ID}" "${GGUF_NAME}" --local-dir "${DEST_DIR}" ;;
esac
fi
if [[ ! -f "${GGUF_PATH}" ]]; then
echo "[!] GGUF still not present at ${GGUF_PATH} after download attempt." >&2
exit 1
fi
# ---- 3. Patch the Modelfile FROM line in a temp copy -------------------------
TMP_MODELFILE="$(mktemp -t thanatos27b-modelfile.XXXXXX)"
trap 'rm -f "${TMP_MODELFILE}"' EXIT
awk -v p="${GGUF_PATH}" '
/^FROM[[:space:]]/ && !done { print "FROM " p; done=1; next }
{ print }
' "${MODELFILE}" > "${TMP_MODELFILE}"
# ---- 4. Create the Ollama model ---------------------------------------------
echo "[*] ollama create ${TAG} -f <patched modelfile>"
ollama create "${TAG}" -f "${TMP_MODELFILE}"
echo
echo "[+] Done. Try it:"
echo " ollama run ${TAG}"
echo " python ${ROOT}/examples/ollama_chat.py # update MODEL constant if not 'thanatos-27b'"