File size: 3,317 Bytes
b7d4bc8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
def inject(assembler, chain_definition, chain_items):
    if not chain_items:
        return

    flux_guidance_name = chain_definition.get('flux_guidance_node')
    ksampler_name = chain_definition.get('ksampler_node', 'ksampler')

    target_node_id = None
    target_input_name = None
    
    if flux_guidance_name and flux_guidance_name in assembler.node_map:
        flux_guidance_id = assembler.node_map[flux_guidance_name]
        if 'conditioning' in assembler.workflow[flux_guidance_id]['inputs']:
            target_node_id = flux_guidance_id
            target_input_name = 'conditioning'

    if not target_node_id:
        if ksampler_name in assembler.node_map:
            ksampler_id = assembler.node_map[ksampler_name]
            if 'positive' in assembler.workflow[ksampler_id]['inputs']:
                target_node_id = ksampler_id
                target_input_name = 'positive'
        else:
            return
            
    if not target_node_id:
        return

    current_conditioning = assembler.workflow[target_node_id]['inputs'][target_input_name]

    style_model_loader_id = assembler._get_unique_id()
    style_model_loader_node = assembler._get_node_template("StyleModelLoader")
    style_model_loader_node['inputs']['style_model_name'] = "flux1-redux-dev.safetensors"
    assembler.workflow[style_model_loader_id] = style_model_loader_node

    clip_vision_loader_id = assembler._get_unique_id()
    clip_vision_loader_node = assembler._get_node_template("CLIPVisionLoader")
    clip_vision_loader_node['inputs']['clip_name'] = "sigclip_vision_patch14_384.safetensors"
    assembler.workflow[clip_vision_loader_id] = clip_vision_loader_node

    for item_data in chain_items:
        image = item_data.get('image')
        strength = item_data.get('strength', 1.0)
        if not image or strength is None:
            continue

        load_image_id = assembler._get_unique_id()
        clip_vision_encode_id = assembler._get_unique_id()
        style_apply_id = assembler._get_unique_id()

        load_image_node = assembler._get_node_template("LoadImage")
        clip_vision_encode_node = assembler._get_node_template("CLIPVisionEncode")
        style_apply_node = assembler._get_node_template("StyleModelApply")
        
        load_image_node['inputs']['image'] = image
        clip_vision_encode_node['inputs']['crop'] = "center"
        clip_vision_encode_node['inputs']['clip_vision'] = [clip_vision_loader_id, 0]
        clip_vision_encode_node['inputs']['image'] = [load_image_id, 0]

        style_apply_node['inputs']['strength'] = strength
        style_apply_node['inputs']['strength_type'] = "multiply"
        style_apply_node['inputs']['conditioning'] = current_conditioning
        style_apply_node['inputs']['style_model'] = [style_model_loader_id, 0]
        style_apply_node['inputs']['clip_vision_output'] = [clip_vision_encode_id, 0]
        
        assembler.workflow[load_image_id] = load_image_node
        assembler.workflow[clip_vision_encode_id] = clip_vision_encode_node
        assembler.workflow[style_apply_id] = style_apply_node
        current_conditioning = [style_apply_id, 0]

    assembler.workflow[target_node_id]['inputs'][target_input_name] = current_conditioning