remove_gguf_thinking.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import struct
  2. import sys
  3. src = r'Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-NoThink-Q4_K_M.gguf'
  4. if len(sys.argv) > 1:
  5. src = sys.argv[1]
  6. with open(src, 'rb') as f:
  7. data = bytearray(f.read())
  8. key = b'tokenizer.chat_template'
  9. kp = data.find(key)
  10. kl = struct.unpack('<Q', data[kp-8:kp])[0]
  11. sl = struct.unpack('<Q', data[kp+kl+4:kp+kl+12])[0]
  12. sp = kp + kl + 12
  13. template = data[sp:sp+sl].decode('utf-8').rstrip(' ')
  14. old = (
  15. "{%- if add_generation_prompt %}\n"
  16. " {{- '<|im_start|>assistant\\n' }}\n"
  17. " {%- if enable_thinking is defined and enable_thinking is false %}\n"
  18. " {{- '<think>\\n\\n</think>\\n\\n' }}\n"
  19. " {%- else %}\n"
  20. " {{- '<think>\\n' }}\n"
  21. " {%- endif %}\n"
  22. "{%- endif %}"
  23. )
  24. new = (
  25. "{%- if add_generation_prompt %}\n"
  26. " {{- '<|im_start|>assistant\\n' }}\n"
  27. " {{- '<think>\\n\\n</think>\\n\\n' }}\n"
  28. "{%- endif %}"
  29. )
  30. if old in template:
  31. template = template.replace(old, new)
  32. new_bytes = template.encode('utf-8')
  33. if len(new_bytes) > sl:
  34. print("ERROR: New template longer than original")
  35. exit(1)
  36. padded = new_bytes + b' ' * (sl - len(new_bytes))
  37. data[sp:sp+sl] = padded
  38. with open(src, 'wb') as f:
  39. f.write(data)
  40. print("Done: enable_thinking conditional removed, forced empty think block")
  41. else:
  42. print("No enable_thinking conditional found in template")
  43. idx = template.find('enable_thinking')
  44. if idx >= 0:
  45. print("Found at position", idx)
  46. print(template[idx-50:idx+200])