图像生成 - DashScope 协议

接口概述

按 DashScope 多模态生成协议做文生图,适用于通义千问 / 万相系的图像生成模型(qwen-image-2.0-prowan2.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
AuthorizationBearer {API_KEY},也可用 x-api-key

请求参数

参数名类型是否必填说明
modelstring模型名称,如 qwen-image-2.0-pro,见模型广场
inputobject输入信息
input.messagesarray消息数组(仅支持单轮,数组内有且仅有 1 个元素)
input.messages[].rolestring消息角色,固定为 user
input.messages[].contentarray消息内容数组(仅支持传入 1 个 text 元素)
input.messages[].content[].textstring正向提示词,描述期望生成的图像内容、风格和构图。支持中英文,上限 1300 Token
parametersobject生成参数
parameters.sizestring图片分辨率,格式 宽*高,默认 2048*2048。详见下方「分辨率说明」
parameters.nint生成图片数量,1~6,默认 1
parameters.negative_promptstring反向提示词,描述不希望出现的内容,不超过 500 字符
parameters.prompt_extendbool是否开启 Prompt 智能改写,默认 true。开启后对短提示词提升明显,但会增加耗时
parameters.watermarkbool是否在图片右下角添加 "Qwen-Image" 水印,默认 false
parameters.seedint随机种子,取值 [0, 2147483647]。固定 seed 有助于提升可复现性

扁平写法(等价简写)

除上面的原生嵌套体外,也可以把提示词与参数直接放在顶层,接口会按本协议展开后再生成:

参数名类型是否必填说明
promptstring等价于 input.messages[].content[].text
sizestring等价于 parameters.size,也可写 宽x高(字母 x),接口会转成 宽*高
nint等价于 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:12048*2048(默认)
16:92688*1536
9:161536*2688
4:32368*1728
3:41728*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
  }
}

响应参数

字段类型说明
outputobject输出信息
output.choicesarray生成结果列表(每张图一个元素)
output.choices[].finish_reasonstring停止原因,固定为 stop
output.choices[].message.rolestring消息角色,固定为 assistant
output.choices[].message.contentarray消息内容数组
output.choices[].message.content[].imagestring图片下载 URL(有效期 24 小时,PNG 格式)
usageobject用量信息
usage.image_countint生成图片数量
usage.widthint图片宽度(像素)
usage.heightint图片高度(像素)
sizestring图片实际尺寸,如 2048*2048
request_idstring请求唯一标识

响应示例

{
  "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-pro2K通义万相图像生成旗舰版,擅长文本渲染,适合图表 / 海报 / PPT
wan2.7-image见模型广场万相图像生成
wan2.7-image-pro见模型广场万相图像生成(增强版)

模型清单与单价以模型广场为准(含上架状态);改图(换背景、改文字、多图融合)请改用「图像编辑」页的编辑模型。

计费

  • 按张计费:实际出图张数 × 单张单价,单价见模型广场
  • 组图或多张请求按实际出图张数结算(以响应里的 usage.image_count 或返回的图片条目数为准)
  • 调用报错记 0 费用;每次费用可在控制台「费用中心」查看,接口响应不返回费用

在模型广场查看支持「图像生成」的模型 →