API
示例脚本
有用的工具
API负载显示是一个将WebUI图像生成调用转换为JSON的扩展
API指南由@Kilvoctu提供
ℹ️ 注意: 截至2023-09-09,此指南目前未得到维护,信息可能已过时。请注意,可以始终通过
/docs
端点(即http://127.0.0.1:7860/docs)访问内部文档
- 首先,当然是使用
--api
命令行参数运行webui - 例如在你的"webui-user.bat"中:
set COMMANDLINE_ARGS=--api
- 这将启用API,可以在http://127.0.0.1:7860/docs(或URL + /docs)上查看
我感兴趣的基本功能是这两个。让我们只关注
/sdapi/v1/txt2img
- 当你展开该选项卡时,它会给出一个发送到API的示例负载。我经常用这个作为参考。
-
这就是后端。API基本上说明了可用的内容,它要求什么以及将其发送到哪里。现在转向前端,我将从构建一个带有我想要的参数的负载开始。一个示例可以是:
py payload = { "prompt": "马耳他犬小狗", "steps": 5 }
我可以在负载中放入尽少或尽多的参数。对于我没有设置的任何内容,API将使用默认值。 -
之后,我可以将其发送到API
py response = requests.post(url='http://127.0.0.1:7860/sdapi/v1/txt2img', json=payload)
再次,此URL需要与Web UI的URL匹配。 如果我们执行此代码,Web UI将根据负载生成图像。这很好,但是接下来呢?没有任何地方有图像...
- 后端完成其工作后,API将响应发送回之前分配的变量
response
。响应包含三个条目:images
、parameters
和info
,我必须找到一种方法来从这些条目中获取信息。 - 首先,我添加了这行代码
r = response.json()
,以便更容易处理响应。 - "images"是一个包含Base64编码的生成图像的列表。
- 从那里,我们可以解码并保存它。
python with open("output.png", 'wb') as f: f.write(base64.b64decode(r['images'][0]))
一个可以工作的示例脚本可以如下所示:
import requests
import base64
# 定义URL和要发送的负载。
url = "http://127.0.0.1:7860"
payload = {
"prompt": "puppy dog",
"steps": 5
}
# 通过API将负载发送到URL。
response = requests.post(url=f'{url}/sdapi/v1/txt2img', json=payload)
r = response.json()
# 解码并保存图像。
with open("output.png", 'wb') as f:
f.write(base64.b64decode(r['images'][0]))
关于override_settings
的说明。
此参数的目的是为了覆盖Web界面的设置,例如模型或CLIP跳过单个请求。可以在URL /docs
中找到可以传递给此参数的设置。
您可以展开选项卡,API将提供一个列表。有几种方法可以将此值添加到负载中,但这是我使用的方法。我将使用"sd_model_checkpoint"和"CLIP_stop_at_last_layers"进行演示。
payload = {
"prompt": "cirno",
"steps": 20,
"override_settings" = {
"sd_model_checkpoint": "Anything-V3.0-pruned",
"CLIP_stop_at_last_layers": 2,
}
}
因此,在这种情况下,当我发送负载时,我应该得到一个在20步中使用"Anything-V3.0-pruned"模型和CLIP跳过2的"cirno"。
对于某些设置或情况,您可能希望更改保持不变。为此,您可以将其发布到/sdapi/v1/options
API端点。
我们可以根据我们学到的知识轻松设置代码。以下是一个示例:
url = "http://127.0.0.1:7860"
```python
option_payload = {
"sd_model_checkpoint": "Anything-V3.0-pruned",
"CLIP_stop_at_last_layers": 2
}
response = requests.post(url=f'{url}/sdapi/v1/options', json=option_payload)
发送这个payload到API后,模型应该会切换到我设置的模型,并将CLIP跳过设置为2。需要强调的是,这与override_settings
不同,因为这个更改将持久存在,而override_settings
只对单个请求有效。
请注意,如果要更改sd_model_checkpoint
,可以使用在Web界面中显示的检查点名称、文件名(带或不带扩展名)或哈希值作为值。
这是在提交47a44c7时的情况。
对于一个更完整的前端实现,我的Discord机器人在这里,如果有人想要作为示例查看。大部分操作都在stablecog.py中进行。有很多注释解释了每段代码的作用。
这个指南可以在讨论页面找到。
此外,还可以查看这个用于Web界面的Python API客户端库:https://github.com/mix1009/sdwebuiapi 使用自定义脚本/扩展的示例在这里。