diff --git a/server-rs/crates/platform-tripo/src/common/extra.rs b/server-rs/crates/platform-tripo/src/common/extra.rs new file mode 100644 index 000000000..14ef2d2cd --- /dev/null +++ b/server-rs/crates/platform-tripo/src/common/extra.rs @@ -0,0 +1,31 @@ +//! provider 请求的 SDK `extra` 字段构造。 +//! +//! `texture_version` 与 `delight` 不在 SDK params 的具名参数里,只能按 SDK 期望的 +//! 键名透传。键名一旦在某个入口写错,请求体就会静默丢字段,所以三个生成入口共用 +//! 同一份构造逻辑,不在各 endpoint 里各写一遍。 + +use std::collections::HashMap; + +use serde_json::Value; +use shared_contracts::model3d::common::Model3dTextureVersion; + +const EXTRA_TEXTURE_VERSION: &str = "texture_version"; +const EXTRA_DELIGHT: &str = "delight"; + +/// 按 provider 需要的键名构造 `extra`;未提供的参数不写入,由 provider 取默认值。 +pub(crate) fn extra_fields( + texture_version: Option, + delight: Option, +) -> HashMap { + let mut extra = HashMap::new(); + if let Some(value) = texture_version { + extra.insert( + EXTRA_TEXTURE_VERSION.into(), + Value::String(value.as_str().into()), + ); + } + if let Some(value) = delight { + extra.insert(EXTRA_DELIGHT.into(), Value::Bool(value)); + } + extra +} diff --git a/server-rs/crates/platform-tripo/src/common/mod.rs b/server-rs/crates/platform-tripo/src/common/mod.rs index f5ad1094d..5529bb3da 100644 --- a/server-rs/crates/platform-tripo/src/common/mod.rs +++ b/server-rs/crates/platform-tripo/src/common/mod.rs @@ -1,6 +1,7 @@ mod client; mod config; mod error; +mod extra; mod mapping; mod types; mod validation; @@ -8,6 +9,7 @@ mod validation; pub use client::TripoProviderClient; pub use config::TripoSettings; pub use error::{TripoError, TripoField, TripoValidationReason}; +pub(crate) use extra::extra_fields; pub(crate) use mapping::map_task; pub use types::{ TripoDownloadedArtifact, TripoTaskFailure, TripoTaskHandle, TripoTaskOutput, TripoTaskSnapshot, diff --git a/server-rs/crates/platform-tripo/src/image_to_model/client.rs b/server-rs/crates/platform-tripo/src/image_to_model/client.rs index c9ae60941..0c17d84bb 100644 --- a/server-rs/crates/platform-tripo/src/image_to_model/client.rs +++ b/server-rs/crates/platform-tripo/src/image_to_model/client.rs @@ -1,12 +1,13 @@ use shared_contracts::model3d::common::{ Model3dCompression, Model3dExportOrientation, Model3dGeometryQuality, Model3dInputOrientation, - Model3dTextureAlignment, Model3dTextureQuality, Model3dTextureVersion, + Model3dTextureAlignment, Model3dTextureQuality, }; use shared_contracts::model3d::image_to_model::Model3dImageToModelParams; use tripo3d_sdk::{models::FileInput, params::ImageToModelParams}; use crate::common::{ TripoError, TripoField, TripoProviderClient, TripoTaskHandle, TripoValidationReason, + extra_fields, }; use super::validation::validate_image_to_model_params; @@ -150,20 +151,3 @@ fn to_sdk_params(input: FileInput, params: &Model3dImageToModelParams) -> ImageT style: None, } } - -fn extra_fields( - texture_version: Option, - delight: Option, -) -> std::collections::HashMap { - let mut extra = std::collections::HashMap::new(); - if let Some(value) = texture_version { - extra.insert( - "texture_version".into(), - serde_json::Value::String(value.as_str().into()), - ); - } - if let Some(value) = delight { - extra.insert("delight".into(), serde_json::Value::Bool(value)); - } - extra -} diff --git a/server-rs/crates/platform-tripo/src/multiview_to_model/client.rs b/server-rs/crates/platform-tripo/src/multiview_to_model/client.rs index c69c0cd73..1117b5653 100644 --- a/server-rs/crates/platform-tripo/src/multiview_to_model/client.rs +++ b/server-rs/crates/platform-tripo/src/multiview_to_model/client.rs @@ -9,7 +9,7 @@ use tripo3d_sdk::{models::FileInput, params::MultiviewToModelParams}; use crate::common::{ TripoError, TripoField, TripoGenerationOptions, TripoProviderClient, TripoTaskHandle, - TripoValidationReason, validate_generation_options, validate_task_id, + TripoValidationReason, extra_fields, validate_generation_options, validate_task_id, }; impl TripoProviderClient { @@ -106,17 +106,7 @@ fn to_sdk_params(request: &Model3dMultiviewToModelRequest) -> MultiviewToModelPa .texture_quality .map(Model3dTextureQuality::as_str) .map(str::to_owned); - if let Some(value) = request.texture_version { - params.extra.insert( - "texture_version".into(), - serde_json::Value::String(value.as_str().into()), - ); - } - if let Some(value) = request.delight { - params - .extra - .insert("delight".into(), serde_json::Value::Bool(value)); - } + params.extra = extra_fields(request.texture_version, request.delight); params.geometry_quality = request .geometry_quality .map(Model3dGeometryQuality::as_str) diff --git a/server-rs/crates/platform-tripo/src/text_to_model/client.rs b/server-rs/crates/platform-tripo/src/text_to_model/client.rs index e253faa22..fa11c5755 100644 --- a/server-rs/crates/platform-tripo/src/text_to_model/client.rs +++ b/server-rs/crates/platform-tripo/src/text_to_model/client.rs @@ -1,7 +1,6 @@ -use crate::common::{TripoError, TripoProviderClient, TripoTaskHandle}; +use crate::common::{TripoError, TripoProviderClient, TripoTaskHandle, extra_fields}; use shared_contracts::model3d::common::{ Model3dCompression, Model3dExportOrientation, Model3dGeometryQuality, Model3dTextureQuality, - Model3dTextureVersion, }; use shared_contracts::model3d::text_to_model::Model3dTextToModelParams; @@ -58,20 +57,3 @@ fn to_sdk_params(params: &Model3dTextToModelParams) -> tripo3d_sdk::params::Text style: None, } } - -fn extra_fields( - texture_version: Option, - delight: Option, -) -> std::collections::HashMap { - let mut extra = std::collections::HashMap::new(); - if let Some(value) = texture_version { - extra.insert( - "texture_version".into(), - serde_json::Value::String(value.as_str().into()), - ); - } - if let Some(value) = delight { - extra.insert("delight".into(), serde_json::Value::Bool(value)); - } - extra -}