Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
101 commits
Select commit Hold shift + click to select a range
16bf70a
feat(image): flux2 klein fingerprint row and config synthesis
asher Oct 16, 2026
2fe3869
feat(image): flux2 klein dit forward and the check 3 oracle, tiny mod…
asher Oct 16, 2026
d45060b
test(image): flux2 klein check 3 against the reference dit, product, …
asher Oct 16, 2026
53c7e6e
feat(image): flux2 klein text encoder spec, pad rows at their own pos…
asher Oct 16, 2026
33ad7d8
test(image): flux2 klein check 2 against the reference tap, pad rows …
asher Oct 16, 2026
93d2fd2
feat(image): flux2 klein schedule and bf16 loop, with the check 4 and…
asher Oct 16, 2026
12f3440
test(image): flux2 klein check 4 bitwise against the reference schedu…
asher Oct 16, 2026
b066586
fix(image): flux2 klein encoder tap casts q, k and v to fp32 before t…
asher Oct 16, 2026
1c41cd5
fix(image): flux2 klein dit config has its patch of one latent pixel,…
asher Oct 16, 2026
c2cf436
test(image): flux2 klein tiny key norm scales apart from the query's,…
asher Oct 16, 2026
8b9d32d
docs(image): flux2 notices row, license lines for the schedule and th…
asher Oct 16, 2026
c91f3eb
test(image): flux2 klein img_in stays bf16 in every published quant, …
asher Oct 16, 2026
562901e
test(image): flux2 klein check 6 on latents, bf16 at 512 and the exac…
asher Oct 16, 2026
d6b3cec
feat(image): flux2 klein edits take reference images by the rules of …
asher Oct 16, 2026
b0dd69d
test(image): flux2 klein check 6 edit with one reference against the …
asher Oct 16, 2026
9125342
fix(image): flux2 klein 9b refused by name until it runs
asher Oct 16, 2026
3000160
feat(image): flux2 klein reads the flux.2 vae and prices its 4b steps…
asher Oct 16, 2026
c1c2b1d
feat(image): flux2 klein lora key map, with the stems comfyui reads n…
asher Oct 16, 2026
55e6a2b
feat(image): lora files with a rank-stabilized peft header load, scal…
asher Oct 16, 2026
bf35181
fix(image): flux2 klein distilled refuses guidance, an unsized edit s…
asher Oct 16, 2026
f3bae83
fix(serve): a streamed image job refused while it runs gets the error…
asher Oct 16, 2026
f847926
test(image): flux2 klein check 7 gates three community lora files aga…
asher Oct 16, 2026
4839381
feat(comfyui): the step contract and the pack run flux2 klein, its gu…
asher Oct 16, 2026
788db0c
fix(serve): a flux2 klein step on comfyui's convention embeds the fp3…
asher Oct 16, 2026
d1cd317
test(image): check 2 oracles keep the rotary frequencies of their bf1…
asher Oct 16, 2026
7730225
test(image): check 2 manifests of z-image, krea 2 and flux3 klein rec…
asher Oct 16, 2026
f2e2572
test(image): flux3 klein check 6 manifests name the recalibrated chec…
asher Oct 16, 2026
4045eff
feat(image): flux2 klein pull recipes and memory classes on bfl's bf1…
asher Oct 16, 2026
3eeee15
docs(image): flux2 klein in the image guides, the image api, the cli,…
asher Oct 16, 2026
65f7b5e
feat(image): flux2 klein 9b and base 9b on qwen3-8b, with their own m…
asher Oct 16, 2026
68de4db
docs(image): flux2 klein 9b in the image guide, the cli and comfyui p…
asher Oct 16, 2026
cd2fe07
test(serve): warm the audio reader before the flac silence peak is tr…
asher Oct 16, 2026
7960832
fix(image): bench --via-steps steps on the reference time rule and ro…
asher Oct 16, 2026
868ebba
fix(image): a pull reuses a held vae pack whose label pairs with the …
asher Oct 16, 2026
9b99a38
test(image): flux2 klein diffusers lora names checked against diffuse…
asher Oct 16, 2026
114de0a
test(image): flux2 check 7 gates the pixel-art file at half strength …
asher Oct 16, 2026
e3487a7
docs(comfyui): the pack readme lists flux3 klein with its parity rows
asher Oct 16, 2026
f7afdd1
test(image): the flux2 vae pack check counts the 9b family among the …
asher Oct 16, 2026
04b74be
fix(image): the flux2 vae fixture names its own family, and pack-vae …
asher Oct 16, 2026
c7565ac
fix(comfyui): gmlx sigmas takes the image size and gives the schedule…
asher Oct 16, 2026
1d2a2d3
test(comfyui): the flux3 klein headless edit finds its references by …
asher Oct 16, 2026
659c4bc
fix(serve): an image job's internal error is a 500 with its trace, an…
asher Oct 16, 2026
21b1bf7
fix(comfyui): a lora patch with swapped scale and shift halves is ref…
asher Oct 16, 2026
ec5559a
fix(serve): an image entry is refused at load when its default guidan…
asher Oct 16, 2026
4ac3041
docs(image): the step contract page notes the size schedule of a stat…
asher Oct 16, 2026
c3e84fb
docs(image): an unsized flux edit takes the first reference's prepare…
asher Oct 16, 2026
e2a06de
docs(image): the flux2 edit recipe scales its references, troubleshoo…
asher Oct 16, 2026
bc106d0
fix(comfyui): the pack schedules file names the bfl and diffusers lic…
asher Oct 16, 2026
c88ca5b
test(image): a flux2 klein 9b file given as flux3 is a 9b file, refus…
asher Oct 16, 2026
4a736c1
test(image): flux2 klein 9b check 6 manifests, with the exact run's w…
asher Oct 16, 2026
0b2f862
test(image): flux2 klein base 9b check 6 manifests at 512 and 1024
asher Oct 17, 2026
62cdc91
docs(cli): wrap the qwen-image ref paragraph
asher Oct 17, 2026
f21778d
test(image): the check 5 manifest keeps the argv its run took, and ch…
asher Oct 17, 2026
408f8bd
test(image): the check 3 site gate holds the 9b kernel routes
asher Oct 17, 2026
71150b2
fix(image): pull refuses a class that makes no image and prices its s…
asher Oct 17, 2026
a183188
test(serve): the real image service rows take a class budget from cap…
asher Oct 17, 2026
8695eb4
feat(comfyui): the step contract and the node pack run flux2 klein 9b…
asher Oct 17, 2026
f84985e
test(serve): every image family has a comfyui step contract row and c…
asher Oct 17, 2026
ece8ffc
test(comfyui): the size rule test lists the flux2 klein 9b schedule
asher Oct 17, 2026
61f43d0
test(serve): drop the image family coverage test of the comfyui step …
asher Oct 17, 2026
c9c48ed
test(image): the cli generate row collects cycles before the load gat…
asher Oct 17, 2026
a63e0ad
feat(comfyui): a krea 2 turbo text to image example workflow
asher Oct 17, 2026
612ac07
docs(comfyui): the nodes and workflow of krea 2 turbo
asher Oct 17, 2026
3a8acef
feat(image): the reference pass and cached step of flux.2 klein kv
asher Oct 17, 2026
93ad837
feat(image): the flux.2 klein 9b kv row, whose edits step on a cache …
asher Oct 17, 2026
b073153
fix(image): the kv cache keeps each k and v in its own buffer, not a …
asher Oct 17, 2026
1ac9660
feat(image): the memory plan of flux.2 klein 9b kv counts the cache o…
asher Oct 17, 2026
f856770
test(image): the check 3 oracle runs the cached pass of a flux.2 klei…
asher Oct 17, 2026
5cac0e5
test(image): the check 6 oracles run flux.2 klein 9b kv, its edits th…
asher Oct 17, 2026
a0d7d1b
test(image): checks 3 and 6 of flux.2 klein 9b kv against bfl's cache…
asher Oct 17, 2026
f809859
fix(image): a flux.2 klein 9b kv file of no known identity refuses gu…
asher Oct 17, 2026
b8dff14
refactor(image): drop the unused first-step extract of flux.2 klein k…
asher Oct 17, 2026
3ce6986
docs(image): the kv comments say what the cells and the prefix rows hold
asher Oct 17, 2026
636a46b
test(image): the kv plan test runs through plan_request, and the sinu…
asher Oct 17, 2026
12d0422
test(image): the tiny kv fixture states its own rule, and the edit or…
asher Oct 17, 2026
c1510ca
test(image): the check 3 manifests of flux.2 klein 9b kv
asher Oct 17, 2026
27cd599
fix(image): the flux.2 klein 9b kv pass fit covers ten 1024 pixel ref…
asher Oct 17, 2026
c7f2d8c
test(image): the exact gate floor rule reads the flux.2 klein 4b and …
asher Oct 17, 2026
06c8288
test(image): the kv plan test plans an edit before the vae encodes it…
asher Oct 17, 2026
b21af86
test(image): the check 6 manifests of flux.2 klein 9b kv
asher Oct 17, 2026
44baec0
test(image): an exact gate rerun whose child skips skips with its reason
asher Oct 17, 2026
ff43431
fix(image): held conditioning states are priced before a request's fi…
asher Oct 17, 2026
2ec1d79
fix(image): a refusal of references that came as latents names the co…
asher Oct 17, 2026
be75ba2
feat(comfyui): the step contract and the node pack run flux2 klein 9b…
asher Oct 17, 2026
6dbb17c
fix(image): the flux.2 klein extract of the flux kv cache node evalua…
asher Oct 17, 2026
bf519fa
fix(image): the joined row of a memory row stays out of its repr, and…
asher Oct 17, 2026
3ac7e3d
feat(image): gmlx pull takes flux-2-klein-9b-kv, its q4_k_m on 24 gb …
asher Oct 17, 2026
2dfd830
feat(image): image bench times an edit from --ref images
asher Oct 17, 2026
8e613dc
docs(comfyui): the flux2 klein 9b kv edit workflow under the flux kv …
asher Oct 17, 2026
a1b142b
docs(image): flux2 klein 9b kv in the image guide, its notices and li…
asher Oct 17, 2026
f3fbde7
test(image): the family prices fixture carries the zero held-states t…
asher Oct 17, 2026
3179249
docs(cli): the image bench --ref row fits the table cell limit
asher Oct 17, 2026
fd50a6b
fix(image): each batch row keeps its own reference keys and values un…
asher Oct 17, 2026
0b704fb
fix(image): price kv steps under the cache node by measured fits, nam…
asher Oct 17, 2026
c2ef523
docs(image): state the kv edit speed against the 9b for its shape
asher Oct 17, 2026
09ead89
fix(image): price the kv step without the cache node by its own fit, …
asher Oct 17, 2026
0a64d64
fix(image): price a kv run's first step at its later steps' price too…
asher Oct 17, 2026
fcc3617
fix(serve): a shed before an encode on a shared encoder keeps the req…
asher Oct 17, 2026
5d36794
docs(image): reword the later kv steps and rewrap the kv changelog bu…
asher Oct 17, 2026
d9ece07
test(image): two more kv q4_k_m cells in the node cells fixture
asher Oct 17, 2026
b85e1a4
test(launch): stand-in clients wait on a signal wakeup fd, since sign…
asher Oct 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,19 @@ adhere to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

