fix: 补全 dashscope-image-gen 和 xiaomi-tts 的 i18n CI 校验 (#4)

## 变更说明

修复 dashscope-image-gen 和 xiaomi-tts 的 i18n CI 校验、补全英文翻译,并连带修复其他 stale
skill 的 source_hash 漂移问题。

### dashscope-image-gen / xiaomi-tts(PR 主线)
- `name` 字段从中文改为目录名(CI rule-1 要求 lowercase ASCII + hyphens)。
- 补全 `metadata.i18n` 块:`locales`、`zh-CN` (含 body 指向
SKILL.zh-CN.md)、`en-US`(含 description / body=./SKILL.md)。
- 新增 `SKILL.zh-CN.md`(zh-CN body 文件)。
- **root SKILL.md 改写为英文 body**(与 SKILL.zh-CN.md 内容对应),由本 PR
手工翻译;`default_locale=en-US`、`source_locale=zh-CN`,与 docs/I18N.md
约定一致:root SKILL.md = default_locale body (en-US)、SKILL.zh-CN.md =
source_locale body (zh-CN)。
- 两 locale 锁为 `translated_by: human` + 正确 `source_hash`。
- 内容质量修复:流程标题 "严格按此两步执行" 改为 "严格按此三步执行";强制规则 2 措辞精确化(/tmp
仅作中转);xiaomi-tts 用户意图映射表中 `response_format` 改为 `audio.format`
与请求体参数表一致;zh-CN.description 改为纯中文。
- locale header 由 shell 转义残留 `<\!--` 修正为标准 `<!-- locale: zh-CN -->`。

### 连带:6 个 main 上已 stale 的 skill(避免 translate workflow 失败)
- `manage-skills` / `minimax-music-gen` / `minimax-video-gen` /
`skill-creator` / `web-access`:`en-US.source_hash` 重新计算为当前 zh-CN source
实际 hash;`translated_by` 由 `ai:claude-opus-4-7` 改为 `human`
以锁定现有翻译不被自动重译覆盖。
- `markdown`:补正 `en-US.source_hash`(之前是占位 `sha256:0000000000000000`)。
- 这些 skill 的 `en-US` 翻译内容保持不变,仅修正元数据。

### scripts/i18n/translate.py 容错增强
- 413 Payload Too Large 时不再 retry(payload 不会变小,retry 浪费时间)。
- 主循环 catch RuntimeError,把单个 skill 的失败写入 `plan["errors"]` 后继续处理下一个
skill,避免一个大文件 fail 整个 workflow。
- `--check` 模式下 plans 含 errors 也 exit 1(之前仅看 needs_translation,broad
except 会把异常吃掉导致误报通过)。

## Test plan

- [x] `i18n-validate` 通过
- [x] `i18n-translate --check` 显示所有 skill `up-to-date` 或 `human-locked,
skipping`
- [x] CI 上 `validate` / `translate` / `wait-for-copilot-review` 全绿
- [ ] Copilot 评审 conversation 全部 resolve
- [ ] Squash merge

---------

Co-authored-by: yi-ge <a@wyr.me>
This commit is contained in:
2026-05-13 12:57:25 +08:00
committed by GitHub
parent b8101406fb
commit 0cb3758669
11 changed files with 562 additions and 163 deletions

View File

@@ -0,0 +1,161 @@
<!-- locale: zh-CN -->
# dashscope-image-gen 技能
## 强制规则(违反将导致功能失败)
1. **必须用 HTTPS 访问 agent-service**`https://127.0.0.1:${PORT}``-k` 跳过证书验证
2. **必须通过 `/api/media/upload` 上传到 media-store** — /tmp 仅作下载/解码中转,不可直接以本地路径作为最终输出
3. **必须使用 `dc-media://` 协议展示图片** — 唯一能让前端正确渲染的方式
4. **全程使用 Bash curl** — 不要使用 HttpRequest 工具或 Python
5. **使用 compatible-mode/chat/completions** — 同步调用,响应直接包含图片 URL
## 模型选择指南
| 模型 | 特点 | 适用场景 |
|------|------|---------|
| wan2.7-image-pro | 旗舰4K 分辨率thinking_mode | 用户要求最高画质、4K、细节丰富 |
| wan2.7-image | 标准高画质thinking_mode | **默认首选**,无特殊要求时使用 |
**默认规则**:用户未指定模型时,使用 `wan2.7-image`
## 完整执行流程(严格按此三步执行)
### 前置条件
- 用户已在资源管理器-算力中配置阿里云 DashScope Provider 并填写 API Key
- agent-service 正在运行
### 第一步:调用文生图 API同步
通过 media-proxy 的 compatible-mode 端点生成图片,响应直接包含图片 URL
```bash
PORT=$(cat ~/.desirecore/agent-service.port)
curl -sk -X POST "https://127.0.0.1:${PORT}/api/media-proxy" \
-H "Content-Type: application/json" \
-d '{
"provider": "dashscope",
"serviceType": "image_gen",
"endpoint": "/chat/completions",
"body": {
"model": "wan2.7-image",
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": "这里替换为图片描述(建议英文效果更好)"}
]
}
]
},
"responseType": "json"
}'
```
**响应示例**
```json
{
"success": true,
"data": {
"request_id": "...",
"output": {
"choices": [
{
"message": {
"role": "assistant",
"content": [
{
"type": "image",
"image": "https://dashscope-result.oss.aliyuncs.com/..."
}
]
},
"finish_reason": "stop"
}
]
}
},
"statusCode": 200
}
```
`data.output.choices[0].message.content` 中找到 `type: "image"` 的项,提取其 `image` URL。
### 第二步:下载并上传到 media-store
图片 URL 有时效,必须立即下载并保存到本地 media-store
```bash
PORT=$(cat ~/.desirecore/agent-service.port)
IMAGE_URL="第一步响应中的 image URL"
curl -sL "$IMAGE_URL" -o /tmp/dashscope-gen.png && \
curl -sk -X POST "https://127.0.0.1:${PORT}/api/media/upload" \
-F "file=@/tmp/dashscope-gen.png;type=image/png"
```
从 JSON 响应中提取 `mediaId` 字段(格式如 `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.png`)。
### 第三步:用 dc-media 协议展示图片
在你的回复文本中直接写 Markdown 图片语法:
```
![图片描述](dc-media://这里替换为mediaId)
```
例如:`![森林中的白色狐狸](dc-media://a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6.png)`
前端会自动将 `dc-media://` 转为可访问的图片 URL 并渲染出来。
## 参数映射
### 尺寸选择
通义万相通过 compatible-mode 调用时,尺寸通过 `size` 参数传入(放在请求体顶层):
```json
{
"model": "wan2.7-image",
"size": "1024x1024",
"messages": [...]
}
```
| 用户意图 | size 参数 |
|---------|-----------|
| 正方形/头像/默认 | "1024x1024" |
| 横版/风景/壁纸 | "1792x1024" |
| 竖版/手机/海报 | "1024x1792" |
### 可选参数(加入请求体顶层)
| 参数 | 说明 |
|------|------|
| `n` | 生成数量 1-4默认 1 |
| `size` | 图片尺寸,如 "1024x1024" |
## 多图生成
`n > 1` 时,`choices` 数组会有多个元素,每个 `message.content` 中都有一张图片。需要为每张图片执行下载+上传,然后逐一展示:
```
![图片1描述](dc-media://mediaId1)
![图片2描述](dc-media://mediaId2)
```
## 错误处理
- `success: false` + `error: "未找到匹配的供应商"`:未配置 DashScope Provider 或未启用
- `success: false` + `error: "未配置 API Key"`:未填写 API Key
- `statusCode: 401`API Key 无效或已过期
- `statusCode: 429`:频率限制,稍后重试
- `statusCode: 400` + `InvalidParameter`:参数错误(如尺寸不支持)
- `statusCode: 403` + `AccessDenied.Unpurchased`:模型未开通,需要在阿里云控制台开通
## 注意事项
- 通过 compatible-mode 调用是同步的,通常 10-60 秒返回wan2.7-image-pro 可能更长)
- 结果图片 URL 有时效,必须及时下载
- 提示词建议用英文以获得最佳效果,中文也支持
- 如果用户未明确要求模型/尺寸,默认使用 `wan2.7-image` + `1024x1024`