#!/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 " 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'"