教程
Seedream API 成本优化:如何在 hiapi 上降低图像生成成本
Seedream 在 hiapi 上以四个不同层级提供——seedream-5.0-flash、seedream-5.0-lite、seedream-5.0-pro 以及旧版 seedream-4.5——每个层级的计费方式都不同。选错层级或选错分辨率,你可能每张图要多付 2-4 倍的钱,却没有任何可见的画质提升。本指南展示每个层级的实际定价结构,并给出一个可运行的代码范式,用于调用满足你要求的最低成本模型。
你将构建什么,以及先决条件
你将构建一个小型 Python 客户端,通过 hiapi 的统一任务 API 创建 Seedream 图像任务,等待结果,并有意识地选择分辨率/模型组合,而不是照搬教程里复制粘贴的默认值。首先,从你的 hiapi 控制台获取 API 密钥——下面每个请求都以 Authorization: Bearer sk-... 形式发送它。
你要优化的定价结构
当前每张图定价(上线前请始终核对实时定价页面,因为费率会变动):
seedream-5.0-flash—— 统一 $0.025/张,文生图和图生图同价。平台最便宜的层级;最适合草稿、缩略图,以及任何你会重新生成多次再挑选最终结果的场景。seedream-5.0-lite—— 统一 $0.035/张,并且关键在于,无论你以2K还是4K渲染,价格都相同。在这个层级上,从成本角度永远没有理由请求2K——4K是免费升级。seedream-4.5(旧版)—— 两个端点均为统一 $0.045/张。seedream-5.0-pro—— 按分辨率分层,而非统一价:文生图在1K为 $0.05,在2K为 $0.10;图生图在1K为 $0.06,在2K为 $0.10。在这个层级上,分辨率才是你预算真正流向的地方——一张1K草稿的成本大约是2K最终渲染的一半。
这种不对称性就是整个优化要点:lite 奖励请求更高分辨率(免费),pro 惩罚更高分辨率(成本大约翻倍)。 在调用代码中对它们区别对待,而不是到处硬编码同一个分辨率。
最小可运行示例
每次 Seedream 调用都经过相同的异步任务端点:用 POST /v1/tasks 创建,然后轮询 GET /v1/tasks/{taskId} 或接收 webhook 回调。模型 ID 是裸的——没有前置的 models/ 或厂商前缀。
import os
import time
import requests
API_KEY = os.environ["HIAPI_API_KEY"] # starts with sk-
BASE_URL = "https://api.hiapi.ai/v1"
HEADERS = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}
def create_task(model: str, input_payload: dict) -> str:
resp = requests.post(f"{BASE_URL}/tasks", headers=HEADERS,
json={"model": model, "input": input_payload}, timeout=30)
resp.raise_for_status()
return resp.json()["data"]["taskId"]
def wait_task(task_id: str, interval: float = 3.0, timeout: float = 180.0) -> dict:
deadline = time.time() + timeout
while time.time() < deadline:
resp = requests.get(f"{BASE_URL}/tasks/{task_id}", headers=HEADERS, timeout=30)
resp.raise_for_status()
data = resp.json()["data"]
if data["status"] == "success":
return data
if data["status"] == "fail":
raise RuntimeError(data["error"])
time.sleep(interval)
raise TimeoutError(f"task {task_id} did not finish within {timeout}s")
# seedream-5.0-lite: 4K costs the same $0.035 as 2K, so always ask for 4K here.
task_id = create_task(
"seedream-5.0-lite/text-to-image",
{"prompt": "a minimalist product photo of a ceramic mug on a wooden table", "resolution": "4K"},
)
result = wait_task(task_id)
image_url = result["output"][0]["url"]
print(image_url)
seedream-5.0-lite 上的 resolution 只接受 2K 或 4K(没有 1K)。seedream-5.0-pro 则接受 1K/2K,并且额外要求 aspect_ratio(取值为 1:1、4:3、3:4、16:9、9:16、2:3、3:2、21:9 之一)——每个 Seedream 层级的输入模式略有不同,所以不要认为一个模型接受的字段能沿用到另一个模型。
生产级范式
以编程方式选择层级,而不是凭习惯。 在调用点旁边维护一张小的成本表,根据预算/质量需求路由,而不是到处硬编码同一个模型——把数字当作定价页面的缓存,而不是事实来源:
SEEDREAM_COST_USD = {
("seedream-5.0-flash", None): 0.025,
("seedream-5.0-lite", "2K"): 0.035,
("seedream-5.0-lite", "4K"): 0.035, # same price — always prefer 4K
("seedream-5.0-pro", "1K"): 0.05, # text-to-image; i2i 1K is $0.06
("seedream-5.0-pro", "2K"): 0.10,
}
def pick_model_for_draft_vs_final(is_final: bool) -> tuple[str, dict]:
if not is_final:
return "seedream-5.0-flash", {} # $0.025, iterate freely
return "seedream-5.0-pro", {"resolution": "2K"} # $0.10, one shot at the end
优先使用回调而非紧密轮询。 在高吞吐管道中,不要每隔几秒循环调用 wait_task,而是在创建请求中加入 callback:
task_id_resp = requests.post(
f"{BASE_URL}/tasks", headers=HEADERS,
json={
"model": "seedream-5.0-lite/text-to-image",
"input": {"prompt": "...", "resolution": "4K"},
"callback": {"url": "https://yourapp.example.com/webhooks/hiapi", "when": "final"},
},
timeout=30,
)
当任务达到终态(success 或 fail)时,你的 webhook 处理器会收到一次 POST,而不是让你的 worker 在轮询循环中消耗请求。如果你无法暴露公共 HTTPS 端点(本地开发、内部工具),轮询仍是更简单的选择——一旦以真实规模运行,就改用回调。
在创建任务之前去重,而不是之后。 任务 API 在创建时计费,因此重试的请求(超时、worker 崩溃、队列消费者重新部署)如果重新提交同一作业,会被计费两次。在调用 create_task 之前,检查你自己的存储中是否已有以 (model, input_hash) 为键的现有任务,如果该任务已在执行中或已成功,则跳过创建——hiapi 的任务端点没有内置去重,所以这必须放在你的代码里。
显式处理认证失败。 无效或已撤销的密钥会返回 HTTP 401 及结构化响应体,而不是通用错误页面:
{"error": {"code": "permission_denied", "type": "hiapi_error", "request_id": "..."}}
专门检查 error.code == "permission_denied",这样坏密钥会快速失败,而不是重试到超时。
相关 hiapi 资源
- 定价 —— 当前各模型费率;将本文中任何数字视为快照,而非保证。
- API 密钥控制台 —— 创建和轮换密钥。
- Seedream 5.0 Lite — 文生图 和 图生图模型页面。
- Seedream 5.0 Pro — 文生图 和 图生图模型页面。
- Seedream 5.0 Flash 模型页面。
- 异步任务 API 参考 —— 完整的创建/轮询/回调契约。
- 认证文档 —— 密钥格式和请求头要求。
常见问题
哪个 Seedream 模型对快速草稿或图标最便宜?
seedream-5.0-flash,统一 $0.025/张——平台最便宜的层级,文生图和图生图同价。
在 Seedream 5.0 Lite 上请求 4K 而不是 2K 会更贵吗?
不会。seedream-5.0-lite 统一 $0.035/张,无论 resolution 是 2K 还是 4K,所以在这个层级上默认请求 4K。
Seedream 5.0 Pro 每张图多少钱?
按分辨率分层:文生图在 1K 为 $0.05,在 2K 为 $0.10;图生图在 1K 为 $0.06,在 2K 为 $0.10。与 lite 不同,分辨率在这里确实会改变你的账单。
如果我的作业重试,如何避免被计费两次?
任务 API 没有服务端幂等键,所以在客户端去重:在调用 create_task 之前为 (model, input_hash) 存储一个键,如果该键已在执行中或已成功,则跳过创建。
我应该轮询还是使用 webhook 回调?
如果你无法暴露公共 HTTPS 端点(本地开发、脚本),就轮询 GET /v1/tasks/{taskId}。一旦以真实规模运行,就改用 callback.url + when: "final"——它用每个任务一次推送通知替代轮询循环。
无效 API 密钥会返回什么?
HTTP 401 及 {"error": {"code": "permission_denied", "type": "hiapi_error", "request_id": "..."}}。显式检查该错误码,而不是用坏密钥重试到超时。
我可以先不使用 API 密钥就使用这些价格吗?
不可以——每次 /v1/tasks 调用都需要来自你在控制台中创建的真实密钥的有效 Authorization: Bearer sk-... 请求头;生产生成没有无密钥或免注册试用的路径。