OpenAI · 图片编辑

通过输入图片和提示词进行修改;模型支持情况须核实。

POST/v1/images/edits

OpenAI 兼容

查看候选模型 ID
模型 ID厂商类型说明上下文窗口最大输出 Token媒体规格价格状态
暂无模型资料

按公开标签归类,并补充模型广场资料;— 表示暂无明确资料。左右滑动查看完整表格。

进阶用法与完整流程 · 参数与透传

Headers请求头

左右滑动查看完整参数表

请求头
参数名类型必填说明默认值 / 示例
Authorizationstring必填

平台 API Key,使用 Bearer 认证。

示例
Bearer YOUR_API_KEY
Content-Typestring必填

请求体编码格式。上传文件时由 HTTP 客户端自动添加 boundary,请勿手动固定此请求头。

示例
multipart/form-data

Request Body请求体

multipart/form-data

左右滑动查看完整参数表

请求体
参数名类型必填说明默认值 / 示例
imagefile | array<file>必填

需要编辑的图片文件。旧版模型通常要求 PNG、小于 4 MB 且为方形;其他模型的数量、格式与大小限制以实际能力为准。

示例
input.png
maskfile可选

可选遮罩图片;透明区域标记编辑位置,尺寸应与输入图片一致。

示例
mask.png
modelstring可选

模型 ID;请替换为账户可用且支持当前接口的模型。

示例
MODEL_ID
promptstring必填

描述希望如何修改图片;文本长度限制因模型而异。

—
ninteger可选

生成数量;需模型支持。

—
sizestring可选

输出尺寸,例如 1024x1024;需模型支持。

—
response_formatstring可选

响应图片的表示形式;需模型支持。

可选值urlb64_json
—
userstring可选

应用内终端用户标识。

—
qualitystring可选

输出质量;仅部分模型支持。

—
backgroundstring可选

背景透明度;仅部分模型支持。

可选值autotransparentopaque
—
output_formatstring可选

输出图片格式;仅部分模型支持。

可选值pngjpegwebp
—
input_fidelitystring可选

保留输入图片细节的程度;仅部分模型支持。

—

使用说明

  • 以 multipart/form-data 上传本地图片,Content-Type 和 boundary 由客户端生成。
  • image、mask 的格式、尺寸、文件大小与可上传张数依模型而定;旧版限制不能推广到所有图像模型。
  • 返回值可能是图片 URL 或 Base64;下方为结构说明样例。

生成与编辑

用途请求格式输入
生成 /v1/images/generationsapplication/json以 prompt 描述新图片
编辑 /v1/images/editsmultipart/form-data上传 image 文件,并用 prompt 描述修改

编辑接口的 mask、透明区域规则、多图字段及文件规格由具体模型决定。使用 multipart 时让客户端生成 Content-Type 和 boundary。图片数量、尺寸、格式和单文件大小按所选模型的说明填写。

保存 URL 或 Base64 图片结果

读取 data[].url 下载图片,或将 data[].b64_json 解码为二进制。URL 可能有有效期,收到后及时保存。下方示例按文件头识别 PNG、JPEG、WebP,其他编码保存为 .bin;完整写入临时文件后再替换目标文件。

展开 Python:提交请求并保存图片
Python
# 安装依赖:python -m pip install requests
import base64
import json
import os
from pathlib import Path
from urllib.parse import quote
import requests

BASE_URL = "https://ai.kedang.net"
MODEL_ID = "MODEL_ID"  # 替换为账户可用、支持当前能力的模型


def request_json(path, body, extra_headers=None):
    headers = {"Authorization": "Bearer " + os.environ["KEDANG_API_KEY"]}
    headers.update(extra_headers or {})
    response = requests.post(BASE_URL + path, headers=headers, json=body, timeout=120)
    response.raise_for_status()
    result = response.json()
    if result.get("error"):
        raise RuntimeError(result["error"])
    return result

import tempfile
from urllib.parse import urlsplit


def image_extension(content):
    if content.startswith(b"\x89PNG\r\n\x1a\n"):
        return ".png"
    if content.startswith(b"\xff\xd8\xff"):
        return ".jpg"
    if content[:4] == b"RIFF" and content[8:12] == b"WEBP":
        return ".webp"
    return ".bin"  # 其他编码先按原始字节保存,再按实际格式命名。


def save_images(result, directory="generated-images"):
    items = result.get("data")
    if not isinstance(items, list) or not items:
        raise ValueError("响应没有 data 图片列表")
    folder = Path(directory)
    folder.mkdir(parents=True, exist_ok=True)
    paths = []
    for index, item in enumerate(items, 1):
        if item.get("b64_json"):
            content = base64.b64decode(item["b64_json"], validate=True)
        elif item.get("url"):
            url = item["url"]
            parsed = urlsplit(url)
            if parsed.scheme != "https" or not parsed.netloc:
                raise ValueError("图片结果需为有效 HTTPS 地址")
            # 媒体地址可能在独立域名;这里不携带平台 API Key。
            response = requests.get(url, timeout=120)
            response.raise_for_status()
            mime = response.headers.get("Content-Type", "").split(";", 1)[0].lower()
            if mime and not (mime.startswith("image/") or mime == "application/octet-stream"):
                raise ValueError("下载响应不是图片或二进制文件")
            content = response.content
        else:
            raise ValueError("图片项缺少 url 或 b64_json")
        if not content:
            raise ValueError("图片内容为空")
        target = folder / ("image-" + str(index) + image_extension(content))
        temporary = None
        try:
            with tempfile.NamedTemporaryFile(dir=folder, delete=False) as file:
                temporary = Path(file.name)
                file.write(content)
            temporary.replace(target)
        finally:
            if temporary is not None:
                temporary.unlink(missing_ok=True)
        paths.append(target)
    return paths

def main():
    headers = {"Authorization": "Bearer " + os.environ["KEDANG_API_KEY"]}
    # image 是文件字段;Content-Type 与 boundary 由 requests 自动设置。
    with Path("input.png").open("rb") as image:
        response = requests.post(BASE_URL + "/v1/images/edits", headers=headers,
            data={"model": MODEL_ID, "prompt": "将图片背景改为浅蓝色。", "n": "1"},
            files={"image": ("input.png", image, "image/png")}, timeout=120)
        response.raise_for_status()
        result = response.json()
    if result.get("error"):
        raise RuntimeError(result["error"])
    for path in save_images(result):
        print(path)

if __name__ == "__main__":
    main()