# Task: Swap Qwen3-4B Encoder for Heretic Abliterated Version

**Datum:** 2026-04-10
**Status:** ✅ COMPLETE — Heretic encoder swapped and live-tested 2026-04-10
**Depends on:** FLUX.2 Klein 4B working (✅ done as of 2026-04-10)

---

## Goal

Replace the standard `qwen_3_4b_klein.safetensors` with an abliterated (Heretic) version that has:
- **Zero measurable quality loss** (KL divergence = 0.0000)
- **No prompt refusals** (≤3/100 in DreamFast v1.2.0 testing)

Result: `generate_image(prompt, model="flux-2-klein-4b.safetensors")` will work with **any** prompt without refusals.

---

## Current State

| File | Location | Status |
|------|----------|--------|
| `flux-2-klein-4b.safetensors` | `~/ComfyUI/models/diffusion_models/` | ✅ Working |
| `qwen_3_4b_klein.safetensors` | `~/ComfyUI/models/text_encoders/` | ✅ Working (standard, has refusals) |
| `flux2-vae.safetensors` | `~/ComfyUI/models/vae/` | ✅ Working |

The MCP workflow [`mcp/mcp-image-gen/src/workflows/flux2_klein_heretic.json`](../mcp/mcp-image-gen/src/workflows/flux2_klein_heretic.json) already uses `qwen_3_4b_klein.safetensors` — **no code change needed**, only the file on disk needs to be replaced.

---

## The Problem to Solve First

The standard Heretic repos may not have the **FLUX.2 Klein-compatible** encoder dimensions:

| Encoder | `hidden_size` | Conditioning dim | Usable? |
|---------|--------------|-----------------|---------|
| BFL Qwen3-4B (FLUX.2 Klein) | **2560** | 7680 (2560×3) | ✅ |
| DreamFast/qwen3-4b-heretic | unknown — must check | ? | ⚠️ verify first |
| Standard Qwen3-4B | 4096 | 4096 | ❌ wrong |

**Before downloading, verify DreamFast's model is fine-tuned from the BFL variant** (hidden_size=2560), not the standard Qwen3 (hidden_size=4096).

---

## Steps

### Step 1: Check DreamFast Heretic repo

```bash
huggingface-cli model-info DreamFast/qwen3-4b-heretic 2>/dev/null | grep -i hidden
```

Or browse: https://huggingface.co/DreamFast/qwen3-4b-heretic/blob/main/config.json  
Look for: `"hidden_size": 2560` — that's the FLUX.2 Klein-compatible version.

### Step 2a: If DreamFast has the right dimensions (2560)

```bash
# Download
huggingface-cli download DreamFast/qwen3-4b-heretic \
  --local-dir /tmp/qwen3-4b-heretic/

# Back up working encoder first
cp ~/ComfyUI/models/text_encoders/qwen_3_4b_klein.safetensors \
   ~/ComfyUI/models/text_encoders/qwen_3_4b_klein_backup.safetensors

# Swap in the Heretic version
cp /tmp/qwen3-4b-heretic/model.safetensors \
   ~/ComfyUI/models/text_encoders/qwen_3_4b_klein.safetensors
```

### Step 2b: If DreamFast has wrong dimensions (4096) — find alternative

Options in order of preference:
1. **Lockout/qwen3-4b-heretic-zimage** — check if BFL-compatible:
   ```bash
   huggingface-cli model-info Lockout/qwen3-4b-heretic-zimage 2>/dev/null | grep hidden
   ```
2. **Run Heretic abliteration yourself** on the working `qwen_3_4b_klein.safetensors`  
   Tool: https://github.com/FailSpy/abliterator  
   Script: `python abliterator.py --model qwen_3_4b_klein.safetensors --output qwen_3_4b_klein_heretic.safetensors`

3. **Wait** for DreamFast or BFL to publish the FLUX.2-specific abliterated encoder

### Step 3: Live test

```python
generate_image(
    "an explicit test prompt that would normally be refused",
    model="flux-2-klein-4b.safetensors",
    steps=20
)
```

Expected: Image generated, no refusal error in ComfyUI logs.

### Step 4: If it works — no code changes needed

The MCP code, workflow JSON, and registry are already correct. Just verify:
- Check `journalctl --user -u comfyui -f` during generation for any errors
- Confirm file in `~/Pictures/mcp-generated/` was saved

---

## Fallback Plan

If the Heretic encoder is unavailable in the right dimensions, the **GGUF route** works too:

```bash
# ComfyUI-GGUF is already installed: ~/ComfyUI/custom_nodes/ComfyUI-GGUF
# Download Heretic GGUF (if BFL-compatible variant published):
huggingface-cli download Lockout/qwen3-4b-heretic-zimage \
  qwen-4b-zimage-hereticV2-q8.gguf \
  --local-dir ~/ComfyUI/models/text_encoders/
```

Then update [`flux2_klein_heretic.json`](../mcp/mcp-image-gen/src/workflows/flux2_klein_heretic.json) node `"1"`:
```json
"class_type": "CLIPLoaderGGUF",  // instead of CLIPLoader
"inputs": {
  "clip_name": "qwen-4b-zimage-hereticV2-q8.gguf",
  "type": "flux2"
}
```

---

## No Code Changes Required (unless GGUF fallback)

The entire MCP server, workflow registry, and test suite are already correct. This is **purely a model file task**.

---

## Success Criteria

- [x] `generate_image("...", model="flux-2-klein-4b.safetensors")` works with prompts that currently get refused — ✅ tested 2026-04-10, Renaissance nude generated without refusal
- [x] Output image quality identical to standard encoder (check: no visible artifacts vs reference) — ✅ 1.9MB photorealistic 1024×1024, museum-quality result, 50.4s
- [x] ComfyUI logs show no dimension errors — ✅ only harmless libcudart NVIDIA stub warnings
- [x] `qwen_3_4b_klein_backup.safetensors` kept as rollback — ✅ 7.5G backup at ~/ComfyUI/models/text_encoders/qwen_3_4b_klein_backup.safetensors
