Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
48 changes: 48 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,53 @@
# Changelog

## 1.4.0 — 2026-10-28

Qwen molto più veloce, e Klein che finalmente fa quello che gli chiedi (cambi di persona, vestiti, unire più foto): era un problema di come gli si parlava, non del modello. Tutto misurato sul tuo PC (RTX 4060 8 GB, 1024×1024).

### Perché Klein «non faceva niente»

- **BFL lo scrive nella scheda del modello: «non usare Klein senza un prompt upsampler»**, cioè un LLM che prima legge la richiesta e la riscrive in una descrizione completa. L'app lo faceva, ma l'LLM **vedeva solo la prima foto**: scriveva «sostituisci la donna con l'uomo della seconda foto» senza sapere com'è l'uomo, e Klein restituiva la seconda foto com'era. Provato: con la frase corta il risultato era l'uomo della foto 2 identico; con tutte le foto in vista all'LLM, l'uomo prende il posto della donna con la sua posa, la tazza «MORNING», il muro e la luce.
- Ora l'LLM guarda **tutte le foto** (in un lotto solo, come nel flusso ufficiale) e scrive in 3-6 secondi. Con le foto usa il prompt di sistema ufficiale di BFL.
- Il negativo di Klein è il positivo azzerato (come nei flussi di BFL), non più il testo vuoto: conta con Klein Base (CFG 3,5).
- Provato anche: la cache KV di FLUX (`FluxKVCache`) su Klein 3 non fa niente (stesso tempo), quindi non c'è.

### Klein: una pagina sola

- Scegli **Klein 3** o **Klein 3 Base** in alto e l'interfaccia diventa semplice: **scrivi** cosa vuoi; se vuoi, **aggiungi foto** (fino a 10: la prima è quella che cambia, le altre sono riferimenti). Con foto è una modifica e l'immagine esce grande come la foto 1; con «Scelgo io» scegli formato e misura e ne esce una nuova con quei riferimenti. Niente Genere, Stile, Box, Ricette né schede: Klein fa tutto da solo. Restano **Quante**, **Seed** e **LoRA** (dentro «Altro» e «LoRA», chiusi).
- Le foto trascinate sulla finestra, e «Cambia» sotto un risultato, vanno nelle Foto di Klein.
- Sotto il risultato puoi aprire **«Quello che ha visto il modello»**: il testo che l'LLM ha scritto.

### L'LLM che legge il prompt: a scelta, per tutti e due i modelli

- Un interruttore **«L'LLM legge il prompt»** sotto la casella del prompt (Crea e Modifica) e in Opzioni. **Klein: acceso di serie** (ne ha bisogno). **Qwen: spento di serie** (capisce bene anche i prompt brevi), ma si può accendere: con Qwen l'LLM scrive col suo stile (i tag `<image1>`, `<image2>` che vuole il suo enhancer ufficiale) e aiuta le modifiche difficili.
- Scrive il **Qwen3-VL 4B** (tutto nella VRAM, ~3-6 s); se non c'è, l'encoder di Qwen.

### Qwen veloce

- **Nuovo modello «Qwen veloce»** (la seconda pillola in alto): Qwen-Image 2.1 col **LoRA Lightning di LightX2V** (distillazione a 4 passi, CFG 1, per testo→immagine e modifiche; 67 MB, si scarica con un clic). Misurato: **1 MP in 15 s invece di 73** (a 25 passi), testi sull'immagine compresi (la tazza «MORNING» esce giusta). A 2,25 MP: 58 s a freddo; a 4 MP (2048×2048): 72 s. Il LoRA Fun-Acc di Alibaba PAI, provato, non si carica nel motore (chiavi non riconosciute: le immagini escono sfocate): non c'è.
- **Qwen base fa 25 passi invece di 40**: sono quelli dei workflow ufficiali di ComfyUI per Qwen-Image 2.1. 1 MP: 73 s a freddo e a caldo (2,8 s a passo).
- **Cache KV a Q4 di serie.** La cache del prompt e delle foto di Qwen costa un quarto della memoria. Misurato su una modifica a 25 passi: **3,5 → 3,1 s a passo (−11%)**, immagine uguale a occhio (40,7 dB di somiglianza con la cache piena; int8 50 dB); spenta la cache va il doppio più piano (8,3 s a passo). Con i 4 passi di Lightning la composizione può cambiare un po' (stesso seme, stessa qualità). Si cambia in Opzioni → Avanzate. Le impostazioni esistenti passano a Q4, a Lightning e a 25 passi una volta sola.

