Skip to content

AI 音视频创作模板系统

模块概述

版本: v1.0.0 状态: ✅ 已实现 最后更新: 2026-03-17

cc init --template ai-media-creator 在项目初始化时自动生成一套 AI 音视频创作 工作区配置,包含 Persona、rules.md、以及 3 个 workspace 层技能(comfyui-image / comfyui-video / audio-gen),并创建 workflows/ 示例目录。

核心特性

  • 8 种 init 模板之一: 继承 Persona 系统(config.json + persona 字段 + auto 激活技能)
  • 3 个媒体 workspace 技能: 自动生成到 .chainlesschain/skills/,直接可用
  • ComfyUI REST API 集成: comfyui-image/comfyui-video 直接调用 http://localhost:8188
  • 4后端 TTS 降级链: edge-tts → piper-tts → ElevenLabs API → OpenAI TTS
  • cli-anything 设计边界: 明确说明 REST-first 工具(ComfyUI)不适合 cli-anything,CLI 工具(FFmpeg、yt-dlp)适合
  • 114 个测试: 40 单元 + 33 集成 + 41 E2E,全部通过

1. 架构设计

1.1 整体架构图

init --template ai-media-creator


┌─────────────────────────────────────────────────────────────────┐
│  init.js TEMPLATES["ai-media-creator"]                          │
│    - persona: "AI创作助手"                                       │
│    - rules: ComfyUI配置 + cli-anything边界说明                  │
│    - generateSkills: ["comfyui-image","comfyui-video","audio-gen"]│
└──────────────────────────────┬──────────────────────────────────┘
                               │ 遍历 tmpl.generateSkills

┌─────────────────────────────────────────────────────────────────┐
│  SKILL_TEMPLATES (init.js 顶部常量)                              │
│    comfyui-image: { md, handler }                                │
│    comfyui-video: { md, handler }                                │
│    audio-gen:     { md, handler }                                │
└──────────────────────────────┬──────────────────────────────────┘
                               │ 写入 workspace 层

┌─────────────────────────────────────────────────────────────────┐
│  .chainlesschain/skills/                                         │
│    comfyui-image/   SKILL.md + handler.js                        │
│    comfyui-video/   SKILL.md + handler.js                        │
│    audio-gen/       SKILL.md + handler.js                        │
│    ai-media-creator-persona/  SKILL.md (activation: auto)        │
│  workflows/                                                      │
│    README.md  (工作流导出指南)                                   │
└──────────────────────────────┬──────────────────────────────────┘
                               │ skill-loader 四层加载

┌─────────────────────────────────────────────────────────────────┐
│  chainlesschain skill run comfyui-image "prompt"                 │
│  chainlesschain skill run comfyui-video "prompt" --workflow ...  │
│  chainlesschain skill run audio-gen "text"                       │
└─────────────────────────────────────────────────────────────────┘

1.2 与 CLI-Anything 的设计边界

工具类型接口形式推荐集成方式
ComfyUIREST API(POST /prompt, GET /history)workspace 技能(handler.js 直接 HTTP)
FFmpegCLI 命令chainlesschain cli-anything register ffmpeg
yt-dlpCLI 命令chainlesschain cli-anything register yt-dlp
第三方 ComfyUI CLI 包装CLI 命令chainlesschain cli-anything register <wrapper>
edge-ttsPython 模块 + CLIaudio-gen handler 直接调用 python -m edge_tts

2. 三个媒体技能详解

2.1 comfyui-image(文生图/图生图)

执行流程:

handler(params)

  ├─ 参数校验: prompt 必填

  ├─ GET /system_stats → 检查 ComfyUI 连接
  │     └─ 失败 → 返回连接错误 + 启动提示

  ├─ 加载工作流: params.workflow 指定文件 OR 使用内置默认工作流
  │     默认工作流: CheckpointLoader → EmptyLatentImage → CLIPTextEncode(×2)
  │                → KSampler → VAEDecode → SaveImage

  ├─ POST /prompt { prompt: workflowJson }
  │     └─ 获取 prompt_id

  └─ 轮询 GET /history/{prompt_id} 每 2s 一次,超时 120s
        └─ completed → 收集 outputs[*].images → 返回 URL 列表

默认工作流参数:

参数默认值说明
width512图像宽度
height512图像高度
steps20采样步数
cfg7引导系数
samplereuler采样器
checkpointv1-5-pruned-emaonly.ckpt模型(需与本地匹配)

2.2 comfyui-video(AnimateDiff 视频)

AnimateDiff 工作流高度依赖具体模型配置,必须提供工作流 JSON 文件

handler(params)

  ├─ 参数校验: prompt 必填
  ├─ 工作流校验: workflow 必填 → 不提供直接返回 AnimateDiff 安装指南

  ├─ GET /system_stats → 检查 ComfyUI 连接

  ├─ 读取 workflow JSON 文件(相对路径从 cwd 解析)
  │     └─ 文件不存在/JSON 格式错误 → 返回具体错误

  ├─ POST /prompt { prompt: workflowJson }

  └─ 轮询 GET /history/{prompt_id} 每 3s 一次,超时 300s
        └─ 收集 videos + gifs + images 三类输出 → 返回 URL 列表

