菜单

脚本架构

相关源文件

本文档解释了 Stable Diffusion Web UI 中的脚本架构。脚本是模块化组件,可以扩展 UI 和处理流程,增加额外功能。有关包含脚本的通用扩展系统的信息,请参阅 扩展系统

概述

脚本架构提供了一个插件系统,允许开发人员修改图像生成过程并添加自定义 UI 组件。脚本可以挂钩到生成流程的各个阶段,从预处理提示到后处理生成的图像。

来源

脚本类和类型

基础脚本类

Script 类是脚本架构的基础。它定义了所有脚本必须实现的接口

Script 类包含几个关键方法

方法目的
title()返回 UI 下拉菜单中显示的显示名称
ui(is_img2img)为脚本创建 Gradio UI 组件
show(is_img2img)确定脚本在 UI 中的可见性
run(p, *args)可选择脚本的主要执行函数
process(p, *args)始终运行脚本的处理钩子
before_process(p, *args)始终运行脚本的早期处理钩子
postprocess(p, processed, *args)始终运行脚本的后处理钩子

脚本可以分为两种主要类型

  1. 可选脚本:从 UI 中的下拉列表中选择
  2. 始终运行脚本:为每次生成自动运行

来源

脚本运行器

ScriptRunner 类负责脚本的加载、组织和执行。它

  1. 根据当前上下文(txt2img 或 img2img)初始化脚本
  2. 设置脚本的 UI 组件
  3. 以正确的顺序处理脚本执行
  4. 管理来自脚本到处理流程的回调

ScriptRunner 中的关键方法

来源

脚本加载与发现

脚本系统会自动发现并从多个位置加载脚本

  1. Web UI 中的主 scripts 目录
  2. modules/processing_scripts 目录
  3. 已启用扩展中的脚本

加载过程包括

  1. 在适当的目录中查找脚本文件
  2. 加载 Python 模块
  3. 识别模块中的脚本类
  4. 将它们注册到适当的运行器
  5. 根据依赖项对脚本进行排序

来源

脚本执行流程

在生成过程中,脚本会在流程的各个点执行

执行流程允许脚本

  • 在生成之前修改处理参数
  • 更改生成过程本身
  • 在生成后修改生成的图像
  • 添加自定义 UI 组件和交互

来源

脚本 UI 集成

脚本可以添加出现在 txt2img 和 img2img 选项卡中的 UI 组件

UI 集成通过以下方式实现

  1. ui(is_img2img) 方法,用于创建 Gradio 组件
  2. ScriptRunner.setup_ui() 方法,用于组装组件
  3. 组件值在处理过程中传递给脚本回调

脚本还可以使用以下方法注册组件创建时的回调

  • before_component()
  • after_component()
  • on_before_component()
  • on_after_component()

来源

脚本回调系统

脚本系统使用回调机制来允许脚本挂钩到生成过程的不同阶段

回调目的何时调用
before_process早期设置在任何处理开始之前
process主要处理钩子在生成开始之前
before_process_batch批处理准备在处理每个批次之前
process_batch批量处理为每个批次在生成之前
postprocess_batch批处理后处理每个批次生成后
post_sample样本修改创建样本后,在 VAE 解码之前
postprocess_image图像后处理为每个生成的图像
postprocess最终后处理在所有处理完成后

回调根据脚本定义以及扩展元数据中指定的任何顺序执行。

来源

创建自定义脚本

要创建自定义脚本,开发人员需要

  1. scripts 目录或扩展的 scripts 目录中创建一个 Python 文件
  2. 定义一个继承自 Script 的类
  3. 实现所需的方法
  4. 可选地为处理流程定义回调

这是一个简化的示例结构

扩展关系

脚本通常是扩展的一部分,扩展提供了更广泛的框架来为 Web UI 添加功能

关系包括

  1. 扩展可以在其 scripts 目录中包含多个脚本
  2. 扩展元数据可以指定脚本的依赖项和加载顺序
  3. 脚本是扩展功能的一部分,但在脚本框架内运行
  4. 扩展系统管理启用/禁用,这会影响脚本的可用性

来源

配置与设置

脚本可以与 WebUI 的设置系统进行交互,以

  1. 通过 shared.opts 访问全局设置
  2. 添加自定义设置部分
  3. 在其处理逻辑中使用设置

配置定义在 shared_options.py 中,并且可以由扩展进行扩展。

来源