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

88 lines
13 KiB
Plaintext
Raw Normal View History

ó
ó0aj,ãóxSrSSKJr SSKrSSKrSSKrSSKJr SSKJ r \RRS\ "\"\
5R5R55 SSKJrJrJrJrJrJrJrJr 1SkrSSjrS S
.SS jjrSS jrSS
jrSSjrSSSjjr\ S:Xa\RB"\"55 gg)
extract_schema.py — Analyze a ComfyUI API-format workflow and extract
controllable parameters.
Improvements over v1:
- Catalogs live in `_common.py`, shared with `check_deps.py`
- Coverage expanded for Flux / SD3 / Wan / Hunyuan / LTX / IPAdapter / rgthree
- Symmetric duplicate-name resolution: ALL duplicates get a node-id suffix
(instead of "first wins, second renamed"), so callers see consistent names
- Negative prompt detected by tracing `KSampler.negative` connections back to
the source CLIPTextEncode (more reliable than meta-title heuristic)
- Embedding references in prompt text are extracted as model dependencies
- Detects Primitive nodes that drive other nodes' inputs (and surfaces them
as the user-facing parameter)
- Reroutes are followed when tracing connections
Usage:
python3 extract_schema.py workflow_api.json
python3 extract_schema.py workflow_api.json --output schema.json
Stdlib-only. Python 3.10+.
é)Ú annotationsN)ÚPath)ÚAny)Ú OUTPUT_NODESÚPARAM_PATTERNSÚ
PROMPT_FIELDSÚis_linkÚiter_embedding_refsÚiter_model_depsÚ
iter_nodesÚunwrap_workflow>ÚKSamplerÚ CFGGuiderÚ BasicGuiderÚ
DualCFGGuiderÚ
SamplerCustomÚKSamplerAdvancedÚSamplerCustomAdvancedcó [U[5(ag[U[5(ag[U[5(ag[U[5(ag[U[
5(ag[U[ 5(agg)boolÚintÚfloatÚstringÚlinkÚobjectÚunknown)Ú
isinstancerrrÚstrÚlistÚdict)Úvalues ÚT/home/n8n/.hermes/profiles/general/skills/creative/comfyui/scripts/extract_schema.pyÚ
infer_typer#0seÜ×ÑØÜ×ÑØÜ×ÑØÜ×ÑØÜ×ÑØÜ×ÑØØ óé)Úmax_hopscó¼[U5(dgUSn[5n[U5nUbX4;aUs $URU5 UR U5n[ U[ 5(d gUR SS5nUS;aJUR S05=(d 0n[SUR55S5n U cUs $U SnUs $ U$)zöFollow a [node_id, slot] link, hopping through Reroute / Primitive nodes
if needed, to find the *upstream* node id that holds the actual value/input.
Bounded by both `max_hops` AND a visited-set to prevent infinite loops on
pathological graphs.
NrÚ
class_typeÚ)ÚRerouteÚ
PrimitiveNodeÚNotezeasy showAnythingÚinputsc3óJ# UHn[U5(dMUv M g7f©N)r )Ú.0Úvs r"Ú <genexpr>Ú trace_to_node.<locals>.<genexpr>WséРA¼GÀA¿JŸa™aªùs#š #) r ÚsetÚrangeÚaddÚgetrr ÚnextÚvalues)
Úworkflowrr&ÚnidÚvisitedÚnodeÚclsr-Ú next_links
r"Ú
trace_to_noderA@ô 4=‰=ØØ˜1‘g€CÜ€GÜ
8Ž_ˆØ ‰;˜#›.ØŠJØ Ø|‰|˜CÓ ˆÜ˜$¤×Øh‰h| RÓà Ð —X‘X˜h¨Ó1¨rˆFäѯ©¬ÓÓNˆIØÑ Ø
ؘA,ˆ ØŠ
ñ#ð$ €Jr$có¢[U5upUS[;aMURS05=(d 0nURS5n[U5(dMR[ X5nU(dMf[ URU5[ 5(dXRSS5nURS5(dUS;dUs $ g)zDTrace `negative` input of a sampler back to the source text encoder.r(r-Únegativer)ÚCLIPTextEncode©zsmZ CLIPTextEncodeÚBNK_CLIPTextEncodeAdvancedN©r ÚSAMPLER_NODE_FAMILYr7r rArr Ú
startswith)r:r;r>r-ÚnegÚsrcr?s r"Úfind_negative_prompt_noderL`s­ä Ö)‰ ˆØ  Ñ Ô%8Ó Ø˜( BÓ-¨2ˆØj‰j˜ÓÜs|‰|٠ܘHÓß ˆ3”:˜hŸl™l¨3Ó×-×# L°"Ó5ˆ~‰~Ð.×/°3Ð:nÕ3nØ
ñ r$có¢[U5upUS[;aMURS05=(d 0nURS5n[U5(dMR[ X5nU(dMf[ URU5[ 5(dXRSS5nURS5(dUS;dUs $ g)Nr(r-Úpositiver)rDrErG)r:r;r>r-ÚposrKr?s r"Úfind_positive_prompt_noderPqs­Ü Ö)‰ ˆØ  Ñ Ô%8Ó Ø˜( BÓ-¨2ˆØj‰j˜ÓÜs|‰|٠ܘHÓß ˆ3”:˜hŸl™l¨3Ó×-×# L°"Ó5ˆ~‰~Ð.×/°3Ð:nÕ3nØ
ñ r$c ód^^ •/n[T5n[T5n/n[T5HÿupVUSnURS05=(d 0nU[;aUR U5 [ H´upšn Xy:waM
X¨;aMn [U 5n
U
S:XaM+U nU S:XaiXS:XaX#:waSnO\XR:XaSnOTURS5=(d 0RSS5R5m [U 4S jS
55(aSnUR UUU
U
U US .5 GM 0nUH'nURUS /5R U5 M) 0nUR5Htunn[U5S
:Xa!USnUSUSUSUSUSS.UU'M6URSS9 UH(nUSUS3nUSUSUSUSUSUS.UU'M* Mv [[T55n/n[!5n[#T5unnUU4nUU;aMUR%U5 TRU05nURS05=(d 0nSnSnUR5H8unn['U[(5(dMU[*;dM)UU;dM1UnUSSn O UR UUUUSS.5 [U5[U5[U5[U5SU;SU;=(d [SU55[U4SjU55S.nUUUUUS .$)!avExtract controllable parameters from a workflow.
Returns:
{
"parameters": { friendly_name: {node_id, field, type, value, ...} },
"output_nodes": [node_id, ...],
"model_dependencies": [{node_id, class_type, field, value, folder}],
"embedding_dependencies": [{node_id, embedding_name, found_in_field, value_excerpt}],
"summary": {...}
}
r(r-rÚpromptÚnegative_promptÚ_metaÚtitler)c3ó,># UH oT;v M g7fr/©)r0Út_Ú
meta_titles €r"r2Ú!extract_schema.<locals>.<genexpr>µsøéÐ]Ò6\° Ö+Ò6\ùsƒ)rCrJz-promptÚanti)Ú name_hintÚnode_idÚfieldÚtyper!r(r\érr]r^r_r!)r]r^r_r!r(cóF[US5RS5US4$)Nr]r%r^)rÚzfill)Úxs r"Ú<lambda>Ú extract_schema.<locals>.<lambda>Ós!¬¨A¨i©LÓ(9×(?Ñ(?ÀÓ(BÀAÀgÁJÑ'Or$)Úkeyr=)r]r^r_r!r(Úalias_ofNéxÚ
embeddings)r]Úembedding_namer^Ú
value_excerptÚfolderÚseedc3óB# UHoRS5v M g7f)Úseed_N)rI)r0Úps r"r2rZséÐ/ZÊzÈ!· ± ¸W×0EÐ0EÊzùsc3ón># UH*nTRU05RSS5S;v M, g7f)r(r)>Ú SaveVideoÚSaveAnimatedPNGÚSaveAnimatedWEBPÚVHS_VideoCombineN)r7)r0Únr:s €r"r2rZs<øéð!
ò$
L‰L˜˜ × # L°"Ó :ö
â#ùsƒ25)Úparameter_countÚoutput_node_countÚmodel_dep_countÚembedding_dep_countÚhas_negative_promptÚhas_seedÚis_video_workflow)Ú
parametersÚ output_nodesÚmodel_dependenciesÚembedding_dependenciesÚsummary)rPrLr r7rÚappendrr#ÚlowerÚanyÚ
setdefaultÚitemsÚlenÚsortrr r4r
r6rrr)!r:rÚpos_nodeÚneg_nodeÚ
raw_paramsr]r>r?r-Úp_classÚp_fieldÚfriendlyr!Ú actual_nameÚby_nameÚrr~ÚnameÚentriesÚ full_nameÚ
model_depsÚembedding_depsÚseen_embr;Úemb_namerfÚ found_fieldÚexcerptÚfnameÚfvalrrYs!` @r"Úextract_schemarŸsˆù€ð!€LôÓ2€HÜÓ2€Hð
 €Jä# -‰
ˆØ ˆØ˜( -¨2ˆà ”,Ó Ø × Ñ  Ô +9Ñ &ˆG˜hØ‹~ÙØÓØ‘OˆEܘ5Ó!ˆAØF‹{Ùà"ˆ˜Ó&¨8Ó+?Ø"3Ó(Ø"*#'§(¡(¨7Ó"3×"9°r×!>Ñ!>¸Ó!K×!QÑ!QÓ!SÔ]Ñ6\Ó]×]Ø&7˜ à × Ñ Ø ØØØ
ö
ô1+9ñ.ðX&(€GÛ
ˆØ×ј1˜[™>¨2Ó5°aÖð#%€JØ Ÿž
ˆˆgÜ ˆw‹<˜1Ó Ø˜
ˆ˜Y™<°!°G±*ؘ&™ ¨A¨g©JØ  ™oñ ˆJ ð
L‰LÑOˆ Ø#˜f A a¨ ¡l 4 à  ™|°a¸±jؘf™I°°'±
Ø"# L¡/Ø $ñ )
˜9Óñ)ô*”o 0€Jð"$€NÜ%(£U€HÜ,¨XÖ6‰
ˆˆXØHˆoˆØ (‹?Ù Ø à|‰|˜C Ó$ˆØ˜( BÓ-¨2ˆØˆ ؈Ø!Ÿ<™<ž>‰KˆE˜×´-Õ)?ÀHÐPTÕDTØ# ؘt ˜*Ùñ