Compare commits

...

8 Commits

Author SHA1 Message Date
Chenlei Hu
f529e7a255 1.16.9 (#3506) 2025-04-18 11:47:00 -04:00
Chenlei Hu
39199e9189 [Bug] Fix uuid generation in insecure context (#3505) 2025-04-18 11:45:54 -04:00
Chenlei Hu
90899b19bf 1.16.8 (#3487) 2025-04-17 13:47:30 -04:00
Christian Byrne
bca81e4a8a Add HiDream templates translations (#3485)
Co-authored-by: github-actions <github-actions@github.com>
2025-04-17 13:46:28 -04:00
Makki Shizu
d4d785fa04 fix 2_pass_pose_worship zh translation (#3474) 2025-04-17 10:55:31 -04:00
Christian Byrne
a8f5e6a71d Remove templates build from release process (#3481) 2025-04-17 10:55:15 -04:00
filtered
7e4df6006a Log errors in generic error handler (#3482) 2025-04-17 10:55:01 -04:00
filtered
0d921e72b9 Fix corrupt workflow permanently corrupts session (#3484) 2025-04-17 10:54:54 -04:00
14 changed files with 82 additions and 77 deletions

View File

@@ -31,7 +31,6 @@ jobs:
ALGOLIA_API_KEY: ${{ secrets.ALGOLIA_API_KEY }} ALGOLIA_API_KEY: ${{ secrets.ALGOLIA_API_KEY }}
run: | run: |
npm ci npm ci
npm run fetch-templates
npm run build npm run build
npm run zipdist npm run zipdist
- name: Upload dist artifact - name: Upload dist artifact

View File

@@ -10,7 +10,7 @@ module.exports = defineConfig({
entryLocale: 'en', entryLocale: 'en',
output: 'src/locales', output: 'src/locales',
outputLocales: ['zh', 'ru', 'ja', 'ko', 'fr', 'es'], outputLocales: ['zh', 'ru', 'ja', 'ko', 'fr', 'es'],
reference: `Special names to keep untranslated: flux, photomaker, clip, vae, cfg, stable audio, stable cascade, stable zero, controlnet, lora. reference: `Special names to keep untranslated: flux, photomaker, clip, vae, cfg, stable audio, stable cascade, stable zero, controlnet, lora, HiDream.
'latent' is the short form of 'latent space'. 'latent' is the short form of 'latent space'.
'mask' is in the context of image processing. 'mask' is in the context of image processing.
` `

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{ {
"name": "@comfyorg/comfyui-frontend", "name": "@comfyorg/comfyui-frontend",
"version": "1.16.7", "version": "1.16.9",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "@comfyorg/comfyui-frontend", "name": "@comfyorg/comfyui-frontend",
"version": "1.16.7", "version": "1.16.9",
"license": "GPL-3.0-only", "license": "GPL-3.0-only",
"dependencies": { "dependencies": {
"@alloc/quick-lru": "^5.2.0", "@alloc/quick-lru": "^5.2.0",

View File

@@ -1,7 +1,7 @@
{ {
"name": "@comfyorg/comfyui-frontend", "name": "@comfyorg/comfyui-frontend",
"private": true, "private": true,
"version": "1.16.7", "version": "1.16.9",
"type": "module", "type": "module",
"repository": "https://github.com/Comfy-Org/ComfyUI_frontend", "repository": "https://github.com/Comfy-Org/ComfyUI_frontend",
"homepage": "https://comfy.org", "homepage": "https://comfy.org",

View File

@@ -5,6 +5,7 @@ export function useErrorHandling() {
const toast = useToastStore() const toast = useToastStore()
const toastErrorHandler = (error: any) => { const toastErrorHandler = (error: any) => {
console.error(error)
toast.add({ toast.add({
severity: 'error', severity: 'error',
summary: t('g.error'), summary: t('g.error'),

View File

@@ -47,7 +47,7 @@ export class PrimitiveNode extends LGraphNode {
applyToGraph(extraLinks: LLink[] = []) { applyToGraph(extraLinks: LLink[] = []) {
if (!this.outputs[0].links?.length) return if (!this.outputs[0].links?.length) return
let links = [ const links = [
...this.outputs[0].links.map((l) => app.graph.links[l]), ...this.outputs[0].links.map((l) => app.graph.links[l]),
...extraLinks ...extraLinks
] ]
@@ -58,30 +58,35 @@ export class PrimitiveNode extends LGraphNode {
// For each output link copy our value over the original widget value // For each output link copy our value over the original widget value
for (const linkInfo of links) { for (const linkInfo of links) {
// @ts-expect-error fixme ts strict error const node = this.graph?.getNodeById(linkInfo.target_id)
const node = this.graph.getNodeById(linkInfo.target_id) const input = node?.inputs[linkInfo.target_slot]
// @ts-expect-error fixme ts strict error if (!input) {
const input = node.inputs[linkInfo.target_slot] console.warn('Unable to resolve node or input for link', linkInfo)
let widget: IWidget | undefined continue
const widgetName = (input.widget as { name: string }).name
if (widgetName) {
// @ts-expect-error fixme ts strict error
widget = node.widgets.find((w) => w.name === widgetName)
} }
if (widget) { const widgetName = input.widget?.name
widget.value = v if (!widgetName) {
if (widget.callback) { console.warn('Invalid widget or widget name', input.widget)
widget.callback( continue
widget.value,
app.canvas,
// @ts-expect-error fixme ts strict error
node,
app.canvas.graph_mouse,
{} as CanvasMouseEvent
)
}
} }
const widget = node.widgets?.find((w) => w.name === widgetName)
if (!widget) {
console.warn(
`Unable to find widget "${widgetName}" on node [${node.id}]`
)
continue
}
widget.value = v
widget.callback?.(
widget.value,
app.canvas,
node,
app.canvas.graph_mouse,
{} as CanvasMouseEvent
)
} }
} }

View File

@@ -461,8 +461,7 @@
"ControlNet": "ControlNet", "ControlNet": "ControlNet",
"Upscaling": "Upscaling", "Upscaling": "Upscaling",
"Video": "Video", "Video": "Video",
"SD3_5": "SD3.5", "Image": "Image",
"SDXL": "SDXL",
"Area Composition": "Area Composition", "Area Composition": "Area Composition",
"3D": "3D", "3D": "3D",
"Audio": "Audio" "Audio": "Audio"
@@ -510,18 +509,19 @@
"mochi_text_to_video_example": "Mochi Text to Video", "mochi_text_to_video_example": "Mochi Text to Video",
"hunyuan_video_text_to_video": "Hunyuan Video Text to Video" "hunyuan_video_text_to_video": "Hunyuan Video Text to Video"
}, },
"SD3_5": { "Image": {
"sd3_5_simple_example": "SD3.5 Simple", "sd3_5_simple_example": "SD3.5 Simple",
"sd3_5_large_canny_controlnet_example": "SD3.5 Large Canny ControlNet", "sd3_5_large_canny_controlnet_example": "SD3.5 Large Canny ControlNet",
"sd3_5_large_depth": "SD3.5 Large Depth", "sd3_5_large_depth": "SD3.5 Large Depth",
"sd3_5_large_blur": "SD3.5 Large Blur" "sd3_5_large_blur": "SD3.5 Large Blur",
},
"SDXL": {
"sdxl_simple_example": "SDXL Simple", "sdxl_simple_example": "SDXL Simple",
"sdxl_refiner_prompt_example": "SDXL Refiner Prompt", "sdxl_refiner_prompt_example": "SDXL Refiner Prompt",
"sdxl_revision_text_prompts": "SDXL Revision Text Prompts", "sdxl_revision_text_prompts": "SDXL Revision Text Prompts",
"sdxl_revision_zero_positive": "SDXL Revision Zero Positive", "sdxl_revision_zero_positive": "SDXL Revision Zero Positive",
"sdxlturbo_example": "SDXL Turbo" "sdxlturbo_example": "SDXL Turbo",
"hidream_i1_dev": "HiDream I1 Dev",
"hidream_i1_fast": "HiDream I1 Fast",
"hidream_i1_full": "HiDream I1 Full"
}, },
"Area Composition": { "Area Composition": {
"area_composition": "Area Composition", "area_composition": "Area Composition",

View File

@@ -918,8 +918,7 @@
"ControlNet": "ControlNet", "ControlNet": "ControlNet",
"Custom Nodes": "Nodos Personalizados", "Custom Nodes": "Nodos Personalizados",
"Flux": "Flux", "Flux": "Flux",
"SD3_5": "SD3.5", "Image": "Imagen",
"SDXL": "SDXL",
"Upscaling": "Ampliación", "Upscaling": "Ampliación",
"Video": "Video" "Video": "Video"
}, },
@@ -964,13 +963,14 @@
"flux_redux_model_example": "Flux Redux Model", "flux_redux_model_example": "Flux Redux Model",
"flux_schnell": "Flux Schnell" "flux_schnell": "Flux Schnell"
}, },
"SD3_5": { "Image": {
"hidream_i1_dev": "HiDream I1 Dev",
"hidream_i1_fast": "HiDream I1 Rápido",
"hidream_i1_full": "HiDream I1 Completo",
"sd3_5_large_blur": "SD3.5 Grande Desenfoque", "sd3_5_large_blur": "SD3.5 Grande Desenfoque",
"sd3_5_large_canny_controlnet_example": "SD3.5 Grande Canny ControlNet", "sd3_5_large_canny_controlnet_example": "SD3.5 Grande Canny ControlNet",
"sd3_5_large_depth": "SD3.5 Grande Profundidad", "sd3_5_large_depth": "SD3.5 Grande Profundidad",
"sd3_5_simple_example": "SD3.5 Simple" "sd3_5_simple_example": "SD3.5 Simple",
},
"SDXL": {
"sdxl_refiner_prompt_example": "SDXL Refinador de Solicitud", "sdxl_refiner_prompt_example": "SDXL Refinador de Solicitud",
"sdxl_revision_text_prompts": "SDXL Revisión de Solicitud de Texto", "sdxl_revision_text_prompts": "SDXL Revisión de Solicitud de Texto",
"sdxl_revision_zero_positive": "SDXL Revisión Cero Positivo", "sdxl_revision_zero_positive": "SDXL Revisión Cero Positivo",

View File

@@ -918,8 +918,7 @@
"ControlNet": "ControlNet", "ControlNet": "ControlNet",
"Custom Nodes": "Nœuds personnalisés", "Custom Nodes": "Nœuds personnalisés",
"Flux": "Flux", "Flux": "Flux",
"SD3_5": "SD3.5", "Image": "Image",
"SDXL": "SDXL",
"Upscaling": "Mise à l'échelle", "Upscaling": "Mise à l'échelle",
"Video": "Vidéo" "Video": "Vidéo"
}, },
@@ -964,13 +963,14 @@
"flux_redux_model_example": "Flux Redux Model", "flux_redux_model_example": "Flux Redux Model",
"flux_schnell": "Flux Schnell" "flux_schnell": "Flux Schnell"
}, },
"SD3_5": { "Image": {
"hidream_i1_dev": "HiDream I1 Dev",
"hidream_i1_fast": "HiDream I1 Rapide",
"hidream_i1_full": "HiDream I1 Complet",
"sd3_5_large_blur": "SD3.5 Grand Flou", "sd3_5_large_blur": "SD3.5 Grand Flou",
"sd3_5_large_canny_controlnet_example": "SD3.5 Grand Canny ControlNet", "sd3_5_large_canny_controlnet_example": "SD3.5 Grand Canny ControlNet",
"sd3_5_large_depth": "SD3.5 Grande Profondeur", "sd3_5_large_depth": "SD3.5 Grande Profondeur",
"sd3_5_simple_example": "SD3.5 Simple" "sd3_5_simple_example": "SD3.5 Simple",
},
"SDXL": {
"sdxl_refiner_prompt_example": "SDXL Refiner Prompt", "sdxl_refiner_prompt_example": "SDXL Refiner Prompt",
"sdxl_revision_text_prompts": "Révisions de Texte SDXL", "sdxl_revision_text_prompts": "Révisions de Texte SDXL",
"sdxl_revision_zero_positive": "Révision Zéro Positive SDXL", "sdxl_revision_zero_positive": "Révision Zéro Positive SDXL",

View File

@@ -918,8 +918,7 @@
"ControlNet": "ControlNet", "ControlNet": "ControlNet",
"Custom Nodes": "カスタムノード", "Custom Nodes": "カスタムノード",
"Flux": "Flux", "Flux": "Flux",
"SD3_5": "SD3.5", "Image": "画像",
"SDXL": "SDXL",
"Upscaling": "アップスケーリング", "Upscaling": "アップスケーリング",
"Video": "ビデオ" "Video": "ビデオ"
}, },
@@ -964,13 +963,14 @@
"flux_redux_model_example": "Flux Reduxモデル", "flux_redux_model_example": "Flux Reduxモデル",
"flux_schnell": "Flux Schnell" "flux_schnell": "Flux Schnell"
}, },
"SD3_5": { "Image": {
"hidream_i1_dev": "HiDream I1 Dev",
"hidream_i1_fast": "HiDream I1 Fast",
"hidream_i1_full": "HiDream I1 Full",
"sd3_5_large_blur": "SD3.5 ラージブラー", "sd3_5_large_blur": "SD3.5 ラージブラー",
"sd3_5_large_canny_controlnet_example": "SD3.5 ラージキャニーコントロールネット", "sd3_5_large_canny_controlnet_example": "SD3.5 ラージキャニーコントロールネット",
"sd3_5_large_depth": "SD3.5 ラージデプス", "sd3_5_large_depth": "SD3.5 ラージデプス",
"sd3_5_simple_example": "SD3.5 シンプル" "sd3_5_simple_example": "SD3.5 シンプル",
},
"SDXL": {
"sdxl_refiner_prompt_example": "SDXL Refinerプロンプト", "sdxl_refiner_prompt_example": "SDXL Refinerプロンプト",
"sdxl_revision_text_prompts": "SDXL Revisionテキストプロンプト", "sdxl_revision_text_prompts": "SDXL Revisionテキストプロンプト",
"sdxl_revision_zero_positive": "SDXL Revisionゼロポジティブ", "sdxl_revision_zero_positive": "SDXL Revisionゼロポジティブ",

View File

@@ -918,8 +918,7 @@
"ControlNet": "컨트롤넷", "ControlNet": "컨트롤넷",
"Custom Nodes": "사용자 정의 노드", "Custom Nodes": "사용자 정의 노드",
"Flux": "FLUX", "Flux": "FLUX",
"SD3_5": "SD3.5", "Image": "이미지",
"SDXL": "SDXL",
"Upscaling": "업스케일링", "Upscaling": "업스케일링",
"Video": "비디오" "Video": "비디오"
}, },
@@ -964,13 +963,14 @@
"flux_redux_model_example": "FLUX Redux 모델 예제", "flux_redux_model_example": "FLUX Redux 모델 예제",
"flux_schnell": "FLUX Schnell" "flux_schnell": "FLUX Schnell"
}, },
"SD3_5": { "Image": {
"hidream_i1_dev": "HiDream I1 개발",
"hidream_i1_fast": "HiDream I1 빠른",
"hidream_i1_full": "HiDream I1 전체",
"sd3_5_large_blur": "SD3.5 Large 블러 컨트롤넷", "sd3_5_large_blur": "SD3.5 Large 블러 컨트롤넷",
"sd3_5_large_canny_controlnet_example": "SD3.5 Large 캐니 컨트롤넷", "sd3_5_large_canny_controlnet_example": "SD3.5 Large 캐니 컨트롤넷",
"sd3_5_large_depth": "SD3.5 Large 깊이 컨트롤넷", "sd3_5_large_depth": "SD3.5 Large 깊이 컨트롤넷",
"sd3_5_simple_example": "간단한 SD3.5 예제" "sd3_5_simple_example": "간단한 SD3.5 예제",
},
"SDXL": {
"sdxl_refiner_prompt_example": "SDXL 리파이너 프롬프트", "sdxl_refiner_prompt_example": "SDXL 리파이너 프롬프트",
"sdxl_revision_text_prompts": "SDXL Revision 텍스트 프롬프트", "sdxl_revision_text_prompts": "SDXL Revision 텍스트 프롬프트",
"sdxl_revision_zero_positive": "SDXL Revision Zero Positive", "sdxl_revision_zero_positive": "SDXL Revision Zero Positive",

View File

@@ -918,8 +918,7 @@
"ControlNet": "ControlNet", "ControlNet": "ControlNet",
"Custom Nodes": "Пользовательские узлы", "Custom Nodes": "Пользовательские узлы",
"Flux": "Flux", "Flux": "Flux",
"SD3_5": "SD3.5", "Image": "Изображение",
"SDXL": "SDXL",
"Upscaling": "Увеличение разрешения", "Upscaling": "Увеличение разрешения",
"Video": "Видео" "Video": "Видео"
}, },
@@ -964,17 +963,18 @@
"flux_redux_model_example": "Flux Redux Model", "flux_redux_model_example": "Flux Redux Model",
"flux_schnell": "Flux Schnell" "flux_schnell": "Flux Schnell"
}, },
"SD3_5": { "Image": {
"hidream_i1_dev": "HiDream I1 Dev",
"hidream_i1_fast": "HiDream I1 Fast",
"hidream_i1_full": "HiDream I1 Full",
"sd3_5_large_blur": "SD3.5 Большое размытие", "sd3_5_large_blur": "SD3.5 Большое размытие",
"sd3_5_large_canny_controlnet_example": "SD3.5 Большой Canny ControlNet", "sd3_5_large_canny_controlnet_example": "SD3.5 Большой Canny ControlNet",
"sd3_5_large_depth": "SD3.5 Большая глубина", "sd3_5_large_depth": "SD3.5 Большая глубина",
"sd3_5_simple_example": "SD3.5 Простой" "sd3_5_simple_example": "SD3.5 Простой",
}, "sdxl_refiner_prompt_example": "SDXL Уточняющий запрос",
"SDXL": { "sdxl_revision_text_prompts": "SDXL Редактирование текстовых запросов",
"sdxl_refiner_prompt_example": "SDXL Refiner Prompt", "sdxl_revision_zero_positive": "SDXL Редактирование нулевого положительного",
"sdxl_revision_text_prompts": "SDXL Revision Text Prompts", "sdxl_simple_example": "SDXL Простой",
"sdxl_revision_zero_positive": "SDXL Revision Zero Positive",
"sdxl_simple_example": "SDXL Simple",
"sdxlturbo_example": "SDXL Turbo" "sdxlturbo_example": "SDXL Turbo"
}, },
"Upscaling": { "Upscaling": {

View File

@@ -918,8 +918,7 @@
"ControlNet": "ControlNet", "ControlNet": "ControlNet",
"Custom Nodes": "自定义节点", "Custom Nodes": "自定义节点",
"Flux": "Flux", "Flux": "Flux",
"SD3_5": "SD3.5", "Image": "图片",
"SDXL": "SDXL",
"Upscaling": "放大", "Upscaling": "放大",
"Video": "视频" "Video": "视频"
}, },
@@ -949,7 +948,7 @@
"lora_multiple": "Lora多个" "lora_multiple": "Lora多个"
}, },
"ControlNet": { "ControlNet": {
"2_pass_pose_worship": "2通道姿势崇拜", "2_pass_pose_worship": "通道姿势处理",
"controlnet_example": "ControlNet", "controlnet_example": "ControlNet",
"depth_controlnet": "深度ControlNet", "depth_controlnet": "深度ControlNet",
"depth_t2i_adapter": "深度T2I适配器", "depth_t2i_adapter": "深度T2I适配器",
@@ -964,13 +963,14 @@
"flux_redux_model_example": "Flux Redux Model", "flux_redux_model_example": "Flux Redux Model",
"flux_schnell": "Flux Schnell" "flux_schnell": "Flux Schnell"
}, },
"SD3_5": { "Image": {
"hidream_i1_dev": "HiDream I1 Dev",
"hidream_i1_fast": "HiDream I1 Fast",
"hidream_i1_full": "HiDream I1 Full",
"sd3_5_large_blur": "SD3.5 Large 模糊", "sd3_5_large_blur": "SD3.5 Large 模糊",
"sd3_5_large_canny_controlnet_example": "SD3.5 Large Canny 控制网", "sd3_5_large_canny_controlnet_example": "SD3.5 Large Canny 控制网",
"sd3_5_large_depth": "SD3.5 Large 深度", "sd3_5_large_depth": "SD3.5 Large 深度",
"sd3_5_simple_example": "SD3.5 简易示例" "sd3_5_simple_example": "SD3.5 简易示例",
},
"SDXL": {
"sdxl_refiner_prompt_example": "SDXL Refiner提示", "sdxl_refiner_prompt_example": "SDXL Refiner提示",
"sdxl_revision_text_prompts": "SDXL修订文本提示", "sdxl_revision_text_prompts": "SDXL修订文本提示",
"sdxl_revision_zero_positive": "SDXL修订零正", "sdxl_revision_zero_positive": "SDXL修订零正",

View File

@@ -11,7 +11,7 @@ import { useSettingStore } from '@/stores/settingStore'
import { useToastStore } from '@/stores/toastStore' import { useToastStore } from '@/stores/toastStore'
import { ComfyWorkflow, useWorkflowStore } from '@/stores/workflowStore' import { ComfyWorkflow, useWorkflowStore } from '@/stores/workflowStore'
import { useWorkspaceStore } from '@/stores/workspaceStore' import { useWorkspaceStore } from '@/stores/workspaceStore'
import { appendJsonExt } from '@/utils/formatUtil' import { appendJsonExt, generateUUID } from '@/utils/formatUtil'
import { useDialogService } from './dialogService' import { useDialogService } from './dialogService'
@@ -95,7 +95,7 @@ export const useWorkflowService = () => {
await workflowStore.saveWorkflow(workflow) await workflowStore.saveWorkflow(workflow)
} else { } else {
// Generate new id when saving existing workflow as a new file // Generate new id when saving existing workflow as a new file
const id = crypto.randomUUID() const id = generateUUID()
const state = JSON.parse( const state = JSON.parse(
JSON.stringify(workflow.activeState) JSON.stringify(workflow.activeState)
) as ComfyWorkflowJSON ) as ComfyWorkflowJSON