Conversation
🎨 Storybook Build Status✅ Build completed successfully! ⏰ Completed at: 02/04/2026, 01:13:04 AM UTC 🔗 Links🎨 Chromatic Visual Tests🎉 Your Storybook is ready for review! |
📝 WalkthroughWalkthroughBulk localization and node-definition updates across many locales: added asset/browser error texts, secrets UI strings, prompts, 3D file-type constants and HitPaw category; many nodeDefs updated to array-based multi-output signatures (GLB/FBX/OBJ); removed several Comfy_Load3D settings; package version bumped 1.39.5 → 1.39.6. Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 inconclusive)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
🎭 Playwright Tests:
|
0f9f30d to
898eaa9
Compare
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub. |
Bundle Size ReportSummary
Category Glance Per-category breakdownApp Entry Points — 22.5 kB (baseline 22.5 kB) • ⚪ 0 BMain entry bundles and manifests
Status: 1 added / 1 removed Graph Workspace — 838 kB (baseline 838 kB) • ⚪ 0 BGraph editor runtime, canvas, workflow orchestration
Status: 1 added / 1 removed Views & Navigation — 69 kB (baseline 69 kB) • ⚪ 0 BTop-level views, pages, and routed surfaces
Status: 9 added / 9 removed Panels & Settings — 410 kB (baseline 446 kB) • 🟢 -36 kBConfiguration panels, inspectors, and settings screens
Status: 23 added / 23 removed User & Accounts — 16 kB (baseline 16 kB) • ⚪ 0 BAuthentication, profile, and account management bundles
Status: 5 added / 5 removed Editors & Dialogs — 3.47 kB (baseline 3.47 kB) • ⚪ 0 BModals, dialogs, drawers, and in-app editors
Status: 2 added / 2 removed UI Components — 37.8 kB (baseline 37.8 kB) • ⚪ 0 BReusable component library chunks
Status: 6 added / 6 removed Data & Services — 2.1 MB (baseline 2.1 MB) • ⚪ 0 BStores, services, APIs, and repositories
Status: 11 added / 11 removed Utilities & Hooks — 234 kB (baseline 234 kB) • ⚪ 0 BHelpers, composables, and utility bundles
Status: 14 added / 14 removed Vendor & Third-Party — 9.37 MB (baseline 9.37 MB) • ⚪ 0 BExternal libraries and shared vendor chunks
Other — 7.08 MB (baseline 6.99 MB) • 🔴 +86.8 kBBundles that do not match a named category
Status: 77 added / 77 removed |
There was a problem hiding this comment.
Actionable comments posted: 8
🤖 Fix all issues with AI agents
In `@src/locales/ar/main.json`:
- Line 813: Change the Arabic translation value for the "extensions" key from
"الملحقات" to the consistent term "الإضافات" so it matches other occurrences in
the same locale file (update the "extensions" entry in
src/locales/ar/main.json).
In `@src/locales/ar/nodeDefs.json`:
- Around line 11430-11439: In the "ReferenceTimbreAudio" node definition update
the Arabic label for the "latent" input to use the consistent translated term
("كامن") instead of the English "latent": locate the "ReferenceTimbreAudio"
object and change the inputs.latent.name value to "كامن" so it matches other
Arabic node entries.
- Around line 2208-2210: The node title "EmptyAceStep1_5LatentAudio" has an
English display_name; update the "display_name" value for the
EmptyAceStep1_5LatentAudio entry in nodeDefs.json to the Arabic equivalent used
by neighboring Ace Step latent audio nodes so the UI label is fully localized
(locate the EmptyAceStep1_5LatentAudio key and replace its display_name string
with the appropriate Arabic translation).
In `@src/locales/es/nodeDefs.json`:
- Around line 7313-7323: The Spanish locale's "outputs" fields use array syntax
with null placeholders which mismatches the English object-indexed shape and
shifts ports; for each affected "outputs" entry (e.g., the snippet at lines
showing "outputs": [null, { "name": "GLB"... }, { "name": "FBX"... }]) convert
the array into an object with numeric-string keys that preserve the same index
positions (e.g., "0": null, "1": { "name": "GLB", ... }, "2": { "name": "FBX",
... }) so the structure matches the English locale; update every listed
occurrence of "outputs" in this file to use object-indexed keys
("0","1","2",...) preserving nulls and all inner properties.
In `@src/locales/fa/main.json`:
- Line 2434: The JSON value for the key "blueprintNamePrompt" uses the English
word "Subgraph" while other strings use the Persian "زیرگراف"; update the value
of "blueprintNamePrompt" to use "زیرگراف" (e.g., "نام زیرگراف:") for
consistency, and scan other locale keys for any remaining "Subgraph" occurrences
to align translations across the file.
In `@src/locales/fr/nodeDefs.json`:
- Around line 13934-13973: Update the French translation for the input key
"tags" in the TextEncodeAceStepAudio1_5 node to match the existing
TextEncodeAceStepAudio node: change the "name" value from "tags" to "balises" so
the "inputs.tags.name" for TextEncodeAceStepAudio1_5 uses "balises" (refer to
the JSON object for TextEncodeAceStepAudio1_5 and the "tags" input key).
In `@src/locales/ko/nodeDefs.json`:
- Around line 2211-2214: Update the "batch_size" localization entry's tooltip to
reference audio instead of images: change the tooltip value for the "batch_size"
key (currently "배치 내 latent 이미지의 수입니다.") to a Korean phrase that refers to
latent audio (for example, "배치 내 잠재 오디오의 수입니다."), ensuring the JSON key
"batch_size" is the only modified field.
In `@src/locales/ru/nodeDefs.json`:
- Around line 7313-7323: The RU locale's "outputs" entries use arrays while the
EN locale expects a dictionary/object of numeric-string keys; update each
affected node (e.g., MeshyAnimateModelNode, MeshyImageToModelNode,
MeshyMultiImageToModelNode, MeshyRefineNode, MeshyRigModelNode,
MeshyTextToModelNode, MeshyTextureNode, Rodin3D_Detail, Rodin3D_Gen2,
Rodin3D_Regular, Rodin3D_Sketch, Rodin3D_Smooth, TencentImageToModelNode,
TencentTextToModelNode, TripoImageToModelNode, TripoMultiviewToModelNode,
TripoRefineNode, TripoRetargetNode, TripoRigNode, TripoTextToModelNode,
TripoTextureNode) to use the same dictionary format as EN (e.g., replace arrays
like [null, {...}] with {"0": null, "1": {...}}), preserving each socket
object's keys ("name", "tooltip", etc.) so output socket labels and tooltips
align with the EN locale.
| "experimental": "تجريبي", | ||
| "export": "تصدير", | ||
| "extensionName": "اسم الامتداد", | ||
| "extensions": "الملحقات", |
There was a problem hiding this comment.
Use consistent Arabic term for “Extensions”.
Elsewhere in this file “Extensions” is translated as “الإضافات”. Consider aligning this label for consistency.
✏️ Suggested fix
- "extensions": "الملحقات",
+ "extensions": "الإضافات",📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "extensions": "الملحقات", | |
| "extensions": "الإضافات", |
🤖 Prompt for AI Agents
In `@src/locales/ar/main.json` at line 813, Change the Arabic translation value
for the "extensions" key from "الملحقات" to the consistent term "الإضافات" so it
matches other occurrences in the same locale file (update the "extensions" entry
in src/locales/ar/main.json).
| "EmptyAceStep1_5LatentAudio": { | ||
| "display_name": "Empty Ace Step 1.5 Latent Audio", | ||
| "inputs": { |
There was a problem hiding this comment.
Localize the new node title for consistency.
EmptyAceStep1_5LatentAudio is still in English while the neighboring Ace Step latent audio node is Arabic, so the Arabic UI will show a mixed-language label.
🔤 Suggested fix
- "display_name": "Empty Ace Step 1.5 Latent Audio",
+ "display_name": "صوت كامن فارغ Ace Step 1.5",📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "EmptyAceStep1_5LatentAudio": { | |
| "display_name": "Empty Ace Step 1.5 Latent Audio", | |
| "inputs": { | |
| "EmptyAceStep1_5LatentAudio": { | |
| "display_name": "صوت كامن فارغ Ace Step 1.5", | |
| "inputs": { |
🤖 Prompt for AI Agents
In `@src/locales/ar/nodeDefs.json` around lines 2208 - 2210, The node title
"EmptyAceStep1_5LatentAudio" has an English display_name; update the
"display_name" value for the EmptyAceStep1_5LatentAudio entry in nodeDefs.json
to the Arabic equivalent used by neighboring Ace Step latent audio nodes so the
UI label is fully localized (locate the EmptyAceStep1_5LatentAudio key and
replace its display_name string with the appropriate Arabic translation).
| "ReferenceTimbreAudio": { | ||
| "description": "تحدد هذه العقدة الصوت المرجعي للـ timbre (لـ ace step 1.5)", | ||
| "display_name": "ReferenceTimbreAudio", | ||
| "inputs": { | ||
| "conditioning": { | ||
| "name": "تهيئة" | ||
| }, | ||
| "latent": { | ||
| "name": "latent" | ||
| } |
There was a problem hiding this comment.
Translate the latent input label to match other Arabic entries.
Most nodes use "كامن" for latent inputs; leaving this as English is inconsistent in the Arabic UI.
🔤 Suggested fix
- "latent": {
- "name": "latent"
- }
+ "latent": {
+ "name": "كامن"
+ }🤖 Prompt for AI Agents
In `@src/locales/ar/nodeDefs.json` around lines 11430 - 11439, In the
"ReferenceTimbreAudio" node definition update the Arabic label for the "latent"
input to use the consistent translated term ("كامن") instead of the English
"latent": locate the "ReferenceTimbreAudio" object and change the
inputs.latent.name value to "كامن" so it matches other Arabic node entries.
| "outputs": [ | ||
| null, | ||
| { | ||
| "name": "GLB", | ||
| "tooltip": null | ||
| }, | ||
| { | ||
| "name": "FBX", | ||
| "tooltip": null | ||
| } | ||
| } | ||
| ] |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
python - <<'PY'
import json
from pathlib import Path
es_path = Path("src/locales/es/nodeDefs.json")
en_path = Path("src/locales/en/nodeDefs.json")
es = json.loads(es_path.read_text(encoding="utf-8"))
en = json.loads(en_path.read_text(encoding="utf-8"))
nodes = [
"MeshyAnimateModelNode",
"MeshyImageToModelNode",
"MeshyMultiImageToModelNode",
"MeshyRefineNode",
"MeshyRigModelNode",
"MeshyTextToModelNode",
"MeshyTextureNode",
"Rodin3D_Detail",
"Rodin3D_Gen2",
"Rodin3D_Regular",
"Rodin3D_Sketch",
"Rodin3D_Smooth",
"TencentImageToModelNode",
"TencentTextToModelNode",
"TripoImageToModelNode",
"TripoMultiviewToModelNode",
"TripoRefineNode",
"TripoRetargetNode",
"TripoRigNode",
"TripoTextToModelNode",
"TripoTextureNode",
]
def shape(outputs):
if isinstance(outputs, list):
return [None if o is None else "obj" for o in outputs]
if isinstance(outputs, dict):
return sorted(outputs.keys())
return type(outputs).__name__
mismatches = False
for node in nodes:
es_out = es.get(node, {}).get("outputs")
en_out = en.get(node, {}).get("outputs")
if es_out is None or en_out is None:
print(f"Missing outputs for {node}: es={es_out is not None} en={en_out is not None}")
mismatches = True
continue
es_shape = shape(es_out)
en_shape = shape(en_out)
if es_shape != en_shape:
print(f"Shape mismatch {node}:\n es={es_shape}\n en={en_shape}\n")
mismatches = True
if not mismatches:
print("OK: output shapes match between es and en for listed nodes.")
PYRepository: Comfy-Org/ComfyUI_frontend
Length of output: 1809
Fix critical output structure mismatch between Spanish and English locales.
Verification confirms all 21 nodes have structural mismatches: the Spanish locale uses array-based outputs with null placeholders, while the English locale uses object-indexed outputs. For example:
- Spanish:
[null, {name: "GLB", ...}, {name: "FBX", ...}] - English:
{"0": {...}, "1": {...}, "2": {...}}
This structural difference will cause mislabeled or shifted ports. Convert the Spanish definitions to match the English object-indexed structure.
Affected lines: 7313-7323, 7369-7380, 7426-7437, 7462-7473, 7491-7502, 7541-7552, 7579-7590, 11775-11782, 11803-11810, 11828-11835, 11847-11854, 11872-11879, 13860-13870, 13900-13910, 14529-14537, 14588-14596, 14606-14614, 14625-14633, 14641-14649, 14693-14701, 14724-14732
🤖 Prompt for AI Agents
In `@src/locales/es/nodeDefs.json` around lines 7313 - 7323, The Spanish locale's
"outputs" fields use array syntax with null placeholders which mismatches the
English object-indexed shape and shifts ports; for each affected "outputs" entry
(e.g., the snippet at lines showing "outputs": [null, { "name": "GLB"... }, {
"name": "FBX"... }]) convert the array into an object with numeric-string keys
that preserve the same index positions (e.g., "0": null, "1": { "name": "GLB",
... }, "2": { "name": "FBX", ... }) so the structure matches the English locale;
update every listed occurrence of "outputs" in this file to use object-indexed
keys ("0","1","2",...) preserving nulls and all inner properties.
| }, | ||
| "subgraphStore": { | ||
| "blueprintName": "نام زیرگراف", | ||
| "blueprintNamePrompt": "نام Subgraph:", |
There was a problem hiding this comment.
Consider localizing “Subgraph” for consistency.
Line 2434 uses the English term “Subgraph” while nearby strings use “زیرگراف”. Aligning the term would improve translation consistency.
Suggested tweak
- "blueprintNamePrompt": "نام Subgraph:",
+ "blueprintNamePrompt": "نام زیرگراف:",🤖 Prompt for AI Agents
In `@src/locales/fa/main.json` at line 2434, The JSON value for the key
"blueprintNamePrompt" uses the English word "Subgraph" while other strings use
the Persian "زیرگراف"; update the value of "blueprintNamePrompt" to use
"زیرگراف" (e.g., "نام زیرگراف:") for consistency, and scan other locale keys for
any remaining "Subgraph" occurrences to align translations across the file.
| "TextEncodeAceStepAudio1_5": { | ||
| "display_name": "TextEncodeAceStepAudio1.5", | ||
| "inputs": { | ||
| "bpm": { | ||
| "name": "bpm" | ||
| }, | ||
| "clip": { | ||
| "name": "clip" | ||
| }, | ||
| "control_after_generate": { | ||
| "name": "contrôle après génération" | ||
| }, | ||
| "duration": { | ||
| "name": "durée" | ||
| }, | ||
| "keyscale": { | ||
| "name": "tonalité" | ||
| }, | ||
| "language": { | ||
| "name": "langue" | ||
| }, | ||
| "lyrics": { | ||
| "name": "paroles" | ||
| }, | ||
| "seed": { | ||
| "name": "graine" | ||
| }, | ||
| "tags": { | ||
| "name": "tags" | ||
| }, | ||
| "timesignature": { | ||
| "name": "signature rythmique" | ||
| } | ||
| }, | ||
| "outputs": { | ||
| "0": { | ||
| "tooltip": null | ||
| } | ||
| } | ||
| }, |
There was a problem hiding this comment.
Translate tags to stay consistent with the other Ace Step audio node.
TextEncodeAceStepAudio uses “balises”; this one uses “tags”.
✏️ Suggested fix
- "tags": {
- "name": "tags"
- },
+ "tags": {
+ "name": "balises"
+ },📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "TextEncodeAceStepAudio1_5": { | |
| "display_name": "TextEncodeAceStepAudio1.5", | |
| "inputs": { | |
| "bpm": { | |
| "name": "bpm" | |
| }, | |
| "clip": { | |
| "name": "clip" | |
| }, | |
| "control_after_generate": { | |
| "name": "contrôle après génération" | |
| }, | |
| "duration": { | |
| "name": "durée" | |
| }, | |
| "keyscale": { | |
| "name": "tonalité" | |
| }, | |
| "language": { | |
| "name": "langue" | |
| }, | |
| "lyrics": { | |
| "name": "paroles" | |
| }, | |
| "seed": { | |
| "name": "graine" | |
| }, | |
| "tags": { | |
| "name": "tags" | |
| }, | |
| "timesignature": { | |
| "name": "signature rythmique" | |
| } | |
| }, | |
| "outputs": { | |
| "0": { | |
| "tooltip": null | |
| } | |
| } | |
| }, | |
| "TextEncodeAceStepAudio1_5": { | |
| "display_name": "TextEncodeAceStepAudio1.5", | |
| "inputs": { | |
| "bpm": { | |
| "name": "bpm" | |
| }, | |
| "clip": { | |
| "name": "clip" | |
| }, | |
| "control_after_generate": { | |
| "name": "contrôle après génération" | |
| }, | |
| "duration": { | |
| "name": "durée" | |
| }, | |
| "keyscale": { | |
| "name": "tonalité" | |
| }, | |
| "language": { | |
| "name": "langue" | |
| }, | |
| "lyrics": { | |
| "name": "paroles" | |
| }, | |
| "seed": { | |
| "name": "graine" | |
| }, | |
| "tags": { | |
| "name": "balises" | |
| }, | |
| "timesignature": { | |
| "name": "signature rythmique" | |
| } | |
| }, | |
| "outputs": { | |
| "0": { | |
| "tooltip": null | |
| } | |
| } | |
| }, |
🤖 Prompt for AI Agents
In `@src/locales/fr/nodeDefs.json` around lines 13934 - 13973, Update the French
translation for the input key "tags" in the TextEncodeAceStepAudio1_5 node to
match the existing TextEncodeAceStepAudio node: change the "name" value from
"tags" to "balises" so the "inputs.tags.name" for TextEncodeAceStepAudio1_5 uses
"balises" (refer to the JSON object for TextEncodeAceStepAudio1_5 and the "tags"
input key).
| "batch_size": { | ||
| "name": "배치 크기", | ||
| "tooltip": "배치 내 latent 이미지의 수입니다." | ||
| }, |
There was a problem hiding this comment.
Fix tooltip to reference latent audio (not images).
The batch_size tooltip mentions “latent 이미지” but this node is for audio.
✏️ Suggested fix
- "tooltip": "배치 내 latent 이미지의 수입니다."
+ "tooltip": "배치 내 latent 오디오의 수입니다."📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "batch_size": { | |
| "name": "배치 크기", | |
| "tooltip": "배치 내 latent 이미지의 수입니다." | |
| }, | |
| "batch_size": { | |
| "name": "배치 크기", | |
| "tooltip": "배치 내 latent 오디오의 수입니다." | |
| }, |
🤖 Prompt for AI Agents
In `@src/locales/ko/nodeDefs.json` around lines 2211 - 2214, Update the
"batch_size" localization entry's tooltip to reference audio instead of images:
change the tooltip value for the "batch_size" key (currently "배치 내 latent 이미지의
수입니다.") to a Korean phrase that refers to latent audio (for example, "배치 내 잠재
오디오의 수입니다."), ensuring the JSON key "batch_size" is the only modified field.
| "outputs": [ | ||
| null, | ||
| { | ||
| "name": "GLB", | ||
| "tooltip": null | ||
| }, | ||
| { | ||
| "name": "FBX", | ||
| "tooltip": null | ||
| } | ||
| } | ||
| ] |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
python - <<'PY'
import json
from pathlib import Path
ru = json.loads(Path("src/locales/ru/nodeDefs.json").read_text(encoding="utf-8"))
en = json.loads(Path("src/locales/en/nodeDefs.json").read_text(encoding="utf-8"))
nodes = [
"MeshyAnimateModelNode",
"MeshyImageToModelNode",
"MeshyMultiImageToModelNode",
"MeshyRefineNode",
"MeshyRigModelNode",
"MeshyTextToModelNode",
"MeshyTextureNode",
"Rodin3D_Detail",
"Rodin3D_Gen2",
"Rodin3D_Regular",
"Rodin3D_Sketch",
"Rodin3D_Smooth",
"TencentImageToModelNode",
"TencentTextToModelNode",
"TripoImageToModelNode",
"TripoMultiviewToModelNode",
"TripoRefineNode",
"TripoRetargetNode",
"TripoRigNode",
"TripoTextToModelNode",
"TripoTextureNode",
]
def shape(outputs):
if isinstance(outputs, list):
return ["null" if v is None else "obj" for v in outputs]
if isinstance(outputs, dict):
return {k: ("null" if v is None else "obj") for k, v in outputs.items()}
return type(outputs).__name__
missing = []
diffs = []
for n in nodes:
if n not in ru or n not in en:
missing.append(n)
continue
if shape(ru[n].get("outputs")) != shape(en[n].get("outputs")):
diffs.append(n)
if missing:
print("Missing in one locale:", ", ".join(missing))
if diffs:
print("Output schema mismatch:", ", ".join(diffs))
else:
print("Output schemas match for all listed nodes.")
PYRepository: Comfy-Org/ComfyUI_frontend
Length of output: 510
🏁 Script executed:
#!/bin/bash
python - <<'PY'
import json
from pathlib import Path
ru = json.loads(Path("src/locales/ru/nodeDefs.json").read_text(encoding="utf-8"))
en = json.loads(Path("src/locales/en/nodeDefs.json").read_text(encoding="utf-8"))
# Examine a sample node to see the actual difference
node = "TripoTextToModelNode"
print(f"EN {node} outputs:")
print(json.dumps(en[node].get("outputs"), indent=2))
print(f"\nRU {node} outputs:")
print(json.dumps(ru[node].get("outputs"), indent=2))
# Check another node
node2 = "MeshyTextureNode"
print(f"\n\nEN {node2} outputs:")
print(json.dumps(en[node2].get("outputs"), indent=2))
print(f"\nRU {node2} outputs:")
print(json.dumps(ru[node2].get("outputs"), indent=2))
PYRepository: Comfy-Org/ComfyUI_frontend
Length of output: 790
Output schema structures are fundamentally incompatible between EN and RU locales.
The EN locale uses dictionary format ({"0": {...}, "1": {...}}) while RU uses array format ([null, null, {...}]). All 21 nodes (MeshyAnimateModelNode, MeshyImageToModelNode, MeshyMultiImageToModelNode, MeshyRefineNode, MeshyRigModelNode, MeshyTextToModelNode, MeshyTextureNode, Rodin3D_Detail, Rodin3D_Gen2, Rodin3D_Regular, Rodin3D_Sketch, Rodin3D_Smooth, TencentImageToModelNode, TencentTextToModelNode, TripoImageToModelNode, TripoMultiviewToModelNode, TripoRefineNode, TripoRetargetNode, TripoRigNode, TripoTextToModelNode, TripoTextureNode) have this mismatch. Align RU output definitions to match the EN dictionary structure to prevent output socket mislabeling.
🤖 Prompt for AI Agents
In `@src/locales/ru/nodeDefs.json` around lines 7313 - 7323, The RU locale's
"outputs" entries use arrays while the EN locale expects a dictionary/object of
numeric-string keys; update each affected node (e.g., MeshyAnimateModelNode,
MeshyImageToModelNode, MeshyMultiImageToModelNode, MeshyRefineNode,
MeshyRigModelNode, MeshyTextToModelNode, MeshyTextureNode, Rodin3D_Detail,
Rodin3D_Gen2, Rodin3D_Regular, Rodin3D_Sketch, Rodin3D_Smooth,
TencentImageToModelNode, TencentTextToModelNode, TripoImageToModelNode,
TripoMultiviewToModelNode, TripoRefineNode, TripoRetargetNode, TripoRigNode,
TripoTextToModelNode, TripoTextureNode) to use the same dictionary format as EN
(e.g., replace arrays like [null, {...}] with {"0": null, "1": {...}}),
preserving each socket object's keys ("name", "tooltip", etc.) so output socket
labels and tooltips align with the EN locale.
There was a problem hiding this comment.
Actionable comments posted: 3
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (7)
src/locales/tr/nodeDefs.json (1)
6421-6438:⚠️ Potential issue | 🟡 MinorFix malformed Load3D button label keys.
These labels are stored under an empty-string key, while the rest of the file uses
name. That likely prevents the UI from showing the label correctly. If locales are generated, please fix this at the source/generator; desired shape below.🔧 Proposed shape
"clear": { - "": "Temizle" + "name": "Temizle" }, @@ "upload 3d model": { - "": "3D modeli yükle" + "name": "3D modeli yükle" }, "upload extra resources": { - "": "Ek kaynakları yükle" + "name": "Ek kaynakları yükle" },Based on learnings: In the Comfy-Org/ComfyUI_frontend repository, locale files other than
src/locales/en/main.jsonare generated automatically on every release. Developers only need to add English (en) key/values insrc/locales/en/main.jsonwhen making PRs; manual updates to other locale files (fr, ja, ko, ru, zh, zh-TW, es, ar, tr, etc.) are not required and should not be suggested in reviews.src/locales/pt-BR/nodeDefs.json (1)
6430-6447:⚠️ Potential issue | 🟠 MajorFix missing
namekeys for new Load3D inputs.The objects for
clear,upload 3d model, andupload extra resourcesuse an empty-string key instead ofname, which will likely render blank labels or be ignored by the locale loader. Usename(or an empty object if intentionally unlabeled).🐛 Suggested fix
"clear": { - "": "limpar" + "name": "limpar" }, @@ "upload 3d model": { - "": "enviar modelo 3D" + "name": "enviar modelo 3D" }, "upload extra resources": { - "": "enviar recursos extras" + "name": "enviar recursos extras" },If this file is generated, please update the source locale (likely
src/locales/en/main.json) and regenerate.Based on learnings: In the Comfy-Org/ComfyUI_frontend repository, locale files other than
src/locales/en/main.jsonare generated automatically on every release.src/locales/ar/nodeDefs.json (1)
7316-7593:⚠️ Potential issue | 🔴 CriticalFix critical output socket structure mismatch in Arabic locale across all 21 3D model nodes.
The Arabic node definitions use incomplete array structures with
nullplaceholders instead of matching the canonical English socket definitions. EN format uses full objects with named sockets (e.g.,"model_file","meshy_task_id"), while AR uses arrays withnullfor missing internal outputs. This breaks socket mapping in the UI—Arabic users will see labels pointing to incorrect output indices.All 21 affected nodes must be updated to match the EN structure and fully define all output sockets:
- MeshyAnimateModelNode, MeshyImageToModelNode, MeshyMultiImageToModelNode, MeshyRefineNode, MeshyRigModelNode, MeshyTextToModelNode, MeshyTextureNode
- Rodin3D_Detail, Rodin3D_Gen2, Rodin3D_Regular, Rodin3D_Sketch, Rodin3D_Smooth
- TencentImageToModelNode, TencentTextToModelNode
- TripoImageToModelNode, TripoMultiviewToModelNode, TripoRefineNode, TripoRetargetNode, TripoRigNode, TripoTextToModelNode, TripoTextureNode
src/locales/fa/nodeDefs.json (1)
6430-6447:⚠️ Potential issue | 🟡 MinorFix missing
namekeys inLoad3Dinputs.
The input entries use an empty-string key instead ofname, which will likely render blank labels in the UI.🛠️ Suggested fix
"clear": { - "": "پاکسازی" + "name": "پاکسازی" }, @@ "upload 3d model": { - "": "بارگذاری مدل سهبعدی" + "name": "بارگذاری مدل سهبعدی" }, "upload extra resources": { - "": "بارگذاری منابع اضافی" + "name": "بارگذاری منابع اضافی" },src/locales/es/nodeDefs.json (1)
6421-6438:⚠️ Potential issue | 🟡 MinorFix malformed input labels in
Load3D.The new inputs use an empty-string key instead of
name, which will likely render blank labels or be ignored by the i18n loaders.🛠️ Suggested fix
"clear": { - "": "limpiar" + "name": "limpiar" }, @@ "upload 3d model": { - "": "subir modelo 3D" + "name": "subir modelo 3D" }, "upload extra resources": { - "": "subir recursos adicionales" + "name": "subir recursos adicionales" },src/locales/ja/nodeDefs.json (1)
6421-6438:⚠️ Potential issue | 🟡 MinorFix Load3D input labels: missing
namekeys.The input entries use an empty-string key instead of
name, which likely prevents labels from rendering.🛠️ Suggested fix
"Load3D": { "display_name": "3Dを読み込む", "inputs": { "clear": { - "": "クリア" + "name": "クリア" }, "height": { "name": "高さ" }, "image": { "name": "画像" }, "model_file": { "name": "モデルファイル" }, "upload 3d model": { - "": "3Dモデルをアップロード" + "name": "3Dモデルをアップロード" }, "upload extra resources": { - "": "追加リソースをアップロード" + "name": "追加リソースをアップロード" }, "width": { "name": "幅" } },src/locales/fr/nodeDefs.json (1)
6421-6438:⚠️ Potential issue | 🟡 MinorFix missing
namekeys forLoad3Dinput labels.
clear,upload 3d model, andupload extra resourcesuse an empty-string key, so label lookup will fail. Usenamelike the other inputs (and regenerate locales if this file is generated).🛠️ Suggested fix
"clear": { - "": "effacer" + "name": "effacer" }, @@ "upload 3d model": { - "": "téléverser un modèle 3D" + "name": "téléverser un modèle 3D" }, "upload extra resources": { - "": "téléverser des ressources supplémentaires" + "name": "téléverser des ressources supplémentaires" },Based on learnings: locale files other than
src/locales/en/main.jsonare generated automatically on every release; manual updates to other locale files are not required and should not be suggested in reviews.
🤖 Fix all issues with AI agents
In `@src/locales/en/nodeDefs.json`:
- Around line 11490-11493: The description for the ReferenceTimbreAudio node
uses a lowercase product name; update the string value for
"ReferenceTimbreAudio"."description" to capitalize the product name (change
"ace" to "ACE") so it reads: "This node sets the reference audio for timbre (for
ACE step 1.5)"; locate the entry named ReferenceTimbreAudio in nodeDefs.json and
update only the description field accordingly.
- Around line 2212-2231: Update the tooltip for the "batch_size" input under the
"EmptyAceStep1_5LatentAudio" node to use audio terminology instead of "latent
images": locate the "EmptyAceStep1_5LatentAudio" definition and replace the "The
number of latent images in the batch." tooltip on the "batch_size" input with a
clearer audio-specific phrase such as "The number of latent audio clips in the
batch" (or similar) so it accurately reflects audio batching.
In `@src/locales/zh-TW/nodeDefs.json`:
- Around line 6431-6436: The locale entries for the Load3D node inputs "upload
3d model" and "upload extra resources" are using inconsistent schema across
locales; change each locale block for these keys (e.g., the zh-TW entry
currently {"zh-TW": "上傳 3D 模型"}) to the standard shape {"name": "上傳 3D 模型"} (and
similarly {"name": "上傳額外資源"}) so all locales (en, ja, zh-TW, etc.) use the {
"name": ... } pattern; update the objects for the keys "upload 3d model" and
"upload extra resources" in nodeDefs.json to match the other inputs for Load3D.
| "EmptyAceStep1_5LatentAudio": { | ||
| "display_name": "Empty Ace Step 1.5 Latent Audio", | ||
| "inputs": { | ||
| "seconds": { | ||
| "name": "seconds" | ||
| }, | ||
| "batch_size": { | ||
| "name": "batch_size", | ||
| "tooltip": "The number of latent images in the batch." | ||
| } | ||
| }, | ||
| "outputs": { | ||
| "0": { | ||
| "tooltip": null | ||
| } | ||
| } | ||
| }, | ||
| "EmptyAceStepLatentAudio": { | ||
| "display_name": "EmptyAceStepLatentAudio", | ||
| "display_name": "Empty Ace Step 1.0 Latent Audio", | ||
| "inputs": { |
There was a problem hiding this comment.
Clarify the audio batch-size tooltip.
“latent images” is misleading for audio; suggest aligning the copy to audio terminology.
✏️ Suggested copy tweak
- "tooltip": "The number of latent images in the batch."
+ "tooltip": "The number of latent audio samples in the batch."📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "EmptyAceStep1_5LatentAudio": { | |
| "display_name": "Empty Ace Step 1.5 Latent Audio", | |
| "inputs": { | |
| "seconds": { | |
| "name": "seconds" | |
| }, | |
| "batch_size": { | |
| "name": "batch_size", | |
| "tooltip": "The number of latent images in the batch." | |
| } | |
| }, | |
| "outputs": { | |
| "0": { | |
| "tooltip": null | |
| } | |
| } | |
| }, | |
| "EmptyAceStepLatentAudio": { | |
| "display_name": "EmptyAceStepLatentAudio", | |
| "display_name": "Empty Ace Step 1.0 Latent Audio", | |
| "inputs": { | |
| "EmptyAceStep1_5LatentAudio": { | |
| "display_name": "Empty Ace Step 1.5 Latent Audio", | |
| "inputs": { | |
| "seconds": { | |
| "name": "seconds" | |
| }, | |
| "batch_size": { | |
| "name": "batch_size", | |
| "tooltip": "The number of latent audio samples in the batch." | |
| } | |
| }, | |
| "outputs": { | |
| "0": { | |
| "tooltip": null | |
| } | |
| } | |
| }, | |
| "EmptyAceStepLatentAudio": { | |
| "display_name": "Empty Ace Step 1.0 Latent Audio", | |
| "inputs": { |
🤖 Prompt for AI Agents
In `@src/locales/en/nodeDefs.json` around lines 2212 - 2231, Update the tooltip
for the "batch_size" input under the "EmptyAceStep1_5LatentAudio" node to use
audio terminology instead of "latent images": locate the
"EmptyAceStep1_5LatentAudio" definition and replace the "The number of latent
images in the batch." tooltip on the "batch_size" input with a clearer
audio-specific phrase such as "The number of latent audio clips in the batch"
(or similar) so it accurately reflects audio batching.
| "ReferenceTimbreAudio": { | ||
| "display_name": "ReferenceTimbreAudio", | ||
| "description": "This node sets the reference audio for timbre (for ace step 1.5)", | ||
| "inputs": { |
There was a problem hiding this comment.
Capitalize the product name in the description.
Minor copy polish for consistency.
✏️ Suggested copy tweak
- "description": "This node sets the reference audio for timbre (for ace step 1.5)",
+ "description": "This node sets the reference audio for timbre (for Ace Step 1.5)",📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "ReferenceTimbreAudio": { | |
| "display_name": "ReferenceTimbreAudio", | |
| "description": "This node sets the reference audio for timbre (for ace step 1.5)", | |
| "inputs": { | |
| "ReferenceTimbreAudio": { | |
| "display_name": "ReferenceTimbreAudio", | |
| "description": "This node sets the reference audio for timbre (for Ace Step 1.5)", | |
| "inputs": { |
🤖 Prompt for AI Agents
In `@src/locales/en/nodeDefs.json` around lines 11490 - 11493, The description for
the ReferenceTimbreAudio node uses a lowercase product name; update the string
value for "ReferenceTimbreAudio"."description" to capitalize the product name
(change "ace" to "ACE") so it reads: "This node sets the reference audio for
timbre (for ACE step 1.5)"; locate the entry named ReferenceTimbreAudio in
nodeDefs.json and update only the description field accordingly.
| "upload 3d model": { | ||
| "zh-TW": "上傳 3D 模型" | ||
| }, | ||
| "upload extra resources": { | ||
| "zh-TW": "上傳額外資源" | ||
| }, |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
# First, let's examine the context around these lines in the zh-TW locale file
head -n 6440 src/locales/zh-TW/nodeDefs.json | tail -n 20Repository: Comfy-Org/ComfyUI_frontend
Length of output: 423
🏁 Script executed:
# Check the overall structure of this section to understand the schema pattern
rg -B5 -A5 "upload 3d model" src/locales/zh-TW/nodeDefs.jsonRepository: Comfy-Org/ComfyUI_frontend
Length of output: 286
🏁 Script executed:
# Let's see how other upload labels are structured in the same file
rg "upload" src/locales/zh-TW/nodeDefs.json | head -20Repository: Comfy-Org/ComfyUI_frontend
Length of output: 220
🏁 Script executed:
# Check if there's a Load3D node definition in nodeDefs.json
rg -i "load3d|3d.*loader" src/locales/zh-TW/nodeDefs.json | head -20Repository: Comfy-Org/ComfyUI_frontend
Length of output: 83
🏁 Script executed:
# Let's examine the English locale file to see the base structure
rg -B2 -A2 "upload 3d model" src/locales/en-US/nodeDefs.jsonRepository: Comfy-Org/ComfyUI_frontend
Length of output: 141
🏁 Script executed:
# Find the correct English locale file
fd nodeDefs.json src/localesRepository: Comfy-Org/ComfyUI_frontend
Length of output: 423
🏁 Script executed:
# Look at the Load3D node definition in zh-TW
rg -A30 '"Load3D"' src/locales/zh-TW/nodeDefs.jsonRepository: Comfy-Org/ComfyUI_frontend
Length of output: 589
🏁 Script executed:
# Check if there are any other locale files with the upload keys
fd nodeDefs.json src/locales -x rg -l "upload 3d model"Repository: Comfy-Org/ComfyUI_frontend
Length of output: 423
🏁 Script executed:
# Check the English locale for Load3D upload labels
rg -A30 '"Load3D"' src/locales/en/nodeDefs.jsonRepository: Comfy-Org/ComfyUI_frontend
Length of output: 668
🏁 Script executed:
# Check another locale (e.g., ja) to see the pattern
rg -A30 '"Load3D"' src/locales/ja/nodeDefs.jsonRepository: Comfy-Org/ComfyUI_frontend
Length of output: 602
🏁 Script executed:
# Search for code that handles upload labels or Load3D widget rendering
rg "upload 3d model|upload extra resources" src --type-list --include="*.vue" --include="*.ts" --include="*.js"Repository: Comfy-Org/ComfyUI_frontend
Length of output: 511
🏁 Script executed:
# Look for widget input rendering logic
fd -e vue -e ts -e js | xargs rg -l "WidgetSelectDropdown|upload.*model" | head -10Repository: Comfy-Org/ComfyUI_frontend
Length of output: 606
🏁 Script executed:
# Search for how inputs are processed/rendered
rg -A5 -B5 '"name".*"tooltip"' src --include="*.vue" --include="*.ts" -m 3Repository: Comfy-Org/ComfyUI_frontend
Length of output: 511
🏁 Script executed:
# Examine the Load3D extension to see how it handles inputs
cat src/extensions/core/load3d.tsRepository: Comfy-Org/ComfyUI_frontend
Length of output: 17013
🏁 Script executed:
# Search for code that processes nodeDefs input specs
rg -A10 "nodeDefs.*inputs\|inputs.*name.*tooltip" src --type ts --type vue | head -40Repository: Comfy-Org/ComfyUI_frontend
Length of output: 97
🏁 Script executed:
# Look for input widget label/translation processing
fd -type f \( -name "*.ts" -o -name "*.vue" \) src | xargs rg -l "addWidget.*name\|widget.*label" | head -5Repository: Comfy-Org/ComfyUI_frontend
Length of output: 240
🏁 Script executed:
# Search for how widget names are resolved from nodeDefs
rg "getInputLabel\|getLabel\|nodeDefs.*input" src -A3 | head -50Repository: Comfy-Org/ComfyUI_frontend
Length of output: 52
🏁 Script executed:
# Search for how widgets are created from nodeDefs
rg "node.addWidget\|addWidget" src -B2 -A2 | head -60Repository: Comfy-Org/ComfyUI_frontend
Length of output: 52
🏁 Script executed:
# Look for files that handle nodeDefs input processing
fd -name "*.ts" src | xargs rg -l "inputs\[.*\]\|getInput" | head -8Repository: Comfy-Org/ComfyUI_frontend
Length of output: 300
🏁 Script executed:
# Search for input label/name resolution
rg "input.*label\|label.*input" src -l | head -8Repository: Comfy-Org/ComfyUI_frontend
Length of output: 52
🏁 Script executed:
# Check how the widget or input definitions from nodeDefs are read
rg '"name".*"tooltip"\|"zh-TW".*"upload' src -B3 -A3Repository: Comfy-Org/ComfyUI_frontend
Length of output: 52
🏁 Script executed:
# Find files that load or process nodeDefs.json
rg "nodeDefs" src -l | head -10Repository: Comfy-Org/ComfyUI_frontend
Length of output: 572
🏁 Script executed:
# Look for files that handle internationalization and inputs
rg "i18n\|t\(" src -l | grep -i "input\|node\|widget" | head -10Repository: Comfy-Org/ComfyUI_frontend
Length of output: 52
🏁 Script executed:
# Search for where input widget labels are set or retrieved
rg "inputs.*\[" src --max-count 5 -B2 -A5Repository: Comfy-Org/ComfyUI_frontend
Length of output: 50383
🏁 Script executed:
# Search for code that applies input labels or specs to widgets
rg "addWidget.*button" src -B2 -A5 | head -50Repository: Comfy-Org/ComfyUI_frontend
Length of output: 2537
🏁 Script executed:
# Look for how input specs from nodeDefs are used for widget labels
rg "inputSpec\|getInputSpec" src -B2 -A3 | head -40Repository: Comfy-Org/ComfyUI_frontend
Length of output: 52
🏁 Script executed:
# Search for widget label resolution or rendering
rg "widget.*label\|widget.*name\|widget.*title" src -l | grep -v test | head -10Repository: Comfy-Org/ComfyUI_frontend
Length of output: 52
Standardize Load3D upload labels to use the name key across all locales.
The "upload 3d model" and "upload extra resources" inputs use inconsistent schema across locales: English uses {}, Japanese uses { "": ... }, and zh-TW uses { "zh-TW": ... }. All other inputs in this node follow the standard { "name": ... } pattern. Align these entries with the consistent schema used elsewhere in nodeDefs.json.
🤖 Prompt for AI Agents
In `@src/locales/zh-TW/nodeDefs.json` around lines 6431 - 6436, The locale entries
for the Load3D node inputs "upload 3d model" and "upload extra resources" are
using inconsistent schema across locales; change each locale block for these
keys (e.g., the zh-TW entry currently {"zh-TW": "上傳 3D 模型"}) to the standard
shape {"name": "上傳 3D 模型"} (and similarly {"name": "上傳額外資源"}) so all locales
(en, ja, zh-TW, etc.) use the { "name": ... } pattern; update the objects for
the keys "upload 3d model" and "upload extra resources" in nodeDefs.json to
match the other inputs for Load3D.
Patch version increment to 1.39.6 **Base branch:** `main` <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Chores** * Version bumped to 1.39.6. * **New Features** * Added multilingual UI strings for secrets management, asset import errors, app-mode prompts, and HitPaw tools. * New node types for image/video/audio workflows and expanded export formats (GLB/FBX/OBJ) for 3D/model outputs. * **Bug Fixes / Removals** * Removed the "Open 3D Viewer (Beta) for Selected Node" menu entry and related 3D viewer settings. * Added setting to enable automatic node replacement when mappings exist. <!-- end of auto-generated comment: release notes by coderabbit.ai --> ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-8595-1-39-6-2fd6d73d3650818cba9cffca313909e8) by [Unito](https://www.unito.io) --------- Co-authored-by: christian-byrne <72887196+christian-byrne@users.noreply.github.com> Co-authored-by: github-actions <github-actions@github.com>
Patch version increment to 1.39.6
Base branch:
mainSummary by CodeRabbit
Chores
New Features
Bug Fixes / Removals
┆Issue is synchronized with this Notion page by Unito