教程
通过 hiapi API 使用 qwen-image-2.0 生成电商产品图
一份可直接运行的 curl + Python 指南,涵盖目录棚拍图、场景图、变体和双语横幅,每张图 $0.025 —— 包括其他 hiapi 图像模型都没有的 size 参数模式特殊规则。
qwen-image-2.0 是阿里巴巴的第二代文生图模型,通过 hiapi 的 /v1/tasks 接口提供服务,价格为每张图 $0.025,默认输出 2K。它对电商而言有两点特别有意思:在这个价格区间内,它的中文文字渲染是当前所有文生图模型中最干净的;而且它对长而详细的产品简报的提示词服从性很稳——这正是跨境 listings 真正需要的。
本指南是这套工作流的可运行版本。每个 API 调用都是你可以直接粘贴到终端里的内容,提示词模板是我们在实时端点上测试渲染过的,每张图的价格是 HiAPI 定价的实时数字。这里没有任何理论内容:成本数字假设的是 qwen-image-2.0 实际接受的 size 值,而不是营销数字。
为什么跨境产品图选 qwen-image-2.0
当你一次要把 200 个 SKU 推上市场 listing 时,有三件事很重要。
- 中文文字渲染。面向中国大陆、香港、台湾或东南亚销售的大多数电商 listing 都需要在包装、横幅或标签上有可读的中文。qwen-image-2.0 是 hiapi 上唯一一个你可以写“瓶身标签用粗体衬线中文写着玫瑰精华水”这样的提示词,模型就会在你描述的确切位置渲染出这些确切字形的模型。
- 对长产品简报的提示词服从性。电商简报很长:材质、颜色十六进制、表面处理、光照方向、阴影形状、背景色、相机角度。简报变长时 qwen-image-2.0 能保持整体一致——失败模式通常只是漏了一个道具,而不是凭空捏造产品。
- 能扛住变体爆炸的成本区间。一个典型的 SKU 页面想要 4–6 张图(棚拍图、场景图、俯视图、比例对比图、两个变体)。按每张图 $0.025 算,就是每个 SKU $0.10–$0.15。一次 200 SKU 的上新花费 $20–$30。正是这个成本区间让“全部从零生成”比委托部分拍摄再用图库补缺更便宜。
若想看逐条提示词调优实验,以及六套以风格而非电商为导向的配方演练,请参阅配套文章 qwen-image-2.0 提示词配方。本篇则专注于目录使用场景。
hiapi 上 qwen-image-2.0 的输入 schema
qwen-image-2.0 运行在统一的 /v1/tasks 接口下,这也是 hiapi 目前唯一提供的图像端点。在写任何代码之前,有一个特殊规则值得先搞对:
- 尺寸参数名为
size——不是aspect_ratio,不是resolution,也不是image_size。hiapi 上的其他模型(nano-banana、flux 系列)接受aspect_ratio;qwen-image-2.0 不接受。 size内的分隔符是*,不是x。"size": "2688x1536"会返回 400;"size": "2688*1536"才能正常工作。- 只接受五个
size值。它们都是 2K:
| 宽高比 | size 值 | 用途 |
|---|---|---|
| 16:9(约 1.75:1) | 2688*1536 |
主视觉图、横幅、listing 封面 |
| 4:3(约 1.37:1) | 2368*1728 |
杂志式跨页、双栏广告位 |
| 1:1 | 2048*2048 |
方形棚拍图、市场缩略图 |
| 3:4(约 0.73:1) | 1728*2368 |
移动优先的产品页 |
| 9:16(约 0.57:1) | 1536*2688 |
竖版视频封面、TikTok/Reels 静帧 |
如果你提交任何其他值,API 会在错误里返回字面允许列表:
{"code": 400, "message": "invalid input: size: value must be one of '2688*1536', '2368*1728', '2048*2048', '1728*2368', '1536*2688'"}
把这条错误信息当作权威事实来源——如果未来你看到有新值出现在那里,说明平台扩展了该 schema。
一个可运行的请求
整个调用面只有两个端点:POST /v1/tasks 用于入队,GET /v1/tasks/{taskId} 用于轮询。以下是产出下方棚拍图的最小请求。
curl -s -X POST https://api.hiapi.ai/v1/tasks \
-H "Authorization: Bearer $HIAPI_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen-image-2.0",
"input": {
"prompt": "A clear glass cosmetic dropper bottle on a clean off-white seamless paper background, soft daylight from camera left, gentle elliptical shadow, the label reads 玫瑰精华水 in bold serif Chinese with a small line of English Rose Essence Water below, the liquid inside has a faint pink tint, studio product photography, sharp focus on the label, no other props, square 1:1 composition",
"size": "2048*2048"
}
}'
响应:
{"code": 200, "data": {"taskId": "tk-hiapi-01KW8R..."}, "message": "success"}
轮询用:
curl -s https://api.hiapi.ai/v1/tasks/tk-hiapi-01KW8R... \
-H "Authorization: Bearer $HIAPI_TOKEN"
status 字段会经历 handling → archiving → success。在我们的测试运行中,2K 下每张图的总实际耗时是 25–45 秒。当 status 为 success 时,output[0].url 保存图像——但它指向 temp.hiapi.ai 并带有 expireAt Unix 时间戳,所以请立即下载。不要把它嵌到页面上或钉在数据库里;它会在几小时内 404。
这个棚拍提示词在实时端点上运行后,会生成一个玻璃滴管瓶,标签上干净地渲染出中文字符玫瑰精华水,正下方是较小字重的英文Rose Essence Water。模型会把两行文字放在规范的标签区域,提示词里完全不需要任何布局线索——“the label reads X”这种措辞就够了。
把 SKU 表变成已上传棚拍图的 Python 循环
这是我们在本页生成图像时运行的循环。它接受一组 (slug, prompt, size) 元组,以较小的并发上限并发提交,轮询每个任务直到完成,下载结果,并以 webp 上传到你自己的存储。这个模式故意写得很无聊——requests 加 concurrent.futures——因为有趣的部分是模型。
import os, time, io, requests, concurrent.futures as cf
from PIL import Image
TOKEN = os.environ["HIAPI_TOKEN"]
BASE = "https://api.hiapi.ai/v1/tasks"
H = {"Authorization": f"Bearer {TOKEN}", "Content-Type": "application/json"}
def submit(prompt, size):
r = requests.post(BASE, headers=H, json={
"model": "qwen-image-2.0",
"input": {"prompt": prompt, "size": size},
}, timeout=60)
r.raise_for_status()
return r.json()["data"]["taskId"]
def wait(task_id, deadline_s=240):
deadline = time.time() + deadline_s
while time.time() < deadline:
r = requests.get(f"{BASE}/{task_id}", headers=H, timeout=30)
d = r.json()["data"]
if d["status"] == "success":
return d["output"][0]["url"]
if d["status"] == "fail":
raise RuntimeError(f"task {task_id} failed: {d.get('error')}")
time.sleep(4)
raise TimeoutError(f"task {task_id} not done in {deadline_s}s")
def render_one(item):
slug, prompt, size = item
task_id = submit(prompt, size)
url = wait(task_id)
png = requests.get(url, timeout=60).content
buf = io.BytesIO()
Image.open(io.BytesIO(png)).convert("RGB").save(buf, "WEBP", quality=88, method=6)
return slug, buf.getvalue()
JOBS = [
("packshot-rose-water", "A clear dropper bottle, label 玫瑰精华水…", "2048*2048"),
("packshot-tea-canister","A pale grey ceramic tea canister, label 龙井…", "2048*2048"),
# … 200 more rows from your sheet …
]
with cf.ThreadPoolExecutor(max_workers=6) as pool:
for slug, webp in pool.map(render_one, JOBS):
with open(f"out/{slug}.webp", "wb") as f:
f.write(webp)
print(f"saved {slug}.webp ({len(webp)} bytes)")
关于这段代码,有几点从代码本身看不出来的小说明。
max_workers=6是我们观察到的甜点值。到 8–10 时,队列深度开始表现为额外延迟而不是吞吐量。模型侧似乎按账户公平分配并发。- 存储前我们会以质量 88 转换为 webp。这个端点产出的 2K png 大约 3–4 MB;webp 会落在 200–400 KB,在产品页尺寸下视觉上完全一致。传输更便宜,而且模型本身已经编码了大量纹理,JPEG 处理这些纹理效果很差。
- 临时 URL 只能下载一次。如果你的上传步骤失败(S3 故障、网络抖动),你必须重新渲染——没有第二次机会获取同一任务的输出。
六种适用于电商的提示词模式
这些是通过我们内部 A/B 对比更冗长替代方案后存活下来的提示词形态。它们是写给使用中文产品标签的英语使用者的——这是最常见的跨境场景。
模式 1 —— 带中文标签的单品棚拍图
默认产品图。用平实英文指定背景色,用字面中文指定标签文字并附英文指定字体族,并指定一个光源。
A pale grey ceramic tea canister on a clean off-white seamless paper background. The label reads 龙井 in bold black serif Chinese with the small English subtitle Longjing Green Tea below. Soft daylight from camera right, gentle elliptical shadow, no other props. Sharp focus on the label, studio product photography, square 1:1 composition.
起作用的两点是“reads X in bold serif Chinese”(qwen-image-2.0 会把它放在预期标签的位置)和“sharp focus on the label”(让模型把文字当作焦点,而不是装饰)。
模式 2 —— 围绕空盘子构建的场景图
对于场景摄影,先描述场景,最后把产品放进去,而不是反过来。模型更可能在场景上漂移而不是在产品上漂移,所以先锚定场景。
A wooden Japanese-style table near a wide window in late-morning daylight. The window casts a soft rectangle of light onto the table. In the center of the table is the pale grey ceramic tea canister from the previous shot, with a small wisp of steam rising from a cup beside it. Loose tea leaves are scattered to the right. Wabi-sabi aesthetic, soft shadows, shallow depth of field with focus on the canister. 16:9 widescreen composition.
在我们的测试渲染中,罐子上带有字符龙井,正下方是英文Longjing Green Tea——和棚拍图一样的标签纪律——蒸汽、散落的茶叶和窗光都如描述般呈现。
模式 3 —— 单次渲染中的颜色变体网格
当变体共享相同的产品几何结构时,你可以在一次调用中渲染整个网格,而不是三次。更便宜,而且各格的照明从构造上就是一致的。
Three pairs of low-top canvas sneakers shot from a slight top-down angle, arranged in one horizontal row on a clean light-grey seamless background. From left to right: dusty rose, sage green, ivory cream. Identical sneaker silhouette, identical lighting, identical shadow. Each pair faces the camera with toes pointing forward. Studio product photography, 1:1 composition, evenly spaced.
这种模式让你不必分别渲染每个变体再在后期尝试匹配光照。约束“identical sneaker silhouette, identical lighting, identical shadow”是让整排保持统一的关键。
模式 4 —— 双语促销横幅
对于 Shopee、Lazada 和淘宝的联合品牌活动,你通常需要同一张图里同时有中文标题和英文副标题。qwen-image-2.0 是 hiapi 上唯一能在同一次渲染中把两者都做对的模型。
A horizontal ecommerce promotional banner on a soft pink gradient background. The main headline reads 双十一大促 in large bold black sans-serif Chinese in the center-left. Below the Chinese headline in smaller dark grey English serif: Double 11 Sale — Up to 50% Off. To the right is a clear glass dropper bottle of pink serum with a small white label. Subtle confetti texture in the background, clean and modern, 16:9 widescreen.
让这稳定生效的技巧是把中文放在提示词最前面并给它“large bold”限定语,然后给英文“smaller”限定语。如果你颠倒顺序,模型往往会把英文也做成标题大小。横幅内部的产品标签是可以放松的地方——在我们的测试渲染中,qwen 为瓶子选择了通用的“Vitamin C Serum”标签,因为我们没有把字符拼写出来;对于品牌活动,要么在提示词中包含字面标签文字,要么在后期合成真实标签。
模式 5 —— 跨境市场 listing 卡片
对于看起来像亚马逊或天猫 listing 磁贴的复合素材——产品、标题、价格、徽章——提示词必须读起来像布局简报,而不是照片简报。
A square ecommerce listing card on a white background. In the top two-thirds, a clear glass dropper bottle of pink rose-essence water labeled 玫瑰精华水 / Rose Essence Water. In the bottom third, on the left, the price 99 元 in large bold black Chinese characters with a small English subtitle Rose Essence 30ml below. On the right, a small green badge that reads 新品 in white. Clean modern layout, soft drop shadow under the product, 4:3 composition.
对于 listing,用 4:3(2368*1728)渲染,而不是 1:1——大多数市场 listing 组件的主视觉槽是 4:3,用方形会得到尴尬的裁剪。
模式 6 —— 按需生成以实现个性化
最后一种模式能改变单位经济性。一旦每次渲染低于三美分,你就可以停止为营销活动预渲染横幅,而是在请求时按客户渲染——“王女士您好,您的月度组合已就绪”,并把客户真实姓名烘焙到横幅里。按姓名哈希缓存,设置 TTL,你就能以一笔很小的 CDN 账单获得个性化横幅图像。
约束是延迟。每次渲染 25–45 秒对同步请求流来说太慢,但对邮件发送或推送通知来说完全没问题——在排队时生成,消息发出时嵌入。
qwen-image-2.0 不擅长什么
为平衡起见,以下四项工作我们仍交给同一个 /v1/tasks 端点上的其他模型。
- 带运动模糊的手持拍摄。棚拍图是甜点区。如果你需要看起来未经摆拍的东西——UGC 风格、轻微运动、不完美构图——试试
nano-banana-pro,它对“随意”构图的理解更好。 - 像素级一致的产品变体。qwen-image-2.0 会在不同调用间渲染相似的变体,但如果你需要在五种不同光照设置下完全相同的滴管瓶,你需要一个有参考图条件化的模型。hiapi 上没有任何纯文生图模型能保证跨调用像素一致。
- 全身照片级真实人脸。特写人脸没问题;全身或合影往往会软化面部细节。对于以人物为主的电商——服装试穿、美妆演示——把 qwen-image-2.0 与参考条件化的视频模型搭配用于动作镜头。
- 亚秒级周转。如果你需要在同步请求的内循环中生成图像(用户就在屏幕前等待),25–45 秒太长了。
flux-schnell约 5 秒返回,每张图 $0.005,但不渲染中文文字。先按延迟预算选择。
一次 200 SKU 上新的实际成本
用一个代表性案例,给端到端工作流算上数字。
| 步骤 | 数量 | 单价 | 总计 |
|---|---|---|---|
| 每个 SKU 的主视觉/棚拍图 | 200 × 1 | $0.025 | $5.00 |
| 每个 SKU 的场景图 | 200 × 1 | $0.025 | $5.00 |
| 每个 SKU 的变体网格(一次渲染约 3 个变体) | 200 × 1 | $0.025 | $5.00 |
| 每个类目的双语横幅(10 个类目) | 10 × 1 | $0.025 | $0.25 |
| 每个 SKU 的 listing 卡片 | 200 × 1 | $0.025 | $5.00 |
| 图像生成总成本 | 810 次渲染 | — | $20.25 |
按当前 hiapi 定价,一次 200 SKU 跨境发布的全部图像预算约为 $20。相同工作的优质模型(从每张图 $0.04 起算)落在 $30–$140,且每张图运行时间更长。这就是 qwen-image-2.0 旨在填补的差距:中文感知的电商工作,成本区间低到你不再数渲染次数。
下一步去哪
- 阅读 qwen-image-2.0 提示词配方,了解六套非电商专属的风格导向配方。
- 把 hiapi 定价页作为任何成本数字的事实来源——qwen-image-2.0 当前是每张图 $0.025,但以该页面为准。
- 对于不需要中文文字的延迟敏感流程,换用
flux-schnell并沿用同样的/v1/tasks形态——对比见 使用 FLUX.1 schnell 生成电商产品图。
统一 /v1/tasks 端点的全部意义在于:切换模型就是改一个字符串。一旦你为 qwen-image-2.0 搭好了循环,同一个 Python 脚本只需编辑 "model" 字段并匹配该模型的 size schema,就能对 hiapi 上任何图像模型进行渲染。