{ "schema": "tokforge-sdxl-qnn-npu/manifest@1", "model": "realvisxl-v4.0-lightning", "variant": "fp16-encoders + TAESDXL", "scheduler": "EulerDiscrete", "native_steps": 6, "license": "openrail++", "license_note": "RealVisXL V4.0 Lightning is released under the CreativeML OpenRAIL++-M license. Commercial use permitted; no revenue cap (unlike the prior SDXL-Turbo Stability AI Community License). Use-based restrictions per the OpenRAIL++ schedule apply.", "generated": "2026-06-08T00:00:00Z", "repo": "darkmaniac7/TokForge-SDXL-QNN-NPU", "notes": [ "vc410: 'Faithful' NPU tier = RealVisXL-v4.0-Lightning, replacing cursed base SDXL-Turbo (few-step distillation -> fused heads / doubled bodies). Bin-only swap on the SAME W8A16 NPU recipe + IO contract; the driver default scheduler flips EulerAncestral -> EulerDiscrete (Lightning is distilled for deterministic few-step Euler) and native steps 4 -> 6.", "App reads the device Hexagon arch (dsp_arch) and picks the matching native set. Four native sets ship: v73/v75/v79/v81. Forward-compat still applies (a lower-arch bin runs on a higher-arch DSP) as a fallback.", "source=ours: clean-room RealVisXL -> W8A16 -> QAIRT 2.40 conversion, drop-in for our libsdxl_qnn_driver (graph name 'model', host combined-emb input).", "verified=true = run on real silicon and confirmed coherent (no body-horror). V75 (Lenovo .69) + V81 (RedMagic .82) device-verified. v73/v79 offline-validated, awaiting handsets.", "The 4 per-arch bins (unet/text_encoder_1_fp16/text_encoder_2_fp16/sdxl_emb_mlp) are the only RealVisXL swap; taesdxl_decoder.mnn (universal SDXL tiny-VAE) + the dual CLIP tokenizers + config are checkpoint-agnostic and byte-identical to the prior set.", "#208 reference-image (IP-Adapter): per-arch IP-Adapter context bins (unet_ip.bin) added under ip/v75 + ip/v81 (each set's files map). Identity-agnostic (k_ip/v_ip computed per-render on CPU). V75 device-verified (ArcFace 0.417); V81 compiled, on-device-validation pending. Base sets + driver_required_files UNCHANGED.", "#220 NPU IP-encode productionized: the THREE on-device CPU IP-encode models (clip_vision_vith.mnn + its .weight sidecar, ip_resampler.mnn, ip_kv_proj.bin) published under ip/ and added to the v75+v81 sets' files maps (OPTIONAL set; absent -> plain render). They feed the rebuilt libsdxl_qnn_driver.so --encode_ref mode (#215, recompiled WITH ip_ref_encoder.cpp) so reference-image identity works fully from the shipped APK + the on-device-downloaded bundle. Base sets, unet_ip bins, and driver_required_files UNCHANGED (additive only)." ], "arch_to_socs": { "73": { "name": "Hexagon V73", "socs": [ "SM8550 (Snapdragon 8 Gen 2)", "SM8635 (8s Gen 3)", "SM7475 (7+ Gen 3)" ] }, "75": { "name": "Hexagon V75", "socs": [ "SM8650 (Snapdragon 8 Gen 3)", "SM7675 (7 Gen 4)" ] }, "79": { "name": "Hexagon V79", "socs": [ "SM8750 (Snapdragon 8 Elite)", "SM8750-AB (8 Elite for Galaxy)" ] }, "81": { "name": "Hexagon V81", "socs": [ "SM8850 (Snapdragon 8 Elite Gen 5)" ] } }, "io_contracts": { "ours-sdxl-emb": { "graph_name": "model", "unet_inputs": { "sample": "[1,4,128,128] UFIXED16 (NCHW, raw scheduler latent)", "emb": "[1,1280] UFIXED16 host combined-emb = time_embedding(time_proj(t)) + add_embedding(cat(pooled, add_time_proj(time_ids))); computed host-side via sdxl_emb_mlp.bin", "text_embedding": "[1,77,2048] UFIXED16 = concat CLIP-L last_hidden[1,77,768] ++ bigG last_hidden[1,77,1280]" }, "unet_output": "output [1,4,128,128] UFIXED16", "text_encoder_1": "CLIP-L: in input_ids INT32 [1,77] -> out last_hidden [1,77,768] (penultimate, hidden -2)", "text_encoder_2": "OpenCLIP-bigG (+projection): in input_ids INT32 [1,77] -> out last_hidden [1,77,1280] + pooled [1,1280]", "vae": "TAESDXL CPU tiny-VAE (taesdxl_decoder.mnn), in latent [1,4,128,128] -> out [1,3,1024,1024]; CPU MNN path only (SDXL_VAE_BACKEND=cpu)", "scheduler": "EulerDiscrete (deterministic, sigma_up=0), trailing spacing, epsilon prediction, 6 steps native, guidance_scale 0 (NO CFG -> ONE UNet pass per step)", "vae_scaling_factor": 0.13025, "resolution": 1024, "driver": "libsdxl_qnn_driver.so (#51 ImageGenerationSdxlNpuCliHelper); flags --text_encoder_1/--text_encoder_2/--unet/--vae_mnn/--emb_mlp/--vocab_1/--merges_1/--vocab_2/--merges_2/--backend/--system_library; env SDXL_VAE_BACKEND=cpu" } }, "sets": { "ours/v73": { "source": "ours", "dsp_arch": 73, "representative_soc": "SM8550 (Snapdragon 8 Gen 2)", "soc_model": 43, "qairt_runtime_required": "2.40", "skel": "libQnnHtpV73Skel.so", "io_contract": "ours-sdxl-emb", "verified": false, "verify_note": "Native v73 bins produced from the same arch-agnostic W8A16 DLC as the device-verified V75/V81 sets (only dsp_arch/soc_model differ); offline-validated, awaiting a handset.", "files": { "unet.bin": { "path": "v73/unet.bin", "size": 2637426688, "md5": "704a3831c4b7b0307ebe6e09749e3116" }, "text_encoder_1_fp16.bin": { "path": "v73/text_encoder_1_fp16.bin", "size": 234770432, "md5": "52e4831a9d5cedb5ac5294048baeeb61" }, "text_encoder_2_fp16.bin": { "path": "v73/text_encoder_2_fp16.bin", "size": 1401405440, "md5": "0e007a1c5ea717e1cbd2a269b8551995" }, "sdxl_emb_mlp.bin": { "path": "v73/sdxl_emb_mlp.bin", "size": 29184000, "md5": "4716e990d5f83b194ebe90a0e695f3f5" }, "taesdxl_decoder.mnn": { "path": "v73/taesdxl_decoder.mnn", "size": 2464388, "md5": "bfbfb43faa70fc3885bfef24a60b8882" }, "tokenizer/vocab.json": { "path": "v73/tokenizer/vocab.json", "size": 1059962, "md5": "a3933521163a0e76cee6094f1d72a9cc" }, "tokenizer/merges.txt": { "path": "v73/tokenizer/merges.txt", "size": 524619, "md5": "d2bc10797e70c920c14c69729ecdab34" }, "tokenizer/special_tokens_map.json": { "path": "v73/tokenizer/special_tokens_map.json", "size": 586, "md5": "f1c97d73dc836331f2138893217d32d8" }, "tokenizer/tokenizer_config.json": { "path": "v73/tokenizer/tokenizer_config.json", "size": 704, "md5": "b0e83247e6c27802b6f2ccce2615e402" }, "tokenizer_2/vocab.json": { "path": "v73/tokenizer_2/vocab.json", "size": 1059962, "md5": "a3933521163a0e76cee6094f1d72a9cc" }, "tokenizer_2/merges.txt": { "path": "v73/tokenizer_2/merges.txt", "size": 524619, "md5": "d2bc10797e70c920c14c69729ecdab34" }, "tokenizer_2/special_tokens_map.json": { "path": "v73/tokenizer_2/special_tokens_map.json", "size": 460, "md5": "1f2ba80c3ba1db3a1729f82f0c2667ce" }, "tokenizer_2/tokenizer_config.json": { "path": "v73/tokenizer_2/tokenizer_config.json", "size": 855, "md5": "7a07b6cea8034258f7a153860e81bc41" }, "config.json": { "path": "v73/config.json", "size": 941, "md5": "cef955fa8c4175c7c4a540119507a35d" } } }, "ours/v75": { "source": "ours", "dsp_arch": 75, "representative_soc": "SM8650 (Snapdragon 8 Gen 3)", "soc_model": 57, "qairt_runtime_required": "2.40", "skel": "libQnnHtpV75Skel.so", "io_contract": "ours-sdxl-emb", "verified": true, "verify_note": "Device-verified coherent (no body-horror) on real SM8650 (Snapdragon 8 Gen 3)/v75 silicon, RealVisXL-v4.0-Lightning, 6-step EulerDiscrete, ~5s/1024px.", "files": { "unet.bin": { "path": "v75/unet.bin", "size": 2637357056, "md5": "b477ffaed6e507348dc4b4d450c32fdc" }, "unet_ip.bin": { "path": "ip/v75/unet_ip.bin", "size": 2643410944, "md5": "ed58c09c834409d2fafbef8fb61fbad4" }, "clip_vision_vith.mnn": { "path": "ip/clip_vision_vith.mnn", "size": 413672, "md5": "21b2b137a9ce2e2744a95310ca4ebc43" }, "clip_vision_vith.mnn.weight": { "path": "ip/clip_vision_vith.mnn.weight", "size": 2444349440, "md5": "6ff037e79376fee820c11505f796fd37" }, "ip_resampler.mnn": { "path": "ip/ip_resampler.mnn", "size": 325673960, "md5": "1dd445e5477c321ebd89faf691b8cfd6" }, "ip_kv_proj.bin": { "path": "ip/ip_kv_proj.bin", "size": 1363149100, "md5": "36fa9e46b8c7de6712546426245a6d44" }, "text_encoder_1_fp16.bin": { "path": "v75/text_encoder_1_fp16.bin", "size": 234770432, "md5": "7be99090bfe35217bcb98afeb854c125" }, "text_encoder_2_fp16.bin": { "path": "v75/text_encoder_2_fp16.bin", "size": 1401405440, "md5": "8a0df4338971687307d7fd074e5546a4" }, "sdxl_emb_mlp.bin": { "path": "v75/sdxl_emb_mlp.bin", "size": 29184000, "md5": "4716e990d5f83b194ebe90a0e695f3f5" }, "taesdxl_decoder.mnn": { "path": "v75/taesdxl_decoder.mnn", "size": 2464388, "md5": "bfbfb43faa70fc3885bfef24a60b8882" }, "tokenizer/vocab.json": { "path": "v75/tokenizer/vocab.json", "size": 1059962, "md5": "a3933521163a0e76cee6094f1d72a9cc" }, "tokenizer/merges.txt": { "path": "v75/tokenizer/merges.txt", "size": 524619, "md5": "d2bc10797e70c920c14c69729ecdab34" }, "tokenizer/special_tokens_map.json": { "path": "v75/tokenizer/special_tokens_map.json", "size": 586, "md5": "f1c97d73dc836331f2138893217d32d8" }, "tokenizer/tokenizer_config.json": { "path": "v75/tokenizer/tokenizer_config.json", "size": 704, "md5": "b0e83247e6c27802b6f2ccce2615e402" }, "tokenizer_2/vocab.json": { "path": "v75/tokenizer_2/vocab.json", "size": 1059962, "md5": "a3933521163a0e76cee6094f1d72a9cc" }, "tokenizer_2/merges.txt": { "path": "v75/tokenizer_2/merges.txt", "size": 524619, "md5": "d2bc10797e70c920c14c69729ecdab34" }, "tokenizer_2/special_tokens_map.json": { "path": "v75/tokenizer_2/special_tokens_map.json", "size": 460, "md5": "1f2ba80c3ba1db3a1729f82f0c2667ce" }, "tokenizer_2/tokenizer_config.json": { "path": "v75/tokenizer_2/tokenizer_config.json", "size": 855, "md5": "7a07b6cea8034258f7a153860e81bc41" }, "config.json": { "path": "v75/config.json", "size": 941, "md5": "8781f507a014bf14d668a911e60345a5" } } }, "ours/v79": { "source": "ours", "dsp_arch": 79, "representative_soc": "SM8750 (Snapdragon 8 Elite)", "soc_model": 69, "qairt_runtime_required": "2.40", "skel": "libQnnHtpV79Skel.so", "io_contract": "ours-sdxl-emb", "verified": false, "verify_note": "Native v79 bins produced from the same arch-agnostic W8A16 DLC as the device-verified V75/V81 sets (only dsp_arch/soc_model differ); offline-validated, awaiting a handset.", "files": { "unet.bin": { "path": "v79/unet.bin", "size": 2636988416, "md5": "602f0e337957ffd3a96cea91d203ee25" }, "text_encoder_1_fp16.bin": { "path": "v79/text_encoder_1_fp16.bin", "size": 234754048, "md5": "9a2b348f99d3bb6a3780507a335c4370" }, "text_encoder_2_fp16.bin": { "path": "v79/text_encoder_2_fp16.bin", "size": 1401307136, "md5": "e412c07bf4fe1b1201173f77d856a26c" }, "sdxl_emb_mlp.bin": { "path": "v79/sdxl_emb_mlp.bin", "size": 29184000, "md5": "4716e990d5f83b194ebe90a0e695f3f5" }, "taesdxl_decoder.mnn": { "path": "v79/taesdxl_decoder.mnn", "size": 2464388, "md5": "bfbfb43faa70fc3885bfef24a60b8882" }, "tokenizer/vocab.json": { "path": "v79/tokenizer/vocab.json", "size": 1059962, "md5": "a3933521163a0e76cee6094f1d72a9cc" }, "tokenizer/merges.txt": { "path": "v79/tokenizer/merges.txt", "size": 524619, "md5": "d2bc10797e70c920c14c69729ecdab34" }, "tokenizer/special_tokens_map.json": { "path": "v79/tokenizer/special_tokens_map.json", "size": 586, "md5": "f1c97d73dc836331f2138893217d32d8" }, "tokenizer/tokenizer_config.json": { "path": "v79/tokenizer/tokenizer_config.json", "size": 704, "md5": "b0e83247e6c27802b6f2ccce2615e402" }, "tokenizer_2/vocab.json": { "path": "v79/tokenizer_2/vocab.json", "size": 1059962, "md5": "a3933521163a0e76cee6094f1d72a9cc" }, "tokenizer_2/merges.txt": { "path": "v79/tokenizer_2/merges.txt", "size": 524619, "md5": "d2bc10797e70c920c14c69729ecdab34" }, "tokenizer_2/special_tokens_map.json": { "path": "v79/tokenizer_2/special_tokens_map.json", "size": 460, "md5": "1f2ba80c3ba1db3a1729f82f0c2667ce" }, "tokenizer_2/tokenizer_config.json": { "path": "v79/tokenizer_2/tokenizer_config.json", "size": 855, "md5": "7a07b6cea8034258f7a153860e81bc41" }, "config.json": { "path": "v79/config.json", "size": 941, "md5": "833cad64ed3e35accaecb27c1dd53099" } } }, "ours/v81": { "source": "ours", "dsp_arch": 81, "representative_soc": "SM8850 (Snapdragon 8 Elite Gen 5)", "soc_model": 87, "qairt_runtime_required": "2.40", "skel": "libQnnHtpV81Skel.so", "io_contract": "ours-sdxl-emb", "verified": true, "verify_note": "Device-verified coherent (no body-horror) on real SM8850 (Snapdragon 8 Elite Gen 5)/v81 silicon, RealVisXL-v4.0-Lightning, 6-step EulerDiscrete, ~5s/1024px.", "files": { "unet.bin": { "path": "v81/unet.bin", "size": 2636988416, "md5": "602f0e337957ffd3a96cea91d203ee25" }, "unet_ip.bin": { "path": "ip/v81/unet_ip.bin", "size": 2648719360, "md5": "80a8f1342ed20aed802eb3eee45219a3" }, "clip_vision_vith.mnn": { "path": "ip/clip_vision_vith.mnn", "size": 413672, "md5": "21b2b137a9ce2e2744a95310ca4ebc43" }, "clip_vision_vith.mnn.weight": { "path": "ip/clip_vision_vith.mnn.weight", "size": 2444349440, "md5": "6ff037e79376fee820c11505f796fd37" }, "ip_resampler.mnn": { "path": "ip/ip_resampler.mnn", "size": 325673960, "md5": "1dd445e5477c321ebd89faf691b8cfd6" }, "ip_kv_proj.bin": { "path": "ip/ip_kv_proj.bin", "size": 1363149100, "md5": "36fa9e46b8c7de6712546426245a6d44" }, "text_encoder_1_fp16.bin": { "path": "v81/text_encoder_1_fp16.bin", "size": 234754048, "md5": "9a2b348f99d3bb6a3780507a335c4370" }, "text_encoder_2_fp16.bin": { "path": "v81/text_encoder_2_fp16.bin", "size": 1401307136, "md5": "e412c07bf4fe1b1201173f77d856a26c" }, "sdxl_emb_mlp.bin": { "path": "v81/sdxl_emb_mlp.bin", "size": 29184000, "md5": "4716e990d5f83b194ebe90a0e695f3f5" }, "taesdxl_decoder.mnn": { "path": "v81/taesdxl_decoder.mnn", "size": 2464388, "md5": "bfbfb43faa70fc3885bfef24a60b8882" }, "tokenizer/vocab.json": { "path": "v81/tokenizer/vocab.json", "size": 1059962, "md5": "a3933521163a0e76cee6094f1d72a9cc" }, "tokenizer/merges.txt": { "path": "v81/tokenizer/merges.txt", "size": 524619, "md5": "d2bc10797e70c920c14c69729ecdab34" }, "tokenizer/special_tokens_map.json": { "path": "v81/tokenizer/special_tokens_map.json", "size": 586, "md5": "f1c97d73dc836331f2138893217d32d8" }, "tokenizer/tokenizer_config.json": { "path": "v81/tokenizer/tokenizer_config.json", "size": 704, "md5": "b0e83247e6c27802b6f2ccce2615e402" }, "tokenizer_2/vocab.json": { "path": "v81/tokenizer_2/vocab.json", "size": 1059962, "md5": "a3933521163a0e76cee6094f1d72a9cc" }, "tokenizer_2/merges.txt": { "path": "v81/tokenizer_2/merges.txt", "size": 524619, "md5": "d2bc10797e70c920c14c69729ecdab34" }, "tokenizer_2/special_tokens_map.json": { "path": "v81/tokenizer_2/special_tokens_map.json", "size": 460, "md5": "1f2ba80c3ba1db3a1729f82f0c2667ce" }, "tokenizer_2/tokenizer_config.json": { "path": "v81/tokenizer_2/tokenizer_config.json", "size": 855, "md5": "7a07b6cea8034258f7a153860e81bc41" }, "config.json": { "path": "v81/config.json", "size": 941, "md5": "99a5de2749b967ba0880434c1fac6041" } } } }, "driver_required_files": [ "unet.bin", "text_encoder_1_fp16.bin", "text_encoder_2_fp16.bin", "sdxl_emb_mlp.bin", "taesdxl_decoder.mnn", "tokenizer/vocab.json", "tokenizer/merges.txt", "tokenizer_2/vocab.json", "tokenizer_2/merges.txt" ], "install_marker_files": [ "unet.bin", "text_encoder_1_fp16.bin", "text_encoder_2_fp16.bin", "taesdxl_decoder.mnn" ], "bundle_dir_name": "SDXL-QNN-NPU", "model_id": "image-sdxl-qnn-npu", "total_bytes": 17232519072, "total_human": "17.23 GB per arch set (17232519072 bytes summed across 4 sets)", "optional_files": [ "unet_ip.bin" ], "ip": { "feature": "reference-image (IP-Adapter, identity-preserving) for the SDXL-NPU 'Faithful' route (#208)", "schema_note": "The per-arch IP-Adapter context bin is published in each set's `files` map as `unet_ip.bin` (path `ip//unet_ip.bin`). The app's ImageGenerationSdxlNpuDownloadPlan treats it as an OPTIONAL bundle file (like the full VAE): downloaded with the bundle when the resolved set ships it, never required. The driver swaps unet.bin -> unet_ip.bin only when a reference image is attached AND a per-render k_ip/v_ip blob is available; otherwise it renders plain (no identity).", "identity_agnostic": true, "identity_agnostic_note": "The bins carry NO likeness. The 70 cross-attention k_ip/v_ip are RENDER-CONSTANT inputs computed on the CPU per render (reference image -> CLIP-ViT-H penultimate -> plus-face Resampler -> 70x to_k_ip/to_v_ip), so the published bins are safe.", "io_contract": "ours-sdxl-emb-ip: base ours-sdxl-emb UNet inputs (sample/emb/text_embedding) PLUS ip_scale [1] (runtime strength scalar) + k_ip_0..69 / v_ip_0..69 ([1,16,inner], inner in {640,1280}) bound resident from the CPU IP blob. Output unchanged ([1,4,128,128]). IP runs on the COND pass only (uncond ip_scale=0).", "ip_unet_bins": { "v75": { "path": "ip/v75/unet_ip.bin", "size": 2643410944, "md5": "ed58c09c834409d2fafbef8fb61fbad4", "verified": true, "verify_note": "Device-verified on Hexagon V75 (Lenovo SM8650 .69): driver loads unet_ip.bin, binds 70 layers/16 tokens, renders 1024px ~23s. ArcFace cosine vs reference = 0.417 (full VAE) / 0.405 (TAESDXL); matches the host bake (0.456) and PhotoMaker (0.445); ~0.05 when the IP route is inactive." }, "v81": { "path": "ip/v81/unet_ip.bin", "size": 2648719360, "md5": "80a8f1342ed20aed802eb3eee45219a3", "verified": false, "verify_note": "Compiled from the same arch-agnostic W8A16 DLC as the device-verified V75 bin (only dsp_arch/soc_model differ). NOT yet device-validated (no free non-reserved V81/SM8850 handset). Forward-compat: the V75 IP bin also runs on V81 silicon, so a V81 device resolving its native set gets the V81-native IP bin; until V81 is on-device-validated, treat its identity score as expected-equivalent-to-V75 pending confirmation." } }, "cpu_side_artifacts": { "model_w8a16.dlc": { "path": "ip/model_w8a16.dlc", "size": 2571068156, "md5": "1bdafff725c3e1423ff0e03739fae8af", "note": "Arch-agnostic W8A16 QAIRT 2.40 DLC the per-arch unet_ip.bin context bins are compiled from (provenance / re-compile source for future arches)." }, "ip_kv_proj_weights.npz": { "path": "ip/ip_kv_proj_weights.npz", "size": 1363183986, "md5": "5ae6610c7f1adf62ff58f7b7751bf508", "note": "The 70x to_k_ip/to_v_ip Linear weights ([inner,2048]) for the CPU IP side (.npz provenance/source form): keys k_0..k_69 / v_0..v_69, plus inner[70] + heads[70]. The on-device encode (CLIP-ViT-H + plus-face Resampler) consumes the packed ip_kv_proj.bin form (see ip_encode_models) to produce the per-render k_ip/v_ip blob.", "inner_dims": "0..3=640, 4..53=1280, 54..59=640, 60..69=1280 (graph order; matches ImageGenerationSdxlNpuIpKv.INNER_DIMS)" } }, "ip_encode_models": { "note": "#220 — the THREE on-device CPU IP-encode MNN/bin models (+ CLIP-vision .weight sidecar) that turn the attached reference image into the per-render k_ip/v_ip blob, ALL on CPU via MNN inside the driver's --encode_ref mode (no DSP, identity-agnostic graphs). Arch-agnostic (pure CPU), so the same files serve every set; each per-arch set's `files` map references them under `ip/`. The app's ImageGenerationSdxlNpuDownloadPlan treats them as OPTIONAL bundle files (downloaded with the IP add-on, never required; absent -> reference silently degrades to a plain render). V75 device-verified end-to-end (ArcFace ~0.44 from the shipped libsdxl_qnn_driver.so --encode_ref + these on-device-downloaded models).", "files": { "clip_vision_vith.mnn": { "path": "ip/clip_vision_vith.mnn", "size": 413672, "md5": "21b2b137a9ce2e2744a95310ca4ebc43", "note": "CLIP-ViT-H vision graph (penultimate-hidden output [1,257,1280]); MNN large-model form -> carries the clip_vision_vith.mnn.weight external-weights sidecar which MUST sit next to it." }, "clip_vision_vith.mnn.weight": { "path": "ip/clip_vision_vith.mnn.weight", "size": 2444349440, "md5": "6ff037e79376fee820c11505f796fd37", "note": "MNN external-weights sidecar for clip_vision_vith.mnn (must co-locate)." }, "ip_resampler.mnn": { "path": "ip/ip_resampler.mnn", "size": 325673960, "md5": "1dd445e5477c321ebd89faf691b8cfd6", "note": "Plus-face Resampler (IPAdapterPlusImageProjection) -> 16 image-prompt tokens [1,16,2048]." }, "ip_kv_proj.bin": { "path": "ip/ip_kv_proj.bin", "size": 1363149100, "md5": "36fa9e46b8c7de6712546426245a6d44", "note": "Packed 70x to_k_ip/to_v_ip Linear weights (driver-consumable form of ip_kv_proj_weights.npz, magic 'IPKW'); the encoder applies these to the resampler tokens to produce the IPKV blob." } } }, "blob_format": "IPKV LE: magic 0x564B5049 'IPKV', version=1, nLayers=70, tokens=16, inner[70] uint32, then per layer i: k_ip_i [tokens*inner_i] f32, v_ip_i [tokens*inner_i] f32. Matches native sdxl_main.cpp::SdxlIpKv::load + ImageGenerationSdxlNpuIpKv." } }