在 HAI 上部署 Stable Diffusion WebUI 后,怎么通过 API 接口在自己的网站或小程序里调用
很多朋友在腾讯云 HAI 上一键部署好 Stable Diffusion WebUI 后,都会遇到同一个问题:怎么把 WebUI 的 AI 绘图能力,通过 API 接口接到自己的网站或小程序里?
这篇文章就按“从 0 到能调通接口”的思路,一步步讲清楚:
- 怎么确认 HAI 上的 WebUI 已经开启了 API;
- API 的地址和鉴权怎么看;
- 用一段简单的 Python 代码,实现“网站后台调用 AI 出图”;
- 小程序或前端页面怎么对接;
- 常见坑怎么提前规避。
如果你还没在 HAI 上部署好 Stable Diffusion WebUI,可以先参考官方文档或社区教程,把 WebUI 正常运行起来,再来看这篇会更顺畅。
1. 前提:确认 HAI 上的 WebUI 已开启 API
Stable Diffusion WebUI 本身支持 API 模式,只要在启动命令里加上 --api 参数即可。HAI 这类高性能应用服务,一般会在控制台提供“打开 WebUI”的入口,但默认不一定开启 API,需要自己确认或配置一下。
你可以按下面步骤检查:
- 登录腾讯云控制台,进入高性能应用服务 HAI。
- 找到你创建的 Stable Diffusion WebUI 实例,点击“算力连接”或“打开 WebUI”。
- 在弹出的 WebUI 页面里,看顶部或设置里有没有“API”相关的开关或说明。
- 如果没有,可以进入实例的“终端”或“SSH 登录”,找到 WebUI 的启动命令,确认是否包含
--api参数。
如果启动命令里没有 --api,可以修改启动配置,加上类似下面的参数:
bash webui.sh --listen --port 7860 --api --enable-insecure-extension-access
参数说明:
--listen:允许外部访问 WebUI 和 API。--port 7860:指定端口,默认是 7860。--api:开启 API 接口。--enable-insecure-extension-access:允许加载部分扩展,按需选择。
修改后重启 WebUI,再访问 http://你的HAI公网IP:7860/sdapi/v1/txt2img,如果返回 JSON 格式的信息,就说明 API 已经正常启动了。
2. 找到你的 API 地址和鉴权方式
API 地址一般由“协议 + IP/域名 + 端口 + 路径”组成。在 HAI 场景下,常见形式有:
- 公网访问:
http://<HAI实例公网IP>:7860 - 内网访问:如果你的网站或小程序和 HAI 在同一个 VPC 内,可以用内网地址,延迟更低,比如
http://<HAI实例内网IP>:7860
鉴权方面,Stable Diffusion WebUI 默认不开启鉴权,但为了安全,建议加上。可以在启动命令里通过 --api-auth username:password 设置用户名和密码,比如:
bash webui.sh --listen --port 7860 --api --api-auth admin:123456
这样,调用 API 时需要在请求头里加上 Basic Auth:
Authorization: Basic YWRtaW46MTIzNDU2
其中 YWRtaW46MTIzNDU2 是 username:password 经过 Base64 编码后的结果。
3. 用 Python 写一个“网站后台调用 AI 出图”的示例
假设你已经有一个网站后台(比如用 Flask、Django 或 Node.js 写的),现在想加一个接口,调用 HAI 上的 Stable Diffusion WebUI 生成图片。下面是一个用 Python + requests 写的简单示例:
import json
import requests
import base64
from io import BytesIO
from PIL import Image
HAI 上 WebUI 的 API 地址
url = "http://你的HAI公网IP:7860/sdapi/v1/txt2img"
如果设置了 API 鉴权
auth = ("admin", "123456")
请求参数
payload = {
"prompt": "a beautiful girl with blue eyes, wearing a red dress, in a garden, spring, high quality, detailed",
"negative_prompt": "ugly, deformed, low quality, blurry",
"sampler_name": "Euler a",
"batch_size": 1,
"n_iter": 1,
"steps": 30,
"cfg_scale": 7.5,
"width": 512,
"height": 768,
"seed": 12345,
"send_images": True,
"save_images": False
}
发送 POST 请求
response = requests.post(url, json=payload, auth=auth)
data = response.json()
处理返回的图片
if "images" in data and len(data["images"]) > 0:
解码 Base64 图片数据
image = Image.open(BytesIO(base64.b64decode(data["images"][0])))
保存为本地文件
image.save("output.png")
print("图片已保存为 output.png")
else:
print("生成图片失败:", data)
这段代码的逻辑很简单:
- 构造请求参数,包括正向提示词、负向提示词、采样器、步数、分辨率等。
- 发送 POST 请求到
/sdapi/v1/txt2img接口。 - 解析返回的 JSON 数据,提取 Base64 编码的图片。
- 解码并保存为本地图片。
你可以根据自己的需求,调整 payload 里的参数,比如修改 prompt 生成不同风格的图片,或者调整 steps 和 cfg_scale 控制出图质量和速度。
4. 小程序或前端页面怎么对接
如果你的小程序或前端页面想直接调用 HAI 上的 API,需要注意以下几点:
- 跨域问题:浏览器出于安全考虑,会限制跨域请求。你可以在 HAI 的 WebUI 启动命令里加上
--cors-allow-origins ""参数,允许所有域名访问,或者指定具体的域名,比如--cors-allow-origins "https://你的小程序域名.com"。 - HTTPS 问题:小程序要求所有网络请求必须使用 HTTPS,而 HAI 的 WebUI 默认是 HTTP。你可以通过腾讯云的 CDN 或负载均衡,将 HTTP 请求转发到 HAI 的 API 地址,并配置 HTTPS。
- 鉴权问题:如果设置了 API 鉴权,需要在小程序或前端页面的请求头里加上
Authorization字段,值为Basic <Base64编码后的用户名:密码>。
下面是一个用 JavaScript 写的简单示例,展示如何在小程序里调用 HAI 上的 API:
wx.request({
url: 'https://你的CDN或负载均衡域名/sdapi/v1/txt2img',
method: 'POST',
header: {
'Content-Type': 'application/json',
'Authorization': 'Basic YWRtaW46MTIzNDU2' // admin:123456 的 Base64 编码
},
data: {
"prompt": "a cute cat, sitting on a sofa, cartoon style",
"negative_prompt": "ugly, deformed, low quality",
"sampler_name": "Euler a",
"steps": 20,
"cfg_scale": 7,
"width": 512,
"height": 512
},
success(res) {
if (res.data.images && res.data.images.length > 0) {
const imageBase64 = res.data.images[0];
const imageUrl = 'data:image/png;base64,' + imageBase64;
// 显示图片
this.setData({
imageUrl: imageUrl
});
} else {
console.log('生成图片失败:', res.data);
}
},
fail(err) {
console.log('请求失败:', err);
}
});
这段代码的逻辑和 Python 示例类似,只是用了小程序的 wx.request API 发送请求,并在成功回调里处理返回的图片数据。
5. 常见坑怎么提前规避
- 端口未开放:检查 HAI 实例的安全组规则,确保 7860 端口(或你自定义的端口)已经放行。
- API 未开启:确认启动命令里包含
--api参数。 - 鉴权问题:如果设置了 API 鉴权,记得在请求头里加上
Authorization字段。 - 跨域问题:如果前端页面和 HAI 不在同一个域名下,记得配置 CORS。
- HTTPS 问题:小程序要求所有网络请求必须使用 HTTPS,记得配置 CDN 或负载均衡。
如果你在部署或调用过程中遇到其他问题,可以在腾讯云社区或 HAI 的官方文档里搜索解决方案,或者在相关技术论坛提问。