mirror of
https://github.com/Comfy-Org/ComfyUI.git
synced 2026-08-24 18:10:27 +08:00
DynamicSlot: typed option dispatch driven by TypeResolver
Replaces the old connected/unconnected fixed-child DynamicSlot with a type-keyed option list. Each Option declares a 'when' condition (None, io.AnyType, a single ComfyType, a list, or a MultiType.Input) and the child inputs revealed when that condition matches the slot's resolved upstream type. Selection happens at schema-finalization time using live_input_types computed by TypeResolver, so API-only workflows (no frontend) get the same expansion the UI would. - _io.py: redesign DynamicSlot.Input / Option; auto-derive slotType as the union of all non-None when sets; expose it via as_dict so the frontend knows what types are accepted; the class io_type stays COMFY_DYNAMICSLOT_V3 as the parse-time dispatch tag. - type_resolver.py: return the auto-derived _slot_io_type for DynamicSlot.Input; document the AnyType (*) limitation. - execution.py: validate links into a DynamicSlot against slotType, not the dispatch tag COMFY_DYNAMICSLOT_V3. - tests: new test_dynamic_slot.py + regression coverage in test_type_resolver.py. Amp-Thread-ID: https://ampcode.com/threads/T-019e8568-f382-743d-a97f-0de3ff29d501 Co-authored-by: Amp <amp@ampcode.com>
This commit is contained in:
@@ -7,6 +7,13 @@ or unresolvable wildcards.
|
||||
|
||||
Works against either a raw prompt dict or a ``DynamicPrompt``. All resolved
|
||||
values are strings, so resolver state is cross-process serializable.
|
||||
|
||||
Known limitation: when an upstream node declares its output as ``AnyType``
|
||||
(``"*"``) — Reroute, generic If/Else, many V1 utility nodes — the resolver
|
||||
returns ``"*"``. It has no way to introspect the runtime value to recover a
|
||||
more specific type. Downstream consumers (e.g. :py:class:`DynamicSlot`) will
|
||||
treat such links as AnyType and select their ``AnyType`` branch (or none),
|
||||
not a concrete-type branch.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
@@ -328,10 +335,8 @@ class TypeResolver:
|
||||
except Exception:
|
||||
return ANY_TYPE
|
||||
if isinstance(inp, io.DynamicSlot.Input):
|
||||
try:
|
||||
return inp.slot.get_io_type()
|
||||
except Exception:
|
||||
return ANY_TYPE
|
||||
# Auto-derived slot type — comma-joined union of all option `when` types.
|
||||
return getattr(inp, "_slot_io_type", ANY_TYPE)
|
||||
# DynamicCombo's "type" is a key selector, not a connection type.
|
||||
if isinstance(inp, io.DynamicCombo.Input):
|
||||
return ANY_TYPE
|
||||
|
||||
Reference in New Issue
Block a user