ComfyScript

ComfyScript

简化AI图像生成工作流的Python工具

ComfyScript是一个Python工具,旨在简化ComfyUI的AI图像生成工作流。它支持以人类可读格式编写和管理工作流,直接运行脚本生成图像,将ComfyUI用作函数库,以及生成和转换工作流。ComfyScript的transpiler功能可将ComfyUI工作流转换为Python脚本,便于比较、重用和优化。这个开源项目为AI图像生成提供了更灵活的工具,增强了开发者和研究人员的能力。

ComfyScriptComfyUIAI绘图工作流PythonGithub开源项目

ComfyScript

PyPI - 版本 Python 版本来自 PEP 621 TOML 许可证

一个用于 ComfyUI 的 Python 前端和库。

它有以下用途:

  • 作为 ComfyUI 工作流的人类可读格式

    这使得比较和重用工作流的不同部分变得容易。

    还可以训练 LLM 生成工作流,因为许多 LLM 能较好地处理 Python 代码。这种方法比仅仅让 LLM 提供一些硬编码参数更强大。

    脚本可以从 ComfyUI 的工作流自动转译。详见转译器

  • 直接运行脚本生成图像。

    相比使用 Web UI,这样做的主要优势是能够将 Python 代码与 ComfyUI 的节点混合使用,例如进行循环、调用库函数和轻松封装自定义节点。这也使得添加交互变得更容易,因为 UI 和逻辑都可以用 Python 编写。而且,有些人可能觉得简单的 Python 代码比基于图形的 GUI 更舒适。1

    详见运行时。脚本可以在本地执行,也可以通过 ComfyUI 服务器远程执行。

  • 将 ComfyUI 用作函数库。

    通过 ComfyScript,ComfyUI 的节点可以作为函数用于 ML 研究、在其他项目中重用节点、调试自定义节点,以及优化缓存以更快地运行工作流。

    详见运行时的实际模式

  • 用脚本生成 ComfyUI 的工作流。

    脚本还可以用来生成 ComfyUI 的工作流,然后在 Web UI 或其他地方使用。这样,可以使用循环并生成巨大的工作流,而手动创建这些工作流可能会耗时或不切实际。详见工作流生成。也可以从 ComfyScript 生成的图像中加载工作流。

  • 通过运行带有一些存根的脚本来检索所需的任何信息。

    详见工作流信息检索

  • 无需 Web UI 即可将工作流从 ComfyUI 的 Web UI 格式转换为 API 格式。

文档

安装

与 ComfyUI 一起安装

首先安装 ComfyUI。然后运行以下命令:

cd ComfyUI/custom_nodes git clone https://github.com/Chaoses-Ib/ComfyScript.git cd ComfyScript python -m pip install -e ".[default]"

(如果看到 ERROR: File "setup.py" or "setup.cfg" not found,先运行 python -m pip install -U pip。)

更新:

cd ComfyUI/custom_nodes/ComfyScript git pull python -m pip install -e ".[default]"

与 ComfyUI 包一起安装

首先安装 ComfyUI 包

  • 如果未安装 PyTorch:

    python -m pip install git+https://github.com/hiddenswitch/ComfyUI.git
  • 如果已安装 PyTorch(例如 Google Colab):

    python -m pip install wheel python -m pip install --no-build-isolation git+https://github.com/hiddenswitch/ComfyUI.git

安装/更新 ComfyScript:

python -m pip install -U "comfy-script[default]"

[default] 对安装常用依赖项是必要的。其他选项见 pyproject.toml。如果未指定选项,将安装不含任何依赖项的 comfy-script

如果最新的 ComfyUI 包有问题,可以使用最后测试的版本:

python -m pip install --no-build-isolation git+https://github.com/hiddenswitch/ComfyUI.git@e49c662c7f026f05a5e082d48b629e2b977c0441

其他

如果遇到任何问题,请参阅故障排除。要在未安装 ComfyUI 的情况下使用 ComfyScript,请参阅仅 ComfyScript 包。要卸载,请参阅卸载

转译器

转译器可以将 ComfyUI 的工作流转译为 ComfyScript。

当 ComfyScript 作为自定义节点安装时,SaveImage 和类似节点将被挂钩以自动将脚本保存为图像的元数据。脚本也会打印到终端。

例如,这是 ComfyUI 中的一个工作流:

ComfyScript 从中翻译得到:

model, clip, vae = CheckpointLoaderSimple('v1-5-pruned-emaonly.ckpt') conditioning = CLIPTextEncode('美丽的自然景观玻璃瓶风景,,紫色星系瓶子,', clip) conditioning2 = CLIPTextEncode('文本, 水印', clip) latent = EmptyLatentImage(512, 512, 1) latent = KSampler(model, 156680208700286, 20, 8, 'euler', 'normal', conditioning, conditioning2, latent, 1) image = VAEDecode(latent, vae) SaveImage(image, 'ComfyUI')

