ComfyUI execution model inversion guide: breaking changes to monkey patching and optional input validation, plus lazy evaluation and node expansion.
PR #2666 inverts the execution model from a back-to-front recursive model to a front-to-back topological sort. While most custom nodes should continue to “just work”, this page is intended to serve as a guide for custom node creators to the things that could break.
Any code that monkey patched the execution model is likely to stop working. Note that the performance of execution with this PR exceeds that with the most popular monkey patches, so many of them will be unnecessary.
Prior to this PR, only nodes that were connected to outputs exclusively through a string of "required" inputs were actually validated. If you had custom nodes that were only ever connected to "optional" inputs, you previously wouldn’t have been seeing that they failed validation.
If your nodes’ outputs could already be connected to "required" inputs, it is unlikely that anything in this section applies to you. It will primarily apply to custom node authors who use custom types and exclusively use "optional" inputs.
Here are some of the things that could cause you to fail validation along with recommended solutions:
Use of reserved Additional Parameters like min and max on types that aren’t comparable (e.g. dictionaries) in order to configure custom widgets.
Change the additional parameters used to non-reserved keys like uiMin and uiMax. (Recommended Solution)
The use of lists (e.g. [1, 2, 3]) as constants in the graph definition (e.g. to represent a const VEC3 input). This would have required a front-end extension before. Previously, lists of size exactly 2 would have failed anyway — they would have been treated as broken links.
Wrap the lists in a dictionary like { "value": [1, 2, 3] }
Execution order has always changed depending on which nodes happen to have which IDs, but it may now change depending on which values are cached as well. In general, the execution order should be considered non-deterministic and subject to change (beyond what is enforced by the graph’s structure).Don’t rely on the execution order.HIC SUNT DRACONES
A number of features were added to the VALIDATE_INPUTS function in order to lessen the impact of the Optional Input Validation mentioned above.
Default validation will now be skipped for inputs which are received by the VALIDATE_INPUTS function.
The VALIDATE_INPUTS function can now take **kwargs which causes all inputs to be treated as validated by the node creator.
The VALIDATE_INPUTS function can take an input named input_types. This input will be a dict mapping each input (connected via a link) to the type of the connected output. When this argument exists, type validation for the node’s inputs is skipped.
Inputs can be evaluated lazily (i.e. you can wait to see if they are needed before evaluating the attached node and all its ancestors). See Lazy Evaluation for more information.
At runtime, nodes can expand into a subgraph of nodes. This is what allows loops to be implemented (via tail-recursion). See Node Expansion for more information.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"ComfyUI","colors":{"primary":"#49378B","light":"#F2FF59","dark":"#F2FF59"},"logo":{"light":"https://mintcdn.com/dripart/WCFdTagRdhtvk9-o/logo/light.svg?fit=max\u0026auto=format\u0026n=WCFdTagRdhtvk9-o\u0026q=85\u0026s=ec112de87239058f5a931a7e4b594965","dark":"https://mintcdn.com/dripart/QzWbjSCBG7w61rR3/logo/dark.svg?fit=max\u0026auto=format\u0026n=QzWbjSCBG7w61rR3\u0026q=85\u0026s=62b4d879fb3aadbd7a468d1539032d6f","href":"/"},"favicon":"https://mintcdn.com/dripart/maKDA164-rrTfyxY/favicon.ico?fit=max\u0026auto=format\u0026n=maKDA164-rrTfyxY\u0026q=85\u0026s=94f3a697cf4c9a1ee3961b69219d0942","appearance":{"default":"dark"},"navbar":{"links":[{"href":"https://blog.comfy.org/?utm_source=docs","label":"Blog"},{"href":"/tutorials/partner-nodes/pricing","label":"Pricing"},{"href":"https://platform.comfy.org/?utm_source=docs","label":"Platform"},{"href":"https://comfy.org/download?utm_source=docs","label":"Download"}],"primary":{"type":"button","label":"Comfy Cloud","href":"https://comfy.org/cloud?utm_source=docs"}},"footer":{"socials":{"github":"https://github.com/Comfy-Org/ComfyUI","x":"https://x.com/ComfyUI","discord":"https://discord.com/invite/comfyorg","youtube":"https://www.youtube.com/@comfyorg"},"links":[{"header":"Resources","items":[{"label":"installation","href":"/installation/system_requirements"},{"label":"Tutorials","href":"/tutorials/basic/text-to-image"},{"label":"Development","href":"/development/overview"}]},{"header":"Products","items":[{"label":"Features","href":"https://www.comfy.org/?utm_source=docs"},{"label":"Gallery","href":"https://www.comfy.org/gallery?utm_source=docs"},{"label":"Download","href":"https://www.comfy.org/download?utm_source=docs"}]},{"header":"Company","items":[{"label":"About","href":"https://www.comfy.org/about?utm_source=docs"},{"label":"Careers","href":"https://www.comfy.org/careers?utm_source=docs"},{"label":"Terms of Service","href":"https://www.comfy.org/terms-of-service?utm_source=docs"},{"label":"Privacy Policy","href":"https://www.comfy.org/privacy-policy?utm_source=docs"}]}]},"search":{"prompt":"Search Comfy documentation..."},"seo":{"metatags":{"googlebot":"max-video-preview:0"}},"icons":{"library":"fontawesome"},"integrations":{"ga4":{"measurementId":"G-MXC01ZDDHQ"},"posthog":{"apiKey":"phc_iKfK86id4xVYws9LybMje0h44eGtfwFgRPIBehmy8rO"}},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"styling":{"latex":true},"navigation":{"languages":[{"language":"en","href":""},{"language":"zh","footer":{"socials":{"github":"https://github.com/Comfy-Org/ComfyUI","x":"https://x.com/ComfyUI","discord":"https://discord.com/invite/comfyorg","youtube":"https://www.youtube.com/@comfyorg"},"links":[{"header":"资源","items":[{"label":"安装","href":"/zh/installation/system_requirements"},{"label":"教程","href":"/zh/tutorials/basic/text-to-image"},{"label":"开发","href":"/zh/development/overview"}]},{"header":"产品","items":[{"label":"功能","href":"https://www.comfy.org/?utm_source=docs"},{"label":"画廊","href":"https://www.comfy.org/gallery?utm_source=docs"},{"label":"下载","href":"https://www.comfy.org/download?utm_source=docs"}]},{"header":"公司","items":[{"label":"关于","href":"https://www.comfy.org/about?utm_source=docs"},{"label":"招聘","href":"https://www.comfy.org/careers?utm_source=docs"},{"label":"服务条款","href":"https://www.comfy.org/terms-of-service?utm_source=docs"},{"label":"隐私政策","href":"https://www.comfy.org/privacy-policy?utm_source=docs"}]}]},"href":"zh"},{"language":"ja","footer":{"socials":{"github":"https://github.com/Comfy-Org/ComfyUI","x":"https://x.com/ComfyUI","discord":"https://discord.com/invite/comfyorg","youtube":"https://www.youtube.com/@comfyorg"},"links":[{"header":"リソース","items":[{"label":"インストール","href":"/ja/installation/system_requirements"},{"label":"チュートリアル","href":"/ja/tutorials/basic/text-to-image"},{"label":"開発","href":"/ja/development/overview"}]},{"header":"プロダクト","items":[{"label":"機能","href":"https://www.comfy.org/?utm_source=docs"},{"label":"ギャラリー","href":"https://www.comfy.org/gallery?utm_source=docs"},{"label":"ダウンロード","href":"https://www.comfy.org/download?utm_source=docs"}]},{"header":"会社情報","items":[{"label":"概要","href":"https://www.comfy.org/about?utm_source=docs"},{"label":"採用情報","href":"https://www.comfy.org/careers?utm_source=docs"},{"label":"利用規約","href":"https://www.comfy.org/terms-of-service?utm_source=docs"},{"label":"プライバシーポリシー","href":"https://www.comfy.org/privacy-policy?utm_source=docs"}]}]},"navbar":{"links":[{"href":"/ja/tutorials/partner-nodes/pricing","label":"料金"},{"href":"https://comfy.org/download?utm_source=docs","label":"ダウンロード"}],"primary":{"type":"button","label":"Comfy Cloud","href":"https://comfy.org/cloud?utm_source=docs"}},"href":"ja"},{"language":"ko","footer":{"socials":{"github":"https://github.com/Comfy-Org/ComfyUI","x":"https://x.com/ComfyUI","discord":"https://discord.com/invite/comfyorg","youtube":"https://www.youtube.com/@comfyorg"},"links":[{"header":"리소스","items":[{"label":"설치","href":"/ko/installation/system_requirements"},{"label":"튜토리얼","href":"/ko/tutorials/basic/text-to-image"},{"label":"개발","href":"/ko/development/overview"}]},{"header":"제품","items":[{"label":"기능","href":"https://www.comfy.org/?utm_source=docs"},{"label":"갤러리","href":"https://www.comfy.org/gallery?utm_source=docs"},{"label":"다운로드","href":"https://www.comfy.org/download?utm_source=docs"}]},{"header":"회사 정보","items":[{"label":"소개","href":"https://www.comfy.org/about?utm_source=docs"},{"label":"채용","href":"https://www.comfy.org/careers?utm_source=docs"},{"label":"이용약관","href":"https://www.comfy.org/terms-of-service?utm_source=docs"},{"label":"개인정보 처리방침","href":"https://www.comfy.org/privacy-policy?utm_source=docs"}]}]},"navbar":{"links":[{"href":"/ko/tutorials/partner-nodes/pricing","label":"가격 정책"},{"href":"https://comfy.org/download?utm_source=docs","label":"다운로드"}],"primary":{"type":"button","label":"Comfy Cloud","href":"https://comfy.org/cloud?utm_source=docs"}},"href":"ko"},{"language":"es","href":"es"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"dripart","hasAudioNarration":false,"actualSubdomain":"dripart","customDomains":["docs.comfy.org"],"gitSource":{"type":"github","owner":"comfy-org","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae4fdc8ed43b85c74928a61","collectionId":"acecfa24-3e15-4096-9659-896319cf461b","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae4fdc8ed43b85c74928a61"},"feedback":{"thumbs":true,"edits":true,"issues":true,"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"DISABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"DISABLED"}},"buildId":"6ae4fdc8ed43b85c74928a61","clientVersion":"0.0.4043","searchFilterCounts":[{"language":"en","tag":"Built-in Nodes","count":1133},{"language":"ja","tag":"組み込みノード","count":1133},{"language":"zh","tag":"内置节点","count":1133},{"language":"en","tag":"Nodes","count":1132},{"language":"ja","tag":"ノード","count":1132},{"language":"zh","tag":"节点","count":1132},{"language":"ko","tag":"내장 노드 (Built-in Nodes)","count":1091},{"language":"ko","tag":"노드","count":1090},{"language":"es","tag":"Nodos integrados","count":1025},{"language":"es","tag":"Nodos","count":1024},{"language":"en","tag":"Tutorials","count":406},{"language":"es","tag":"Tutoriales","count":401},{"language":"en","tag":"Model","count":377},{"language":"es","tag":"Modelo","count":377},{"language":"ja","tag":"Model","count":377},{"language":"ko","tag":"Model","count":377},{"language":"zh","tag":"Model","count":377},{"language":"en","tag":"Image","count":347},{"language":"en","tag":"Partner","count":322},{"language":"ja","tag":"Partner","count":322},{"language":"ko","tag":"Partner","count":322},{"language":"zh","tag":"Partner","count":322},{"language":"es","tag":"Partner","count":320},{"language":"es","tag":"Imagen","count":314},{"language":"ja","tag":"はじめに","count":301},{"language":"ko","tag":"시작하기","count":301},{"language":"zh","tag":"开始使用","count":301},{"language":"ja","tag":"API 開発","count":294},{"language":"ko","tag":"API 개발","count":294},{"language":"zh","tag":"API 开发","count":294},{"language":"en","tag":"Video","count":271},{"language":"es","tag":"Comfy Router","count":267},{"language":"ja","tag":"Comfy Router","count":257},{"language":"ko","tag":"Comfy Router","count":257},{"language":"zh","tag":"Comfy Router","count":257},{"language":"en","tag":"Comfy Router","count":252},{"language":"es","tag":"Video","count":246},{"language":"es","tag":"Models","count":230},{"language":"ja","tag":"Models","count":229},{"language":"ko","tag":"Models","count":229},{"language":"zh","tag":"Models","count":229},{"language":"es","tag":"All Models","count":227},{"language":"en","tag":"Models","count":223},{"language":"en","tag":"All Models","count":220},{"language":"ja","tag":"画像","count":202},{"language":"ko","tag":"이미지","count":202},{"language":"zh","tag":"图像","count":202},{"language":"ja","tag":"Video","count":177},{"language":"zh","tag":"Video","count":177},{"language":"ko","tag":"Video","count":160}],"searchSettings":{"maxResults":10}},"assistantConfig":{"enableStarterQuestions":false},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"custom.css","content":":root{--ink-900:#151417;--hub-shell-light:#f7f6f9;--accent-purple:#49378b;--accent-yellow:#f2ff59;--primary:73 55 139!important;--primary-light:242 255 89!important;--primary-dark:242 255 89!important}html.dark{--primary:242 255 89!important;--background-dark:14 14 13!important}html.dark body{background-color:#0e0e0d!important}html.dark #navbar,html.dark #navbar-transition{background-color:var(--ink-900)!important}html.dark #sidebar,html.dark #sidebar-content{background-color:rgb(var(--background-dark))!important}html.dark #navbar,html.dark #navbar-transition{box-shadow:none!important;filter:none!important;backdrop-filter:none!important;-webkit-backdrop-filter:none!important}html.dark #navbar-transition{border-bottom:1px solid rgba(255,255,255,.08)!important;opacity:1!important}html.dark img.nav-logo{filter:none}html.dark #sidebar-content a:not([aria-current=page]){color:rgba(255,255,255,.72)!important}html.dark #sidebar-content a:not([aria-current=page]) *{color:inherit!important}html.dark #sidebar-content a[aria-current=page]{color:var(--accent-yellow)!important;background-color:rgba(242,255,89,.1)!important}html.dark #sidebar-content a[aria-current=page] *{color:inherit!important}html.dark .nav-tabs-item[data-active],html.dark mobile-nav-tabs-item[data-active]{color:var(--accent-yellow)!important}html.dark #navbar a[href*=\"comfy.org/cloud\"] span.absolute{background-color:var(--accent-yellow)!important}html.dark #navbar a[href*=\"comfy.org/cloud\"] span.text-white{color:#151417!important}html:not(.dark) #background-color,html:not(.dark) #navbar,html:not(.dark) #navbar-transition,html:not(.dark) #sidebar,html:not(.dark) #sidebar-content{background-color:var(--hub-shell-light)!important}html:not(.dark) .nav-tabs-item[data-active],html:not(.dark) mobile-nav-tabs-item[data-active],html:not(.dark) nav-dropdown-item[data-active]{background-color:transparent!important;box-shadow:none!important;color:var(--accent-purple)!important;font-weight:600!important}html:not(.dark) #navbar a[href*=\"comfy.org/cloud\"] *,html:not(.dark) #sidebar-content a[aria-current=page] *,html:not(.dark) .nav-tabs-item[data-active] *,html:not(.dark) mobile-nav-tabs-item[data-active] *,html:not(.dark) nav-dropdown-item[data-active] *{color:inherit!important}html:not(.dark) #sidebar-content li:has(>a[aria-current=page]){background-color:transparent!important;box-shadow:none!important}html:not(.dark) #sidebar-content a[aria-current=page]{color:var(--accent-purple)!important;background-color:rgba(73,55,139,.1)!important;font-weight:600!important}html:not(.dark) toc-item[data-active-deepest],html:not(.dark) toc-item[data-active-deepest] a,html:not(.dark) toc-item[data-active],html:not(.dark) toc-item[data-active] a{background-color:transparent!important;color:var(--accent-purple)!important;font-weight:600!important}html:not(.dark) #content-area :where(h1, h2, h3, h4, h5, h6),html:not(.dark) #header :where(h1, h2, h3, h4, h5, h6){color:#151417!important}html:not(.dark) #navbar a[href*=\"comfy.org/cloud\"]{background-color:transparent!important;color:var(--accent-purple)!important;border-radius:.75rem;box-shadow:inset 0 0 0 1px var(--accent-purple)!important}html:not(.dark) #navbar a[href*=\"comfy.org/cloud\"] span.absolute{background-color:transparent!important}#sidebar .sticky.top-0.pointer-events-none.bg-linear-to-b{background-image:none!important}@media (min-width:1024px){#navbar.is-not-custom.is-not-center+div:has(>#sidebar),.max-w-8xl.mx-auto,.max-w-8xl.mx-auto.relative{max-width:none!important;width:100%!important;margin-left:0!important;margin-right:0!important;padding-left:0!important;padding-right:0!important}#navbar [class*=mx-4],#navbar [class*=px-12]{padding-left:0!important;padding-right:1.5rem!important;margin-left:0!important;margin-right:0!important}#navbar .nav-logo,#navbar a.select-none{margin-left:1rem!important}#navbar .nav-tabs{padding-left:2rem!important}#sidebar{left:0!important;margin-left:0!important;box-shadow:none!important}#sidebar-content{margin-left:0!important;padding-left:1rem!important;box-sizing:border-box!important}#navbar,#navbar-transition{left:0!important;right:0!important;width:100%!important;max-width:none!important}#content-area{margin-left:0!important;padding-left:18rem!important}#sidebar.sticky~#content-container #content-area{padding-left:2rem!important;padding-right:2rem!important}#body-content,#content-area,#content-container{max-width:none!important;width:100%!important}:root{--content-width:100%;--sidebar-width:18rem}#sidebar[style],nav#sidebar{left:0!important;right:auto!important;margin-left:0!important;transform:none!important}#navbar li.navbar-link:has(a[href*=\"comfy.org/download\"]){margin-right:0!important}#navbar a[href*=\"comfy.org/download\"]{box-sizing:border-box;border:1px solid rgb(255 255 255/.22);border-radius:.75rem;padding:7px .875rem!important;color:#fff!important;font-size:.875rem;line-height:1.25rem}html:not(.dark) #navbar a[href*=\"comfy.org/download\"]{border-color:rgb(0 0 0/.16);color:#151417!important}#navbar a[href*=\"comfy.org/download\"]:hover{background:rgb(255 255 255/.06)}html:not(.dark) #navbar a[href*=\"comfy.org/download\"]:hover{background:rgb(0 0 0/.04)}#navbar .flex.space-x-6>.whitespace-nowrap.hidden,#navbar li.navbar-link:has(a[href*=\"comfy.org/download\"])+.whitespace-nowrap{margin-left:.5rem!important}}body:has(.router-api-reference-marker) #content,body:has(.router-api-reference-marker) #header{max-width:48rem}body:has(.router-api-reference-marker) #content-area table,body:has(.router-provider-coverage-marker) #content-area table{width:100%;table-layout:auto}body:has(.router-api-reference-marker) #content-area td,body:has(.router-api-reference-marker) #content-area th{min-width:4rem!important;overflow-wrap:anywhere}body:has(.router-api-reference-marker) #content-area table:has(th:nth-child(6)) td:nth-child(3),body:has(.router-api-reference-marker) #content-area table:has(th:nth-child(6)) th:nth-child(3){min-width:5rem!important}@media (max-width:1535px){body:has(.router-api-reference-marker) #content-side-layout{display:none!important}}body:has(.router-provider-coverage-marker) #content,body:has(.router-provider-coverage-marker) #header{max-width:64rem}body:has(.router-provider-coverage-marker) #content-area td,body:has(.router-provider-coverage-marker) #content-area th{min-width:5rem!important;overflow-wrap:anywhere}body:has(.router-provider-coverage-marker) #content-area td:first-child,body:has(.router-provider-coverage-marker) #content-area th:first-child{min-width:12rem!important}body:has(.router-quickstart-marker) [data-component-part=card-content] [data-component-part=code-block-root][style*=\"height: 190px\"],body:has(.router-quickstart-marker) [data-component-part=card-content] [data-component-part=code-block-root][style*=\"height:190px\"]{height:86px!important}"},{"filePath":"samples-cards.css","content":".sample-card-grid{display:grid;gap:20px;grid-template-columns:repeat(2,minmax(0,1fr));margin-top:28px}.sample-card{min-width:0;perspective:1200px}.sample-card-inner{height:565px;position:relative;transform-style:preserve-3d;transition:transform 560ms cubic-bezier(.2,.75,.3,1)}.sample-card[data-flipped=true] .sample-card-inner{transform:rotateY(180deg)}.sample-card-face{backface-visibility:hidden;background:#fff;border:1px solid #e5e1eb;border-radius:12px;box-sizing:border-box;height:100%;inset:0;overflow:hidden;position:absolute;width:100%}.sample-card-front{display:flex;flex-direction:column}.sample-card-back{opacity:0;pointer-events:none;transform:rotateY(180deg);visibility:hidden}.sample-card[data-flipped=true] .sample-card-front{pointer-events:none;transition:visibility 0s linear 280ms;visibility:hidden}.sample-card[data-flipped=true][data-active-path=api] .sample-card-back[data-sample-path=api],.sample-card[data-flipped=true][data-active-path=endpoint] .sample-card-back[data-sample-path=endpoint]{opacity:1;pointer-events:auto;visibility:visible}.sample-card-preview{border-bottom:1px solid #e5e1eb;cursor:pointer;display:block;width:100%}.sample-card-body{display:flex;flex:1;flex-direction:column;padding:20px}.sample-card-body h2,.sample-path-body h2{color:#49378b;font-size:18px;font-weight:700;letter-spacing:-.02em;margin:0 0 8px}.sample-path-body h2{text-align:center}.sample-card-body>p{color:#5f5966;font-size:14px;line-height:1.55;margin:0;min-height:66px}.sample-card-actions,.sample-card-links{display:flex;gap:8px;margin-top:20px}.sample-card-actions button{background:#fff;border:1px solid #cfc8de;border-radius:6px;color:#49378b;cursor:pointer;flex:1;font-size:13px;font-weight:700;padding:10px 12px}.sample-card-links{border-top:1px solid #eeeaf1;margin-top:16px;padding-top:12px}.sample-card-links a{color:#625b6c;font-size:12px;font-weight:650;text-decoration:none}.sample-card-links span{color:#b3adba}.sample-path-body{padding:20px}.sample-path-body>button{background:0 0;border:0;color:#625b6c;cursor:pointer;font-size:12px;font-weight:700;padding:0}.sample-path-eyebrow{color:#857a9e;font-size:10px;font-weight:700;letter-spacing:.08em;margin:19px 0 5px;text-align:center;text-transform:uppercase}.sample-path-body>p:not(.sample-path-eyebrow){color:#5f5966;font-size:12px;line-height:1.5;margin:0 0 15px}.sample-path-steps{display:grid;gap:8px}.sample-path-step{align-items:center;background:#faf9fc;border:1px solid #e5e1ea;border-radius:8px;display:flex;gap:10px;padding:10px 11px}.sample-path-number{align-items:center;background:#49378b;border-radius:999px;color:#fff;display:inline-flex;flex:0 0 21px;font-size:11px;font-weight:700;height:21px;justify-content:center}.sample-path-copy{flex:1;min-width:0}.sample-path-copy strong{color:#312c36;display:block;font-size:12px}.sample-path-copy span{color:#706a75;display:block;font-size:11px;line-height:1.35;margin-top:2px}.sample-path-step a{color:#49378b;flex:0 0 auto;font-size:11px;font-weight:700;text-decoration:none}@media (max-width:768px){.sample-card-grid{grid-template-columns:1fr}.sample-card-inner{height:clamp(620px,180vw,760px)}}"}],"page":{"pagePath":"development/comfyui-server/execution_model_inversion_guide","slug":"/development/comfyui-server/execution_model_inversion_guide","pageMetadata":{"title":"Execution Model Inversion Guide","sidebarTitle":"Execution model inversion","icon":"code-branch","description":"ComfyUI execution model inversion guide: breaking changes to monkey patching and optional input validation, plus lazy evaluation and node expansion.","href":"/development/comfyui-server/execution_model_inversion_guide"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"ComfyUI execution model inversion guide: breaking changes to monkey patching and optional input validation, plus lazy evaluation and node expansion.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,li:`li`,p:`p`,pre:`pre`,span:`span`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Tip}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Tip)_missingMdxReference(`Tip`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[_jsx(_components.a,{href:`https://github.com/Comfy-Org/ComfyUI/pull/2666`,children:`PR #2666`}),` inverts the execution model from a back-to-front recursive model to a front-to-back topological sort. While most custom nodes should continue to “just work”, this page is intended to serve as a guide for custom node creators to the things that `,_jsx(_components.em,{children:`could`}),` break.`]}),`\n`,_jsx(Heading,{level:`2`,id:`breaking-changes`,children:`Breaking Changes`}),`\n`,_jsx(Heading,{level:`3`,id:`monkey-patching`,children:`Monkey Patching`}),`\n`,_jsx(_components.p,{children:`Any code that monkey patched the execution model is likely to stop working. Note that the performance of execution with this PR exceeds that with the most popular monkey patches, so many of them will be unnecessary.`}),`\n`,_jsx(Heading,{level:`3`,id:`optional-input-validation`,children:`Optional Input Validation`}),`\n`,_jsxs(_components.p,{children:[`Prior to this PR, only nodes that were connected to outputs exclusively through a string of `,_jsx(_components.code,{children:`\"required\"`}),` inputs were actually validated. If you had custom nodes that were only ever connected to `,_jsx(_components.code,{children:`\"optional\"`}),` inputs, you previously wouldn’t have been seeing that they failed validation.`]}),`\n`,_jsxs(Tip,{children:[`If your nodes’ outputs could already be connected to `,_jsx(_components.code,{children:`\"required\"`}),` inputs, it is unlikely that anything in this section applies to you. It will primarily apply to custom node authors who use custom types and exclusively use `,_jsx(_components.code,{children:`\"optional\"`}),` inputs.`]}),`\n`,_jsx(_components.p,{children:`Here are some of the things that could cause you to fail validation along with recommended solutions:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Use of reserved `,_jsx(_components.a,{href:`/custom-nodes/backend/datatypes#additional-parameters`,children:`Additional Parameters`}),` like `,_jsx(_components.code,{children:`min`}),` and `,_jsx(_components.code,{children:`max`}),` on types that aren’t comparable (e.g. dictionaries) in order to configure custom widgets.`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Change the additional parameters used to non-reserved keys like `,_jsx(_components.code,{children:`uiMin`}),` and `,_jsx(_components.code,{children:`uiMax`}),`. `,_jsx(_components.em,{children:`(Recommended Solution)`})]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`7`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`7`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`@`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`classmethod`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`def`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` INPUT_TYPES`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`cls`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`):`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"required\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"my_size\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: (`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"VEC2\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, {`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"uiMin\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`0.0`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"uiMax\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`1.0`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}),`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`]})})}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Define a custom `,_jsx(_components.a,{href:`/custom-nodes/backend/server_overview#validate_inputs`,children:`VALIDATE_INPUTS`}),` function with this input so validation of it is skipped. `,_jsx(_components.em,{children:`(Quick Solution)`})]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`@`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`classmethod`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`def`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` VALIDATE_INPUTS`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`cls`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`my_size`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`):`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` True`})]}),`\n`]})})}),`\n`]}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Use of composite types (e.g. `,_jsx(_components.code,{children:`CUSTOM_A,CUSTOM_B`}),`)`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`(When used as output) Define and use a wrapper like `,_jsx(_components.code,{children:`MakeSmartType`}),` `,_jsx(_components.a,{href:`https://github.com/Comfy-Org/ComfyUI/pull/2666/files#diff-714643f1fdb6f8798c45f77ab10d212ca7f41dd71bbe55069f1f9f146a8f0cb9R2`,children:`seen here in the PR’s unit tests`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`13`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`13`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`class`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` MyCustomNode`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` @`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`classmethod`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` def`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` INPUT_TYPES`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`cls`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`):`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"required\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"input\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: (MakeSmartType(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"FOO,BAR\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`), {}),`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` RETURN_TYPES`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (MakeSmartType(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"FOO,BAR\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`),)`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # ...`})}),`\n`]})})}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`(When used as input) Define a custom`,_jsx(_components.a,{href:`/custom-nodes/backend/server_overview#validate_inputs`,children:`VALIDATE_INPUTS`}),` function that takes a `,_jsx(_components.code,{children:`input_types`}),` argument so type validation is skipped.`,`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`@`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`classmethod`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`def`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` VALIDATE_INPUTS`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`cls`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`input_types`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`):`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` True`})]}),`\n`]})})}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`(Supports both, convenient) Define and use the `,_jsx(_components.code,{children:`@VariantSupport`}),` decorator `,_jsx(_components.a,{href:`https://github.com/Comfy-Org/ComfyUI/pull/2666/files#diff-714643f1fdb6f8798c45f77ab10d212ca7f41dd71bbe55069f1f9f146a8f0cb9R15`,children:`seen here in the PR’s unit tests`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`14`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`14`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`@VariantSupport`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`class`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` MyCustomNode`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` @`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`classmethod`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` def`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` INPUT_TYPES`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`cls`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`):`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"required\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"input\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: (`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"FOO,BAR\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, {}),`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` `})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` RETURN_TYPES`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (MakeSmartType(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"FOO,BAR\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`),)`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # ...`})}),`\n`]})})}),`\n`]}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`The use of lists (e.g. `,_jsx(_components.code,{children:`[1, 2, 3]`}),`) as constants in the graph definition (e.g. to represent a const `,_jsx(_components.code,{children:`VEC3`}),` input). This would have required a front-end extension before. Previously, lists of size exactly `,_jsx(_components.code,{children:`2`}),` would have failed anyway — they would have been treated as broken links.`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Wrap the lists in a dictionary like `,_jsx(_components.code,{children:`{ \"value\": [1, 2, 3] }`})]}),`\n`]}),`\n`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`execution-order`,children:`Execution Order`}),`\n`,_jsx(_components.p,{children:`Execution order has always changed depending on which nodes happen to have which IDs, but it may now change depending on which values are cached as well. In general, the execution order should be considered non-deterministic and subject to change (beyond what is enforced by the graph’s structure).`}),`\n`,_jsx(_components.p,{children:`Don’t rely on the execution order.`}),`\n`,_jsx(_components.p,{children:_jsx(_components.em,{children:`HIC SUNT DRACONES`})}),`\n`,_jsx(Heading,{level:`2`,id:`new-functionality`,children:`New Functionality`}),`\n`,_jsx(Heading,{level:`3`,id:`validation-changes`,children:`Validation Changes`}),`\n`,_jsxs(_components.p,{children:[`A number of features were added to the `,_jsx(_components.code,{children:`VALIDATE_INPUTS`}),` function in order to lessen the impact of the `,_jsx(_components.a,{href:`#optional-input-validation`,children:`Optional Input Validation`}),` mentioned above.`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Default validation will now be skipped for inputs which are received by the `,_jsx(_components.code,{children:`VALIDATE_INPUTS`}),` function.`]}),`\n`,_jsxs(_components.li,{children:[`The `,_jsx(_components.code,{children:`VALIDATE_INPUTS`}),` function can now take `,_jsx(_components.code,{children:`**kwargs`}),` which causes all inputs to be treated as validated by the node creator.`]}),`\n`,_jsxs(_components.li,{children:[`The `,_jsx(_components.code,{children:`VALIDATE_INPUTS`}),` function can take an input named `,_jsx(_components.code,{children:`input_types`}),`. This input will be a dict mapping each input (connected via a link) to the type of the connected output. When this argument exists, type validation for the node’s inputs is skipped.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`You can read more at `,_jsx(_components.a,{href:`/custom-nodes/backend/server_overview#validate_inputs`,children:`VALIDATE_INPUTS`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`lazy-evaluation`,children:`Lazy Evaluation`}),`\n`,_jsxs(_components.p,{children:[`Inputs can be evaluated lazily (i.e. you can wait to see if they are needed before evaluating the attached node and all its ancestors). See `,_jsx(_components.a,{href:`/custom-nodes/backend/lazy_evaluation`,children:`Lazy Evaluation`}),` for more information.`]}),`\n`,_jsx(Heading,{level:`3`,id:`node-expansion`,children:`Node Expansion`}),`\n`,_jsxs(_components.p,{children:[`At runtime, nodes can expand into a subgraph of nodes. This is what allows loops to be implemented (via tail-recursion). See `,_jsx(_components.a,{href:`/custom-nodes/backend/expansion`,children:`Node Expansion`}),` for more information.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Execution Model Inversion Guide","sidebarTitle":"Execution model inversion","icon":"code-branch","description":"ComfyUI execution model inversion guide: breaking changes to monkey patching and optional input validation, plus lazy evaluation and node expansion.","href":"/development/comfyui-server/execution_model_inversion_guide"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Breaking Changes","slug":"breaking-changes","depth":2,"children":[{"title":"Monkey Patching","slug":"monkey-patching","depth":3,"children":[]},{"title":"Optional Input Validation","slug":"optional-input-validation","depth":3,"children":[]},{"title":"Execution Order","slug":"execution-order","depth":3,"children":[]}]},{"title":"New Functionality","slug":"new-functionality","depth":2,"children":[{"title":"Validation Changes","slug":"validation-changes","depth":3,"children":[]},{"title":"Lazy Evaluation","slug":"lazy-evaluation","depth":3,"children":[]},{"title":"Node Expansion","slug":"node-expansion","depth":3,"children":[]}]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/dripart/9d6bf2b2531e904c/giscus-comments.js","/_mintlify/custom/dripart/bd0341946f3c75a6/syft.js","/_mintlify/custom/dripart/042392a43b5e681e/samples-cards.js"],"subdomain":"dripart","siteName":"ComfyUI","title":"Execution Model Inversion Guide - ComfyUI","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/development/comfyui-server/execution_model_inversion_guide","matchLevel":0},"zh":{"href":"/zh/development/comfyui-server/execution_model_inversion_guide","matchLevel":1},"ja":{"href":"/ja/development/comfyui-server/execution_model_inversion_guide","matchLevel":1},"ko":{"href":"/ko/development/comfyui-server/execution_model_inversion_guide","matchLevel":1},"es":{"href":"/es/development/comfyui-server/execution_model_inversion_guide","matchLevel":1}}},"lastModified":"2026-08-23T02:04:45.085Z","originalFileLocation":"development/comfyui-server/execution_model_inversion_guide.mdx","locale":"en"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"ComfyUI execution model inversion guide: breaking changes to monkey patching and optional input validation, plus lazy evaluation and node expansion.\">\u003cmeta data-mint-head name=\"application-name\" content=\"ComfyUI\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Execution Model Inversion Guide - ComfyUI\">\u003cmeta data-mint-head property=\"og:description\" content=\"ComfyUI execution model inversion guide: breaking changes to monkey patching and optional input validation, plus lazy evaluation and node expansion.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"ComfyUI\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.comfy.org/development/comfyui-server/execution_model_inversion_guide\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://dripart.mintlify.app/_mintlify/api/og/v2?division=Python+%28Backend%29\u0026amp;title=Execution+Model+Inversion+Guide\u0026amp;description=ComfyUI+execution+model+inversion+guide%3A+breaking+changes+to+monkey+patching+and+optional+input+validation%2C+plus+lazy+evaluation+and+node+expansion.\u0026amp;theme=a03fed56f9a178c9b893031e\u0026amp;signature=22006157a160b725c2268938dee973fa707c5e6d5ad708b34e92fc08bad558eb\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Execution Model Inversion Guide - ComfyUI\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"ComfyUI execution model inversion guide: breaking changes to monkey patching and optional input validation, plus lazy evaluation and node expansion.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://dripart.mintlify.app/_mintlify/api/og/v2?division=Python+%28Backend%29\u0026amp;title=Execution+Model+Inversion+Guide\u0026amp;description=ComfyUI+execution+model+inversion+guide%3A+breaking+changes+to+monkey+patching+and+optional+input+validation%2C+plus+lazy+evaluation+and+node+expansion.\u0026amp;theme=a03fed56f9a178c9b893031e\u0026amp;signature=22006157a160b725c2268938dee973fa707c5e6d5ad708b34e92fc08bad558eb\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"ComfyUI\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#49378B\">\u003cmeta data-mint-head name=\"googlebot\" content=\"max-video-preview:0\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.comfy.org/development/comfyui-server/execution_model_inversion_guide\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/development/comfyui-server/execution_model_inversion_guide.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://docs.comfy.org/development/comfyui-server/execution_model_inversion_guide\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"zh\" href=\"https://docs.comfy.org/zh/development/comfyui-server/execution_model_inversion_guide\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ja\" href=\"https://docs.comfy.org/ja/development/comfyui-server/execution_model_inversion_guide\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ko\" href=\"https://docs.comfy.org/ko/development/comfyui-server/execution_model_inversion_guide\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"es\" href=\"https://docs.comfy.org/es/development/comfyui-server/execution_model_inversion_guide\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://docs.comfy.org/development/comfyui-server/execution_model_inversion_guide\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.comfy.org/#organization\",\"name\":\"ComfyUI\",\"url\":\"https://docs.comfy.org\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/dripart/WCFdTagRdhtvk9-o/logo/light.svg?fit=max\u0026auto=format\u0026n=WCFdTagRdhtvk9-o\u0026q=85\u0026s=ec112de87239058f5a931a7e4b594965\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.comfy.org#website\",\"name\":\"ComfyUI\",\"url\":\"https://docs.comfy.org\",\"publisher\":{\"@id\":\"https://docs.comfy.org/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.comfy.org/development/comfyui-server/execution_model_inversion_guide#webpage\",\"url\":\"https://docs.comfy.org/development/comfyui-server/execution_model_inversion_guide\",\"name\":\"Execution Model Inversion Guide\",\"description\":\"ComfyUI execution model inversion guide: breaking changes to monkey patching and optional input validation, plus lazy evaluation and node expansion.\",\"dateModified\":\"2026-08-23T02:04:45.085Z\",\"isPartOf\":{\"@id\":\"https://docs.comfy.org#website\"},\"breadcrumb\":{\"@id\":\"https://docs.comfy.org/development/comfyui-server/execution_model_inversion_guide#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.comfy.org/development/comfyui-server/execution_model_inversion_guide#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Custom Nodes\",\"item\":\"https://docs.comfy.org/custom-nodes/intro\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Build Custom Nodes\",\"item\":\"https://docs.comfy.org/custom-nodes/overview\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Python (Backend)\",\"item\":\"https://docs.comfy.org/custom-nodes/backend/server_overview\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Execution Model Inversion Guide\",\"item\":\"https://docs.comfy.org/development/comfyui-server/execution_model_inversion_guide\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.comfy.org/development/comfyui-server/execution_model_inversion_guide#article\",\"headline\":\"Execution Model Inversion Guide\",\"name\":\"Execution Model Inversion Guide\",\"description\":\"ComfyUI execution model inversion guide: breaking changes to monkey patching and optional input validation, plus lazy evaluation and node expansion.\",\"url\":\"https://docs.comfy.org/development/comfyui-server/execution_model_inversion_guide\",\"mainEntityOfPage\":{\"@id\":\"https://docs.comfy.org/development/comfyui-server/execution_model_inversion_guide#webpage\"},\"dateModified\":\"2026-08-23T02:04:45.085Z\",\"publisher\":{\"@id\":\"https://docs.comfy.org/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.comfy.org#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"ComfyUI\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"ComfyUI","nav":{"global":null,"languages":[{"language":"en","tabs":[{"tab":"Getting started","pages":[{"title":"Getting started","href":""}]},{"tab":"Tutorials","pages":[{"title":"Tutorials","href":"/basic-concepts/workflow"}]},{"tab":"Comfy Router","pages":[{"title":"Comfy Router","href":"/development/comfy-router/quickstart"}]},{"tab":"Agent tools","pages":[{"title":"Agent tools","href":"/agent-tools"}]},{"tab":"Built-in Nodes","pages":[{"title":"Built-in Nodes","href":"/built-in-nodes/overview"}]},{"tab":"Developer","pages":[{"group":"Develop with Comfy","pages":[{"title":"ComfyUI for Developers: SDKs, Server API, and Cloud","sidebarTitle":"Developer overview","href":"/development/overview"},{"title":"Getting an API Key","sidebarTitle":"API keys","icon":"key","href":"/development/api-development/getting-an-api-key"},{"title":"Comfy API and Router examples","sidebarTitle":"Examples","icon":"code","mode":"wide","href":"/development/examples"}]},{"group":"Deploy ComfyUI","pages":[{"title":"Deploying ComfyUI","sidebarTitle":"Overview","icon":"map","href":"/development/deploy/overview"},{"group":"Comfy API","pages":[{"title":"Comfy API Quickstart","sidebarTitle":"Quickstart","icon":"cloud-arrow-up","href":"/development/serverless/quickstart"},{"title":"Other Ways to Create a Comfy API Build","sidebarTitle":"Build Sources","icon":"layer-group","href":"/development/serverless/build-sources"},{"title":"Comfy API Deployment Guide","sidebarTitle":"Deployment Guide","icon":"cloud-arrow-up","href":"/development/serverless/overview"}]},{"group":"Comfy Cloud","pages":[{"title":"Comfy Cloud Quickstart","sidebarTitle":"Quickstart","icon":"cloud","href":"/development/deploy/cloud"},{"title":"Usage and Limits","sidebarTitle":"Usage and Limits","icon":"gauge","href":"/development/deploy/cloud-usage"}]},{"group":"Self-Hosting Options","pages":[{"title":"Self-Hosting Options","sidebarTitle":"Hosting options","icon":"server","href":"/development/deploy/self-hosting"},{"group":"Self-Hosted Server API","pages":[{"title":"Server Overview","sidebarTitle":"Server overview","href":"/development/comfyui-server/comms_overview"},{"title":"API Examples","href":"/development/comfyui-server/api-examples"},{"title":"ComfyUI Server Routes (HTTP and WebSocket API)","sidebarTitle":"HTTP \u0026 WebSocket routes","icon":"route","href":"/development/comfyui-server/comms_routes"},{"title":"ComfyUI Server Messages (WebSocket API)","sidebarTitle":"WebSocket messages","icon":"comment","href":"/development/comfyui-server/comms_messages"},{"title":"Startup Flags","sidebarTitle":"Startup Flags","icon":"terminal","href":"/development/comfyui-server/startup-flags"},{"title":"ComfyUI Account API Key Integration","sidebarTitle":"API Key Integration","icon":"puzzle-piece","href":"/development/comfyui-server/api-key-integration"}]}]},{"group":"Run Workflows","pages":[{"title":"Running Workflows","sidebarTitle":"Overview","icon":"play","href":"/development/run-workflows/overview"},{"title":"Run your first workflow","sidebarTitle":"First workflow","href":"/development/api-development/quickstart"},{"title":"Comfy SDKs: Python and TypeScript Clients for ComfyUI","sidebarTitle":"SDKs","icon":"code","href":"/development/api-development/sdks"},{"title":"API Proxy for Self-Hosted ComfyUI","sidebarTitle":"API Proxy","icon":"plug","href":"/development/comfyui-server/api-proxy"},{"title":"Workflow API Format","icon":"file-code","href":"/development/api-development/workflow-api-format"},{"title":"Workflow Metadata","icon":"file-code","href":"/development/api-development/workflow-metadata"},{"group":"Comfy API Reference","boost":10,"pages":[{"title":"Comfy API Versions: v2 and the Deprecated v1 Cloud API","sidebarTitle":"Overview","href":"/development/comfy-api/overview"},{"group":"v2","pages":[{"title":"Comfy API v2 Overview","sidebarTitle":"Overview","href":"/api-reference/v2/overview"},{"title":"Design Notes","sidebarTitle":"Design Notes","icon":"compass","href":"/development/api-development/sdks-design"},{"group":"API Reference","pages":[{"group":"assets","pages":[{"title":"Upload an asset (single-call multipart)","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml post /api/v2/assets","href":"/api-reference/v2/assets/upload-an-asset-single-call-multipart"},{"title":"Mint an asset over existing bytes (dedup fast-path)","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml post /api/v2/assets/from-hash","href":"/api-reference/v2/assets/mint-an-asset-over-existing-bytes-dedup-fast-path"},{"title":"Existence check for a blob by blake3 hash","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml head /api/v2/assets/by-hash/{hash}","href":"/api-reference/v2/assets/existence-check-for-a-blob-by-blake3-hash"},{"title":"Asset metadata","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml get /api/v2/assets/{id}","href":"/api-reference/v2/assets/asset-metadata"},{"title":"Delete an asset record","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml delete /api/v2/assets/{id}","href":"/api-reference/v2/assets/delete-an-asset-record"},{"title":"Asset bytes","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml get /api/v2/assets/{id}/content","href":"/api-reference/v2/assets/asset-bytes"}]},{"group":"jobs","pages":[{"title":"List jobs, newest first","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml get /api/v2/jobs","href":"/api-reference/v2/jobs/list-jobs-newest-first"},{"title":"Submit a workflow for execution","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml post /api/v2/jobs","href":"/api-reference/v2/jobs/submit-a-workflow-for-execution"},{"title":"Job status (the polling workhorse)","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml get /api/v2/jobs/{id}","href":"/api-reference/v2/jobs/job-status-the-polling-workhorse"},{"title":"The workflow behind a job — authoring version if pinned, executed graph otherwise","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml get /api/v2/jobs/{id}/workflow","href":"/api-reference/v2/jobs/the-workflow-behind-a-job-—-authoring-version-if-pinned-executed-graph-otherwise"},{"title":"What the run printed","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml get /api/v2/jobs/{id}/logs","href":"/api-reference/v2/jobs/what-the-run-printed"},{"title":"Live event stream (SSE)","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml get /api/v2/jobs/{id}/events","href":"/api-reference/v2/jobs/live-event-stream-sse"},{"title":"Request cancellation","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml post /api/v2/jobs/{id}/cancel","href":"/api-reference/v2/jobs/request-cancellation"}]}]}]},{"group":"v1 Cloud API (deprecated)","pages":[{"title":"v1 Cloud API Overview","sidebarTitle":"Overview","href":"/development/cloud/overview"},{"title":"Cloud API Reference","sidebarTitle":"Code Examples","icon":"book-open","href":"/development/cloud/api-reference"},{"title":"OpenAPI Specification","icon":"file-lines","openapi":"/openapi-cloud.yaml","href":"/development/cloud/openapi"},{"group":"Cloud API Reference","pages":[{"group":"workflow","pages":[{"title":"Get information about current prompt executions","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/prompt","href":"/api-reference/cloud/workflow/get-information-about-current-prompt-executions"},{"title":"Submit a workflow for execution","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml post /api/prompt","href":"/api-reference/cloud/workflow/submit-a-workflow-for-execution"},{"title":"Get available workflow templates","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/workflow_templates","href":"/api-reference/cloud/workflow/get-available-workflow-templates"},{"title":"Get available subgraph blueprints","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/global_subgraphs","href":"/api-reference/cloud/workflow/get-available-subgraph-blueprints"},{"title":"Get a specific subgraph blueprint","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/global_subgraphs/{id}","href":"/api-reference/cloud/workflow/get-a-specific-subgraph-blueprint"}]},{"group":"node","pages":[{"title":"Get all node information","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/object_info","href":"/api-reference/cloud/node/get-all-node-information"},{"title":"Get server feature flags","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/features","href":"/api-reference/cloud/node/get-server-feature-flags"}]},{"group":"model","pages":[{"title":"Get available model folders","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/experiment/models","href":"/api-reference/cloud/model/get-available-model-folders"},{"title":"Get models in a specific folder","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/experiment/models/{folder}","href":"/api-reference/cloud/model/get-models-in-a-specific-folder"},{"title":"Get model preview image","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/experiment/models/preview/{folder}/{path_index}/{filename}","href":"/api-reference/cloud/model/get-model-preview-image"}]},{"group":"job","pages":[{"title":"Manage execution history","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml post /api/history","href":"/api-reference/cloud/job/manage-execution-history"},{"title":"Get execution history (v2)","deprecated":true,"version":null,"openapi":"/openapi-cloud.yaml get /api/history_v2","href":"/api-reference/cloud/job/get-execution-history-v2"},{"title":"Get history for specific prompt","deprecated":true,"version":null,"openapi":"/openapi-cloud.yaml get /api/history_v2/{prompt_id}","href":"/api-reference/cloud/job/get-history-for-specific-prompt"},{"title":"List jobs with pagination and filtering","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/jobs","href":"/api-reference/cloud/job/list-jobs-with-pagination-and-filtering"},{"title":"Get full job details","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/jobs/{job_id}","href":"/api-reference/cloud/job/get-full-job-details"},{"title":"Get queue information","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/queue","href":"/api-reference/cloud/job/get-queue-information"},{"title":"Manage queue operations","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml post /api/queue","href":"/api-reference/cloud/job/manage-queue-operations"},{"title":"Interrupt currently running jobs","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml post /api/interrupt","href":"/api-reference/cloud/job/interrupt-currently-running-jobs"},{"title":"Get job status","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/job/{job_id}/status","href":"/api-reference/cloud/job/get-job-status"}]},{"group":"file","pages":[{"title":"View a file","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/view","href":"/api-reference/cloud/file/view-a-file"},{"title":"Get related mask layer files","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/files/mask-layers","href":"/api-reference/cloud/file/get-related-mask-layer-files"},{"title":"Upload an image file","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml post /api/upload/image","href":"/api-reference/cloud/file/upload-an-image-file"},{"title":"Upload a mask image","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml post /api/upload/mask","href":"/api-reference/cloud/file/upload-a-mask-image"}]},{"group":"asset","pages":[{"title":"List user assets","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/assets","href":"/api-reference/cloud/asset/list-user-assets"},{"title":"Upload a new asset","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml post /api/assets","href":"/api-reference/cloud/asset/upload-a-new-asset"},{"title":"Create asset reference from existing hash","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml post /api/assets/from-hash","href":"/api-reference/cloud/asset/create-asset-reference-from-existing-hash"},{"title":"Get asset metadata from remote URL","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/assets/remote-metadata","href":"/api-reference/cloud/asset/get-asset-metadata-from-remote-url"},{"title":"Initiate background download for large files","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml post /api/assets/download","href":"/api-reference/cloud/asset/initiate-background-download-for-large-files"},{"title":"Get asset details","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/assets/{id}","href":"/api-reference/cloud/asset/get-asset-details"},{"title":"Update asset metadata","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml put /api/assets/{id}","href":"/api-reference/cloud/asset/update-asset-metadata"},{"title":"Delete asset","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml delete /api/assets/{id}","href":"/api-reference/cloud/asset/delete-asset"},{"title":"Add tags to asset","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml post /api/assets/{id}/tags","href":"/api-reference/cloud/asset/add-tags-to-asset"},{"title":"Remove tags from asset","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml delete /api/assets/{id}/tags","href":"/api-reference/cloud/asset/remove-tags-from-asset"},{"title":"List all tags","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/tags","href":"/api-reference/cloud/asset/list-all-tags"},{"title":"Get tag histogram for filtered assets","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/assets/tags/refine","href":"/api-reference/cloud/asset/get-tag-histogram-for-filtered-assets"},{"title":"Check if asset exists by hash","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml head /api/assets/hash/{hash}","href":"/api-reference/cloud/asset/check-if-asset-exists-by-hash"}]},{"group":"user","pages":[{"title":"List user data files","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/userdata","href":"/api-reference/cloud/user/list-user-data-files"},{"title":"Get user data file","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/userdata/{file}","href":"/api-reference/cloud/user/get-user-data-file"},{"title":"Upload or update a user data file","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml post /api/userdata/{file}","href":"/api-reference/cloud/user/upload-or-update-a-user-data-file"},{"title":"Delete a user data file","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml delete /api/userdata/{file}","href":"/api-reference/cloud/user/delete-a-user-data-file"},{"title":"Get current user information","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/user","href":"/api-reference/cloud/user/get-current-user-information"}]},{"group":"system","pages":[{"title":"Get system statistics","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/system_stats","href":"/api-reference/cloud/system/get-system-statistics"}]},{"group":"billing","pages":[{"title":"Get workspace usage over time","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/billing/usage/timeseries","href":"/api-reference/cloud/billing/get-workspace-usage-over-time"}]}]}]}]}]}]},{"group":"Comfy CLI","pages":[{"title":"Get Started with Comfy CLI","sidebarTitle":"Get started","href":"/comfy-cli/getting-started"},{"title":"Comfy CLI Command Reference","sidebarTitle":"Command reference","href":"/comfy-cli/reference"},{"title":"Comfy CLI Troubleshooting Guide","sidebarTitle":"Troubleshooting","href":"/comfy-cli/troubleshooting"}]},{"group":"Specifications","pages":[{"group":"Workflow JSON","pages":[{"title":"Workflow JSON","href":"/specs/workflow_json"},{"title":"Workflow JSON 0.4","href":"/specs/workflow_json_0.4"}]},{"group":"Node Definitions","pages":[{"title":"Node Definition JSON","href":"/specs/nodedef_json"},{"title":"Node Definition JSON 1.0","href":"/specs/nodedef_json_1_0"}]}]},{"group":"Custom Nodes","pages":[{"title":"Custom Nodes","sidebarTitle":"Overview","href":"/custom-nodes/intro"},{"group":"Build Custom Nodes","pages":[{"title":"ComfyUI Custom Node Types and Architecture","sidebarTitle":"Node types \u0026 architecture","href":"/custom-nodes/overview"},{"title":"Creating Custom Nodes in ComfyUI","sidebarTitle":"Create your first node","href":"/custom-nodes/walkthrough"},{"group":"Python (Backend)","pages":[{"title":"Custom Node Properties","sidebarTitle":"Node properties","href":"/custom-nodes/backend/server_overview"},{"title":"ComfyUI Custom Node Lifecycle","sidebarTitle":"Node lifecycle","href":"/custom-nodes/backend/lifecycle"},{"title":"ComfyUI Custom Node Datatypes","sidebarTitle":"Data types","href":"/custom-nodes/backend/datatypes"},{"title":"Images, Latents, and Masks","sidebarTitle":"Images, latents, masks","href":"/custom-nodes/backend/images_and_masks"},{"title":"Hidden and Flexible inputs","sidebarTitle":"Hidden \u0026 flexible inputs","href":"/custom-nodes/backend/more_on_inputs"},{"title":"Lazy Evaluation","href":"/custom-nodes/backend/lazy_evaluation"},{"title":"Node Expansion","href":"/custom-nodes/backend/expansion"},{"title":"ComfyUI Data Lists and List Processing","sidebarTitle":"Lists \u0026 list processing","href":"/custom-nodes/backend/lists"},{"title":"Working with torch.Tensor","sidebarTitle":"Tensors","href":"/custom-nodes/backend/tensors"},{"title":"Annotated Examples","description":"Annotated code examples for ComfyUI custom nodes: load and save images, invert masks, convert mask shapes, use masks as transparency layers, and create noise.","href":"/custom-nodes/backend/snippets"},{"title":"Execution Model Inversion Guide","sidebarTitle":"Execution model inversion","icon":"code-branch","href":"/development/comfyui-server/execution_model_inversion_guide"}]},{"group":"JavaScript (UI)","pages":[{"title":"Javascript Extensions","sidebarTitle":"JavaScript extensions","description":"Learn how to extend ComfyUI with JavaScript extensions by exporting WEB_DIRECTORY, adding .js files, and registering an extension with app.registerExtension.","href":"/custom-nodes/js/javascript_overview"},{"title":"ComfyUI JavaScript Hooks","sidebarTitle":"Hooks","href":"/custom-nodes/js/javascript_hooks"},{"title":"Comfy Objects","href":"/custom-nodes/js/javascript_objects_and_hijacking"},{"title":"Settings API","href":"/custom-nodes/js/javascript_settings"},{"title":"ComfyUI Dialog API","sidebarTitle":"Dialog API","href":"/custom-nodes/js/javascript_dialog"},{"title":"ComfyUI Toast API","sidebarTitle":"Toast API","href":"/custom-nodes/js/javascript_toast"},{"title":"About Panel Badges","href":"/custom-nodes/js/javascript_about_panel_badges"},{"title":"Bottom Panel Tabs","href":"/custom-nodes/js/javascript_bottom_panel_tabs"},{"title":"Sidebar Tabs","href":"/custom-nodes/js/javascript_sidebar_tabs"},{"title":"Selection Toolbox","href":"/custom-nodes/js/javascript_selection_toolbox"},{"title":"Commands and Keybindings","href":"/custom-nodes/js/javascript_commands_keybindings"},{"title":"ComfyUI Topbar Menu API","sidebarTitle":"Topbar menu API","href":"/custom-nodes/js/javascript_topbar_menu"},{"title":"ComfyUI Subgraphs","sidebarTitle":"Subgraphs","href":"/custom-nodes/js/subgraphs"},{"title":"Annotated Examples","href":"/custom-nodes/js/javascript_examples"}]},{"title":"ComfyUI Custom Nodes i18n Support","sidebarTitle":"i18n Support","href":"/custom-nodes/i18n"},{"group":"Migration Guides","pages":[{"title":"V3 Migration","href":"/custom-nodes/v3_migration"},{"title":"Context Menu Migration Guide","sidebarTitle":"Context menu migration","href":"/custom-nodes/js/context-menu-migration"},{"title":"Node replacement","href":"/custom-nodes/backend/node-replacement"}]}]},{"group":"Package \u0026 Publish","pages":[{"title":"Add node docs for your ComfyUI custom node","sidebarTitle":"Node docs","href":"/custom-nodes/help_page"},{"title":"Workflow templates","href":"/custom-nodes/workflow_templates"},{"title":"Subgraph blueprints","href":"/custom-nodes/subgraph_blueprints"},{"title":"Comfy Registry: publish and version custom nodes","sidebarTitle":"Registry Overview","href":"/registry/overview"},{"title":"Publishing Nodes","href":"/registry/publishing"},{"title":"Claim My Node","href":"/registry/claim-my-node"},{"title":"Comfy Registry Node Quality and Security Standards","sidebarTitle":"Quality \u0026 security standards","href":"/registry/standards"},{"title":"Custom Node CI/CD","sidebarTitle":"CI/CD","href":"/registry/cicd"},{"title":"pyproject.toml","href":"/registry/specifications"},{"title":"API Overview","href":"/registry/api-reference/overview"},{"group":"Registry API Reference","pages":[{"title":"Get information about the calling user.","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /users","href":"/registry/api-reference/registry/get-information-about-the-calling-user"},{"title":"Retrieve all publishers for a given user","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /users/publishers/","href":"/registry/api-reference/registry/retrieve-all-publishers-for-a-given-user"},{"title":"Validate if a publisher username is available","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /publishers/validate","href":"/registry/api-reference/registry/validate-if-a-publisher-username-is-available"},{"title":"Create a new publisher","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /publishers","href":"/registry/api-reference/registry/create-a-new-publisher"},{"title":"Retrieve all publishers","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /publishers","href":"/registry/api-reference/registry/retrieve-all-publishers"},{"title":"Retrieve a publisher by ID","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /publishers/{publisherId}","href":"/registry/api-reference/registry/retrieve-a-publisher-by-id"},{"title":"Update a publisher","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi put /publishers/{publisherId}","href":"/registry/api-reference/registry/update-a-publisher"},{"title":"Delete a publisher","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi delete /publishers/{publisherId}","href":"/registry/api-reference/registry/delete-a-publisher"},{"title":"Retrieve permissions the user has for a given publisher","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /publishers/{publisherId}/nodes/{nodeId}/permissions","href":"/registry/api-reference/registry/retrieve-permissions-the-user-has-for-a-given-publisher"},{"title":"Create a new personal access token","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /publishers/{publisherId}/tokens","href":"/registry/api-reference/registry/create-a-new-personal-access-token"},{"title":"Delete a specific personal access token","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi delete /publishers/{publisherId}/tokens/{tokenId}","href":"/registry/api-reference/registry/delete-a-specific-personal-access-token"},{"title":"Retrieve all nodes","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /publishers/{publisherId}/nodes/v2","href":"/registry/api-reference/registry/retrieve-all-nodes"},{"title":"Retrieve all nodes","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /publishers/{publisherId}/nodes/v2","href":"/registry/api-reference/registry/retrieve-all-nodes"},{"title":"Create a new custom node","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /publishers/{publisherId}/nodes","href":"/registry/api-reference/registry/create-a-new-custom-node"},{"title":"Update a specific node","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi put /publishers/{publisherId}/nodes/{nodeId}","href":"/registry/api-reference/registry/update-a-specific-node"},{"title":"Delete a specific node","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi delete /publishers/{publisherId}/nodes/{nodeId}","href":"/registry/api-reference/registry/delete-a-specific-node"},{"title":"Retrieve permissions the user has for a given publisher","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /publishers/{publisherId}/nodes/{nodeId}/permissions","href":"/registry/api-reference/registry/retrieve-permissions-the-user-has-for-a-given-publisher"},{"title":"Claim nodeId into publisherId for the authenticated publisher","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /publishers/{publisherId}/nodes/{nodeId}/claim-my-node","href":"/registry/api-reference/registry/claim-nodeid-into-publisherid-for-the-authenticated-publisher"},{"title":"Publish a new version of a node","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /publishers/{publisherId}/nodes/{nodeId}/versions","href":"/registry/api-reference/registry/publish-a-new-version-of-a-node"},{"title":"Update changelog and deprecation status of a node version","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi put /publishers/{publisherId}/nodes/{nodeId}/versions/{versionId}","href":"/registry/api-reference/registry/update-changelog-and-deprecation-status-of-a-node-version"},{"title":"Unpublish (delete) a specific version of a node","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi delete /publishers/{publisherId}/nodes/{nodeId}/versions/{versionId}","href":"/registry/api-reference/registry/unpublish-delete-a-specific-version-of-a-node"},{"title":"Retrieves a list of nodes","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /nodes/search","href":"/registry/api-reference/registry/retrieves-a-list-of-nodes"},{"title":"Retrieves a list of nodes","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /nodes/search","href":"/registry/api-reference/registry/retrieves-a-list-of-nodes"},{"title":"Retrieve a specific node by ID","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /nodes/{nodeId}","href":"/registry/api-reference/registry/retrieve-a-specific-node-by-id"},{"title":"Returns a node version to be installed.","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /nodes/{nodeId}/install","href":"/registry/api-reference/registry/returns-a-node-version-to-be-installed"},{"title":"Add review to a specific version of a node","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /nodes/{nodeId}/reviews","href":"/registry/api-reference/registry/add-review-to-a-specific-version-of-a-node"},{"title":"Create Node Translations","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /nodes/{nodeId}/translations","href":"/registry/api-reference/registry/create-node-translations"},{"title":"List all versions of a node","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /nodes/{nodeId}/versions","href":"/registry/api-reference/registry/list-all-versions-of-a-node"},{"title":"Retrieve a specific version of a node","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /nodes/{nodeId}/versions/{versionId}","href":"/registry/api-reference/registry/retrieve-a-specific-version-of-a-node"},{"title":"Retrieve multiple node versions in a single request","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /bulk/nodes/versions","href":"/registry/api-reference/registry/retrieve-multiple-node-versions-in-a-single-request"},{"title":"List all node versions given some filters.","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /versions","href":"/registry/api-reference/registry/list-all-node-versions-given-some-filters"},{"title":"list all comfy-nodes","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /comfy-nodes","href":"/registry/api-reference/registry/list-all-comfy-nodes"},{"title":"Retrieve a node by ComfyUI node name","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /comfy-nodes/{comfyNodeName}/node","href":"/registry/api-reference/registry/retrieve-a-node-by-comfyui-node-name"},{"title":"create comfy-nodes for certain node","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /nodes/{nodeId}/versions/{version}/comfy-nodes","href":"/registry/api-reference/registry/create-comfy-nodes-for-certain-node"},{"title":"list comfy-nodes for node version","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /nodes/{nodeId}/versions/{version}/comfy-nodes","href":"/registry/api-reference/registry/list-comfy-nodes-for-node-version"},{"title":"get specify comfy-node based on its id","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /nodes/{nodeId}/versions/{version}/comfy-nodes/{comfyNodeName}","href":"/registry/api-reference/registry/get-specify-comfy-node-based-on-its-id"},{"title":"Update a specific comfy-node","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi put /nodes/{nodeId}/versions/{version}/comfy-nodes/{comfyNodeName}","href":"/registry/api-reference/registry/update-a-specific-comfy-node"},{"title":"Get server feature flags","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /features","href":"/registry/api-reference/registry/get-server-feature-flags"},{"title":"Get release notes","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /releases","href":"/registry/api-reference/releases/get-release-notes"}]}]}]}]},{"tab":"Support","pages":[{"title":"Support","href":"/support/contact-support"}]}]},{"language":"zh","footer":{"socials":{"github":"https://github.com/Comfy-Org/ComfyUI","x":"https://x.com/ComfyUI","discord":"https://discord.com/invite/comfyorg","youtube":"https://www.youtube.com/@comfyorg"},"links":[{"header":"资源","items":[{"label":"安装","href":"/zh/installation/system_requirements"},{"label":"教程","href":"/zh/tutorials/basic/text-to-image"},{"label":"开发","href":"/zh/development/overview"}]},{"header":"产品","items":[{"label":"功能","href":"https://www.comfy.org/?utm_source=docs"},{"label":"画廊","href":"https://www.comfy.org/gallery?utm_source=docs"},{"label":"下载","href":"https://www.comfy.org/download?utm_source=docs"}]},{"header":"公司","items":[{"label":"关于","href":"https://www.comfy.org/about?utm_source=docs"},{"label":"招聘","href":"https://www.comfy.org/careers?utm_source=docs"},{"label":"服务条款","href":"https://www.comfy.org/terms-of-service?utm_source=docs"},{"label":"隐私政策","href":"https://www.comfy.org/privacy-policy?utm_source=docs"}]}]},"pages":[{"title":"zh","href":"/zh/development/comfyui-server/execution_model_inversion_guide"}]},{"language":"ja","footer":{"socials":{"github":"https://github.com/Comfy-Org/ComfyUI","x":"https://x.com/ComfyUI","discord":"https://discord.com/invite/comfyorg","youtube":"https://www.youtube.com/@comfyorg"},"links":[{"header":"リソース","items":[{"label":"インストール","href":"/ja/installation/system_requirements"},{"label":"チュートリアル","href":"/ja/tutorials/basic/text-to-image"},{"label":"開発","href":"/ja/development/overview"}]},{"header":"プロダクト","items":[{"label":"機能","href":"https://www.comfy.org/?utm_source=docs"},{"label":"ギャラリー","href":"https://www.comfy.org/gallery?utm_source=docs"},{"label":"ダウンロード","href":"https://www.comfy.org/download?utm_source=docs"}]},{"header":"会社情報","items":[{"label":"概要","href":"https://www.comfy.org/about?utm_source=docs"},{"label":"採用情報","href":"https://www.comfy.org/careers?utm_source=docs"},{"label":"利用規約","href":"https://www.comfy.org/terms-of-service?utm_source=docs"},{"label":"プライバシーポリシー","href":"https://www.comfy.org/privacy-policy?utm_source=docs"}]}]},"navbar":{"links":[{"href":"/ja/tutorials/partner-nodes/pricing","label":"料金"},{"href":"https://comfy.org/download?utm_source=docs","label":"ダウンロード"}],"primary":{"type":"button","label":"Comfy Cloud","href":"https://comfy.org/cloud?utm_source=docs"}},"pages":[{"title":"ja","href":"/ja/development/comfyui-server/execution_model_inversion_guide"}]},{"language":"ko","footer":{"socials":{"github":"https://github.com/Comfy-Org/ComfyUI","x":"https://x.com/ComfyUI","discord":"https://discord.com/invite/comfyorg","youtube":"https://www.youtube.com/@comfyorg"},"links":[{"header":"리소스","items":[{"label":"설치","href":"/ko/installation/system_requirements"},{"label":"튜토리얼","href":"/ko/tutorials/basic/text-to-image"},{"label":"개발","href":"/ko/development/overview"}]},{"header":"제품","items":[{"label":"기능","href":"https://www.comfy.org/?utm_source=docs"},{"label":"갤러리","href":"https://www.comfy.org/gallery?utm_source=docs"},{"label":"다운로드","href":"https://www.comfy.org/download?utm_source=docs"}]},{"header":"회사 정보","items":[{"label":"소개","href":"https://www.comfy.org/about?utm_source=docs"},{"label":"채용","href":"https://www.comfy.org/careers?utm_source=docs"},{"label":"이용약관","href":"https://www.comfy.org/terms-of-service?utm_source=docs"},{"label":"개인정보 처리방침","href":"https://www.comfy.org/privacy-policy?utm_source=docs"}]}]},"navbar":{"links":[{"href":"/ko/tutorials/partner-nodes/pricing","label":"가격 정책"},{"href":"https://comfy.org/download?utm_source=docs","label":"다운로드"}],"primary":{"type":"button","label":"Comfy Cloud","href":"https://comfy.org/cloud?utm_source=docs"}},"pages":[{"title":"ko","href":"/ko/development/comfyui-server/execution_model_inversion_guide"}]},{"language":"es","pages":[{"title":"es","href":"/es/development/comfyui-server/execution_model_inversion_guide"}]}]},"basePath":"","title":"Execution Model Inversion Guide - ComfyUI","buildId":"dpl_G9nrg4qeJSZtah1Ziwbc2n6WkLch","deploymentId":"dpl_G9nrg4qeJSZtah1Ziwbc2n6WkLch","dynamics":[],"chunks":[]}