Skip to content

record(MODEL-MATRIX): row the 8 recipe architectures that had none (#609, #610) - #620

Closed
localai-bot wants to merge 1 commit into
mainfrom
row/model-matrix-recipe-backfill
Closed

record(MODEL-MATRIX): row the 8 recipe architectures that had none (#609, #610)#620
localai-bot wants to merge 1 commit into
mainfrom
row/model-matrix-recipe-backfill

Conversation

@localai-bot

Copy link
Copy Markdown
Collaborator

Records only. No src/, include/ or tests/ change.

The matrix claims exhaustive coverage. An audit of the 157 official model recipes
at vllm-project/recipes 86c7777a, joined to each model's HF config.json
architectures and then to .agents/model-matrix.md, found architecture strings
with no row at all. This adds them at INVENTORIED.

The 8 rows

Pin-lag — registered on vLLM main, absent only at 555967922 (#609):

Row ID Architecture Recipe
MODEL-TEXT-qwen3-5-qwen3-5-moe-for-causal-lm Qwen3_5MoeForCausalLM Qwen/Qwen3.8-2.4T-A95B
MODEL-TEXT-bailing-moe-v3-bailing-moe-v3-for-causal-lm BailingMoeV3ForCausalLM inclusionAI/Ling-3.0-flash

Out-of-repo — vllm-project/vllm-omni, following the MiniMaxH3DiTModel
precedent (#610):

Row ID Architecture Recipes
MODEL-MM-moss-tts-moss-tts-delay-talker-for-generation MossTTSDelayModel MOSS-TTS, MOSS-TTSD-v1.0, MOSS-SoundEffect, MOSS-VoiceGenerator
MODEL-MM-moss-tts-moss-tts-realtime-talker-for-generation MossTTSRealtime MOSS-TTS-Realtime
MODEL-MM-qwen3-tts-qwen3-tts-talker-for-conditional-generation Qwen3TTSForConditionalGeneration, Qwen3TTSTalkerForConditionalGeneration Qwen3-TTS-12Hz-1.7B-CustomVoice
MODEL-MM-higgs-audio-v3-higgs-audio-v3-talker-for-conditional-generation HiggsMultimodalQwen3ForConditionalGeneration, HiggsAudioV3TalkerForConditionalGeneration higgs-audio-v3-tts-4b
MODEL-MM-voxtral-realtime-voxtral-realtime-for-conditional-generation VoxtralRealtimeForConditionalGeneration (target-pending) Voxtral-Mini-4B-Realtime-2602
MODEL-MM-bailing-mm-native-bailing-mm-native-for-conditional-generation BailingMMNativeForConditionalGeneration (target-pending) Ming-omni-tts-0.5B

Qwen3_5MoeForCausalLM: alias or separate target?

Neither a pure alias nor a new port, and the row says so plainly.

The class already exists at our pin — qwen3_5.py:381 (main :443) — and is
exactly what the multimodal class builds as its own text tower:
Qwen3_5MoeForConditionalGeneration.__init__ does
self.language_model = Qwen3_5MoeForCausalLM(...) at qwen3_5.py:643 (pin) /
:724 (main). What main added is a registry entry at registry.py:203
in _TEXT_GENERATION_MODELS, exposing that text-only backbone standalone: same
module, different class, different task category (text generation vs
multimodal), no vision tower and no MM processor. Under the matrix's alias rule —
group only on an exact (category, module, class) match — it earns its own row
rather than folding into MODEL-MM-qwen3-5-qwen3-5-moe-for-conditional-generation.

But it is a cheap close, not a port: we already ship that tower token-exact. We
bind only the string Qwen3_5MoeForConditionalGeneration
(src/vllm/model_executor/models/qwen3_5_moe.cpp:215) and nest the text fields
under a text sub-config (src/vllm/transformers_utils/hf_config.cpp:396), while
Qwen/Qwen3.8-2.4T-A95B declares Qwen3_5MoeForCausalLM with those fields at
top level. Registration plus a flat-config descent, once the pin advances.

BailingMoeV3ForCausalLM succeeds BailingMoeV2_5ForCausalLM but is a new
module, not a class rename
: V2.5 (bailing_moe_linear.py, 821 lines at the pin)
pairs MLA with Bailing linear attention; V3 (bailing_moe_v3.py, 1495 lines on
main) keeps MLA and swaps the linear arm for Kimi Delta Attention, adds
per-projection causal conv1d, grouped-topk MoE via config.n_group, a clamped
SwigluStepAndMul, an fp8 quant-config hook, and refuses a checkpoint without
no_kda_lora=True. Line anchors are on the row.

Counts

Rollup INVENTORIED 314 → 322 and Total 362 → 370; check-agent-record's MODEL
row count moves with it.

The at-the-pin model inventory is deliberately unchanged — 324 rows / 373
memberships / 356 architectures / 310 targets / 261 modules. None of the eight is
at the pin, so like the MuseGlimmer, KimiK3 and MiniMaxH3DiT rows before
them they carry no pinned-registry module-colon-colon-class token and
contribute nothing to that invariant. Existing convention, not a relaxation: no
checker expectation was widened to make this pass.

The header prose distinguishes at-pin from beyond-pin, so it is reconciled the
same way: 326 at the pin plus 3 beyond becomes 326 plus 11 = 337, long tail
284 → 292, engaged 45 unchanged. One pre-existing error in that same block is
corrected while it is open: the caption read "the 49 non-INVENTORIED rows"
where the file has, and had, 48.

Two notes before closing the issues

  1. Model matrix is short BailingMoeV3ForCausalLM, a recipe architecture that exists in vLLM main #609 and Six vllm-omni recipe architectures have no model-matrix row: the TTS/audio-generation modality is entirely unplaced #610 say two and seven. Their own tables enumerate two and six.
    Reproducing the audit independently (157 recipes → 157 config rows → join)
    returns exactly eight, matching the enumerations. Eight is what landed.
  2. That reproduction could not read 20 of the 157 recipe configs (gated or
    404 — including Voxtral-4B-TTS-2603, GLM-TTS, IndexTTS-2.5,
    stable-audio-open-1.0). Coverage for those is unverified, not clean, and
    several vllm-omni TTS architectures visible in the omni docs still have no
    row. Worth its own audit issue.

Evidence

python3 scripts/check-model-checklist.py:

OK: architecture-support checklist matches the detailed row states.

scripts/agent-preflight.sh --staged → exit 0, all 24 record gates, 40 mutation
suites and both staged gates ok.

test_cpu_x86_llamacpp_floor was RED on the first staged run at loadavg 63 and
GREEN on the same tree at 21.9: it races the harness's quiet-window gate and
fails toward a verdict on whatever diff is in flight. Filed as #618 and added to
the intake table — not fixed here, since it changes a test's semantics.

Closes #609.
Closes #610.

, #610)

FOLLOWING_AGENTS_PROTOCOL

The matrix claims exhaustive coverage. An audit of the 157 official model
recipes at vllm-project/recipes 86c7777a, joined to each model's HF
config.json architectures and then to this file, found eight architecture
strings with no row. They are added here at INVENTORIED. Records only: no
src/, include/ or tests/ change, and no mark claims more than its row backs.

Qwen3_5MoeForCausalLM is the one worth reading. It is NOT an alias of
Qwen3_5MoeForConditionalGeneration, and it is also NOT a new port. The class
already exists at our pin (qwen3_5.py:381; main :443) and is precisely what
the multimodal class builds as its own text tower --
Qwen3_5MoeForConditionalGeneration.__init__ does
`self.language_model = Qwen3_5MoeForCausalLM(...)` at qwen3_5.py:643 (pin) /
:724 (main). What vLLM main added is a REGISTRY entry (registry.py:203, in
_TEXT_GENERATION_MODELS) exposing that text-only backbone standalone: same
module, different class, different task category, no vision tower and no MM
processor. So it earns its own row under the matrix's alias rule, which groups
only exact (category, module, class) matches -- but closing it is a
registration plus flat-config-descent job, not a model port. We already ship
that tower token-exact; we simply bind only the string
Qwen3_5MoeForConditionalGeneration (qwen3_5_moe.cpp:215) and nest the text
fields under a text sub-config (hf_config.cpp:396), while
Qwen/Qwen3.8-2.4T-A95B declares Qwen3_5MoeForCausalLM with those fields at top
level.

BailingMoeV3ForCausalLM succeeds BailingMoeV2_5ForCausalLM but is a new module
rather than a class rename: V2.5 (bailing_moe_linear.py, 821 lines at the pin)
pairs MLA with Bailing linear attention, whereas V3 (bailing_moe_v3.py, 1495
lines on main) keeps MLA and swaps the linear arm for Kimi Delta Attention,
adds per-projection causal conv1d, grouped-topk MoE via config.n_group, a
clamped SwigluStepAndMul, an fp8 quant-config hook, and refuses a checkpoint
without no_kda_lora=True. Line anchors are on the row.

The six #610 rows follow the MiniMaxH3DiTModel precedent, which is the one
vllm-omni architecture already rowed. Four resolve in
vllm_omni/model_executor/models/registry.py @ bbe6ccc5. Two do not resolve
anywhere: VoxtralRealtimeForConditionalGeneration and
BailingMMNativeForConditionalGeneration are the literal config.json strings of
their recipes, and appear in none of the pinned registry, any of the ten
dictionaries of vLLM main's registry.py, vllm-omni's _OMNI_MODELS, or
vllm-omni's supported_models.md. Those two are recorded target-pending with
what was searched and with the near misses named -- VoxtralRealtimeGeneration
is registered at the pin and already has its own row here, and vllm-omni
carries a BailingMM2NativeForConditionalGeneration alias, note the 2 -- but no
anchor is asserted for either.

Counts. Eight rows, so the rollup moves INVENTORIED 314 -> 322 and Total
362 -> 370, and check-agent-record's MODEL row count moves with it. The
at-the-pin model inventory (324 rows / 373 memberships / 356 architectures /
310 targets / 261 modules) is deliberately UNCHANGED: none of the eight is at
the pin, so like the MuseGlimmer, KimiK3 and MiniMaxH3DiT rows before them
they carry no pinned-registry module::class token and contribute nothing to
it. That is the existing convention, not a relaxation -- no checker
expectation was widened to make this pass.

The header prose distinguishes at-pin from beyond-pin rows, so it is
reconciled the same way: 326 at the pin plus 3 beyond becomes 326 plus 11, =
337, with the long tail 284 -> 292 and the engaged count 45 unchanged. Two
pre-existing errors in that block are corrected while it is open rather than
left standing: the caption read "the 49 non-INVENTORIED rows" where the file
has, and had, 48.

Two notes for whoever closes the issues. First, #609 and #610 say two and
seven; their own tables enumerate two and six, and reproducing the audit
independently returns exactly eight, so eight is what landed. Second, that
reproduction could not read 20 of the 157 recipe configs (gated or 404,
including Voxtral-4B-TTS-2603, GLM-TTS, IndexTTS-2.5 and stable-audio-open),
so coverage for those is unverified rather than clean, and several vllm-omni
TTS architectures visible in the omni docs still have no row.

Also files #618: test_cpu_x86_llamacpp_floor's contended-leg case red on this
branch at loadavg 63 and green at 21.9 on the same tree -- it races the box's
quiet-window gate, so it fails toward a verdict on whatever diff is in flight.
Filed, not fixed here: it changes a test's semantics.

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [Claude Code]
@localai-bot

Copy link
Copy Markdown
Collaborator Author

Correction to the commit message, recorded here rather than force-pushed (the branch is already published and this protocol takes no force variant).

The commit body says "Two pre-existing errors in that block are corrected" and then names only one. One is correct: the caption read "the 49 non-INVENTORIED rows" where the file has, and had, 48. Everything else in that paragraph — 326 + 3 = 329, engaged 45, tail 284 — was internally consistent before this change; the 284 → 292 move is this PR's own reconciliation for the 8 new rows, not a repair of prior drift.

The PR body above states it correctly as one. Worth fixing in the squash message at merge time.

localai-bot pushed a commit that referenced this pull request Aug 13, 2026
…ce (#620)

FOLLOWING_AGENTS_PROTOCOL

This branch appended #609 and #610 to the intake table with em-dash rows, because
when it was written neither issue had a row to point at. #620 has since added the
eight matrix rows AND placed both issues in place, keyed to
MODEL-TEXT-qwen3-5-qwen3-5-moe-for-causal-lm and
MODEL-MM-moss-tts-moss-tts-delay-talker-for-generation.

Two branches, one keyed record, entries at different line positions: git merges
both without a conflict and the table ends up defining #609 and #610 twice. That
is the move-plus-add duplicate shape -- it does not announce itself, because a
clean merge is exactly what it produces. The append is the weaker of the two (em
dash vs a real row), so it goes; #620 owns those keys.

This branch keeps #605-#608, which #620 does not touch.

Not a merge-order fix: removing the duplicate here is correct whichever PR lands
first.

python3 scripts/check-agent-record.py: 0 errors.

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [Claude Code]
@localai-bot

Copy link
Copy Markdown
Collaborator Author

Superseded by #625 — same tree, byte-identical, clean history.

Why this one could not be repaired in place. #620's first commit (5775f744a) changed .agents/model-matrix.md (a feature_surface) without docs/FEATURES.md in that same commit. check-doc-checkpoint is per-commit by design and carries no exemption mechanism — its own source says escape hatches are what it was rebuilt to remove. I verified directly that a later commit in the range does not clear it:

$ python3 scripts/check-doc-checkpoint.py --base origin/main --head HEAD
ERROR: commit b326899a9: changed feature_surface but did not update docs/FEATURES.md.

So the only remedies were rewriting published history or clean history on a fresh branch. This protocol takes no force variant, so #625 is the fresh branch.

#625 also carries the two corrections that arrived after #620 was opened: the Qwen3_5MoeForCausalLM row is dropped (already owned by #490 / PR #601 under the identical stable ID — two branches adding the same keyed row merge with no conflict and define it twice), taking this to seven rows and counts to INVENTORIED 321 / Total 369; and the pr-size mutation evidence in tests/scripts/test_agent_record.py that #620 was red on.

Branch row/model-matrix-recipe-backfill is left in place for history and can be deleted with this PR.

@localai-bot
localai-bot deleted the row/model-matrix-recipe-backfill branch August 13, 2026 11:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants