mirror of
https://github.com/comfyanonymous/ComfyUI.git
synced 2025-07-27 16:26:39 +00:00
73 lines
2.3 KiB
Python
73 lines
2.3 KiB
Python
from __future__ import annotations
|
|
import comfy.utils
|
|
import folder_paths
|
|
import logging
|
|
from abc import ABC, abstractmethod
|
|
from typing import Any
|
|
import torch
|
|
|
|
class ResourceKey(ABC):
|
|
Type = Any
|
|
def __init__(self):
|
|
...
|
|
|
|
class TorchDictFolderFilename(ResourceKey):
|
|
'''Key for requesting a torch file via file_name from a folder category.'''
|
|
Type = dict[str, torch.Tensor]
|
|
def __init__(self, folder_name: str, file_name: str):
|
|
self.folder_name = folder_name
|
|
self.file_name = file_name
|
|
|
|
def __hash__(self):
|
|
return hash((self.folder_name, self.file_name))
|
|
|
|
def __eq__(self, other: object) -> bool:
|
|
if not isinstance(other, TorchDictFolderFilename):
|
|
return False
|
|
return self.folder_name == other.folder_name and self.file_name == other.file_name
|
|
|
|
def __str__(self):
|
|
return f"{self.folder_name} -> {self.file_name}"
|
|
|
|
class Resources(ABC):
|
|
def __init__(self):
|
|
...
|
|
|
|
@abstractmethod
|
|
def get(self, key: ResourceKey, default: Any=...) -> Any:
|
|
pass
|
|
|
|
class ResourcesLocal(Resources):
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.local_resources: dict[ResourceKey, Any] = {}
|
|
|
|
def get(self, key: ResourceKey, default: Any=...) -> Any:
|
|
cached = self.local_resources.get(key, None)
|
|
if cached is not None:
|
|
logging.info(f"Using cached resource '{key}'")
|
|
return cached
|
|
logging.info(f"Loading resource '{key}'")
|
|
to_return = None
|
|
if isinstance(key, TorchDictFolderFilename):
|
|
if default is ...:
|
|
to_return = comfy.utils.load_torch_file(folder_paths.get_full_path_or_raise(key.folder_name, key.file_name), safe_load=True)
|
|
else:
|
|
full_path = folder_paths.get_full_path(key.folder_name, key.file_name)
|
|
if full_path is not None:
|
|
to_return = comfy.utils.load_torch_file(full_path, safe_load=True)
|
|
|
|
if to_return is not None:
|
|
self.local_resources[key] = to_return
|
|
return to_return
|
|
if default is not ...:
|
|
return default
|
|
raise Exception(f"Unsupported resource key type: {type(key)}")
|
|
|
|
|
|
class _RESOURCES:
|
|
ResourceKey = ResourceKey
|
|
TorchDictFolderFilename = TorchDictFolderFilename
|
|
Resources = Resources
|
|
ResourcesLocal = ResourcesLocal
|