Some checks failed
Python Linting / Run Ruff (push) Has been cancelled
Python Linting / Run Pylint (push) Has been cancelled
Full Comfy CI Workflow Runs / test-stable (12.1, , linux, 3.10, [self-hosted Linux], stable) (push) Has been cancelled
Full Comfy CI Workflow Runs / test-stable (12.1, , linux, 3.11, [self-hosted Linux], stable) (push) Has been cancelled
Full Comfy CI Workflow Runs / test-stable (12.1, , linux, 3.12, [self-hosted Linux], stable) (push) Has been cancelled
Full Comfy CI Workflow Runs / test-unix-nightly (12.1, , linux, 3.11, [self-hosted Linux], nightly) (push) Has been cancelled
Execution Tests / test (macos-latest) (push) Has been cancelled
Execution Tests / test (ubuntu-latest) (push) Has been cancelled
Execution Tests / test (windows-latest) (push) Has been cancelled
Test server launches without errors / test (push) Has been cancelled
Unit Tests / test (macos-latest) (push) Has been cancelled
Unit Tests / test (ubuntu-latest) (push) Has been cancelled
Unit Tests / test (windows-2022) (push) Has been cancelled
Includes 30 custom nodes committed directly, 7 Civitai-exclusive loras stored via Git LFS, and a setup script that installs all dependencies and downloads HuggingFace-hosted models on vast.ai. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
228 lines
6.2 KiB
TypeScript
228 lines
6.2 KiB
TypeScript
import type { LGraphGroup as TLGraphGroup, LGraphNode as TLGraphNode, IWidget, SerializedLGraphNode, LGraph as TLGraph, LGraphCanvas as TLGraphCanvas, LiteGraph as TLiteGraph } from "./litegraph.js";
|
|
import type {Constructor, SerializedGraph} from './index.js';
|
|
|
|
declare global {
|
|
const LiteGraph: typeof TLiteGraph;
|
|
const LGraph: typeof TLGraph;
|
|
const LGraphNode: typeof TLGraphNode;
|
|
const LGraphCanvas: typeof TLGraphCanvas;
|
|
const LGraphGroup: typeof TLGraphGroup;
|
|
}
|
|
|
|
// @rgthree: Types on ComfyApp as needed.
|
|
export interface ComfyApp {
|
|
extensions: ComfyExtension[];
|
|
async queuePrompt(number?: number, batchCount = 1): Promise<void>;
|
|
graph: TLGraph;
|
|
canvas: TLGraphCanvas;
|
|
clean() : void;
|
|
registerExtension(extension: ComfyExtension): void;
|
|
getPreviewFormatParam(): string;
|
|
getRandParam(): string;
|
|
loadApiJson(apiData: {}, fileName: string): void;
|
|
async graphToPrompt(graph?: TLGraph, clean?: boolean): Promise<void>;
|
|
// workflow: ComfyWorkflowInstance ???
|
|
async loadGraphData(graphData: {}, clean?: boolean, restore_view?: boolean, workflow?: any|null): Promise<void>
|
|
ui: {
|
|
settings: {
|
|
addSetting(config: {id: string, name: string, type: () => HTMLElement}) : void;
|
|
}
|
|
}
|
|
// Just marking as any for now.
|
|
menu?: any;
|
|
}
|
|
|
|
export interface ComfyWidget extends IWidget {
|
|
// https://github.com/comfyanonymous/ComfyUI/issues/2193 Changes from SerializedLGraphNode to
|
|
// LGraphNode...
|
|
serializeValue(nodeType: TLGraphNode, index: number): Promise<TValue>;
|
|
afterQueued(): void;
|
|
inputEl?: HTMLTextAreaElement;
|
|
width: number;
|
|
}
|
|
|
|
export interface ComfyGraphNode extends TLGraphNode {
|
|
getExtraMenuOptions: (node: TLGraphNode, options: ContextMenuItem[]) => void;
|
|
onExecuted(message: any): void;
|
|
}
|
|
|
|
export interface ComfyNode extends TLGraphNode {
|
|
comfyClass: string;
|
|
}
|
|
|
|
// @rgthree
|
|
export interface ComfyNodeConstructor extends Constructor<ComfyNode> {
|
|
static title: string;
|
|
static type?: string;
|
|
static comfyClass: string;
|
|
}
|
|
|
|
export type NodeMode = 0|1|2|3|4|undefined;
|
|
|
|
|
|
export interface ComfyExtension {
|
|
/**
|
|
* The name of the extension
|
|
*/
|
|
name: string;
|
|
/**
|
|
* Allows any initialisation, e.g. loading resources. Called after the canvas is created but before nodes are added
|
|
* @param app The ComfyUI app instance
|
|
*/
|
|
init?(app: ComfyApp): Promise<void>;
|
|
/**
|
|
* Allows any additonal setup, called after the application is fully set up and running
|
|
* @param app The ComfyUI app instance
|
|
*/
|
|
setup?(app: ComfyApp): Promise<void>;
|
|
/**
|
|
* Called before nodes are registered with the graph
|
|
* @param defs The collection of node definitions, add custom ones or edit existing ones
|
|
* @param app The ComfyUI app instance
|
|
*/
|
|
addCustomNodeDefs?(defs: Record<string, ComfyObjectInfo>, app: ComfyApp): Promise<void>;
|
|
/**
|
|
* Allows the extension to add custom widgets
|
|
* @param app The ComfyUI app instance
|
|
* @returns An array of {[widget name]: widget data}
|
|
*/
|
|
getCustomWidgets?(
|
|
app: ComfyApp
|
|
): Promise<
|
|
Record<string, (node, inputName, inputData, app) => { widget?: IWidget; minWidth?: number; minHeight?: number }>
|
|
>;
|
|
/**
|
|
* Allows the extension to add additional handling to the node before it is registered with LGraph
|
|
* @rgthree changed nodeType from `typeof LGraphNode` to `ComfyNodeConstructor`
|
|
* @param nodeType The node class (not an instance)
|
|
* @param nodeData The original node object info config object
|
|
* @param app The ComfyUI app instance
|
|
*/
|
|
beforeRegisterNodeDef?(nodeType: ComfyNodeConstructor, nodeData: ComfyObjectInfo, app: ComfyApp): Promise<void>;
|
|
/**
|
|
* Allows the extension to register additional nodes with LGraph after standard nodes are added
|
|
* @param app The ComfyUI app instance
|
|
*/
|
|
// @rgthree - add void for non async
|
|
registerCustomNodes?(app: ComfyApp): void|Promise<void>;
|
|
/**
|
|
* Allows the extension to modify a node that has been reloaded onto the graph.
|
|
* If you break something in the backend and want to patch workflows in the frontend
|
|
* This is the place to do this
|
|
* @param node The node that has been loaded
|
|
* @param app The ComfyUI app instance
|
|
*/
|
|
loadedGraphNode?(node: TLGraphNode, app: ComfyApp);
|
|
/**
|
|
* Allows the extension to run code after the constructor of the node
|
|
* @param node The node that has been created
|
|
* @param app The ComfyUI app instance
|
|
*/
|
|
nodeCreated?(node: TLGraphNode, app: ComfyApp);
|
|
}
|
|
|
|
export type ComfyObjectInfo = {
|
|
name: string;
|
|
display_name?: string;
|
|
description?: string;
|
|
category: string;
|
|
input?: {
|
|
required?: Record<string, ComfyObjectInfoConfig>;
|
|
optional?: Record<string, ComfyObjectInfoConfig>;
|
|
hidden?: Record<string, ComfyObjectInfoConfig>;
|
|
};
|
|
output?: string[];
|
|
output_name: string[];
|
|
// @rgthree
|
|
output_node?: boolean;
|
|
};
|
|
|
|
export type ComfyObjectInfoConfig = [string | any[]] | [string | any[], any];
|
|
|
|
// @rgthree
|
|
type ComfyApiInputLink = [
|
|
/** The id string of the connected node. */
|
|
string,
|
|
/** The output index. */
|
|
number,
|
|
]
|
|
|
|
// @rgthree
|
|
export type ComfyApiFormatNode = {
|
|
"inputs": {
|
|
[input_name: string]: string|number|boolean|ComfyApiInputLink,
|
|
},
|
|
"class_type": string,
|
|
"_meta": {
|
|
"title": string,
|
|
}
|
|
}
|
|
|
|
// @rgthree
|
|
export type ComfyApiFormat = {
|
|
[node_id: string]: ComfyApiFormatNode
|
|
}
|
|
|
|
// @rgthree
|
|
export type ComfyApiPrompt = {
|
|
workflow: SerializedGraph,
|
|
output: ComfyApiFormat,
|
|
}
|
|
|
|
// @rgthree
|
|
export type ComfyApiEventDetailStatus = {
|
|
exec_info: {
|
|
queue_remaining: number;
|
|
};
|
|
};
|
|
|
|
// @rgthree
|
|
export type ComfyApiEventDetailExecutionStart = {
|
|
prompt_id: string;
|
|
};
|
|
|
|
// @rgthree
|
|
export type ComfyApiEventDetailExecuting = null | string;
|
|
|
|
// @rgthree
|
|
export type ComfyApiEventDetailProgress = {
|
|
node: string;
|
|
prompt_id: string;
|
|
max: number;
|
|
value: number;
|
|
};
|
|
|
|
// @rgthree
|
|
export type ComfyApiEventDetailExecuted = {
|
|
node: string;
|
|
prompt_id: string;
|
|
output: any;
|
|
};
|
|
|
|
// @rgthree
|
|
export type ComfyApiEventDetailCached = {
|
|
nodes: string[];
|
|
prompt_id: string;
|
|
};
|
|
|
|
// @rgthree
|
|
export type ComfyApiEventDetailExecuted = {
|
|
prompt_id: string;
|
|
node: string;
|
|
output: any;
|
|
};
|
|
|
|
// @rgthree
|
|
export type ComfyApiEventDetailError = {
|
|
prompt_id: string;
|
|
exception_type: string;
|
|
exception_message: string;
|
|
node_id: string;
|
|
node_type: string;
|
|
node_id: string;
|
|
traceback: string;
|
|
executed: any[];
|
|
current_inputs: {[key: string]: (number[]|string[])};
|
|
current_outputs: {[key: string]: (number[]|string[])};
|
|
}
|