- `gmlx pull`, `image generate`, `serve` and the ComfyUI pack run FLUX.3 klein
and FLUX.3 klein Base GGUFs, with edits from up to 10 reference images.
- `gmlx pull`, `image generate`, `serve` and the ComfyUI pack run FLUX.2 klein
4B and FLUX.2 klein Base 4B GGUFs, with edits from up to 10 reference images.
- `gmlx pull`, `image generate`, `serve` and the ComfyUI pack run FLUX.2 klein
9B and FLUX.2 klein Base 9B GGUFs, licensed for non-commercial use only.
- `gmlx pull`, `image generate`, `serve` and the ComfyUI pack run FLUX.2 klein
9B KV GGUFs, which edit from two 1024x1024 references in about half the
9B's time.
- `context_copy: true` or `GMLX_CONTEXT_COPY=1` drafts from the prompt when the
output repeats it, which speeds up edits and quotes.
- Muse Spark (GGUF arch `muse-spark`), with reasoning effort intents, tool calls
and image and audio input through its `--mmproj` companion.
- An image LoRA whose PEFT header sets `use_rslora` loads, scaled as PEFT
scales it, where it was refused.

### Changed

Expand All @@ -25,9 +34,15 @@ adhere to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
runs faster on NAX GPUs (M5).
- With `--stream-experts`, a prompt that uses most of a layer's experts
prefills faster. `GMLX_ARENA_SPLIT_MAX_SHARE` tunes the choice.
- `gmlx pull` of an image model reuses a VAE GGUF on disk packed for its
family from another source, and names it, where it downloaded the VAE again.

