不知道大家有没有发现,随着目前AI大模型能力越来越强,生物进化史赛道优质的视频越来越多了?

成品展示:

接下来我就一步一步带着大家搭建一套这样的工作流。

创建工作流

登录扣子官网,创建一个工作流地址:扣子 - AI Agent智能办公平台 - 扣子用AI重塑生产力与工作效率

第 1 步:先放好启动入口

参数设置:

  • APIkey(字符串):必填,用来调用插件生成图片和视频

  • bgm_url(字符串):默认值填 背景音乐链接

  • input(字符串):必填,用来输入要生成进化史的生物名称

第 2 步:让大模型先生成生物进化阶段列表

  • 从「开始」拉出一个新的【大模型】节点。重命名为:"2-进化"

模型选择:

  • 模型:豆包·2.0·mini

参数设置:

  • input(字符串):引用「开始」输出的input

系统提示词:

# 角色
你是一位专业且资深的生物进化史研究专家,擅长以通俗易懂且条理清晰的方式,向用户输出古生物的进化史。能够精准涵盖不同地质时期具有代表性的古生物种类及进化脉络,并且能依据科学权威资料,保证信息的准确性。

## 技能
### 技能 1: 输出古生物进化史
1. 当用户提出{{input}}时,按照地质年代顺序,依次列举出不同时期具有代表性的古生物及其出现的大致时间。
2. 利用搜索工具查找所列举古生物信息,确保其基于科学研究和广泛认可的资料。
3. 输出格式为:
以下是输出示例
{
"三叶虫 寒武纪\n(距今约 5.6 亿年前)",
"海口虫 寒武纪晚期\n(距今约 4.85 亿年前)",
"海鱼 奥陶纪早期\n(距今约 4.6 亿年前)",
...
"渐新马 新生代渐新世\n(距今约 3500 万年前)",
"中新马 新生代中新世\n(距今约 1200 万年前)",
"现代驴"
}

## 限制:
- 只输出与生物进化史相关的古生物信息,拒绝回答与该主题无关的话题。
- 输出内容必须按照“古生物名称 地质年代时期(距今约 X 亿/万年前)”的格式进行组织。

用户提示词:

{{input}}

输出变量:

  • output(字符串列表)

  • reasoning_content(字符串)

第 3 步:把进化阶段改写成图片提示词和视频提示词

  • 从「2-进化」拉出一个新的【大模型】节点。重命名为:"3-动物进化提示词"

模型选择:

  • 模型:DeepSeek-V3.2

参数设置:

  • input(字符串列表):引用「2-进化」输出的output

系统提示词:

# 角色
你是一名专注于制作生物进化史短视频的博主,擅长以生动有趣且专业的方式,通过AI视频呈现不同生物在各个时期的进化历程。

## 技能
### 技能 1: 生成进化进程脚本
1. 当用户输入具体生物时,需要梳理该生物的进化时间以及对应的物种形态,形成详细的进化进程脚本。
2. 针对每个进化阶段,编写准确且富有画面感的文生图提示词(image_prompt),这些提示词要能够清晰描绘出该阶段生物的特征、所处环境等细节。
3. 基于文生图提示词,进一步创作图生视频提示词(video_prompt),确保视频风格统一为现实主义风格,能够生动展示生物进化的动态过程。

## 限制:
- 只围绕生物进化史相关内容进行回复,拒绝回答无关话题。
- 所输出的进化进程脚本、文生图和图生视频提示词需逻辑清晰、符合生物学常识。
- 输出内容应条理清晰,符合相应的结构要求。 

用户提示词:

{{input}}

输出变量:

  • image_prompt(字符串列表)

  • video_prompt(字符串列表)

第 4 步:循环生成每个阶段的图片

  • 从「3-动物进化提示词」拉出一个新的【循环】节点。重命名为:"4-循环"

参数设置:

  • input(字符串列表):引用「3-动物进化提示词」输出的image_prompt

  • 循环类型:数组循环

  • 循环次数:10

第 4.1 步:在循环里生成图片

  • 在「4-循环」内部,从「【入口】」拉出一个新的【插件】节点,插件市场搜即梦图片生成,选jimeng_generate_image。重命名为:"4.1-图片生成"

参数设置:

  • key(字符串):引用「开始」输出的mihe_key

  • prompt(字符串):引用「4-循环」当前循环项input

  • model(字符串):图片4.0

  • ratio(字符串):9:16

第 4.2 步:判断图片有没有生成成功

  • 在「4-循环」内部,从「4.1-图片生成」拉出一个新的【选择器】节点。重命名为:"4.2-选择器"

参数设置:

  • 条件:判断「4.1-图片生成」输出的url是否存在

  • 条件成立:回到「4-循环」的循环出口

  • 条件不成立:继续走到下一步重新生成

第 4.3 步:失败时再补生成一次图片

  • 在「4-循环」内部,从「4.2-选择器」的否则分支拉出一个新的【插件】节点,插件市场搜即梦图片生成,选jimeng_generate_image。重命名为:"4.3-图片生成"

  • 从「4.3-图片生成」连回「4-循环」的循环出口

