图像生成 - DashScope 协议
接口概述
按 DashScope 多模态生成协议做文生图,适用于通义千问 / 万相系的图像生成模型(qwen-image-2.0-pro、wan2.7-image 等):提示词放 input.messages,生成参数放 parameters,取图从 output.choices[].message.content[].image。
该协议的模型擅长文本渲染,适合生成图表、海报、PPT 等包含文字的图像,支持原生 2K 分辨率输出。
本页只讲这一套协议;豆包 Seedream 系模型使用另一套报文,见「文生图-OpenAI兼容」页。
按张计费(生成几张算几张),费用可在控制台「费用中心」查看。
接口地址
POST https://test.jw-info.com/v1/images/generations
请求头
| 请求头 | 是否必填 | 说明 |
|---|---|---|
| Content-Type | 是 | 固定为 application/json |
| Authorization | 是 | Bearer {API_KEY},也可用 x-api-key |
请求参数
| 参数名 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
| model | string | 是 | 模型名称,如 qwen-image-2.0-pro,见模型广场 |
| input | object | 是 | 输入信息 |
| input.messages | array | 是 | 消息数组(仅支持单轮,数组内有且仅有 1 个元素) |
| input.messages[].role | string | 是 | 消息角色,固定为 user |
| input.messages[].content | array | 是 | 消息内容数组(仅支持传入 1 个 text 元素) |
| input.messages[].content[].text | string | 是 | 正向提示词,描述期望生成的图像内容、风格和构图。支持中英文,上限 1300 Token |
| parameters | object | 否 | 生成参数 |
| parameters.size | string | 否 | 图片分辨率,格式 宽*高,默认 2048*2048。详见下方「分辨率说明」 |
| parameters.n | int | 否 | 生成图片数量,1~6,默认 1 |
| parameters.negative_prompt | string | 否 | 反向提示词,描述不希望出现的内容,不超过 500 字符 |
| parameters.prompt_extend | bool | 否 | 是否开启 Prompt 智能改写,默认 true。开启后对短提示词提升明显,但会增加耗时 |
| parameters.watermark | bool | 否 | 是否在图片右下角添加 "Qwen-Image" 水印,默认 false |
| parameters.seed | int | 否 | 随机种子,取值 [0, 2147483647]。固定 seed 有助于提升可复现性 |
扁平写法(等价简写)
除上面的原生嵌套体外,也可以把提示词与参数直接放在顶层,接口会按本协议展开后再生成:
| 参数名 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
| prompt | string | 是 | 等价于 input.messages[].content[].text |
| size | string | 否 | 等价于 parameters.size,也可写 宽x高(字母 x),接口会转成 宽*高 |
| n | int | 否 | 等价于 parameters.n |
| negative_prompt / prompt_extend / watermark / seed | - | 否 | 等价于同名 parameters 字段 |
{
"model": "qwen-image-2.0-pro",
"prompt": "一只白色猫咪坐在书桌上,阳光从窗户照进来",
"size": "2048x2048"
}
两种写法等价,选一种即可;团队内建议统一,便于排查。
分辨率说明
- 输出图像总像素需在 512×512 ~ 2048×2048 之间;小于或大于该范围会被拒绝(错误正文会说明要求)
- 默认分辨率为
2048*2048,图像格式为 PNG - 推荐分辨率:
| 宽高比 | 推荐分辨率 |
|---|---|
| 1:1 | 2048*2048(默认) |
| 16:9 | 2688*1536 |
| 9:16 | 1536*2688 |
| 4:3 | 2368*1728 |
| 3:4 | 1728*2368 |
请求示例
最简请求(只给提示词,其余走默认值):
{
"model": "qwen-image-2.0-pro",
"input": {
"messages": [{
"role": "user",
"content": [{ "text": "一只白色猫咪坐在书桌上,阳光从窗户照进来" }]
}]
}
}
完整请求(指定尺寸、张数、反向提示词与种子):
{
"model": "qwen-image-2.0-pro",
"input": {
"messages": [{
"role": "user",
"content": [{ "text": "一张科技感十足的海报,标题为「AI未来」,蓝色渐变背景" }]
}]
},
"parameters": {
"size": "2048*2048",
"n": 1,
"negative_prompt": "低分辨率,模糊,变形",
"prompt_extend": true,
"watermark": false,
"seed": 12345
}
}
响应参数
| 字段 | 类型 | 说明 |
|---|---|---|
| output | object | 输出信息 |
| output.choices | array | 生成结果列表(每张图一个元素) |
| output.choices[].finish_reason | string | 停止原因,固定为 stop |
| output.choices[].message.role | string | 消息角色,固定为 assistant |
| output.choices[].message.content | array | 消息内容数组 |
| output.choices[].message.content[].image | string | 图片下载 URL(有效期 24 小时,PNG 格式) |
| usage | object | 用量信息 |
| usage.image_count | int | 生成图片数量 |
| usage.width | int | 图片宽度(像素) |
| usage.height | int | 图片高度(像素) |
| size | string | 图片实际尺寸,如 2048*2048 |
| request_id | string | 请求唯一标识 |
响应示例
{
"output": {
"choices": [{
"finish_reason": "stop",
"message": {
"role": "assistant",
"content": [{ "image": "https://example.com/generated_image.png" }]
}
}]
},
"usage": {
"image_count": 1,
"width": 2048,
"height": 2048
},
"size": "2048*2048",
"request_id": "d0250a3d-b07f-49e1-bdc8-29xxx"
}
生成多张时 output.choices 会有多个元素,每张图一个;usage.image_count 即实际出图张数。
错误响应
请求参数或鉴权有问题时返回 400 / 401 / 402,正文为 {"detail": "说明文字"};模型侧报错时返回 502,并把模型返回的原始错误正文附在说明里,便于定位,例如:
{
"detail": "模型服务返回错误 400:{\"error\":{\"message\":\"model is required\",\"type\":\"invalid_request_error\",\"code\":\"invalid_request_error\"}}"
}
另一种模型侧错误正文形状(含 request_id / code / message):
{
"detail": "模型服务返回错误 400:{\"request_id\":\"0934197e-...\",\"code\":\"InvalidParameter\",\"message\":\"Either 'text' or 'image' must be provided, but not both.\"}"
}
完整状态码见「错误码」页。
代码示例
cURL
curl -X POST https://test.jw-info.com/v1/images/generations \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-你的密钥" \
-d '{
"model": "qwen-image-2.0-pro",
"input": {
"messages": [{
"role": "user",
"content": [{"text": "一只白色猫咪坐在书桌上,阳光从窗户照进来"}]
}]
},
"parameters": {
"size": "2048*2048",
"n": 1
}
}'
Python
import requests
API_KEY = "sk-你的密钥"
url = "https://test.jw-info.com/v1/images/generations"
payload = {
"model": "qwen-image-2.0-pro",
"input": {
"messages": [{
"role": "user",
"content": [{"text": "一只白色猫咪坐在书桌上,阳光从窗户照进来"}]
}]
},
"parameters": {
"size": "2048*2048",
"n": 1,
"negative_prompt": "低分辨率,模糊,变形",
"prompt_extend": True,
"watermark": False
}
}
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {API_KEY}"
}
response = requests.post(url, json=payload, headers=headers)
result = response.json()
if response.status_code == 200:
for choice in result["output"]["choices"]:
for content in choice["message"]["content"]:
print("图片 URL:", content["image"])
print("尺寸:", result.get("size"))
print("用量:", result["usage"])
else:
print("请求失败:", result.get("detail", result))
Java (OkHttp)
import okhttp3.*;
import com.fasterxml.jackson.databind.ObjectMapper;
public class ImageGenerationExample {
private static final String BASE = "https://test.jw-info.com";
private static final String API_KEY = "sk-你的密钥";
private static final OkHttpClient CLIENT = new OkHttpClient();
private static final ObjectMapper MAPPER = new ObjectMapper();
public static void main(String[] args) throws Exception {
String json = """
{
"model": "qwen-image-2.0-pro",
"input": {
"messages": [{
"role": "user",
"content": [{"text": "一只白色猫咪坐在书桌上,阳光从窗户照进来"}]
}]
},
"parameters": {
"size": "2048*2048",
"n": 1
}
}
""";
RequestBody body = RequestBody.create(json, MediaType.parse("application/json"));
Request request = new Request.Builder()
.url(BASE + "/v1/images/generations")
.addHeader("Authorization", "Bearer " + API_KEY)
.post(body)
.build();
try (Response response = CLIENT.newCall(request).execute()) {
String responseBody = response.body().string();
var result = MAPPER.readTree(responseBody);
if (response.isSuccessful()) {
for (var choice : result.get("output").get("choices")) {
for (var content : choice.get("message").get("content")) {
System.out.println("图片 URL: " + content.get("image").asText());
}
}
System.out.println("尺寸: " + result.get("size").asText());
} else {
System.out.println("请求失败: " + result.get("detail"));
}
}
}
}
可用模型
| 模型 | 分辨率 | 说明 |
|---|---|---|
qwen-image-2.0-pro | 2K | 通义万相图像生成旗舰版,擅长文本渲染,适合图表 / 海报 / PPT |
wan2.7-image | 见模型广场 | 万相图像生成 |
wan2.7-image-pro | 见模型广场 | 万相图像生成(增强版) |
模型清单与单价以模型广场为准(含上架状态);改图(换背景、改文字、多图融合)请改用「图像编辑」页的编辑模型。
计费
- 按张计费:实际出图张数 × 单张单价,单价见模型广场
- 组图或多张请求按实际出图张数结算(以响应里的
usage.image_count或返回的图片条目数为准) - 调用报错记 0 费用;每次费用可在控制台「费用中心」查看,接口响应不返回费用