diff --git a/server-rs/crates/platform-image/src/vector_engine/constants.rs b/server-rs/crates/platform-image/src/vector_engine/constants.rs index 6480fba73..2ae789387 100644 --- a/server-rs/crates/platform-image/src/vector_engine/constants.rs +++ b/server-rs/crates/platform-image/src/vector_engine/constants.rs @@ -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; diff --git a/server-rs/crates/platform-image/src/vector_engine/raw_edit.rs b/server-rs/crates/platform-image/src/vector_engine/raw_edit.rs index 6061f885b..6731432d9 100644 --- a/server-rs/crates/platform-image/src/vector_engine/raw_edit.rs +++ b/server-rs/crates/platform-image/src/vector_engine/raw_edit.rs @@ -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, } -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, diff --git a/server-rs/crates/platform-image/src/vector_engine/request.rs b/server-rs/crates/platform-image/src/vector_engine/request.rs index af232dbc8..0b008d2a2 100644 --- a/server-rs/crates/platform-image/src/vector_engine/request.rs +++ b/server-rs/crates/platform-image/src/vector_engine/request.rs @@ -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}");