mirror of
https://github.com/comfyanonymous/ComfyUI.git
synced 2025-12-16 17:42:58 +08:00
convert nodes_openai.py to V3 schema (#10604)
This commit is contained in:
parent
1f3f7a2823
commit
e617cddf24
@ -1,73 +0,0 @@
|
|||||||
from __future__ import annotations
|
|
||||||
import aiohttp
|
|
||||||
import mimetypes
|
|
||||||
from typing import Union
|
|
||||||
from server import PromptServer
|
|
||||||
|
|
||||||
import numpy as np
|
|
||||||
from PIL import Image
|
|
||||||
import torch
|
|
||||||
import base64
|
|
||||||
from io import BytesIO
|
|
||||||
|
|
||||||
|
|
||||||
async def validate_and_cast_response(
|
|
||||||
response, timeout: int = None, node_id: Union[str, None] = None
|
|
||||||
) -> torch.Tensor:
|
|
||||||
"""Validates and casts a response to a torch.Tensor.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
response: The response to validate and cast.
|
|
||||||
timeout: Request timeout in seconds. Defaults to None (no timeout).
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
A torch.Tensor representing the image (1, H, W, C).
|
|
||||||
|
|
||||||
Raises:
|
|
||||||
ValueError: If the response is not valid.
|
|
||||||
"""
|
|
||||||
# validate raw JSON response
|
|
||||||
data = response.data
|
|
||||||
if not data or len(data) == 0:
|
|
||||||
raise ValueError("No images returned from API endpoint")
|
|
||||||
|
|
||||||
# Initialize list to store image tensors
|
|
||||||
image_tensors: list[torch.Tensor] = []
|
|
||||||
|
|
||||||
# Process each image in the data array
|
|
||||||
async with aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=timeout)) as session:
|
|
||||||
for img_data in data:
|
|
||||||
img_bytes: bytes
|
|
||||||
if img_data.b64_json:
|
|
||||||
img_bytes = base64.b64decode(img_data.b64_json)
|
|
||||||
elif img_data.url:
|
|
||||||
if node_id:
|
|
||||||
PromptServer.instance.send_progress_text(f"Result URL: {img_data.url}", node_id)
|
|
||||||
async with session.get(img_data.url) as resp:
|
|
||||||
if resp.status != 200:
|
|
||||||
raise ValueError("Failed to download generated image")
|
|
||||||
img_bytes = await resp.read()
|
|
||||||
else:
|
|
||||||
raise ValueError("Invalid image payload – neither URL nor base64 data present.")
|
|
||||||
|
|
||||||
pil_img = Image.open(BytesIO(img_bytes)).convert("RGBA")
|
|
||||||
arr = np.asarray(pil_img).astype(np.float32) / 255.0
|
|
||||||
image_tensors.append(torch.from_numpy(arr))
|
|
||||||
|
|
||||||
return torch.stack(image_tensors, dim=0)
|
|
||||||
|
|
||||||
|
|
||||||
def text_filepath_to_base64_string(filepath: str) -> str:
|
|
||||||
"""Converts a text file to a base64 string."""
|
|
||||||
with open(filepath, "rb") as f:
|
|
||||||
file_content = f.read()
|
|
||||||
return base64.b64encode(file_content).decode("utf-8")
|
|
||||||
|
|
||||||
|
|
||||||
def text_filepath_to_data_uri(filepath: str) -> str:
|
|
||||||
"""Converts a text file to a data URI."""
|
|
||||||
base64_string = text_filepath_to_base64_string(filepath)
|
|
||||||
mime_type, _ = mimetypes.guess_type(filepath)
|
|
||||||
if mime_type is None:
|
|
||||||
mime_type = "application/octet-stream"
|
|
||||||
return f"data:{mime_type};base64,{base64_string}"
|
|
||||||
File diff suppressed because it is too large
Load Diff
@ -18,6 +18,8 @@ from .conversions import (
|
|||||||
tensor_to_base64_string,
|
tensor_to_base64_string,
|
||||||
tensor_to_bytesio,
|
tensor_to_bytesio,
|
||||||
tensor_to_pil,
|
tensor_to_pil,
|
||||||
|
text_filepath_to_base64_string,
|
||||||
|
text_filepath_to_data_uri,
|
||||||
trim_video,
|
trim_video,
|
||||||
video_to_base64_string,
|
video_to_base64_string,
|
||||||
)
|
)
|
||||||
@ -75,6 +77,8 @@ __all__ = [
|
|||||||
"tensor_to_base64_string",
|
"tensor_to_base64_string",
|
||||||
"tensor_to_bytesio",
|
"tensor_to_bytesio",
|
||||||
"tensor_to_pil",
|
"tensor_to_pil",
|
||||||
|
"text_filepath_to_base64_string",
|
||||||
|
"text_filepath_to_data_uri",
|
||||||
"trim_video",
|
"trim_video",
|
||||||
"video_to_base64_string",
|
"video_to_base64_string",
|
||||||
# Validation utilities
|
# Validation utilities
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
import base64
|
import base64
|
||||||
import logging
|
import logging
|
||||||
import math
|
import math
|
||||||
|
import mimetypes
|
||||||
import uuid
|
import uuid
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
@ -12,7 +13,7 @@ from PIL import Image
|
|||||||
|
|
||||||
from comfy.utils import common_upscale
|
from comfy.utils import common_upscale
|
||||||
from comfy_api.latest import Input, InputImpl
|
from comfy_api.latest import Input, InputImpl
|
||||||
from comfy_api.util import VideoContainer, VideoCodec
|
from comfy_api.util import VideoCodec, VideoContainer
|
||||||
|
|
||||||
from ._helpers import mimetype_to_extension
|
from ._helpers import mimetype_to_extension
|
||||||
|
|
||||||
@ -451,3 +452,19 @@ def resize_mask_to_image(
|
|||||||
if not allow_gradient:
|
if not allow_gradient:
|
||||||
mask = (mask > 0.5).float()
|
mask = (mask > 0.5).float()
|
||||||
return mask
|
return mask
|
||||||
|
|
||||||
|
|
||||||
|
def text_filepath_to_base64_string(filepath: str) -> str:
|
||||||
|
"""Converts a text file to a base64 string."""
|
||||||
|
with open(filepath, "rb") as f:
|
||||||
|
file_content = f.read()
|
||||||
|
return base64.b64encode(file_content).decode("utf-8")
|
||||||
|
|
||||||
|
|
||||||
|
def text_filepath_to_data_uri(filepath: str) -> str:
|
||||||
|
"""Converts a text file to a data URI."""
|
||||||
|
base64_string = text_filepath_to_base64_string(filepath)
|
||||||
|
mime_type, _ = mimetypes.guess_type(filepath)
|
||||||
|
if mime_type is None:
|
||||||
|
mime_type = "application/octet-stream"
|
||||||
|
return f"data:{mime_type};base64,{base64_string}"
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user