#!/usr/bin/env python3 """Add tokenizer.ggml.mask_token_id to the DSpark draft GGUF. llama.cpp's DSpark spec reads the draft's mask token via llama_vocab_mask(vocab) -> tokenizer.ggml.mask_token_id. Our rewritten draft copied K3's tokenizer, which has no mask token, so it returns -1 and the draft batch gets fed token -1 -> 'invalid token[1] = -1' -> draft decode fails every step. The draft's *trained* mask id lives in dflash.mask_token_id (163824). We copy it into tokenizer.ggml.mask_token_id so llama_vocab_mask() returns the right id. """ import struct, sys SRC = "/root/models/k3-draft/draft_final.gguf" DST = "/root/models/k3-draft/draft_masked.gguf" MASK_KEY = b"tokenizer.ggml.mask_token_id" DFLASH_MASK_KEY = b"dflash.mask_token_id" def read_kv(data, pos): klen = struct.unpack_from("