ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ComfyUI Comfy Typing 类型提示指南:基于 IO、ComfyNodeABC 与 CheckLazyMixin 编写类型安全的自定义节点

ComfyUI Comfy Typing 类型提示指南:基于 IO、ComfyNodeABC 与 CheckLazyMixin 编写类型安全的自定义节点 人工智能大模型媒体生成本地部署【免费下载链接】ComfyUIThe most powerful and modular diffusion model GUI, api and backend with a graph/nodes interface. The fastest local inference engine in the world.项目地址https://gitcode.com/GitHub_Trending/co/ComfyUI点击查看免费下载本指南以 ComfyUI 仓库内 comfy/comfy_types/README.md 为核心系统讲解面向节点开发者的类型提示模块comfy.comfy_types从IO数据类型的枚举语义到ComfyNodeABC抽象基类的属性契约与INPUT_TYPES输入描述规范再到惰性求值辅助CheckLazyMixin。读完本文你将能够用带类型注解、可自动补全、可被现代 IDE 校验的方式编写 ComfyUI 自定义节点并理解这些类型在 node_typing.py 中的底层实现。模块定位与导入方式comfy.comfy_types是 ComfyUI 为节点开发者提供的“类型提示type hinting 具体便利类型”模块。它的目标是让节点开发获得三重收益类型提示 / 自动补全INPUT_TYPES返回值、输入选项字典等结构被建模为TypedDictIDE 可精确提示可写字段可读的 docstring每个类属性都带有用途说明与用法示例悬停即可查阅与前端行为对齐IO枚举、InputTypeOptions等定义与 ComfyUI 前端v1.x 系列的输入/控件能力一一对应。若将该模块克隆到 ComfyUI 的custom_nodes目录下节点代码即可按如下方式导入这是 README.md 给出的标准写法from comfy.comfy_types import IO, ComfyNodeABC, CheckLazyMixin class ExampleNode(ComfyNodeABC): classmethod def INPUT_TYPES(s) - InputTypeDict: return {required: {}}完整可运行示例位于 comfy/comfy_types/examples/example_nodes.py其内容为一个“整数输入 1”的最小节点可作为开发模板直接参考。IO节点输入/输出数据类型枚举IO是一个字符串枚举str enum定义于 node_typing.py其成员即 ComfyUI 节点输入/输出槽socket使用的类型字符串。IO覆盖了内置与部分自定义数据类型包括类别枚举成员对应字符串基础标量STRING、INT、FLOAT、BOOLEAN、COMBOSTRING、INT、FLOAT、BOOLEAN、COMBO图像/掩码IMAGE、MASK、CLIP_VISION、CLIP_VISION_OUTPUTIMAGE、MASK、CLIP_VISION、CLIP_VISION_OUTPUT模型相关MODEL、CLIP、VAE、CONTROL_NET、LORA_MODEL、LOSS_MAP、STYLE_MODEL、GLIGEN、UPSCALE_MODEL与成员名相同采样相关CONDITIONING、SAMPLER、SIGMAS、GUIDER、NOISE与成员名相同媒体/其他AUDIO、WEBCAM、POINT、FACE_ANALYSIS、BBOX、SEGS、VIDEO与成员名相同此外还有三个特殊类型成员它们以逗号分隔的字符串表达“多类型”语义并配有专门的管道plumbingANY *始终匹配任意类型。但文档明确指出它“有代价”always matches any type, but at a price——会引发部分功能问题例如 reroutes、link types应尽量避免使用NUMBER FLOAT,INT表示“浮点或整数二者皆可”PRIMITIVE STRING,FLOAT,INT,BOOLEAN表示“字符串、浮点、整数或布尔中的任意一种”。多类型匹配的底层实现IO重写了__ne__node_typing.py实现“类型可互相匹配”的判断逻辑当自身或对方为*时恒视为相等否则将两侧按逗号拆分成集合只要一边是另一边的子集或反之即视为兼容。这正是ANY、NUMBER、PRIMITIVE能同时连接多种实际类型的原因也是理解 ComfyUI 链接类型校验行为的关键。ComfyNodeABC节点的抽象基类与属性契约ComfyNodeABC继承自ABCnode_typing.py为节点类声明了完整的属性与返回值契约是“带类型提示 / 自动补全以及尚可的 docstring”的主要来源。按职责可归为以下五组。1. 输入描述INPUT_TYPES抽象方法INPUT_TYPES是唯一的抽象方法必须以类方法形式实现返回值标注为InputTypeDictrequired键必须提供描述节点执行所必需的输入optional键可选描述可不连接的输入hidden键提供高级功能与客户端-服务器通信详见下文HiddenInputTypeDict。在 IDE 中编写该方法时返回类型注解- InputTypeDict会触发两级自动补全如下图所示。2. 输出描述RETURN_TYPES与RETURN_NAMESRETURN_TYPES: tuple[IO, ...]节点输出类型元组元素既可以是IO枚举也可以是普通字符串自定义类型例如RETURN_TYPES (IO.INT, INT, CUSTOM_TYPE)RETURN_NAMES: tuple[str, ...]每个输出的槽位名称如RETURN_NAMES (count, filter_string)OUTPUT_TOOLTIPS: tuple[str, ...]每个输出的悬停提示字符串。3. 执行描述FUNCTIONFUNCTION: str指定要执行的方法名字符串字面量例如FUNCTION execute。该方法的形参应逐一对应INPUT_TYPES中的输入名。4. 节点元信息DESCRIPTION: str节点描述悬停时显示既可直接赋值字符串也可复用类 docstring如DESCRIPTION cleandoc(__doc__)见 example_nodes.pyCATEGORY: str节点在 “Add Node” 菜单中的分类路径EXPERIMENTAL: bool、DEPRECATED: bool分别标记实验性节点可能变更或异常与已弃用节点提示用户寻找替代DEV_ONLY: bool标记为仅开发模式可见未开启开发模式时从搜索/菜单中隐藏API_NODE: Optional[bool]标记为 API 节点。5. 执行控制标志OUTPUT_NODE: bool标记为输出节点强制其所需输入被求值执行。未连接到任何输出节点的节点不会被执行INPUT_IS_LIST: bool置True时所有输入将以整份列表形式一次性传入且check_lazy_status的“未求值”参数表现为(None,)OUTPUT_IS_LIST: tuple[bool, ...]与RETURN_TYPES长度一致的布尔元组声明哪些输出是列表但应被下游按单个元素处理未实现INPUT_IS_LIST的下游节点将对列表逐项各执行一次。典型用法RETURN_TYPES (IO.INT, IO.INT, IO.STRING) OUTPUT_IS_LIST (True, True, False) # 字符串输出按普通方式处理InputTypeDictINPUT_TYPES 返回值的三段式结构InputTypeDictnode_typing.py是一个TypedDict定义INPUT_TYPES返回字典的合法键required: dict[str, tuple[IO, InputTypeOptions]]必须连接的输入optional: dict[str, tuple[IO, InputTypeOptions]]可不连接的输入hidden: HiddenInputTypeDict隐藏输入用于高级功能与服务器通信。返回该类型后IDE 会对顶层键自动补全required/optional/hidden见下图。HiddenInputTypeDict五个隐藏输入常量hidden字典的每个键都映射到固定的字符串字面量node_typing.pynode_id/unique_id→UNIQUE_ID节点唯一标识与客户端侧节点的id属性一致常用于客户端-服务器消息通信prompt→PROMPT客户端发送给服务器的完整 promptextra_pnginfo→EXTRA_PNGINFO会被复制进所保存 PNG 元数据的字典自定义节点可向其中写入附加信息或借此与下游节点通信dynprompt→DYNPROMPTcomfy_execution.graph.DynamicPrompt实例与PROMPT不同它可能在执行过程中随节点展开Node Expansion而变异。InputTypeOptions单个输入的可配置选项每个输入项的值是一个二元组(类型, 配置字典)其中配置字典由InputTypeOptionsnode_typing.py建模。由于 IDE 对联合类型的限制目前所有选项对所有类型都会提示例如label_on即使输入不是IO.BOOLEAN也会出现在补全中实际生效与否以类型为准。主要选项按输入类型归类如下。通用选项所有类型选项类型说明defaultbool \| str \| float \| int \| list \| tuple控件的默认值defaultInputbool已在 v1.16 前端弃用required 输入上应删除optional 输入上应改用forceInputforceInputbool即使该输入类型有可用控件也强制以输入槽而非控件形式呈现lazybool声明该输入使用惰性求值rawLinkbool存在连线时不接收求值结果而是接收链接本身即[nodeId, outputIndex]专为节点展开设计tooltipstr输入或控件的悬停提示socketlessbool前端 v1.17.5 起可用为True时若该输入存在控件则不创建输入槽所有输入默认都有用于连线的输入槽widgetTypestr前端 v1.18.0 起可用指定与输入类型不同、用于控件初始化的控件类型数字选项FLOAT/INTmin、max数值下限/上限step步进增减量round浮点按该值舍入仅FLOAT。布尔选项BOOLEANlabel_on/label_off布尔为True/False时控件显示的文案。字符串选项STRINGmultiline使用多行文本框placeholder为空时显示的占位文本dynamicPrompts让前端对动态提示词求值旧的defaultVal已弃用。下拉/多选选项COMBOoptions: list[str | int | float]可选项列表。文档明确推荐使用[COMBO, {options: [...]}]的形式而不是旧的[[Option 1, ...]]multi_select: MultiSelectOptions前端 v1.13.4 起可用其子选项包括placeholder未选择时的占位文本与chip用 chip 而非逗号分隔值展示多选结果control_after_generate: bool为输入增加“生成后自动变更数值”的控制控件目前仅用于INT与COMBO类型gradient_stops: list[dict]用于渐变滑块gradientslider显示模式的渐变色标每项形如{offset: float, color: [r, g, b]}。图片上传选项image_upload: bool为输入附加图片上传按钮与预览要求输入名必须为imageimage_folder: Literal[input, output, temp]指定预览图片来源的根目录。远程输入remote: RemoteInputOptions前端 v1.9.7 起可用用于将输入连接到远程数据源包含以下子选项route远程来源路由、refresh_button是否在控件下方显示刷新按钮、control_after_refreshfirst/last刷新后自动选中首项/末项、timeout等待远程响应的最大毫秒数、max_retries中止请求前的最大重试次数、refresh远程输入值的 TTL单位毫秒即刷新间隔。在 IDE 中编写输入配置字典时InputTypeOptions会对default、min、max、multiline、lazy等键自动补全见下图。CheckLazyMixin惰性求值的最小实现CheckLazyMixinnode_typing.py为使用惰性输入lazy: True的节点提供基础的check_lazy_status实现与类型提示。其约定如下该方法返回一个输入名列表表示“应当被求值的输入名”kwargs包含节点全部输入输入若为None即视为尚未求值当使用INPUT_IS_LIST True时未求值输入表现为(None,)方法形参需与节点执行FUNCTION的形参一致该方法会被反复执行直到返回空列表或所有请求项均已被求值并以参数传入。内置基础实现逻辑为收集所有值为None的输入名并返回即“默认要求全部输入”def check_lazy_status(self, **kwargs) - list[str]: need [name for name in kwargs if kwargs[name] is None] return need实际节点可覆写此方法按业务条件决定只求值部分输入例如 custom_nodes/example_node.py.example 中print_to_screen enable时才请求求值int_field、float_field、string_field的写法。组合使用一个完整的类型化节点综合上述要素一个完整、类型安全的节点写法如下结构参照 example_nodes.pyfrom comfy.comfy_types import IO, ComfyNodeABC, InputTypeDict from inspect import cleandoc class ExampleNode(ComfyNodeABC): An example node that just adds 1 to an input integer. DESCRIPTION cleandoc(__doc__) CATEGORY examples classmethod def INPUT_TYPES(s) - InputTypeDict: return { required: { input_int: (IO.INT, {forceInput: True, tooltip: An integer to increment}), }, optional: { multiplier: (IO.FLOAT, {default: 1.0, min: 0.0, max: 10.0, step: 0.1}), }, } RETURN_TYPES (IO.INT,) RETURN_NAMES (input_plus_one,) OUTPUT_TOOLTIPS (The input incremented by 1,) FUNCTION execute def execute(self, input_int: int, multiplier: float 1.0): return (int(input_int * multiplier) 1,)要点归纳INPUT_TYPES返回值标注InputTypeDictIDE 即可对顶层键required/optional/hidden与每个输入项的选项键自动补全RETURN_TYPES/RETURN_NAMES/OUTPUT_TOOLTIPS按输出顺序一一对应类级标志OUTPUT_NODE、INPUT_IS_LIST、OUTPUT_IS_LIST、DEV_ONLY等按需声明需要惰性求值时继承CheckLazyMixin并覆写check_lazy_status。模块导出与周边类型comfy/comfy_types/init.py 除重新导出IO、InputTypeDict、ComfyNodeABC、CheckLazyMixin、FileLocator外还定义了几个面向模型后端的类型协议UnetApplyFunctionProtocol对应comfy.model_base.BaseModel.apply_model的函数签名(x, t, **kwargs) - TensorUnetApplyCondsTypedDictUNet 应用函数可选条件含c_concat、c_crossattn、control、transformer_optionsUnetParamsTypedDictUNet 推理参数包含input形状[B, C, H, W]、timestep形状[B]、c、cond_or_uncond[0,1]列表0 表示条件分支1 表示无条件分支UnetWrapperFunction包装函数的可调用别名。另外FileLocatornode_typing.py为文件定位结果提供类型提示filename文件名、subfolder子目录、type根目录取值为input/output/temp可用于封装文件加载类节点的返回值结构。总结comfy.comfy_types把 ComfyUI 节点开发中最易出错的“魔法字符串”与字典结构收敛为带类型注解、可自动补全、带文档说明的公开类型IO统一输入/输出数据类型并支持多类型匹配ComfyNodeABC定义节点类属性与返回值契约InputTypeDict/InputTypeOptions精确定义输入描述结构CheckLazyMixin为惰性求值提供起点。对节点开发者而言基于这套类型开发既降低了拼写错误与前后端行为不一致的风险也让节点代码对 IDE 与协作者更友好——这也是仓库官方推荐的自定义节点开发范式。赞分享人工智能大模型媒体生成本地部署【免费下载链接】ComfyUIThe most powerful and modular diffusion model GUI, api and backend with a graph/nodes interface. The fastest local inference engine in the world.项目地址https://gitcode.com/GitHub_Trending/co/ComfyUI点击查看免费下载相关推荐彻底搞懂io-ts从类型安全到自定义类型扩展全指南彻底搞懂io ts从类型安全到自定义类型扩展全指南 io ts 是一个强大的运行时类型系统专为 TypeScript 设计提供 IO 解码/编码功能。它允后端Reflex Flow 节点Nodes完全指南从内置类型到自定义节点Reflex Flow 节点Nodes完全指南从内置类型到自定义节点 导读 本文基于 Reflex 仓库中 docs/enterprise/react_f后端前端Web框架企业级Excel自动化架构实战基于ClosedXML的数据报表生成最佳实践企业级Excel自动化架构实战基于ClosedXML的数据报表生成最佳实践 在数字化转型浪潮中企业级数据处理和报表自动化已成为现代业务系统的核心需求。传统的开发工具上一篇降低虚拟桌宠触摸响应延迟的三层优化实践下一篇IdeaVim 实战通过 Action() 映射复用 JetBrains 外部插件动作创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表