provider 报 unknown 任务状态时改为可重试,不再直接判死

- platform-tripo:`TaskStatus::Unknown` 不再归一成 `OutputSchema` 终态失败,改成新的 `TripoError::TaskStatusUnknown`,并把它的可重试性判为真(SDK 自己也没把 unknown 算进终态)
- platform-tripo:补用例——provider 回 `"status":"unknown"` 时必须返回可重试的 `TaskStatusUnknown`,不能当成正常快照
- api-server:错误映射补 `TaskStatusUnknown` 分支(502 + 固定文案,轮询侧早已按可重试继续查到截止时间)
- api-server worker:状态查询遇到可重试错误时补一条 warn 日志,便于区分「一直是 unknown」和「一次网络抖动」
- docs:Provider 集成方案写明 unknown 按可重试处理及其理由
This commit is contained in:
2026-09-24 21:06:04 +08:00
parent 2aa59328de
commit e20ff2e89e
6 changed files with 72 additions and 4 deletions
@@ -144,6 +144,15 @@ pub(crate) fn map_provider_error(error: TripoError) -> AppError {
"3D 生成任务的结果格式不符合预期,未落库。".to_string(),
)
}
// 轮询侧按可重试继续查到截止时间,真走到这里说明预估的时间已经用尽。
TripoError::TaskStatusUnknown { .. } => {
tracing::error!(error = %error, "tripo task status is unrecognized");
(
StatusCode::BAD_GATEWAY,
"tripo-task-status-unknown",
"3D 生成服务的任务状态暂时无法识别,请稍后重试。".to_string(),
)
}
// 配置问题正常在 `provider.rs` 就按 503 拦下;这里只是把枚举匹配补全,
// 真走到这一步说明有调用方绕过了构造入口,按服务不可用上报。
TripoError::Configuration { .. } => {
@@ -252,6 +252,9 @@ async fn poll_until_terminal(
// 查询本身已经带过一轮退避重试;仍是瞬时故障时继续按轮询间隔查到预算用尽,
// 不因为一次 provider 抖动就作废这笔已经提交、不能重来的任务。
Err(error) if error.is_retryable() => {
// 包括 provider 报的 `unknown` 状态:继续查到截止时间,日志留痕便于区分
// 「一直是 unknown」和「一次网络抖动」。
tracing::warn!(error = %error, "3D 生成任务状态查询遇到可重试错误,继续轮询");
let remaining = provider_deadline.saturating_duration_since(Instant::now());
tokio::time::sleep(MODEL3D_POLL_INTERVAL.min(remaining)).await;
continue;