Compare commits

...

19 Commits

Author SHA1 Message Date
Bellevue
2e1c579e0d
Merge 43d5c1188b into e11e9034ce 2026-07-07 19:02:16 +00:00
Dr.Lt.Data
e11e9034ce
Merge pull request #3058 from kgilper/update-krea-reference-sliders
Some checks failed
Python Linting / Run Ruff (push) Has been cancelled
Update ComfyUI Krea Reference description: Concept Slider nodes
2026-07-07 14:23:10 +09:00
Kevin Gilper
fb75c048bd Update ComfyUI Krea Reference description: Concept Slider nodes added 2026-07-07 01:01:16 -04:00
Dr.Lt.Data
f7fd701e19 update DB
Some checks are pending
Python Linting / Run Ruff (push) Waiting to run
2026-07-07 04:49:31 +09:00
Dr.Lt.Data
cf883eb762
Merge pull request #3057 from Azornes/azornes-resolutionmaster-preemption
Add ResolutionMaster preemption for Comfyui-Resolution-Master
2026-07-07 03:49:16 +09:00
Dariusz L
45891097bb Add ResolutionMaster preemption for Comfyui-Resolution-Master 2026-07-06 19:14:59 +02:00
craftingmod
43d5c1188b Merge branch 'main' into fix-cache-dir 2026-07-04 11:45:13 +09:00
craftingmod
f0919a4bbe Merge branch 'main' into fix-cache-dir 2026-07-01 02:17:47 +09:00
craftingmod
4da6b807f6 fix(cnr): wrong fallback in 'local' mode 2026-06-30 08:55:05 +09:00
craftingmod
b59eb64c22 perf(cnr): add cache 30-days expiration logic (again) 2026-06-30 08:46:22 +09:00
craftingmod
5513395ace fix(cnr): logical error while sync_mode = 'cache'
* Now correctly refresh cache if cache is created
 * Seperate cache update / cache created time
 * revert 7-day expiration logic
2026-06-30 08:24:42 +09:00
craftingmod
f3c003dd20 fix(cnr): propagate asyncio.TimeoutError in _get_cnr_data for correct bubble up 2026-06-30 07:28:05 +09:00
craftingmod
5427efda58 perf(cnr): add cache 7-day expiration logic
* for github star, download counts.
2026-06-30 07:19:49 +09:00
craftingmod
9a827e409a fix(cnr): eliminate client clock fallback dependency on timestamp sync 2026-06-30 06:47:41 +09:00
craftingmod
ec2023a5a3 refactor(cnr): fix cache-miss return type consistency to empty list 2026-06-30 06:38:06 +09:00
craftingmod
9a0b2c40f1 perf(cnr): optimize event loop blocking with asyncio.sleep and fix parameter encoding in fetch_all 2026-06-30 06:29:17 +09:00
craftingmod
62fd58524f Merge branch 'main' into fix-cache-dir 2026-06-30 06:14:09 +09:00
craftingmod
fb822c6f24 Perf(cnr): optimize ComfyRegistry loading using server-time incremental caching. 2026-06-30 06:07:52 +09:00
craftingmod
edcfb6a35a Chore: Replace print to logging in cnr_utils.py 2026-06-30 04:47:56 +09:00
8 changed files with 3969 additions and 4083 deletions

View File

