收敛Tripo三入口重复的extra字段构造

- 新增 common/extra.rs 统一构造 texture_version 与 delight 的 SDK extra 字段,键名只留一份
- text_to_model 与 image_to_model 删除各自的 extra_fields 副本,改调公共实现
- multiview_to_model 的内联 extra.insert 也改为复用同一构造
- 未提供的参数仍不写入 extra,请求体行为与原先一致
This commit is contained in:
2026-09-21 15:08:50 +08:00
parent eb4256f883
commit 0982b952cb
5 changed files with 38 additions and 49 deletions
@@ -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<Model3dTextureVersion>,
delight: Option<bool>,
) -> HashMap<String, Value> {
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
}
@@ -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,
@@ -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<Model3dTextureVersion>,
delight: Option<bool>,
) -> std::collections::HashMap<String, serde_json::Value> {
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
}
@@ -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)
@@ -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<Model3dTextureVersion>,
delight: Option<bool>,
) -> std::collections::HashMap<String, serde_json::Value> {
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
}