---
name: best-frame-selector
description: 汽车旧伤去重与最佳展示帧筛选。用于 best_frame_selector 能力：读取 damage-grounding 生成的 workspace/grounding.json，先对跨批次重复的同一物理损伤进行合并，再从多张红框标注帧中选择最清晰的最佳展示帧，输出 workspace/best_frames.json；前置条件是已有 taskId 和 grounding.json。
license: MIT
metadata:
  version: "1.0.0"
  category: vehicle-inspection
  skillType: compute-entry
  aliases: ["best_frame_selector"]
  tags: ["vehicle", "best-frame", "dedupe", "旧伤去重", "最佳帧"]
---

# 旧伤最佳帧选择

前置条件：已完成 `damage-grounding`，workspace 中存在 `grounding.json`。

```json
{
  "name": "best-frame-selector",
  "input": {
    "taskId": "order_10001",
    "topN": 1
  }
}
```

## 工作流程

1. 读取 `grounding.json` 的损伤定位与标注帧。
2. 先合并跨批次重复的同一物理损伤。
3. 对每组损伤：
   - 帧数 `<=3` 时全部作为最佳帧；
   - 帧数 `>3` 时优先调用模型筛选；
   - 模型不可用或失败时使用 bbox 精准度、面积、居中程度、文件大小等启发式评分兜底。
4. 将最佳帧复制到 `best_frames/`，写入 `best_frames.json`。

## 输入

- `taskId`: 必填。
- `topN`: 可选，默认 `1`。
- `dedupeResult`: 可选，外部模型去重结果，格式见 `references/dedupe-prompt.md`。
- `bestFrameResults`: 可选，外部模型最佳帧结果。

## 输出

返回 `totalDamages` 和 `bestFrameCount`。

## 注意

- 需要 Node.js 18+。
- 共享 workspace 根目录优先读取 `VEHICLE_SCRATCH_WORKSPACE_ROOT`，其次兼容 `RZYX_AI_WORKSPACE_ROOT`，否则使用 `RZYX_AI_DATA_DIR/workspace/vehicle-scratch-inspection`。
- 配置 `ARK_API_KEY` 时会优先调用模型做损伤去重和最佳帧选择；没有模型配置或模型失败时使用启发式兜底。
- `best_frames.json` 中的 `damages` 是去重合并后的最终旧伤列表。
- 不要把未被 grounding 到 bbox 的候选帧优先作为最佳帧，除非没有其它可用帧。
- 用中文回答所有内容。
