Token导航 LogoToken导航TokenDH.com
开发可写文件github未标认证来源可访问许可证需确认审计通过

comfyui-node-datatypescomfyui 节点数据类型

Agent Skill

用于辅助数据整理、表格处理、CSV/Excel 分析、指标计算和图表准备。它适合让 Agent 清洗字段、汇总数据、发现异常、生成统计口径或把分析结果转成可读说明。使用时需要确认数据来源、字段含义和时间范围,避免把样本数据当全量事实;涉及敏感数据、导出文件或批量写回时,应先确认权限和脱敏边界。

总安装

582

周安装

24

GitHub Stars

184

下载量

190
CodexClaudeCursorGemini CLI

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

2

许可证

unknown

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:comfyui-node-datatypes(comfyui 节点数据类型)
来源仓库:https://github.com/jtydhr88/comfyui-custom-node-skills
仓库路径:skills/comfyui-node-datatypes
安装命令:
npx skills add https://github.com/jtydhr88/comfyui-custom-node-skills --skill comfyui-node-datatypes
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/jtydhr88/comfyui-custom-node-skills --skill comfyui-node-datatypes

简介

comfyui-node-datatypes 详细说明 ComfyUI 支持的各类数据格式和形状。

  • 包括 IMAGE [B,H,W,C]、MASK、LATENT 等张量结构说明。
  • 帮助开发者正确处理图像、掩码、潜空间和条件数据。
  • 错误的数据形状可能导致运行时异常或输出失真。
  • 适用宿主包括 Codex、Claude、Cursor、Gemini CLI,接入前应确认版本、权限和运行环境要求。

SKILL.md

ComfyUI Data Types

ComfyUI uses specific data types for node inputs and outputs. Understanding tensor shapes and data formats is essential.

Complete Type Reference

Tensor/Data Types

TypeV3 ClassFormatDescription
IMAGEio.Imagetorch.Tensor [B,H,W,C] float32 0-1Batch of RGB images
MASKio.Masktorch.Tensor [H,W] or [B,H,W] float32 0-1Grayscale masks
LATENTio.Latent{"samples": Tensor[B,C,H,W] or [B,C,T,H,W], "noise_mask"?: Tensor, "batch_index"?: list[int], "type"?: str}Latent space (4D image / 5D video)
CONDITIONINGio.Conditioninglist[tuple[Tensor, PooledDict]]Text conditioning with pooled outputs
AUDIOio.Audio{"waveform": Tensor[B,C,T], "sample_rate": int}Audio data
VIDEOio.VideoVideoInput ABCVideo data (abstract base class)
SIGMASio.Sigmastorch.Tensor 1D, length steps+1Noise schedule
NOISEio.NoiseObject with generate_noise()Noise generator
LORA_MODELio.LoraModeldict[str, torch.Tensor]LoRA weight deltas
LOSS_MAPio.LossMap{"loss": list[torch.Tensor]}Loss map
TRACKSio.Tracks{"track_path": Tensor, "track_visibility": Tensor}Motion tracking data
WAN_CAMERA_EMBEDDINGio.WanCameraEmbeddingtorch.TensorWAN camera embeddings
LATENT_OPERATIONio.LatentOperationCallable[[Tensor], Tensor]Latent transform function
TIMESTEPS_RANGEio.TimestepsRangetuple[int, int]Range 0.0-1.0

Model Types (opaque, typically pass-through)

TypeV3 ClassPython Type
MODELio.ModelModelPatcher
CLIPio.ClipCLIP
VAEio.VaeVAE
CONTROL_NETio.ControlNetControlNet
CLIP_VISIONio.ClipVisionClipVisionModel
CLIP_VISION_OUTPUTio.ClipVisionOutputClipVisionOutput
STYLE_MODELio.StyleModelStyleModel
GLIGENio.GligenModelPatcher (wrapping Gligen)
UPSCALE_MODELio.UpscaleModelImageModelDescriptor
LATENT_UPSCALE_MODELio.LatentUpscaleModelAny
SAMPLERio.SamplerSampler
GUIDERio.GuiderCFGGuider
HOOKSio.HooksHookGroup
HOOK_KEYFRAMESio.HookKeyframesHookKeyframeGroup
MODEL_PATCHio.ModelPatchAny
AUDIO_ENCODERio.AudioEncoderAny
AUDIO_ENCODER_OUTPUTio.AudioEncoderOutputAny
PHOTOMAKERio.PhotomakerAny
POINTio.PointAny
FACE_ANALYSISio.FaceAnalysisAny
BBOXio.BBOXAny
SEGSio.SEGSAny

