三个提交入口统一校验 provider 返回的 task id

- 新增 submitted_task_handle:空白 id 在提交调用附近以 OutputSchema 失败
- text / image / multiview 提交路径共用它,任务不再以孤儿状态等到下游查询才报错
This commit is contained in:
2026-09-22 15:53:37 +08:00
parent 09f0c51b81
commit 2e9aed3750
5 changed files with 25 additions and 9 deletions
@@ -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};
@@ -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<TripoTaskHandle, TripoError> {
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 })
}
@@ -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)
}
}
@@ -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 参数转换共用这一条规则。
@@ -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)
}
}