图片编辑:根据指令编辑参考图(1–5 张)
curl --request POST \
--url https://api.apiyi.com/v1/images/edits \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form model=MAI-Image-2.6-Flash \
--form 'prompt=把茶壶改成深钴蓝釉,其余部分完全保持不变' \
--form 'image=@example-file;type=image/png'import requests
url = "https://api.apiyi.com/v1/images/edits"
files = { "image": ("example-file", open("example-file", "rb"), "image/png") }
payload = {
"model": "MAI-Image-2.6-Flash",
"prompt": "把茶壶改成深钴蓝釉,其余部分完全保持不变"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('model', 'MAI-Image-2.6-Flash');
form.append('prompt', '把茶壶改成深钴蓝釉,其余部分完全保持不变');
form.append('image', '<string>');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.apiyi.com/v1/images/edits', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.apiyi.com/v1/images/edits",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\nMAI-Image-2.6-Flash\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"prompt\"\r\n\r\n把茶壶改成深钴蓝釉,其余部分完全保持不变\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image\"; filename=\"example-file\"\r\nContent-Type: image/png\r\n\r\n<string>\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.apiyi.com/v1/images/edits"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\nMAI-Image-2.6-Flash\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"prompt\"\r\n\r\n把茶壶改成深钴蓝釉,其余部分完全保持不变\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image\"; filename=\"example-file\"\r\nContent-Type: image/png\r\n\r\n<string>\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.apiyi.com/v1/images/edits")
.header("Authorization", "Bearer <token>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\nMAI-Image-2.6-Flash\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"prompt\"\r\n\r\n把茶壶改成深钴蓝釉,其余部分完全保持不变\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image\"; filename=\"example-file\"\r\nContent-Type: image/png\r\n\r\n<string>\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.apiyi.com/v1/images/edits")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\nMAI-Image-2.6-Flash\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"prompt\"\r\n\r\n把茶壶改成深钴蓝釉,其余部分完全保持不变\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image\"; filename=\"example-file\"\r\nContent-Type: image/png\r\n\r\n<string>\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"created": 1791000788,
"data": [
{
"b64_json": "<string>"
}
],
"usage": {
"prompt_tokens": 1000,
"total_tokens": 1000
}
}MAI-Image 2.6 生图/编辑
图片编辑 API 参考
MAI-Image 2.6 图片编辑 API 参考与在线调试 — 上传 1–5 张参考图 + 指令改图或多图融合,必须使用 multipart/form-data 文件上传,参考图张数不影响价格
POST
/
v1
/
images
/
edits
图片编辑:根据指令编辑参考图(1–5 张)
curl --request POST \
--url https://api.apiyi.com/v1/images/edits \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form model=MAI-Image-2.6-Flash \
--form 'prompt=把茶壶改成深钴蓝釉,其余部分完全保持不变' \
--form 'image=@example-file;type=image/png'import requests
url = "https://api.apiyi.com/v1/images/edits"
files = { "image": ("example-file", open("example-file", "rb"), "image/png") }
payload = {
"model": "MAI-Image-2.6-Flash",
"prompt": "把茶壶改成深钴蓝釉,其余部分完全保持不变"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('model', 'MAI-Image-2.6-Flash');
form.append('prompt', '把茶壶改成深钴蓝釉,其余部分完全保持不变');
form.append('image', '<string>');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.apiyi.com/v1/images/edits', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.apiyi.com/v1/images/edits",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\nMAI-Image-2.6-Flash\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"prompt\"\r\n\r\n把茶壶改成深钴蓝釉,其余部分完全保持不变\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image\"; filename=\"example-file\"\r\nContent-Type: image/png\r\n\r\n<string>\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.apiyi.com/v1/images/edits"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\nMAI-Image-2.6-Flash\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"prompt\"\r\n\r\n把茶壶改成深钴蓝釉,其余部分完全保持不变\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image\"; filename=\"example-file\"\r\nContent-Type: image/png\r\n\r\n<string>\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.apiyi.com/v1/images/edits")
.header("Authorization", "Bearer <token>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\nMAI-Image-2.6-Flash\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"prompt\"\r\n\r\n把茶壶改成深钴蓝釉,其余部分完全保持不变\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image\"; filename=\"example-file\"\r\nContent-Type: image/png\r\n\r\n<string>\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.apiyi.com/v1/images/edits")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\nMAI-Image-2.6-Flash\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"prompt\"\r\n\r\n把茶壶改成深钴蓝釉,其余部分完全保持不变\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image\"; filename=\"example-file\"\r\nContent-Type: image/png\r\n\r\n<string>\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"created": 1791000788,
"data": [
{
"b64_json": "<string>"
}
],
"usage": {
"prompt_tokens": 1000,
"total_tokens": 1000
}
}右侧的交互式 Playground 支持直接上传本地图片。请在 Authorization 中填入你的 API Key(格式:
Bearer sk-xxx),选择 image 文件(可添加多张)并填入 prompt、model 后一键发送即可。🔴 本接口只接受 不支持图片 URL 入参。手上只有 URL 时,请先在服务端下载成文件再上传。文件上传不需要图床,直接传本地文件即可。
multipart/form-data 文件上传发送 JSON 到 /v1/images/edits(image 填 URL、data URI 或裸 base64)会返回 400:request Content-Type isn't multipart/form-data
场景说明:本页用于「基于参考图改图」,支持单图编辑与 1–5 张多图融合。如需纯文本生成图片,请使用 文生图接口。
🖼️ 支持 1–5 张参考图(2026-10-07 起)
- 写法:重复
image[]字段,每个字段放一张图;OpenAI SDK 直接传列表client.images.edit(image=[f1, f2, ...])。image同名重复也可以 - 顺序:按上传顺序依次是图1、图2……,提示词里可以直接说「把图2里的狐狸放进图1」
- 价格:按次计费,传 1 张还是 5 张都是同一个价
- 格式:JPEG、PNG、WebP;GIF 等其他格式返回 400
- 超过 5 张返回 400
at most 5 reference images are accepted for <model>
不要用
image + image2 这类编号字段名:返回 200,但只有第一张图生效,第二张被丢弃;image1 + image2 则返回 500 image is required。多张图请一律用重复的 image[]。参数红线与文生图相同:不要传
response_format、seed、negative_prompt(返回 400)。返回值固定为 data[0].b64_json(PNG)。代码示例
Python(OpenAI SDK · 单图编辑)
from openai import OpenAI
import base64
client = OpenAI(
api_key="sk-your-api-key",
base_url="https://api.apiyi.com/v1",
timeout=180.0
)
# SDK 的 images.edit 内部就是 multipart 文件上传;不要传 response_format
resp = client.images.edit(
model="MAI-Image-2.6-Flash",
image=open("teaset.jpg", "rb"),
prompt="Change the teapot to a deep cobalt blue glaze, keep everything else identical"
)
with open("edited.png", "wb") as f:
f.write(base64.b64decode(resp.data[0].b64_json))
Python(OpenAI SDK · 多图融合)
from openai import OpenAI
import base64
client = OpenAI(
api_key="sk-your-api-key",
base_url="https://api.apiyi.com/v1",
timeout=180.0
)
# image 传列表即可,1–5 张;SDK 会把每张图作为一个 image[] 字段上传
# 按上传顺序依次是图1、图2……,价格与单图相同
resp = client.images.edit(
model="MAI-Image-2.6-Flash",
image=[open("teaset.jpg", "rb"), open("fox.jpg", "rb")],
prompt="把图2里的狐狸(保留它的全部外观细节)放进图1的场景里,坐在茶具旁边,图1其余部分保持不变"
)
with open("fused.png", "wb") as f:
f.write(base64.b64decode(resp.data[0].b64_json))
Python(原生 requests · 单图编辑)
import base64
import os
import requests
# 用 files= 传文件,requests 会自动设置 multipart/form-data 及 boundary
# 不要用 json=,也不要手动设 Content-Type
with open("teaset.jpg", "rb") as fp:
response = requests.post(
"https://api.apiyi.com/v1/images/edits",
headers={"Authorization": f"Bearer {os.environ['APIYI_API_KEY']}"},
data={
"model": "MAI-Image-2.6",
"prompt": "把茶壶改成深钴蓝釉,其余部分完全保持不变"
},
files={"image": ("teaset.jpg", fp, "image/jpeg")},
timeout=180
)
response.raise_for_status()
with open("edited.png", "wb") as f:
f.write(base64.b64decode(response.json()["data"][0]["b64_json"]))
files 改用元组列表,每张图一个 image[](dict 不能放重复的键):
files = [
("image[]", ("teaset.jpg", open("teaset.jpg", "rb"), "image/jpeg")),
("image[]", ("fox.jpg", open("fox.jpg", "rb"), "image/jpeg")),
]
cURL
# 单图编辑:-F 即 multipart/form-data,@ 前缀表示上传本地文件
curl -X POST "https://api.apiyi.com/v1/images/edits" \
-H "Authorization: Bearer sk-your-api-key" \
-F "model=MAI-Image-2.6-Flash" \
-F "prompt=把茶壶改成深钴蓝釉,其余部分完全保持不变" \
-F "[email protected]" \
| python3 -c "import sys,json,base64; open('edited.png','wb').write(base64.b64decode(json.load(sys.stdin)['data'][0]['b64_json']))"
# 编辑时改画幅为 1536×1024(与原图比例不同会重新构图)
curl -X POST "https://api.apiyi.com/v1/images/edits" \
-H "Authorization: Bearer sk-your-api-key" \
-F "model=MAI-Image-2.6" \
-F "prompt=把这张茶具图改成摆在木桌上的生活场景,自然光,写实摄影" \
-F "width=1536" \
-F "height=1024" \
-F "[email protected]"
# 多图融合:重复 image[] 字段,1–5 张,按顺序为图1、图2……
curl -X POST "https://api.apiyi.com/v1/images/edits" \
-H "Authorization: Bearer sk-your-api-key" \
-F "model=MAI-Image-2.6-Flash" \
-F "prompt=把图2里的狐狸(保留它的全部外观细节)放进图1的场景里,坐在茶具旁边,图1其余部分保持不变" \
-F "image[][email protected]" \
-F "image[][email protected]" \
| python3 -c "import sys,json,base64; open('fused.png','wb').write(base64.b64decode(json.load(sys.stdin)['data'][0]['b64_json']))"
Node.js(原生 fetch + FormData)
import fs from 'node:fs';
const form = new FormData();
form.append('model', 'MAI-Image-2.6-Flash');
form.append('prompt', '把背景换成雪夜的松林,保持人物不变');
form.append('image', new Blob([fs.readFileSync('./photo.jpg')]), 'photo.jpg');
// 多图融合:改成多次 form.append('image[]', ...),每次一张,最多 5 张
const resp = await fetch('https://api.apiyi.com/v1/images/edits', {
method: 'POST',
// 不要手动设 Content-Type,交给 FormData 自动带 boundary
headers: { 'Authorization': `Bearer ${process.env.APIYI_API_KEY}` },
body: form,
signal: AbortSignal.timeout(120000)
});
const data = await resp.json();
fs.writeFileSync('edited.png', Buffer.from(data.data[0].b64_json, 'base64'));
参数说明速查
| 参数名 | 类型 | 必填 | 默认 | 说明 |
|---|---|---|---|---|
model | string | ✅ | — | MAI-Image-2.6($0.12/张)或 MAI-Image-2.6-Flash($0.06/张),大小写敏感 |
prompt | string | ✅ | — | 编辑指令。建议写明「改什么」并声明「其余保持不变」 |
image / image[] | file | ✅ | — | 参考图文件,1–5 张。单图用 image;多图重复 image[] 字段,按上传顺序为图1…图N。支持 JPEG / PNG / WebP,张数不影响价格 |
width / height | integer | ❌ | 跟随原图比例 | 指定输出尺寸,规则同文生图;与原图比例不同时会重新构图 |
n | integer | ❌ | 1 | 出图张数,本端点有效,按张计费 |
mask | — | — | — | 不支持,传入返回 400 <model> does not support mask edits |
response_formatseednegative_prompt | — | — | — | 传入返回 400 |
不传尺寸时的输出:按原图比例贴合到 16 的倍数网格,例如 1344×756 的输入输出 1360×768;多图时以图1的比例为准。只想改局部、不想动构图时,不要传
width / height。编辑效果与提示词写法
编辑接口会保留原图的构图、配色与细节,只改提示词指定的部分:
| 写法 | 效果 |
|---|---|
✅ 把茶壶改成深钴蓝釉,其余部分完全保持不变 | 只有茶壶变色,尺寸标注、其它物件逐像素保留 |
✅ 把这张照片改成水彩画风格,构图不变 | 风格整体重绘,构图保持 |
⚠️ 让它更好看一点 | 指令过于笼统,改动范围不可控 |
**显式声明「其余保持不变」**是这个模型上最有效的技巧,能最大限度保留原图。
多图融合
把图1当作底图,其余参考图里的物体按提示词放进去。下例一次传入 5 张(茶具图 + 狐狸 + 橡皮鸭 + 闹钟 + 仙人掌),提示词为「把图2的狐狸、图3的黄色橡皮鸭、图4的红色复古闹钟、图5的仙人掌盆栽都摆进图1的茶桌场景里,每个物体保留原有外观,图1其余部分保持不变」:
| 写法 | 效果 |
|---|---|
✅ 把图2里的狐狸放进图1的场景里,图1其余部分保持不变 | 用「图N」指代参考图,按上传顺序对应,最稳定 |
✅ 点名每张图里的物体:图3的黄色橡皮鸭、图4的红色闹钟 | 张数多时逐个点名,避免漏放 |
⚠️ 把这几张图合成一张 | 没指明底图和主体,构图不可控 |
响应格式
{
"created": 1791000788,
"data": [
{
"b64_json": "iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAIAAADwf7zU..."
}
],
"usage": {
"prompt_tokens": 1000,
"total_tokens": 1000,
"input_tokens": 1000,
"output_tokens": 0
}
}
响应字段说明
b64_json是纯 base64,不带data:前缀,解码后为 PNG。n > 1时data数组有多项,别只取data[0]。- 不返回
url与revised_prompt。
usage 不能用来核账:是占位值(prompt_tokens 恒为 1000 × 张数)。编辑与文生图同价,按张固定计费,参考图张数不影响价格,真实扣费请以 API易 控制台账单为准。授权
在 API易控制台获取的 API Key
请求体
multipart/form-data
模型 ID(大小写敏感)
可用选项:
MAI-Image-2.6-Flash, MAI-Image-2.6 编辑指令。建议明确「改什么」并声明「其余保持不变」
示例:
"把茶壶改成深钴蓝釉,其余部分完全保持不变"
参考图文件,1–5 张,按上传顺序为图1…图N。格式 png / jpg / webp。代码调用时多图请重复 image[] 字段
Required array length:
1 - 5 elements可选,输出宽度。规则同文生图:每维 ≥ 768、宽×高 ≤ 2,359,296,须与 height 成对
必填范围:
x >= 768可选,输出高度,规则同 width
必填范围:
x >= 768出图张数,本端点有效,按张计费
必填范围:
x >= 1示例:
1
此页面对您有帮助吗?