@ -33152,6 +33152,9 @@
"https://github.com/Azornes/Comfyui-Resolution-Master"
],
"install_type": "git-clone",
"preemptions": [
"ResolutionMaster"
],
"description": " Precise resolution and aspect ratio control for ComfyUI"
},
{
@ -54041,7 +54044,7 @@
"https://github.com/kgilper/krea-reference"
],
"install_type": "git-clone",
"description": "Give each reference image a job before it reaches Krea 2. Guide cards assign per-image roles (keep the same subject, suggest the visual style, copy lighting or pose, big shapes only, avoid copying text/logos) and the stack encoder builds Krea conditioning with per-card strength, per-layer gains, and guarded prompt handling."
"description": "Give each reference image a job, and every attribute a dial. Guide cards assign per-image roles (keep the same subject, suggest the visual style, copy lighting or pose, big shapes only, avoid copying text/logos) with per-card strength, timing, and user-defined recipes - and Concept Slider cards turn any attribute you can name (brightness, age, fog density) into a training-free -6..+6 dial derived from Krea 2 text encoding."
},
{
"author": "DutchyDutch",

View File

@ -752,7 +752,6 @@
"GrsaiFluxKontext_MultiImageToImage",
"GrsaiFluxKontext_TextToImage",
"Grsai_GPTImage",
"Grsai_GPTImageVIP",
"Grsai_NanoBanana",
"Grsai_NanoBanana2",
"Grsai_NanoBananaPro"
@ -3988,6 +3987,9 @@
{
"author": "Azornes",
"description": "Logging Configuration",
"preemptions": [
"ResolutionMaster"
],
"title": "AzLogs",
"title_aux": "Comfyui-Resolution-Master"
}
@ -17719,6 +17721,18 @@
"title_aux": "ComfyUI-Montagen"
}
],
"https://github.com/Moon-NE/MoonNe_Nodes": [
[
"BatchConditionalText",
"BatchConditionalTextWeight",
"Moon_NE_Text_Concatenate",
"TextHorizontalToVertical",
"batch_randoml_text"
],
{
"title_aux": "MoonNe_Nodes"
}
],
"https://github.com/MoonHugo/ComfyUI-BAGEL-Hugo": [
[
"BagelByHugo"
@ -20976,223 +20990,6 @@
"title_aux": "ComfyUI-PromptUtils"
}
],
"https://github.com/Runware/ComfyUI-Runware": [
[
"Runware 3D Inference",
"Runware 3D Inference Inputs",
"Runware 3D Inference Settings",
"Runware 3D Inference Settings Draco Compression",
"Runware 3D Inference Settings Mesh Cluster",
"Runware 3D Inference Settings Shape Slat",
"Runware 3D Inference Settings Sparse Structure",
"Runware 3D Inference Settings Tex Slat",
"Runware 3D Model Search",
"Runware API Manager",
"Runware Accelerator Options",
"Runware Alibaba Provider Settings",
"Runware Audio Inference",
"Runware Audio Inference Inputs",
"Runware Audio Inference Inputs Reference Audio",
"Runware Audio Inference Settings",
"Runware Audio Inference Settings Voice Modify",
"Runware Audio Inference Speech",
"Runware Audio Inference Speech Voices",
"Runware Audio Model Search",
"Runware Audio Sections",
"Runware Background Removal",
"Runware BlackForest Labs Provider Settings",
"Runware Bria Provider Mask",
"Runware Bria Provider Settings",
"Runware Bytedance Provider Settings",
"Runware ControlNet",
"Runware ControlNet Combine",
"Runware ControlNet PreProcessor",
"Runware ElevenLabs Provider Settings",
"Runware ElevenLabs Provider Settings Sections",
"Runware Embedding Search",
"Runware Embeddings Combine",
"Runware Frame Images",
"Runware Google Provider Settings",
"Runware IPAdapter",
"Runware IPAdapters Combine",
"Runware Image Advanced Feature Input",
"Runware Image Caption",
"Runware Image Inference",
"Runware Image Inference Inputs",
"Runware Image Inference Inputs Fonts",
"Runware Image Inference Settings Color Palette",
"Runware Image Inference Settings Moodboards",
"Runware Image Inference Settings Prompt Enhance",
"Runware Image Inference Settings Scoring Rubric",
"Runware Image Inference Settings Scoring Rubric Combine",
"Runware Image Inference Settings Structured Prompt",
"Runware Image Inference Ultralytics",
"Runware Image Masking",
"Runware Image Upscaler",
"Runware Image Upscaler Settings",
"Runware Imagen Inference",
"Runware Input Audios",
"Runware Kling MultiPrompt Segment",
"Runware Kling Provider Settings MultiPrompt",
"Runware KlingAI Provider Settings",
"Runware Kontext Inference",
"Runware Lightricks Provider Settings",
"Runware Load Mesh",
"Runware Lora Combine",
"Runware Lora Search",
"Runware Luma Provider Settings",
"Runware Media Upload",
"Runware Midjourney Provider Settings",
"Runware MiniMax Provider Settings",
"Runware Mirelo Provider Settings",
"Runware Model Search",
"Runware Multi Inference",
"Runware OpenAI Provider Settings",
"Runware Outpaint",
"Runware PhotoMaker V2",
"Runware Pixverse Provider Settings",
"Runware Provider Settings Recraft Color",
"Runware Recraft Provider Settings",
"Runware Reference Audios",
"Runware Reference Images",
"Runware Reference Videos",
"Runware Reference Voices",
"Runware Refiner",
"Runware Regional Prompting Advanced Feature",
"Runware Regional Prompting Advanced Feature Regions",
"Runware Runway Provider Settings",
"Runware Safety Inputs",
"Runware Save 3D",
"Runware Save Image",
"Runware Save Text",
"Runware Settings",
"Runware Sourceful Provider Settings",
"Runware Sourceful Provider Settings Fonts",
"Runware Speech Inputs Combine",
"Runware Sync Provider Settings",
"Runware Sync Segment",
"Runware Text Inference",
"Runware Text Inference Inputs",
"Runware Text Inference Inputs Images",
"Runware Text Inference Inputs Videos",
"Runware Text Inference Message",
"Runware Text Inference Messages",
"Runware Text Inference Settings",
"Runware Text Inference Settings Cache",
"Runware Text Inference Tool Choice",
"Runware Text Model Search",
"Runware VAE Search",
"Runware Vectorize",
"Runware Video Advanced Feature Inputs",
"Runware Video Audio Input",
"Runware Video Background Removal",
"Runware Video Inference",
"Runware Video Inference Elements",
"Runware Video Inference Elements Combine",
"Runware Video Inference Inputs",
"Runware Video Inference Inputs Reference Audios",
"Runware Video Inference Inputs Reference Images",
"Runware Video Inference Inputs Reference Images Multiple Images Connector",
"Runware Video Inference Inputs Reference Videos",
"Runware Video Inference Inputs Reference Voices",
"Runware Video Inference Lora",
"Runware Video Inference Outputs",
"Runware Video Inference Settings",
"Runware Video Inference Settings Active Speaker Bounding Boxes",
"Runware Video Inference Settings Active Speaker Detection",
"Runware Video Inference Settings Edit",
"Runware Video Inference Settings Segments",
"Runware Video Inference Settings Source Position",
"Runware Video Inference Settings TTS",
"Runware Video Inference Speech Input",
"Runware Video Inputs Frame Images",
"Runware Video Inputs References",
"Runware Video Model Search",
"Runware Video Speech Input",
"Runware Video Transcription",
"Runware Video Upscaler",
"Runware Vidu Provider Settings",
"Runware Wan Animate Advanced Feature Settings",
"Runware Watermark Advanced Feature",
"Runware xAI Provider Settings",
"Runware3DInference",
"Runware3DInferenceInputs",
"Runware3DInferenceSettings",
"Runware3DInferenceSettingsDracoCompression",
"Runware3DInferenceSettingsMeshCluster",
"Runware3DInferenceSettingsShapeSlat",
"Runware3DInferenceSettingsSparseStructure",
"Runware3DInferenceSettingsTexSlat",
"RunwareAlibabaProviderSettings",
"RunwareAudioInferenceInputs",
"RunwareAudioInferenceReferenceVoices",
"RunwareAudioInferenceSpeech",
"RunwareAudioInferenceSpeechVoices",
"RunwareAudioInput",
"RunwareAudioSettings",
"RunwareAudioSettingsVoiceModify",
"RunwareBlackForestProviderSettings",
"RunwareBriaProviderMask",
"RunwareBriaProviderSettings",
"RunwareBytedanceProviderSettings",
"RunwareFrameImages",
"RunwareGoogleProviderSettings",
"RunwareImageInferenceAdvancedFeatures",
"RunwareImageInferenceSettingsPromptEnhance",
"RunwareImageInferenceSettingsStructuredPrompt",
"RunwareKlingMultiPromptSegment",
"RunwareKlingProviderSettings",
"RunwareKlingProviderSettingsMultiPrompt",
"RunwareLightricksProviderSettings",
"RunwareLoadMesh",
"RunwareLumaProviderSettings",
"RunwareMidjourneyProviderSettings",
"RunwareMiniMaxProviderSettings",
"RunwareMireloProviderSettings",
"RunwareOpenAIProviderSettings",
"RunwarePixverseProviderSettings",
"RunwareRecraftColor",
"RunwareRecraftProviderSettings",
"RunwareRegionalPromptingAdvancedFeature",
"RunwareRegionalPromptingAdvancedFeatureRegions",
"RunwareRunwayProviderSettings",
"RunwareSafetyInputs",
"RunwareSave3D",
"RunwareSourcefulProviderSettings",
"RunwareSourcefulProviderSettingsFonts",
"RunwareSpeechInput",
"RunwareSpeechInputCombine",
"RunwareSyncProviderSettings",
"RunwareSyncSegment",
"RunwareTextInferenceSettingsCache",
"RunwareTextInferenceToolChoice",
"RunwareUltralyticsInputs",
"RunwareUltralyticsProviderSettings",
"RunwareVectorize",
"RunwareVideoAdvancedFeatureInputs",
"RunwareVideoBgRemoval",
"RunwareVideoInferenceOutputs",
"RunwareVideoInferenceSettingsActiveSpeakerBoundingBoxes",
"RunwareVideoInferenceSettingsActiveSpeakerDetection",
"RunwareVideoInferenceSettingsControl",
"RunwareVideoInferenceSettingsSegments",
"RunwareVideoInferenceSettingsSourcePosition",
"RunwareVideoInferenceSettingsTts",
"RunwareVideoInferenceSpeechInput",
"RunwareVideoInputsFrameImages",
"RunwareVideoInputsReferenceImagesMultipleImagesConnector",
"RunwareVideoInputsReferences",
"RunwareVideoSettings",
"RunwareVideoUpscaler",
"RunwareWanAnimateAdvancedFeatureSettings",
"RunwareWatermarkAdvancedFeature",
"RunwareXAIProviderSettings",
"txt2vid"
],
{
"title_aux": "Runware.ai ComfyUI Inference API Integration"
}
],
"https://github.com/RyanHolanda/ComfyUI-AudioBridge": [
[
"AudioToTensor",
@ -25444,6 +25241,26 @@
"title_aux": "ComfyUI-RotoMask"
}
],
"https://github.com/TechnoWarrior2/comfyui-image-picker": [
[
"AlexImagePicker"
],
{
"author": "alex",
"description": "Pauses workflow and opens a new browser window to pick which images to pass through.",
"nickname": "Image Picker",
"title": "Alex Image Picker",
"title_aux": "ComfyUI Image Picker"
}
],
"https://github.com/TechnoWarrior2/comfyui-live-preview": [
[
"AlexLivePreview"
],
{
"title_aux": "ComfyUI Live Preview"
}
],
"https://github.com/TemryL/ComfyS3": [
[
"DownloadFileS3",
@ -48485,7 +48302,8 @@
],
"https://github.com/jtydhr88/ComfyUI-qwenmultiangle": [
[
"QwenMultiangleCameraNode"
"QwenMultiangleCameraNode",
"QwenMultiangleCameraTranslateNode"
],
{
"title_aux": "ComfyUI-qwenmultiangle"
@ -64003,6 +63821,22 @@
"title_aux": "comfyui-clippy-reloaded"
}
],
"https://github.com/shootthesound/comfyui-image-of-the-day": [
[
"ImageOfDayLoader"
],
{
"title_aux": "Image of the Day"
}
],
"https://github.com/shootthesound/comfyui-lora-FindingLora": [
[
"LoraLoaderFindingLora"
],
{
"title_aux": "Finding LoRA"
}
],
"https://github.com/shootthesound/comfyui-model-diff-to-lora": [
[
"ModelDiffToLoRA"
@ -72296,6 +72130,19 @@
"title_aux": "ComfyUI-KYNode"
}
],
"https://github.com/younestft/Comfy_EverAnimate": [
[
"ComfyEverAnimate",
"ComfyEverAnimateChunksCalculator",
"ComfyEverAnimateColorCorrection",
"ComfyEverAnimateContinueChunk",
"ComfyEverAnimateInitialChunk",
"ComfyEverAnimateMasterSettings"
],
{
"title_aux": "Comfy EverAnimate"
}
],
"https://github.com/younger15/ComfyUI-IterSwitch": [
[
"Iter_CLIPSwitch",

File diff suppressed because it is too large Load Diff

View File

@ -2,10 +2,12 @@ import asyncio
import json
import os
import platform
import time
from dataclasses import dataclass
from datetime import datetime, timedelta, timezone
from typing import List
from urllib.parse import urlencode
import logging
import manager_core
import manager_util
import requests
@ -17,108 +19,242 @@ base_url = "https://api.comfy.org"
lock = asyncio.Lock()
is_cache_loading = False
force_refresh_days = 30
async def get_cnr_data(cache_mode=True, dont_wait=True):
async def get_cnr_data(sync_mode=None, dont_wait=True, **kwargs):
# For backwards compatibility with keyword argument cache_mode
if sync_mode is None:
sync_mode = kwargs.get('cache_mode', 'cache')
try:
return await _get_cnr_data(cache_mode, dont_wait)
return await _get_cnr_data(sync_mode, dont_wait)
except asyncio.TimeoutError:
print("A timeout occurred during the fetch process from ComfyRegistry.")
return await _get_cnr_data(cache_mode=True, dont_wait=True) # timeout fallback
logging.error(f"[ComfyUI-Manager] A timeout occurred during the fetch process from ComfyRegistry.")
return await _get_cnr_data(sync_mode='local', dont_wait=True) # timeout fallback
async def _get_cnr_data(cache_mode=True, dont_wait=True):
def get_comfyui_ver():
is_desktop = bool(os.environ.get('__COMFYUI_DESKTOP_VERSION__'))
if is_desktop:
return manager_core.get_current_comfyui_ver() or 'unknown'
else:
return manager_core.get_comfyui_tag() or 'unknown'
def get_form_factor():
is_desktop = bool(os.environ.get('__COMFYUI_DESKTOP_VERSION__'))
system = platform.system().lower()
is_windows = system == 'windows'
is_mac = system == 'darwin'
is_linux = system == 'linux'
if is_desktop:
if is_windows:
return 'desktop-win'
elif is_mac:
return 'desktop-mac'
else:
return 'other'
else:
if is_windows:
return 'git-windows'
elif is_mac:
return 'git-mac'
elif is_linux:
return 'git-linux'
else:
return 'other'
def get_node_timestamp(node):
latest_ver = node.get('latest_version')
if isinstance(latest_ver, dict):
t = latest_ver.get('createdAt')
if t:
return t
return node.get('created_at')
async def _get_cnr_data(sync_mode=None, dont_wait=True, **kwargs):
global is_cache_loading
uri = f'{base_url}/nodes'
# For backwards compatibility with keyword argument cache_mode
if sync_mode is None:
sync_mode = kwargs.get('cache_mode', 'cache')
async def fetch_all():
# Normalize sync_mode for backwards compatibility
if sync_mode is True or sync_mode == 'cache' or sync_mode == 'local':
normalized_mode = 'cache'
elif sync_mode == 'force':
normalized_mode = 'force'
else:
normalized_mode = 'remote'
uri = f'{base_url}/nodes'
cache_path = manager_util.get_cache_path(uri)
comfyui_ver = get_comfyui_ver()
form_factor = get_form_factor()
cached_data = None
last_updated = None
full_nodes = {}
is_cache_expired = True
cache_built_at = None
cache_created_at = None
# Load local cache
if normalized_mode != 'force' and manager_util.get_cache_state(uri, expired_days=None) == 'cached':
try:
with open(cache_path, 'r', encoding="UTF-8", errors="ignore") as json_file:
cached_data = json.load(json_file)
# Check `force_refresh_days` cache database expiration for a full refresh sync
is_db_expired = True
cache_created_at = cached_data.get('cache_created_at')
if cache_created_at:
try:
created_dt = datetime.fromisoformat(cache_created_at.replace('Z', '+00:00'))
current_dt = datetime.now(timezone.utc)
delta_created = current_dt - created_dt
if timedelta(seconds=0) <= delta_created and delta_created < timedelta(days=force_refresh_days):
is_db_expired = False
except Exception:
pass
if not is_db_expired and (cached_data.get('comfyui_ver') == comfyui_ver and
cached_data.get('form_factor') == form_factor):
last_updated = cached_data.get('last_updated')
for node in cached_data.get('nodes', []):
full_nodes[node['id']] = node
else:
logging.info(f"[ComfyUI-Manager] Registry cache DB expired ({force_refresh_days} days) or environment changed. Invalidating local cache.")
cached_data = None
full_nodes = {}
last_updated = None
cache_created_at = None
except Exception as e:
logging.error(f"[ComfyUI-Manager] Failed to read cached data: {e}")
cached_data = None
full_nodes = {}
last_updated = None
# Separate cache expiration check (1-day period)
# It just determines cache is expired, not cache is exist.
if cached_data is not None:
cache_built_at = cached_data.get('cache_built_at')
if cache_built_at:
try:
built_dt = datetime.fromisoformat(cache_built_at.replace('Z', '+00:00'))
current_dt = datetime.now(timezone.utc)
delta_dt = current_dt - built_dt
if timedelta(seconds=0) <= delta_dt and delta_dt < timedelta(days=1):
is_cache_expired = False
except Exception:
pass
# Return Cached data when mode is 'cache'
if normalized_mode == 'cache':
is_cache_loading = True
if dont_wait and cached_data is not None:
is_cache_loading = False
return cached_data.get('nodes', [])
if cached_data is not None and (sync_mode == 'local' or not is_cache_expired):
is_cache_loading = False
return cached_data.get('nodes', [])
if sync_mode == 'local':
is_cache_loading = False
return []
# Fetch CNR
async def fetch_all(timestamp_filter, existing_nodes):
remained = True
page = 1
nodes_map = dict(existing_nodes)
full_nodes = {}
# Determine form factor based on environment and platform
is_desktop = bool(os.environ.get('__COMFYUI_DESKTOP_VERSION__'))
system = platform.system().lower()
is_windows = system == 'windows'
is_mac = system == 'darwin'
is_linux = system == 'linux'
# Get ComfyUI version tag
if is_desktop:
# extract version from pyproject.toml instead of git tag
comfyui_ver = manager_core.get_current_comfyui_ver() or 'unknown'
else:
comfyui_ver = manager_core.get_comfyui_tag() or 'unknown'
if is_desktop:
if is_windows:
form_factor = 'desktop-win'
elif is_mac:
form_factor = 'desktop-mac'
else:
form_factor = 'other'
else:
if is_windows:
form_factor = 'git-windows'
elif is_mac:
form_factor = 'git-mac'
elif is_linux:
form_factor = 'git-linux'
else:
form_factor = 'other'
while remained:
# Add comfyui_version and form_factor to the API request
sub_uri = f'{base_url}/nodes?page={page}&limit=30&comfyui_version={comfyui_ver}&form_factor={form_factor}'
sub_json_obj = await asyncio.wait_for(manager_util.get_data_with_cache(sub_uri, cache_mode=False, silent=True, dont_cache=True), timeout=30)
params = {
'page': page,
'limit': 30,
'comfyui_version': comfyui_ver,
'form_factor': form_factor,
}
if timestamp_filter:
params['timestamp'] = timestamp_filter
sub_uri = f'{base_url}/nodes?{urlencode(params)}'
sub_json_obj = await asyncio.wait_for(
manager_util.get_data_with_cache(sub_uri, cache_mode=False, silent=True, dont_cache=True),
timeout=30
)
remained = page < sub_json_obj['totalPages']
for x in sub_json_obj['nodes']:
full_nodes[x['id']] = x
nodes_map[x['id']] = x
if page % 5 == 0:
print(f"FETCH ComfyRegistry Data: {page}/{sub_json_obj['totalPages']}")
logging.info(f"[ComfyUI-Manager] FETCH ComfyRegistry Data: {page}/{sub_json_obj['totalPages']}")
page += 1
time.sleep(0.5)
await asyncio.sleep(0.5)
print("FETCH ComfyRegistry Data [DONE]")
logging.info(f"[ComfyUI-Manager] FETCH ComfyRegistry Data [DONE]")
for v in full_nodes.values():
for v in nodes_map.values():
if 'latest_version' not in v:
v['latest_version'] = dict(version='nightly')
return {'nodes': list(full_nodes.values())}
if cache_mode:
is_cache_loading = True
cache_state = manager_util.get_cache_state(uri)
if dont_wait:
if cache_state == 'not-cached':
return {}
else:
print("[ComfyUI-Manager] The ComfyRegistry cache update is still in progress, so an outdated cache is being used.")
with open(manager_util.get_cache_path(uri), 'r', encoding="UTF-8", errors="ignore") as json_file:
return json.load(json_file)['nodes']
if cache_state == 'cached':
with open(manager_util.get_cache_path(uri), 'r', encoding="UTF-8", errors="ignore") as json_file:
return json.load(json_file)['nodes']
return {'nodes': list(nodes_map.values())}
try:
json_obj = await fetch_all()
manager_util.save_to_cache(uri, json_obj)
return json_obj['nodes']
except:
res = {}
print("Cannot connect to comfyregistry.")
finally:
if cache_mode:
is_cache_loading = False
json_obj = await fetch_all(last_updated, full_nodes)
return res
# Set cache's timestamp as the maximum timestamp from fetched nodes.
# This way, in the next run, only the latest updates will be fetched.
timestamps = [get_node_timestamp(node) for node in json_obj['nodes'] if get_node_timestamp(node)]
max_timestamp = max(timestamps) if timestamps else None
timestamp_format = "%Y-%m-%dT%H:%M:%SZ"
if max_timestamp:
try:
ts_str = max_timestamp.replace('Z', '+00:00')
dt = datetime.fromisoformat(ts_str) - timedelta(seconds=10)
new_timestamp = dt.strftime(timestamp_format)
except Exception:
new_timestamp = max_timestamp
else:
new_timestamp = last_updated
new_cache_built_at = datetime.now(timezone.utc).strftime(timestamp_format)
if normalized_mode == 'force' or not cache_created_at:
new_cache_created_at = datetime.now(timezone.utc).strftime(timestamp_format)
else:
new_cache_created_at = cache_created_at
cache_to_save = {
'nodes': json_obj['nodes'],
'comfyui_ver': comfyui_ver,
'form_factor': form_factor,
'last_updated': new_timestamp,
'cache_built_at': new_cache_built_at,
'cache_created_at': new_cache_created_at
}
manager_util.save_to_cache(uri, cache_to_save)
return json_obj['nodes']
except asyncio.TimeoutError:
raise
except Exception as e:
logging.error(f"[ComfyUI-Manager] Cannot connect to comfyregistry or failed sync: {e}")
if cached_data is not None:
return cached_data.get('nodes', [])
return []
finally:
if normalized_mode == 'cache':
is_cache_loading = False
@dataclass
@ -237,7 +373,7 @@ def generate_cnr_id(fullpath, cnr_id):
with open(cnr_id_path, "w") as f:
return f.write(cnr_id)
except:
print(f"[ComfyUI Manager] unable to create file: {cnr_id_path}")
logging.error(f"[ComfyUI-Manager] unable to create file: {cnr_id_path}")
def read_cnr_id(fullpath):

View File

@ -811,7 +811,7 @@ class UnifiedManager:
dont_wait = True
# reload 'cnr_map' and 'repo_cnr_map'
cnrs = await cnr_utils.get_cnr_data(cache_mode=cache_mode=='cache', dont_wait=dont_wait)
cnrs = await cnr_utils.get_cnr_data(sync_mode=cache_mode, dont_wait=dont_wait)
for x in cnrs:
self.cnr_map[x['id']] = x

View File

@ -166,8 +166,10 @@ def simple_hash(input_string):
return hash_value
def is_file_created_within_days(file_path, days):
if days is None:
return True
def is_file_created_within_one_day(file_path):
if not os.path.exists(file_path):
return False
@ -175,8 +177,10 @@ def is_file_created_within_one_day(file_path):
current_time = datetime.now().timestamp()
time_difference = current_time - file_creation_time
return time_difference <= 86400
return time_difference <= (days * 86400)
def is_file_created_within_one_day(file_path):
return is_file_created_within_days(file_path, 1)
async def get_data(uri, silent=False):
if not silent:
@ -214,12 +218,12 @@ def get_cache_path(uri):
return os.path.join(cache_dir, cache_uri+'.json')
def get_cache_state(uri):
def get_cache_state(uri, expired_days=1):
cache_uri = get_cache_path(uri)
if not os.path.exists(cache_uri):
return "not-cached"
elif is_file_created_within_one_day(cache_uri):
elif is_file_created_within_days(cache_uri, expired_days):
return "cached"
return "expired"

View File

@ -4970,9 +4970,13 @@
"SV-ClearCustomCaches",
"SV-CompressConds",
"SV-CondDiffSharpening",
"SV-ConditioningArithmetic",
"SV-ConditioningInterferenceSchedule",
"SV-ConditioningMaskMerge",
"SV-ConditioningNoiseNudge",
"SV-ConditioningReroute",
"SV-ConditioningScaleJitter",
"SV-ConditioningScheduledBlend",
"SV-ConditioningTokenDropoutNudge",
"SV-ConsolePrint",
"SV-ConsolePrintLoop",
@ -5013,16 +5017,15 @@
"SV-HashModel",
"SV-HashObject",
"SV-IfBranch",
"SV-ImageInt",
"SV-ImageReroute",
"SV-InputSelect",
"SV-InputSelectBoolean",
"SV-InputSelectCompare",
"SV-IntMathOperation",
"SV-Krea2LocalStyleReferenceOld",
"SV-Krea2Reference",
"SV-Krea2ReferenceAdvanced",
"SV-Krea2ReferencePlus",
"SV-Krea2ResizeImage",
"SV-LLMArgs",
"SV-LLMRequest",
"SV-ListToAccumulationNode",
@ -5044,6 +5047,7 @@
"SV-PrecisionFloat",
"SV-PrimitiveFloat",
"SV-PrimitiveNone",
"SV-PromptGeneratorAPI",
"SV-PromptPlusModel",
"SV-PromptPlusModelOutput",
"SV-PromptProcessing",
@ -5056,11 +5060,14 @@
"SV-PromptProcessingSimple",
"SV-PromptProcessingVars",
"SV-RandomImage",
"SV-RegexMatch",
"SV-RegexReplace",
"SV-ResizeImage",
"SV-ResolutionSelector",
"SV-ResolutionSelector2",
"SV-ResolutionSelector2Output",
"SV-SamplerNameToSampler",
"SV-SaveImageCustom",
"SV-SaveTextFile",
"SV-ScaleConditioning",
"SV-SigmaAsFloat",
@ -5077,6 +5084,7 @@
"SV-SigmaReverse",
"SV-SigmaStartEnd",
"SV-SigmaStrength",
"SV-SimpleString",
"SV-SimpleText",
"SV-SkimmedCFGDifference",
"SV-SkimmedCFGDual",
@ -5096,7 +5104,8 @@
"SV-WhileLoopOpen",
"SV-WildcardLoader",
"SV-WildcardProcessing",
"SV-WildcardString"
"SV-WildcardString",
"SV-WorkflowAgent"
],
{
"title_aux": "SirVeggie/Custom nodes for ComfyUI"

View File

@ -752,7 +752,6 @@
"GrsaiFluxKontext_MultiImageToImage",
"GrsaiFluxKontext_TextToImage",
"Grsai_GPTImage",
"Grsai_GPTImageVIP",
"Grsai_NanoBanana",
"Grsai_NanoBanana2",
"Grsai_NanoBananaPro"
@ -3988,6 +3987,9 @@
{
"author": "Azornes",
"description": "Logging Configuration",
"preemptions": [
"ResolutionMaster"
],
"title": "AzLogs",
"title_aux": "Comfyui-Resolution-Master"
}
@ -17719,6 +17721,18 @@
"title_aux": "ComfyUI-Montagen"
}
],
"https://github.com/Moon-NE/MoonNe_Nodes": [
[
"BatchConditionalText",
"BatchConditionalTextWeight",
"Moon_NE_Text_Concatenate",
"TextHorizontalToVertical",
"batch_randoml_text"
],
{
"title_aux": "MoonNe_Nodes"
}
],
"https://github.com/MoonHugo/ComfyUI-BAGEL-Hugo": [
[
"BagelByHugo"
@ -20976,223 +20990,6 @@
"title_aux": "ComfyUI-PromptUtils"
}
],
"https://github.com/Runware/ComfyUI-Runware": [
[
"Runware 3D Inference",
"Runware 3D Inference Inputs",
"Runware 3D Inference Settings",
"Runware 3D Inference Settings Draco Compression",
"Runware 3D Inference Settings Mesh Cluster",
"Runware 3D Inference Settings Shape Slat",
"Runware 3D Inference Settings Sparse Structure",
"Runware 3D Inference Settings Tex Slat",
"Runware 3D Model Search",
"Runware API Manager",
"Runware Accelerator Options",
"Runware Alibaba Provider Settings",
"Runware Audio Inference",
"Runware Audio Inference Inputs",
"Runware Audio Inference Inputs Reference Audio",
"Runware Audio Inference Settings",
"Runware Audio Inference Settings Voice Modify",
"Runware Audio Inference Speech",
"Runware Audio Inference Speech Voices",
"Runware Audio Model Search",
"Runware Audio Sections",
"Runware Background Removal",
"Runware BlackForest Labs Provider Settings",
"Runware Bria Provider Mask",
"Runware Bria Provider Settings",
"Runware Bytedance Provider Settings",
"Runware ControlNet",
"Runware ControlNet Combine",
"Runware ControlNet PreProcessor",
"Runware ElevenLabs Provider Settings",
"Runware ElevenLabs Provider Settings Sections",
"Runware Embedding Search",
"Runware Embeddings Combine",
"Runware Frame Images",
"Runware Google Provider Settings",
"Runware IPAdapter",
"Runware IPAdapters Combine",
"Runware Image Advanced Feature Input",
"Runware Image Caption",
"Runware Image Inference",
"Runware Image Inference Inputs",
"Runware Image Inference Inputs Fonts",
"Runware Image Inference Settings Color Palette",
"Runware Image Inference Settings Moodboards",
"Runware Image Inference Settings Prompt Enhance",
"Runware Image Inference Settings Scoring Rubric",
"Runware Image Inference Settings Scoring Rubric Combine",
"Runware Image Inference Settings Structured Prompt",
"Runware Image Inference Ultralytics",
"Runware Image Masking",
"Runware Image Upscaler",
"Runware Image Upscaler Settings",
"Runware Imagen Inference",
"Runware Input Audios",
"Runware Kling MultiPrompt Segment",
"Runware Kling Provider Settings MultiPrompt",
"Runware KlingAI Provider Settings",
"Runware Kontext Inference",
"Runware Lightricks Provider Settings",
"Runware Load Mesh",
"Runware Lora Combine",
"Runware Lora Search",
"Runware Luma Provider Settings",
"Runware Media Upload",
"Runware Midjourney Provider Settings",
"Runware MiniMax Provider Settings",
"Runware Mirelo Provider Settings",
"Runware Model Search",
"Runware Multi Inference",
"Runware OpenAI Provider Settings",
"Runware Outpaint",
"Runware PhotoMaker V2",
"Runware Pixverse Provider Settings",
"Runware Provider Settings Recraft Color",
"Runware Recraft Provider Settings",
"Runware Reference Audios",
"Runware Reference Images",
"Runware Reference Videos",
"Runware Reference Voices",
"Runware Refiner",
"Runware Regional Prompting Advanced Feature",
"Runware Regional Prompting Advanced Feature Regions",
"Runware Runway Provider Settings",
"Runware Safety Inputs",
"Runware Save 3D",
"Runware Save Image",
"Runware Save Text",
"Runware Settings",
"Runware Sourceful Provider Settings",
"Runware Sourceful Provider Settings Fonts",
"Runware Speech Inputs Combine",
"Runware Sync Provider Settings",
"Runware Sync Segment",
"Runware Text Inference",
"Runware Text Inference Inputs",
"Runware Text Inference Inputs Images",
"Runware Text Inference Inputs Videos",
"Runware Text Inference Message",
"Runware Text Inference Messages",
"Runware Text Inference Settings",
"Runware Text Inference Settings Cache",
"Runware Text Inference Tool Choice",
"Runware Text Model Search",
"Runware VAE Search",
"Runware Vectorize",
"Runware Video Advanced Feature Inputs",
"Runware Video Audio Input",
"Runware Video Background Removal",
"Runware Video Inference",
"Runware Video Inference Elements",
"Runware Video Inference Elements Combine",
"Runware Video Inference Inputs",
"Runware Video Inference Inputs Reference Audios",
"Runware Video Inference Inputs Reference Images",
"Runware Video Inference Inputs Reference Images Multiple Images Connector",
"Runware Video Inference Inputs Reference Videos",
"Runware Video Inference Inputs Reference Voices",
"Runware Video Inference Lora",
"Runware Video Inference Outputs",
"Runware Video Inference Settings",
"Runware Video Inference Settings Active Speaker Bounding Boxes",
"Runware Video Inference Settings Active Speaker Detection",
"Runware Video Inference Settings Edit",
"Runware Video Inference Settings Segments",
"Runware Video Inference Settings Source Position",
"Runware Video Inference Settings TTS",
"Runware Video Inference Speech Input",
"Runware Video Inputs Frame Images",
"Runware Video Inputs References",
"Runware Video Model Search",
"Runware Video Speech Input",
"Runware Video Transcription",
"Runware Video Upscaler",
"Runware Vidu Provider Settings",
"Runware Wan Animate Advanced Feature Settings",
"Runware Watermark Advanced Feature",
"Runware xAI Provider Settings",
"Runware3DInference",
"Runware3DInferenceInputs",
"Runware3DInferenceSettings",
"Runware3DInferenceSettingsDracoCompression",
"Runware3DInferenceSettingsMeshCluster",
"Runware3DInferenceSettingsShapeSlat",
"Runware3DInferenceSettingsSparseStructure",
"Runware3DInferenceSettingsTexSlat",
"RunwareAlibabaProviderSettings",
"RunwareAudioInferenceInputs",
"RunwareAudioInferenceReferenceVoices",
"RunwareAudioInferenceSpeech",
"RunwareAudioInferenceSpeechVoices",
"RunwareAudioInput",
"RunwareAudioSettings",
"RunwareAudioSettingsVoiceModify",
"RunwareBlackForestProviderSettings",
"RunwareBriaProviderMask",
"RunwareBriaProviderSettings",
"RunwareBytedanceProviderSettings",
"RunwareFrameImages",
"RunwareGoogleProviderSettings",
"RunwareImageInferenceAdvancedFeatures",
"RunwareImageInferenceSettingsPromptEnhance",
"RunwareImageInferenceSettingsStructuredPrompt",
"RunwareKlingMultiPromptSegment",
"RunwareKlingProviderSettings",
"RunwareKlingProviderSettingsMultiPrompt",
"RunwareLightricksProviderSettings",
"RunwareLoadMesh",
"RunwareLumaProviderSettings",
"RunwareMidjourneyProviderSettings",
"RunwareMiniMaxProviderSettings",
"RunwareMireloProviderSettings",
"RunwareOpenAIProviderSettings",
"RunwarePixverseProviderSettings",
"RunwareRecraftColor",
"RunwareRecraftProviderSettings",
"RunwareRegionalPromptingAdvancedFeature",
"RunwareRegionalPromptingAdvancedFeatureRegions",
"RunwareRunwayProviderSettings",
"RunwareSafetyInputs",
"RunwareSave3D",
"RunwareSourcefulProviderSettings",
"RunwareSourcefulProviderSettingsFonts",
"RunwareSpeechInput",
"RunwareSpeechInputCombine",
"RunwareSyncProviderSettings",
"RunwareSyncSegment",
"RunwareTextInferenceSettingsCache",
"RunwareTextInferenceToolChoice",
"RunwareUltralyticsInputs",
"RunwareUltralyticsProviderSettings",
"RunwareVectorize",
"RunwareVideoAdvancedFeatureInputs",
"RunwareVideoBgRemoval",
"RunwareVideoInferenceOutputs",
"RunwareVideoInferenceSettingsActiveSpeakerBoundingBoxes",
"RunwareVideoInferenceSettingsActiveSpeakerDetection",
"RunwareVideoInferenceSettingsControl",
"RunwareVideoInferenceSettingsSegments",
"RunwareVideoInferenceSettingsSourcePosition",
"RunwareVideoInferenceSettingsTts",
"RunwareVideoInferenceSpeechInput",
"RunwareVideoInputsFrameImages",
"RunwareVideoInputsReferenceImagesMultipleImagesConnector",
"RunwareVideoInputsReferences",
"RunwareVideoSettings",
"RunwareVideoUpscaler",
"RunwareWanAnimateAdvancedFeatureSettings",
"RunwareWatermarkAdvancedFeature",
"RunwareXAIProviderSettings",
"txt2vid"
],
{
"title_aux": "Runware.ai ComfyUI Inference API Integration"
}
],
"https://github.com/RyanHolanda/ComfyUI-AudioBridge": [
[
"AudioToTensor",
@ -25444,6 +25241,26 @@
"title_aux": "ComfyUI-RotoMask"
}
],
"https://github.com/TechnoWarrior2/comfyui-image-picker": [
[
"AlexImagePicker"
],
{
"author": "alex",
"description": "Pauses workflow and opens a new browser window to pick which images to pass through.",
"nickname": "Image Picker",
"title": "Alex Image Picker",
"title_aux": "ComfyUI Image Picker"
}
],
"https://github.com/TechnoWarrior2/comfyui-live-preview": [
[
"AlexLivePreview"
],
{
"title_aux": "ComfyUI Live Preview"
}
],
"https://github.com/TemryL/ComfyS3": [
[
"DownloadFileS3",
@ -48485,7 +48302,8 @@
],
"https://github.com/jtydhr88/ComfyUI-qwenmultiangle": [
[
"QwenMultiangleCameraNode"
"QwenMultiangleCameraNode",
"QwenMultiangleCameraTranslateNode"
],
{
"title_aux": "ComfyUI-qwenmultiangle"
@ -64003,6 +63821,22 @@
"title_aux": "comfyui-clippy-reloaded"
}
],
"https://github.com/shootthesound/comfyui-image-of-the-day": [
[
"ImageOfDayLoader"
],
{
"title_aux": "Image of the Day"
}
],
"https://github.com/shootthesound/comfyui-lora-FindingLora": [
[
"LoraLoaderFindingLora"
],
{
"title_aux": "Finding LoRA"
}
],
"https://github.com/shootthesound/comfyui-model-diff-to-lora": [
[
"ModelDiffToLoRA"
@ -72296,6 +72130,19 @@
"title_aux": "ComfyUI-KYNode"
}
],
"https://github.com/younestft/Comfy_EverAnimate": [
[
"ComfyEverAnimate",
"ComfyEverAnimateChunksCalculator",
"ComfyEverAnimateColorCorrection",
"ComfyEverAnimateContinueChunk",
"ComfyEverAnimateInitialChunk",
"ComfyEverAnimateMasterSettings"
],
{
"title_aux": "Comfy EverAnimate"
}
],
"https://github.com/younger15/ComfyUI-IterSwitch": [
[
"Iter_CLIPSwitch",