fix(assets): 智能选素材传 limit 参数,避免「有几个选几个」 #1570

Merged
auto-approve-bot merged 2 commits from fix/smart-match-limit into develop 2026-08-31 14:21:00 +08:00
Owner

问题

线上实测:AI 自动选素材时,视频库里有几个素材就返回几个,没有数量上限控制。

根因:smartMatchAssets 调用 POST /assets/smart-match 时未传 limit 参数,后端 SmartMatchRequest.limit 默认为 None(返回全部)。

修复

1. apps/web/src/api/assets/assets.ts

  • smartMatchAssets 增加可选 limit?: number 参数
  • 仅在 limit > 0 时序列化进请求体

2. apps/web/src/pages/generate/hooks/step2-materials/useSmartMatch.ts

  • 接受 templateSegments?: TemplateSegment[] 选项
  • 新增 computeLimitFromSegments
    • 取各 segment duration_min 之和作为目标视频总时长
    • 按 15 秒/素材估算所需素材数:Math.ceil(totalSeconds / 15)
    • 结果钳制到 [1, 200](后端 SmartMatchRequest.limit 上限 200)
    • 拿不到时长信息时默认 limit = 10

3. apps/web/src/pages/generate/hooks/useStep2Materials.ts

  • 透传 templateSegmentsuseSmartMatch

