上面的教程我们基本知道如何开发一个SD webui的扩展,现在我们来看看如何开发一个api的扩展。

在真实项目中,我想为 AUTOMATIC1111 的 SD Web UI 创建一个支持 API 的扩展。虽然代码库中有一些关于创建扩展和自定义脚本的信息,以及指向其他包含扩展模板的代码库的链接,但它们都假设该扩展包含 UI 元素。没有支持 API 的扩展的示例。此外,所有示例都没有包含用于添加自定义端点的代码。
最终发现这很简单,所以我想分享一个可以作为模板的最小示例。
目录层次结构如下:
my_extension_dir
|_my_extension_api
|_api.py
|_scripts
|_my_script.py
|_my_extension_lib
|_various Python modules
您可以将 my_extension_dir 放在 Web UI 的扩展目录中。
对目录层次结构没有太多要求,但如果你有自定义脚本 (my_script.py),则需要将其放在 scripts 目录中。
设置端点非常简单,并且有多种方法可以完成。你可以创建一个类,也可以创建一个函数。我决定使用类。以下是我设置 api.py 的方法:
rom Typing import Callable
from FastAPI import FastAPI
from MyExtensionLib.some_module import Cool_Function
class Api:
def __init__(self, app: FastAPI):
self.app = app
self.add_api_route(
path=f'/my_endpoint',
end=self.do_something,
methods=['GET'], # 或 POST
)
def add_api_route(self, path: str, end: Callable, **kwargs):
return self.app.add_api_route(path, end, **kwargs)
async def do_something(self):
output = Cool_Function()
return {"response": output}
# 这会传递给 my_script.py 中的 on_app_started 方法,然后 Web UI 会将 app 传递给它。
# def load_my_extension_api(_, app: FastAPI):
Api(app)
这是 my_script.py 文件,不过从技术上讲,您可以完全跳过此步骤,具体取决于您的设置方式:
from modules import scripts, script_callbacks # pylint: disable=import-error
from my_extension_api.api import load_my_extension_api # pylint: disable=import-error
class Script(scripts.Script):
def __init__(self):
super().__init__()
def title(self):
return "我的扩展程序"
def show(self, is_img2img):
return scripts.AlwaysVisible
# 这是最重要的部分。这会将您的终端注册到 Web UI。
# 如果您没有自定义脚本,也可以在另一个文件中执行此操作。
script_callbacks.on_app_started(load_my_extension_api)
确保端点已加载的最快捷、最简单的方法是检查自动生成的文档,假设您未进行任何更改,该文档的网址为 http://127.0.0.1:7860/docs。您应该会在那里看到您的端点,甚至可以对其进行测试调用,这非常有用。

请在这个页面上查看api是否存在。
因为webui使用了Gradio框架,一些更多的开发知道也可以参考Gradio对应版本的官方内容。
Happy Coding…
Paragoger衍生者AI训练营。发布者:arnehuo,转载请注明出处:https://www.shxcj.com/archives/9971