[backport core/1.34] feat: add live preview method setting for prompt execution (#7521)

## Summary

Backport of #7385 to core/1.34.

Add frontend setting to override live preview method per prompt
execution.

- **What**: New setting `Comfy.Execution.PreviewMethod` allows users to
override preview method (default/none/auto/latent2rgb/taesd) from
frontend.

## Conflict Resolution

- `src/schemas/apiSchema.ts`: Kept both `Comfy.Queue.ImageFit` (target
branch) and `Comfy.Execution.PreviewMethod` (PR addition)

Co-authored-by: Dr.Lt.Data <128333288+ltdrdata@users.noreply.github.com>
This commit is contained in:
Christian Byrne
2025-12-15 13:51:27 -08:00
committed by GitHub
parent 5007190c3a
commit 16628f3798
5 changed files with 54 additions and 3 deletions

View File

@@ -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)"

View File

@@ -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',

View File

@@ -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<typeof zPreviewMethod>
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']),

View File

@@ -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
})
}
}

View File

@@ -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