3D Types

TypeV3 ClassPython TypeDescription
MESHio.MeshMESH(vertices, faces)3D mesh with vertices + faces tensors
VOXELio.VoxelVOXEL(data)Voxel data tensor
FILE_3Dio.File3DAnyFile3DAny supported 3D format
FILE_3D_GLBio.File3DGLBFile3DBinary glTF
FILE_3D_GLTFio.File3DGLTFFile3DJSON-based glTF
FILE_3D_FBXio.File3DFBXFile3DFBX format
FILE_3D_OBJio.File3DOBJFile3DOBJ format
FILE_3D_STLio.File3DSTLFile3DSTL format (3D printing)
FILE_3D_USDZio.File3DUSDZFile3DApple AR format
SVGio.SVGSVGScalable vector graphics
LOAD_3Dio.Load3D{"image": str, "mask": str, "normal": str, "camera_info": CameraInfo}3D model with renders
LOAD_3D_ANIMATIONio.Load3DAnimationSame as Load3DAnimated 3D model
LOAD3D_CAMERAio.Load3DCamera{"position": dict, "target": dict, "zoom": int, "cameraType": str}3D camera info

Widget Types (create UI controls)

TypeV3 ClassPython TypeDescription
INTio.IntintInteger with min/max/step
FLOATio.FloatfloatFloat with min/max/step/round
STRINGio.StringstrText (single/multi-line)
BOOLEANio.BooleanboolToggle with labels
COMBOio.CombostrDropdown selection
COMBO (multi)io.MultiCombolist[str]Multi-select dropdown
COLORio.Colorstr (hex)Color picker, default #ffffff
BOUNDING_BOXio.BoundingBox{"x": int, "y": int, "width": int, "height": int}Rectangle region
CURVEio.Curvelist[tuple[float, float]]Spline curve points
IMAGECOMPAREio.ImageComparedictImage comparison widget
WEBCAMio.WebcamstrWebcam capture widget
HISTOGRAMio.Histogramlist[int]Histogram bin counts

Special Types

TypeV3 ClassDescription
* (ANY)io.AnyTypeMatches any type
COMFY_MULTITYPED_V3io.MultiTypeAccept multiple specific types on one input
COMFY_MATCHTYPE_V3io.MatchTypeGeneric type matching across inputs/outputs
COMFY_AUTOGROW_V3io.AutogrowDynamic growing inputs
COMFY_DYNAMICCOMBO_V3io.DynamicComboCombo that reveals sub-inputs per option
FLOW_CONTROLio.FlowControlInternal testing only
ACCUMULATIONio.AccumulationInternal testing only

IMAGE Type

Images are torch.Tensor with shape [B, H, W, C]:

  • B = batch size (1 for single image)
  • H = height in pixels
  • W = width in pixels
  • C = channels (3 for RGB, values 0.0-1.0)
import torch
import numpy as np
from PIL import Image as PILImage

class ImageProcessor(io.ComfyNode):
    @classmethod
    def define_schema(cls):
        return io.Schema(
            node_id="ImageProcessor",
            display_name="Image Processor",
            category="image",
            inputs=[io.Image.Input("image")],
            outputs=[io.Image.Output("IMAGE")],
        )

    @classmethod
    def execute(cls, image):
        b, h, w, c = image.shape
        result = torch.clamp(image * 1.5, 0.0, 1.0)
        return io.NodeOutput(result)

Loading / Saving Images

from PIL import ImageOps

# Load from file → tensor
def load_image(path):
    img = PILImage.open(path)
    img = ImageOps.exif_transpose(img)   # fix rotation from camera EXIF
    if img.mode == "I":                  # handle 16-bit images
        img = img.point(lambda i: i * (1 / 255))
    img = img.convert("RGB")
    return torch.from_numpy(np.array(img).astype(np.float32) / 255.0).unsqueeze(0)

# Tensor → save to file
def save_image(tensor, path):
    if tensor.dim() == 4:
        tensor = tensor[0]
    PILImage.fromarray(np.clip(255.0 * tensor.cpu().numpy(), 0, 255).astype(np.uint8)).save(path)

