集中管理 GPT Image 2 尺寸限制

将请求尺寸压缩与原始编辑校验共用同一组像素、边长和对齐常量。
This commit is contained in:
2026-09-12 15:00:55 +08:00
parent 664bdd6877
commit e9d0180054
3 changed files with 21 additions and 20 deletions
@@ -5,3 +5,7 @@ pub const VECTOR_ENGINE_GPT_IMAGE_2_MODEL: &str = GPT_IMAGE_2_MODEL;
pub const VECTOR_ENGINE_PROVIDER: &str = "vector-engine";
pub const VECTOR_ENGINE_IMAGE_EDIT_MAX_REFERENCE_IMAGES: usize = 5;
pub const VECTOR_ENGINE_NANOBANANA_MAX_REFERENCE_IMAGES: usize = 14;
pub const GPT_IMAGE_2_MIN_PIXELS: u64 = 655_360;
pub const GPT_IMAGE_2_MAX_PIXELS: u64 = 8_294_400;
pub const GPT_IMAGE_2_MAX_EDGE: u32 = 3_840;
pub const GPT_IMAGE_2_DIMENSION_ALIGNMENT: u32 = 16;
@@ -7,7 +7,10 @@ use serde::Deserialize;
use super::{
audit::build_failure_audit,
budget::{effective_request_timeout_ms, request_budget_exhausted_error},
constants::{GPT_IMAGE_2_MODEL, VECTOR_ENGINE_PROVIDER},
constants::{
GPT_IMAGE_2_DIMENSION_ALIGNMENT, GPT_IMAGE_2_MAX_EDGE, GPT_IMAGE_2_MAX_PIXELS,
GPT_IMAGE_2_MIN_PIXELS, GPT_IMAGE_2_MODEL, VECTOR_ENGINE_PROVIDER,
},
error::PlatformImageError,
request::vector_engine_images_edit_url,
types::VectorEngineImageSettings,
@@ -38,11 +41,6 @@ pub struct RawImageEditResult {
pub b64_images: Vec<String>,
}
const GPT_IMAGE_2_MIN_PIXELS: u64 = 655_360;
const GPT_IMAGE_2_MAX_PIXELS: u64 = 8_294_400;
const GPT_IMAGE_2_MAX_EDGE: u32 = 3_840;
const GPT_IMAGE_2_DIMENSION_ALIGNMENT: u32 = 16;
#[derive(Debug, Deserialize)]
struct RawImageEditResponsePayload {
data: Vec<RawImageEditResponseEntry>,
@@ -1,7 +1,10 @@
use serde_json::{Map, Value, json};
use super::{
constants::{GPT_IMAGE_2_C_MODEL, GPT_IMAGE_2_MODEL},
constants::{
GPT_IMAGE_2_C_MODEL, GPT_IMAGE_2_DIMENSION_ALIGNMENT, GPT_IMAGE_2_MAX_EDGE,
GPT_IMAGE_2_MAX_PIXELS, GPT_IMAGE_2_MIN_PIXELS, GPT_IMAGE_2_MODEL,
},
types::{ReferenceImage, VectorEngineImageSettings},
};
@@ -129,10 +132,6 @@ fn normalize_explicit_pixel_size(value: &str) -> String {
}
fn clamp_gpt_image_2_pixel_size(size: &str) -> String {
const MIN_PIXELS: u64 = 655_360;
const MAX_PIXELS: u64 = 8_294_400;
const MAX_EDGE: u32 = 3_840;
const DIMENSION_ALIGNMENT: u32 = 16;
const MAX_ASPECT_RATIO: f64 = 3.0;
// 中文注释:这里是 VectorEngine 的共享发送边界,只处理 gpt-image-2 的显式像素尺寸。
@@ -154,31 +153,31 @@ fn clamp_gpt_image_2_pixel_size(size: &str) -> String {
let pixels = width * height;
// 中文注释:等比缩小,优先保留已收紧后的画面比例,同时满足最大边和最大总像素。
let scale = (MAX_EDGE as f64 / width.max(height))
.min((MAX_PIXELS as f64 / pixels).sqrt())
let scale = (GPT_IMAGE_2_MAX_EDGE as f64 / width.max(height))
.min((GPT_IMAGE_2_MAX_PIXELS as f64 / pixels).sqrt())
.min(1.0);
width *= scale;
height *= scale;
let pixels = width * height;
// 中文注释:小于最小总像素时等比放大;此前已处理比例,放大不会重新突破 3:1。
if pixels < MIN_PIXELS as f64 {
let scale = (MIN_PIXELS as f64 / pixels).sqrt();
if pixels < GPT_IMAGE_2_MIN_PIXELS as f64 {
let scale = (GPT_IMAGE_2_MIN_PIXELS as f64 / pixels).sqrt();
width *= scale;
height *= scale;
}
// 中文注释:provider 要求两边均为 16px 倍数,向上取整避免对齐后落到最小像素以下。
let width = align_dimension_up(width, DIMENSION_ALIGNMENT);
let height = align_dimension_up(height, DIMENSION_ALIGNMENT);
let width = align_dimension_up(width, GPT_IMAGE_2_DIMENSION_ALIGNMENT);
let height = align_dimension_up(height, GPT_IMAGE_2_DIMENSION_ALIGNMENT);
// TODO unlikely but can improve
// 中文注释:对齐可能触碰最大边或最大像素,因此发送前重新核验全部约束。
if is_valid_gpt_image_2_size(
width,
height,
MIN_PIXELS,
MAX_PIXELS,
MAX_EDGE,
GPT_IMAGE_2_MIN_PIXELS,
GPT_IMAGE_2_MAX_PIXELS,
GPT_IMAGE_2_MAX_EDGE,
MAX_ASPECT_RATIO,
) {
return format!("{width}x{height}");