"""GGUF v3 writer and q4 tensor decoder reused from the v2 release.""" import argparse import hashlib import json import os import struct import sys import numpy as np MAGIC = b"GGUF" VERSION = 3 ALIGNMENT = 32 # GGUF metadata value types T_UINT8, T_INT8, T_UINT16, T_INT16 = 0, 1, 2, 3 T_UINT32, T_INT32, T_FLOAT32, T_BOOL = 4, 5, 6, 7 T_STRING, T_ARRAY, T_UINT64 = 8, 9, 10 # GGML tensor types GGML_F16, GGML_I8 = 1, 24 # ---------------------------------------------------------------------------- q4 decoding (mirrors bhc/xlit_q.py) def read_q4(path): blob = open(path, "rb").read() n = int.from_bytes(blob[:4], "little") header = blob[4:4 + n] meta = json.loads(header) return blob, header, meta, blob[4 + n:] def dequantise(meta, data): """Dequantise every tensor of an xlit.q4 payload to float32 (same arithmetic as bhc/xlit_q.py).""" bits_default, G = int(meta["bits"]), int(meta["G"]) out = [] for k, shape, kind, off, ln in meta["tensors"]: cnt = int(np.prod(shape)) if kind.startswith("q"): bits = int(kind[1:]) if len(kind) > 1 else bits_default if bits == 4: raw = np.frombuffer(data, np.uint8, ln, off) q = np.stack([raw >> 4, raw & 15], 1).reshape(-1)[:cnt].astype(np.int16) - 8 else: q = np.frombuffer(data, np.int8, ln, off).astype(np.int16) r, c = shape ng = (c + G - 1) // G sc = np.frombuffer(data, np.float16, r * ng, off + ln).astype(np.float32).reshape(r, ng) w = q.reshape(r, c).astype(np.float32) * np.repeat(sc, G, 1)[:, :c] else: w = np.frombuffer(data, np.float16, cnt, off).astype(np.float32).reshape(shape).copy() out.append((k, list(shape), w)) return out # ---------------------------------------------------------------------------- GGUF writer (spec-conformant, v3) class Writer: def __init__(self): self.kv = [] # -- typed metadata helpers def add(self, key, vtype, value): self.kv.append((key, vtype, value)) return self def string(self, k, v): return self.add(k, T_STRING, v) def uint32(self, k, v): return self.add(k, T_UINT32, int(v)) def uint64(self, k, v): return self.add(k, T_UINT64, int(v)) def float32(self, k, v): return self.add(k, T_FLOAT32, float(v)) def boolean(self, k, v): return self.add(k, T_BOOL, bool(v)) def strings(self, k, v): return self.add(k, T_ARRAY, (T_STRING, list(v))) @staticmethod def _kv_bytes(key, vtype, value): out = bytearray() def s(x): b = x.encode("utf-8") return struct.pack("