# Batch operations
batch = torch.cat([img1, img2], dim=0)    # stack into batch
single = image[i]                          # extract from batch [H,W,C]
single_batch = image.unsqueeze(0)          # add batch dim [1,H,W,C]

MASK Type

torch.Tensor with shape [H, W] or [B, H, W], values 0.0-1.0.

# Invert mask
inverted = 1.0 - mask

# Mask ↔ Image conversion
alpha = mask.unsqueeze(0).unsqueeze(-1)                   # [1,H,W,1]
gray_mask = 0.299*img[:,:,:,0] + 0.587*img[:,:,:,1] + 0.114*img[:,:,:,2]
image_from_mask = mask.unsqueeze(-1).repeat(1, 1, 1, 3)  # [B,H,W,3]

# Ensure batch dim
if mask.dim() == 2:
    mask = mask.unsqueeze(0)  # [1, H, W]

LATENT Type

Dict with typed keys:

class LatentDict(TypedDict):
    samples: torch.Tensor       # [B, C, H, W] (image) or [B, C, T, H, W] (video) - required
    noise_mask: NotRequired[torch.Tensor]
    batch_index: NotRequired[list[int]]
    type: NotRequired[str]      # only for "audio", "hunyuan3dv2"

Image models (SD1.5, SDXL, SD3, Flux): 4D [B, C, H, W] — SD1.5/SDXL = 4 channels, SD3/Flux = 16 channels. Latent dimensions are 1/8 of pixel dims.

Video models (Hunyuan Video, Wan, Cosmos, LTX Video, Mochi): 5D [B, C, T, H, W] — T is the temporal (frame) dimension.

samples = latent["samples"]
# Check dimensionality:
if samples.ndim == 5:
    B, C, T, H, W = samples.shape   # video latent
else:
    B, C, H, W = samples.shape      # image latent

# Always preserve extra keys when modifying:
result = latent.copy()
result["samples"] = modified_samples

CONDITIONING Type

list[tuple[Tensor, PooledDict]] — a list of (cond_tensor, metadata_dict) pairs.

The PooledDict contains many optional keys for different models:

class PooledDict(TypedDict):
    pooled_output: torch.Tensor
    control: NotRequired[ControlNet]
    area: NotRequired[tuple[int, ...]]
    strength: NotRequired[float]           # default 1.0
    mask: NotRequired[torch.Tensor]
    start_percent: NotRequired[float]      # 0.0-1.0
    end_percent: NotRequired[float]        # 0.0-1.0
    guidance: NotRequired[float]           # Flux-like models
    hooks: NotRequired[HookGroup]
    # ... many more model-specific keys (SDXL, SVD, WAN, etc.)

Combine conditioning: result = cond_a + cond_b (list concatenation).

VIDEO Type

VideoInput is an abstract base class with methods:

class VideoInput(ABC):
    def get_components(self) -> VideoComponents    # images tensor + audio + frame_rate
    def save_to(self, path, format, codec, metadata)
    def as_trimmed(self, start_time, duration) -> VideoInput | None
    def get_stream_source(self) -> str | BytesIO
    def get_dimensions(self) -> tuple[int, int]     # (width, height)
    def get_duration(self) -> float                  # seconds
    def get_frame_count(self) -> int
    def get_frame_rate(self) -> Fraction
    def get_container_format(self) -> str

Concrete implementations: VideoFromFile, VideoFromComponents (available via from comfy_api.latest import InputImpl).

3D Types

File3D

from comfy_api.latest import Types

# File3D wraps a 3D file (disk path or BytesIO stream)
file_3d = Types.File3D(source="/path/to/model.glb", file_format="glb")
file_3d.format              # "glb"
file_3d.is_disk_backed      # True
file_3d.get_data()          # BytesIO
file_3d.get_bytes()         # raw bytes
file_3d.save_to("/output/model.glb")

MESH and VOXEL

from comfy_api.latest import Types

mesh = Types.MESH(vertices=torch.tensor(...), faces=torch.tensor(...))
voxel = Types.VOXEL(data=torch.tensor(...))

Widget Types with Special Features

Color

io.Color.Input("color", default="#ff0000", socketless=True)
# Value is a hex string like "#ff0000"

BoundingBox

