diff --git a/src/locales/en/settings.json b/src/locales/en/settings.json index 06dcb50e5..62fa4526b 100644 --- a/src/locales/en/settings.json +++ b/src/locales/en/settings.json @@ -53,6 +53,17 @@ "Comfy_EnableWorkflowViewRestore": { "name": "Save and restore canvas position and zoom level in workflows" }, + "Comfy_Execution_PreviewMethod": { + "name": "Live preview method", + "tooltip": "Live preview method during image generation. \"default\" uses the server CLI setting.", + "options": { + "default": "default", + "none": "none", + "auto": "auto", + "latent2rgb": "latent2rgb", + "taesd": "taesd" + } + }, "Comfy_FloatRoundingPrecision": { "name": "Float widget rounding decimal places [0 = auto].", "tooltip": "(requires page reload)" diff --git a/src/platform/settings/constants/coreSettings.ts b/src/platform/settings/constants/coreSettings.ts index fb87ea133..fe4cc57a8 100644 --- a/src/platform/settings/constants/coreSettings.ts +++ b/src/platform/settings/constants/coreSettings.ts @@ -813,6 +813,17 @@ export const CORE_SETTINGS: SettingParams[] = [ defaultValue: 64, versionAdded: '1.4.12' }, + { + id: 'Comfy.Execution.PreviewMethod', + category: ['Comfy', 'Execution', 'PreviewMethod'], + name: 'Live preview method', + tooltip: + 'Live preview method during image generation. "default" uses the server CLI setting.', + type: 'combo', + options: ['default', 'none', 'auto', 'latent2rgb', 'taesd'], + defaultValue: 'default', + versionAdded: '1.36.0' + }, { id: 'LiteGraph.Canvas.MaximumFps', name: 'Maximum FPS', diff --git a/src/schemas/apiSchema.ts b/src/schemas/apiSchema.ts index 5187145cf..794f24f4d 100644 --- a/src/schemas/apiSchema.ts +++ b/src/schemas/apiSchema.ts @@ -369,6 +369,15 @@ const zNodeBadgeMode = z.enum( Object.values(NodeBadgeMode) as [string, ...string[]] ) +const zPreviewMethod = z.enum([ + 'default', + 'none', + 'auto', + 'latent2rgb', + 'taesd' +]) +export type PreviewMethod = z.infer + const zSettings = z.object({ 'Comfy.ColorPalette': z.string(), 'Comfy.CustomColorPalettes': colorPalettesSchema, @@ -431,6 +440,7 @@ const zSettings = z.object({ 'Comfy.Validation.Workflows': z.boolean(), 'Comfy.Workflow.SortNodeIdOnSave': z.boolean(), 'Comfy.Queue.ImageFit': z.enum(['contain', 'cover']), + 'Comfy.Execution.PreviewMethod': zPreviewMethod, 'Comfy.Workflow.WorkflowTabsPosition': z.enum(['Sidebar', 'Topbar']), 'Comfy.Node.DoubleClickTitleToEdit': z.boolean(), 'Comfy.WidgetControlMode': z.enum(['before', 'after']), diff --git a/src/scripts/api.ts b/src/scripts/api.ts index f69a641fe..d87af6876 100644 --- a/src/scripts/api.ts +++ b/src/scripts/api.ts @@ -41,7 +41,8 @@ import type { StatusWsMessageStatus, SystemStats, User, - UserDataFullInfo + UserDataFullInfo, + PreviewMethod } from '@/schemas/apiSchema' import type { ComfyNodeDef } from '@/schemas/nodeDefSchema' import type { useFirebaseAuthStore } from '@/stores/firebaseAuthStore' @@ -88,6 +89,11 @@ interface QueuePromptRequestBody { * ``` */ api_key_comfy_org?: string + /** + * Override the preview method for this prompt execution. + * 'default' uses the server's CLI setting. + */ + preview_method?: PreviewMethod } front?: boolean number?: number @@ -103,6 +109,11 @@ interface QueuePromptOptions { * Format: Colon-separated path of node IDs (e.g., "123:456:789") */ partialExecutionTargets?: NodeExecutionId[] + /** + * Override the preview method for this prompt execution. + * 'default' uses the server's CLI setting and is not sent to backend. + */ + previewMethod?: PreviewMethod } /** Dictionary of Frontend-generated API calls */ @@ -772,7 +783,11 @@ export class ComfyApi extends EventTarget { extra_data: { auth_token_comfy_org: this.authToken, api_key_comfy_org: this.apiKey, - extra_pnginfo: { workflow } + extra_pnginfo: { workflow }, + ...(options?.previewMethod && + options.previewMethod !== 'default' && { + preview_method: options.previewMethod + }) } } diff --git a/src/scripts/app.ts b/src/scripts/app.ts index 4fe5192bb..bcd93a402 100644 --- a/src/scripts/app.ts +++ b/src/scripts/app.ts @@ -1344,6 +1344,9 @@ export class ComfyApp { try { while (this.queueItems.length) { const { number, batchCount, queueNodeIds } = this.queueItems.pop()! + const previewMethod = useSettingStore().get( + 'Comfy.Execution.PreviewMethod' + ) for (let i = 0; i < batchCount; i++) { // Allow widgets to run callbacks before a prompt has been queued @@ -1358,7 +1361,8 @@ export class ComfyApp { api.authToken = comfyOrgAuthToken api.apiKey = comfyOrgApiKey ?? undefined const res = await api.queuePrompt(number, p, { - partialExecutionTargets: queueNodeIds + partialExecutionTargets: queueNodeIds, + previewMethod }) delete api.authToken delete api.apiKey