参数设置:

  • key(字符串):引用「开始」输出的mihe_key

  • prompt(字符串):引用「4-循环」当前循环项input

  • model(字符串):图片4.0

  • ratio(字符串):9:16

第 5 步:整理首帧和尾帧图片

  • 从「4-循环」拉出一个新的【代码】节点。重命名为:"5-尾帧图片"

参数设置:

  • imageUrls(字符串列表):引用「4-循环」输出的output

  • array(字符串列表):引用「3-动物进化提示词」输出的image_prompt

输出变量:

  • firstElementNullified(字符串列表)

  • lastElementNullified(字符串列表)

  • processedArray(字符串列表)

代码直接抄:

async function main({ params }) {
    // 从参数中获取图片地址数组
    const imageUrls = params.imageUrls || [];
    const array = params.array || [];

    // 处理普通数组:自动移除最后一个元素
    let processedArrayResult = {
        error: null,
        processedArray: []
    };

    if (array.length === 0) {
        processedArrayResult = {
            error: "输入的数组为空",
            processedArray: []
        };
    } else {
        // 创建新数组,移除最后一个元素
        const processedArray = array.slice(1);
        processedArrayResult = {
            error: null,
            processedArray
        };
        processedArray.push("");
    }

    // 处理图片地址数组
    let imageProcessingResult = {
        error: null,
        firstElementNullified: [],
        lastElementNullified: []
    };

    if (imageUrls.length === 0) {
        imageProcessingResult = {
            error: "输入的图片地址数组为空",
            firstElementNullified: [],
            lastElementNullified: []
        };
    } else {
        // 创建新数组并将第一个元素置为空字符串
        const firstElementNullified = [...imageUrls];
        firstElementNullified[0] = "";
      
        // 创建新数组,移除第一个元素,其他元素前移,最后添加空字符串
        const lastElementNullified = imageUrls.slice(1);
        lastElementNullified.push("");
      
        imageProcessingResult = {
            error: null,
            firstElementNullified,
            lastElementNullified
        };
    }

    // 返回合并的结果
    return {
        ...processedArrayResult,
        ...imageProcessingResult
    };
}

第 6 步:循环把图片生成视频

  • 从「5-尾帧图片」拉出一个新的【循环】节点。重命名为:"6-生成视频"

参数设置:

  • shou(字符串列表):引用「4-循环」输出的output

  • video_prompt(字符串列表):引用「3-动物进化提示词」输出的video_prompt

  • wei(字符串列表):引用「5-尾帧图片」输出的lastElementNullified

  • 循环类型:数组循环

  • 循环次数:10

第 6.1 步:在循环里生成视频

  • 在「6-生成视频」内部,从「【入口】」拉出一个新的【插件】节点,插件市场搜即梦视频生成,选jimeng_generate_video。重命名为:"6.1-视频生成"

参数设置:

  • key(字符串):引用「开始」输出的mihe_key

  • prompt(字符串):引用「6-生成视频」当前循环项video_prompt

  • duration(整数):5

  • image_tail(字符串):引用「6-生成视频」当前循环项wei

  • image_url(字符串):引用「6-生成视频」当前循环项shou

  • model(字符串):视频3.0

第 6.2 步:判断视频有没有生成成功

  • 在「6-生成视频」内部,从「6.1-视频生成」拉出一个新的【选择器】节点。重命名为:"6.2-选择器"

参数设置:

  • 条件:判断「6.1-视频生成」输出的url是否存在

  • 条件成立:回到「6-生成视频」的循环出口

  • 条件不成立:继续走到下一步重新生成

第 6.3 步:失败时再补生成一次视频

  • 在「6-生成视频」内部,从「6.2-选择器」的否则分支拉出一个新的【插件】节点,插件市场搜即梦视频生成,选jimeng_generate_video。重命名为:"6.3-视频生成"

  • 从「6.3-视频生成」连回「6-生成视频」的循环出口

参数设置:

  • key(字符串):引用「开始」输出的mihe_key

  • prompt(字符串):引用「6-生成视频」当前循环项video_prompt

  • duration(整数):5

  • image_tail(字符串):引用「6-生成视频」当前循环项wei

  • image_url(字符串):引用「6-生成视频」当前循环项shou

  • model(字符串):视频3.0

第 7 步:把生成的视频结果提取成视频链接

  • 从「6-生成视频」拉出一个新的【插件】节点,插件市场搜剪映小助手,选get_url。重命名为:"7-视频链接"

参数设置:

  • 开启批量处理:是

  • 批量列表item1(字符串列表):引用「6-生成视频」输出的output

  • output(字符串):引用当前批量项item1

第 8 步:把对象列表转成普通视频链接列表

  • 从「7-视频链接」拉出一个新的【插件】节点,插件市场搜剪映小助手,选objs_to_str_list。重命名为:"8-视频列表"

参数设置:

  • outputs(对象数组):引用「7-视频链接」输出的outputList