io.BoundingBox.Input("bbox",
    default={"x": 0, "y": 0, "width": 512, "height": 512},
    socketless=True,
    component="my_component",  # optional custom UI component
)
# Value is {"x": int, "y": int, "width": int, "height": int}

Curve

io.Curve.Input("curve",
    default=[(0.0, 0.0), (1.0, 1.0)],  # linear
    socketless=True,
)
# Value is list of (x, y) tuples

MultiCombo

io.MultiCombo.Input("tags",
    options=["tag1", "tag2", "tag3"],
    default=["tag1"],
    placeholder="Select tags...",
    chip=True,  # show as chips
)
# Value is list[str]

Webcam

io.Webcam.Input("webcam_capture")
# Value is str (captured image data)

ImageCompare

io.ImageCompare.Input("comparison", socketless=True)
# Value is dict

Custom Types

# Simple: create inline custom type
MyData = io.Custom("MY_DATA_TYPE")

# Use in inputs/outputs
io.Schema(
    inputs=[MyData.Input("data")],
    outputs=[MyData.Output("MY_DATA")],
)

Advanced: @comfytype decorator

For custom types with type hints or custom Input/Output classes:

from comfy_api.latest._io import comfytype, ComfyTypeIO

@comfytype(io_type="MY_DATA_TYPE")
class MyData(ComfyTypeIO):
    Type = dict[str, Any]  # type hint for the data

AnyType / Wildcard

# Accept any single type (always a connection input, no widget)
io.AnyType.Input("anything")

# Accept specific multiple types
io.MultiType.Input("data", types=[io.Image, io.Mask, io.Latent])

# MultiType with widget override (shows widget for first type)
io.MultiType.Input(
    io.Float.Input("value", default=1.0),
    types=[io.Float, io.Int],
)

Imports from comfy_api.latest

from comfy_api.latest import (
    ComfyExtension,  # extension registration
    ComfyAPI,        # runtime API (progress, node replacement)
    io,              # all io types (io.Image, io.Schema, io.ComfyNode, etc.)
    ui,              # UI output helpers (ui.PreviewImage, ui.SavedImages, etc.)
    Input,           # Input.Image (ImageInput), Input.Audio, Input.Mask, Input.Latent, Input.Video
    InputImpl,       # InputImpl.VideoFromFile, InputImpl.VideoFromComponents
    Types,           # Types.MESH, Types.VOXEL, Types.File3D, Types.VideoCodec, etc.
)

Tensor Safety

When checking if a tensor exists, always use is not None instead of truthiness:

# CORRECT
if image is not None:
    process(image)

# WRONG — multi-element tensors don't support bool()
if image:       # raises RuntimeError
    process(image)

# For boolean conditions on tensors, use .all() or .any()
if (mask > 0.5).all():
    ...

Type Conversion Patterns

# IMAGE [B,H,W,C] → MASK [B,H,W]
mask = 0.299 * image[:,:,:,0] + 0.587 * image[:,:,:,1] + 0.114 * image[:,:,:,2]

# MASK [B,H,W] → IMAGE [B,H,W,C]
image = mask.unsqueeze(-1).repeat(1, 1, 1, 3)

# Resize image tensor
import torch.nn.functional as F
resized = F.interpolate(
    image.permute(0, 3, 1, 2),  # [B,C,H,W] for interpolate
    size=(new_h, new_w), mode='bilinear', align_corners=False
).permute(0, 2, 3, 1)  # back to [B,H,W,C]

See Also

  • comfyui-node-basics - Node class structure and registration
  • comfyui-node-inputs - Input configuration details (widget options)
  • comfyui-node-outputs - Output types and UI outputs
  • comfyui-node-advanced - MatchType, MultiType, Autogrow, DynamicCombo

适合场景

01

用户想查找某类 Agent Skill 时

02

需要根据任务场景推荐可安装能力包时

03

需要对比不同来源的安装命令和来源信息时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

Codex

36.26%
按下载量换算69

Claude

27.79%
按下载量换算53

Cursor

18.81%
按下载量换算36

Gemini CLI

9.4%
按下载量换算18

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

可写文件

该 Skill 可能写入或修改本地文件,使用前需要确认目标目录和修改范围。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。当前只有一个来源,正式发布前建议补源仓库或其他目录站核验。

来源信息

继续浏览同类 Skills