Developing extensions
扩展只是extensions
目录中的一个子目录。
Web UI与安装的扩展进行以下交互:
- 如果存在,执行扩展的
install.py
脚本。 - 执行
scripts
目录中的扩展脚本,就像它们只是普通的用户脚本一样,除了: sys.path
被扩展以包括扩展目录,所以你可以导入其中的任何内容而不用担心。然而,请使用唯一的文件名,或者将文件放在一个唯一命名的文件夹中,因为模块将按照你用于导入的名称缓存到全局Python模块树中,并对其他使用相同名称的组件造成意外。- 你可以使用
scripts.basedir()
来获取当前扩展的目录(因为用户可以随意命名它) -
- 注意:
scripts.basedir()
必须在扩展导入阶段使用,
如果在其他时间使用它将返回webui root
。点击查看scripts.basedir()的使用示例
> stable-diffusion-webui\extensions\example_extension_dir\scripts\example.py
py from modules import scripts current_extension_directory = scripts.basedir() # 'stable-diffusion-webui\extensions\example_extension_dir' # 保存供以后使用 class ExampleScript(scripts.Script): def title(self): return 'Example script' def show(self, is_img2img): scripts.basedir() # 'B:\GitHub\stable-diffusion-webui' return scripts.AlwaysVisible
- 注意:
-
将扩展的JavaScript文件添加到页面中
- 将扩展的本地化文件添加到设置中;如果存在两个具有相同名称的本地化文件,则它们不会合并,一个将替换另一个。
- 将扩展的
style.css
文件添加到页面中 - 如果扩展的根目录中有
preload.py
文件,则在解析命令行参数之前加载它 - 如果扩展的
preload.py
有一个preload
函数,则调用它,并将命令行参数解析器作为参数传递给它。以下是如何使用它添加命令行参数的示例:
def preload(parser):
parser.add_argument("--wildcards-dir", type=str, help="directory with wildcards", default=None)
有关如何开发自定义脚本(通常会完成大部分扩展工作)的方法,请参阅开发自定义脚本。
本地化扩展
项目的首选本地化方法是通过创建扩展来实现。扩展的基本文件结构应如下所示:
📁 webui根目录
┗━━ 📁 extensions
┗━━ 📁 webui-localization-la_LA <----- 扩展的名称
┗━━ 📁 localizations <----- 扩展中的唯一目录
┗━━ 📄 la_LA.json <----- 包含翻译的实际文件
创建一个具有此文件结构的GitHub存储库,并要求在协作者部分列出的任何人将您的扩展添加到wiki中。
如果您的语言需要JavaScript/CSS甚至Python支持,您也可以将其添加到扩展中。
install.py
install.py
是由launch.py
启动的脚本,它是在webui启动之前的一个单独进程中运行的,它的目的是安装扩展的依赖项。它必须位于扩展的根目录中,而不是脚本目录中。脚本是使用设置为webui路径的PYTHONPATH
环境变量启动的,因此您可以直接import launch
并使用其功能:
import launch
if not launch.is_installed("aitextgen"):
launch.run_pip("install aitextgen==0.6.0", "MagicPrompt的要求")
metadata.ini
metadata.ini
包含有关扩展的元数据。它是可选的,但如果存在,必须位于扩展的根目录中。它是一个包含以下内容的configparser ini文件:
# 此部分包含有关扩展本身的信息。
# 此部分是可选的。
[Extension]
# 扩展的规范名称。
# 只允许使用小写字母、数字、破折号和下划线。
# 这是扩展的唯一标识符,加载程序将拒绝加载具有相同名称的两个扩展。
# 如果未提供名称,则使用扩展目录的名称。
# 其他扩展可以使用此名称在文件中引用此扩展。
Name = demo-extension
# 此扩展所需安装和启用的扩展的逗号或空格分隔列表。
# 如果此列表中的任何扩展未安装或禁用,加载程序将生成警告。
Requires = another-extension, yet-another-extension
# 声明文件夹的关系
#
# 此部分声明了`scripts`目录中所有文件的关系。
# 通过更改部分名称,它也可以用于`load_scripts`函数遍历的其他目录
# (例如`javascript`和`localization`)。
# 此部分是可选的。
[scripts]
# 此文件夹中的文件所需的逗号或空格分隔的扩展列表。
# 只允许在此处指定扩展。
# 如果此列表中的任何扩展未安装或禁用,加载程序将生成警告。
Requires = another-extension, yet-another-extension
# 一个逗号或空格分隔的扩展列表,表示此文件夹中的文件希望在之前加载。
# 只允许在此处指定扩展名。
# 所有指定文件夹中的文件的加载顺序将被移动,以便当前扩展中的文件在列表中的扩展中的文件之前加载。
Before = 另一个扩展名,另一个扩展名
# 一个逗号或空格分隔的扩展列表,表示此文件夹中的文件希望在之后加载。
# 其他细节与“Before”键相同。
After = 另一个扩展名,另一个扩展名
# 声明特定文件的关系
#
# 此部分声明了特定文件与其他扩展名相同文件夹中的文件的关系。
# 通过更改部分名称,它也可以用于`load_scripts`函数遍历的其他目录
# (例如`javascript`和`localization`)。
# 此部分是可选的。
[scripts/another-script.py]
# 逗号或空格分隔的扩展/文件列表,表示此文件需要存在。
# 文件夹部分中的“Requires”键将被添加到此列表的前面。
# 如果此列表中的任何扩展/文件未安装或已禁用,则加载程序将生成警告。
# 允许指定扩展名或特定文件。
# 引用文件时,必须省略文件夹名称。
#
# 例如,“yet-another-extension/another-script.py”项引用了
# `yet-another-extension`中的`scripts/another-script.py`。
Requires = 另一个扩展名,yet-another-extension/another-script.py,xyz_grid.py
# 逗号或空格分隔的扩展列表,表示此文件希望在之前加载。
# 文件夹部分中的“Before”键将被添加到此列表的前面。
# 此文件的加载顺序将被移动,以便在列表中引用的文件之前加载此文件。
Before = 另一个扩展名,yet-another-extension/another-script.py,xyz_grid.py
# 逗号或空格分隔的扩展列表,表示此文件希望在之后加载。
# 其他细节与“Before”键相同。
After = 另一个扩展名,yet-another-extension/another-script.py,xyz_grid.py
在编写元数据文件时,请注意,虽然部分名称不区分大小写,但键是区分大小写的。
小提示
添加额外的文本反转目录
此代码放入扩展的脚本中:
path = os.path.join(modules.scripts.basedir(), "embeddings")
modules.sd_hijack.model_hijack.embedding_db.add_embedding_dir(path)
用户示例
https://github.com/udon-universe/stable-diffusion-webui-extension-templates \ https://github.com/AliceQAQ/sd-webui-gradio-demo \ https://github.com/wcdnail/sd-web-ui-wexperimental \ https://github.com/EnsignMK/ExampleSendText
官方扩展索引
- 在此处添加扩展 - https://github.com/AUTOMATIC1111/stable-diffusion-webui-extensions
(此外,您可以在此处添加您的扩展和WebUI的工作提交版本:)
- https://github.com/camenduru/sd-webui-extension-records
由@hananbeer绘制的内部图表
- https://github.com/AUTOMATIC1111/stable-diffusion-webui/discussions/8601
https://miro.com/app/board/uXjVMdgY-TY=/?share_link_id=547908852229
许可证
如果您希望根据与该项目使用的开源许可证不同的许可证创建和共享扩展,我没有异议。