File size: 3,133 Bytes
5fbd25d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
"""
Image meta schema
"""
from typing import List

from fooocus_version import version
from pydantic import BaseModel


class ImageMeta(BaseModel):
    """
    Image meta data model
    """

    metadata_scheme: str = "fooocus"

    base_model: str
    base_model_hash: str

    prompt: str
    full_prompt: List[str]
    prompt_expansion: str

    negative_prompt: str
    full_negative_prompt: List[str]

    performance: str

    style: str

    refiner_model: str = "None"
    refiner_switch: float = 0.5

    loras: List[list]

    resolution: str

    sampler: str = "dpmpp_2m_sde_gpu"
    scheduler: str = "karras"
    seed: str
    adm_guidance: str
    guidance_scale: float
    sharpness: float
    steps: int
    vae_name: str

    version: str = version

    def __repr__(self):
        return ""


def loras_parser(loras: list) -> list:
    """
    Parse lora list
    """
    return [
        [
            lora[0].rsplit('.', maxsplit=1)[:1][0],
            lora[1],
            "hash_not_calculated",
        ] for lora in loras if lora[0] != 'None' and lora[0] is not None]


def image_parse(
        async_tak: object,
        task: dict
) -> dict | str:
    """
    Parse image meta data
    Generate meta data for image from task and async task object
    Args:
        async_tak: async task obj
        task: task obj

    Returns:
        dict: image meta data
    """
    req_param = async_tak.req_param
    meta = ImageMeta(
        metadata_scheme=req_param.meta_scheme,
        base_model=req_param.base_model_name.rsplit('.', maxsplit=1)[:1][0],
        base_model_hash='',
        prompt=req_param.prompt,
        full_prompt=task['positive'],
        prompt_expansion=task['expansion'],
        negative_prompt=req_param.negative_prompt,
        full_negative_prompt=task['negative'],
        performance=req_param.performance_selection,
        style=str(req_param.style_selections),
        refiner_model=req_param.refiner_model_name,
        refiner_switch=req_param.refiner_switch,
        loras=loras_parser(req_param.loras),
        resolution=str(tuple([int(n) for n in req_param.aspect_ratios_selection.split('*')])),
        sampler=req_param.advanced_params.sampler_name,
        scheduler=req_param.advanced_params.scheduler_name,
        seed=str(task['task_seed']),
        adm_guidance=str((
            req_param.advanced_params.adm_scaler_positive,
            req_param.advanced_params.adm_scaler_negative,
            req_param.advanced_params.adm_scaler_end)),
        guidance_scale=req_param.guidance_scale,
        sharpness=req_param.sharpness,
        steps=-1,
        vae_name=req_param.advanced_params.vae_name,
        version=version
    )
    if meta.metadata_scheme not in ["fooocus", "a111"]:
        meta.metadata_scheme = "fooocus"
    if meta.metadata_scheme == "fooocus":
        meta_dict = meta.model_dump()
        for i, lora in enumerate(meta.loras):
            attr_name = f"lora_combined_{i+1}"
            lr = [str(x) for x in lora]
            meta_dict[attr_name] = f"{lr[0]} : {lr[1]}"
    else:
        meta_dict = meta.model_dump()
    return meta_dict