Skip to content

兼容 /v1/images/edits 的 JSON 图片输入#146

Open
hzexe wants to merge 1 commit into
basketikun:mainfrom
hzexe:local/images-edits-json-compat
Open

兼容 /v1/images/edits 的 JSON 图片输入#146
hzexe wants to merge 1 commit into
basketikun:mainfrom
hzexe:local/images-edits-json-compat

Conversation

@hzexe
Copy link
Copy Markdown

@hzexe hzexe commented May 11, 2026

关联 issue

背景

当前 /v1/images/edits 已支持标准 OpenAI-compatible multipart/form-data 图片编辑请求,例如 -F image=@./input.png

但部分 OpenAI-compatible / LiteLLM 客户端会以 JSON body 调用图片编辑接口,把参考图放在 image / images[].image_url 中,值为 data:image/...;base64,...。这种请求在当前实现中会因为 prompt 是必填 Form(...) 参数而被 FastAPI 提前按表单解析,无法进入正常编辑逻辑。

设计原则

这版只做增量兼容,不替换现有 multipart 解析路径:

  • 保留 edit_images 原有 File/Form 参数;
  • 保留原有 uploads = [*(image or []), *(image_list or [])] 多图处理逻辑;
  • 保留 imageimage[] 的 multipart 上传能力;
  • 仅把 prompt 从必填 Form(...) 调整为可选,避免 JSON 请求被 FastAPI 在进入函数前拦截;
  • 在函数内根据 Content-Type: application/json 增加 JSON 分支;
  • JSON 分支把图片转换为现有下游使用的 (bytes, filename, mime_type) 结构,后续协议层不改。

功能改动

保持不变

  • POST /v1/images/edits 的标准 multipart/form-data 调用方式保持兼容;
  • 单个 image 上传保持兼容;
  • 多个 image 上传保持兼容;
  • image[] 上传保持兼容;
  • modelnsizeresponse_formatstream 继续进入同一 payload;
  • 下游 services.protocol.openai_v1_image_edit.handle() 未改动。

新增支持

JSON 请求体支持:

  • image 单图;
  • images 多图;
  • data:image/...;base64,...
  • 裸 base64,默认按 image/png
  • images[].image_url
  • images[].image_url.url
  • b64_json / base64 对象字段。

JSON 未传 model 时沿用原接口默认值 gpt-image-2;传入 model 时不会覆盖。

安全与限制

  • 不支持服务端拉取 http:// / https:// 远程图片 URL,避免 SSRF;
  • 单张 JSON 图片限制 10MB;
  • JSON 图片数量限制 10 张;
  • 仅允许常见图片 MIME:image/pngimage/jpegimage/jpgimage/webpimage/gif
  • 缺图片、空图片、非法 base64、远程 URL、n 越界等客户端输入错误返回 400。

本地回归测试

新增离线 API 测试:test/test_v1_images_edits_json.py

覆盖:

  • JSON 未传 model 时沿用默认值;
  • JSON 传入 model 时不覆盖;
  • JSON 单图 images[].image_url
  • JSON 多图;
  • multipart 多个 image
  • multipart image[]
  • multipart image + image[] 混合;
  • JSON 缺图片;
  • JSON 远程 URL 拒绝;
  • JSON n 越界。

已本地通过:

CHATGPT2API_AUTH_KEY=chatgpt2api python -m unittest \
  test.test_v1_images_edits_json \
  test.test_image_tasks_api \
  test.test_image_base_url_api \
  test.test_config \
  test.test_image_task_service \
  -v

结果:

Ran 19 tests in 0.382s
OK

真实服务验证

基于 fork 镜像:

ghcr.io/hzexe/chatgpt2api:v1.1.7-json-edits-local.1

在 8318 服务上完成 8 项真实接口验证,全部 HTTP 200 且产出图片:

测试项 结果 输出
原标准生成单图 通过 1 张
原标准生成多图 通过 2 张
原标准编辑单图 multipart 通过 1 张
原标准编辑多图 multipart 通过 1 张
JSON 生成单图 通过 1 张
JSON 生成多图 通过 2 张
JSON 编辑单图 通过 1 张
JSON 编辑多图 通过 1 张

验证结论:

  • 原有 multipart edit 单图/多图未被破坏;
  • JSON edit 单图/多图可用;
  • generations 原有 JSON 单图/多图可用。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant