千问图像生成与编辑 3.0(百炼原生协议)
模型
| 模型 | 输出分辨率 | 说明 |
|---|---|---|
qwen-image-3.0-pro | 总像素 512×512 – 2048×2048 | Pro 系列,2k 档单价高于 1k 档 |
qwen-image-3.0 | 同上 | 标准版,两个档位同价 |
两个模型都同时支持文生图(T2I)和图生图 / 图像编辑(I2I):不传参考图是文生图,传 1–3 张参考图是图生图。图像同步返回,无需轮询。
不支持异步任务通道。 这一族只在同步接口上服务;打
/v1/content_generation/tasks会被拒。
两条入站通道
同一个模型有两种调用写法,能力完全一致,按你现有代码的形状选:
| 通道 | 路径 | 适合谁 |
|---|---|---|
| OpenAI 兼容 | POST /v1/images/generations | 已按 OpenAI Images 协议或 OpenAI SDK 开发的应用,只改 base_url 与 model |
| 百炼原生 | POST /api/v1/services/aigc/multimodal-generation/generation | 已在用百炼 DashScope SDK 的应用,只改 base_url |
两条通道的
size分隔符不同,且互不接受:OpenAI 兼容通道用字母x(1024x1024),百炼原生通道用星号*(1024*1024)。写错的那一侧会返回400并点名正确的分隔符,不会被静默改写 —— 这是为了让协议混用尽早显形,而不是在别处出更难查的问题。
1. OpenAI 兼容通道
POST https://api.modelgo.com/v1/images/generations
文生图
curl https://api.modelgo.com/v1/images/generations \
-H "Authorization: Bearer $MODELGO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen-image-3.0-pro",
"prompt": "一只毛茸茸的橘猫坐在阳光下的窗台上,午后光线,胶片质感",
"size": "1024x1024",
"n": 1
}'图生图 / 图像编辑
不用 multipart,参考图放在请求体顶层的 image 字段:
curl https://api.modelgo.com/v1/images/generations \
-H "Authorization: Bearer $MODELGO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen-image-3.0-pro",
"prompt": "保留这位女性的面部特征,把服装换成香槟色真丝衬衫与深灰西装外套",
"image": ["https://example-cdn.com/portrait.png"],
"size": "1024x1024",
"prompt_extend": true
}'响应
{
"created": 1788339600,
"data": [{"url": "https://dashscope-result-sz.oss-cn-shenzhen.aliyuncs.com/xxx.png?Expires=xxx"}],
"usage": {
"output_width": 1024, "output_height": 1024,
"input_image_count": 0, "input_image_type": "qima_input_1k",
"output_image_count": 1, "output_image_type": "qima_output_1k"
}
}- 图像格式为 PNG,链接有效期 24 小时,请及时下载,不要持久化该 URL。
usage是图片张数与档位,不是 token 用量 —— 这一族的计费完全按张,见「计费口径」。- 传
response_format: "b64_json"不会报错,但会被忽略,响应中仍是图像 URL。
使用 OpenAI SDK
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["MODELGO_API_KEY"],
base_url="https://api.modelgo.com/v1",
timeout=600.0, # 出图耗时较长,实测单张 40-60 秒
)
resp = client.images.generate(
model="qwen-image-3.0-pro",
prompt="一只毛茸茸的橘猫坐在阳光下的窗台上,胶片质感",
size="1024x1024",
n=1,
extra_body={"prompt_extend": True}, # 扩展字段走 extra_body
)
print(resp.data[0].url)image / negative_prompt / seed / prompt_extend / prompt_extend_mode / enable_thinking / watermark 不是 OpenAI 官方参数,用 OpenAI SDK 时通过 extra_body 传入;直接发 HTTP 请求时放在请求体顶层即可。
2. 百炼原生通道
POST https://api.modelgo.com/api/v1/services/aigc/multimodal-generation/generation
请求与响应两头都是百炼原样的形状,网关不做翻译。
curl https://api.modelgo.com/api/v1/services/aigc/multimodal-generation/generation \
-H "Authorization: Bearer $MODELGO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen-image-3.0-pro",
"input": {
"messages": [
{
"role": "user",
"content": [
{"image": "https://example-cdn.com/portrait.png"},
{"text": "把服装换成香槟色真丝衬衫"}
]
}
]
},
"parameters": {"size": "1024*1024", "n": 1, "prompt_extend": true}
}'响应
{
"output": {
"choices": [
{
"finish_reason": "stop",
"message": {
"role": "assistant",
"content": [{"image": "https://dashscope-result-sz.oss-cn-shenzhen.aliyuncs.com/xxx.png?Expires=xxx"}]
}
}
]
},
"usage": {
"output_width": 1024, "output_height": 1024,
"input_image_count": 1, "input_image_type": "qima_input_1k",
"output_image_count": 1, "output_image_type": "qima_output_1k"
},
"request_id": "571ae02f-5c9d-436c-83c2-f221e6df0xxx"
}这条通道的约束
input.messages有且只有一个对象,role必须是user(仅支持单轮对话)。content里有且只有一个{"text": ...},不传或传多个都会400。{"image": ...}0–3 个:0 个是文生图,1–3 个是图生图。- 生成参数放在
parameters下(不是顶层):size/n/seed/negative_prompt/prompt_extend/prompt_extend_mode/enable_thinking/watermark。 - 使用百炼官方 SDK(
dashscope)时,把dashscope.base_http_api_url指向https://api.modelgo.com/api/v1、api_key换成 ModelGo API Key 即可。
3. 参数说明
| 字段 | 类型 | 说明 |
|---|---|---|
model | string | qwen-image-3.0-pro / qwen-image-3.0 |
prompt(兼容通道)/ content[].text(原生通道) | string | 必填,非空。支持中英文,建议不超过 4500 token |
image(兼容通道)/ content[].image(原生通道) | string / string[] | 参考图,1–3 张。不能传 null 或空数组 |
size | string | 兼容通道 宽x高,原生通道 宽*高;不传则由模型按提示词自动推荐分辨率 |
n | int | 输出张数 1–6,缺省 1。必须是整数,传字符串形式(如 "1")返回 400 |
negative_prompt | string | 反向提示词 |
seed | int | 随机数种子,0 – 2147483647。固定种子可让结果相对稳定 |
prompt_extend | boolean | 是否开启提示词智能改写,缺省 true(建议开启) |
prompt_extend_mode | string | direct(缺省,T2I / I2I 均支持)/ agent(更精细,仅文生图) |
enable_thinking | boolean | 思考模式,缺省 true。提升出图质量但增加耗时。仅在 prompt_extend=true 时生效 |
watermark | boolean | 是否加水印,缺省 false |
参数校验在调用前完成
下列请求在创建时就被拒(HTTP 400),不会打到上游、不产生费用:
n不是 1–6 的整数,或写成了字符串 / 小数;size的总像素不在 512×512 – 2048×2048 之间,或宽高比超出 1:8 – 8:1;size用了另一条通道的分隔符(错误信息会点名该用x还是*);image为null、空数组,或超过 3 张;prompt_extend_mode: "agent"与image同时出现(APE 仅支持文生图);seed超出0–2147483647;- 原生通道上
messages不是恰好一个、或content里的text不是恰好一个。
参考图的要求
- 格式:JPG / JPEG / PNG / BMP / TIFF / WEBP / GIF。
- 建议宽高均在 384 – 2048 像素之间,单张不超过 10 MB。
- 支持公网 URL(HTTP / HTTPS)或 Base64(
data:{MIME_type};base64,{base64_data})。 - 公网 URL 必须是上游能直接
GET到的直链:无鉴权、无跳转、不依赖 Referer / Cookie。部分站点对非浏览器抓取返回 403,会导致请求失败。
4. 计费口径
按张计费,不按 token。 输入(参考图)与输出(生成图)分别计价,各自再分 1k / 2k 两档:
| 模型 | 输出档位 | 输出单价 | 输入单价 |
|---|---|---|---|
qwen-image-3.0-pro | 1k | 0.25 元/张 | 0.02 元/张 |
qwen-image-3.0-pro | 2k | 0.50 元/张 | 0.02 元/张 |
qwen-image-3.0 | 1k | 0.18 元/张 | 0.02 元/张 |
qwen-image-3.0 | 2k | 0.18 元/张 | 0.02 元/张 |
档位按「输出」像素面积判定:面积 ≤ 2,250,000(即 1500×1500)为 1k,更大为 2k。输入图的档位同样按输出面积判定,不是按参考图自己的尺寸 —— 这是上游的口径。响应 usage 里的 output_image_type / input_image_type 就是本次实际命中的档位。
计费金额 = 输出张数 × 该档输出单价 + 输入张数 × 输入单价。几个实测例子(国内生产,2026-09-11):
| 请求 | usage | 结算金额 |
|---|---|---|
qwen-image-3.0,1024x1024,n=1,文生图 | output_image_count: 1,qima_output_1k | 0.18 元 |
qwen-image-3.0,1024x1024,n=2,文生图 | output_image_count: 2,qima_output_1k | 0.36 元 |
qwen-image-3.0-pro,1024x1024,n=1,文生图 | output_image_count: 1,qima_output_1k | 0.25 元 |
qwen-image-3.0-pro,2048x2048,n=1,文生图 | output_image_count: 1,qima_output_2k | 0.50 元 |
文生图不产生输入费用:没有参考图时 input_image_count 为 0,只结算输出张数。
5. 完整示例(Python,百炼官方 SDK)
import os
import dashscope
from dashscope import MultiModalConversation
dashscope.base_http_api_url = "https://api.modelgo.com/api/v1"
response = MultiModalConversation.call(
api_key=os.environ["MODELGO_API_KEY"],
model="qwen-image-3.0-pro",
messages=[{
"role": "user",
"content": [
{"image": "https://example-cdn.com/portrait.png"},
{"text": "把服装换成香槟色真丝衬衫,背景换成现代简约咖啡店"},
],
}],
prompt_extend=True,
)
if response.status_code == 200:
print(response.output.choices[0].message.content[0]["image"])
else:
print(f"Error: {response.code} - {response.message}")