mirror of
https://github.com/comfyanonymous/ComfyUI.git
synced 2025-07-27 16:26:39 +00:00
Merge branch 'master' into v3-definition
This commit is contained in:
commit
94e6119f9f
8
.github/ISSUE_TEMPLATE/bug-report.yml
vendored
8
.github/ISSUE_TEMPLATE/bug-report.yml
vendored
@ -15,6 +15,14 @@ body:
|
|||||||
steps to replicate what went wrong and others will be able to repeat your steps and see the same issue happen.
|
steps to replicate what went wrong and others will be able to repeat your steps and see the same issue happen.
|
||||||
|
|
||||||
If unsure, ask on the [ComfyUI Matrix Space](https://app.element.io/#/room/%23comfyui_space%3Amatrix.org) or the [Comfy Org Discord](https://discord.gg/comfyorg) first.
|
If unsure, ask on the [ComfyUI Matrix Space](https://app.element.io/#/room/%23comfyui_space%3Amatrix.org) or the [Comfy Org Discord](https://discord.gg/comfyorg) first.
|
||||||
|
- type: checkboxes
|
||||||
|
id: custom-nodes-test
|
||||||
|
attributes:
|
||||||
|
label: Custom Node Testing
|
||||||
|
description: Please confirm you have tried to reproduce the issue with all custom nodes disabled.
|
||||||
|
options:
|
||||||
|
- label: I have tried disabling custom nodes and the issue persists (see [how to disable custom nodes](https://docs.comfy.org/troubleshooting/custom-node-issues#step-1%3A-test-with-all-custom-nodes-disabled) if you need help)
|
||||||
|
required: true
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Expected Behavior
|
label: Expected Behavior
|
||||||
|
8
.github/ISSUE_TEMPLATE/user-support.yml
vendored
8
.github/ISSUE_TEMPLATE/user-support.yml
vendored
@ -11,6 +11,14 @@ body:
|
|||||||
**2:** You have made an effort to find public answers to your question before asking here. In other words, you googled it first, and scrolled through recent help topics.
|
**2:** You have made an effort to find public answers to your question before asking here. In other words, you googled it first, and scrolled through recent help topics.
|
||||||
|
|
||||||
If unsure, ask on the [ComfyUI Matrix Space](https://app.element.io/#/room/%23comfyui_space%3Amatrix.org) or the [Comfy Org Discord](https://discord.gg/comfyorg) first.
|
If unsure, ask on the [ComfyUI Matrix Space](https://app.element.io/#/room/%23comfyui_space%3Amatrix.org) or the [Comfy Org Discord](https://discord.gg/comfyorg) first.
|
||||||
|
- type: checkboxes
|
||||||
|
id: custom-nodes-test
|
||||||
|
attributes:
|
||||||
|
label: Custom Node Testing
|
||||||
|
description: Please confirm you have tried to reproduce the issue with all custom nodes disabled.
|
||||||
|
options:
|
||||||
|
- label: I have tried disabling custom nodes and the issue persists (see [how to disable custom nodes](https://docs.comfy.org/troubleshooting/custom-node-issues#step-1%3A-test-with-all-custom-nodes-disabled) if you need help)
|
||||||
|
required: true
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Your question
|
label: Your question
|
||||||
|
@ -102,6 +102,13 @@ def model_sampling(model_config, model_type):
|
|||||||
return ModelSampling(model_config)
|
return ModelSampling(model_config)
|
||||||
|
|
||||||
|
|
||||||
|
def convert_tensor(extra, dtype):
|
||||||
|
if hasattr(extra, "dtype"):
|
||||||
|
if extra.dtype != torch.int and extra.dtype != torch.long:
|
||||||
|
extra = extra.to(dtype)
|
||||||
|
return extra
|
||||||
|
|
||||||
|
|
||||||
class BaseModel(torch.nn.Module):
|
class BaseModel(torch.nn.Module):
|
||||||
def __init__(self, model_config, model_type=ModelType.EPS, device=None, unet_model=UNetModel):
|
def __init__(self, model_config, model_type=ModelType.EPS, device=None, unet_model=UNetModel):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
@ -165,13 +172,13 @@ class BaseModel(torch.nn.Module):
|
|||||||
extra_conds = {}
|
extra_conds = {}
|
||||||
for o in kwargs:
|
for o in kwargs:
|
||||||
extra = kwargs[o]
|
extra = kwargs[o]
|
||||||
|
|
||||||
if hasattr(extra, "dtype"):
|
if hasattr(extra, "dtype"):
|
||||||
if extra.dtype != torch.int and extra.dtype != torch.long:
|
extra = convert_tensor(extra, dtype)
|
||||||
extra = extra.to(dtype)
|
elif isinstance(extra, list):
|
||||||
if isinstance(extra, list):
|
|
||||||
ex = []
|
ex = []
|
||||||
for ext in extra:
|
for ext in extra:
|
||||||
ex.append(ext.to(dtype))
|
ex.append(convert_tensor(ext, dtype))
|
||||||
extra = ex
|
extra = ex
|
||||||
extra_conds[o] = extra
|
extra_conds[o] = extra
|
||||||
|
|
||||||
|
@ -16,7 +16,8 @@ from inspect import cleandoc
|
|||||||
import torch
|
import torch
|
||||||
import comfy.utils
|
import comfy.utils
|
||||||
|
|
||||||
from comfy.comfy_types import FileLocator
|
from comfy.comfy_types import FileLocator, IO
|
||||||
|
from server import PromptServer
|
||||||
|
|
||||||
MAX_RESOLUTION = nodes.MAX_RESOLUTION
|
MAX_RESOLUTION = nodes.MAX_RESOLUTION
|
||||||
|
|
||||||
@ -491,6 +492,36 @@ class SaveSVGNode:
|
|||||||
counter += 1
|
counter += 1
|
||||||
return { "ui": { "images": results } }
|
return { "ui": { "images": results } }
|
||||||
|
|
||||||
|
class GetImageSize:
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def INPUT_TYPES(s):
|
||||||
|
return {
|
||||||
|
"required": {
|
||||||
|
"image": (IO.IMAGE,),
|
||||||
|
},
|
||||||
|
"hidden": {
|
||||||
|
"unique_id": "UNIQUE_ID",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RETURN_TYPES = (IO.INT, IO.INT)
|
||||||
|
RETURN_NAMES = ("width", "height")
|
||||||
|
FUNCTION = "get_size"
|
||||||
|
|
||||||
|
CATEGORY = "image"
|
||||||
|
DESCRIPTION = """Returns width and height of the image, and passes it through unchanged."""
|
||||||
|
|
||||||
|
def get_size(self, image, unique_id=None) -> tuple[int, int]:
|
||||||
|
height = image.shape[1]
|
||||||
|
width = image.shape[2]
|
||||||
|
|
||||||
|
# Send progress text to display size on the node
|
||||||
|
if unique_id:
|
||||||
|
PromptServer.instance.send_progress_text(f"width: {width}, height: {height}", unique_id)
|
||||||
|
|
||||||
|
return width, height
|
||||||
|
|
||||||
NODE_CLASS_MAPPINGS = {
|
NODE_CLASS_MAPPINGS = {
|
||||||
"ImageCrop": ImageCrop,
|
"ImageCrop": ImageCrop,
|
||||||
"RepeatImageBatch": RepeatImageBatch,
|
"RepeatImageBatch": RepeatImageBatch,
|
||||||
@ -500,4 +531,5 @@ NODE_CLASS_MAPPINGS = {
|
|||||||
"SaveAnimatedPNG": SaveAnimatedPNG,
|
"SaveAnimatedPNG": SaveAnimatedPNG,
|
||||||
"SaveSVGNode": SaveSVGNode,
|
"SaveSVGNode": SaveSVGNode,
|
||||||
"ImageStitch": ImageStitch,
|
"ImageStitch": ImageStitch,
|
||||||
|
"GetImageSize": GetImageSize,
|
||||||
}
|
}
|
||||||
|
1
nodes.py
1
nodes.py
@ -2068,6 +2068,7 @@ NODE_DISPLAY_NAME_MAPPINGS = {
|
|||||||
"ImageQuantize": "Image Quantize",
|
"ImageQuantize": "Image Quantize",
|
||||||
"ImageSharpen": "Image Sharpen",
|
"ImageSharpen": "Image Sharpen",
|
||||||
"ImageScaleToTotalPixels": "Scale Image to Total Pixels",
|
"ImageScaleToTotalPixels": "Scale Image to Total Pixels",
|
||||||
|
"GetImageSize": "Get Image Size",
|
||||||
# _for_testing
|
# _for_testing
|
||||||
"VAEDecodeTiled": "VAE Decode (Tiled)",
|
"VAEDecodeTiled": "VAE Decode (Tiled)",
|
||||||
"VAEEncodeTiled": "VAE Encode (Tiled)",
|
"VAEEncodeTiled": "VAE Encode (Tiled)",
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
comfyui-frontend-package==1.21.3
|
comfyui-frontend-package==1.21.6
|
||||||
comfyui-workflow-templates==0.1.23
|
comfyui-workflow-templates==0.1.25
|
||||||
comfyui-embedded-docs==0.2.0
|
comfyui-embedded-docs==0.2.0
|
||||||
torch
|
torch
|
||||||
torchsde
|
torchsde
|
||||||
|
@ -391,7 +391,7 @@ class PromptServer():
|
|||||||
async def view_image(request):
|
async def view_image(request):
|
||||||
if "filename" in request.rel_url.query:
|
if "filename" in request.rel_url.query:
|
||||||
filename = request.rel_url.query["filename"]
|
filename = request.rel_url.query["filename"]
|
||||||
filename,output_dir = folder_paths.annotated_filepath(filename)
|
filename, output_dir = folder_paths.annotated_filepath(filename)
|
||||||
|
|
||||||
if not filename:
|
if not filename:
|
||||||
return web.Response(status=400)
|
return web.Response(status=400)
|
||||||
@ -477,9 +477,8 @@ class PromptServer():
|
|||||||
# Get content type from mimetype, defaulting to 'application/octet-stream'
|
# Get content type from mimetype, defaulting to 'application/octet-stream'
|
||||||
content_type = mimetypes.guess_type(filename)[0] or 'application/octet-stream'
|
content_type = mimetypes.guess_type(filename)[0] or 'application/octet-stream'
|
||||||
|
|
||||||
# For security, force certain extensions to download instead of display
|
# For security, force certain mimetypes to download instead of display
|
||||||
file_extension = os.path.splitext(filename)[1].lower()
|
if content_type in {'text/html', 'text/html-sandboxed', 'application/xhtml+xml', 'text/javascript', 'text/css'}:
|
||||||
if file_extension in {'.html', '.htm', '.js', '.css'}:
|
|
||||||
content_type = 'application/octet-stream' # Forces download
|
content_type = 'application/octet-stream' # Forces download
|
||||||
|
|
||||||
return web.FileResponse(
|
return web.FileResponse(
|
||||||
|
@ -5,7 +5,10 @@ from unittest.mock import patch, MagicMock
|
|||||||
mock_nodes = MagicMock()
|
mock_nodes = MagicMock()
|
||||||
mock_nodes.MAX_RESOLUTION = 16384
|
mock_nodes.MAX_RESOLUTION = 16384
|
||||||
|
|
||||||
with patch.dict('sys.modules', {'nodes': mock_nodes}):
|
# Mock server module for PromptServer
|
||||||
|
mock_server = MagicMock()
|
||||||
|
|
||||||
|
with patch.dict('sys.modules', {'nodes': mock_nodes, 'server': mock_server}):
|
||||||
from comfy_extras.nodes_images import ImageStitch
|
from comfy_extras.nodes_images import ImageStitch
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user