### Misure sulla tua scheda (RTX 4060 8 GB, caldo, 1 MP se non diversamente detto)

| | tempo |
| --- | --- |
| Qwen veloce (4 passi) | 15 s |
| Qwen (25 passi) | 73 s (2,8 s a passo) |
| Qwen, modifica con una foto, 25 passi | 3,1 s a passo con Q4 (3,5 con la cache piena) |
| Klein 3 da zero (16 passi) | 9-12 s |
| Klein 3 da zero a 4 MP (2048×2048) | 58 s |
| Klein 3, modifica con 1 foto / 2 foto / 3 foto | 22 s / 38 s / 56 s |
| Klein 3 Base (50 passi, CFG 3,5), da zero / modifica | 56 s / 116 s |
| LLM che legge il prompt (4B) | 3-6 s |

A 4 MP, nelle zone sfocate dello sfondo di Klein si vede un po' di banding (a gradini): non indagato, a 1 MP non c'è.

### Dentro

- `test/bench-motore.mjs`: misure di velocità e immagini sul motore vero (un ComfyUI a parte, la tua app non c'entra).
- Prove nuove: `test/interfaccia-1.4.mjs` (quattro modelli, Qwen coi suoi modi, Klein con una pagina sola, foto → modifica), `test/grafi_v2.mjs` (Lightning in tutte le modalità, negativo di Klein, LLM che guarda più foto), `test/modelli.mjs`.

## 1.3.0 — 2026-10-28

Un giro di pulizia: i LoRA di Klein funzionano davvero, Klein parte dai 16 passi indicati da Black Forest Labs, Crea si usa subito (scrivi, scegli il formato, premi CREA) e le Opzioni sono corte, con tutto il resto in «Avanzate».
Expand Down
13 changes: 10 additions & 3 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,17 +50,17 @@ interfaccia**, installato e guidato dall'app.

## FLUX 3 Klein (famiglie di modelli)
- `Famiglia = 'qwen' | 'klein' | 'klein-base'` (`shared/tipi.ts`, `FAMIGLIE` = passi per qualità), `Richiesta.famiglia`, `impostazioni.famiglia`.
- **Tre modelli, niente Turbo di Qwen** (1.1, `src/shared/modelli.ts`, la mappa unica, provata da `node test/modelli.mjs`): `qwen-base` (40 passi), `klein` (veloce, 16 passi: quelli di BFL, fino alla 1.2.1 erano 8; 16 costa 4 s in più a 1 MP e dà dettagli più puliti), `klein-base` (50, CFG 3,5). `impostazioni.modelloScelto` va sempre d'accordo con `famiglia` (`allineaScelta` in `salvaImpostazioni`); le impostazioni vecchie si migrano una volta (`migra`: Turbo GGUF → UC dello stesso quant). La qualità «turbo» salvata vale «alta» (`senzaTurbo`): l'interfaccia non manda più `turbo: true`, i grafi del Turbo restano per i PNG vecchi.
- **Quattro modelli** (`src/shared/modelli.ts`, la mappa unica, provata da `node test/modelli.mjs`): `qwen-base` (**25 passi**, quelli dei workflow ufficiali di ComfyUI; fino alla 1.3 erano 40), `qwen-veloce` (**1.4**: LoRA **Lightning** di LightX2V, 4 passi, `turbo: true` + `imp.loraTurbo` = `qwen-image-2.1-lightning-4step.safetensors`, voce `lora-lightning` del catalogo; 15 s invece di 73 a 1 MP), `klein` (veloce, 16 passi: quelli di BFL), `klein-base` (50, CFG 3,5). Il vecchio Turbo8 a 8 passi non si usa più (resta per i PNG vecchi: `shiftDi`). `impostazioni.modelloScelto` va sempre d'accordo con `famiglia` (`allineaScelta` in `salvaImpostazioni`); le impostazioni vecchie si migrano una volta (`migra`: Turbo GGUF → UC dello stesso quant). La qualità «turbo» salvata vale «alta» (`senzaTurbo`): l'interfaccia non manda più `turbo: true`, i grafi del Turbo restano per i PNG vecchi.
Il selettore è `componenti/ScegliModello.tsx` (3 schede, "da scaricare", download di modello + `klein-te` + `klein-vae`), la qualità `ScegliQualita.tsx`.
- Catalogo: `klein-int8/bf16`, `klein-base-int8/bf16`, `klein-te` (Qwen3-VL 4B), `klein-vae` dal repo `black-forest-labs/flux-3-image-klein-comfy`
(`repo` + `cerca` regex, risolti a runtime da `installa/risolvi.ts`: **i nomi vengono dai template ufficiali, vanno confermati con i file veri**).
`motore/klein.ts` (`fileKlein`) trova i file (impostazioni → `risolti.json` → scansione cartelle, int8 prima di bf16) o dà un errore in italiano.
- Grafo (`grafi.ts`, `condiziona`/`latenteVuota`/`campiona`): `UNETLoader` + `CLIPLoader` tipo `flux3` + `VAELoader`, `CLIPTextEncode`, foto di riferimento
`VAEEncode` → `ReferenceLatent` (positivo e negativo, in catena), `EmptyFlux2LatentImage`, KSampler euler/simple (distillato cfg 1, base cfg 3,5).
Niente Turbo né cache KV (i LoRA invece sì: `applicaLora` vale per tutte le famiglie); i tag `<imageN>` diventano ordinali. **I grafi Qwen non devono cambiare**: si controlla con un confronto sul grafo vecchio prima di ogni modifica.
Niente Turbo né cache KV (i LoRA invece sì: `applicaLora` vale per tutte le famiglie; `FluxKVCache` non fa niente su Klein 3: provato, stesso tempo); i tag `<imageN>` diventano ordinali. Il negativo è il positivo azzerato (`ConditioningZeroOut`, come i workflow di BFL) se non ne scrivi uno. **I grafi Qwen non devono cambiare** (a parte Lightning): si controlla con `node test/confronta_grafi.mjs` prima di ogni modifica.
- **Testo con Klein**: ogni lavoro `descrivi` (migliora prompt, Foto→prompt, Idee, Estrai, Fusion/Esempio, Sorpresa, controllo omino, traduzione LLM) con famiglia Klein scrive col Qwen3-VL 4B (`conEncoderDiTesto` in `lavori.ts`, `encoderKleinFile` in `klein.ts`; `Richiesta.encoderKlein: false` per escluderlo): caricato come `krea2` e con `thinking: true` (con `false` il nodo mette un `<think></think>` vuoto e il 4B risponde «user»/vuoto). Con Qwen resta l'encoder di Qwen.
- `motore/pup.ts` = i prompt upsampler ufficiali; `lavori.ts` `potenzia()` li manda al Qwen3-VL prima del disegno (`impostazioni.potenziaKlein`, cache per prompt).
- Non provato con la GPU qui: qualità, INT8 su 6-8 GB, `ReferenceLatent` in catena (alternativa `ReferenceMultiLatent`).
- Provato su RTX 4060 8 GB (1.4): 16 passi a 1 MP in 13 s, modifica con 1 foto 22 s, con 2 foto 38 s; `ReferenceLatent` in catena = `ReferenceMultiLatent` (fanno lo stesso).
- **1.2.1: i modelli sono tre pillole** (`qwen-base`, `klein`, `klein-base`: «Qwen», «Klein 3», «Klein 3 Base») e si scelgono **solo dalla barra in alto** (`App.tsx` → `SelettoreModello` in `componenti/ScegliModello.tsx`, da qualsiasi pagina; nei pannelli di Crea/Modifica/Box non c'è un secondo selettore). **FLUX.2 Klein 4B è stato tolto** (niente famiglia `klein4b`, niente voci `klein4b-*` nel catalogo): le impostazioni vecchie passano a Qwen in `modelloDaImpostazioni`, i suoi file in `models/` si vedono come «tolto dal catalogo» (`idle.ts`) e `modelli:file` non li scambia per file di Klein 3 (`eFlux2`).
- **LoRA a due scaffali** (1.2.1): `GruppoLora = 'qwen' | 'flux'` (`shared/loraBase.ts`: `gruppoDiFamiglia`, `gruppoDa`, `vaBeneCon`; Klein veloce e Klein Base hanno gli stessi). File in `loras/qwen` e `loras/flux` (`lora.ts` `scaffale()`: i nomi dei tensori decidono, se non dicono niente vale la scheda da cui si carica, SDXL & co. restano fuori in «Altri» e si assegnano a mano con `InfoLora.gruppo`). **`elencoLora()` deve portare `famiglie` e `gruppo`**: nella 1.2.0 non lo faceva e il renderer dava «non compatibile» a ogni LoRA di Klein. Lo store ha **due pile** (`loraPile`, `loraAttive` = quella del modello scelto; `setLoraPila`/`toggleLoraPer` per scaffale); `richiestaBase()` manda la pila del modello, `loraPer`/`fileLoraCamera` (azioni rapide, Camera) solo LoRA che vanno col modello, e `soloLoraDelModello` in `lavori.ts` toglie quelli dell'altro scaffale. Prove: `test/lora-scaffali.mjs`, `test/box-lora-ui.mjs`.
**Formato dei LoRA di Klein (1.3):** i LoRA FLUX 3 esistono in due formati. AI Toolkit usa i nomi di ComfyUI (`diffusion_model.content_mode_blocks.image.N.q_proj`, `single_blocks.N.mlp_in`…) e il motore li carica; Diffusers/SimpleTuner usano `transformer.mode_blocks.image.N.attn.to_q`, `single_transformer_blocks.N.ff.linear_in`, e ComfyUI **non li conosce** (tutte le chiavi «not loaded», 0 patch: il LoRA non fa niente). `shared/loraBase.ts` li riconosce (`formato: 'diffusers'`), `shared/loraConverti.ts` ha la mappa dei nomi e `main/loraConverti.ts` riscrive solo l'intestazione del .safetensors (l'originale resta come `.diffusers.bak`; se alpha ≠ rango aggiunge i tensori `.alpha`). Si converte in `importaLora`, `scaricaLora` e in `elencoLora` per i file messi a mano; la forza di partenza di un LoRA di Klein è 0,75 (BFL). Prova: `node test/lora-converti.mjs`. Verificato sul motore vero con il LoRA delle angolazioni di akhaliq: prima 0 patch, dopo 172.
Expand Down Expand Up @@ -166,3 +166,10 @@ interfaccia**, installato e guidato dall'app.
- `index.ts`: istanza unica, `errori.log` in DATI, pulizia dei temp vecchi; `processo.ts`: `motore.pid` + `chiudiOrfano`, log a rotazione. `impostazioni.scaricaDopo` = secondi di quiete prima di liberare la VRAM.
- Renderer: `main.tsx` ha il `Salvagente` (ErrorBoundary) e il gestore `unhandledrejection`; `leggiLocale`/`leggiLista` tollerano localStorage rovinato.
- `test/finto.js` deve avere gli stessi campi del vero main (es. `modelli.file` con `klein*`): se mancano, l'avviso di errore compare e si vede.

## 1.4: veloce, e Klein che funziona (misurato sulla 4060)
- **Perché Klein «non faceva niente»**: BFL lo dice nella scheda («do not use the model without a prompt upsampler») e l'app lo faceva, ma l'upsampler vedeva **solo la prima foto** (`immagini.slice(0, 1)`): scriveva «sostituisci la donna con l'uomo della seconda foto» senza sapere com'è l'uomo, e Klein restituiva la seconda foto com'era. Ora `fotoPerTesto()` (`grafi.ts`) manda **tutte** le foto al `TextGenerate` in un lotto (`BatchImagesNode`, ognuna a ~0,4 MP e alla forma della prima, come nel flusso ufficiale) e il cambio personaggio riesce. Il 4B scrive in 3-6 s. Con le foto si usa il prompt di sistema ufficiale lungo (`PUP_I2I`); da zero la versione breve (`PUP_T2I_BREVE`) perché il 4B con quello lungo lo ricopia.
- **L'LLM che legge il prompt è un interruttore per modello** (`potenziaPer(imp, fam)`: `potenziaKlein` di serie acceso, `potenziaQwen` spento), sotto la casella del prompt di Crea e di Modifica (`componenti/InterruttoreLLM.tsx`) e in Opzioni. `lavori.ts` `potenzia()` serve tutti e due: con Qwen scrive il 4B se `testoCon4B` (di serie sì) e chiede i tag `<image1>…` (`PUP_QWEN_I2I`: lo dice il prompt ufficiale del suo enhancer); con Klein cita le foto a parole. Il testo scritto sta in `Lavoro.promptInglese` e si vede sotto il risultato di Crea.
- **Klein ha una pagina sola** (`Crea.tsx`, `klein = !qwen`): prompt, Foto (fino a 10: la prima è quella che cambia), misura «come la foto 1» (modalità `modifica`, esce a ≤ 1 MP) o «Scelgo io» (`StatoCrea.misuraLibera`: `crea` con quei riferimenti), Altro (quante, seed), LoRA. Niente Genere, Stile, Box, Ricette, Estrai né la barra dei modi (`App.tsx` non monta `StripModi`; `vaiModo` e `apriInModifica` rimandano a Crea; una foto trascinata sulla finestra si aggiunge alle Foto).
- **Cache KV di Qwen a Q4 di serie** (`cacheTipo: 'int4'`, migrata una volta da `migra14` in `impostazioni.ts`, che mette anche Lightning e 25 passi): a 25 passi su una modifica 3,5 → 3,1 s/passo (−11%), immagine identica a occhio (40,7 dB contro la cache piena; int8 50 dB). Con 4 passi (Lightning) la composizione può cambiare un po' (22-26 dB) ma non la qualità. Spenta la cache: 8,3 s/passo (il doppio).
- `test/bench-motore.mjs`: misure sul motore vero (costruisce i grafi come l'app, li manda a un ComfyUI a parte sulla porta 8899 e dà le fasi): vedi l'intestazione. **Non lanciare `test/vetrina.mjs`, `gui.mjs`, `console.mjs`, `modifica.mjs`, `setup.mjs`, `foto.mjs`: aprono l'app vera sui dati veri** (la 1.4 ha migrato le impostazioni di chi le ha provate). Per l'interfaccia: `node test/interfaccia-1.4.mjs` e gli altri test con Chromium e il finto `window.daprod`.
16 changes: 11 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,12 @@ Gira su una scheda NVIDIA **da 6-8 GB**, senza cloud e senza abbonamenti.
<img src="risorse/crea.png" width="860" alt="Crea: il preset Foto a sinistra, i tre modelli in alto, la Vespa a Positano">
</div>

## Novità della 1.4

- **Qwen veloce**: Qwen-Image 2.1 col LoRA Lightning (4 passi), **15 secondi a 1 MP invece di 73**. È la seconda pillola in alto. Qwen base ora fa 25 passi (erano 40) e la cache KV è a Q4 (modifiche con foto circa il 10% più veloci, stessa qualità a occhio).
- **Klein ora funziona**: cambi di persona, vestiti, più foto unite. Il problema era che l'LLM che riscrive la richiesta vedeva solo la prima foto; ora le vede tutte. Con Klein l'interfaccia è una pagina sola: scrivi, aggiungi foto se vuoi, CREA.
- **«L'LLM legge il prompt»**: un interruttore sotto il prompt, per Klein (acceso di serie) e per Qwen (spento di serie).

## Novità della 1.2.1

- **I modelli si scelgono dalla barra in alto** (sempre visibile, da qualsiasi pagina): **Qwen**, **Klein 3** e **Klein 3 Base**. **FLUX.2 Klein 4B** non c'è più.
Expand Down Expand Up @@ -119,8 +125,8 @@ Modifica → Estrai e nelle ricette. Diventa un manichino grigio che il modello

## Tre modelli: Qwen e FLUX 3 Klein

Nella barra in alto scegli **chi disegna**: **Qwen base** (Qwen-Image 2.1, 40 passi, con i LoRA), **Klein veloce** (16 passi) o **Klein Base** (la versione normale, 50 passi). I file di Klein si scaricano con un clic dal repository ufficiale di Black Forest Labs.
Il Turbo di Qwen non c'è più: Klein veloce è il modo rapido.
Nella barra in alto scegli **chi disegna**: **Qwen** (Qwen-Image 2.1, 25 passi, con i LoRA), **Qwen veloce** (lo stesso col LoRA Lightning, 4 passi: 5 volte più veloce), **Klein 3** (16 passi) o **Klein 3 Base** (la versione normale, 50 passi). I file di Klein e il LoRA Lightning si scaricano con un clic.
Con Qwen hai Genere, Stile, Modifica (anche solo una zona), Box e Ricette. Con Klein c'è una pagina sola: scrivi e aggiungi foto se vuoi cambiarle o unirle.

Anche la scrittura dei testi (Migliora prompt, Foto → prompt, Idee, Estrai, Unisci foto, Come l'esempio) usa il **Qwen3-VL 4B** di Klein, con Klein e con Qwen: scrive a 46 token al secondo sulla RTX 4060,
contro 3,3 dell'encoder 8B int8 e 0,55 dell'8B GGUF. «Migliora prompt + Crea» con Qwen passa da 186 a 134 secondi. In Opzioni puoi tornare all'encoder di Qwen. I LoRA hanno due scaffali, uno per Qwen e uno per Klein: ognuno si vede solo col suo modello.
Expand Down Expand Up @@ -165,15 +171,15 @@ se la scheda è da 6 GB, il profilo **6 GB** in Opzioni. L'app ti avvisa da sola

- Il motore è **ComfyUI 0.42.3**, a una versione fissata, senza la sua interfaccia, installato con **uv** in
`%LOCALAPPDATA%\DaProdImage`. Il modello è [Qwen-Image 2.1 Uncensored GGUF](https://huggingface.co/abenzerps/Qwen-Image-2.1-Uncensored-GGUF)
(Q4_K_M per 6-8 GB) con i passi della pipeline ufficiale (40, euler, CFG 1). In alternativa **FLUX 3 Klein** (`black-forest-labs/flux-3-image-klein-comfy`), con il suo
(Q4_K_M per 6-8 GB) con i passi della pipeline ufficiale (25, euler, CFG 1; 4 col LoRA Lightning). In alternativa **FLUX 3 Klein** (`black-forest-labs/flux-3-image-klein-comfy`), con il suo
encoder Qwen3-VL 4B e il VAE FLUX.2.
- **ComfyUI-GGUF** viaggia dentro l'app: il fork di leejet, l'unico che conosce `qwen_image21`, con una nostra
correzione per ComfyUI 0.39 e successive (`engine/custom_nodes/ComfyUI-GGUF/DAPROD.md`). I **DaProd-Nodi** riempiono la zona
prima di "rimuovi" e accordano i colori dopo il VAE, così l'incollaggio non si vede.
- Anteprime dal vivo con **TAEQI 2.1** di madebyollin; traduzione dei prompt con **Opus-MT** (un modello di sola
traduzione, sul processore, ~300 MB, scaricato da solo); foto convertite con WIC di Windows, come in [DaP Convertitore](https://github.com/cammo22/DaP-Convertitore).
- Su una RTX 4060 da 8 GB, a 1 MP: Qwen base circa 3 secondi per passo (40 passi in poco meno di 3 minuti a freddo), **Klein veloce in circa 10 secondi a 16 passi (6 a 8 passi)**,
Klein Base 50 passi in circa un minuto. Le misure complete sono in [docs/misure-1.1.0.md](docs/misure-1.1.0.md).
- Su una RTX 4060 da 8 GB, a 1 MP: **Qwen veloce 15 secondi** (4 passi), Qwen base 73 secondi (25 passi, 2,8 s a passo), **Klein 3 in circa 10 secondi** a 16 passi
(22 s per modificare una foto, 38 s con due foto). Le misure della 1.4 sono nel [CHANGELOG](CHANGELOG.md), quelle della 1.1 in [docs/misure-1.1.0.md](docs/misure-1.1.0.md).

## Sviluppare

Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading