fix: 修正模型超时与结果未知重放
This commit is contained in:
@@ -13,12 +13,10 @@
|
||||
→ 创建一个 AITask
|
||||
→ 预留一次积分
|
||||
→ 调用主模型
|
||||
→ 失败后按配置重试主模型
|
||||
→ 仍失败且允许 Fallback
|
||||
→ 实时查询已启用的兼容模型
|
||||
→ 按动态顺序逐个尝试
|
||||
→ 明确失败:按配置重试主模型,仍失败且允许时动态 Fallback
|
||||
→ 远端结果不确定:停止自动重试和 Fallback
|
||||
→ 成功:保存结果并结算一次
|
||||
→ 全部失败:释放一次预留
|
||||
→ 最终失败或结果不确定:释放一次预留
|
||||
```
|
||||
|
||||
主模型始终是用户本次选择的模型;Fallback 不修改用户选择、默认模型或下次调用。
|
||||
@@ -37,10 +35,21 @@
|
||||
| 图片 | 1 次,等待 3 秒 | 300 秒 | 900 秒 |
|
||||
| 配音 | 1 次,等待 2 秒 | 60 秒 | 180 秒 |
|
||||
| 视频提交 | 1 次,等待 3 秒 | 120 秒 | 300 秒 |
|
||||
| 视频成片 | 不重新提交 | 单次轮询 60 秒 | 1800 秒 |
|
||||
| 视频成片 | 不重新提交 | 单次轮询 60 秒 | 以供应商终态为准,无本地硬总时限 |
|
||||
|
||||
单个逻辑任务最多尝试 3 个模型、发出 5 次真实请求。
|
||||
|
||||
### 2.1 远端结果确定性保护
|
||||
|
||||
统一执行器先判断本次失败是否能确认供应商没有成功处理:
|
||||
|
||||
- 明确失败:保留现有 Retry 与动态 Fallback。
|
||||
- 结果不确定:记录当前一次失败后立即停止,不查询候选、不等待退避、不再次调用 Provider。
|
||||
- `ReadTimeout`、请求发送后连接中断、HTTP `502/504`、响应缺失且无法确认结果,按结果不确定处理。
|
||||
- DNS、连接拒绝、建立连接超时和明确 `429` 仍按现有策略重试或 Fallback。
|
||||
- 结果不确定记录在 `AIModelAttempt.response_summary.outcome_unknown=true`,不新增表字段。
|
||||
- 该保护不改变超时数值、普通用户提示、模型选择、动态排序或视频长轮询规则。
|
||||
|
||||
## 3. 配置位置
|
||||
|
||||
全局策略在:
|
||||
@@ -50,7 +59,7 @@ core/backend/.env
|
||||
core/backend/airshelf/settings/base.py → MODEL_ROUTING_POLICY
|
||||
```
|
||||
|
||||
控制重试、超时、总时限、最多模型数、最多调用数和后处理退避。修改后必须同时重启 API 与 Celery Worker。
|
||||
控制重试、提交超时、最多模型数、最多调用数和后处理退避。视频取得远端任务 ID 后不设本地成片硬总时限。修改后必须同时重启 API 与 Celery Worker。
|
||||
|
||||
每个模型的开关保存在数据库 `ModelConfig.metadata.routing`:
|
||||
|
||||
@@ -142,9 +151,20 @@ fallback_candidate = true
|
||||
- 提交读取超时或响应缺少任务 ID 视为“远端状态未知”,禁止重复提交。
|
||||
- 获得远端任务 ID 后固定使用真正提交成功的模型轮询和结算。
|
||||
- 普通轮询超时只继续轮询,不切模型、不重新提交。
|
||||
- 达到成片总时限后才进入最终失败。
|
||||
- 本地等待时长不产生失败终态;只有供应商明确返回 `failed`、`expired` 或 `cancelled` 才失败并释放预留。
|
||||
- Worker 有限轮询用尽后只停止本轮兜底,业务任务仍保持生成中;用户重新打开页面可继续查询。
|
||||
- 供应商最终成功时正常转存资产并结算一次,即使成片超过 30 分钟。
|
||||
- 下载、上传、TOS 或资产保存失败只重试后处理,不重新调用模型。
|
||||
|
||||
旧版 30 分钟硬终止误判任务可使用以下管理命令核对:
|
||||
|
||||
```text
|
||||
python manage.py reconcile_video_timeouts --task-id <AITask UUID>
|
||||
python manage.py reconcile_video_timeouts --task-id <AITask UUID> --apply
|
||||
```
|
||||
|
||||
默认只读;`--apply` 仅恢复远端已成功结果,不重新提交模型、不追扣用户积分,并保证重复执行不会重复创建版本或资产。
|
||||
|
||||
## 9. 已接入入口
|
||||
|
||||
- 脚本生成、脚本优化、单镜优化。
|
||||
@@ -168,6 +188,7 @@ fallback_candidate = true
|
||||
|
||||
```text
|
||||
core/backend/apps/ai/routing_policy.py 全局策略读取与校验
|
||||
core/backend/apps/ai/generation_errors.py 错误分类与远端结果确定性判断
|
||||
core/backend/apps/ai/model_routing.py 能力匹配与动态候选排序
|
||||
core/backend/apps/ai/routing_executor.py 重试、Fallback 与调用审计
|
||||
core/backend/apps/ai/models.py AITask / AIModelAttempt
|
||||
|
||||
Reference in New Issue
Block a user