Spaces:
Running
on
Zero
Running
on
Zero
| from __future__ import annotations | |
| from abc import ABC, abstractmethod | |
| from typing import Type, TYPE_CHECKING | |
| from comfy_api.internal import ComfyAPIBase | |
| from comfy_api.internal.singleton import ProxiedSingleton | |
| from comfy_api.internal.async_to_sync import create_sync_class | |
| from comfy_api.latest._input import ImageInput, AudioInput, MaskInput, LatentInput, VideoInput | |
| from comfy_api.latest._input_impl import VideoFromFile, VideoFromComponents | |
| from comfy_api.latest._util import VideoCodec, VideoContainer, VideoComponents | |
| from comfy_api.latest._io import _IO as io #noqa: F401 | |
| from comfy_api.latest._ui import _UI as ui #noqa: F401 | |
| # from comfy_api.latest._resources import _RESOURCES as resources #noqa: F401 | |
| from comfy_execution.utils import get_executing_context | |
| from comfy_execution.progress import get_progress_state, PreviewImageTuple | |
| from PIL import Image | |
| from comfy.cli_args import args | |
| import numpy as np | |
| class ComfyAPI_latest(ComfyAPIBase): | |
| VERSION = "latest" | |
| STABLE = False | |
| class Execution(ProxiedSingleton): | |
| async def set_progress( | |
| self, | |
| value: float, | |
| max_value: float, | |
| node_id: str | None = None, | |
| preview_image: Image.Image | ImageInput | None = None, | |
| ignore_size_limit: bool = False, | |
| ) -> None: | |
| """ | |
| Update the progress bar displayed in the ComfyUI interface. | |
| This function allows custom nodes and API calls to report their progress | |
| back to the user interface, providing visual feedback during long operations. | |
| Migration from previous API: comfy.utils.PROGRESS_BAR_HOOK | |
| """ | |
| executing_context = get_executing_context() | |
| if node_id is None and executing_context is not None: | |
| node_id = executing_context.node_id | |
| if node_id is None: | |
| raise ValueError("node_id must be provided if not in executing context") | |
| # Convert preview_image to PreviewImageTuple if needed | |
| to_display: PreviewImageTuple | Image.Image | ImageInput | None = preview_image | |
| if to_display is not None: | |
| # First convert to PIL Image if needed | |
| if isinstance(to_display, ImageInput): | |
| # Convert ImageInput (torch.Tensor) to PIL Image | |
| # Handle tensor shape [B, H, W, C] -> get first image if batch | |
| tensor = to_display | |
| if len(tensor.shape) == 4: | |
| tensor = tensor[0] | |
| # Convert to numpy array and scale to 0-255 | |
| image_np = (tensor.cpu().numpy() * 255).astype(np.uint8) | |
| to_display = Image.fromarray(image_np) | |
| if isinstance(to_display, Image.Image): | |
| # Detect image format from PIL Image | |
| image_format = to_display.format if to_display.format else "JPEG" | |
| # Use None for preview_size if ignore_size_limit is True | |
| preview_size = None if ignore_size_limit else args.preview_size | |
| to_display = (image_format, to_display, preview_size) | |
| get_progress_state().update_progress( | |
| node_id=node_id, | |
| value=value, | |
| max_value=max_value, | |
| image=to_display, | |
| ) | |
| execution: Execution | |
| class ComfyExtension(ABC): | |
| async def on_load(self) -> None: | |
| """ | |
| Called when an extension is loaded. | |
| This should be used to initialize any global resources neeeded by the extension. | |
| """ | |
| async def get_node_list(self) -> list[type[io.ComfyNode]]: | |
| """ | |
| Returns a list of nodes that this extension provides. | |
| """ | |
| class Input: | |
| Image = ImageInput | |
| Audio = AudioInput | |
| Mask = MaskInput | |
| Latent = LatentInput | |
| Video = VideoInput | |
| class InputImpl: | |
| VideoFromFile = VideoFromFile | |
| VideoFromComponents = VideoFromComponents | |
| class Types: | |
| VideoCodec = VideoCodec | |
| VideoContainer = VideoContainer | |
| VideoComponents = VideoComponents | |
| ComfyAPI = ComfyAPI_latest | |
| # Create a synchronous version of the API | |
| if TYPE_CHECKING: | |
| import comfy_api.latest.generated.ComfyAPISyncStub # type: ignore | |
| ComfyAPISync: Type[comfy_api.latest.generated.ComfyAPISyncStub.ComfyAPISyncStub] | |
| ComfyAPISync = create_sync_class(ComfyAPI_latest) | |
| __all__ = [ | |
| "ComfyAPI", | |
| "ComfyAPISync", | |
| "Input", | |
| "InputImpl", | |
| "Types", | |
| "ComfyExtension", | |
| ] | |