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:
2026-04-30 21:27:49 +08:00
parent 86b9b7948d
commit 3326f6cb37
11 changed files with 246 additions and 500 deletions

View File

@@ -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

View 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}`

View File

@@ -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本地文件名和 urlOSS 公网地址) |
| `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. 上传参考图到 OSSURL 写入 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 有效。

View File

@@ -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}`))