mirror of
https://github.com/comfyanonymous/ComfyUI.git
synced 2026-01-03 02:30:52 +08:00
* Support Combo outputs in a more sane way * Remove test validate_inputs function on test node * Make curr_prefix be a list of strings instead of string for easier parsing as keys get added to dynamic types * Start to account for id prefixes from frontend, need to fix bug with nested dynamics * Ensure inputs/outputs/hidden are lists in schema finalize function, remove no longer needed 'is not None' checks * Add raw_link and extra_dict to all relevant Inputs * Make nested DynamicCombos work properly with prefixed keys on latest frontend; breaks old Autogrow, but is pretty much ready for upcoming Autogrow keys * Replace ... usage with a MISSING sentinel for clarity in nodes_logic.py * Added CustomCombo node in backend to reflect frontend node * Prepare Autogrow's expand_schema_for_dynamic to work with upcoming frontend changes * Prepare for look up table for dynamic input stuff * More progress towards dynamic input lookup function stuff * Finished converting _expand_schema_for_dynamic to be done via lookup instead of OOP to guarantee working with process isolation, did refactoring to remove old implementation + cleaning INPUT_TYPES definition including v3 hidden definition * Change order of functions * Removed some unneeded functions after dynamic refactor * Make MatchType's output default displayname "MATCHTYPE" * Fix DynamicSlot get_all * Removed redundant code - dynamic stuff no longer happens in OOP way * Natively support AnyType (*) without __ne__ hacks * Remove stray code that made it in * Remove expand_schema_for_dynamic left over on DynamicInput class * get_dynamic() on DynamicInput/Output was not doing anything anymore, so removed it * Make validate_inputs validate combo input correctly * Temporarily comment out conversion to 'new' (9 month old) COMBO format in get_input_info * Remove refrences to resources feature scrapped from V3 * Expose DynamicCombo in public API * satisfy ruff after some code got commented out * Make missing input error prettier for dynamic types * Created a Switch2 node as a side-by-side test, will likely go with Switch2 as the initial switch node * Figured out Switch situation * Pass in v3_data in IsChangedCache.get function's fingerprint_inputs, add a from_v3_data helper method to HiddenHolder * Switch order of Switch and Soft Switch nodes in file * Temp test node for MatchType * Fix missing v3_data for v1 nodes in validation * For now, remove chacking duplicate id's for dynamic types * Add Resize Image/Mask node that thanks to MatchType+DynamicCombo is 16-nodes-in-1 * Made DynamicCombo references in DCTestNode use public interface * Add an AnyTypeTestNode * Make lazy status for specific inputs on DynamicInputs work by having the values of the dictionary for check_lazy_status be a tuple, where the second element is the key of the input that can be returned * Comment out test logic nodes * Make primitive float's step make more sense * Add (and leave commented out) some potential logic nodes * Change default crop option to "center" on Resize Image/Mask node * Changed copy.copy(d) to d.copy() * Autogrow is available in stable frontend, so exposing it in public API * Use outputs id as display_name if no display_name present, remove v3 outputs id restriction that made them have to have unique IDs from the inputs * Enable Custom Combo node as stable frontend now supports it * Make id properly act like display_name on outputs * Add Batch Images/Masks/Latents node * Comment out Batch Images/Masks/Latents node for now, as Autogrow has a bug with MatchType where top connection is disconnected upon refresh * Removed code for a couple test nodes in nodes_logic.py * Add Batch Images, Batch Masks, and Batch Latents nodes with Autogrow, deprecate old Batch Images + LatentBatch nodes
110 lines
2.8 KiB
Python
110 lines
2.8 KiB
Python
import sys
|
|
from typing_extensions import override
|
|
|
|
from comfy_api.latest import ComfyExtension, io
|
|
|
|
|
|
class String(io.ComfyNode):
|
|
@classmethod
|
|
def define_schema(cls):
|
|
return io.Schema(
|
|
node_id="PrimitiveString",
|
|
display_name="String",
|
|
category="utils/primitive",
|
|
inputs=[
|
|
io.String.Input("value"),
|
|
],
|
|
outputs=[io.String.Output()],
|
|
)
|
|
|
|
@classmethod
|
|
def execute(cls, value: str) -> io.NodeOutput:
|
|
return io.NodeOutput(value)
|
|
|
|
|
|
class StringMultiline(io.ComfyNode):
|
|
@classmethod
|
|
def define_schema(cls):
|
|
return io.Schema(
|
|
node_id="PrimitiveStringMultiline",
|
|
display_name="String (Multiline)",
|
|
category="utils/primitive",
|
|
inputs=[
|
|
io.String.Input("value", multiline=True),
|
|
],
|
|
outputs=[io.String.Output()],
|
|
)
|
|
|
|
@classmethod
|
|
def execute(cls, value: str) -> io.NodeOutput:
|
|
return io.NodeOutput(value)
|
|
|
|
|
|
class Int(io.ComfyNode):
|
|
@classmethod
|
|
def define_schema(cls):
|
|
return io.Schema(
|
|
node_id="PrimitiveInt",
|
|
display_name="Int",
|
|
category="utils/primitive",
|
|
inputs=[
|
|
io.Int.Input("value", min=-sys.maxsize, max=sys.maxsize, control_after_generate=True),
|
|
],
|
|
outputs=[io.Int.Output()],
|
|
)
|
|
|
|
@classmethod
|
|
def execute(cls, value: int) -> io.NodeOutput:
|
|
return io.NodeOutput(value)
|
|
|
|
|
|
class Float(io.ComfyNode):
|
|
@classmethod
|
|
def define_schema(cls):
|
|
return io.Schema(
|
|
node_id="PrimitiveFloat",
|
|
display_name="Float",
|
|
category="utils/primitive",
|
|
inputs=[
|
|
io.Float.Input("value", min=-sys.maxsize, max=sys.maxsize, step=0.1),
|
|
],
|
|
outputs=[io.Float.Output()],
|
|
)
|
|
|
|
@classmethod
|
|
def execute(cls, value: float) -> io.NodeOutput:
|
|
return io.NodeOutput(value)
|
|
|
|
|
|
class Boolean(io.ComfyNode):
|
|
@classmethod
|
|
def define_schema(cls):
|
|
return io.Schema(
|
|
node_id="PrimitiveBoolean",
|
|
display_name="Boolean",
|
|
category="utils/primitive",
|
|
inputs=[
|
|
io.Boolean.Input("value"),
|
|
],
|
|
outputs=[io.Boolean.Output()],
|
|
)
|
|
|
|
@classmethod
|
|
def execute(cls, value: bool) -> io.NodeOutput:
|
|
return io.NodeOutput(value)
|
|
|
|
|
|
class PrimitivesExtension(ComfyExtension):
|
|
@override
|
|
async def get_node_list(self) -> list[type[io.ComfyNode]]:
|
|
return [
|
|
String,
|
|
StringMultiline,
|
|
Int,
|
|
Float,
|
|
Boolean,
|
|
]
|
|
|
|
async def comfy_entrypoint() -> PrimitivesExtension:
|
|
return PrimitivesExtension()
|