第 9 步:根据视频列表算出时间线

  • 从「8-视频列表」拉出一个新的【插件】节点,插件市场搜剪映小助手,选video_timelines。重命名为:"9-视频时间线"

参数设置:

  • links(字符串列表):引用「8-视频列表」输出的infos

第 10 步:把视频链接和时间线组装成剪映视频数据

  • 从「9-视频时间线」拉出一个新的【插件】节点,插件市场搜剪映小助手,选video_infos。重命名为:"10-视频信息"

参数设置:

  • timelines(对象数组):引用「9-视频时间线」输出的timelines

  • video_urls(字符串列表):引用「8-视频列表」输出的infos

第 11 步:把背景音乐链接转成列表

  • 从「10-视频信息」拉出一个新的【插件】节点,插件市场搜剪映小助手,选str_to_list。重命名为:"11-背景音乐列表"

参数设置:

  • obj(字符串):引用「开始」输出的bgm_url

第 12 步:把背景音乐和总时间线组装成音频数据

  • 从「11-背景音乐列表」拉出一个新的【插件】节点,插件市场搜剪映小助手,选audio_infos。重命名为:"12-背景音乐infos"

参数设置:

  • mp3_urls(字符串列表):引用「11-背景音乐列表」输出的infos

  • timelines(对象数组):引用「9-视频时间线」输出的all_timelines

第 13 步:生成底部字幕数据

  • 从「12-背景音乐infos」拉出一个新的【插件】节点,插件市场搜剪映小助手,选caption_infos。重命名为:"13-底部字幕信息"

参数设置:

  • texts(字符串列表):引用「2-进化」输出的output

  • timelines(对象数组):引用「9-视频时间线」输出的timelines

  • in_animation(字符串):弹入

第 14 步:把用户输入转成顶部字幕列表

  • 从「13-底部字幕信息」拉出一个新的【插件】节点,插件市场搜剪映小助手,选str_to_list。重命名为:"14-顶部字幕"

参数设置:

  • obj(字符串):引用「开始」输出的input

第 15 步:生成顶部字幕数据

  • 从「14-顶部字幕」拉出一个新的【插件】节点,插件市场搜剪映小助手,选caption_infos。重命名为:"15-顶部字幕信息"

参数设置:

  • texts(字符串列表):引用「14-顶部字幕」输出的infos

  • timelines(对象数组):引用「9-视频时间线」输出的all_timelines

第 16 步:创建剪映草稿

  • 从「15-顶部字幕信息」拉出一个新的【插件】节点,插件市场搜剪映小助手,选create_draft。重命名为:"16-草稿"

参数设置:

  • 不用填参数,直接创建草稿

第 17 步:把视频添加进剪映草稿

  • 从「16-草稿」拉出一个新的【插件】节点,插件市场搜剪映小助手,选add_videos。重命名为:"17-添加视频"

参数设置:

  • draft_id(字符串):引用「16-草稿」输出的draft_id

  • video_infos(字符串):引用「10-视频信息」输出的infos

第 18 步:把背景音乐添加进剪映草稿

  • 从「17-添加视频」拉出一个新的【插件】节点,插件市场搜剪映小助手,选add_audios。重命名为:"18-背景音乐添加"

参数设置:

  • audio_infos(字符串):引用「12-背景音乐infos」输出的infos

  • draft_id(字符串):引用「16-草稿」输出的draft_id

第 19 步:把顶部字幕添加进剪映草稿

  • 从「18-背景音乐添加」拉出一个新的【插件】节点,插件市场搜剪映小助手,选add_captions。重命名为:"19-添加顶部字幕"

参数设置:

  • captions(字符串):引用「15-顶部字幕信息」输出的infos

  • draft_id(字符串):引用「16-草稿」输出的draft_id

  • alignment(整数):1

  • border_color(字符串):#000000

  • font(字符串):抖音美好体

  • font_size(整数):25

  • text_color(字符串):#ffa800

  • transform_y(小数):1047

第 20 步:把底部字幕添加进剪映草稿

  • 从「19-添加顶部字幕」拉出一个新的【插件】节点,插件市场搜剪映小助手,选add_captions。重命名为:"20-添加底部字幕"

参数设置:

  • captions(字符串):引用「13-底部字幕信息」输出的infos

  • draft_id(字符串):引用「16-草稿」输出的draft_id

  • alignment(整数):1

  • border_color(字符串):#000000

  • font(字符串):抖音美好体

  • font_size(整数):13

  • text_color(字符串):#ffffff

  • transform_y(小数):-900

第 21 步:返回最终剪映草稿 ID

  • 把「20-添加底部字幕」和【结束】节点连上。

参数设置:

  • output(字符串):引用「16-草稿」输出的draft_id

这就是整个工作流搭建的过程,接下来我们只需要点击试运行,成功的话就会得到这样一个草稿ID

只需要把这个草稿ID复制下来,然后打开我们的剪映小助手把草稿ID复制进去,然后点击创建剪映草稿(注意不要复制引号)

稍等一下,创建成功之后打开剪映,就会看到剪映里面多出了一个黑色的草稿,只要点进去就能看到我们的视频了

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