Skip to content

API

示例脚本

txt2img和img2img示例Python脚本

有用的工具

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

image

  • 当你展开该选项卡时,它会给出一个发送到API的示例负载。我经常用这个作为参考。

image


  • 这就是后端。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。响应包含三个条目:imagesparametersinfo,我必须找到一种方法来从这些条目中获取信息。
  • 首先,我添加了这行代码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 中找到可以传递给此参数的设置。

image

您可以展开选项卡,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 使用自定义脚本/扩展的示例在这里