Skip to content

Commit 04b7d71

Browse files
committed
[0.17.0] 'MiniMax-H3 Prompt Rewriter Omni' node added
1 parent c34c45f commit 04b7d71

23 files changed

Lines changed: 2824 additions & 248 deletions

CHANGELOG.md

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,123 @@ The version in `pyproject.toml`, the git tag and the release on GitHub always sa
66
the same thing; the release workflow refuses a tag that disagrees with
77
`pyproject.toml`, or one that neither changelog has a section for.
88

9+
## 0.17.0 - 2026-08-26
10+
11+
### Added
12+
13+
- **MiniMax-H3 Prompt Rewriter Omni**, for LightX2V's third adapter - the first
14+
that hears. It is trained on Qwen2.5-Omni-7B, the same model this pack's
15+
captioners already use, so a reference reaches it as the asset itself rather
16+
than as a sentence somebody wrote about it: the picture, the clip, or the
17+
sound. It is also the only one of the three trained on **Ref2AV**, the
18+
full-reference task, which answers with six fields instead of three.
19+
20+
One growing socket takes an IMAGE, a VIDEO or an AUDIO, so there is no wrong
21+
socket to plug into: what a reference is called follows from what it is, and
22+
pictures are numbered among pictures, sounds among sounds. The strip below
23+
shows what is connected, in what order, and what each will be called - and
24+
that order is the ordering: drag the second picture to the front and it
25+
becomes `<Picture 1>`. There is deliberately no relabelling here, unlike the
26+
Universal Writer's strip: the socket settles what a reference is, and a
27+
*subject* is something this adapter produces in `subject_definitions`, not
28+
something the request supplies.
29+
30+
`duration` is snapped before it is written into the turn. MiniMax-H3 generates
31+
on a 17n+5 frame grid at 24 fps, so most lengths do not exist: ask for 10
32+
seconds and it is 243 frames, 10.13 s, and that is the number the alignment
33+
line quotes back. The widget stays what you meant.
34+
35+
- **The Omni adapter as GGUF**, converted from LightX2V's safetensors with
36+
llama.cpp's `convert_lora_to_gguf.py` and published at
37+
[pytraveler/MiniMax-H3-Prompt-Rewriter-LoRA-Omni-GGUF](https://huggingface.co/pytraveler/MiniMax-H3-Prompt-Rewriter-LoRA-Omni-GGUF)
38+
in `F16` (0.65 GB) and `Q8_0` (0.34 GB, same rewrite behaviour). Which means
39+
the Omni rewriter runs on the llama.cpp route with nothing installed, at a 6.2
40+
GB download rather than the 22.4 GB the safetensors base costs.
41+
42+
- **`models_omni` and `adapters_omni` in `models.json`**, holding the
43+
Qwen2.5-Omni-7B bases in both shapes the adapter is published for. Two kinds
44+
of near-miss are marked in the list rather than hidden: a Qwen2.5-Omni-**3B**
45+
is `(wrong size for the adapter)`, and a **Qwen2.5-VL-7B** - the same
46+
architecture string, the same 28 blocks, the same width, so the adapter *would*
47+
attach - is `(vision only, not an Omni build)`, told apart by its projector
48+
having no audio encoder.
49+
50+
- **A third tab on the Universal Rewriter, and Ref2VA with it.** Same prompt,
51+
same two frames, third adapter, one click. `model_omni` and `quantization_omni`
52+
belong to the tab; everything above them is shared, as before.
53+
54+
The tab also brings the fifth task, and two sockets to feed it:
55+
`reference_video` and `reference_audio`, read by `Ref2VA` and by nothing else -
56+
the other two adapters have no ear, and the four frame tasks take pictures
57+
alone, so a sound connected to `FL2VA` is refused by name rather than quietly
58+
dropped. On `Ref2VA` everything connected is a reference in socket order:
59+
`first_frame`, `last_frame`, the clip, the sound.
60+
61+
Its four extra outputs are appended **after** the three every task fills rather
62+
than interleaved with them, because ComfyUI addresses an output link by its
63+
slot index: putting `subject_definitions` in the middle would have moved
64+
`overall_soundscape` in every workflow already built on this node. The same
65+
trap as widget positions, one layer down.
66+
67+
Four references and no strip, where the Prompt Rewriter Omni node takes twelve
68+
and lets you drag them: order is the whole labelling rule, and with four
69+
sockets the order is the order of the sockets.
70+
71+
### Fixed
72+
73+
- **A section deleted from the model list stays deleted.** Removing entries one
74+
at a time already stuck -- `seed_offered` records every name the packaged list
75+
has ever put in front of you, so anything you take out is not put back. But
76+
removing a whole section did not: the merge read an absent section as "this
77+
installation predates it" and copied the packaged one in wholesale, every
78+
start, forever. Which made a section the one edit the file would not keep,
79+
in the one file whose whole point is that it is yours to edit.
80+
81+
The two situations are told apart by the same record the entries use. An
82+
installation that predates a section has never been offered its entries and
83+
gets all of them; somebody who deleted the section has been offered every one
84+
and gets none. Found while checking that `models_omni` and `adapters_omni`
85+
reach an existing user file - they do, and this was underneath.
86+
87+
- **A reference frame no longer arrives at the vision tower full size.** Qwen
88+
spends a token per 28x28 block, so a 1616x1616 picture - which is what a
89+
ComfyUI workflow hands over without thinking about it - is 3249 tokens. Two of
90+
them overflowed an 8k context before a word of the prompt was counted, and
91+
`FL2AV` died at `decode: failed to find a memory slot for batch of size 1316`
92+
with both pictures already encoded. `I2AV` with one picture survived, which is
93+
what made it look like a broken task rather than a budget.
94+
95+
The size is not the only thing wrong with that. LightX2V's own inference
96+
scripts cap a picture on the processor - 301056 pixels for the Omni adapter,
97+
1024x1024 for the 8B - so a full-size frame is also a shape neither model saw
98+
in training. Both nodes now scale to their adapter's own ceiling, and a frame
99+
taken from a clip is capped harder still, at 100352 pixels, for the reason a
100+
clip is many pictures.
101+
102+
The context is then sized to what the turn actually costs, measured off the
103+
written files rather than guessed, so a `Ref2AV` with eight references widens
104+
it instead of failing.
105+
106+
- **The Omni safetensors base is no longer refused as the wrong model.** The
107+
check that reads `config.json` looked one level in, at `text_config`.
108+
Qwen2.5-Omni keeps its language model two levels down, under
109+
`thinker_config.text_config`, because the checkpoint holds a talker and a
110+
vocoder as well - so the top level has no `hidden_size` at all and the base the
111+
adapter was trained on was reported as `not Qwen2.5-Omni-7B`. It now walks
112+
down.
113+
114+
- **And it now loads.** `AutoModelForImageTextToText` has no entry for
115+
`qwen2_5_omni`, only for the thinker inside it, which is the half the adapter
116+
was cut for and the only half that writes anything - so even past the check
117+
above the load would have failed with "unrecognized configuration class". The
118+
loader descends the same nested configs and takes the class from Transformers'
119+
own mapping.
120+
121+
- **A full KV cache no longer reports itself as an unreadable projector.** `find
122+
a memory slot` was not among the strings the failure hint recognised, so it
123+
fell through to the note about projector formats and sent the reader off to
124+
change models when the fix was one number.
125+
9126
## 0.16.6 - 2026-08-25
10127

11128
### Added

CHANGELOG_RU.md

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,123 @@
66
workflow релиза отклонит тег, который расходится с `pyproject.toml`, и тег, для
77
которого нет раздела ни в одном из двух changelog'ов.
88

9+
## 0.17.0 - 2026-08-26
10+
11+
### Добавлено
12+
13+
- **MiniMax-H3 Prompt Rewriter Omni** - под третью лору LightX2V, первую, которая
14+
слышит. Она обучена на Qwen2.5-Omni-7B, той самой модели, которую капшенеры
15+
этого пака уже используют, поэтому референс доходит до неё самим собой, а не
16+
чьим-то предложением о нём: картинкой, клипом, звуком. И только она из трёх
17+
обучена на **Ref2AV** - задаче полного референса, которая отвечает шестью
18+
полями вместо трёх.
19+
20+
Один растущий вход принимает IMAGE, VIDEO или AUDIO, так что неправильного
21+
гнезда здесь нет: как назовут референс, следует из того, что он такое, а
22+
картинки нумеруются среди картинок, звуки среди звуков. Стрип под ним
23+
показывает, что подключено, в каком порядке и как будет названо, - и этот
24+
порядок и есть нумерация: перетащите вторую картинку в начало, и она станет
25+
`<Picture 1>`. Переименования здесь намеренно нет, в отличие от стрипа
26+
Universal Writer: тип входа решает, что такое референс, а *субъект* - это то,
27+
что эта лора **производит** в `subject_definitions`, а не то, что ей подают.
28+
29+
`duration` снапится перед тем, как попасть в ход. MiniMax-H3 генерирует по
30+
сетке 17n+5 кадров на 24 fps, поэтому большинства длительностей просто не
31+
существует: просишь 10 секунд - получаешь 243 кадра, 10.13 с, и именно это
32+
число модель повторяет в строке выравнивания. Виджет остаётся тем, что вы имели
33+
в виду.
34+
35+
- **Omni-лора в формате GGUF** - сконвертирована из safetensors LightX2V через
36+
`convert_lora_to_gguf.py` из llama.cpp и опубликована в
37+
[pytraveler/MiniMax-H3-Prompt-Rewriter-LoRA-Omni-GGUF](https://huggingface.co/pytraveler/MiniMax-H3-Prompt-Rewriter-LoRA-Omni-GGUF)
38+
в `F16` (0.65 ГБ) и `Q8_0` (0.34 ГБ, ведёт себя так же). А значит, Omni-ререйтер
39+
работает по пути llama.cpp вообще без установки пакетов, при загрузке 6.2 ГБ
40+
вместо 22.4 ГБ, которые стоит база в safetensors.
41+
42+
- **`models_omni` и `adapters_omni` в `models.json`** - базы Qwen2.5-Omni-7B в
43+
обеих формах, в которых опубликована лора. Два похожих, но неподходящих
44+
варианта помечены в списке, а не спрятаны: Qwen2.5-Omni-**3B** - это
45+
`(wrong size for the adapter)`, а **Qwen2.5-VL-7B** - та же строка
46+
архитектуры, те же 28 блоков, та же ширина, то есть лора *прикрепится*, - это
47+
`(vision only, not an Omni build)`; различает их отсутствие аудио-энкодера в
48+
проекторе.
49+
50+
- **Третья вкладка в Universal Rewriter, и Ref2VA вместе с ней.** Тот же промпт,
51+
те же два кадра, третья лора, один клик. Вкладке принадлежат `model_omni` и
52+
`quantization_omni`, всё выше - общее, как и раньше.
53+
54+
Вкладка приносит и пятую задачу, и два гнезда под неё: `reference_video` и
55+
`reference_audio`, которые читает только `Ref2VA` и больше никто - у двух
56+
других лор нет слуха, а четыре кадровые задачи берут одни картинки, поэтому
57+
звук, подключённый к `FL2VA`, отклоняется по имени, а не выбрасывается молча.
58+
На `Ref2VA` всё подключённое становится референсом в порядке гнёзд:
59+
`first_frame`, `last_frame`, клип, звук.
60+
61+
Четыре её новых выхода дописаны **после** тех трёх, что заполняет любая задача,
62+
а не вставлены между ними: ComfyUI адресует связь выхода индексом слота, и
63+
`subject_definitions` посередине сдвинул бы `overall_soundscape` во всех уже
64+
собранных на этой ноде графах. Та же ловушка, что с позициями виджетов, только
65+
этажом ниже.
66+
67+
Четыре референса и без стрипа, тогда как нода Prompt Rewriter Omni берёт
68+
двенадцать и даёт их перетаскивать: порядок - это и есть всё правило нумерации,
69+
а при четырёх гнёздах порядок задаётся самими гнёздами.
70+
71+
### Исправлено
72+
73+
- **Удалённая из списка моделей секция остаётся удалённой.** Удаление записей по
74+
одной работало и раньше: `seed_offered` помнит каждое имя, которое поставляемый
75+
список когда-либо предлагал, поэтому убранное не возвращается. А вот удаление
76+
секции целиком - нет: слияние читало отсутствующую секцию как «эта установка
77+
старше неё» и копировало поставляемую целиком, при каждом запуске и навсегда.
78+
То есть секция оказалась единственной правкой, которую файл не сохранял, - в
79+
файле, весь смысл которого в том, что он ваш и его можно править.
80+
81+
Две ситуации различаются по той же записи, по которой различаются записи
82+
внутри. Установке, которая старше секции, её содержимое никогда не предлагали,
83+
и она получает всё; тому, кто секцию удалил, предлагали каждую запись, и он не
84+
получает ничего. Нашлось при проверке, доезжают ли `models_omni` и
85+
`adapters_omni` до уже существующего пользовательского файла - доезжают, а это
86+
лежало под ними.
87+
88+
- **Референсный кадр больше не приезжает во vision-башню в полный размер.** Qwen
89+
тратит токен на блок 28x28, поэтому картинка 1616x1616 - ровно то, что
90+
воркфлоу ComfyUI отдаёт не задумываясь, - это 3249 токенов. Две таких
91+
переполняли контекст 8k раньше, чем считалось хоть одно слово промпта, и
92+
`FL2AV` падал на `decode: failed to find a memory slot for batch of size 1316`,
93+
успев закодировать обе. `I2AV` с одной картинкой выживал - из-за чего это
94+
выглядело сломанной задачей, а не исчерпанным бюджетом.
95+
96+
Размер плох не только этим. Скрипты инференса самой LightX2V ставят потолок
97+
картинке на процессоре - 301056 пикселей для Omni, 1024x1024 для 8B, - то есть
98+
полноразмерный кадр это ещё и форма, которой ни одна из моделей не видела при
99+
обучении. Обе ноды теперь масштабируют до потолка своей лоры, а кадру из клипа
100+
потолок ниже - 100352 пикселя, по той причине, по которой клип это много
101+
картинок.
102+
103+
Контекст после этого считается по факту - по написанным на диск файлам, а не
104+
на глаз, - поэтому `Ref2AV` с восемью референсами расширяет его, а не падает.
105+
106+
- **База Omni в safetensors больше не отвергается как не та модель.** Проверка,
107+
читающая `config.json`, заглядывала на один уровень - в `text_config`. А
108+
Qwen2.5-Omni держит языковую модель на два уровня ниже, в
109+
`thinker_config.text_config`, потому что в чекпоинте лежат ещё talker и
110+
вокодер, - так что наверху нет вообще никакого `hidden_size`, и база, на
111+
которой лора и обучена, объявлялась «не Qwen2.5-Omni-7B». Теперь проверка
112+
спускается вниз.
113+
114+
- **И она теперь грузится.** У `AutoModelForImageTextToText` нет записи для
115+
`qwen2_5_omni` - только для thinker'а внутри, той половины, под которую лора и
116+
вырезана, и единственной, которая вообще пишет текст. То есть даже пройдя
117+
проверку выше, загрузка упала бы на «unrecognized configuration class».
118+
Загрузчик спускается по тем же вложенным конфигам и берёт класс из собственной
119+
таблицы Transformers.
120+
121+
- **Забитый KV-кэш больше не выдаёт себя за нечитаемый проектор.** Строки `find a
122+
memory slot` не было среди тех, что распознаёт подсказка об ошибке, поэтому она
123+
проваливалась в заметку про форматы проекторов и отправляла читателя менять
124+
модель там, где чинилось одно число.
125+
9126
## 0.16.6 - 2026-08-25
10127

11128
### Добавлено

0 commit comments

Comments
 (0)