影响范围

  • 仅影响自动模式(materialMode === "auto"
  • 手动选素材模式不受影响
  • 后端已支持 limit 字段(SmartMatchRequest.limit: int | None = Field(default=None, ge=1, le=200)

验收

  • 自动模式选素材数量 ≈ ceil(目标视频时长 / 15),不再等于库里素材总数
  • 手动模式不受影响
  • CI 全绿
## 问题 线上实测:AI 自动选素材时,视频库里有几个素材就返回几个,没有数量上限控制。 根因:`smartMatchAssets` 调用 `POST /assets/smart-match` 时未传 `limit` 参数,后端 `SmartMatchRequest.limit` 默认为 `None`(返回全部)。 ## 修复 ### 1. `apps/web/src/api/assets/assets.ts` - `smartMatchAssets` 增加可选 `limit?: number` 参数 - 仅在 `limit > 0` 时序列化进请求体 ### 2. `apps/web/src/pages/generate/hooks/step2-materials/useSmartMatch.ts` - 接受 `templateSegments?: TemplateSegment[]` 选项 - 新增 `computeLimitFromSegments`: - 取各 segment `duration_min` 之和作为目标视频总时长 - 按 15 秒/素材估算所需素材数:`Math.ceil(totalSeconds / 15)` - 结果钳制到 `[1, 200]`(后端 `SmartMatchRequest.limit` 上限 200) - 拿不到时长信息时默认 `limit = 10` ### 3. `apps/web/src/pages/generate/hooks/useStep2Materials.ts` - 透传 `templateSegments` 到 `useSmartMatch` ## 影响范围 - 仅影响自动模式(`materialMode === "auto"`) - 手动选素材模式不受影响 - 后端已支持 `limit` 字段(`SmartMatchRequest.limit: int | None = Field(default=None, ge=1, le=200)`) ## 验收 - 自动模式选素材数量 ≈ `ceil(目标视频时长 / 15)`,不再等于库里素材总数 - 手动模式不受影响 - CI 全绿
xiaoxia added 1 commit 2026-08-31 13:58:20 +08:00
fix(assets): 智能选素材传 limit 参数,避免「有几个选几个」
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 1s
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2m54s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 3m17s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 3m29s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 4m4s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 4m36s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 2m0s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 5m14s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m42s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 2m49s
AI Code Review / AI Code Review (pull_request) Successful in 6m52s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 8m14s
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 30s
80247c969a
- smartMatchAssets 增加可选 limit 参数,传给后端 /assets/smart-match
- useSmartMatch 根据模板 segments 总时长按 15s/素材估算 limit,钳制 [1,200]
- 拿不到时长信息时默认 limit=10(后端上限 200)
- useStep2Materials 透传 templateSegments 到 useSmartMatch

🚀 预览环境已部署

项目 详情
PR号 #1570
预览链接 https://pr-1570.preview.xiaoxiajianji.com
API环境 staging

💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。

🔄 每次提交新代码后预览环境会自动更新。

🗑️ PR 关闭或合并后,预览环境会自动清理。

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1570 | | 预览链接 | [https://pr-1570.preview.xiaoxiajianji.com](https://pr-1570.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia added 1 commit 2026-08-31 14:09:33 +08:00
fix(assets): useSmartMatch 兜底过滤空 id 素材(AI Review 建议)
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 0s
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2m47s
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 3m31s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 4m3s
AI Code Review / AI Code Review (pull_request) Successful in 4m5s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 4m6s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 4m17s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 2m4s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m13s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 2m34s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 5m26s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 7m16s
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 28s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 3m35s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 3m52s
140d3c7e67
Collaborator

【阻塞级判定】

  • 是否存在阻塞级问题:否
  • 阻塞级问题数量:0 个

📊 审查概览

  • 整体评价:通过
  • 建议级问题数量:1 个

🔴 阻塞级问题(必须修复)

💡 改进建议(不阻塞合并)

  1. [apps/web/src/pages/generate/hooks/step2-materials/useSmartMatch.ts: 97] 依赖数组引用稳定性
    • 具体内容:useCallback 的依赖数组中包含了 templateSegments。如果父组件每次渲染都传递一个新的数组引用(这在 React 中很常见),会导致 handleSmartMatch 函数在每次渲染时都被重新创建。建议确认父组件传入的 templateSegments 引用是否稳定,或者在父组件中使用 useMemo 包装该数据,以避免不必要的子组件重渲染或函数重创建。

良好实践

  1. 边界条件处理完善:在 computeLimitFromSegments 函数中,对空数组、总时长小于等于0的情况均做了兜底处理,并对最终结果进行了 [1, 200] 的区间钳制,逻辑严密。
  2. 空指针安全:在 handleSmartMatch 中使用 !!a?.id 进行过滤,有效防止了 undefinednull 导致的运行时错误。
    2/3. 类型安全与防御性编程smartMatchAssets 函数中对 limit 参数进行了 limit > 0 的校验,确保了只有合法的正整数才会被发送到后端。

🤖 由 AI 代码审查机器人自动生成 | 2026-08-31 06:13:38 | 模型:

### 【阻塞级判定】 - 是否存在阻塞级问题:否 - 阻塞级问题数量:0 个 ### 📊 审查概览 - 整体评价:通过 - 建议级问题数量:1 个 ### 🔴 阻塞级问题(必须修复) 无 ### 💡 改进建议(不阻塞合并) 1. **[apps/web/src/pages/generate/hooks/step2-materials/useSmartMatch.ts: 97] 依赖数组引用稳定性** - 具体内容:`useCallback` 的依赖数组中包含了 `templateSegments`。如果父组件每次渲染都传递一个新的数组引用(这在 React 中很常见),会导致 `handleSmartMatch` 函数在每次渲染时都被重新创建。建议确认父组件传入的 `templateSegments` 引用是否稳定,或者在父组件中使用 `useMemo` 包装该数据,以避免不必要的子组件重渲染或函数重创建。 ### ✅ 良好实践 1. **边界条件处理完善**:在 `computeLimitFromSegments` 函数中,对空数组、总时长小于等于0的情况均做了兜底处理,并对最终结果进行了 `[1, 200]` 的区间钳制,逻辑严密。 2. **空指针安全**:在 `handleSmartMatch` 中使用 `!!a?.id` 进行过滤,有效防止了 `undefined` 或 `null` 导致的运行时错误。 2/3. **类型安全与防御性编程**:`smartMatchAssets` 函数中对 `limit` 参数进行了 `limit > 0` 的校验,确保了只有合法的正整数才会被发送到后端。 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-31 06:13:38 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
auto-approve-bot approved these changes 2026-08-31 14:20:30 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot approved these changes 2026-08-31 14:20:30 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot merged commit ab23ca7e5a into develop 2026-08-31 14:21:00 +08:00
auto-approve-bot deleted branch fix/smart-match-limit 2026-08-31 14:21:01 +08:00

🗑️ 预览环境已清理

PR #1570 已关闭或合并,对应的预览环境已被清理。

如有需要,可以重新打开 PR 来重新生成预览环境。

🗑️ **预览环境已清理** PR #1570 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Sign in to join this conversation.