Comfy Object
Comfy Object
精简版图
Comfy UI 建立在LiteGraph之上。Comfy 的大部分功能由 LiteGraph 提供,因此如果开发更复杂的节点,您可能会发现克隆该存储库并浏览文档会很有帮助,文档可在 找到doc/index.html
。
舒适应用
该app
对象(始终可通过 访问import { app } from "../../scripts/app.js";
)代表在浏览器中运行的 Comfy 应用程序,并包含许多有用的属性和功能,其中一些列在下面。
app
不建议劫持功能,因为 Comfy 正在不断开发中,核心行为可能会发生变化。
特性
包含的重要属性app
(这不是详尽的列表):
财产 | 内容 |
---|---|
canvas | 一个 LGraphCanvas 对象,表示当前用户界面。它包含一些可能有趣的属性,例如node_over 和selected_nodes 。 |
canvasEl | DOM<canvas> 元素 |
graph | 对描述当前图表的 LGraph 对象的引用 |
runningNodeId | 执行过程中,当前正在执行的节点 |
ui | 提供对某些 UI 元素的访问,例如队列、菜单和对话框 |
canvas
(对于图形元素)和graph
(对于逻辑连接)可能是您最想要访问的。
功能
同样,还有很多。一些重要因素如下:
功能 | 笔记 |
---|---|
图形提示 | 将图表转换为可以发送到 Python 服务器的提示 |
加载图数据 | 加载图表 |
队列提示 | 向队列提交提示 |
注册扩展 | 你已经看到了这个 - 用于添加扩展 |
线性图
该LGraph
对象是 LiteGraph 框架的一部分,表示图形(节点和链接)的当前逻辑状态。如果您想要操作图形,LiteGraph 文档(如果doc/index.html
您克隆,则位于https://github.com/jagenjo/litegraph.js
)描述了您需要的功能。
您可以使用graph
来获取节点和链接的详细信息,例如:
const ComfyNode_object_for_my_node = app.graph._nodes_by_id(my_node_id)
ComfyNode_object_for_my_node.inputs.forEach(input => {
const link_id = input.link;
if (link_id) {
const LLink_object = app.graph.links[link_id]
const id_of_upstream_node = LLink_object.origin_id
// etc
}
});
链接
对象LLink
可通过 访问graph.links
,表示图中的单个链接,从节点link.origin_id
输出槽link.origin_slot
到节点link.target_id
槽link.target_slot
。它还有一个表示数据类型的字符串,在link.type
和 中link.id
。
LLink
s 是在a (其为子类)connect
的方法中创建的。LGraphNode``ComfyNode
避免创建您自己的 LLink 对象 - 而是使用 LiteGraph 函数。
ComfyNode
ComfyNode
是 的一个子类LGraphNode
,因此 LiteGraph 文档对于更通用的操作很有帮助。但是,Comfy 已显著扩展了 LiteGraph 核心行为,并且并未使用所有 LiteGraph 功能。
以下描述适用于普通节点。组节点、原始节点、注释和重定向节点具有不同的属性。
对象ComfyNode
代表当前工作流中的一个节点。它具有许多您可能希望利用的重要属性,以及您可能希望使用或劫持以修改行为的大量函数。
为了更全面地了解节点对象,您可能会发现将以下代码插入扩展并在console.log
命令上放置断点很有帮助。然后,当您创建新节点时,您可以使用您最喜欢的调试器来查询该节点。
async nodeCreated(node) {
console.log("nodeCreated")
}
特性
财产 | 内容 |
---|---|
bgcolor | 节点的背景颜色,或默认为未定义 |
comfyClass | 表示节点的 Python 类 |
flags | 可能包含与节点状态相关的标志的字典。特别flags.collapsed 适用于折叠节点。 |
graph | 对 LGraph 对象的引用 |
id | 唯一 ID |
input_type | 输入类型列表(例如“STRING”、“MODEL”、“CLIP”等)。通常与 Python INPUT_TYPES 匹配 |
inputs | 输入列表(如下所述) |
mode | 通常为 0,如果节点静音则设置为 2,如果节点被绕过则设置为 4。Comfy 不使用 1 和 3 的值 |
order | 节点在执行顺序中的位置。LGraph.computeExecutionOrder() 在提交提示时设置 |
pos | 节点在画布上的 [x,y] 位置 |
properties | "Node name for S&R" 包含LiteGraph 使用的字典 |
properties_info | 中的条目类型和默认值properties |
size | 节点在画布上的宽度和高度 |
title | 显示标题 |
type | 节点类的唯一名称(来自 Python) |
widgets | 小部件列表(如下所述) |
widgets_values | 小部件的当前值列表 |
功能
函数数量非常多(上次我统计时有 85 个)。下面列出了部分函数。这些函数大部分都与 LiteGraph 核心代码没有经过修改。
输入、输出、小部件
功能 | 笔记 |
---|---|
输入/输出 | 大多数输出方法具有相同的名称:s/In/Out/ |
addInput | 创建新的输入,定义名称和类型 |
addInputs | 数组版本addInput |
findInputSlot | 根据输入名称找到插槽索引 |
findInputSlotByType | 查找与类型匹配的输入。首选或仅使用空闲插槽的选项 |
removeInput | 按插槽索引 |
getInputNode | 获取连接到此输入的节点。输出等效于getOutputNodes 并返回一个列表 |
getInputLink | 获取连接到此输入的 LLink。无等效输出 |
小部件 | |
addWidget | 添加标准 Comfy 小部件 |
addCustomWidget | 添加自定义小部件(在getComfyWidgets 钩子中定义) |
addDOMWidget | 添加由 DOM 元素定义的小部件 |
convertWidgetToInput | 如果允许,将小部件转换为输入isConvertableWidget (在widgetInputs.js ) |
連接
功能 | 笔记 |
---|---|
connect | 将此节点的输出连接到另一个节点的输入 |
connectByType | 通过指定类型将输出连接到另一个节点 - 连接到第一个可用的匹配插槽 |
connectByTypeOutput | 按类型将输入连接到另一个节点输出 |
disconnectInput | 删除输入中的任何链接(由名称或索引指定) |
disconnectOutput | 断开指定节点输入的输出 |
onConnectionChange | 在每个节点上调用。side==1 如果它是此节点上的输入 |
onConnectInput | _在_建立连接之前调用。如果返回false ,则表示连接被拒绝 |
展示
功能 | 笔记 |
---|---|
setDirtyCanvas | 指定需要重新绘制前景(节点)和/或背景(链接和图像) |
onDrawBackground | 使用对象调用CanvasRenderingContext2D 来绘制背景。Comfy 使用它来渲染图像 |
onDrawForeground | 调用一个CanvasRenderingContext2D 对象来绘制节点。 |
getTitle | 要显示的标题。 |
collapse | 切换节点的折叠状态。 |
collapse
命名不当;它_会切换_折叠状态。它需要一个布尔参数,可用于覆盖 node.collapsable === false
。
其他
功能 | 笔记 |
---|---|
changeMode | 用于将节点设置为绕过 ( mode == 4 ) 或不绕过 ( mode == 0 ) |
输入和小部件
输入和小部件代表了将数据输入到节点的两种方式。通常,小部件可以转换为输入,但并非所有输入都可以转换为小部件(因为许多数据类型无法通过 UI 元素输入)。
node.inputs
是当前输入的列表(节点左侧的彩色点),指定它们的.name
、.type
和(对连接的.link
的引用)。LLink``app.graph.links
如果输入是已转换的小部件,它还会保存对现在处于非活动状态的小部件的引用.widget
。
node.widgets
是所有小部件的列表,无论它们是否已转换为输入。小部件具有:
属性/功能 | 笔记 |
---|---|
callback | 当小部件值改变时调用的函数 |
last_y | 小部件在节点中的垂直位置 |
name | (节点内唯一的)小部件名称 |
options | 如 Python 代码中指定(例如默认值、最小值和最大值) |
type | 小部件类型的名称(见下文)小写 |
value | 当前小部件值。这是一个具有get 和set 方法的属性。 |
小部件类型
app.widgets
是当前已注册的小部件类型的字典,键入类型名称的大写版本。内置的 Comfy 小部件类型包括不言自明的BOOLEAN
、INT
和FLOAT
,以及STRING
(有两种形式,单行和多行), COMBO
用于从列表中进行下拉选择,以及IMAGEUPLOAD
用于加载图像节点的。
getCustomWidgets
可以通过在扩展中提供方法来添加自定义小部件类型。
链接的小工具
小部件也可以链接 -例如seed
和的内置行为。链接的小部件具有;因此可能具有 类型。control_after_generate``.type = 'base_widget_type:base_widget_name'``control_after_generate``int:seed
迅速的
Queue Prompt
当在 Comfy 中按下按钮时,app.graphToPrompt()
会调用该方法将当前图形转换为可以发送到服务器的提示。
app.graphToPrompt``prompt
返回一个具有两个属性的对象(在此称为),output
和workflow
。
输出
prompt.output
将图中每个节点的映射node_id
到具有两个属性的对象。
prompt.output[node_id].class_type
,自定义节点类的唯一名称,如 Python 代码中所定义prompt.output[node_id].inputs
,它包含每个输入(或小部件)的值,作为从输入名称到以下内容的映射:- 如果是小部件,则为选定的值,或者
- 如果有链接连接到输入,则为包含(
upstream_node_id
, )的数组,或upstream_node_output_slot
- 未定义,如果它是已转换为输入且未连接的小部件
- 其他未连接的输入不包括在
.inputs
请注意,upstream_node_id
描述连接输入的数组表示为字符串,而不是整数。
工作流程
prompt.workflow
包含以下属性:
config
- 附加配置选项的词典(默认为空)extra
- 包含有关工作流的额外信息的字典。默认情况下,它包含:extra.ds
- 描述图表的当前视图(scale
和offset
)
groups
- 工作流程中的所有组last_link_id
- 最后添加的链接的 idlast_node_id
- 最后添加的节点的 idlinks
- 图中所有链接的列表。每个条目都是一个包含五个整数和一个字符串的数组:- (
link_id
,,,,,)upstream_node_id
upstream_node_output_slot``downstream_node_id``downstream_node_input_slot``data type
- (
nodes
- 图中所有节点的列表。每个条目都是如上所述的节点属性子集的映射- 包含以下属性:
flags
,,,,,,,,,,id``inputs``mode``order``pos``properties``size``type``widgets_values
- 此外,除非节点没有输出,否则有一个
outputs
属性,它是该节点的输出列表,每个输出包含:name
- 输出的名称type
- 输出的数据类型links
- 此输出的所有链接的列表link_id
(如果没有连接,则可能为空列表或为空),shape
- 用于绘制输出的形状(默认为 3,表示一个点)slot_index
- 输出的槽号
- 包含以下属性:
version
- LiteGraph 版本号(撰写本文时0.4
)
nodes.output
对于没有输出的节点来说不存在,而不是空列表。