Add FLUX.1 Krea dev to the image model catalog

Krea's guidance-distilled FLUX.1-dev finetune keeps the exact dev layout, so it
runs under the existing flux.1 family unchanged. Wire it up end to end:

- Catalog group with the gated official bf16 pipeline and the open QuantStack
  GGUF quants; the gated artifact is skipped on auto-routing when undownloaded.
- Trust the official repo for non-GGUF from_pretrained loads, next to the other
  black-forest-labs bases.
- Generation defaults: 28 steps at guidance 4.5 per the model card. The generic
  "krea" defaults key (Krea-2-Turbo's 8-step no-CFG recipe) used to swallow the
  id, which would have produced garbage output; the new flux.1-krea key precedes
  it on both the backend table and the images page table.
- The flux.1 prequant checkpoints are schnell-based; the loader's baked
  base_model_id validation refuses them for the Krea-dev base, so int8/fp8
  requests dense-quantize instead (covered by existing prequant tests).
This commit is contained in:
Daniel Han 2026-07-17 10:49:04 +00:00
commit 08b853df15
6 changed files with 69 additions and 0 deletions

View file

@ -284,6 +284,9 @@ _TRUSTED_NON_GGUF_REPOS = frozenset(
"black-forest-labs/flux.1-dev",
"black-forest-labs/flux.1-schnell",
"black-forest-labs/flux.1-kontext-dev",
# Krea's guidance-distilled FLUX.1-dev finetune: same arch/layout as dev (FluxPipeline,
# CLIP+T5+ae), gated like dev. Detected as the flux.1 family via the "flux.1" token.
"black-forest-labs/flux.1-krea-dev",
"tongyi-mai/z-image-turbo",
"qwen/qwen-image",
"qwen/qwen-image-2512",

View file

@ -454,6 +454,10 @@ def resolve_base_repo(fam: DiffusionFamily, base_repo: Optional[str]) -> str:
# first -- same values as the UI's MODEL_DEFAULTS table (images-page.tsx); keep in sync.
_GENERATION_DEFAULTS: tuple[tuple[str, int, float], ...] = (
("z-image-turbo", 9, 0.0),
# FLUX.1 Krea dev is a FLUX.1-dev finetune (flux.1 family), NOT a Krea-2: its card runs
# 28 steps at guidance 4.5. Must precede the generic "krea" key below, which would
# otherwise hand it Krea-2-Turbo's 8-step no-CFG recipe.
("flux.1-krea", 28, 4.5),
# Krea 2 Raw (undistilled): 52 steps / guidance 3.5. Must precede the generic "krea" key.
("krea-2-raw", 52, 3.5),
# Krea 2 Turbo (distilled): 8 steps, no CFG. "krea" then covers Turbo and other krea ids but Raw.

View file

@ -53,6 +53,38 @@ def test_ideogram4_repos_are_trusted_non_gguf():
assert not _is_trusted_diffusion_repo("ideogram-ai/some-future-repo")
# ── FLUX.1 Krea dev (flux.1 family variant) ──────────────────────────────────
@pytest.mark.parametrize(
"repo_id",
[
"black-forest-labs/FLUX.1-Krea-dev",
"QuantStack/FLUX.1-Krea-dev-GGUF",
# A local GGUF pick where the family keyword lives in the filename.
"QuantStack/FLUX.1-Krea-dev-GGUF/flux1-krea-dev-Q4_K_M.gguf",
],
)
def test_detect_family_flux1_krea_dev(repo_id):
# Krea's FLUX.1-dev finetune keeps the exact dev layout, so it must resolve to the
# existing flux.1 family (FluxPipeline), never to krea-2 (a different arch).
fam = detect_family(repo_id)
assert fam is not None and fam.name == "flux.1"
assert fam.pipeline_class == "FluxPipeline"
def test_flux1_krea_dev_is_trusted_non_gguf():
# The gated official pipeline loads via from_pretrained -> needs the allowlist.
assert _is_trusted_diffusion_repo("black-forest-labs/FLUX.1-Krea-dev")
def test_flux1_krea_dev_generation_defaults():
# Model-card recipe: 28 steps at guidance 4.5. The generic "krea" key (Krea-2-Turbo's
# 8-step no-CFG shape) must NOT swallow it, and the krea-2 defaults must stay intact.
assert default_generation_params("black-forest-labs/FLUX.1-Krea-dev") == (28, 4.5)
assert default_generation_params("QuantStack/FLUX.1-Krea-dev-GGUF") == (28, 4.5)
assert default_generation_params("krea/Krea-2-Turbo") == (8, 0.0)
assert default_generation_params("krea/Krea-2-Raw") == (52, 3.5)
def test_ideogram4_generation_defaults():
# Model-card settings: 48 steps, guidance 7 (the backend keeps the pipeline's
# recommended tapered schedule when the request matches exactly).

View file

@ -348,6 +348,19 @@ assert.equal(
}).repoId,
"black-forest-labs/FLUX.1-dev",
);
// FLUX.1 Krea dev: gated BF16 skipped when undownloaded -> the open QuantStack GGUF; the
// GGUF repo id also resolves to the group (cross-owner via the artifact list).
const kreaDevRoute = groupForRepoId("black-forest-labs/FLUX.1-Krea-dev", IMAGE_CATALOG);
assert.ok(kreaDevRoute);
assert.equal(
pickDefaultArtifact(kreaDevRoute, { gpuGb: 80, systemRamGb: 128, isDownloaded: notDownloaded })
.repoId,
"QuantStack/FLUX.1-Krea-dev-GGUF",
);
assert.equal(
groupForRepoId("QuantStack/FLUX.1-Krea-dev-GGUF", IMAGE_CATALOG),
kreaDevRoute,
);
// FLUX.1-schnell is Apache-2.0 (not gated): its BF16 IS auto-routed on a GPU that fits it.
const fluxSchnellRoute = groupForRepoId("unsloth/FLUX.1-schnell", IMAGE_CATALOG);
assert.ok(fluxSchnellRoute);

View file

@ -198,6 +198,19 @@ export const IMAGE_CATALOG: CatalogGroup[] = [
gguf("unsloth/FLUX.1-dev-GGUF"),
],
},
{
// Krea's guidance-distilled FLUX.1-dev finetune ("opinionated aesthetics"): same
// arch/layout as FLUX.1-dev, so it runs under the existing flux.1 family. The base
// repo is gated like dev; QuantStack publishes the open GGUF quants.
canonicalId: "black-forest-labs/FLUX.1-Krea-dev",
displayName: "FLUX.1 Krea dev",
description: "Text-to-image",
scope: "image",
artifacts: [
bf16Pipeline("black-forest-labs/FLUX.1-Krea-dev", 32, { gated: true }),
gguf("QuantStack/FLUX.1-Krea-dev-GGUF"),
],
},
{
canonicalId: "unsloth/FLUX.2-klein-4B",
displayName: "FLUX.2 klein 4B",

View file

@ -156,6 +156,10 @@ const MODEL_DEFAULTS: Array<{ match: string; steps: number; guidance: number }>
{ match: "flux.1-schnell", steps: 4, guidance: 0 },
// Kontext (editing) before the generic flux.1: ~28 steps, lower guidance (~2.5).
{ match: "kontext", steps: 28, guidance: 2.5 },
// Krea's FLUX.1-dev finetune runs its card recipe (28 steps, guidance 4.5); before
// the generic flux.1 key. It never hits the krea-2 keys above ("krea-2" is not a
// substring of "flux.1-krea-dev").
{ match: "flux.1-krea", steps: 28, guidance: 4.5 },
{ match: "flux.1", steps: 28, guidance: 3.5 },
{ match: "flux.2-klein", steps: 4, guidance: 0 },
// FLUX.2-dev is the full (non-distilled) model: more steps + real guidance, unlike klein.