@@ -15,7 +15,7 @@ import { refImageModelChanged, selectRefImagesSlice } from 'features/controlLaye
15
15
import { selectCanvasSlice } from 'features/controlLayers/store/selectors' ;
16
16
import { getEntityIdentifier , isFLUXReduxConfig , isIPAdapterConfig } from 'features/controlLayers/store/types' ;
17
17
import { modelSelected } from 'features/parameters/store/actions' ;
18
- import { postProcessingModelChanged , upscaleModelChanged } from 'features/parameters/store/upscaleSlice' ;
18
+ import { postProcessingModelChanged , tileControlnetModelChanged , upscaleModelChanged } from 'features/parameters/store/upscaleSlice' ;
19
19
import {
20
20
zParameterCLIPEmbedModel ,
21
21
zParameterSpandrelImageToImageModel ,
@@ -28,6 +28,7 @@ import type { AnyModelConfig } from 'services/api/types';
28
28
import {
29
29
isCLIPEmbedModelConfig ,
30
30
isControlLayerModelConfig ,
31
+ isControlNetModelConfig ,
31
32
isFluxReduxModelConfig ,
32
33
isFluxVAEModelConfig ,
33
34
isIPAdapterModelConfig ,
@@ -71,6 +72,7 @@ export const addModelsLoadedListener = (startAppListening: AppStartListening) =>
71
72
handleControlAdapterModels ( models , state , dispatch , log ) ;
72
73
handlePostProcessingModel ( models , state , dispatch , log ) ;
73
74
handleUpscaleModel ( models , state , dispatch , log ) ;
75
+ handleTileControlNetModel ( models , state , dispatch , log ) ;
74
76
handleIPAdapterModels ( models , state , dispatch , log ) ;
75
77
handleT5EncoderModels ( models , state , dispatch , log ) ;
76
78
handleCLIPEmbedModels ( models , state , dispatch , log ) ;
@@ -345,6 +347,46 @@ const handleUpscaleModel: ModelHandler = (models, state, dispatch, log) => {
345
347
}
346
348
} ;
347
349
350
+ const handleTileControlNetModel : ModelHandler = ( models , state , dispatch , log ) => {
351
+ const selectedTileControlNetModel = state . upscale . tileControlnetModel ;
352
+ const controlNetModels = models . filter ( isControlNetModelConfig ) ;
353
+
354
+ // If the currently selected model is available, we don't need to do anything
355
+ if ( selectedTileControlNetModel && controlNetModels . some ( ( m ) => m . key === selectedTileControlNetModel . key ) ) {
356
+ return ;
357
+ }
358
+
359
+ // Find a model with "Tile" in the name, case-insensitive
360
+ const tileModel = controlNetModels . find ( ( m ) => m . name . toLowerCase ( ) . includes ( 'tile' ) ) ;
361
+
362
+ // If we have a tile model, select it
363
+ if ( tileModel ) {
364
+ log . debug (
365
+ { selectedTileControlNetModel, tileModel } ,
366
+ 'No selected tile ControlNet model or selected model is not available, selecting tile model'
367
+ ) ;
368
+ dispatch ( tileControlnetModelChanged ( tileModel ) ) ;
369
+ return ;
370
+ }
371
+
372
+ // Otherwise, select the first available ControlNet model
373
+ const firstModel = controlNetModels [ 0 ] || null ;
374
+ if ( firstModel ) {
375
+ log . debug (
376
+ { selectedTileControlNetModel, firstModel } ,
377
+ 'No tile ControlNet model found, selecting first available ControlNet model'
378
+ ) ;
379
+ dispatch ( tileControlnetModelChanged ( firstModel ) ) ;
380
+ return ;
381
+ }
382
+
383
+ // No available models, we should clear the selected model - but only if we have one selected
384
+ if ( selectedTileControlNetModel ) {
385
+ log . debug ( { selectedTileControlNetModel } , 'Selected tile ControlNet model is not available, clearing' ) ;
386
+ dispatch ( tileControlnetModelChanged ( null ) ) ;
387
+ }
388
+ } ;
389
+
348
390
const handleT5EncoderModels : ModelHandler = ( models , state , dispatch , log ) => {
349
391
const selectedT5EncoderModel = state . params . t5EncoderModel ;
350
392
const t5EncoderModels = models . filter ( ( m ) => isT5EncoderModelConfig ( m ) ) ;
0 commit comments