#!/usr/bin/env python3
"""
Merge QLoRA adapter into base model and convert to GGUF for llama.cpp.

Usage:
  python3 merge_adapter.py
"""

import os
os.environ["CUDA_VISIBLE_DEVICES"] = ""

from pathlib import Path
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

MODEL_NAME = "/home/vincent/projects/bitcoin-ai/model"
ADAPTER_DIR = Path(__file__).parent.parent / "output" / "dev_ai_model" / "final_adapter"
OUTPUT_DIR = Path(__file__).parent.parent / "output" / "merged_model"


def merge():
    print("Loading base model...")
    model = AutoModelForCausalLM.from_pretrained(
        MODEL_NAME,
        torch_dtype=torch.float16,
        low_cpu_mem_usage=True,
        device_map="cpu",
    )
    
    print("Merging adapter...")
    from peft import PeftModel
    model = PeftModel.from_pretrained(model, str(ADAPTER_DIR))
    model = model.merge_and_unload()
    
    print(f"Saving merged model to {OUTPUT_DIR}...")
    OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
    model.save_pretrained(str(OUTPUT_DIR))
    
    print("Saving tokenizer...")
    tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
    tokenizer.save_pretrained(str(OUTPUT_DIR))
    
    print("Merge complete. Run llama.cpp convert script next.")


if __name__ == "__main__":
    merge()