mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-05-01 03:31:58 +00:00
migrate manager menu items
This commit is contained in:
@@ -17,7 +17,7 @@ import { app } from '@/scripts/app'
|
|||||||
import { useDialogService } from '@/services/dialogService'
|
import { useDialogService } from '@/services/dialogService'
|
||||||
import { useLitegraphService } from '@/services/litegraphService'
|
import { useLitegraphService } from '@/services/litegraphService'
|
||||||
import { useWorkflowService } from '@/services/workflowService'
|
import { useWorkflowService } from '@/services/workflowService'
|
||||||
import type { ComfyCommand } from '@/stores/commandStore'
|
import { type ComfyCommand, useCommandStore } from '@/stores/commandStore'
|
||||||
import { useTitleEditorStore } from '@/stores/graphStore'
|
import { useTitleEditorStore } from '@/stores/graphStore'
|
||||||
import { useQueueSettingsStore, useQueueStore } from '@/stores/queueStore'
|
import { useQueueSettingsStore, useQueueStore } from '@/stores/queueStore'
|
||||||
import { useSettingStore } from '@/stores/settingStore'
|
import { useSettingStore } from '@/stores/settingStore'
|
||||||
@@ -718,6 +718,84 @@ export function useCoreCommands(): ComfyCommand[] {
|
|||||||
label: 'Move Selected Nodes Right',
|
label: 'Move Selected Nodes Right',
|
||||||
versionAdded: moveSelectedNodesVersionAdded,
|
versionAdded: moveSelectedNodesVersionAdded,
|
||||||
function: () => moveSelectedNodes(([x, y], gridSize) => [x + gridSize, y])
|
function: () => moveSelectedNodes(([x, y], gridSize) => [x + gridSize, y])
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'Comfy.Manager.CustomNodesManager.ShowLegacyCustomNodesMenu',
|
||||||
|
icon: 'pi pi-bars',
|
||||||
|
label: 'Custom Nodes (Legacy)',
|
||||||
|
versionAdded: '1.16.4',
|
||||||
|
function: () => {
|
||||||
|
try {
|
||||||
|
void useCommandStore().execute(
|
||||||
|
'Comfy.Manager.CustomNodesManager.ToggleVisibility'
|
||||||
|
)
|
||||||
|
} catch (error) {
|
||||||
|
useToastStore().add({
|
||||||
|
severity: 'error',
|
||||||
|
summary: t('g.error'),
|
||||||
|
detail: t('manager.legacyMenuNotAvailable'),
|
||||||
|
life: 3000
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'Comfy.Manager.ShowLegacyManagerMenu',
|
||||||
|
icon: 'mdi mdi-puzzle',
|
||||||
|
label: 'Manager Menu (Legacy)',
|
||||||
|
versionAdded: '1.16.4',
|
||||||
|
function: () => {
|
||||||
|
try {
|
||||||
|
void useCommandStore().execute('Comfy.Manager.Menu.ToggleVisibility')
|
||||||
|
} catch (error) {
|
||||||
|
useToastStore().add({
|
||||||
|
severity: 'error',
|
||||||
|
summary: t('g.error'),
|
||||||
|
detail: t('manager.legacyMenuNotAvailable'),
|
||||||
|
life: 3000
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'Comfy.Memory.UnloadModels',
|
||||||
|
icon: 'mdi mdi-vacuum-outline',
|
||||||
|
label: 'Unload Models',
|
||||||
|
versionAdded: '1.16.4',
|
||||||
|
function: async () => {
|
||||||
|
if (!useSettingStore().get('Comfy.Memory.AllowManualUnload')) {
|
||||||
|
useToastStore().add({
|
||||||
|
severity: 'error',
|
||||||
|
summary: t('g.error'),
|
||||||
|
detail: t('g.commandProhibited', {
|
||||||
|
command: 'Comfy.Memory.UnloadModels'
|
||||||
|
}),
|
||||||
|
life: 3000
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
await api.freeMemory({ freeExecutionCache: false })
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'Comfy.Memory.UnloadModelsAndExecutionCache',
|
||||||
|
icon: 'mdi mdi-vacuum-outline',
|
||||||
|
label: 'Unload Models and Execution Cache',
|
||||||
|
versionAdded: '1.16.4',
|
||||||
|
function: async () => {
|
||||||
|
if (!useSettingStore().get('Comfy.Memory.AllowManualUnload')) {
|
||||||
|
useToastStore().add({
|
||||||
|
severity: 'error',
|
||||||
|
summary: t('g.error'),
|
||||||
|
detail: t('g.commandProhibited', {
|
||||||
|
command: 'Comfy.Memory.UnloadModelsAndExecutionCache'
|
||||||
|
}),
|
||||||
|
life: 3000
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
await api.freeMemory({ freeExecutionCache: true })
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,16 @@ export const CORE_MENU_COMMANDS = [
|
|||||||
[['Edit'], ['Comfy.RefreshNodeDefinitions']],
|
[['Edit'], ['Comfy.RefreshNodeDefinitions']],
|
||||||
[['Edit'], ['Comfy.ClearWorkflow']],
|
[['Edit'], ['Comfy.ClearWorkflow']],
|
||||||
[['Edit'], ['Comfy.OpenClipspace']],
|
[['Edit'], ['Comfy.OpenClipspace']],
|
||||||
|
[
|
||||||
|
['Manager'],
|
||||||
|
[
|
||||||
|
'Comfy.Manager.ShowLegacyManagerMenu',
|
||||||
|
'Comfy.Manager.CustomNodesManager.ShowLegacyCustomNodesMenu',
|
||||||
|
'Comfy.Manager.CustomNodesManager.ShowCustomNodesMenu',
|
||||||
|
'Comfy.Memory.UnloadModels',
|
||||||
|
'Comfy.Memory.UnloadModelsAndExecutionCache'
|
||||||
|
]
|
||||||
|
],
|
||||||
[
|
[
|
||||||
['Help'],
|
['Help'],
|
||||||
[
|
[
|
||||||
|
|||||||
@@ -847,5 +847,12 @@ export const CORE_SETTINGS: SettingParams[] = [
|
|||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
defaultValue: false,
|
defaultValue: false,
|
||||||
versionAdded: '1.19.1'
|
versionAdded: '1.19.1'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'Comfy.Memory.AllowManualUnload',
|
||||||
|
name: 'Allow manual unload of models and execution cache via user command',
|
||||||
|
type: 'hidden',
|
||||||
|
defaultValue: true,
|
||||||
|
versionAdded: '1.18.0'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -123,10 +123,12 @@
|
|||||||
"copy": "Copy",
|
"copy": "Copy",
|
||||||
"imageUrl": "Image URL",
|
"imageUrl": "Image URL",
|
||||||
"clear": "Clear",
|
"clear": "Clear",
|
||||||
"copyURL": "Copy URL"
|
"copyURL": "Copy URL",
|
||||||
|
"commandProhibited": "Command {command} is prohibited. Contact an administrator for more information."
|
||||||
},
|
},
|
||||||
"manager": {
|
"manager": {
|
||||||
"title": "Custom Nodes Manager",
|
"title": "Custom Nodes Manager",
|
||||||
|
"legacyMenuNotAvailable": "Legacy manager menu is not available in this version of ComfyUI. Please use the new manager menu instead.",
|
||||||
"failed": "Failed ({count})",
|
"failed": "Failed ({count})",
|
||||||
"noNodesFound": "No nodes found",
|
"noNodesFound": "No nodes found",
|
||||||
"noNodesFoundDescription": "The pack's nodes either could not be parsed, or the pack is a frontend extension only and doesn't have any nodes.",
|
"noNodesFoundDescription": "The pack's nodes either could not be parsed, or the pack is a frontend extension only and doesn't have any nodes.",
|
||||||
|
|||||||
@@ -477,7 +477,8 @@ const zSettings = z.object({
|
|||||||
'main.sub.setting.name': z.any(),
|
'main.sub.setting.name': z.any(),
|
||||||
'single.setting': z.any(),
|
'single.setting': z.any(),
|
||||||
'LiteGraph.Node.DefaultPadding': z.boolean(),
|
'LiteGraph.Node.DefaultPadding': z.boolean(),
|
||||||
'LiteGraph.Pointer.TrackpadGestures': z.boolean()
|
'LiteGraph.Pointer.TrackpadGestures': z.boolean(),
|
||||||
|
'Comfy.Memory.AllowManualUnload': z.boolean()
|
||||||
})
|
})
|
||||||
|
|
||||||
export type EmbeddingsResponse = z.infer<typeof zEmbeddingsResponse>
|
export type EmbeddingsResponse = z.infer<typeof zEmbeddingsResponse>
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ import {
|
|||||||
type ComfyNodeDef,
|
type ComfyNodeDef,
|
||||||
validateComfyNodeDef
|
validateComfyNodeDef
|
||||||
} from '@/schemas/nodeDefSchema'
|
} from '@/schemas/nodeDefSchema'
|
||||||
|
import { useToastStore } from '@/stores/toastStore'
|
||||||
import { WorkflowTemplates } from '@/types/workflowTemplateTypes'
|
import { WorkflowTemplates } from '@/types/workflowTemplateTypes'
|
||||||
|
|
||||||
interface QueuePromptRequestBody {
|
interface QueuePromptRequestBody {
|
||||||
@@ -956,6 +957,57 @@ export class ComfyApi extends EventTarget {
|
|||||||
async getCustomNodesI18n(): Promise<Record<string, any>> {
|
async getCustomNodesI18n(): Promise<Record<string, any>> {
|
||||||
return (await axios.get(this.apiURL('/i18n'))).data
|
return (await axios.get(this.apiURL('/i18n'))).data
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Frees memory by unloading models and optionally freeing execution cache
|
||||||
|
* @param {Object} options - The options object
|
||||||
|
* @param {boolean} options.freeExecutionCache - If true, also frees execution cache
|
||||||
|
*/
|
||||||
|
async freeMemory(options: { freeExecutionCache: boolean }) {
|
||||||
|
try {
|
||||||
|
let mode = ''
|
||||||
|
if (options.freeExecutionCache) {
|
||||||
|
mode = '{"unload_models": true, "free_memory": true}'
|
||||||
|
} else {
|
||||||
|
mode = '{"unload_models": true}'
|
||||||
|
}
|
||||||
|
|
||||||
|
const res = await this.fetchApi(`/free`, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
body: mode
|
||||||
|
})
|
||||||
|
|
||||||
|
if (res.status === 200) {
|
||||||
|
if (options.freeExecutionCache) {
|
||||||
|
useToastStore().add({
|
||||||
|
severity: 'success',
|
||||||
|
summary: 'Models and Execution Cache have been cleared.',
|
||||||
|
life: 3000
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
useToastStore().add({
|
||||||
|
severity: 'success',
|
||||||
|
summary: 'Models have been unloaded.',
|
||||||
|
life: 3000
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
useToastStore().add({
|
||||||
|
severity: 'error',
|
||||||
|
summary:
|
||||||
|
'Unloading of models failed. Installed ComfyUI may be an outdated version.',
|
||||||
|
life: 5000
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
useToastStore().add({
|
||||||
|
severity: 'error',
|
||||||
|
summary: 'An error occurred while trying to unload models.',
|
||||||
|
life: 5000
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const api = new ComfyApi()
|
export const api = new ComfyApi()
|
||||||
|
|||||||
Reference in New Issue
Block a user