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。
LLinks 是在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_idupstream_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对于没有输出的节点来说不存在,而不是空列表。