feat(video-from-script): 新增账号创建Q&A流程并移除独立风格文件系统
- 新增 `account-creation.md` 参考文档,定义结构化问答创建账号流程 - 将视觉风格信息内嵌到 `prompts/*.md` 中,移除独立的 `styles/` 目录 - 更新 SKILL.md 和 account-system.md 以反映新架构 - 更新账号校验逻辑适配新参考图管理方式 - 更新模板 `account.json` 添加 `references` 字段和默认视频模型
This commit is contained in:
@@ -11,7 +11,7 @@ description: 素材生产路由。根据用户意图分发到对应子技能:i
|
||||
2. **manifest.json 是唯一状态源**:任何操作(生图、上传、替换素材)完成后必须立即回写 manifest
|
||||
3. **禁止 curl 调用生图/生视频 API**:必须通过 `pipeline.js` 或对应 generator 脚本执行
|
||||
4. **并行优先**:多个独立子任务必须用子 agent 并行,不要在主对话中串行完成
|
||||
5. **prompts/*.md 只被子 Agent 读取**:主 Agent 读 account.json + styles/*.md 获取风格信息,不读子 Agent 提示词模板
|
||||
5. **prompts/*.md 只被子 Agent 读取**:主 Agent 读 account.json 获取配置信息,不读子 Agent 提示词模板
|
||||
|
||||
**禁止**:跳过分镜 / 不更新 manifest 就继续 / 一口气跑完 pipeline 不审查 / 主 Agent 替代子 Agent 生成提示词
|
||||
|
||||
@@ -41,6 +41,8 @@ description: 素材生产路由。根据用户意图分发到对应子技能:i
|
||||
| "图生视频"、"图片转视频" | 生图 → AI视频 → 组装 | `image-generator` → Grok/VEO/Kling → `capcut` |
|
||||
| "首尾帧"、"帧动画"、"关键帧" | 生图(成对) → 视频过渡 → 组装 | `image-generator`(帧对) → VEO/Kling → `capcut` |
|
||||
| "文案转视频"、"配音视频" | 生图 → TTS+字幕+组装 | `image-generator` → `capcut` |
|
||||
| "创建账号"、"新账号" | Q&A 收集信息 → 生成 prompts | 见 [account-creation.md](references/account-creation.md) |
|
||||
| "修改账号"、"改提示词"、"换风格" | 读取现有 prompt → 确认修改范围 → 重写 | 直接编辑 prompts/*.md |
|
||||
| 只说"做视频" | **询问**:图文成片 / 图生视频(单图/首尾帧)? | — |
|
||||
|
||||
**"图生视频"的后续追问**:用户说"图生视频"时,追问视频模式:
|
||||
@@ -57,7 +59,7 @@ Agent 创建 manifest.json 后,用 `pipeline.js` 分阶段执行。**不要一
|
||||
|
||||
| 角色 | 职责 |
|
||||
|------|------|
|
||||
| **Agent**(你) | 读取 account.json + styles/*.md → **分镜规划** → 图片提示词生成 → 视频提示词生成 → 审查每阶段结果 |
|
||||
| **Agent**(你) | 读取 account.json → **分镜规划** → 图片提示词生成 → 视频提示词生成 → 审查每阶段结果 |
|
||||
| **Pipeline** | 机械执行:生图 → 上传 → 生视频 → TTS → 成片。每完成一个 item 写盘,支持断点续跑 |
|
||||
|
||||
### 执行步骤
|
||||
@@ -91,7 +93,7 @@ Step -1: 意图确认(进入任何步骤前必须完成,逐项确认,缺
|
||||
→ 以上 5 项全部确认后,agent 写出完整执行计划,让用户最终确认:
|
||||
|
||||
执行计划示例(根据实际任务调整):
|
||||
1. 读取 {account} 账号配置(id = 目录名)+ styles/*.md
|
||||
1. 读取 {account} 账号配置(id = 目录名)
|
||||
2. 子 Agent 读取 prompts/分镜.md → 根据用户文案生成分镜表(N shot)
|
||||
3. 子 Agent 读取 prompts/图片提示词.md → 为每个 shot 生成 imagePrompt
|
||||
4. pipeline.js init → 创建 manifest.json + 输出目录
|
||||
@@ -104,13 +106,12 @@ Step -1: 意图确认(进入任何步骤前必须完成,逐项确认,缺
|
||||
用户修改 → 调整计划后重新输出
|
||||
→ 禁止在用户未确认执行计划的情况下进入 Step 0
|
||||
|
||||
Step 0: 前置检查(账号+风格+提示词模板校验)
|
||||
Step 0: 前置检查(账号+提示词模板校验)
|
||||
- 读取 根目录 accounts/{account}/account.json
|
||||
- 检查 prompts/ 目录下的提示词模板是否存在(分镜.md、图片提示词.md、视频提示词.md)
|
||||
- 检查 styles/ 目录下是否有风格文件
|
||||
- 如果账号不存在或缺少模板/风格:
|
||||
→ 暂停流程,通过 CLI 创建:`pipeline.js create-account --id <id> --name <名称> --references ./ref.png`
|
||||
→ 然后编辑 prompts/*.md 和 styles/*.md
|
||||
- 如果账号不存在或缺少模板:
|
||||
→ 按 [account-creation.md](references/account-creation.md) 的 Q&A 流程创建账号
|
||||
→ 基于通用模板(`_template/prompts/`)+ 用户回答生成 3 个 prompt 文件
|
||||
- 校验账号完整性:`pipeline.js validate-account --account <id>`
|
||||
- 全部就绪则继续 Step 1
|
||||
|
||||
|
||||
190
.claude/skills/video-from-script/references/account-creation.md
Normal file
190
.claude/skills/video-from-script/references/account-creation.md
Normal file
@@ -0,0 +1,190 @@
|
||||
# 账号创建流程
|
||||
|
||||
> Agent 通过结构化问答收集信息,基于通用 prompt 模板 + 风格注入,生成完整的账号配置。
|
||||
|
||||
---
|
||||
|
||||
## 创建流程
|
||||
|
||||
```
|
||||
用户说"创建账号"/"新账号"
|
||||
↓
|
||||
Phase 1: 账号身份(必须)
|
||||
↓
|
||||
Phase 2: 内容 DNA(必须)
|
||||
↓
|
||||
Phase 3: 视觉身份(必须,3种输入方式)
|
||||
↓
|
||||
Phase 4: 技术配置(有默认值,可跳过)
|
||||
↓
|
||||
汇总确认 → 生成文件 → 校验
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 1:账号身份
|
||||
|
||||
| # | 问题 | 必填 | 说明 |
|
||||
|---|------|------|------|
|
||||
| 1 | 账号名称? | ✅ | 用作目录名和显示名(中文即可,如"军事账号") |
|
||||
| 2 | 一句话描述? | ✅ | 写入 account.json 的 description |
|
||||
|
||||
**输出**:确定目录名(= id)和 account.json 的 id/name/description。
|
||||
|
||||
---
|
||||
|
||||
## Phase 2:内容 DNA
|
||||
|
||||
| # | 问题 | 必填 | 注入位置 |
|
||||
|---|------|------|---------|
|
||||
| 3 | 核心内容方向?如:历史权谋、科技解说、情感故事、美食文化 | ✅ | 分镜.md → 角色定义 + 账号内容理解.核心方向 |
|
||||
| 4 | 目标受众?如:30岁男性、18-25岁女性 | ✅ | 分镜.md → 账号内容理解.目标受众 |
|
||||
| 5 | 内容气质?用 2-3 个关键词描述,如:冷峻洞察、温暖治愈、犀利反讽 | ✅ | 分镜.md → 账号内容理解.内容气质 |
|
||||
|
||||
**注入规则**:
|
||||
- 角色定义改为"专精{Q3}类口播文案转化为{Q6}画面的分镜导演"
|
||||
- 新增「账号内容理解」节(仅供子 Agent 理解上下文,不输出到分镜表)
|
||||
|
||||
---
|
||||
|
||||
## Phase 3:视觉身份
|
||||
|
||||
| # | 问题 | 必填 | 注入位置 |
|
||||
|---|------|------|---------|
|
||||
| 6 | 整体视觉基调?如:暗黑压迫、明亮温暖、冷冽极简、赛博霓虹 | ✅ | 分镜.md → 宏观视觉风格方向.整体基调 |
|
||||
| 7 | 画风?如:写实摄影、漫画、水墨、水彩、油画、赛博朋克、3D渲染 | ✅ | 图片.md → 画风与质感 + 固定风格词尾 |
|
||||
| 8 | 色彩倾向?(三选一) | ✅ | 图片.md → 色彩体系 + 固定风格词尾 |
|
||||
| | A. 拖入参考图 → AI 分析提取色彩/质感 | | |
|
||||
| | B. 文字描述(如"深蓝为主,金色点缀") | | |
|
||||
| | C. 直接给色值(如"主色 #0A0A0A") | | |
|
||||
| 9 | 质感/纹理?如:丝网印刷做旧、颗粒胶片、光滑数字、纸张纹理 | ❌ | 图片.md → 画风与质感 |
|
||||
|
||||
**色彩提取规则(Q8 选 A 时)**:
|
||||
1. 分析参考图的 dominant colors,提取 3-4 个核心色
|
||||
2. 分配角色:主色(大面积) / 辅色(中间调) / 点缀色(高光焦点) / 禁止色(与风格冲突的色系)
|
||||
3. 输出色值 + 使用规则
|
||||
|
||||
**固定风格词尾生成规则**:
|
||||
- 根据 Q7+Q8+Q9 生成 3 个模型版本的风格词尾
|
||||
- MJ 版:英文逗号短语 + `--ar` + `--style raw --q 2 --v 6.1`
|
||||
- Gemini 版:英文自然语言句子
|
||||
- Kling 版:中文描述
|
||||
|
||||
**分镜.md 宏观视觉风格方向**:
|
||||
- 整体基调:Q6
|
||||
- 风格大类:Q7
|
||||
- 人物气质:从 Q5 + Q6 推导
|
||||
- 场景基调:从 Q6 推导
|
||||
- 禁止出现:Q6 + Q7 的反面(如暗黑风 → 禁止明亮轻快)
|
||||
|
||||
---
|
||||
|
||||
## Phase 4:技术配置(有默认值)
|
||||
|
||||
| # | 问题 | 默认值 | 说明 |
|
||||
|---|------|--------|------|
|
||||
| 10 | 视频运动偏好? | 克制慢速 | 注入视频.md → 运动风格基调 |
|
||||
| | 选项:克制慢速 / 流畅中速 / 快速激烈 | | |
|
||||
| 11 | 画幅? | 9:16 | account.json 的 defaultFormat |
|
||||
| 12 | 生图模型? | gemini | account.json 的 imageModel |
|
||||
| 13 | 视频模型? | veo3-fast | account.json 的 videoModel |
|
||||
| 14 | 参考图文件? | 无 | 用户稍后放入 references/ 目录,Agent 上传 OSS 回写 URL |
|
||||
|
||||
**运动偏好 → 视频提示词映射**:
|
||||
|
||||
| 用户选择 | 运动风格基调 |
|
||||
|---------|-------------|
|
||||
| 克制慢速 | 克制优于激烈,慢优于快,张力优于美感,隐忍优于爆发 |
|
||||
| 流畅中速 | 流畅自然,节奏跟随文案情绪,张弛有度,不刻意制造压迫 |
|
||||
| 快速激烈 | 快节奏推进,冲击力优先,镜头运动幅度大,情绪外放 |
|
||||
|
||||
---
|
||||
|
||||
## 汇总确认
|
||||
|
||||
问答结束后,Agent 输出汇总表让用户确认:
|
||||
|
||||
```
|
||||
## 账号创建确认
|
||||
|
||||
### 基本信息
|
||||
- 名称:{name}
|
||||
- 描述:{description}
|
||||
- 目录:accounts/{id}/
|
||||
|
||||
### 内容方向
|
||||
- 核心方向:{Q3}
|
||||
- 目标受众:{Q4}
|
||||
- 内容气质:{Q5}
|
||||
|
||||
### 视觉风格
|
||||
- 基调:{Q6}
|
||||
- 画风:{Q7}
|
||||
- 色彩:{Q8 摘要}
|
||||
- 质感:{Q9}
|
||||
|
||||
### 技术配置
|
||||
- 运动:{Q10}
|
||||
- 画幅:{Q11}
|
||||
- 生图模型:{Q12}
|
||||
- 视频模型:{Q13}
|
||||
|
||||
确认 "开始" → 创建账号
|
||||
修改 → 调整后重新输出
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 生成规则
|
||||
|
||||
### 文件创建
|
||||
|
||||
确认后,Agent 按以下顺序生成:
|
||||
|
||||
1. **创建目录结构**
|
||||
```
|
||||
accounts/{id}/
|
||||
├── account.json
|
||||
├── prompts/
|
||||
│ ├── 分镜.md
|
||||
│ ├── 图片提示词.md
|
||||
│ └── 视频提示词.md
|
||||
└── references/ # 参考图目录(用户稍后放入)
|
||||
```
|
||||
|
||||
2. **生成 account.json**
|
||||
- 从 `_template/account.json` 复制骨架
|
||||
- 填入 id、name、description、模型、画幅等
|
||||
|
||||
3. **生成分镜.md**
|
||||
- 读取 `_template/prompts/通用分镜.md`
|
||||
- 在角色定义中注入 Q3 内容方向
|
||||
- 新增「账号内容理解」节(Q3+Q4+Q5)
|
||||
- 新增「宏观视觉风格方向」节(Q6+Q7+推导)
|
||||
- 保留通用骨架:切割规则、导演构图词库、shotDesc 写法规范、输入输出格式、质量自检
|
||||
|
||||
4. **生成图片提示词.md**
|
||||
- 读取 `_template/prompts/通用图片.md`
|
||||
- 新增「账号视觉基础风格」节(Q7+Q8+Q9)
|
||||
- 替换「固定风格词尾」占位内容为具体风格词(MJ/Gemini/Kling 三版)
|
||||
- 保留通用骨架:角色定义、入参权重、导演光影词库、imagePrompt 结构、构图原则、输入输出、质量自检
|
||||
|
||||
5. **生成视频提示词.md**
|
||||
- 读取 `_template/prompts/通用视频.md`
|
||||
- 新增「账号运动风格基调」节(Q10 映射)
|
||||
- 保留通用骨架:角色定义、入参权重、导演运动词库、三层运动设计、模型语法规范、输入输出、质量自检
|
||||
|
||||
### Prompt 生成原则
|
||||
|
||||
- **骨架不动**:切割规则、导演词库、写法规范、输出格式、质量自检等通用方法论完整保留,不做修改
|
||||
- **只注入风格**:在通用骨架的固定位置插入账号专属内容
|
||||
- **三个 prompt 风格一致**:分镜定义的视觉方向 → 图片提示词执行光影 → 视频提示词执行运动,三者必须对齐
|
||||
- **词尾必须具体**:MJ/Gemini/Kling 三个版本的固定风格词尾必须替换为具体内容,不允许保留占位文本
|
||||
|
||||
### 校验
|
||||
|
||||
生成完成后:
|
||||
1. 检查 3 个 prompt 文件都存在且非空
|
||||
2. 检查 account.json 的 prompt 路径指向正确
|
||||
3. 检查固定风格词尾无占位文本残留
|
||||
4. 运行 `pipeline.js validate-account --account {id}`
|
||||
@@ -1,7 +1,7 @@
|
||||
# 账号系统规范
|
||||
|
||||
> 每个账号独立管理视觉风格、提示词策略和 CapCut 配置。
|
||||
> 一个账号可以有多种视觉风格,每种风格是一个独立的 style 文件。
|
||||
> 视觉风格直接内嵌在 prompts/*.md 中,无需单独的 styles/ 目录。
|
||||
|
||||
---
|
||||
|
||||
@@ -9,27 +9,23 @@
|
||||
|
||||
```
|
||||
accounts/ # 项目根目录下
|
||||
├── _template/ # 新账号模板(复制此目录创建新账号)
|
||||
├── _template/ # 新账号模板(含通用 prompt 模板)
|
||||
│ ├── account.json
|
||||
│ ├── prompts/ # 提示词模板目录(子 Agent 系统提示词)
|
||||
│ │ └── .gitkeep
|
||||
│ ├── references/ # 参考图目录
|
||||
│ │ └── .gitkeep
|
||||
│ └── styles/ # 风格文件目录(可多个)
|
||||
│ ├── prompts/ # 通用提示词模板(生成账号 prompt 的基础)
|
||||
│ │ ├── 通用分镜.md
|
||||
│ │ ├── 通用图片.md
|
||||
│ │ └── 通用视频.md
|
||||
│ └── references/ # 参考图目录
|
||||
│ └── .gitkeep
|
||||
└── {account}/ # 用户创建的账号(目录名 = account.json 的 id,输出目录用 name 命名)
|
||||
└── {account}/ # 用户创建的账号(目录名 = account.json 的 id)
|
||||
├── account.json
|
||||
├── prompts/ # 提示词模板(账号专属)
|
||||
├── prompts/ # 账号专属提示词(基于通用模板 + 风格注入生成)
|
||||
│ ├── 分镜.md # 口播文案 → 分镜表
|
||||
│ ├── 图片提示词.md # shotDesc → imagePrompt
|
||||
│ └── 视频提示词.md # shotDesc → videoPrompt
|
||||
├── references/ # 参考图(所有风格共用)
|
||||
│ ├── ref_001.png
|
||||
│ └── ref_002.png
|
||||
└── styles/ # 风格文件(一个文件 = 一种视觉风格)
|
||||
├── cyberpunk-character.md
|
||||
├── dark-archive.md
|
||||
└── neon-city.md
|
||||
└── references/ # 参考图(生图时作为参考输入)
|
||||
├── ref_001.png
|
||||
└── ref_002.png
|
||||
```
|
||||
|
||||
---
|
||||
@@ -47,6 +43,9 @@ accounts/ # 项目根目录下
|
||||
"storyboardPrompt": "prompts/分镜.md",
|
||||
"imageStylePrompt": "prompts/图片提示词.md",
|
||||
"videoStylePrompt": "prompts/视频提示词.md",
|
||||
"references": [
|
||||
{ "file": "ref_001.png", "url": "https://oss.../ref_001.png" }
|
||||
],
|
||||
"capcut": {
|
||||
"effects": ["录制边框 III"],
|
||||
"filter": "电影感:40",
|
||||
@@ -73,6 +72,7 @@ accounts/ # 项目根目录下
|
||||
| `storyboardPrompt` | string | 分镜提示词模板路径(相对于账号目录) |
|
||||
| `imageStylePrompt` | string | 图片提示词模板路径(相对于账号目录) |
|
||||
| `videoStylePrompt` | string | 视频提示词模板路径(相对于账号目录) |
|
||||
| `references` | array | 参考图列表,每项含 file(本地文件名)和 url(OSS 公网地址) |
|
||||
| `capcut.effects` | string[] | CapCut 特效名称列表 |
|
||||
| `capcut.filter` | string | CapCut 滤镜,格式 "名称:强度" |
|
||||
| `capcut.subtitleStyle` | object | 字幕样式(字号、颜色、高亮色、加粗) |
|
||||
@@ -92,53 +92,37 @@ accounts/ # 项目根目录下
|
||||
|
||||
这些文件定义了子 Agent 的角色、入参、出参、词库和示例。路径在 account.json 中以相对路径引用,Agent 读取 account.json 后自动定位。
|
||||
|
||||
### 与 style 文件的关系
|
||||
### 生成方式
|
||||
|
||||
- **prompts/** — 子 Agent 的系统提示词(定义 HOW 生成提示词)
|
||||
- **styles/** — 视觉规则参考(定义 WHAT 风格应该长什么样:颜色、构图、禁止项)
|
||||
- prompts 模板内部会引用 styles 中定义的色彩体系、构图规则等
|
||||
账号的 prompts 基于 `_template/prompts/通用*.md` 生成:
|
||||
- 通用模板提供**方法论骨架**(切割规则、导演词库、写法规范、输出格式、质量自检)
|
||||
- 创建账号时通过 Q&A 收集风格信息,注入到骨架的固定位置
|
||||
- 详细流程见 [account-creation.md](account-creation.md)
|
||||
|
||||
---
|
||||
|
||||
## 风格文件(styles/)
|
||||
## 参考图(references/)
|
||||
|
||||
每种视觉风格一个文件,文件名即风格名。文件内包含视觉规则参考。
|
||||
参考图用于生图时的风格引导(Gemini 图生图 / MJ --sref)。
|
||||
|
||||
### 风格文件结构
|
||||
### 管理流程
|
||||
|
||||
```markdown
|
||||
# 风格名称
|
||||
|
||||
一句话描述风格。
|
||||
|
||||
---
|
||||
|
||||
## 核心视觉要素
|
||||
|
||||
### 色调方案
|
||||
|
||||
### 构图模式
|
||||
|
||||
### 示例
|
||||
|
||||
### 模型参数(MJ/Gemini/Kling)
|
||||
|
||||
### 禁止项
|
||||
```
|
||||
|
||||
### 风格文件命名
|
||||
|
||||
使用中文命名,直观识别:
|
||||
- `赛博东方角色.md`
|
||||
- `暗黑禁书档案.md`
|
||||
- `霓虹城市.md`
|
||||
- `水墨山水.md`
|
||||
1. 用户将参考图放入 `accounts/{id}/references/` 目录
|
||||
2. Agent 上传到 OSS:`node scripts/oss-upload.js accounts/{id}/references/{图片文件}`
|
||||
3. 将返回的 URL 写入 account.json 的 `references` 数组
|
||||
|
||||
---
|
||||
|
||||
## 创建新账号
|
||||
|
||||
### 一键创建(推荐)
|
||||
### Q&A 创建(推荐)
|
||||
|
||||
用户说"创建账号"或"新账号"时,Agent 按 [account-creation.md](account-creation.md) 的结构化问答流程执行:
|
||||
1. 逐项询问:账号身份 → 内容 DNA → 视觉身份 → 技术配置
|
||||
2. 基于通用模板 + 用户回答生成 3 个 prompt 文件 + account.json
|
||||
3. 校验完整性
|
||||
|
||||
### CLI 创建(辅助)
|
||||
|
||||
```bash
|
||||
node scripts/pipeline.js create-account \
|
||||
@@ -149,18 +133,9 @@ node scripts/pipeline.js create-account \
|
||||
--references ./ref1.png,./ref2.png
|
||||
```
|
||||
|
||||
自动完成:创建目录 → 生成 account.json → 复制参考图 → 上传 OSS → 回写 URL → 生成风格骨架。
|
||||
自动完成:创建目录 → 生成 account.json → 复制参考图 → 上传 OSS → 回写 URL。
|
||||
|
||||
### 手动创建
|
||||
|
||||
1. 复制 `_template/` 目录,重命名为账号 ID
|
||||
2. 编辑 `account.json` 填写账号信息(含 prompts 路径)
|
||||
3. 在 `prompts/` 中放入提示词模板(从 `工作流程/` 草稿区复制)
|
||||
4. 在 `references/` 中放入参考图(所有风格共用)
|
||||
5. 上传参考图到 OSS,URL 写入 account.json:
|
||||
- `node scripts/oss-upload.js ../../accounts/{id}/references/{图片文件}`
|
||||
- 将返回的 URL 写入 `styles.{styleName}.references[].url`
|
||||
6. 在 `styles/` 中创建风格文件(至少一个)
|
||||
**注意**:CLI 创建只生成目录结构和 account.json 骨架,prompt 文件仍需通过 Q&A 流程或手动创建。
|
||||
|
||||
### 校验账号
|
||||
|
||||
@@ -168,9 +143,4 @@ node scripts/pipeline.js create-account \
|
||||
node scripts/pipeline.js validate-account --account military
|
||||
```
|
||||
|
||||
检查:id 匹配、必填字段、prompts 模板存在、参考图完整性、风格文件存在、OSS URL 有效。
|
||||
|
||||
## 添加新风格
|
||||
|
||||
在账号的 `styles/` 目录下新建 `.md` 文件即可,文件名即风格 ID。
|
||||
Claude 调用时指定风格名,如 "用 cyberpunk-eastern-character 风格"。
|
||||
检查:id 匹配、必填字段、prompts 模板存在、参考图完整性、OSS URL 有效。
|
||||
|
||||
@@ -73,33 +73,21 @@ function validateAccount(accountId) {
|
||||
if (!config.defaultFormat) issues.push('缺少 defaultFormat')
|
||||
|
||||
const refDir = path.join(accountDir, 'references')
|
||||
const styles = config.styles || {}
|
||||
const hasStyleRefs = Object.values(styles).some(s => s.references && s.references.length > 0)
|
||||
const localRefs = fs.existsSync(refDir)
|
||||
? fs.readdirSync(refDir).filter(f => /\.(png|jpg|jpeg|webp)$/i.test(f))
|
||||
: []
|
||||
if (localRefs.length === 0 && !hasStyleRefs) {
|
||||
const topRefs = config.references || []
|
||||
if (localRefs.length === 0 && topRefs.length === 0) {
|
||||
issues.push('无参考图(建议至少 1 张)')
|
||||
}
|
||||
|
||||
const stylesDir = path.join(accountDir, 'styles')
|
||||
const styleFiles = fs.existsSync(stylesDir)
|
||||
? fs.readdirSync(stylesDir).filter(f => f.endsWith('.md'))
|
||||
: []
|
||||
if (styleFiles.length === 0) {
|
||||
issues.push('无风格文件(styles/ 下至少 1 个 .md)')
|
||||
}
|
||||
|
||||
for (const [sName, sConf] of Object.entries(styles)) {
|
||||
for (const ref of (sConf.references || [])) {
|
||||
if (!ref.url) issues.push(`styles.${sName}: 参考图 ${ref.file} 缺少 url(未上传 OSS)`)
|
||||
}
|
||||
for (const ref of topRefs) {
|
||||
if (!ref.url) issues.push(`参考图 ${ref.file} 缺少 url(未上传 OSS)`)
|
||||
}
|
||||
|
||||
if (issues.length === 0) {
|
||||
console.log(`✓ 账号校验通过: ${accountId}`)
|
||||
console.log(` ${config.name}, 模型: ${config.imageModel}+${config.videoModel || '(未指定)'}`)
|
||||
console.log(` 参考图: ${localRefs.length} 本地, 风格: ${styleFiles.length} 个`)
|
||||
console.log(` 参考图: ${localRefs.length} 本地, ${topRefs.length} 已上传`)
|
||||
} else {
|
||||
console.error(`✗ 发现 ${issues.length} 个问题:`)
|
||||
issues.forEach(i => console.error(` - ${i}`))
|
||||
|
||||
Reference in New Issue
Block a user