Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
1f67441
feat: Support SCAIL WanVideo model (#12614)
kijai Feb 28, 2026
5f41584
Disable dynamic_vram when weight hooks applied (#12653)
rattus128 Feb 28, 2026
48bb0bd
cli_args: Default comfy to DynamicVram mode (#12658)
rattus128 Feb 28, 2026
17106cb
Move parsing of requirements logic to function. (#12701)
comfyanonymous Mar 1, 2026
1080bd4
Disable dynamic vram on wsl. (#12706)
comfyanonymous Mar 1, 2026
d159142
refactor: rename Mahiro CFG to Similarity-Adaptive Guidance (#12172)
christian-byrne Mar 1, 2026
850e8b4
feat: add text preview support to jobs API (#12169)
christian-byrne Mar 1, 2026
4d79f4f
fix: handle substep sigmas in context window set_step (#12719)
drozbay Mar 1, 2026
c0d472e
comfy-aimdo 0.2.3 (#12720)
rattus128 Mar 1, 2026
602f6bd
Make --disable-smart-memory disable dynamic vram. (#12722)
comfyanonymous Mar 1, 2026
dfbf99a
model_mangament: make dynamic --disable-smart-memory work (#12724)
rattus128 Mar 2, 2026
7175c11
comfy aimdo 0.2.4 (#12727)
rattus128 Mar 2, 2026
afb5421
feat(api-nodes): allow to use "IMAGE+TEXT" in NanoBanana2 (#12729)
bigcat88 Mar 2, 2026
f1f8996
chore: update workflow templates to v0.9.5 (#12732)
comfyui-wiki Mar 2, 2026
57dd6c1
Support loading zeta chroma weights properly. (#12734)
comfyanonymous Mar 2, 2026
9ebee0a
Feat: z-image pixel space (model still training atm) (#12709)
lodestone-rock Mar 3, 2026
dff0a4a
Fix VAEDecodeAudioTiled ignoring tile_size input (#12735) (#12738)
xeinherjer-dev Mar 3, 2026
09bcbdd
ModelPatcherDynamic: Force load all non-comfy weights (#12739)
rattus128 Mar 3, 2026
174fd67
main: Load aimdo after logger is setup (#12743)
rattus128 Mar 3, 2026
f719a9d
Adjust memory usage factor of zeta model. (#12746)
comfyanonymous Mar 3, 2026
b6ddc59
CURVE type (#12581)
jtydhr88 Mar 4, 2026
ac6513e
DynamicVram: Add casting / fix torch Buffer weights (#12749)
rattus128 Mar 4, 2026
eb01173
Fix VideoFromComponents.save_to crash when writing to BytesIO (#12683)
artokun Mar 4, 2026
d531e3f
model_patcher: Improve dynamic offload heuristic (#12759)
rattus128 Mar 4, 2026
9b85cf9
Comfy Aimdo 0.2.5 + Fix offload performance in DynamicVram (#12754)
rattus128 Mar 4, 2026
0a7446a
Pass tokens when loading text gen model for text generation (#12755)
kijai Mar 4, 2026
8811db5
comfy-aimdo 0.2.6 (#12764)
rattus128 Mar 4, 2026
ac4a943
Initial load device should be cpu when using dynamic vram. (#12766)
comfyanonymous Mar 4, 2026
43c64b6
Support the LTXAV 2.3 model. (#12773)
comfyanonymous Mar 5, 2026
f2ee7f2
Fix cublas ops on dynamic vram. (#12776)
comfyanonymous Mar 5, 2026
c5fe8ac
chore: update workflow templates to v0.9.6 (#12778)
comfyui-wiki Mar 5, 2026
4941671
Fix cuda getting initialized in cpu mode. (#12779)
comfyanonymous Mar 5, 2026
c842854
chore: update workflow templates to v0.9.7 (#12780)
comfyui-wiki Mar 5, 2026
e04d0db
ComfyUI v0.16.0
comfyanonymous Mar 5, 2026
bd21363
feat(api-nodes-xAI): updated models, pricing, added features (#12756)
bigcat88 Mar 5, 2026
9cdfd74
feat(api-nodes): enable Kling 3.0 Motion Control (#12785)
bigcat88 Mar 5, 2026
da29b79
Update workflow templates to v0.9.8 (#12788)
comfyui-wiki Mar 5, 2026
6ef82a8
ComfyUI v0.16.1
comfyanonymous Mar 5, 2026
6481569
comfy-aimdo 0.2.7 (#12791)
rattus128 Mar 5, 2026
42e0e02
ops: Handle CPU weight in VBAR caster (#12792)
rattus128 Mar 5, 2026
5073da5
chore: update workflow templates to v0.9.10 (#12793)
comfyui-wiki Mar 5, 2026
1c3b651
Refactor. (#12794)
comfyanonymous Mar 5, 2026
50549aa
ComfyUI v0.16.2
comfyanonymous Mar 5, 2026
8befce5
Add manual cast to LTX2 vocoder conv_transpose1d (#12795)
kijai Mar 5, 2026
17b43c2
LTX audio vae novram fixes. (#12796)
comfyanonymous Mar 5, 2026
58017e8
feat: add causal_fix parameter to add_keyframe_index and append_keyfr…
tavihalperin Mar 5, 2026
1c21828
ComfyUI v0.16.3
comfyanonymous Mar 5, 2026
e544c65
feat: add Math Expression node with simpleeval evaluation (#12687)
dante01yoon Mar 6, 2026
3b93d5d
feat(api-nodes): add TencentSmartTopology node (#12741)
bigcat88 Mar 6, 2026
34e55f0
feat(api-nodes): add Gemini 3.1 Flash Lite model to LLM node (#12803)
bigcat88 Mar 6, 2026
f466b06
Fix fp16 audio encoder models (#12811)
rattus128 Mar 6, 2026
d69d308
Don't run TE on cpu when dynamic vram enabled. (#12815)
comfyanonymous Mar 7, 2026
afc00f0
Fix requirements version. (#12817)
comfyanonymous Mar 7, 2026
6ac8152
chore: update workflow templates to v0.9.11 (#12821)
comfyui-wiki Mar 7, 2026
bcf1a1f
mm: reset_cast_buffers: sync compute stream before free (#12822)
rattus128 Mar 7, 2026
a7a6335
ComfyUI v0.16.4
comfyanonymous Mar 7, 2026
29b24cb
refactor(assets): modular architecture + async two-phase scanner & ba…
luke-mino-altherr Mar 8, 2026
7723f20
comfy-aimdo 0.2.9 (#12840)
rattus128 Mar 8, 2026
e4b0bb8
Import assets seeder later, print some package versions. (#12841)
comfyanonymous Mar 8, 2026
06f85e2
Fix text encoder lora loading for wrapped models (#12852)
kijai Mar 9, 2026
814dab9
Update workflow templates to v0.9.18 (#12857)
comfyui-wiki Mar 10, 2026
740d998
fix(manager): improve install guidance when comfyui-manager is not in…
ltdrdata Mar 10, 2026
c4fb027
Add a way for nodes to add pre attn patches to flux model. (#12861)
comfyanonymous Mar 10, 2026
a912809
model_detection: deep clone pre edited edited weights (#12862)
rattus128 Mar 10, 2026
535c16c
Widen OOM_EXCEPTION to AcceleratorError form (#12835)
rattus128 Mar 10, 2026
8086468
main: switch on faulthandler (#12868)
rattus128 Mar 10, 2026
3ad36d6
Allow model patches to have a cleanup function. (#12878)
comfyanonymous Mar 11, 2026
9642e44
Add pre attention and post input patches to qwen image model. (#12879)
comfyanonymous Mar 11, 2026
980621d
comfy-aimdo 0.2.10 (#12890)
rattus128 Mar 11, 2026
3365008
feat(api-nodes): add Reve Image nodes (#12848)
bigcat88 Mar 11, 2026
4f4f865
fix: guard torch.AcceleratorError for compatibility with torch < 2.8.…
adiborochov Mar 11, 2026
f6274c0
Fix issue with batch_size > 1 on some models. (#12892)
comfyanonymous Mar 11, 2026
abc87d3
Bump comfyui-frontend-package to 1.41.15 (#12891)
comfy-pr-bot Mar 11, 2026
9ce4c3d
Bump comfyui-frontend-package to 1.41.16 (#12894)
comfy-pr-bot Mar 12, 2026
c5e7b9c
feat(isolation): process isolation for custom nodes via pyisolate
pollockjj Mar 12, 2026
08b92a4
Merge branch 'pyisolate-squash-final' into pyisolate-pr-final
pollockjj Mar 12, 2026
b602cc4
fix(lint): suppress F401 on side-effect import utils.extra_config
pollockjj Mar 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,4 @@ web_custom_versions/
openapi.yaml
filtered-openapi.yaml
uv.lock
.pyisolate_venvs/
267 changes: 267 additions & 0 deletions alembic_db/versions/0002_merge_to_asset_references.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,267 @@
"""
Merge AssetInfo and AssetCacheState into unified asset_references table.

This migration drops old tables and creates the new unified schema.
All existing data is discarded.

Revision ID: 0002_merge_to_asset_references
Revises: 0001_assets
Create Date: 2025-02-11
"""

from alembic import op
import sqlalchemy as sa

revision = "0002_merge_to_asset_references"
down_revision = "0001_assets"
branch_labels = None
depends_on = None


def upgrade() -> None:
# Drop old tables (order matters due to FK constraints)
op.drop_index("ix_asset_info_meta_key_val_bool", table_name="asset_info_meta")
op.drop_index("ix_asset_info_meta_key_val_num", table_name="asset_info_meta")
op.drop_index("ix_asset_info_meta_key_val_str", table_name="asset_info_meta")
op.drop_index("ix_asset_info_meta_key", table_name="asset_info_meta")
op.drop_table("asset_info_meta")

op.drop_index("ix_asset_info_tags_asset_info_id", table_name="asset_info_tags")
op.drop_index("ix_asset_info_tags_tag_name", table_name="asset_info_tags")
op.drop_table("asset_info_tags")

op.drop_index("ix_asset_cache_state_asset_id", table_name="asset_cache_state")
op.drop_index("ix_asset_cache_state_file_path", table_name="asset_cache_state")
op.drop_table("asset_cache_state")

op.drop_index("ix_assets_info_owner_name", table_name="assets_info")
op.drop_index("ix_assets_info_last_access_time", table_name="assets_info")
op.drop_index("ix_assets_info_created_at", table_name="assets_info")
op.drop_index("ix_assets_info_name", table_name="assets_info")
op.drop_index("ix_assets_info_asset_id", table_name="assets_info")
op.drop_index("ix_assets_info_owner_id", table_name="assets_info")
op.drop_table("assets_info")

# Truncate assets table (cascades handled by dropping dependent tables first)
op.execute("DELETE FROM assets")

# Create asset_references table
op.create_table(
"asset_references",
sa.Column("id", sa.String(length=36), primary_key=True),
sa.Column(
"asset_id",
sa.String(length=36),
sa.ForeignKey("assets.id", ondelete="CASCADE"),
nullable=False,
),
sa.Column("file_path", sa.Text(), nullable=True),
sa.Column("mtime_ns", sa.BigInteger(), nullable=True),
sa.Column(
"needs_verify",
sa.Boolean(),
nullable=False,
server_default=sa.text("false"),
),
sa.Column(
"is_missing", sa.Boolean(), nullable=False, server_default=sa.text("false")
),
sa.Column("enrichment_level", sa.Integer(), nullable=False, server_default="0"),
sa.Column("owner_id", sa.String(length=128), nullable=False, server_default=""),
sa.Column("name", sa.String(length=512), nullable=False),
sa.Column(
"preview_id",
sa.String(length=36),
sa.ForeignKey("assets.id", ondelete="SET NULL"),
nullable=True,
),
sa.Column("user_metadata", sa.JSON(), nullable=True),
sa.Column("created_at", sa.DateTime(timezone=False), nullable=False),
sa.Column("updated_at", sa.DateTime(timezone=False), nullable=False),
sa.Column("last_access_time", sa.DateTime(timezone=False), nullable=False),
sa.Column("deleted_at", sa.DateTime(timezone=False), nullable=True),
sa.CheckConstraint(
"(mtime_ns IS NULL) OR (mtime_ns >= 0)", name="ck_ar_mtime_nonneg"
),
sa.CheckConstraint(
"enrichment_level >= 0 AND enrichment_level <= 2",
name="ck_ar_enrichment_level_range",
),
)
op.create_index(
"uq_asset_references_file_path", "asset_references", ["file_path"], unique=True
)
op.create_index("ix_asset_references_asset_id", "asset_references", ["asset_id"])
op.create_index("ix_asset_references_owner_id", "asset_references", ["owner_id"])
op.create_index("ix_asset_references_name", "asset_references", ["name"])
op.create_index("ix_asset_references_is_missing", "asset_references", ["is_missing"])
op.create_index(
"ix_asset_references_enrichment_level", "asset_references", ["enrichment_level"]
)
op.create_index("ix_asset_references_created_at", "asset_references", ["created_at"])
op.create_index(
"ix_asset_references_last_access_time", "asset_references", ["last_access_time"]
)
op.create_index(
"ix_asset_references_owner_name", "asset_references", ["owner_id", "name"]
)
op.create_index("ix_asset_references_deleted_at", "asset_references", ["deleted_at"])

# Create asset_reference_tags table
op.create_table(
"asset_reference_tags",
sa.Column(
"asset_reference_id",
sa.String(length=36),
sa.ForeignKey("asset_references.id", ondelete="CASCADE"),
nullable=False,
),
sa.Column(
"tag_name",
sa.String(length=512),
sa.ForeignKey("tags.name", ondelete="RESTRICT"),
nullable=False,
),
sa.Column(
"origin", sa.String(length=32), nullable=False, server_default="manual"
),
sa.Column("added_at", sa.DateTime(timezone=False), nullable=False),
sa.PrimaryKeyConstraint(
"asset_reference_id", "tag_name", name="pk_asset_reference_tags"
),
)
op.create_index(
"ix_asset_reference_tags_tag_name", "asset_reference_tags", ["tag_name"]
)
op.create_index(
"ix_asset_reference_tags_asset_reference_id",
"asset_reference_tags",
["asset_reference_id"],
)

# Create asset_reference_meta table
op.create_table(
"asset_reference_meta",
sa.Column(
"asset_reference_id",
sa.String(length=36),
sa.ForeignKey("asset_references.id", ondelete="CASCADE"),
nullable=False,
),
sa.Column("key", sa.String(length=256), nullable=False),
sa.Column("ordinal", sa.Integer(), nullable=False, server_default="0"),
sa.Column("val_str", sa.String(length=2048), nullable=True),
sa.Column("val_num", sa.Numeric(38, 10), nullable=True),
sa.Column("val_bool", sa.Boolean(), nullable=True),
sa.Column("val_json", sa.JSON(), nullable=True),
sa.PrimaryKeyConstraint(
"asset_reference_id", "key", "ordinal", name="pk_asset_reference_meta"
),
)
op.create_index("ix_asset_reference_meta_key", "asset_reference_meta", ["key"])
op.create_index(
"ix_asset_reference_meta_key_val_str", "asset_reference_meta", ["key", "val_str"]
)
op.create_index(
"ix_asset_reference_meta_key_val_num", "asset_reference_meta", ["key", "val_num"]
)
op.create_index(
"ix_asset_reference_meta_key_val_bool",
"asset_reference_meta",
["key", "val_bool"],
)


def downgrade() -> None:
"""Reverse 0002_merge_to_asset_references: drop new tables, recreate old schema.

NOTE: Data is not recoverable. The upgrade discards all rows from the old
tables and truncates assets. After downgrade the old schema will be empty.
A filesystem rescan will repopulate data once the older code is running.
"""
# Drop new tables (order matters due to FK constraints)
op.drop_index("ix_asset_reference_meta_key_val_bool", table_name="asset_reference_meta")
op.drop_index("ix_asset_reference_meta_key_val_num", table_name="asset_reference_meta")
op.drop_index("ix_asset_reference_meta_key_val_str", table_name="asset_reference_meta")
op.drop_index("ix_asset_reference_meta_key", table_name="asset_reference_meta")
op.drop_table("asset_reference_meta")

op.drop_index("ix_asset_reference_tags_asset_reference_id", table_name="asset_reference_tags")
op.drop_index("ix_asset_reference_tags_tag_name", table_name="asset_reference_tags")
op.drop_table("asset_reference_tags")

op.drop_index("ix_asset_references_deleted_at", table_name="asset_references")
op.drop_index("ix_asset_references_owner_name", table_name="asset_references")
op.drop_index("ix_asset_references_last_access_time", table_name="asset_references")
op.drop_index("ix_asset_references_created_at", table_name="asset_references")
op.drop_index("ix_asset_references_enrichment_level", table_name="asset_references")
op.drop_index("ix_asset_references_is_missing", table_name="asset_references")
op.drop_index("ix_asset_references_name", table_name="asset_references")
op.drop_index("ix_asset_references_owner_id", table_name="asset_references")
op.drop_index("ix_asset_references_asset_id", table_name="asset_references")
op.drop_index("uq_asset_references_file_path", table_name="asset_references")
op.drop_table("asset_references")

# Truncate assets (upgrade deleted all rows; downgrade starts fresh too)
op.execute("DELETE FROM assets")

# Recreate old tables from 0001_assets schema
op.create_table(
"assets_info",
sa.Column("id", sa.String(length=36), primary_key=True),
sa.Column("owner_id", sa.String(length=128), nullable=False, server_default=""),
sa.Column("name", sa.String(length=512), nullable=False),
sa.Column("asset_id", sa.String(length=36), sa.ForeignKey("assets.id", ondelete="RESTRICT"), nullable=False),
sa.Column("preview_id", sa.String(length=36), sa.ForeignKey("assets.id", ondelete="SET NULL"), nullable=True),
sa.Column("user_metadata", sa.JSON(), nullable=True),
sa.Column("created_at", sa.DateTime(timezone=False), nullable=False),
sa.Column("updated_at", sa.DateTime(timezone=False), nullable=False),
sa.Column("last_access_time", sa.DateTime(timezone=False), nullable=False),
sa.UniqueConstraint("asset_id", "owner_id", "name", name="uq_assets_info_asset_owner_name"),
)
op.create_index("ix_assets_info_owner_id", "assets_info", ["owner_id"])
op.create_index("ix_assets_info_asset_id", "assets_info", ["asset_id"])
op.create_index("ix_assets_info_name", "assets_info", ["name"])
op.create_index("ix_assets_info_created_at", "assets_info", ["created_at"])
op.create_index("ix_assets_info_last_access_time", "assets_info", ["last_access_time"])
op.create_index("ix_assets_info_owner_name", "assets_info", ["owner_id", "name"])

op.create_table(
"asset_cache_state",
sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True),
sa.Column("asset_id", sa.String(length=36), sa.ForeignKey("assets.id", ondelete="CASCADE"), nullable=False),
sa.Column("file_path", sa.Text(), nullable=False),
sa.Column("mtime_ns", sa.BigInteger(), nullable=True),
sa.Column("needs_verify", sa.Boolean(), nullable=False, server_default=sa.text("false")),
sa.CheckConstraint("(mtime_ns IS NULL) OR (mtime_ns >= 0)", name="ck_acs_mtime_nonneg"),
sa.UniqueConstraint("file_path", name="uq_asset_cache_state_file_path"),
)
op.create_index("ix_asset_cache_state_file_path", "asset_cache_state", ["file_path"])
op.create_index("ix_asset_cache_state_asset_id", "asset_cache_state", ["asset_id"])

op.create_table(
"asset_info_tags",
sa.Column("asset_info_id", sa.String(length=36), sa.ForeignKey("assets_info.id", ondelete="CASCADE"), nullable=False),
sa.Column("tag_name", sa.String(length=512), sa.ForeignKey("tags.name", ondelete="RESTRICT"), nullable=False),
sa.Column("origin", sa.String(length=32), nullable=False, server_default="manual"),
sa.Column("added_at", sa.DateTime(timezone=False), nullable=False),
sa.PrimaryKeyConstraint("asset_info_id", "tag_name", name="pk_asset_info_tags"),
)
op.create_index("ix_asset_info_tags_tag_name", "asset_info_tags", ["tag_name"])
op.create_index("ix_asset_info_tags_asset_info_id", "asset_info_tags", ["asset_info_id"])

op.create_table(
"asset_info_meta",
sa.Column("asset_info_id", sa.String(length=36), sa.ForeignKey("assets_info.id", ondelete="CASCADE"), nullable=False),
sa.Column("key", sa.String(length=256), nullable=False),
sa.Column("ordinal", sa.Integer(), nullable=False, server_default="0"),
sa.Column("val_str", sa.String(length=2048), nullable=True),
sa.Column("val_num", sa.Numeric(38, 10), nullable=True),
sa.Column("val_bool", sa.Boolean(), nullable=True),
sa.Column("val_json", sa.JSON(), nullable=True),
sa.PrimaryKeyConstraint("asset_info_id", "key", "ordinal", name="pk_asset_info_meta"),
)
op.create_index("ix_asset_info_meta_key", "asset_info_meta", ["key"])
op.create_index("ix_asset_info_meta_key_val_str", "asset_info_meta", ["key", "val_str"])
op.create_index("ix_asset_info_meta_key_val_num", "asset_info_meta", ["key", "val_num"])
op.create_index("ix_asset_info_meta_key_val_bool", "asset_info_meta", ["key", "val_bool"])
Loading
Loading