2.3 audio-gen(TTS 语音合成)

4 后端按优先级依次尝试:

handler({ text, voice, output })

  ├─ 参数校验: text 必填
  ├─ 创建 outputDir (如不存在)

  ├─ 优先级 1: commandExists("edge-tts") || checkPythonModule("edge_tts")
  │     └─ python -m edge_tts --voice <voice> --text <text> --write-media <output>

  ├─ 优先级 2: commandExists("piper")
  │     └─ echo "<text>" | piper --output_file <output>

  ├─ 优先级 3: process.env.ELEVENLABS_API_KEY
  │     └─ HTTPS POST api.elevenlabs.io/v1/text-to-speech/<voiceId>

  ├─ 优先级 4: process.env.OPENAI_API_KEY
  │     └─ HTTPS POST api.openai.com/v1/audio/speech

  └─ 全部失败 → 返回安装指引

3. SKILL.md 字段规范

ai-media-creator 技能使用标准 SKILL.md 字段,新增 category: media(此前已有的类别包括 productivity、code、analysis 等):

yaml
---
name: comfyui-image
display-name: ComfyUI 图像生成
category: media              # 新增类别
description: 通过 ComfyUI REST API 生成图像...
version: 1.0.0
author: ChainlessChain
parameters:
  - name: prompt
    type: string
    required: true
    description: 图像生成提示词
execution-mode: direct       # 与 CLI 技能包同字段
---

4. rules.md 设计原则

ai-media-creator 的 rules.md 重点说明两件事:

  1. 工具接入方式选择: ComfyUI 是 REST API → workspace 技能;有 CLI 的工具 → cli-anything
  2. 工作流管理规范: workflows/ 目录、命名规范、API Format 导出要求

这使 AI 助手在项目内能正确决策"用哪种方式集成新工具"。


5. 文件结构

packages/cli/
├── src/commands/init.js
│   ├── SKILL_TEMPLATES          # comfyui-image / comfyui-video / audio-gen 模板字符串
│   ├── WORKFLOW_README          # workflows/README.md 模板字符串
│   └── TEMPLATES["ai-media-creator"]
│       ├── description
│       ├── rules
│       ├── skills: [...]
│       ├── persona: {...}
│       └── generateSkills: ["comfyui-image","comfyui-video","audio-gen"]
└── __tests__/
    ├── unit/
    │   └── init-ai-media-creator.test.js   # 40 tests: 模板结构/YAML/JS语法验证
    ├── integration/
    │   └── ai-media-creator-handlers.test.js # 33 tests: 生成文件加载/handler错误路径
    └── e2e/
        └── init-and-cowork-commands.test.js # 7 新增 ai-media-creator 测试 (共41)

6. 测试覆盖

测试层文件测试数覆盖内容
单元init-ai-media-creator.test.js40SKILL_TEMPLATES 结构/YAML 字段/JS 语法/WORKFLOW_README/TEMPLATES 对象
集成ai-media-creator-handlers.test.js33生成文件加载/comfyui-image错误路径/comfyui-video workflow缺失/audio-gen no-backends/编码检查
E2Einit-and-cowork-commands.test.js7(新增)模板创建/3个技能文件/workflows目录/persona/rules内容
合计80(新增)全部通过

7. 设计决策

为什么 SKILL_TEMPLATES 定义在 init.js 而非独立文件?

技能模板是初始化命令的一部分——它们只在 cc init 时使用一次。将其内联于 init.js 避免了引入额外的依赖文件,保持 CLI 包的轻量性(~2MB)。如果将来有更多生成型模板,可以抽取为 src/lib/init-skill-templates/ 目录。

为什么 ComfyUI 不通过 cli-anything 注册?

cli-anything 的设计目标是包装已有 CLI 接口的工具(命令行参数 → Agent 工具调用)。ComfyUI 的主要接口是 REST API(POST /prompt、GET /history/{id}),不提供等价的 CLI 接口。将其强行包装为 CLI 需要额外的 Python 中间层,维护成本高,而直接 HTTP 调用更简洁。

为什么 AnimateDiff 要求用户提供工作流文件?

AnimateDiff 工作流需要针对具体的检查点模型、AnimateDiff 模型版本和用户偏好参数高度定制。内置一个"通用工作流"会因用户环境差异而频繁报错。要求用户从 ComfyUI UI 中导出 API 格式 JSON 是 ComfyUI 生态的标准实践。

为什么 audio-gen 支持 4 个 TTS 后端?

不同用户环境差异很大:

  • 中国用户通常可以使用 edge-tts(微软服务,无需 API Key)
  • 离线/本地优先用户使用 piper-tts
  • 高质量需求用户使用 ElevenLabs 或 OpenAI TTS

降级链确保在任何环境下都能工作,同时用户可以通过环境变量精确控制使用哪个后端。

基于 MIT 许可发布