#!/usr/bin/env python3 """Create or validate the standalone GLM-5.3 Flash vision encoder GGUF.""" from __future__ import annotations import argparse import hashlib import io import json import os import shutil import struct import sys from glm53_quantize import ( GGUF_ALIGNMENT, GGUF_ARRAY, GGUF_FLOAT32, GGUF_STRING, GGUF_UINT32, GGUF_UINT64, GGUF_VERSION, QTYPE_BF16, QTYPE_NAMES, SourceDB, TensorPlan, align, fail, kv_f32, kv_string, kv_u32, kv_u64, pack_string, qtype_nbytes, read_exact, read_gguf_string, read_u32, read_u64, skip_gguf_value, tensor_header, ) DEFAULT_SOURCE_REVISION = "84c6a6aa9497188e15a635ba793b0f95a79b1033" ARCHITECTURE = "glm5-next-vision" def kv_f32_array(key, values): return ( pack_string(key) + struct.pack(" data_offset: fail("GGUF header exceeds its planned data offset") fp.write(bytes(data_offset - fp.tell())) for index, item in enumerate(plan, 1): if fp.tell() != data_offset + item.offset: fail(f"{item.name}: output offset mismatch") written = 0 for chunk in db.iter_read(item.source): fp.write(chunk) written += len(chunk) if written != item.nbytes: fail(f"{item.name}: copied {written} bytes, expected {item.nbytes}") fp.write(bytes(align(item.nbytes) - item.nbytes)) if index % 25 == 0 or index == len(plan): print(f"copied tensors: {index}/{len(plan)}", file=sys.stderr, flush=True) fp.flush() os.fsync(fp.fileno()) os.replace(partial, path) def read_metadata_value(fp, value_type): if value_type == GGUF_STRING: return read_gguf_string(fp, "GGUF metadata string") if value_type == GGUF_UINT32: return read_u32(fp, "GGUF metadata uint32") if value_type == GGUF_UINT64: return read_u64(fp, "GGUF metadata uint64") if value_type == GGUF_FLOAT32: return struct.unpack(" data_offset: fail("parsed GGUF header exceeds the planned data offset") actual_size = os.fstat(fp.fileno()).st_size if actual_size != data_offset + data_bytes: fail(f"file size {actual_size} != expected {data_offset + data_bytes}") verified = 0 if verify_payload: for index, item in enumerate(plan, 1): fp.seek(data_offset + item.offset) for source in db.iter_read(item.source): if read_exact(fp, len(source), item.name) != source: fail(f"{item.name}: payload differs from the official source") verified += len(source) padding = read_exact(fp, align(item.nbytes) - item.nbytes, f"{item.name} padding") if any(padding): fail(f"{item.name}: nonzero alignment padding") if index % 25 == 0 or index == len(plan): print(f"verified payloads: {index}/{len(plan)}", file=sys.stderr, flush=True) print( f"validated {path}: {len(plan)} {QTYPE_NAMES[QTYPE_BF16]} tensors, " f"{actual_size} bytes" ) digest = file_sha256(path) if expected_sha256 and digest.lower() != expected_sha256.lower(): fail(f"SHA-256 {digest} != expected {expected_sha256.lower()}") print(f"SHA-256: {digest}") if verify_payload: print(f"source payloads matched byte for byte: {verified} bytes") def parse_args(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--hf", required=True, help="official GLM-5.3 Flash snapshot") output = parser.add_mutually_exclusive_group() output.add_argument("--out", help="create this vision GGUF") output.add_argument("--validate", metavar="GGUF", help="validate an existing vision GGUF") parser.add_argument("--source-revision", default=DEFAULT_SOURCE_REVISION) parser.add_argument("--verify-payload", action="store_true") parser.add_argument("--expected-sha256", help="expected hash when validating") parser.add_argument("--overwrite", action="store_true") parser.add_argument("--dry-run", action="store_true") args = parser.parse_args() if not args.dry_run and not args.out and not args.validate: parser.error("one of --out, --validate, or --dry-run is required") if args.verify_payload and not args.validate: parser.error("--verify-payload requires --validate") if args.expected_sha256 and not args.validate: parser.error("--expected-sha256 requires --validate") return args def main(): args = parse_args() db = SourceDB(args.hf) try: plan = build_vision_plan(db) metadata = vision_metadata(args.hf, args.source_revision) if args.dry_run: print_summary(plan, metadata) elif args.out: create_gguf(args.out, plan, metadata, db, args.overwrite) print(f"glm53-vision: wrote {args.out}", file=sys.stderr) else: validate_gguf( args.validate, plan, metadata, db, args.verify_payload, args.expected_sha256, ) finally: db.close() if __name__ == "__main__": try: main() except (KeyError, OSError, ValueError, json.JSONDecodeError) as error: print(f"glm53-vision: error: {error}", file=sys.stderr) sys.exit(1)