mirror of
https://github.com/comfyanonymous/ComfyUI.git
synced 2026-07-10 16:37:36 +08:00
Merge branch 'master' into pixal3d
This commit is contained in:
commit
4cf6a777f6
@ -4,12 +4,12 @@ early_access: false
|
|||||||
tone_instructions: "Only comment on issues introduced by this PR's changes. Do not flag pre-existing problems in moved, re-indented, or reformatted code."
|
tone_instructions: "Only comment on issues introduced by this PR's changes. Do not flag pre-existing problems in moved, re-indented, or reformatted code."
|
||||||
|
|
||||||
reviews:
|
reviews:
|
||||||
profile: "chill"
|
profile: "assertive"
|
||||||
request_changes_workflow: false
|
request_changes_workflow: true
|
||||||
high_level_summary: false
|
high_level_summary: false
|
||||||
poem: false
|
poem: false
|
||||||
review_status: false
|
review_status: false
|
||||||
review_details: false
|
review_details: true
|
||||||
commit_status: true
|
commit_status: true
|
||||||
collapse_walkthrough: true
|
collapse_walkthrough: true
|
||||||
changed_files_summary: false
|
changed_files_summary: false
|
||||||
@ -39,6 +39,14 @@ reviews:
|
|||||||
- path: "**"
|
- path: "**"
|
||||||
instructions: |
|
instructions: |
|
||||||
IMPORTANT: Only comment on issues directly introduced by this PR's code changes.
|
IMPORTANT: Only comment on issues directly introduced by this PR's code changes.
|
||||||
|
Treat AGENTS.md as mandatory repository policy, not optional style guidance.
|
||||||
|
Flag PR changes that violate AGENTS.md even when the code is otherwise functional.
|
||||||
|
In particular, enforce architecture boundaries, dtype/device/memory rules,
|
||||||
|
interface contracts, import style, no unnecessary try/except blocks, no inline
|
||||||
|
imports, no outbound internet paths in core ComfyUI, and narrow scoped fixes.
|
||||||
|
Prefer direct findings over suggestions when a rule is violated. Only ignore
|
||||||
|
AGENTS.md when it clearly conflicts with a newer explicit maintainer instruction
|
||||||
|
in the PR.
|
||||||
Do NOT flag pre-existing issues in code that was merely moved, re-indented,
|
Do NOT flag pre-existing issues in code that was merely moved, re-indented,
|
||||||
de-indented, or reformatted without logic changes. If code appears in the diff
|
de-indented, or reformatted without logic changes. If code appears in the diff
|
||||||
only due to whitespace or structural reformatting (e.g., removing a `with:` block),
|
only due to whitespace or structural reformatting (e.g., removing a `with:` block),
|
||||||
@ -123,5 +131,10 @@ chat:
|
|||||||
|
|
||||||
knowledge_base:
|
knowledge_base:
|
||||||
opt_out: false
|
opt_out: false
|
||||||
|
code_guidelines:
|
||||||
|
enabled: true
|
||||||
|
filePatterns:
|
||||||
|
- files: "AGENTS.md"
|
||||||
|
applyTo: "**"
|
||||||
learnings:
|
learnings:
|
||||||
scope: "auto"
|
scope: "auto"
|
||||||
|
|||||||
@ -171,6 +171,9 @@
|
|||||||
- Reuse existing model classes, blocks, ops, and helper modules when appropriate.
|
- Reuse existing model classes, blocks, ops, and helper modules when appropriate.
|
||||||
Before implementing a new version of a model component, search the existing
|
Before implementing a new version of a model component, search the existing
|
||||||
model code for a class or helper that already provides the behavior.
|
model code for a class or helper that already provides the behavior.
|
||||||
|
- Model detection code that inspects linear weight shapes should only use the
|
||||||
|
first dimension. The second dimension may be half the original size for
|
||||||
|
NVFP4 or other 4-bit quantized models.
|
||||||
- Avoid adding `einops` usage in core inference code. Use native torch tensor
|
- Avoid adding `einops` usage in core inference code. Use native torch tensor
|
||||||
ops such as `reshape`, `view`, `permute`, `transpose`, `flatten`, `unflatten`,
|
ops such as `reshape`, `view`, `permute`, `transpose`, `flatten`, `unflatten`,
|
||||||
`unsqueeze`, and `squeeze` instead.
|
`unsqueeze`, and `squeeze` instead.
|
||||||
|
|||||||
@ -543,18 +543,24 @@ class SDTokenizer:
|
|||||||
def _try_get_embedding(self, embedding_name:str):
|
def _try_get_embedding(self, embedding_name:str):
|
||||||
'''
|
'''
|
||||||
Takes a potential embedding name and tries to retrieve it.
|
Takes a potential embedding name and tries to retrieve it.
|
||||||
Returns a Tuple consisting of the embedding and any leftover string, embedding can be None.
|
Returns a Tuple consisting of the embedding, the cleaned embedding name, and any leftover string, embedding can be None.
|
||||||
'''
|
'''
|
||||||
split_embed = embedding_name.split()
|
split_embed = embedding_name.split()
|
||||||
embedding_name = split_embed[0]
|
embedding_name = split_embed[0]
|
||||||
leftover = ' '.join(split_embed[1:])
|
leftover = ' '.join(split_embed[1:])
|
||||||
|
|
||||||
|
match = re.search(r'[<\[]', embedding_name)
|
||||||
|
if match is not None:
|
||||||
|
leftover = embedding_name[match.start():] + (" " + leftover if leftover else "")
|
||||||
|
embedding_name = embedding_name[:match.start()]
|
||||||
|
|
||||||
embed = load_embed(embedding_name, self.embedding_directory, self.embedding_size, self.embedding_key)
|
embed = load_embed(embedding_name, self.embedding_directory, self.embedding_size, self.embedding_key)
|
||||||
if embed is None:
|
if embed is None:
|
||||||
stripped = embedding_name.strip(',')
|
stripped = embedding_name.strip(',')
|
||||||
if len(stripped) < len(embedding_name):
|
if len(stripped) < len(embedding_name):
|
||||||
embed = load_embed(stripped, self.embedding_directory, self.embedding_size, self.embedding_key)
|
embed = load_embed(stripped, self.embedding_directory, self.embedding_size, self.embedding_key)
|
||||||
return (embed, "{} {}".format(embedding_name[len(stripped):], leftover))
|
return (embed, embedding_name, "{} {}".format(embedding_name[len(stripped):], leftover))
|
||||||
return (embed, leftover)
|
return (embed, embedding_name, leftover)
|
||||||
|
|
||||||
def pad_tokens(self, tokens, amount):
|
def pad_tokens(self, tokens, amount):
|
||||||
if self.pad_left:
|
if self.pad_left:
|
||||||
@ -585,7 +591,7 @@ class SDTokenizer:
|
|||||||
tokens = []
|
tokens = []
|
||||||
for weighted_segment, weight in parsed_weights:
|
for weighted_segment, weight in parsed_weights:
|
||||||
to_tokenize = unescape_important(weighted_segment)
|
to_tokenize = unescape_important(weighted_segment)
|
||||||
split = re.split(' {0}|\n{0}'.format(self.embedding_identifier), to_tokenize)
|
split = re.split(r'(?<=\s){}'.format(re.escape(self.embedding_identifier)), to_tokenize)
|
||||||
to_tokenize = [split[0]]
|
to_tokenize = [split[0]]
|
||||||
for i in range(1, len(split)):
|
for i in range(1, len(split)):
|
||||||
to_tokenize.append("{}{}".format(self.embedding_identifier, split[i]))
|
to_tokenize.append("{}{}".format(self.embedding_identifier, split[i]))
|
||||||
@ -595,7 +601,7 @@ class SDTokenizer:
|
|||||||
# if we find an embedding, deal with the embedding
|
# if we find an embedding, deal with the embedding
|
||||||
if word.startswith(self.embedding_identifier) and self.embedding_directory is not None:
|
if word.startswith(self.embedding_identifier) and self.embedding_directory is not None:
|
||||||
embedding_name = word[len(self.embedding_identifier):].strip('\n')
|
embedding_name = word[len(self.embedding_identifier):].strip('\n')
|
||||||
embed, leftover = self._try_get_embedding(embedding_name)
|
embed, embedding_name, leftover = self._try_get_embedding(embedding_name)
|
||||||
if embed is None:
|
if embed is None:
|
||||||
logging.warning(f"warning, embedding:{embedding_name} does not exist, ignoring")
|
logging.warning(f"warning, embedding:{embedding_name} does not exist, ignoring")
|
||||||
else:
|
else:
|
||||||
|
|||||||
@ -2611,7 +2611,7 @@ class ByteDanceSeedAudioNode(IO.ComfyNode):
|
|||||||
return IO.Schema(
|
return IO.Schema(
|
||||||
node_id="ByteDanceSeedAudio",
|
node_id="ByteDanceSeedAudio",
|
||||||
display_name="ByteDance Seed Audio 1.0",
|
display_name="ByteDance Seed Audio 1.0",
|
||||||
category="api node/audio/ByteDance",
|
category="partner/audio/ByteDance",
|
||||||
description=(
|
description=(
|
||||||
"Generate speech, music, sound effects and multi-speaker dialogue from a single prompt "
|
"Generate speech, music, sound effects and multi-speaker dialogue from a single prompt "
|
||||||
"with ByteDance Seed Audio 1.0. Describe the voice(s), emotion, ambience, background music "
|
"with ByteDance Seed Audio 1.0. Describe the voice(s), emotion, ambience, background music "
|
||||||
|
|||||||
@ -16,23 +16,30 @@ class ColorToRGBInt(io.ComfyNode):
|
|||||||
],
|
],
|
||||||
outputs=[
|
outputs=[
|
||||||
io.Int.Output(display_name="rgb_int"),
|
io.Int.Output(display_name="rgb_int"),
|
||||||
io.Color.Output(display_name="hex")
|
io.Color.Output(display_name="hex"),
|
||||||
|
io.Float.Output(display_name="alpha"),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def execute(cls, color: str) -> io.NodeOutput:
|
def execute(cls, color: str) -> io.NodeOutput:
|
||||||
# expect format #RRGGBB
|
# expect format #RRGGBB or #RRGGBBAA
|
||||||
if len(color) != 7 or color[0] != "#":
|
if len(color) not in (7, 9) or color[0] != "#":
|
||||||
raise ValueError("Color must be in format #RRGGBB")
|
raise ValueError("Color must be in format #RRGGBB or #RRGGBBAA")
|
||||||
try:
|
try:
|
||||||
int(color[1:], 16)
|
int(color[1:], 16)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
raise ValueError("Color must be in format #RRGGBB") from None
|
raise ValueError("Color must be in format #RRGGBB or #RRGGBBAA") from None
|
||||||
|
|
||||||
|
alpha = 1.0
|
||||||
|
if len(color) == 9:
|
||||||
|
alpha = int(color[7:9], 16) / 255.0
|
||||||
|
color = color[:7]
|
||||||
|
|
||||||
r, g, b = hex_to_rgb(color)
|
r, g, b = hex_to_rgb(color)
|
||||||
|
|
||||||
rgb_int = r * 256 * 256 + g * 256 + b
|
rgb_int = r * 256 * 256 + g * 256 + b
|
||||||
return io.NodeOutput(rgb_int, color)
|
return io.NodeOutput(rgb_int, color, alpha)
|
||||||
|
|
||||||
|
|
||||||
class ColorExtension(ComfyExtension):
|
class ColorExtension(ComfyExtension):
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user