mirror of
https://github.com/comfyanonymous/ComfyUI.git
synced 2026-05-03 13:52:31 +08:00
[Partner Nodes] ByteDance: virtual portrait library for regular images (#13638)
Some checks are pending
Python Linting / Run Ruff (push) Waiting to run
Python Linting / Run Pylint (push) Waiting to run
Full Comfy CI Workflow Runs / test-stable (12.1, , linux, 3.10, [self-hosted Linux], stable) (push) Waiting to run
Full Comfy CI Workflow Runs / test-stable (12.1, , linux, 3.11, [self-hosted Linux], stable) (push) Waiting to run
Full Comfy CI Workflow Runs / test-stable (12.1, , linux, 3.12, [self-hosted Linux], stable) (push) Waiting to run
Full Comfy CI Workflow Runs / test-unix-nightly (12.1, , linux, 3.11, [self-hosted Linux], nightly) (push) Waiting to run
Execution Tests / test (macos-latest) (push) Waiting to run
Execution Tests / test (ubuntu-latest) (push) Waiting to run
Execution Tests / test (windows-latest) (push) Waiting to run
Test server launches without errors / test (push) Waiting to run
Unit Tests / test (macos-latest) (push) Waiting to run
Unit Tests / test (ubuntu-latest) (push) Waiting to run
Unit Tests / test (windows-2022) (push) Waiting to run
Build package / Build Test (3.10) (push) Waiting to run
Build package / Build Test (3.11) (push) Waiting to run
Build package / Build Test (3.12) (push) Waiting to run
Build package / Build Test (3.13) (push) Waiting to run
Build package / Build Test (3.14) (push) Waiting to run
Some checks are pending
Python Linting / Run Ruff (push) Waiting to run
Python Linting / Run Pylint (push) Waiting to run
Full Comfy CI Workflow Runs / test-stable (12.1, , linux, 3.10, [self-hosted Linux], stable) (push) Waiting to run
Full Comfy CI Workflow Runs / test-stable (12.1, , linux, 3.11, [self-hosted Linux], stable) (push) Waiting to run
Full Comfy CI Workflow Runs / test-stable (12.1, , linux, 3.12, [self-hosted Linux], stable) (push) Waiting to run
Full Comfy CI Workflow Runs / test-unix-nightly (12.1, , linux, 3.11, [self-hosted Linux], nightly) (push) Waiting to run
Execution Tests / test (macos-latest) (push) Waiting to run
Execution Tests / test (ubuntu-latest) (push) Waiting to run
Execution Tests / test (windows-latest) (push) Waiting to run
Test server launches without errors / test (push) Waiting to run
Unit Tests / test (macos-latest) (push) Waiting to run
Unit Tests / test (ubuntu-latest) (push) Waiting to run
Unit Tests / test (windows-2022) (push) Waiting to run
Build package / Build Test (3.10) (push) Waiting to run
Build package / Build Test (3.11) (push) Waiting to run
Build package / Build Test (3.12) (push) Waiting to run
Build package / Build Test (3.13) (push) Waiting to run
Build package / Build Test (3.14) (push) Waiting to run
* feat(api-nodes-bytedance): use the virtual portrait library for regular images Signed-off-by: bigcat88 <bigcat88@icloud.com> * fix: include shape in image dedup hash Signed-off-by: bigcat88 <bigcat88@icloud.com> --------- Signed-off-by: bigcat88 <bigcat88@icloud.com>
This commit is contained in:
parent
38ecad8f8a
commit
b633244635
@ -157,6 +157,11 @@ class SeedanceCreateAssetResponse(BaseModel):
|
|||||||
asset_id: str = Field(...)
|
asset_id: str = Field(...)
|
||||||
|
|
||||||
|
|
||||||
|
class SeedanceVirtualLibraryCreateAssetRequest(BaseModel):
|
||||||
|
url: str = Field(..., description="Publicly accessible URL of the image asset to upload.")
|
||||||
|
hash: str = Field(..., description="Dedup key. Re-submitting the same hash returns the existing asset id.")
|
||||||
|
|
||||||
|
|
||||||
# Dollars per 1K tokens, keyed by (model_id, has_video_input).
|
# Dollars per 1K tokens, keyed by (model_id, has_video_input).
|
||||||
SEEDANCE2_PRICE_PER_1K_TOKENS = {
|
SEEDANCE2_PRICE_PER_1K_TOKENS = {
|
||||||
("dreamina-seedance-2-0-260128", False): 0.007,
|
("dreamina-seedance-2-0-260128", False): 0.007,
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
import hashlib
|
||||||
import logging
|
import logging
|
||||||
import math
|
import math
|
||||||
import re
|
import re
|
||||||
@ -20,6 +21,7 @@ from comfy_api_nodes.apis.bytedance import (
|
|||||||
SeedanceCreateAssetResponse,
|
SeedanceCreateAssetResponse,
|
||||||
SeedanceCreateVisualValidateSessionResponse,
|
SeedanceCreateVisualValidateSessionResponse,
|
||||||
SeedanceGetVisualValidateSessionResponse,
|
SeedanceGetVisualValidateSessionResponse,
|
||||||
|
SeedanceVirtualLibraryCreateAssetRequest,
|
||||||
Seedream4Options,
|
Seedream4Options,
|
||||||
Seedream4TaskCreationRequest,
|
Seedream4TaskCreationRequest,
|
||||||
TaskAudioContent,
|
TaskAudioContent,
|
||||||
@ -271,6 +273,30 @@ async def _wait_for_asset_active(cls: type[IO.ComfyNode], asset_id: str, group_i
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
async def _seedance_virtual_library_upload_image_asset(
|
||||||
|
cls: type[IO.ComfyNode],
|
||||||
|
image: torch.Tensor,
|
||||||
|
*,
|
||||||
|
wait_label: str = "Uploading image",
|
||||||
|
) -> str:
|
||||||
|
"""Upload an image into the caller's per-customer Seedance virtual library."""
|
||||||
|
public_url = await upload_image_to_comfyapi(cls, image, wait_label=wait_label)
|
||||||
|
normalized = image.detach().cpu().contiguous().to(torch.float32)
|
||||||
|
digest = hashlib.sha256()
|
||||||
|
digest.update(str(tuple(normalized.shape)).encode("utf-8"))
|
||||||
|
digest.update(b"\0")
|
||||||
|
digest.update(normalized.numpy().tobytes())
|
||||||
|
image_hash = digest.hexdigest()
|
||||||
|
create_resp = await sync_op(
|
||||||
|
cls,
|
||||||
|
ApiEndpoint(path="/proxy/seedance/virtual-library/assets", method="POST"),
|
||||||
|
response_model=SeedanceCreateAssetResponse,
|
||||||
|
data=SeedanceVirtualLibraryCreateAssetRequest(url=public_url, hash=image_hash),
|
||||||
|
)
|
||||||
|
await _wait_for_asset_active(cls, create_resp.asset_id, group_id="virtual-library")
|
||||||
|
return f"asset://{create_resp.asset_id}"
|
||||||
|
|
||||||
|
|
||||||
def _seedance2_price_extractor(model_id: str, has_video_input: bool):
|
def _seedance2_price_extractor(model_id: str, has_video_input: bool):
|
||||||
"""Returns a price_extractor closure for Seedance 2.0 poll_op."""
|
"""Returns a price_extractor closure for Seedance 2.0 poll_op."""
|
||||||
rate = SEEDANCE2_PRICE_PER_1K_TOKENS.get((model_id, has_video_input))
|
rate = SEEDANCE2_PRICE_PER_1K_TOKENS.get((model_id, has_video_input))
|
||||||
@ -1507,7 +1533,9 @@ class ByteDance2FirstLastFrameNode(IO.ComfyNode):
|
|||||||
if first_frame_asset_id:
|
if first_frame_asset_id:
|
||||||
first_frame_url = image_assets[first_frame_asset_id]
|
first_frame_url = image_assets[first_frame_asset_id]
|
||||||
else:
|
else:
|
||||||
first_frame_url = await upload_image_to_comfyapi(cls, first_frame, wait_label="Uploading first frame.")
|
first_frame_url = await _seedance_virtual_library_upload_image_asset(
|
||||||
|
cls, first_frame, wait_label="Uploading first frame."
|
||||||
|
)
|
||||||
|
|
||||||
content: list[TaskTextContent | TaskImageContent] = [
|
content: list[TaskTextContent | TaskImageContent] = [
|
||||||
TaskTextContent(text=model["prompt"]),
|
TaskTextContent(text=model["prompt"]),
|
||||||
@ -1527,7 +1555,9 @@ class ByteDance2FirstLastFrameNode(IO.ComfyNode):
|
|||||||
content.append(
|
content.append(
|
||||||
TaskImageContent(
|
TaskImageContent(
|
||||||
image_url=TaskImageContentUrl(
|
image_url=TaskImageContentUrl(
|
||||||
url=await upload_image_to_comfyapi(cls, last_frame, wait_label="Uploading last frame.")
|
url=await _seedance_virtual_library_upload_image_asset(
|
||||||
|
cls, last_frame, wait_label="Uploading last frame."
|
||||||
|
)
|
||||||
),
|
),
|
||||||
role="last_frame",
|
role="last_frame",
|
||||||
),
|
),
|
||||||
@ -1805,9 +1835,9 @@ class ByteDance2ReferenceNode(IO.ComfyNode):
|
|||||||
content.append(
|
content.append(
|
||||||
TaskImageContent(
|
TaskImageContent(
|
||||||
image_url=TaskImageContentUrl(
|
image_url=TaskImageContentUrl(
|
||||||
url=await upload_image_to_comfyapi(
|
url=await _seedance_virtual_library_upload_image_asset(
|
||||||
cls,
|
cls,
|
||||||
image=reference_images[key],
|
reference_images[key],
|
||||||
wait_label=f"Uploading image {i}",
|
wait_label=f"Uploading image {i}",
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user