fix(api-nodes): disambiguate deprecated partner-node display names

Five deprecated partner V1 nodes shared an exact display_name with their
live V2 replacements, so the node picker (and any object_info consumer)
showed two identically-named nodes and users/agents routinely landed on
the deprecated one. The headline case: OpenAIGPTImage1 (deprecated) and
OpenAIGPTImageNodeV2 (live) were both "OpenAI GPT Image 2", and the
deprecated node listed gpt-image-1 first in its model combo, nudging
picks onto an older, costlier-for-worse-output model even though it
already defaults to gpt-image-2.

For each of the five deprecated twins:
- append " (legacy)" to display_name so it no longer collides with the
  live node
- add a one-sentence description note: the class name is historical,
  kept only for existing-workflow compatibility, supports the current
  models, and names the live V2 class to prefer for new workflows
- reorder the model combo so the current model leads where it was
  stale-first (OpenAIGPTImage1: gpt-image-2 now leads; GeminiNode: the
  gemini-3.1 generation now leads). Grok, Nano Banana 2, and ByteDance
  Seedream already led with the current model, so their combos are
  unchanged.

Class names (node_id / class_type) are untouched, so existing workflows
referencing these nodes still load and run. Only display_name,
description, and combo order change; no object_info schema change.

The six ControlNet display_name collisions noted in the same analysis
live in core nodes, not comfy_api_nodes, and are left for a follow-up.
This commit is contained in:
Matt Miller 2026-07-17 17:35:11 -07:00
parent b08e6cf35f
commit 9489bd23f6
4 changed files with 36 additions and 13 deletions

View File

@ -545,9 +545,14 @@ class ByteDanceSeedreamNode(IO.ComfyNode):
def define_schema(cls):
return IO.Schema(
node_id="ByteDanceSeedreamNode",
display_name="ByteDance Seedream 4.5 & 5.0",
display_name="ByteDance Seedream 4.5 & 5.0 (legacy)",
category="partner/image/ByteDance",
description="Unified text-to-image generation and precise single-sentence editing at up to 4K resolution.",
description=(
"Unified text-to-image generation and precise single-sentence editing at up to 4K resolution. "
"This class name is historical and is kept only for compatibility with existing workflows; "
"it supports the current models, "
"so prefer the ByteDanceSeedreamNodeV2 ('ByteDance Seedream 4.5 & 5.0') node for new workflows."
),
inputs=[
IO.Combo.Input(
"model",

View File

@ -459,11 +459,14 @@ class GeminiNode(IO.ComfyNode):
def define_schema(cls):
return IO.Schema(
node_id="GeminiNode",
display_name="Google Gemini",
display_name="Google Gemini (legacy)",
category="partner/text/Gemini",
description="Generate text responses with Google's Gemini AI model. "
"You can provide multiple types of inputs (text, images, audio, video) "
"as context for generating more relevant and meaningful responses.",
"as context for generating more relevant and meaningful responses. "
"This class name is historical and is kept only for compatibility with existing workflows; "
"it supports the current Gemini models, "
"so prefer the GeminiNodeV2 ('Google Gemini') node for new workflows.",
inputs=[
IO.String.Input(
"prompt",
@ -475,11 +478,11 @@ class GeminiNode(IO.ComfyNode):
IO.Combo.Input(
"model",
options=[
"gemini-3-1-pro",
"gemini-3-1-flash-lite",
"gemini-2.5-pro",
"gemini-2.5-flash",
"gemini-3-pro-preview",
"gemini-3-1-pro",
"gemini-3-1-flash-lite",
],
default="gemini-3-1-pro",
tooltip="The Gemini model to use for generating responses.",
@ -1193,9 +1196,14 @@ class GeminiNanoBanana2(IO.ComfyNode):
def define_schema(cls):
return IO.Schema(
node_id="GeminiNanoBanana2",
display_name="Nano Banana 2",
display_name="Nano Banana 2 (legacy)",
category="partner/image/Gemini",
description="Generate or edit images synchronously via Google Vertex API.",
description=(
"Generate or edit images synchronously via Google Vertex API. "
"This class name is historical and is kept only for compatibility with existing workflows; "
"it supports the current models, "
"so prefer the GeminiNanoBanana2V2 ('Nano Banana 2') node for new workflows."
),
inputs=[
IO.String.Input(
"prompt",

View File

@ -227,9 +227,14 @@ class GrokImageEditNode(IO.ComfyNode):
def define_schema(cls):
return IO.Schema(
node_id="GrokImageEditNode",
display_name="Grok Image Edit",
display_name="Grok Image Edit (legacy)",
category="partner/image/Grok",
description="Modify an existing image based on a text prompt",
description=(
"Modify an existing image based on a text prompt. "
"This class name is historical and is kept only for compatibility with existing workflows; "
"it supports the current models, "
"so prefer the GrokImageEditNodeV2 ('Grok Image Edit') node for new workflows."
),
inputs=[
IO.Combo.Input(
"model",

View File

@ -383,9 +383,14 @@ class OpenAIGPTImage1(IO.ComfyNode):
def define_schema(cls):
return IO.Schema(
node_id="OpenAIGPTImage1",
display_name="OpenAI GPT Image 2",
display_name="OpenAI GPT Image 2 (legacy)",
category="partner/image/OpenAI",
description="Generates images synchronously via OpenAI's GPT Image endpoint.",
description=(
"Generates images synchronously via OpenAI's GPT Image endpoint. "
"This class name is historical and is kept only for compatibility with existing workflows; "
"the node is not limited to GPT Image 1 and defaults to the current gpt-image-2 model, "
"so prefer the OpenAIGPTImageNodeV2 ('OpenAI GPT Image 2') node for new workflows."
),
is_deprecated=True,
inputs=[
IO.String.Input(
@ -459,7 +464,7 @@ class OpenAIGPTImage1(IO.ComfyNode):
),
IO.Combo.Input(
"model",
options=["gpt-image-1", "gpt-image-1.5", "gpt-image-2"],
options=["gpt-image-2", "gpt-image-1.5", "gpt-image-1"],
default="gpt-image-2",
optional=True,
),