# Rebuilding the ONNX files Needs ~8 GB RAM plus swap (the fp32→fp16 pass peaks around 6 GB), Python 3.11, and about 4 GB of disk. Runs on CPU; a Mac is fine. ```bash pip install torch "gliner2[local]" onnx onnxruntime onnxscript onnxconverter-common transformers python export_onnx.py dynamo # -> onnx/model.onnx + model.onnx.data, config.json, tokenizer (~1 min) python quantize_q4.py # -> onnx/model_q4.onnx (only the q4 step matters; ignore its fp16 error) python convert_fp16.py model.onnx model_fp16.onnx python convert_fp16.py model_q4.onnx model_q4f16.onnx MatMulNBits python verify_parity.py # fp32 vs the Python library on 3 prompts (expects ~1e-7) python verify_variants.py # fp16/q4/q4f16 vs fp32 on cases.json ``` Then rename the external data files to Transformers.js's convention and patch the `location` field inside each graph: ```python import onnx, os from onnx.external_data_helper import _get_all_tensors for name in ["model", "model_fp16", "model_q4", "model_q4f16"]: m = onnx.load(f"onnx/{name}.onnx", load_external_data=False) for t in _get_all_tensors(m): for kv in t.external_data: if kv.key == "location": kv.value = f"{name}.onnx_data" onnx.save(m, f"onnx/{name}.onnx"); os.rename(f"onnx/{name}.onnx.data", f"onnx/{name}.onnx_data") ``` `node_test.mjs` runs the whole open-jev path in Node against `reference.json` (Python token ids and probabilities for `cases.json`). Paths inside the scripts are absolute (`/home/claude/g2/...`); adjust `OUT` / `D` at the top of each.