Skip to content

Commit 29011ba

Browse files
[API Nodes] add Magnific nodes (Comfy-Org#11986)
* feat(api-nodes): add Magnific nodes * aggressive downscaling should not be performed * disable upscaler nodes --------- Co-authored-by: Jedrzej Kosinski <kosinkadink1@gmail.com>
1 parent cd4985e commit 29011ba

4 files changed

Lines changed: 1021 additions & 10 deletions

File tree

comfy_api_nodes/apis/magnific.py

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
from typing import TypedDict
2+
3+
from pydantic import AliasChoices, BaseModel, Field, model_validator
4+
5+
6+
class InputPortraitMode(TypedDict):
7+
portrait_mode: str
8+
portrait_style: str
9+
portrait_beautifier: str
10+
11+
12+
class InputAdvancedSettings(TypedDict):
13+
advanced_settings: str
14+
whites: int
15+
blacks: int
16+
brightness: int
17+
contrast: int
18+
saturation: int
19+
engine: str
20+
transfer_light_a: str
21+
transfer_light_b: str
22+
fixed_generation: bool
23+
24+
25+
class InputSkinEnhancerMode(TypedDict):
26+
mode: str
27+
skin_detail: int
28+
optimized_for: str
29+
30+
31+
class ImageUpscalerCreativeRequest(BaseModel):
32+
image: str = Field(...)
33+
scale_factor: str = Field(...)
34+
optimized_for: str = Field(...)
35+
prompt: str | None = Field(None)
36+
creativity: int = Field(...)
37+
hdr: int = Field(...)
38+
resemblance: int = Field(...)
39+
fractality: int = Field(...)
40+
engine: str = Field(...)
41+
42+
43+
class ImageUpscalerPrecisionV2Request(BaseModel):
44+
image: str = Field(...)
45+
sharpen: int = Field(...)
46+
smart_grain: int = Field(...)
47+
ultra_detail: int = Field(...)
48+
flavor: str = Field(...)
49+
scale_factor: int = Field(...)
50+
51+
52+
class ImageRelightAdvancedSettingsRequest(BaseModel):
53+
whites: int = Field(...)
54+
blacks: int = Field(...)
55+
brightness: int = Field(...)
56+
contrast: int = Field(...)
57+
saturation: int = Field(...)
58+
engine: str = Field(...)
59+
transfer_light_a: str = Field(...)
60+
transfer_light_b: str = Field(...)
61+
fixed_generation: bool = Field(...)
62+
63+
64+
class ImageRelightRequest(BaseModel):
65+
image: str = Field(...)
66+
prompt: str | None = Field(None)
67+
transfer_light_from_reference_image: str | None = Field(None)
68+
light_transfer_strength: int = Field(...)
69+
interpolate_from_original: bool = Field(...)
70+
change_background: bool = Field(...)
71+
style: str = Field(...)
72+
preserve_details: bool = Field(...)
73+
advanced_settings: ImageRelightAdvancedSettingsRequest | None = Field(...)
74+
75+
76+
class ImageStyleTransferRequest(BaseModel):
77+
image: str = Field(...)
78+
reference_image: str = Field(...)
79+
prompt: str | None = Field(None)
80+
style_strength: int = Field(...)
81+
structure_strength: int = Field(...)
82+
is_portrait: bool = Field(...)
83+
portrait_style: str | None = Field(...)
84+
portrait_beautifier: str | None = Field(...)
85+
flavor: str = Field(...)
86+
engine: str = Field(...)
87+
fixed_generation: bool = Field(...)
88+
89+
90+
class ImageSkinEnhancerCreativeRequest(BaseModel):
91+
image: str = Field(...)
92+
sharpen: int = Field(...)
93+
smart_grain: int = Field(...)
94+
95+
96+
class ImageSkinEnhancerFaithfulRequest(BaseModel):
97+
image: str = Field(...)
98+
sharpen: int = Field(...)
99+
smart_grain: int = Field(...)
100+
skin_detail: int = Field(...)
101+
102+
103+
class ImageSkinEnhancerFlexibleRequest(BaseModel):
104+
image: str = Field(...)
105+
sharpen: int = Field(...)
106+
smart_grain: int = Field(...)
107+
optimized_for: str = Field(...)
108+
109+
110+
class TaskResponse(BaseModel):
111+
"""Unified response model that handles both wrapped and unwrapped API responses."""
112+
113+
task_id: str = Field(...)
114+
status: str = Field(validation_alias=AliasChoices("status", "task_status"))
115+
generated: list[str] | None = Field(None)
116+
117+
@model_validator(mode="before")
118+
@classmethod
119+
def unwrap_data(cls, values: dict) -> dict:
120+
if "data" in values and isinstance(values["data"], dict):
121+
return values["data"]
122+
return values

0 commit comments

Comments
 (0)