From 2e9aed3750a848c0c799eaeba3fa16d28de055fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Tue, 22 Sep 2026 15:53:37 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=89=E4=B8=AA=E6=8F=90=E4=BA=A4=E5=85=A5?= =?UTF-8?q?=E5=8F=A3=E7=BB=9F=E4=B8=80=E6=A0=A1=E9=AA=8C=20provider=20?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E7=9A=84=20task=20id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 submitted_task_handle:空白 id 在提交调用附近以 OutputSchema 失败 - text / image / multiview 提交路径共用它,任务不再以孤儿状态等到下游查询才报错 --- .../crates/platform-tripo/src/common/mod.rs | 2 +- .../platform-tripo/src/common/validation.rs | 17 ++++++++++++++++- .../platform-tripo/src/image_to_model/client.rs | 4 ++-- .../src/multiview_to_model/client.rs | 6 +++--- .../platform-tripo/src/text_to_model/client.rs | 5 +++-- 5 files changed, 25 insertions(+), 9 deletions(-) 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) } }