如果一个工作流中有两个或更多的SaveImage节点,只有每个节点必要的输入会被转换为脚本。例如,这里是一个2次传递的txt2img(高分辨率修复)工作流:

为每个保存的图像保存的ComfyScript分别是:

  1. model, clip, vae = CheckpointLoaderSimple('v2-1_768-ema-pruned.ckpt') conditioning = CLIPTextEncode('杰作HDR维多利亚时代女性肖像画,金发,山川自然,蓝天', clip) conditioning2 = CLIPTextEncode('糟糕的手,文本,水印', clip) latent = EmptyLatentImage(768, 768, 1) latent = KSampler(model, 89848141647836, 12, 8, 'dpmpp_sde', 'normal', conditioning, conditioning2, latent, 1) image = VAEDecode(latent, vae) SaveImage(image, 'ComfyUI')
  2. model, clip, vae = CheckpointLoaderSimple('v2-1_768-ema-pruned.ckpt') conditioning = CLIPTextEncode('杰作HDR维多利亚时代女性肖像画,金发,山川自然,蓝天', clip) conditioning2 = CLIPTextEncode('糟糕的手,文本,水印', clip) latent = EmptyLatentImage(768, 768, 1) latent = KSampler(model, 89848141647836, 12, 8, 'dpmpp_sde', 'normal', conditioning, conditioning2, latent, 1) latent2 = LatentUpscale(latent, 'nearest-exact', 1152, 1152, 'disabled') latent2 = KSampler(model, 469771404043268, 14, 8, 'dpmpp_2m', 'simple', conditioning, conditioning2, latent2, 0.5) image = VAEDecode(latent2, vae) SaveImage(image, 'ComfyUI')

比较脚本:

要控制这些功能,请参见settings.example.toml

您也可以通过CLI使用转译器。

运行时

使用运行时,可以像这样运行ComfyScript:

from comfy_script.runtime import * load() from comfy_script.runtime.nodes import * with Workflow(): model, clip, vae = CheckpointLoaderSimple('v1-5-pruned-emaonly.ckpt') conditioning = CLIPTextEncode('美丽的自然景观玻璃瓶风景,,紫色星系瓶子,', clip) conditioning2 = CLIPTextEncode('文本, 水印', clip) latent = EmptyLatentImage(512, 512, 1) latent = KSampler(model, 156680208700286, 20, 8, 'euler', 'normal', conditioning, conditioning2, latent, 1) image = VAEDecode(latent, vae) SaveImage(image, 'ComfyUI')

examples/runtime.ipynb中提供了一个Jupyter Notebook示例。(examples目录下的文件将被Git忽略,您可以在那里放置个人笔记本。)

  • 加载后将在comfy_script/runtime/nodes.pyi生成类型存根。主流代码编辑器(如VS Code)可以使用它们来帮助编码:

    为所有提供值列表的参数生成Python枚举。因此,您可以使用以下方式而不是复制粘贴像'v1-5-pruned-emaonly.ckpt'这样的字符串:

    Checkpoints.v1_5_pruned_emaonly # 或 CheckpointLoaderSimple.ckpt_name.v1_5_pruned_emaonly

    嵌入也可以被引用为Embeddings.my_embedding,这等同于'embedding:my-embedding'。详情请参见枚举

    如果类型存根对您不起作用(无法获得类似截图的结果),请参见类型存根不起作用

  • 运行时默认是异步的。你可以在不等待第一个任务完成的情况下队列多个任务。守护线程将监视并报告队列中剩余的任务和当前进度,例如:

    队列剩余:1
    队列剩余:2
    100%|██████████████████████████████████████████████████| 20/20
    队列剩余:1
    100%|██████████████████████████████████████████████████| 20/20
    队列剩余:0
    

    还提供了一些控制函数:

    # 中断当前任务 queue.cancel_current() # 清空队列 queue.cancel_remaining() # 中断当前任务并清空队列 queue.cancel_all() # 当队列为空时调用回调函数 queue.when_empty(callback) # 使用工作流: Workflow(cancel_remaining=True) Workflow(cancel_all=True)

如果你之前是ComfyUI网页界面的用户,请参阅与ComfyUI网页界面的差异,有关运行时的详细信息,请参阅运行时

示例

绘图

