关于StableScripts

April 15, 2025 · View on GitHub

Stable Scripts是一种用于Stable Diffusion的Python脚本,它屏蔽了危险的API调用,可以安全地在网络上分享,并稳定复现另一个用户的工作。

为什么要用Python脚本?

相比于传统的Node-based Stable Diffusion UI,Stable Scripts有以下优势:

  • 良好的抽象能力,可以用较短的代码实现复杂的工作流
  • 高复用性,一个脚本中的函数可以被其他脚本调用
  • 更强大的类型系统,脚本函数必须包含类型定义,利用了Python的类型系统,使得继承、多态成为可能

相比于直接使用Python API,Stable Scripts有以下优势:

  • 更安全,Stable Scripts屏蔽了危险的API调用,从网络上下载的脚本可以更安全地运行在本地
  • 更稳定,Stable Scripts的脚本必须在明确定义的项目中使用,用户在分享脚本时,所有依赖的模型、配置、参数信息都会一起打包,如果用户用到了自定义的资源,也会一起打包,确保另一个用户可以稳定复现另一个用户的工作

如何编写一个Stable Scripts?

从示例入手,您可以参考examples 目录下的脚本,了解如何编写一个Stable Scripts。

目录结构如下:

examples/basic/
├── workflow-sd1.py
├── workflow-sdxl.py
├── workflow-flux.py
├── ssproject.yaml

Stable Scripts脚本必须定义在一个项目下,项目根目录下必须包含ssproject.yaml文件,用于定义项目信息。

ssproject.yaml文件内容如下:

ssui_version: 0.1.0
dependencies:
    - <package_name> = <version>

如果有用到第三方python依赖包,必须在此文件中声明,否则无法引用。

编写一个workflow-xx.py文件,来定义Stable Scripts的工作流。

from ssui import workflow, Prompt, Image, Noise
from ssui.config import SSUIConfig
from ssui_image.SD1 import SD1Model, SD1Clip, SD1Latent, SD1Denoise, SD1LatentDecode

config = SSUIConfig()

@workflow
def txt2img(model: SD1Model, positive: Prompt, negative: Prompt) -> Image:
    positive, negative = SD1Clip(config("Prompt To Condition"), model, positive, negative)
    latent = SD1Latent(config("Create Empty Latent"))
    latent = SD1Denoise(config("Denoise"), model, latent, positive, negative)
    return SD1LatentDecode(config("Latent to Image"), model, latent)

这个脚本引入了ssui库,ssui_image库,用于定义Stable Scripts的配置。

如果一个函数被定义为@workflow,那么这个函数就是一个工作流的入口函数,可以显示在UI上。比如上面这个函数,接受一个SD1Model,两个Prompt,返回一个Image。那么在UI就会有如下显示:

txt2img

我们的UI系统中,所有UI控件都是根据函数的参数和返回值类型自动生成的。

配置系统

显然,并不是所有的参数都是要作为函数参数传入的,很多配置非常复杂,如果全部作为参数则界面会非常臃肿。我们提供了一套配置系统,用于管理配置。您可能已经注意到了,在上面的示例代码中,我们有一个全局变量config,用于管理配置。

config = SSUIConfig()

这个配置会在你点击'Show Details'时显示这个工作流的详细配置。

我们要求,每个函数调用,都需要指定当前调用所使用的配置组,如:

SD1Clip(config("Prompt To Condition"), model, positive, negative)

这里,就会在UI上显示一个配置组,名称为Prompt To Condition,所有关于这个API的调用的配置都会显示在这个配置组中。

config