diff --git a/src/locales/en/settings.json b/src/locales/en/settings.json index 9c9e105b79..2dd306892c 100644 --- a/src/locales/en/settings.json +++ b/src/locales/en/settings.json @@ -79,6 +79,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 340a7c77c4..3033cdf591 100644 --- a/src/platform/settings/constants/coreSettings.ts +++ b/src/platform/settings/constants/coreSettings.ts @@ -807,6 +807,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 224ceb0df3..b26d3b6aac 100644 --- a/src/schemas/apiSchema.ts +++ b/src/schemas/apiSchema.ts @@ -372,6 +372,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, @@ -433,6 +442,7 @@ const zSettings = z.object({ 'Comfy.TreeExplorer.ItemPadding': z.number(), 'Comfy.Validation.Workflows': z.boolean(), 'Comfy.Workflow.SortNodeIdOnSave': z.boolean(), + '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 d89c1dfb36..268aef8a2b 100644 --- a/src/scripts/api.ts +++ b/src/scripts/api.ts @@ -42,7 +42,8 @@ import type { StatusWsMessageStatus, SystemStats, User, - UserDataFullInfo + UserDataFullInfo, + PreviewMethod } from '@/schemas/apiSchema' import type { ComfyNodeDef } from '@/schemas/nodeDefSchema' import type { useFirebaseAuthStore } from '@/stores/firebaseAuthStore' @@ -89,6 +90,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 @@ -104,6 +110,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 */ @@ -773,7 +784,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 9c152d4bea..01e87b5d50 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