diff --git a/server-rs/crates/platform-tripo/src/common/mod.rs b/server-rs/crates/platform-tripo/src/common/mod.rs index 0d3b8a4d7..d6ee406c8 100644 --- a/server-rs/crates/platform-tripo/src/common/mod.rs +++ b/server-rs/crates/platform-tripo/src/common/mod.rs @@ -17,6 +17,6 @@ pub use types::{ TripoTaskType, TripoUrl, }; pub(crate) use validation::{ - TripoGenerationOptions, validate_generation_options, validate_task_id, + TripoGenerationOptions, submitted_task_handle, validate_generation_options, validate_task_id, }; pub(crate) use wire::{wire, wire_option}; diff --git a/server-rs/crates/platform-tripo/src/common/validation.rs b/server-rs/crates/platform-tripo/src/common/validation.rs index ee19b7da8..ba6101458 100644 --- a/server-rs/crates/platform-tripo/src/common/validation.rs +++ b/server-rs/crates/platform-tripo/src/common/validation.rs @@ -5,7 +5,7 @@ use shared_contracts::model3d::common::{ use shared_contracts::model3d::image_to_model::Model3dImageToModelParams; use shared_contracts::model3d::text_to_model::Model3dTextToModelParams; -use super::{TripoError, TripoField, TripoValidationReason}; +use super::{TripoError, TripoField, TripoTaskHandle, TripoValidationReason}; pub(crate) struct TripoGenerationOptions { pub model: Model3dModelVersion, @@ -263,3 +263,18 @@ pub(crate) fn validate_task_id(task_id: &str) -> Result<(), TripoError> { } Ok(()) } + +/// 提交成功后立刻收口 provider 返回的 task id。 +/// +/// 空白 id 是 provider 违约,不是调用方参数问题:必须在提交调用附近以 `OutputSchema` +/// 失败,而不是拖到下游 `get_task` 才报错——那时任务已经提交出去,成为无法追踪的孤儿。 +pub(crate) fn submitted_task_handle(task_id: String) -> Result { + let task_id = task_id.trim().to_string(); + if task_id.is_empty() { + return Err(TripoError::OutputSchema { + task_id: "submit".into(), + message: "submit response has no task_id".into(), + }); + } + Ok(TripoTaskHandle { task_id }) +} 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 d058d6504..275c47dd8 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 @@ -3,7 +3,7 @@ use tripo3d_sdk::{models::FileInput, params::ImageToModelParams}; use crate::common::{ TripoError, TripoField, TripoProviderClient, TripoTaskHandle, TripoValidationReason, - extra_fields, wire, wire_option, + extra_fields, submitted_task_handle, wire, wire_option, }; use super::validation::validate_image_to_model_params; @@ -104,7 +104,7 @@ impl TripoProviderClient { .image_to_model(to_sdk_params(input, params)?) .await .map_err(TripoError::from)?; - Ok(TripoTaskHandle { task_id }) + submitted_task_handle(task_id) } } 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 a8dba2c9f..ac4866464 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 @@ -5,8 +5,8 @@ use tripo3d_sdk::{models::FileInput, params::MultiviewToModelParams}; use crate::common::{ TripoError, TripoField, TripoGenerationOptions, TripoProviderClient, TripoTaskHandle, - TripoValidationReason, extra_fields, validate_generation_options, validate_task_id, wire, - wire_option, + TripoValidationReason, extra_fields, submitted_task_handle, validate_generation_options, + validate_task_id, wire, wire_option, }; impl TripoProviderClient { @@ -62,7 +62,7 @@ impl TripoProviderClient { .multiview_to_model(to_sdk_params(request)?) .await .map_err(TripoError::from)?; - Ok(TripoTaskHandle { task_id }) + submitted_task_handle(task_id) } } /// 空白(含纯空白)视图按「未提供」处理:提交前校验与 SDK 参数转换共用这一条规则。 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 cc34c18f4..63c1f9f12 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,5 +1,6 @@ use crate::common::{ - TripoError, TripoProviderClient, TripoTaskHandle, extra_fields, wire, wire_option, + TripoError, TripoProviderClient, TripoTaskHandle, extra_fields, submitted_task_handle, wire, + wire_option, }; use shared_contracts::model3d::text_to_model::Model3dTextToModelParams; @@ -18,7 +19,7 @@ impl TripoProviderClient { .text_to_model(to_sdk_params(params)?) .await .map_err(TripoError::from)?; - Ok(TripoTaskHandle { task_id }) + submitted_task_handle(task_id) } }