---
name: sophnet-age-appearance
description: 仅支持单张人物图：用 AI 模拟指定年龄的长相（幼年、青少年或成年以后等推演）。用户问「10 岁 / 20 岁长什么样」「变老变年轻」「年龄推演」「小时候或以后样子」并希望出图时使用；多图需分次调用。
---

# Sophnet 年龄相貌模拟

## 用法

1. **输入图（硬性）**：**每次调用仅允许 1 张图**；路径或 URL（以 Media Understanding 解析为准，多在 `media/inbound/images/`）。多张照片须**分多次**各传一张，不可一次拼多图传入。
2. **单人头肩**：默认先调 Sophnet **`detect_and_embed`**，按 **`--size` 宽高比**做头肩裁切后再送入年龄推演。**多人同框（多张达标人脸）时自动取检测框面积最大的一张脸**作为主体会话；检出 0 张达标人脸时用整图继续（仍可加上 **`--strict-face`** 在无脸时直接拒绝）。
3. **目标年龄**：整数岁；可一次多个（`--age` / `--ages`）。
4. 执行 **`age_appearance.py`**，解析 stdout：`FACE_CROP`、`TARGET_AGE` / `IMAGE_URL` 等。

跳过裁切（等价于整张原图推演）：

```bash
uv run {baseDir}/scripts/age_appearance.py --skip-face-crop --image "media/inbound/images/a.jpg" --age 50
```

要求必须检出人脸，否则 **`STATUS=rejected`**（退出码 `2`）：

```bash
uv run {baseDir}/scripts/age_appearance.py --strict-face --image "media/inbound/images/a.jpg" --age 25
```

单个年龄示例：

```bash
uv run {baseDir}/scripts/age_appearance.py --image "media/inbound/images/a.jpg" --age 20
```

多个年龄示例（comma 或重复参数均可）：

```bash
uv run {baseDir}/scripts/age_appearance.py --image "media/inbound/images/a.jpg" --ages "10,20,35"
uv run {baseDir}/scripts/age_appearance.py --image "media/inbound/images/a.jpg" --age 8 --age 18 --age 60
```

用户补充语境（可不填）：

```bash
uv run {baseDir}/scripts/age_appearance.py --image "media/inbound/images/a.jpg" --age 40 --prompt "面带微笑，室内自然光"
```

仅校验参数、不调 API：

```bash
uv run {baseDir}/scripts/age_appearance.py --dry-run --image "media/inbound/images/a.jpg" --age 25
```

## 输出格式

解析 stdout **键值行**（可多组 `TARGET_AGE` / `IMAGE_URL`）：

- 成功：`MODEL`、`INPUT_IMAGE_COUNT`、`TARGET_AGES`、**`FACE_CROP=`**（`applied` | `skipped_disabled` | `skipped_no_face` 等）、若为 `applied` 可有 **`FACE_DETECTED_COUNT=`**、`OUTPUT_COUNT`、`STATUS=succeeded`；对每个目标年龄依次为 `TARGET_AGE=`、`IMAGE_URL=`；偶有 **`PREVIEW_PATH=`**。
- 拒绝：**`STATUS=rejected`**，`REJECT_REASON=no_qualified_face`（ **`--strict-face`** 且无达标人脸）。
- dry-run：**`FACE_CROP_PREP=`**、`STATUS=dry_run`、`PROMPT_BRIEF` 等。
- 其它失败：`STATUS=failed`、stderr、`ERROR_MESSAGE=` 等。

向用户回复时说明：**结果为 AI 推演，非预言或科学依据**；若存在 **`IMAGE_URL`**，按需使用 `![image](IMAGE_URL)` 展示；**图片链接约保存 24 小时，请及时下载保存**。

## 回复模板

`IMAGE_URL`、`xx岁` 用当次结果替换；若一次演了多个目标年龄，则按 stdout 中多组 `TARGET_AGE`/`IMAGE_URL` 各写一段（**仍然是同一张输入图**），勿向用户堆砌字段名。

```
✅ 已按 xx岁 推演相貌（仅供参考）
👤 已按画面中最大人脸区域裁切后主体会话（若为合照）
🖼️ ![image](IMAGE_URL)
⚠️ 内容由 AI 生成，非真实预测；图片链接约保存 24 小时，请及时下载保存。
```

若 **`FACE_CROP=skipped_no_face`**，可向用户简述「图中未检出清晰人脸位，已用整图推演」。

## 注意事项

- **仅支持单张输入图**：脚本对 `--image` **只接受恰好 1 张**；多张原图请逐张分别执行。
- **能力边界**：在「看起来像同一人」前提下做年龄的**视觉推演**，因人而异，**不构成**医学、身份识别或亲子关系依据。
- **合照**：已自动选最大脸；若仍需指定某人，请先换裁剪后的单人图再调用。
- 建议使用**面部清晰**的肖像；远景、强遮挡时可能退化为整图推演（见 `FACE_CROP`）。
- 图片路径须真实存在或可访问 URL，勿臆造路径；未正确配置 Sophnet Open API 所需凭证（由运行环境与底层工具读取）时会失败。
- 年龄宜在 **`1`-`99`** 岁常见区间；过小或过大的极端年龄可能不真实感更强。