with Workflow(): seed = 0 pos = '天空,1个女孩,微笑' neg = 'embedding:easynegative' model, clip, vae = CheckpointLoaderSimple(Checkpoints.AOM3A1B_orangemixs) model2, clip2, vae2 = CheckpointLoaderSimple(Checkpoints.CounterfeitV25_25) model2 = TomePatchModel(model2, 0.5) for color in '红色', '绿色', '蓝色': latent = EmptyLatentImage(440, 640) latent = KSampler(model, seed, steps=15, cfg=6, sampler_name='uni_pc', positive=CLIPTextEncode(f'{color}, {pos}', clip), negative=CLIPTextEncode(neg, clip), latent_image=latent) SaveImage(VAEDecode(latent, vae2), f'{seed} {color}') latent = LatentUpscaleBy(latent, scale_by=2) latent = KSampler(model2, seed, steps=15, cfg=6, sampler_name='uni_pc', positive=CLIPTextEncode(f'{color}, {pos}', clip2), negative=CLIPTextEncode(neg, clip2), latent_image=latent, denoise=0.6) SaveImage(VAEDecode(latent, vae2), f'{seed} {color} 高清')

自动队列

当队列变空时自动将新工作流加入队列。

例如,可以使用comfyui-photoshop(目前有些bug)在Photoshop中的图像变化时自动执行img2img:

def f(wf): seed = 0 pos = '1个女孩,生气,竖中指' neg = 'embedding:easynegative' model, clip, vae = CheckpointLoaderSimple(Checkpoints.CounterfeitV25_25) image, width, height = PhotoshopToComfyUI(wait_for_photoshop_changes=True) latent = VAEEncode(image, vae) latent = LatentUpscaleBy(latent, scale_by=1.5) latent = KSampler(model, seed, steps=15, cfg=6, sampler_name='uni_pc', positive=CLIPTextEncode(pos, clip), negative=CLIPTextEncode(neg, clip), latent_image=latent, denoise=0.8) PreviewImage(VAEDecode(latent, vae)) queue.when_empty(f)

截图:

选择和处理

例如,一次生成3张图像,然后让用户决定他们想要高清修复哪些:

import ipywidgets as widgets queue.watch_display(False, False) latents = [] image_batches = [] with Workflow(): seed = 0 pos = '天空,1个女孩,微笑' neg = 'embedding:easynegative' model, clip, vae = CheckpointLoaderSimple(Checkpoints.AOM3A1B_orangemixs) model2, clip2, vae2 = CheckpointLoaderSimple(Checkpoints.CounterfeitV25_25) for color in '红色', '绿色', '蓝色': latent = EmptyLatentImage(440, 640) latent = KSampler(model, seed, steps=15, cfg=6, sampler_name='uni_pc', positive=CLIPTextEncode(f'{color}, {pos}', clip), negative=CLIPTextEncode(neg, clip), latent_image=latent) latents.append(latent) image_batches.append(SaveImage(VAEDecode(latent, vae), f'{seed} {color}')) grid = widgets.GridspecLayout(1, len(image_batches)) for i, image_batch in enumerate(image_batches): image_batch = image_batch.wait() image = widgets.Image(value=image_batch[0]._repr_png_()) button = widgets.Button(description=f'高清修复 {i}') def hiresfix(button, i=i): print(f'选择了图像 {i}') with Workflow(): latent = LatentUpscaleBy(latents[i], scale_by=2) latent = KSampler(model2, seed, steps=15, cfg=6, sampler_name='uni_pc', positive=CLIPTextEncode(pos, clip2), negative=CLIPTextEncode(neg, clip2), latent_image=latent, denoise=0.6) image_batch = SaveImage(VAEDecode(latent, vae2), f'{seed} 高清') display(image_batch.wait()) button.on_click(hiresfix) grid[0, i] = widgets.VBox(children=(image, button)) display(grid)

这个例子使用ipywidgets作为GUI,但也可以使用其他GUI框架。

截图:

用户界面

ipywidgets 用户界面

图像查看器

一个简单的图像查看器,可以显示多张图片,并可选择添加标题。

Solara 用户界面

这些 Solara 小部件可以在 Jupyter Notebook 和网页中使用。

元数据查看器

一个用于查看由 ComfyScript / ComfyUI / Stable Diffusion 网页界面生成的图像元数据的小部件。同时支持工作流 JSON 文件,包括网页界面格式和 API 格式。

Footnotes

  1. 我讨厌节点。(对不起 comfyui):StableDiffusion

编辑推荐精选

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

Hunyuan3D-2

Hunyuan3D-2

高分辨率纹理 3D 资产生成

Hunyuan3D-2 是腾讯开发的用于 3D 资产生成的强大工具,支持从文本描述、单张图片或多视角图片生成 3D 模型,具备快速形状生成能力,可生成带纹理的高质量 3D 模型,适用于多个领域,为 3D 创作提供了高效解决方案。

3FS

3FS

一个具备存储、管理和客户端操作等多种功能的分布式文件系统相关项目。

3FS 是一个功能强大的分布式文件系统项目,涵盖了存储引擎、元数据管理、客户端工具等多个模块。它支持多种文件操作,如创建文件和目录、设置布局等,同时具备高效的事件循环、节点选择和协程池管理等特性。适用于需要大规模数据存储和管理的场景,能够提高系统的性能和可靠性,是分布式存储领域的优质解决方案。

下拉加载更多