### Fixed

- A streamed image request refused while it ran, such as one too large for
memory, got a server error frame where the same request unstreamed got a 400.
- The `gmlx pull` plan of an image model could say its parts fit in stages
when `image generate` then refused the image, as it counted file bytes alone.
- A DFlash drafter that took speculation back up after a batch shrank within
the width cap drafted from stale context, so almost no draft was accepted.
- A sampled request whose structured output allowed fewer tokens than its
Expand All @@ -52,6 +67,10 @@ adhere to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
`serve`, and `response_format` constrains only the final answer.
- `gmlx launch` could miss a SIGTERM or SIGHUP on a busy Mac, so a stop or a
closed terminal did not end the session until the client exited.
- `gmlx Sigmas` in ComfyUI gave Qwen-Image 2.1 ComfyUI's simple schedule. It
takes the image's width and height and gives the schedule of that size.
- An image request that failed on an internal error got a 400 and left no
trace in the log. It gets a 500, and the server logs its trace.

## [0.5.0] - 2026-10-12

Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,9 +98,9 @@ The recording runs at true speed, with a 27B model in a local server.
- Embeddings, rerank, speech-to-text and text-to-speech on the same server,
for a local RAG and voice stack. See
[Speech, embeddings and rerank](https://asher.github.io/gmlx/services.html).
- Image generation from Z-Image, Qwen-Image 2.1, Krea 2 Turbo and FLUX.3
klein GGUFs, on the command line, on the OpenAI image routes and in
ComfyUI. It needs an M3 chip or newer. See
- Image generation from Z-Image, Qwen-Image 2.1, Krea 2 Turbo, FLUX.2 klein
and FLUX.3 klein GGUFs, on the command line, on the OpenAI image routes
and in ComfyUI. It needs an M3 chip or newer. See
[Image generation](https://asher.github.io/gmlx/images.html).
- A decision API at `/v1/systemone` that returns a probability for each
answer to yes-or-no, choice and score questions about a text. See
Expand Down
1 change: 1 addition & 0 deletions THIRD_PARTY_NOTICES.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ in [`licenses/`](licenses/).
| [mflux](https://github.com/filipstrand/mflux) | MIT | The Z-Image transformer at commit `e066d98`, ported to `gmlx/image/families/z_image/model.py` with the fused qkv kept and modules named after the GGUF tensors, and its attention, timestep and RoPE helpers in `gmlx/image/ops/attention.py` and `gmlx/image/ops/embeds.py`. |
| [diffusers](https://github.com/huggingface/diffusers) | Apache-2.0 | Code at commit `e0abab8`, ported to MLX and modified for gmlx: the Z-Image forward of `transformer_z_image.py` in `gmlx/image/families/z_image/model.py`, its timestep embedding, RoPE tables and rotary product in `gmlx/image/ops/embeds.py` and `gmlx/image/ops/attention.py`, the RMSNorm rounding of `normalization.py` in `gmlx/image/ops/norms.py`, and the FLUX.1 autoencoder of `autoencoders/vae.py`, `resnet.py`, `unet_2d_blocks.py`, `downsampling.py`, `upsampling.py` and `attention_processor.py` in `gmlx/image/vae/flux1_ae.py`, the quant convs and BatchNorm statistics of `autoencoders/autoencoder_kl_flux2.py` in `gmlx/image/vae/flux2_ae.py`, the Qwen-Image 2.1 autoencoder of `autoencoders/autoencoder_kl_qwenimage21.py`, for one frame, in `gmlx/image/vae/qwen_image21_vae.py`, and the UniPC bh2 sampler of `schedulers/scheduling_unipc_multistep.py` in `gmlx/image/unipc.py`. Also the Qwen-Image 2.1 forward, token layout and RoPE of `transformer_qwenimage21.py` in `gmlx/image/families/qwen_image21/model.py` and `layout.py`, and the dynamic shift of `pipelines/qwenimage21/pipeline_qwenimage21.py` and `schedulers/scheduling_flow_match_euler_discrete.py` in `gmlx/image/schedule.py`, and the reference image sizes, the prompt template with image slots and the image branch of the encoder tap of that pipeline in `gmlx/image/families/qwen_image21/edit.py`. For Krea 2, at the same commit: the forward of `transformer_krea2.py` in `gmlx/image/families/krea2/model.py`, the Qwen-Image autoencoder of `autoencoders/autoencoder_kl_qwenimage.py`, for one frame, in `gmlx/image/vae/qwen_image_vae.py`, the prompt template, encoder layers and constants of `pipelines/krea2/pipeline_krea2.py` and `modular_pipelines/krea2/` in `gmlx/image/families/krea2/family.py`, and the schedule of that pipeline in `krea2_sigmas` of `gmlx/image/schedule.py`. |
| [flux-3-image-klein](https://github.com/black-forest-labs/flux-3-image-klein) | Apache-2.0 | BFL's FLUX.3 klein reference at commit `45e57c9`, ported to MLX and modified for gmlx: the DiT constants and tensor layout of `src/flux3/dit.py`, the image RoPE scale and schedule alpha of `src/flux3/pipeline.py` and the encoder layers, pad multiple, length, pad token and position and chat template of `src/flux3/text_encoder.py` in `gmlx/image/families/flux3_klein/family.py`, the DiT forward of `src/flux3/dit.py` with the position ids of `pipeline.py`, `autoencoder.py` and `text_encoder.py` in `gmlx/image/families/flux3_klein/model.py`, the schedule of `src/flux3/sampling.py` in `flux3_sigmas` of `gmlx/image/schedule.py`, the latent patchify and BatchNorm of `src/flux3/autoencoder.py` in `gmlx/image/vae/flux2_ae.py`, and the reference canvas, reference preparation and default size of `src/flux3/pipeline.py` with the reference choice and output crop of `src/flux3/generate.py` in `gmlx/image/families/flux3_klein/edit.py`. |
| [flux2](https://github.com/black-forest-labs/flux2) | Apache-2.0 | BFL's FLUX.2 reference at commit `50fe516`, ported to MLX and modified for gmlx: the DiT constants of `Klein4BParams`, `Klein9BParams` and `Flux2Params` and the tensor names and shapes of `Flux2` in `src/flux2/model.py`, the sampling defaults of `FLUX2_MODEL_INFO` in `src/flux2/util.py`, the prompt rules of `Qwen3Embedder` in `src/flux2/text_encoder.py`, the rounding of `denoise` and `denoise_cfg` and the reference image rules of `encode_image_refs` in `src/flux2/sampling.py` in `gmlx/image/families/flux2_klein/family.py`, the constants of `Klein9BParams`, the 9B rows of `FLUX2_MODEL_INFO` and the Qwen3-8B encoder of `load_qwen3_embedder` in `src/flux2/text_encoder.py` in `gmlx/image/families/flux2_klein_9b/family.py`, the `flux.2-klein-9b-kv` row of `FLUX2_MODEL_INFO` in `gmlx/image/families/flux2_klein_9b_kv/family.py` and the step of `denoise_cached` in `src/flux2/sampling.py` in `gmlx/image/families/flux2_klein_9b_kv/step.py`, the DiT forward of `src/flux2/model.py`, with `forward_kv_extract`, `forward_kv_cached` and `causal_attn_fn`, and the token ids of `prc_img`, `prc_txt` and `encode_image_refs` in `src/flux2/sampling.py` in `gmlx/image/families/flux2_klein/model.py`, and the schedule of `compute_empirical_mu` and `get_schedule` in `src/flux2/sampling.py` in `flux2_mu` and `flux2_sigmas` of `gmlx/image/schedule.py`, and the reference image preparation of `encode_image_refs` and `default_prep` in `src/flux2/sampling.py` in `gmlx/image/families/flux2_klein/edit.py`. |
| [ComfyUI-GGUF](https://github.com/city96/ComfyUI-GGUF) | Apache-2.0 | The model detection keys of `convert.py` at commit `6ea2651`, which `gmlx/image/fingerprint.py` uses to refuse other diffusion model layouts by name. |
| [misaki](https://github.com/hexgrad/misaki) | Apache-2.0 | Whole package vendored at `gmlx/_vendor/misaki` (commit `fba1236`): Kokoro's grapheme-to-phoneme front-end, used by the TTS service until upstream's next PyPI release. |
| [musl](https://musl.libc.org) | MIT | Statically linked into the guest entry binary `gmlx/container/guest/gmlx-entry` as its C library ([`licenses/musl-COPYRIGHT`](licenses/musl-COPYRIGHT)). |
Expand Down
Loading
Loading