mirror of
https://github.com/comfyanonymous/ComfyUI.git
synced 2026-05-09 03:37:57 +08:00
Compare commits
5 Commits
alexis/cod
...
cursor/mar
| Author | SHA1 | Date | |
|---|---|---|---|
| 59c199d8e5 | |||
| 25757a53c9 | |||
| 1b25f1289e | |||
| e35348aa53 | |||
| cd8c7a2306 |
2
.github/workflows/stable-release.yml
vendored
2
.github/workflows/stable-release.yml
vendored
@ -145,6 +145,8 @@ jobs:
|
||||
cp -r ComfyUI/.ci/windows_${{ inputs.rel_name }}_base_files/* ./
|
||||
cp ../update_comfyui_and_python_dependencies.bat ./update/
|
||||
|
||||
echo 'local-portable' > ComfyUI/.comfy_environment
|
||||
|
||||
cd ..
|
||||
|
||||
"C:\Program Files\7-Zip\7z.exe" a -t7z -m0=lzma2 -mx=9 -mfb=128 -md=768m -ms=on -mf=BCJ2 ComfyUI_windows_portable.7z ComfyUI_windows_portable
|
||||
|
||||
@ -1,9 +1,2 @@
|
||||
# Admins
|
||||
* @comfyanonymous @kosinkadink @guill @alexisrolland @rattus128 @kijai
|
||||
|
||||
# Partner nodes team maintains API nodes
|
||||
/comfy_api_nodes/ @Comfy-Org/partner-nodes-mergers
|
||||
|
||||
# Frontend team maintains `comfyui-frontend-package`
|
||||
# Go to market team maintains `comfyui-workflow-templates` and `comfyui-embedded-docs`
|
||||
/requirements.txt @Comfy-Org/frontend-team @Comfy-Org/gtm-team
|
||||
@ -26,6 +26,7 @@ import uuid
|
||||
from typing import Callable, Optional
|
||||
|
||||
import torch
|
||||
import tqdm
|
||||
|
||||
import comfy.float
|
||||
import comfy.hooks
|
||||
@ -1651,7 +1652,11 @@ class ModelPatcherDynamic(ModelPatcher):
|
||||
self.model.model_loaded_weight_memory += casted_buf.numel() * casted_buf.element_size()
|
||||
|
||||
force_load_stat = f" Force pre-loaded {len(self.backup)} weights: {self.model.model_loaded_weight_memory // 1024} KB." if len(self.backup) > 0 else ""
|
||||
logging.info(f"Model {self.model.__class__.__name__} prepared for dynamic VRAM loading. {allocated_size // (1024 ** 2)}MB Staged. {num_patches} patches attached.{force_load_stat}")
|
||||
log_key = (self.patches_uuid, allocated_size, num_patches, len(self.backup), self.model.model_loaded_weight_memory)
|
||||
in_loop = bool(getattr(tqdm.tqdm, "_instances", None))
|
||||
level = logging.DEBUG if in_loop and getattr(self, "_last_prepare_log_key", None) == log_key else logging.INFO
|
||||
self._last_prepare_log_key = log_key
|
||||
logging.log(level, f"Model {self.model.__class__.__name__} prepared for dynamic VRAM loading. {allocated_size // (1024 ** 2)}MB Staged. {num_patches} patches attached.{force_load_stat}")
|
||||
|
||||
self.model.device = device_to
|
||||
self.model.current_weight_patches_uuid = self.patches_uuid
|
||||
|
||||
@ -54,7 +54,12 @@ class GrokImageNode(IO.ComfyNode):
|
||||
inputs=[
|
||||
IO.Combo.Input(
|
||||
"model",
|
||||
options=["grok-imagine-image-pro", "grok-imagine-image", "grok-imagine-image-beta"],
|
||||
options=[
|
||||
"grok-imagine-image-quality",
|
||||
"grok-imagine-image-pro",
|
||||
"grok-imagine-image",
|
||||
"grok-imagine-image-beta",
|
||||
],
|
||||
),
|
||||
IO.String.Input(
|
||||
"prompt",
|
||||
@ -111,10 +116,12 @@ class GrokImageNode(IO.ComfyNode):
|
||||
],
|
||||
is_api_node=True,
|
||||
price_badge=IO.PriceBadge(
|
||||
depends_on=IO.PriceBadgeDepends(widgets=["model", "number_of_images"]),
|
||||
depends_on=IO.PriceBadgeDepends(widgets=["model", "number_of_images", "resolution"]),
|
||||
expr="""
|
||||
(
|
||||
$rate := $contains(widgets.model, "pro") ? 0.07 : 0.02;
|
||||
$rate := widgets.model = "grok-imagine-image-quality"
|
||||
? (widgets.resolution = "1k" ? 0.05 : 0.07)
|
||||
: ($contains(widgets.model, "pro") ? 0.07 : 0.02);
|
||||
{"type":"usd","usd": $rate * widgets.number_of_images}
|
||||
)
|
||||
""",
|
||||
@ -167,7 +174,12 @@ class GrokImageEditNode(IO.ComfyNode):
|
||||
inputs=[
|
||||
IO.Combo.Input(
|
||||
"model",
|
||||
options=["grok-imagine-image-pro", "grok-imagine-image", "grok-imagine-image-beta"],
|
||||
options=[
|
||||
"grok-imagine-image-quality",
|
||||
"grok-imagine-image-pro",
|
||||
"grok-imagine-image",
|
||||
"grok-imagine-image-beta",
|
||||
],
|
||||
),
|
||||
IO.Image.Input("image", display_name="images"),
|
||||
IO.String.Input(
|
||||
@ -228,11 +240,19 @@ class GrokImageEditNode(IO.ComfyNode):
|
||||
],
|
||||
is_api_node=True,
|
||||
price_badge=IO.PriceBadge(
|
||||
depends_on=IO.PriceBadgeDepends(widgets=["model", "number_of_images"]),
|
||||
depends_on=IO.PriceBadgeDepends(widgets=["model", "number_of_images", "resolution"]),
|
||||
expr="""
|
||||
(
|
||||
$rate := $contains(widgets.model, "pro") ? 0.07 : 0.02;
|
||||
{"type":"usd","usd": 0.002 + $rate * widgets.number_of_images}
|
||||
$isQualityModel := widgets.model = "grok-imagine-image-quality";
|
||||
$isPro := $contains(widgets.model, "pro");
|
||||
$rate := $isQualityModel
|
||||
? (widgets.resolution = "1k" ? 0.05 : 0.07)
|
||||
: ($isPro ? 0.07 : 0.02);
|
||||
$base := $isQualityModel ? 0.01 : 0.002;
|
||||
$output := $rate * widgets.number_of_images;
|
||||
$isPro
|
||||
? {"type":"usd","usd": $base + $output}
|
||||
: {"type":"range_usd","min_usd": $base + $output, "max_usd": 3 * $base + $output}
|
||||
)
|
||||
""",
|
||||
),
|
||||
|
||||
189
openapi.yaml
189
openapi.yaml
@ -336,6 +336,35 @@ paths:
|
||||
"404":
|
||||
description: Job not found
|
||||
|
||||
/api/job/{job_id}/status:
|
||||
get:
|
||||
operationId: getJobStatus
|
||||
tags: [queue]
|
||||
summary: Get job status (legacy singular path)
|
||||
x-runtime: [cloud]
|
||||
deprecated: true
|
||||
description: |
|
||||
**Deprecated.** This endpoint is superseded by `GET /api/jobs/{job_id}`.
|
||||
Clients should migrate; the endpoint is retained for backward
|
||||
compatibility but will be removed in a future release.
|
||||
parameters:
|
||||
- name: job_id
|
||||
in: path
|
||||
description: The job ID to fetch status for.
|
||||
required: true
|
||||
schema:
|
||||
type: string
|
||||
format: uuid
|
||||
responses:
|
||||
"200":
|
||||
description: Job status
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: "#/components/schemas/JobDetailResponse"
|
||||
"404":
|
||||
description: Job not found
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# History
|
||||
# ---------------------------------------------------------------------------
|
||||
@ -423,6 +452,75 @@ paths:
|
||||
additionalProperties:
|
||||
$ref: "#/components/schemas/HistoryEntry"
|
||||
|
||||
/api/history_v2:
|
||||
get:
|
||||
operationId: getHistoryV2
|
||||
tags: [history]
|
||||
summary: Get execution history (v2 format)
|
||||
x-runtime: [cloud]
|
||||
deprecated: true
|
||||
description: |
|
||||
**Deprecated.** This endpoint is superseded by `GET /api/jobs`.
|
||||
Clients should migrate; the endpoint is retained for backward
|
||||
compatibility but will be removed in a future release.
|
||||
parameters:
|
||||
- $ref: "#/components/parameters/ComfyUserHeader"
|
||||
- name: limit
|
||||
in: query
|
||||
schema:
|
||||
type: integer
|
||||
description: Maximum number of history entries to return
|
||||
- name: offset
|
||||
in: query
|
||||
schema:
|
||||
type: integer
|
||||
default: 0
|
||||
description: Pagination offset
|
||||
responses:
|
||||
"200":
|
||||
description: History entries
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
items:
|
||||
type: array
|
||||
items:
|
||||
$ref: "#/components/schemas/HistoryEntry"
|
||||
pagination:
|
||||
$ref: "#/components/schemas/PaginationInfo"
|
||||
|
||||
/api/history_v2/{prompt_id}:
|
||||
get:
|
||||
operationId: getHistoryV2ByPromptId
|
||||
tags: [history]
|
||||
summary: Get v2 history for a specific prompt
|
||||
x-runtime: [cloud]
|
||||
deprecated: true
|
||||
description: |
|
||||
**Deprecated.** This endpoint is superseded by `GET /api/jobs/{prompt_id}`.
|
||||
Clients should migrate; the endpoint is retained for backward
|
||||
compatibility but will be removed in a future release.
|
||||
parameters:
|
||||
- $ref: "#/components/parameters/ComfyUserHeader"
|
||||
- name: prompt_id
|
||||
in: path
|
||||
description: The prompt ID to fetch history for.
|
||||
required: true
|
||||
schema:
|
||||
type: string
|
||||
format: uuid
|
||||
responses:
|
||||
"200":
|
||||
description: Single history entry
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: "#/components/schemas/HistoryEntry"
|
||||
"404":
|
||||
description: Prompt not found
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Upload
|
||||
# ---------------------------------------------------------------------------
|
||||
@ -579,6 +677,71 @@ paths:
|
||||
"404":
|
||||
description: File not found
|
||||
|
||||
/api/viewvideo:
|
||||
get:
|
||||
operationId: viewVideo
|
||||
tags: [view]
|
||||
summary: View or download a video file (legacy alias)
|
||||
x-runtime: [cloud]
|
||||
deprecated: true
|
||||
description: |
|
||||
**Deprecated.** This endpoint is an alias of `GET /api/view` added for
|
||||
legacy history-queue video playback. Callers should use `/api/view`
|
||||
directly; the endpoint is retained for backward compatibility but will
|
||||
be removed in a future release.
|
||||
parameters:
|
||||
- name: filename
|
||||
in: query
|
||||
required: true
|
||||
schema:
|
||||
type: string
|
||||
description: Name of the file to view
|
||||
- name: type
|
||||
in: query
|
||||
schema:
|
||||
type: string
|
||||
enum: [input, output, temp]
|
||||
default: output
|
||||
description: Directory type
|
||||
- name: subfolder
|
||||
in: query
|
||||
schema:
|
||||
type: string
|
||||
description: Subfolder within the directory
|
||||
- name: preview
|
||||
in: query
|
||||
schema:
|
||||
type: string
|
||||
description: Preview format hint (e.g. "webp;90")
|
||||
- name: channel
|
||||
in: query
|
||||
schema:
|
||||
type: string
|
||||
enum: [rgba, rgb, a]
|
||||
description: Channel extraction mode
|
||||
responses:
|
||||
"200":
|
||||
description: File content
|
||||
content:
|
||||
image/*:
|
||||
schema:
|
||||
type: string
|
||||
format: binary
|
||||
video/*:
|
||||
schema:
|
||||
type: string
|
||||
format: binary
|
||||
audio/*:
|
||||
schema:
|
||||
type: string
|
||||
format: binary
|
||||
application/octet-stream:
|
||||
schema:
|
||||
type: string
|
||||
format: binary
|
||||
"404":
|
||||
description: File not found
|
||||
|
||||
/api/view_metadata/{folder_name}:
|
||||
get:
|
||||
operationId: viewMetadata
|
||||
@ -679,6 +842,32 @@ paths:
|
||||
x-runtime: [cloud]
|
||||
description: "[cloud-only] How the templates version was resolved. Local ComfyUI returns null."
|
||||
|
||||
/api/logs:
|
||||
get:
|
||||
operationId: getLogs
|
||||
tags: [system]
|
||||
summary: Get server logs (placeholder)
|
||||
x-runtime: [cloud]
|
||||
deprecated: true
|
||||
description: |
|
||||
**Deprecated.** This endpoint returns a static placeholder response and
|
||||
provides no real log data. It is retained only to avoid breaking clients
|
||||
that still call it. Clients should remove their dependency; the endpoint
|
||||
will be removed in a future release.
|
||||
responses:
|
||||
"200":
|
||||
description: Static placeholder log response
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
logs:
|
||||
type: array
|
||||
items:
|
||||
type: string
|
||||
description: Log lines (always empty in current implementation)
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Node / Object Info
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
comfyui-frontend-package==1.43.17
|
||||
comfyui-workflow-templates==0.9.69
|
||||
comfyui-workflow-templates==0.9.72
|
||||
comfyui-embedded-docs==0.4.4
|
||||
torch
|
||||
torchsde
|
||||
|
||||
Reference in New Issue
Block a user