Files
hermes-skills/comfyui/scripts/__pycache__/_common.cpython-313.pyc
T

183 lines
31 KiB
Plaintext
Raw Normal View History

ó
ó0aj΃ãó`%SrSSKJr SSKrSSKrSSKrSSKrSSKrSSKrSSK r SSK
J r SSK J
r
SSKJrJr SSKJr SSKrSrS
rS rS rS
rSrSrSr1Skr Sr!1Skr"1Skr#S\$S'SS/SS/SS/SS/SS/S.r%S\$S'SsS jr&0S!S"/_S#S"/_S$S"/_S%S"/_S&S"/_S'S(/_S)S(/_S*S(/_S+S,/_S-S./_S/S./_S0S./_S1S2/_S3S4S5/_S6/S7Q_S8S9/_S:S;/_S</S;/S=/S>/S?/S@/SA/SB/SC/SC/SC/SD//SE.
Er'SF\$SG'/SHQr(SI\$SJ'1SKkr)\RT"SL\RV5r,SMr-SN1r.StSOjr/SSP.SuSQjjr0SvSRjr1SSS.SwSTjjr2SxSUjr3\ "SVSW55r4\\4SySXjjr5SSSSS\S\S SSY.
SzSZjjr6S[r7\(a"S\S]\Rp5r9S{S^jr:S|S_jr;S|S`jr<S}Sajr=S~Sbjr>SScjr?S€Sdjr@SSejrASSfjrBSƒSgjrCS„ShjrDS…SijrESjrFSrGS†SkjrHS‡SljrISˆSmjrJS‰SnjrKSoSp.SŠSqjjrLSSrjrMg!\a S rSSKrSSKrGNåf=f)ŒuÛ
_common.py — Shared logic for ComfyUI skill scripts.
Single source of truth for:
- HTTP transport (with retry/backoff, streaming, timeout handling)
- Cloud detection and endpoint mapping (local ComfyUI vs Comfy Cloud)
- Workflow node-type catalogs (param patterns, model loaders, output nodes)
- API-format validation
- Path-traversal-safe file writes
- API-key loading from env / CLI
Stdlib-only by design (with optional `requests` upgrade if installed). Python 3.10+.
é)Ú annotationsN)Ú dataclass)ÚPath)ÚAnyÚIterator)ÚurlparseTFzhttp://127.0.0.1:8188zhttps://cloud.comfy.orgÚCOMFY_CLOUD_API_KEYé<égð?g>@>é
é é˜é­éôéöé÷éøi> Ú SaveAudioÚ SaveVideoÚCogVideoSamplerÚLTXVideoSamplerÚSaveAnimatedPNGÚWanVideoSamplerÚSaveAnimatedWEBPÚVHS_VideoCombineÚHunyuanVideoSamplerÚSaveAnimateDiffVideoÚSVD_img2vid_Conditioning>ÚSave3DÚSaveGLBÚ ImageSaverÚ SaveImagerÚ
SaveLatentÚ PreviewAudioÚ PreviewImageÚ PreviewVideorrrú
Image Saveúeasy imageSaveúShowText|pysssssúPreviewImage|pysssssúImage Save With Metadataúset[str]Ú OUTPUT_NODESÚunetÚdiffusion_modelsÚclipÚ
text_encodersÚ
controlnetÚ control_net)r.r/r0r1r2zdict[str, list[str]]ÚFOLDER_ALIASEScó.[RX/5$)z8Return the search order of folder names (primary first).)r4Úget)Úfolders ÚM/home/n8n/.hermes/profiles/general/skills/creative/comfyui/scripts/_common.pyÚfolder_aliases_forr9fsä × Ñ ˜f  ÚCheckpointLoaderSimple)Ú ckpt_nameÚ checkpointsÚCheckpointLoaderzCheckpointLoader (Simple)ÚImageOnlyCheckpointLoaderÚunCLIPCheckpointLoaderÚ
LoraLoader)Ú lora_nameÚlorasÚLoraLoaderModelOnlyÚLoraLoaderTagsQueryÚ VAELoader)Úvae_nameÚvaeÚControlNetLoader)Úcontrol_net_namer2ÚDiffControlNetLoaderÚControlNetLoaderAdvancedÚ
CLIPLoader)Ú clip_namer0ÚDualCLIPLoader©Ú
clip_name1r0©Ú
clip_name2r0ÚTripleCLIPLoader)rPrR)Ú
clip_name3r0ÚCLIPVisionLoader)rNÚ clip_visionÚ
UNETLoader)Ú unet_namer.)Ú
model_namer/)rZÚupscale_models)Ústyle_model_nameÚ style_models)Ú gligen_nameÚgligen)Úhypernetwork_nameÚ
hypernetworks)Úipadapter_fileÚ ipadapter)Úinstantid_fileÚ instantid)rZÚanimatediff_models)Úphotomaker_model_nameÚ
photomaker)
ÚDiffusionModelLoaderÚUNETLoaderGGUFÚUpscaleModelLoaderÚStyleModelLoaderÚ GLIGENLoaderÚHypernetworkLoaderÚIPAdapterModelLoaderÚInstantIDModelLoaderÚADE_LoadAnimateDiffModelÚ ADE_AnimateDiffLoaderWithContextÚADE_AnimateDiffLoaderGen1ÚPhotoMakerLoaderÚModelSamplingFluxz dict[str, list[tuple[str, str]]]Ú
MODEL_LOADERS)u)ÚCLIPTextEncodeÚtextÚprompt)ÚCLIPTextEncodeSDXLÚtext_gry)rzÚtext_lÚprompt_l)ÚCLIPTextEncodeSDXLRefinerrxÚrefiner_prompt)ÚCLIPTextEncodeFluxÚclip_lr})r€Út5xxlry)r€Úguidancerƒ)zsmZ CLIPTextEncoderxry)ÚBNK_CLIPTextEncodeAdvancedrxry)ÚKSamplerÚseedr†)r…Ústepsr‡)r…Úcfgrˆ)r…Ú sampler_namer‰)r…Ú schedulerrŠ)r…Údenoiser)ÚKSamplerAdvancedÚ
noise_seedr†)r‡r‡)rˆrˆ)r‰r‰))Ú
start_at_steprŽ)Ú end_at_stepr)Ú RandomNoiserr†)ÚBasicSchedulerr‡r‡)r)rrr)ÚKSamplerSelectr‰r‰)Ú CFGGuiderrˆrˆ)Ú
DualCFGGuiderÚ cfg_condsrˆ)r”Úcfg_cond2_negativeÚ cfg_negative)ruÚ max_shiftr˜)ruÚ
base_shiftr™)ruÚwidthÚ model_width)ruÚheightÚ model_height)ÚModelSamplingSD3ÚshiftrŸ)ÚModelSamplingDiscreteÚsamplingr¡)ÚSDTurboSchedulerr‡r‡)rr)Ú
SamplerCustomrr†)rˆrˆ)ÚEmptyLatentImagerš))Ú
batch_sizer¥)ÚEmptySD3LatentImagerš)))ÚEmptyHunyuanLatentVideorš))Úlengthr¨))ÚEmptyMochiLatentVideorš)))ÚEmptyLTXVLatentVideorš)))Ú
LatentUpscaleršÚ
upscale_width)Úupscale_height)ÚLatentUpscaleByÚscale_byr¯)Ú
ImageScalerš))Ú LoadImageÚimager²)Ú
LoadImageMaskr²Ú
mask_image)ÚLoadImageOutputr²)Ú
VHS_LoadVideoÚvideor·)Ú
VHS_LoadAudioÚaudior¹)r;r<r<)r>r<r<)r?r<r<)rFrGrG)rXrYrY)rirZÚdiffusion_model_name)rkrZÚupscale_model_name)rMrNrN)rOrQrQ)rOrSrS)rIrJÚcontrolnet_name)rArBrB)rAÚstrength_modelÚ
lora_strength)rAÚ
strength_clipÚlora_strength_clip)rDrBrB)rD)ÚControlNetApplyÚstrengthÚcontrolnet_strength)ÚControlNetApplyAdvancedrÂ)Ú
start_percentÚcontrolnet_start)Ú end_percentÚcontrolnet_end)ÚIPAdapterAdvancedÚweightÚipadapter_weight)Ústart_atÚipadapter_start)Úend_atÚ
ipadapter_end)Ú IPAdapterrÊ)ÚImageUpscaleWithModelÚupscale_methodrÒ)rrÚ motion_scalerÓ)rs)rÚ
frame_raterÔ)rÚformatÚ video_format)rÚfilename_prefixr×)r"r×r×)rr†r†)rr‡r‡)rrˆrˆ)rr†r†)rr‡r‡)rrˆrˆ)Ú
LTXVSchedulerr˜r˜)r™r™)zSeed (rgthree)r†r†)zImage Comparer (rgthree)Úimage_ar²)zPower Lora Loader (rgthree)ÚPowerLoraLoaderHeaderWidgetÚ _lora_header)Ú
PrimitiveNodeÚvalueÚprimitive_value)z easy seedr†r†)z
easy positiveÚpositivery)z
easy negativeÚnegativeÚnegative_prompt)úeasy fullLoaderr<r<)rGrG)rBrB)ry)zlist[tuple[str, str, str]]ÚPARAM_PATTERNS>rxrrr{r|zc(?:^|[\s,(\[])embedding\s*:\s*([A-Za-z0-9_\-\./\\]+?)(?:\.(?:pt|safetensors|bin))?(?=[\s:,)\(\]]|$))z
.comfy.orgzcloud.comfy.orgcó¾^[SU;aUOSU35nUR=(d SR5mT[;ag[ U4Sj[
55$)zFTrue if the host points at Comfy Cloud (or staging/preview subdomain).z://zhttp://ÚTc3óF># UHnTRU5v M g7f©N)Úendswith)Ú.0Úhostnames €r8Ú <genexpr>Ú is_cloud_host.<locals>.<genexpr>Us!øéÐCÒ-B¨ˆx× Ñ  ×#Ò-Bùsƒ!)rÚlowerÚCLOUD_DOMAIN_EXACTÚanyÚCLOUD_DOMAIN_SUFFIXES)ÚhostÚparsedrës @r8Ú
is_cloud_hostrôOsQø€ä
˜e tmd°7¸4¸&Ð1AÓ
B€FØ×% 2×.€HØÔÜ ÔCÕ-BÓ Cr:©Ú force_cloudcóÆURS5nUc [U5OUnURS5(dSU-nU(aURS5(dSU-nX-$)aBuild a URL that adds /api prefix when targeting Comfy Cloud.
Local ComfyUI accepts both `/foo` and `/api/foo` for many endpoints.
Cloud requires `/api/foo`.
`path` should be a path component (e.g. "/prompt") or full path with query
(e.g. "/view?filename=x").
Ú/z/api/z/api)ÚrstriprôÚ
startswith)ÚbaseÚpathröÚclouds r8Úbuild_cloud_aware_urlrþXs]ð ;‰; €DØ#.Ñ#6ŒM˜ ¸K€EØ ?‰?˜3× Ñ ØT‰zˆÞ T—_‘_ Wט‰}ˆØ ‰;Ðr:cóÜURS5(a'URS5(dSU[S5S-$URS5(aSU[S5S-$US:XagU$)zåMap a cloud endpoint path to its current canonical form.
Handles known renames documented in the Comfy Cloud API:
/history -> /history_v2
/models/<f> -> /experiment/models/<f>
/models -> /experiment/models
z/historyz /history_v2Nz/models/z/experiment/models/z/modelsz/experiment/models)Úlen)s r8Úcloud_endpointrjsnð z×"¨4¯?©?¸=×+IÑ+Iؘt¤C¨
£OÐ$4Ð z×$ t¬C°
«OÐ,<Ð'=Ñ ˆØ €Kr:)Úis_cloudcóZUc [U5OUnU(a [U5n[XUS9$)zETop-level URL resolver. Applies cloud rename + /api prefix as needed.rõ)r)rs r8Ú resolve_urlr{s-à#+Ñ#3ŒM˜$Ô ¸€EÞ Ü˜dÓÜ  ¸Ñ ?r:có¶U(aUO"[RR[5nUcgUR 5R S5nU=(d S$)uHLook up API key from CLI flag → env var. Strips whitespace and quotes.Nz'")ÚosÚenvironr6Ú ENV_API_KEYÚstrip)ÚexplicitÚvals r8Úresolve_api_keyr s@æ‰(¤B§J¡J§N¡N´;Ó$?€CØ
Ø
)‰)+×
Ñ
˜
"€CØ ;r:cóV\rSrSr%S\S'S\S'S\S'S\S 'SSS
jjrSS jrS rg
)Ú HTTPResponsei”ÚintÚstatusúdict[str, str]ÚheadersÚbytesÚbodyÚstrÚurlcó6URRUSS9$)replace©Úerrors)rÚdecode)ÚselfÚencodings r8rxÚHTTPResponse.textsØy‰y×Ñ °ÐÐ;r:có^[R"URRSSS95$)utf-8rr)ÚjsonÚloadsrr)rs r8r!ÚHTTPResponse.jsonžs%ÜzŠz˜$Ÿ)™)×*¨7¸Fr:©N)r )rrÚreturnr)r%r)Ú__name__Ú
__module__Ú __qualname__Ú__firstlineno__Ú__annotations__rxr!Ú__static_attributes__r$r:r8rrs"à ƒKØ
ÓØ
ƒKØ ƒHöGr:rcó€[X!SU--5n[R"SU5n[R"U5 g)z+Sleep with full-jitter exponential backoff.érN)ÚminÚrandomÚuniformÚtimeÚsleep)ÚattemptrûÚcapÚdelays r8Ú_sleep_backoffr6¢s1ä ˜Q '™\Ñ +€EÜ NŠN˜1˜eÓ $€E܇JJˆr:)
rÚ json_bodyÚdataÚfilesÚformÚtimeoutÚfollow_redirectsÚretriesÚstreamÚsinkc
óÀUc0n[U5nURSS5 U(dUb[(d [S5eSn [ U 5H>n
[ XUX4XVXxX«S9 nUR [;aU
S-U :a
[U
5 M<Us $ U (aU e[S5e![[[4a"nUn U
S-U :a[U
5 SnAM‡eSnAff=f)Single entry point for all HTTP traffic.
Behavior:
- Retries on connection errors and on HTTP statuses in RETRY_STATUS_CODES,
with exponential backoff + jitter.
- For cross-host redirects, drops Authorization-style headers (so signed
URLs don't leak the API key to S3/CloudFront).
- When `stream=True` and `sink` is a Path, streams the response body to
disk in 64 KiB chunks instead of buffering.
Either `json_body`, `data`, or `files`+`form` may be supplied (mutually exclusive).
Nz
User-Agentzhermes-comfyui-skill/5.0zTMultipart upload requires the `requests` package. Install with: pip install requests) Úmethodrrr7r8r9r:r;r<r>r?éz0http_request: retries exhausted with no response) ÚdictÚ
setdefaultÚ HAS_REQUESTSÚ RuntimeErrorÚrangeÚ
_http_oncerÚRETRY_STATUS_CODESr6Ú TimeoutErrorÚConnectionErrorÚOSError)rArrr7r8r9r:r;r<r=r>r?Úlast_excr3ÚrespÚes r8Ú http_requestrP©ð6؈Ü7‹m€GØ ×Ñ|Ð%?Ô Ñ ÷Š|Üðð
ð
"&€Hܘ>ˆð ÜØ°Ø#°eØØñ ˆDð {‰{Ô0°W¸q±[À7Ó5Jܘ؊Kñ"ö(؈Ü
Ð
Jøôœo¬wР؈Hؘ‰{˜WÓ˜wÔØ ûð  ús$Á6B& B&Â&CÂ;CÃCÃC©z x-api-keyÚ
authorizationÚcookiecó,^\rSrSrSrU4SjrSrU=r$)Ú _StripSensitiveOnRedirectSessioniðu†Session that drops sensitive headers on cross-host redirects.
`requests` already strips `Authorization` cross-host (rebuild_auth),
but it does NOT strip custom headers like `X-API-Key`. We override
`rebuild_auth` to additionally strip every header in
`_SENSITIVE_HEADERS` when the destination is a different host —
critical when ComfyUI Cloud's `/api/view` redirects to a signed S3 URL.
cóö>[T U]X5 URRnURn[ U5R
=(d SR
5n[ U5R
=(d SR
5nU(aWU(aOXV:waIURn[UR55HnUR
5[;dMXx M! gggg![a gf=f)Nrå) ÚsuperÚ rebuild_authÚrequestrrrÚlistÚkeysÚ_SENSITIVE_HEADERSÚ Exception)
rÚprepared_requestÚresponseÚold_urlÚnew_urlÚold_hostÚnew_hostrÚkeyÚ __class__s
€r8rXÚ-_StripSensitiveOnRedirectSession.rebuild_authúø€Ü ‰GÑ Ð!1Ô 
Ø"×*×.Ø*×.Ü$ -×6×<¸"×EÜ$ -×6×<¸"×EÞ¦¨XÓ-AØ.×6# G§L¡L£NÖ3˜ØŸ9™9;Ô*<Õ<Ø '¢ ò.B 8øô
ó
áð
úsC C+Ã!C+Ã+
C8Ã7C8r$)r&r'r(r)Ú__doc__rXr+Ú
__classcell__©res@r8rUrUðsø†ñ ÷ ó r:rUc ó8[(Ga)XUXxS.n UbX;S'OUbXKS'OUcUbX[S'XkS'U (aSU S'[5n U R"S0U D6n
U (apU
bmU
RR SSS9 U
R S 5nU
R
[5HnU(dM URU5 M SSS5 S
nO U
Rn[U
RU
RR5VVs0sH unnUU_M snnUU
RS 9sSSS5 $Ub8[.R0"U5R3S 5nUR5S
S5 OUn[6RR9UUX S9n"SS[6RR:5n[=U5R>=(d SRA5n[6RRCU"UU55nUR UUS9nURQ5nURRnUR5nU (atU
bqU
RR SSS9 U
R S 5nURM[5nU(dOURU5 M0SSS5 [UUS
US 9$[UUURM5US 9$!,(df  GN=fs snnf![R R"aXn[%U[R R&5(a[)[+U55Ue[-[+U55UeSnAff=f!,(df  GNH=f![6RDRFahn[URHUR(a[KUR5O0URM5=(d S
[OUSU5S 9sSnA$SnAff=f!,(df  GNa=f)zOne HTTP attempt. No retry.)rArrr;Úallow_redirectsNr!r8r9Tr>)ÚparentsÚexist_okÚwbr:)rrrrr z Content-Typezapplication/json)r8rrAcó2^\rSrSrSSjrU4SjrSrU=r$)Ú$_http_once.<locals>._RedirectHandleriFcóXlX lg)Ú
original_hostÚfollow)rrrrss r8Ú__init__Ú-_http_once.<locals>._RedirectHandler.__init__Gs
Ø!.Ô Ø Kr:có€>UR(dg[U5R=(d SR5nXpR:waZUR 5VV s0sHup‰UR5S;dMX‰_M n
nn [ RRXjSS9n U $[T U])XX4XV5$s sn nf)NrårQÚGET)rrA) rsrrrÚ header_itemsÚurllibrYÚRequestrWÚredirect_request)
rÚreq2ÚfpÚcodeÚmsgÚhdrsÚnewurlrcÚ
clean_headersÚnew_reqres
€r8r{Ú5_http_once.<locals>._RedirectHandler.redirect_requestKø€Ø—;—;ØÜ  Ó1×7°R×@ˆ×&*×%6Ñ%6Ô%8ô!Ú%8™T˜—ww“yÐ(PÑADÑ%8ðñ!ô!Ÿ.™.×ÐW\Ð]ØÜ‘7Ñ+¨D°dÀÓ Nùó
!s Á"B:ÂB:)rsrr)rrrrsÚbool)r&r'r(r)rtr{r+rhris@r8Ú_RedirectHandlerrpFsø†ô Oó Or:rˆ)r;rr$)*rErUrYÚparentÚmkdirÚopenÚ iter_contentÚDOWNLOAD_CHUNK_SIZEÚwriteÚcontentrÚ status_coderÚitemsrÚrequestsÚ
exceptionsÚRequestExceptionÚ
isinstanceÚTimeoutrJrrKr!ÚdumpsÚencoderDryrzÚHTTPRedirectHandlerrÚ build_openerÚerrorÚ HTTPErrorr~rCÚreadÚgetattrÚgeturlr)rArrr7r8r9r:r;r<r>r?ÚkwargsrêÚchunkrrrOÚ
body_bytesÚreqrˆrrÚopenerrNÚ final_urlÚ final_statusÚ
final_headerss r8rHrH sd÷ƒ|à°WØñ"
ˆð Ñ Ø&6ŠNØ
Ñ
Ø!6ŠNØ
Ñ
 $Ñ"2Ø#7‰OØ!6‰NÞ Ø#ˆF ô
/°1ð
—I' Ñ'Þ˜—K%¨d¸TП ¨AØ%&§^¡^Ô4GÖ%H˜$˜uØ !§¡¨¦ñ&I÷Ÿ9™9Ÿ=™=Ø./¯i©i¯o©oÔ.?Ô@Ò.?¡d ˜šTÑ.?ÒØŸñ ÷
/ð4ÑÜ—ZZ  Ó*×1°'Ó:ˆ
Ø×ј>Ð+=Õˆ
Ü
.‰.×
Ñ
 ¨:¸
Ð
V€Cô
Oœ6Ÿ>™>×Oô&˜c“]×+×1¨r×:€MÜ
^‰^×