在自有系统里调用 Stableboost 的 API 做批量出图,核心问题是把“认证、提交任务、轮询、下载”串成一个能处理失败和限流的循环。下面的骨架用 Python requests 实现,适合在脚本或后端服务里跑,所有请求地址和密钥都用占位符,替换后在命令行执行,通过检查返回码和输出文件来判断是否接通。
适用场景:已有 Stableboost 账号,想在脚本中批量生成图片。操作动作:先在账号设置里取得 API 密钥,再把密钥写入环境变量;用 POST 提交包含 prompt、negative_prompt、steps 等参数的 JSON;若返回异步 task_id,则轮询 GET 接口直到 status 变为成功或失败。验证方式:运行脚本后查看日志中的 request_id 和输出目录中的图片文件。风险边界:不同账号对必填字段和限流阈值可能不同,需要结合自己的返回体调整字段名和状态值。
从界面或文档获取API访问凭证
登录 Stableboost 后,通常在个人设置或开发者选项里找到 API Access Tokens 或类似入口,点击生成一个新的密钥。密钥一般只显示一次,复制后要立刻保存。
不要让密钥出现在代码仓库或命令行历史里,建议写到环境变量。Linux/macOS 可以这样导出:
export STABLEBOOST_API_KEY="sk-xxxxxxxxxxxx"
Windows PowerShell 用:
$env:STABLEBOOST_API_KEY="sk-xxxxxxxxxxxx"
然后在 Python 里读取:
import os
API_KEY = os.environ.get("STABLEBOOST_API_KEY", "")
if not API_KEY:
raise SystemExit("请先设置 STABLEBOOST_API_KEY 环境变量")
验证方式:先写一个最简单的 GET 请求(通常是 /v1/account 或 /v1/me 之类的端点),返回 200 说明密钥身份认证通过;返回 401 就检查密钥复制是否完整。
构造图像生成请求参数
批量出图的请求体通常是 JSON。不同版本的 API 字段名可能有差异,但以下字段是常见必填项:prompt(提示词)、steps(采样步数)、width 和 height(出图尺寸)。negative_prompt 多数情况下是可选,但建议显式传入以控制画面质量。
payload = {
"prompt": "a red apple on a wooden table, studio lighting",
"negative_prompt": "blurry, low quality, watermark",
"steps": 30,
"width": 512,
"height": 512
}
构造请求时,建议把每个任务的索引或自定义标识写入请求体,例如 "metadata": {"task_no": i}。这样下载图片后能对应到原始需求,避免批量文件顺序错乱。
必填项确认方法:先构造一个最小请求,故意不加 negative_prompt 和尺寸,如果接口返回 400 并在错误信息里提示缺少字段,就按提示补上。
发送请求并处理异步任务
批量生成通常不会同步返回图片,而是返回一个任务 ID,需要后端异步跑完后再取回。用 requests 发送 POST 请求时,要带上认证头和 JSON 内容:
import requests
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
def submit_task(payload: dict) -> str:
resp = requests.post(
"https://api.stableboost.example/v1/generation",
headers=headers,
json=payload,
timeout=30
)
resp.raise_for_status()
data = resp.json()
if "task_id" not in data:
raise RuntimeError(f"响应中缺少 task_id,完整响应: {data}")
return data["task_id"]
提交后先打印 task_id,确认能拿到再往下写轮询。如果返回的是 id 或 job_id,就把提取字段换成对应的名字。
轮询任务状态并下载结果
拿到 task_id 后,需要循环请求任务状态接口,直到状态变成 success 或 failed。这里要注意轮询间隔不要太短,通常建议 2-5 秒,避免触发限流。
import time
import urllib.request
def poll_and_download(task_id: str, save_path: str) -> None:
status_url = f"https://api.stableboost.example/v1/task/{task_id}"
while True:
resp = requests.get(status_url, headers=headers, timeout=15)
resp.raise_for_status()
data = resp.json()
status = data.get("status")
if status == "success":
image_url = data.get("image_url") or data["output"][0]["url"]
# 下载图片到本地
urllib.request.urlretrieve(image_url, save_path)
print(f"已保存: {save_path}")
return
if status in ("failed", "error", "cancelled"):
raise RuntimeError(f"任务失败: {data.get('error_message', 'unknown error')}")
print(f"任务 {task_id} 状态: {status}")
time.sleep(3)
判断原则:只要状态值不在成功列表里,就继续轮询;一旦出现失败、错误或取消,立刻抛出异常,不要无限等待。如果任务长时间不结束(比如超过 10 分钟),应该主动中断并检查请求参数或账号额度。
批量调用时的错误重试与日志
批量出图常常要跑几十上百张,网络抖动、限流、服务端 5xx 都可能出现。建议对两种错误重试:网络超时(requests.exceptions.Timeout)和限流(HTTP 429)。重试时指数退避,比如等待 2 秒、4 秒、8 秒,最多 3 次。
import logging
import time
import random
from requests.exceptions import RequestException, Timeout
logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s")
def submit_with_retry(payload: dict, max_retries: int = 3) -> str:
for attempt in range(max_retries):
try:
task_id = submit_task(payload)
logging.info("提交成功, task_id=%s, attempt=%s", task_id, attempt)
return task_id
except Timeout:
wait = 2 * (2 ** attempt) + random.uniform(0, 1)
logging.warning("请求超时, 将重试, wait=%.2f", wait)
time.sleep(wait)
except RequestException as exc:
status_code = exc.response.status_code if exc.response is not None else None
if status_code == 429:
wait = 5 * (2 ** attempt) + random.uniform(0, 1)
logging.warning("触发限流, status=429, wait=%.2f", wait)
time.sleep(wait)
else:
logging.error("请求失败, status=%s, error=%s", status_code, exc)
raise
raise RuntimeError(f"多次重试后仍然失败: {payload}")
日志里必须记录 task_id 和对应的请求标识。推荐格式:task_id=xxx request_id=<你传入的 metadata 或随机字符串>。这样后续排查时,能根据日志里的 request_id 定位是哪条 prompt 出了问题。
完整判断闭环:每张图片跑完后,检查输出文件大小是否大于 0;如果可能,额外调用图片格式检查逻辑。批量脚本结束时打印成功数和失败数,但不输出具体百分比,因为不同账号、网络和任务复杂度下数字波动很大。
最后提醒:不同版本的 Stableboost API 在认证头前缀、字段命名和任务状态值上可能不同。如果遇到 404 或 422,先查接口文档确认对应字段;如果遇到 401,只检查密钥有效性;如果遇到 500,联系服务方而不是盲目改代码。以上骨架能让你在半天内搭出可运行的批量流程,但要长期稳定,还需根据实际返回体做字段适配。