AI生产线自动化搭建资料库
资料页面

AI萌宠·拟人化视频创作-单图拼接版-画布修复版

来源:/Users/ljn/Desktop/自动化搭建/AI生产线知识库/raw/old_dsl/AI萌宠·拟人化视频创作-单图拼接版-画布修复版.yml

AI萌宠·拟人化视频创作-单图拼接版-画布修复版

这是知识库中的旧 DSL 案例。DSL 本身是机器文件,下面保留原始 YAML,供后续迭代、对照和排错使用。

文件大小
102490 bytes
来源路径
/Users/ljn/Desktop/自动化搭建/AI生产线知识库/raw/old_dsl/AI萌宠·拟人化视频创作-单图拼接版-画布修复版.yml
app:
  description: 支持上传 1 张宠物照片,生成更有梗的强拟人化萌宠短视频,并自动拼接分镜视频,最终输出 result video url。
  icon: 🐾
  icon_background: '#FFEAD5'
  icon_type: emoji
  mode: workflow
  name: AI萌宠·拟人化视频创作(单图拼接版)
  use_icon_as_answer_icon: false
dependencies:
- current_identifier: null
  type: package
  value:
    plugin_unique_identifier: aict/ai_hub:3.3.1@4e71d8262fbecb133fd6801e8b0a4c141f0bf4f0d6b68cec1b5c254a65365e96
kind: app
version: 0.3.1
workflow:
  conversation_variables: []
  environment_variables: []
  features:
    file_upload:
      allowed_file_extensions: []
      allowed_file_types:
      - image
      allowed_file_upload_methods:
      - local_file
      audio:
        enabled: false
        number_limits: 1
        transfer_methods:
        - local_file
      enabled: true
      fileUploadConfig:
        audio_file_size_limit: 100
        batch_count_limit: 1
        file_size_limit: 50
        image_file_size_limit: 20
        video_file_size_limit: 100
        workflow_file_upload_limit: 1
      image:
        enabled: true
        number_limits: 1
        transfer_methods:
        - local_file
      number_limits: 1
      video:
        enabled: false
        number_limits: 1
        transfer_methods:
        - local_file
    opening_statement: ''
    retriever_resource:
      enabled: true
    sensitive_word_avoidance:
      enabled: false
    speech_to_text:
      enabled: false
    suggested_questions: []
    suggested_questions_after_answer:
      enabled: false
    text_to_speech:
      enabled: false
      language: ''
      voice: ''
  graph:
    edges:
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: start
        targetType: llm
      id: 1880000000001-source-1880000000002-target
      source: '1880000000001'
      sourceHandle: source
      target: '1880000000002'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: llm
        targetType: llm
      id: 1880000000002-source-1880000000003-target
      source: '1880000000002'
      sourceHandle: source
      target: '1880000000003'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: llm
        targetType: image-generation
      id: 1880000000003-source-1880000000004-target
      source: '1880000000003'
      sourceHandle: source
      target: '1880000000004'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: image-generation
        targetType: llm
      id: 1880000000004-source-1880000000005-target
      source: '1880000000004'
      sourceHandle: source
      target: '1880000000005'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: llm
        targetType: llm
      id: 1880000000005-source-1880000000006-target
      source: '1880000000005'
      sourceHandle: source
      target: '1880000000006'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: llm
        targetType: iteration
      id: 1880000000006-source-1880000000007-target
      source: '1880000000006'
      sourceHandle: source
      target: '1880000000007'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: iteration
        targetType: code
      id: 1880000000007-source-1880000000012-target
      source: '1880000000007'
      sourceHandle: source
      target: '1880000000012'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1880000000007'
        sourceType: iteration-start
        targetType: code
      id: 1880000000007start-source-1880000000009-target
      source: 1880000000007start
      sourceHandle: source
      target: '1880000000009'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1880000000007'
        sourceType: code
        targetType: image-generation
      id: 1880000000009-source-1880000000010-target
      source: '1880000000009'
      sourceHandle: source
      target: '1880000000010'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1880000000007'
        sourceType: image-generation
        targetType: tool
      id: 1880000000010-source-1880000000011-target
      source: '1880000000010'
      sourceHandle: source
      target: '1880000000011'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: code
        targetType: tool
      id: 1880000000012-source-1880000000013-target
      source: '1880000000012'
      sourceHandle: source
      target: '1880000000013'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: tool
        targetType: code
      id: 1880000000013-source-1880000000014-target
      source: '1880000000013'
      sourceHandle: source
      target: '1880000000014'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: code
        targetType: end
      id: 1880000000014-source-1880000000008-target
      source: '1880000000014'
      sourceHandle: source
      target: '1880000000008'
      targetHandle: target
      type: custom
      zIndex: 0
    nodes:
    - data:
        desc: ''
        selected: false
        title: 开始
        type: start
        variables:
        - allowed_file_extensions: []
          allowed_file_types:
          - image
          allowed_file_upload_methods:
          - local_file
          label: 宠物照片(仅上传 1 张)
          max_length: 48
          options: []
          required: true
          type: file
          variable: pet_image_1
        - label: 宠物人物设定(delivery_rider / college_student / office_worker)
          max_length: 64
          options:
          - delivery_rider
          - college_student
          - office_worker
          required: true
          type: text-input
          variable: pet_role_preset
        - label: 目标平台(douyin / xiaohongshu / bilibili)
          max_length: 48
          options:
          - douyin
          - xiaohongshu
          - bilibili
          required: true
          type: text-input
          variable: target_platform
        - label: 主角音色(male / female)
          max_length: 32
          options:
          - male
          - female
          required: true
          type: text-input
          variable: voice_gender
        - label: 选题(可选,如早八赶课/第一次送外卖/工位摸鱼)
          max_length: 100
          options: []
          required: false
          type: text-input
          variable: topic
        - label: 宠物名称(可选)
          max_length: 48
          options: []
          required: false
          type: text-input
          variable: pet_name
        - label: 宠物类型(可选,如 cat / dog)
          max_length: 48
          options: []
          required: false
          type: text-input
          variable: pet_type
      height: 244
      id: '1880000000001'
      position:
        x: 30
        y: 1143
      positionAbsolute:
        x: 30
        y: 1143
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
    - data:
        audio:
          configs:
            variable_selector: []
          enabled: false
        context:
          enabled: false
          variable_selector: []
        desc: ''
        document:
          configs:
            variable_selector: []
          enabled: false
        model:
          completion_params:
            response_format: json_schema
            json_schema: "{\n  \"additionalProperties\": false,\n  \"properties\": {\n    \"input_profile\": {\n      \"additionalProperties\"\
              : false,\n      \"properties\": {\n        \"creation_mode\": {\n          \"type\": \"string\"\n        },\n\
              \        \"pet_name\": {\n          \"type\": \"string\"\n        },\n        \"pet_role_preset\": {\n     \
              \     \"type\": \"string\"\n        },\n        \"pet_role_preset_zh\": {\n          \"type\": \"string\"\n\
              \        },\n        \"pet_type\": {\n          \"type\": \"string\"\n        },\n        \"target_platform\"\
              : {\n          \"type\": \"string\"\n        },\n        \"target_platform_zh\": {\n          \"type\": \"string\"\
              \n        },\n        \"topic\": {\n          \"type\": \"string\"\n        },\n        \"topic_applied\": {\n\
              \          \"type\": \"string\"\n        },\n        \"voice_gender\": {\n          \"type\": \"string\"\n \
              \       },\n        \"voice_gender_zh\": {\n          \"type\": \"string\"\n        }\n      },\n      \"required\"\
              : [\n        \"creation_mode\",\n        \"pet_name\",\n        \"pet_type\",\n        \"pet_role_preset\",\n\
              \        \"pet_role_preset_zh\",\n        \"target_platform\",\n        \"target_platform_zh\",\n        \"\
              topic\",\n        \"topic_applied\",\n        \"voice_gender\",\n        \"voice_gender_zh\"\n      ],\n   \
              \   \"type\": \"object\"\n    },\n    \"platform_policy\": {\n      \"additionalProperties\": false,\n     \
              \ \"properties\": {\n        \"aspect_ratio\": {\n          \"type\": \"string\"\n        },\n        \"canvas_height\"\
              : {\n          \"type\": \"number\"\n        },\n        \"canvas_width\": {\n          \"type\": \"number\"\
              \n        },\n        \"cover_style\": {\n          \"type\": \"string\"\n        },\n        \"duration_range_sec\"\
              : {\n          \"type\": \"string\"\n        },\n        \"hook_window_sec\": {\n          \"type\": \"number\"\
              \n        },\n        \"image_size\": {\n          \"type\": \"string\"\n        },\n        \"share_copy_style\"\
              : {\n          \"type\": \"string\"\n        },\n        \"shot_count\": {\n          \"type\": \"string\"\n\
              \        },\n        \"subtitle_density\": {\n          \"type\": \"string\"\n        },\n        \"target_duration_sec\"\
              : {\n          \"type\": \"number\"\n        },\n        \"tone_style\": {\n          \"type\": \"string\"\n\
              \        },\n        \"video_ratio\": {\n          \"type\": \"string\"\n        }\n      },\n      \"required\"\
              : [\n        \"target_duration_sec\",\n        \"duration_range_sec\",\n        \"hook_window_sec\",\n     \
              \   \"shot_count\",\n        \"subtitle_density\",\n        \"tone_style\",\n        \"cover_style\",\n    \
              \    \"share_copy_style\",\n        \"aspect_ratio\",\n        \"image_size\",\n        \"video_ratio\",\n \
              \       \"canvas_width\",\n        \"canvas_height\"\n      ],\n      \"type\": \"object\"\n    },\n    \"role_policy\"\
              : {\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"emotion_pool\": {\n        \
              \  \"items\": {\n            \"type\": \"string\"\n          },\n          \"type\": \"string\"\n        },\n\
              \        \"ending_twist_style\": {\n          \"type\": \"string\"\n        },\n        \"human_identity\":\
              \ {\n          \"type\": \"string\"\n        },\n        \"prop_pool\": {\n          \"items\": {\n        \
              \    \"type\": \"string\"\n          },\n          \"type\": \"array\"\n        },\n        \"scene_pool\":\
              \ {\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"type\": \"array\"\n\
              \        }\n      },\n      \"required\": [\n        \"human_identity\",\n        \"scene_pool\",\n        \"\
              prop_pool\",\n        \"emotion_pool\",\n        \"ending_twist_style\"\n      ],\n      \"type\": \"object\"\
              \n    },\n    \"visual_profile\": {\n      \"additionalProperties\": false,\n      \"properties\": {\n     \
              \   \"body_shape\": {\n          \"type\": \"string\"\n        },\n        \"breed_guess\": {\n          \"\
              type\": \"string\"\n        },\n        \"coat_main\": {\n          \"type\": \"string\"\n        },\n     \
              \   \"coat_pattern\": {\n          \"type\": \"string\"\n        },\n        \"ear_feat\": {\n          \"type\"\
              : \"string\"\n        },\n        \"eye_feat\": {\n          \"type\": \"string\"\n        },\n        \"face_shape\"\
              : {\n          \"type\": \"string\"\n        },\n        \"id_keys\": {\n          \"items\": {\n          \
              \  \"type\": \"string\"\n          },\n          \"type\": \"array\"\n        },\n        \"image_summary\"\
              : {\n          \"type\": \"string\"\n        },\n        \"species\": {\n          \"type\": \"string\"\n  \
              \      },\n        \"tail_feat\": {\n          \"type\": \"string\"\n        },\n        \"unique_marks\": {\n\
              \          \"items\": {\n            \"type\": \"string\"\n          },\n          \"type\": \"array\"\n   \
              \     }\n      },\n      \"required\": [\n        \"species\",\n        \"breed_guess\",\n        \"coat_main\"\
              ,\n        \"coat_pattern\",\n        \"face_shape\",\n        \"eye_feat\",\n        \"ear_feat\",\n      \
              \  \"body_shape\",\n        \"tail_feat\",\n        \"unique_marks\",\n        \"id_keys\",\n        \"image_summary\"\
              \n      ],\n      \"type\": \"object\"\n    },\n    \"voice_policy\": {\n      \"additionalProperties\": false,\n\
              \      \"properties\": {\n        \"voice_anchor\": {\n          \"type\": \"string\"\n        },\n        \"\
              voice_consistency_rule\": {\n          \"type\": \"string\"\n        },\n        \"voice_gender\": {\n     \
              \     \"type\": \"string\"\n        },\n        \"voice_style\": {\n          \"type\": \"string\"\n       \
              \ }\n      },\n      \"required\": [\n        \"voice_gender\",\n        \"voice_anchor\",\n        \"voice_style\"\
              ,\n        \"voice_consistency_rule\"\n      ],\n      \"type\": \"object\"\n    }\n  },\n  \"required\": [\n\
              \    \"input_profile\",\n    \"platform_policy\",\n    \"role_policy\",\n    \"voice_policy\",\n    \"visual_profile\"\
              \n  ],\n  \"type\": \"object\"\n}"
            temperature: 0.35
            max_completion_tokens: 4096
          mode: chat
          name: gpt-5.5-2026-04-24
          provider: aict/ai_hub/ai_hub
        prompt_template:
        - id: e7ff773b-2c53-48bd-9a73-aa1bd2a07bd1
          role: system
          text: '你是 AI 萌宠角色基础建模 Agent。


            你的任务是基于用户输入的结构化字段和上传的 1 张宠物照片,输出一份统一的角色基础建模结果,供后续拟人角色设计、故事规划和镜头生成使用。


            输入字段如下:

            - 宠物人物设定:{{#1880000000001.pet_role_preset#}}

            - 目标平台:{{#1880000000001.target_platform#}}

            - 主角音色:{{#1880000000001.voice_gender#}}

            - 选题:{{#1880000000001.topic#}}

            - 宠物名称:{{#1880000000001.pet_name#}}

            - 宠物类型:{{#1880000000001.pet_type#}}


            你必须同时完成以下 5 件事:

            1. 规范化用户输入,生成 input_profile。

            2. 根据 target_platform 生成 platform_policy。

            3. 根据 pet_role_preset 生成 role_policy。

            4. 根据 voice_gender 生成 voice_policy,用于后续所有分镜固定同一个音色锚点。

            5. 系统会通过图片处理传入 1 张宠物照片,请直接观察这张照片,不要把图片内容当作文本变量解析。根据这 1 张上传照片生成 visual_profile,用于识别“这还是这只宠物”。


            平台策略必须固定遵守以下规则:

            - douyin:target_duration_sec=18,duration_range_sec=15-22,hook_window_sec=2,shot_count=5-6,subtitle_density=high,tone_style=强反差快节奏,cover_style=大字直给,share_copy_style=短句口语化,aspect_ratio=9:16,image_size=1024x1536,video_ratio=9:16,canvas_width=1080,canvas_height=1920。

            - xiaohongshu:target_duration_sec=26,duration_range_sec=20-35,hook_window_sec=3,shot_count=6-7,subtitle_density=medium,tone_style=生活感可爱感,cover_style=更像生活记录,share_copy_style=带一点“我家宠物太像人了”的分享感,aspect_ratio=9:16,image_size=1024x1536,video_ratio=9:16,canvas_width=1080,canvas_height=1920。


            - bilibili:target_duration_sec=40,duration_range_sec=30-55,hook_window_sec=4,shot_count=6-8,subtitle_density=medium_high,tone_style=小叙事更完整,cover_style=可稍弱标题党,share_copy_style=更像完整日常分享,aspect_ratio=16:9,image_size=1536x1024,video_ratio=16:9,canvas_width=1920,canvas_height=1080。


            人设策略必须固定遵守以下规则:

            - delivery_rider:human_identity=外卖员;scene_pool 包含出门、赶单、等电梯、送餐、休息、回家;prop_pool 包含头盔、工服、保温箱、电动车、手机;emotion_pool
            包含累、嘴硬、敬业、轻崩溃;ending_twist_style=“明天还得接着跑”。

            - college_student:human_identity=大学生;scene_pool 包含起床、洗漱、赶课、食堂、图书馆、宿舍;prop_pool 包含书包、课本、水杯、耳机、电脑;emotion_pool 包含困、呆、装成熟、拖延;ending_twist_style=“明天一定早起”。

            - office_worker:human_identity=职场打工人;scene_pool 包含通勤、打卡、工位、开会、午饭、加班、回家;prop_pool 包含工牌、电脑、咖啡、背包、地铁;emotion_pool
            包含班味、疲惫、忍住不发疯;ending_twist_style=“今天也没辞职”。


            选题使用规则:

            1. 如果 topic 非空,creation_mode=topic_driven,后续角色形象、故事钩子、镜头内容都要优先围绕这个选题展开,但仍不能偏离 pet_role_preset 对应的人设。

            2. 如果 topic 为空,creation_mode=role_driven,后续角色形象和故事完全根据 pet_role_preset 展开。


            音色策略规则:

            1. 必须输出 voice_policy。

            2. voice_anchor 必须是一句固定的“音色锚点描述”,供后续所有分镜视频生成复用,确保同一条视频里音色不漂移。

            3. male 输出稳定男声音色锚点;female 输出稳定女声音色锚点。

            4. voice_style 允许结合人设和选题做轻微风格提示,但不能改变基础音色身份。


            视觉解析要求:

            1. 只提取这张照片里的原宠物识别锚点,不要在这一节点做拟人造型。

            2. 重点提取:毛色、花纹、脸型、眼睛、耳朵、嘴套、胡须、体型、尾巴、独特标记。

            3. 输出必须服务后续一致性控制。

            4. 如果 pet_type 为空,可根据图片判断;如果无法确定则如实写待确认。


            输出必须是严格 JSON,不要输出 Markdown,不要输出解释性文字。


            质量标准:

            - 输出必须能被下游节点直接消费,字段完整、类型稳定、不得漏填 required 字段。

            - 内容必须同时保持宠物识别点、人设一致性、平台节奏和短视频可看性。

            - 对不确定信息要写“待确认”,不要编造成确定事实。


            迭代反馈信号:

            - 如果后续生成结果出现角色不像原宠物、笑点平、镜头拖、口播像说明书、视频拼接缺 URL,应优先回到本节点检查视觉锚点、故事钩子、字段完整性和下游依赖字段。


            输出合同:

            - 只输出符合 JSON Schema 的 JSON 对象,不输出 Markdown、解释文字或额外字段。

            '
        - id: 6568fd20-6537-4f71-83b1-774bd3436a86
          role: user
          text: '请根据以下输入和上传的 1 张宠物照片,输出角色基础建模 JSON。


            - 宠物人物设定:{{#1880000000001.pet_role_preset#}}

            - 目标平台:{{#1880000000001.target_platform#}}

            - 主角音色:{{#1880000000001.voice_gender#}}

            - 选题:{{#1880000000001.topic#}}

            - 宠物名称:{{#1880000000001.pet_name#}}

            - 宠物类型:{{#1880000000001.pet_type#}}


            图片变量:{{#1880000000001.pet_image_1#}}


            请严格按 JSON Schema 输出 input_profile、platform_policy、role_policy、voice_policy、visual_profile。'
        selected: false
        structured_output:
          schema:
            additionalProperties: false
            properties:
              input_profile:
                additionalProperties: false
                properties:
                  creation_mode:
                    type: string
                  pet_name:
                    type: string
                  pet_role_preset:
                    type: string
                  pet_role_preset_zh:
                    type: string
                  pet_type:
                    type: string
                  target_platform:
                    type: string
                  target_platform_zh:
                    type: string
                  topic:
                    type: string
                  topic_applied:
                    type: string
                  voice_gender:
                    type: string
                  voice_gender_zh:
                    type: string
                required:
                - creation_mode
                - pet_name
                - pet_type
                - pet_role_preset
                - pet_role_preset_zh
                - target_platform
                - target_platform_zh
                - topic
                - topic_applied
                - voice_gender
                - voice_gender_zh
                type: object
              platform_policy:
                additionalProperties: false
                properties:
                  aspect_ratio:
                    type: string
                  canvas_height:
                    type: number
                  canvas_width:
                    type: number
                  cover_style:
                    type: string
                  duration_range_sec:
                    type: string
                  hook_window_sec:
                    type: number
                  image_size:
                    type: string
                  share_copy_style:
                    type: string
                  shot_count:
                    type: string
                  subtitle_density:
                    type: string
                  target_duration_sec:
                    type: number
                  tone_style:
                    type: string
                  video_ratio:
                    type: string
                required:
                - target_duration_sec
                - duration_range_sec
                - hook_window_sec
                - shot_count
                - subtitle_density
                - tone_style
                - cover_style
                - share_copy_style
                - aspect_ratio
                - image_size
                - video_ratio
                - canvas_width
                - canvas_height
                type: object
              role_policy:
                additionalProperties: false
                properties:
                  emotion_pool:
                    items:
                      type: string
                    type: string
                  ending_twist_style:
                    type: string
                  human_identity:
                    type: string
                  prop_pool:
                    items:
                      type: string
                    type: array
                  scene_pool:
                    items:
                      type: string
                    type: array
                required:
                - human_identity
                - scene_pool
                - prop_pool
                - emotion_pool
                - ending_twist_style
                type: object
              visual_profile:
                additionalProperties: false
                properties:
                  body_shape:
                    type: string
                  breed_guess:
                    type: string
                  coat_main:
                    type: string
                  coat_pattern:
                    type: string
                  ear_feat:
                    type: string
                  eye_feat:
                    type: string
                  face_shape:
                    type: string
                  id_keys:
                    items:
                      type: string
                    type: array
                  image_summary:
                    type: string
                  species:
                    type: string
                  tail_feat:
                    type: string
                  unique_marks:
                    items:
                      type: string
                    type: array
                required:
                - species
                - breed_guess
                - coat_main
                - coat_pattern
                - face_shape
                - eye_feat
                - ear_feat
                - body_shape
                - tail_feat
                - unique_marks
                - id_keys
                - image_summary
                type: object
              voice_policy:
                additionalProperties: false
                properties:
                  voice_anchor:
                    type: string
                  voice_consistency_rule:
                    type: string
                  voice_gender:
                    type: string
                  voice_style:
                    type: string
                required:
                - voice_gender
                - voice_anchor
                - voice_style
                - voice_consistency_rule
                type: object
            required:
            - input_profile
            - platform_policy
            - role_policy
            - voice_policy
            - visual_profile
            type: object
        structured_output_enabled: true
        title: 节点1:角色基础建模
        type: llm
        variables: []
        video:
          configs:
            variable_selector: []
          enabled: false
        vision:
          configs:
            detail: high
            variable_selector:
            - '1880000000001'
            - pet_image_1
          enabled: true
      height: 120
      id: '1880000000002'
      position:
        x: 332
        y: 1143
      positionAbsolute:
        x: 332
        y: 1143
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
    - data:
        audio:
          configs:
            variable_selector: []
          enabled: false
        context:
          enabled: false
          variable_selector: []
        desc: ''
        document:
          configs:
            variable_selector: []
          enabled: false
        model:
          completion_params:
            response_format: json_schema
            json_schema: "{\n  \"additionalProperties\": false,\n  \"properties\": {\n    \"anthro_character_spec\": {\n \
              \     \"additionalProperties\": false,\n      \"properties\": {\n        \"back_view_desc\": {\n          \"\
              type\": \"string\"\n        },\n        \"body_mode\": {\n          \"type\": \"string\"\n        },\n     \
              \   \"costume_rule\": {\n          \"type\": \"string\"\n        },\n        \"expression_range\": {\n     \
              \     \"items\": {\n            \"type\": \"string\"\n          },\n          \"type\": \"array\"\n        },\n\
              \        \"face_lock\": {\n          \"items\": {\n            \"type\": \"string\"\n          },\n        \
              \  \"type\": \"array\"\n        },\n        \"front_view_desc\": {\n          \"type\": \"string\"\n       \
              \ },\n        \"hand_foot_rule\": {\n          \"type\": \"string\"\n        },\n        \"identity_brief\"\
              : {\n          \"type\": \"string\"\n        },\n        \"image_prompt\": {\n          \"type\": \"string\"\
              \n        },\n        \"negative_prompt\": {\n          \"type\": \"string\"\n        },\n        \"prop_rule\"\
              : {\n          \"type\": \"string\"\n        },\n        \"side_view_desc\": {\n          \"type\": \"string\"\
              \n        },\n        \"speaking_face_rule\": {\n          \"type\": \"string\"\n        }\n      },\n     \
              \ \"required\": [\n        \"identity_brief\",\n        \"face_lock\",\n        \"body_mode\",\n        \"hand_foot_rule\"\
              ,\n        \"costume_rule\",\n        \"prop_rule\",\n        \"expression_range\",\n        \"speaking_face_rule\"\
              ,\n        \"front_view_desc\",\n        \"side_view_desc\",\n        \"back_view_desc\",\n        \"image_prompt\"\
              ,\n        \"negative_prompt\"\n      ],\n      \"type\": \"object\"\n    }\n  },\n  \"required\": [\n    \"\
              anthro_character_spec\"\n  ],\n  \"type\": \"object\"\n}"
            temperature: 0.35
            max_completion_tokens: 4096
          mode: chat
          name: gpt-5.5-2026-04-24
          provider: aict/ai_hub/ai_hub
        prompt_template:
        - id: 1b3a16af-a9f2-416e-95b8-69dbb643773d
          role: system
          text: '你是 AI 萌宠拟人角色三视图设定 Agent。


            你要基于节点1输出的 {{#1880000000002.structured_output#}},尤其是 input_profile、role_policy 和 visual_profile,生成一份“强拟人化萌宠角色三视图设定稿”,供后续统一生图使用。


            这里的角色是“保留宠物脸部识别点的人形角色”,必须满足:

            1. 保留原宠物的脸型、眼睛、鼻子、嘴套、毛色、花纹、耳朵、胡须、独特标记。

            2. 允许像人类一样站立、穿衣服、做动作、说话、做表情。

            3. 身体允许人形比例,但绝不能把脸直接变成人脸,也不能丢失宠物感。

            4. 服装、帽子、道具必须服务用户选择的人设。

            5. speaking_face_rule 必须明确这个角色说话时的嘴型、眼神、耳朵、胡须和面部变化规则。


            你需要输出:

            - identity_brief:角色一句话设定

            - face_lock:脸部和宠物识别点锁定项

            - body_mode:人形身体模式

            - hand_foot_rule:手脚表现规则

            - costume_rule:服装规则

            - prop_rule:主道具规则

            - expression_range:允许的表情范围

            - speaking_face_rule:说话表情规则

            - front_view_desc / side_view_desc / back_view_desc:拟人角色三视图描述

            - image_prompt:供三视图生图节点直接使用的中文提示词

            - negative_prompt:禁止项,必须覆盖人脸化、毛色漂移、花纹错误、肢体畸形、文字、UI、复杂背景


            输出必须是严格 JSON,不要输出 Markdown。


            质量标准:

            - 输出必须能被下游节点直接消费,字段完整、类型稳定、不得漏填 required 字段。

            - 内容必须同时保持宠物识别点、人设一致性、平台节奏和短视频可看性。

            - 对不确定信息要写“待确认”,不要编造成确定事实。


            迭代反馈信号:

            - 如果后续生成结果出现角色不像原宠物、笑点平、镜头拖、口播像说明书、视频拼接缺 URL,应优先回到本节点检查视觉锚点、故事钩子、字段完整性和下游依赖字段。


            输出合同:

            - 只输出符合 JSON Schema 的 JSON 对象,不输出 Markdown、解释文字或额外字段。

            '
        - id: 0b2d4517-15cd-4f32-8c46-fa91723f287f
          role: user
          text: '请基于节点1的角色基础建模结果,输出拟人角色三视图设定 JSON。


            节点1结构化结果:{{#1880000000002.structured_output#}}

            原始宠物照片:{{#1880000000001.pet_image_1#}}


            请严格按 JSON Schema 输出 anthro_character_spec,并确保 image_prompt 可直接驱动后续图生图组件。'
        selected: false
        structured_output:
          schema:
            additionalProperties: false
            properties:
              anthro_character_spec:
                additionalProperties: false
                properties:
                  back_view_desc:
                    type: string
                  body_mode:
                    type: string
                  costume_rule:
                    type: string
                  expression_range:
                    items:
                      type: string
                    type: array
                  face_lock:
                    items:
                      type: string
                    type: array
                  front_view_desc:
                    type: string
                  hand_foot_rule:
                    type: string
                  identity_brief:
                    type: string
                  image_prompt:
                    type: string
                  negative_prompt:
                    type: string
                  prop_rule:
                    type: string
                  side_view_desc:
                    type: string
                  speaking_face_rule:
                    type: string
                required:
                - identity_brief
                - face_lock
                - body_mode
                - hand_foot_rule
                - costume_rule
                - prop_rule
                - expression_range
                - speaking_face_rule
                - front_view_desc
                - side_view_desc
                - back_view_desc
                - image_prompt
                - negative_prompt
                type: object
            required:
            - anthro_character_spec
            type: object
        structured_output_enabled: true
        title: 节点2:拟人角色三视图设定
        type: llm
        variables: []
        video:
          configs:
            variable_selector: []
          enabled: false
        vision:
          configs:
            detail: high
            variable_selector:
            - '1880000000001'
            - pet_image_1
          enabled: true
      height: 120
      id: '1880000000003'
      position:
        x: 634
        y: 1143
      positionAbsolute:
        x: 634
        y: 1143
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
    - data:
        desc: ''
        isInIteration: false
        isInLoop: false
        model_info:
          config_version: v1
          model_id: jimeng-seedream-4.5-img2img
          model_name: 即梦 SeedDream 4.5 图生图
          provider: jimeng
          provider_name: 即梦
        params:
          custom_size:
            type: constant
            value: null
          enable_cs_transfer:
            type: constant
            value: true
          images:
            type: variable
            value_selector:
            - '1880000000001'
            - pet_image_1
          max_images:
            type: constant
            value: 1
          prompt:
            type: constant
            value: '基于输入图片生成 1 张拟人角色三视图参考板。必须是同一个 AI 萌宠角色的前视图、侧视图、后视图,统一出现在同一张参考板中。


              角色设定如下:

              {{#1880000000003.structured_output.anthro_character_spec.image_prompt#}}


              角色锁定要求如下:

              - 身份设定:{{#1880000000003.structured_output.anthro_character_spec.identity_brief#}}

              - 脸部锁定:{{#1880000000003.structured_output.anthro_character_spec.face_lock#}}

              - 身体模式:{{#1880000000003.structured_output.anthro_character_spec.body_mode#}}

              - 服装规则:{{#1880000000003.structured_output.anthro_character_spec.costume_rule#}}

              - 道具规则:{{#1880000000003.structured_output.anthro_character_spec.prop_rule#}}


              必须保持强拟人化但仍然一眼看出是原来的宠物,不要变成人脸,不要生成文字、字幕、UI、编号、复杂背景。


              负向约束:

              {{#1880000000003.structured_output.anthro_character_spec.negative_prompt#}}'
          sequential_image_generation:
            type: constant
            value: false
          size:
            type: variable
            value_selector:
            - '1880000000002'
            - structured_output
            - platform_policy
            - image_size
          watermark:
            type: constant
            value: false
        selected: false
        title: 节点2.5:拟人角色三视图生成
        type: image-generation
      height: 698
      id: '1880000000004'
      position:
        x: 936
        y: 1143
      positionAbsolute:
        x: 936
        y: 1143
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
    - data:
        audio:
          configs:
            variable_selector: []
          enabled: false
        context:
          enabled: false
          variable_selector: []
        desc: ''
        document:
          configs:
            variable_selector: []
          enabled: false
        model:
          completion_params:
            response_format: json_schema
            json_schema: "{\n  \"additionalProperties\": false,\n  \"properties\": {\n    \"story_plan\": {\n      \"additionalProperties\"\
              : false,\n      \"properties\": {\n        \"beat_outline\": {\n          \"items\": {\n            \"type\"\
              : \"string\"\n          },\n          \"type\": \"array\"\n        },\n        \"character_card_summary\": {\n\
              \          \"type\": \"string\"\n        },\n        \"cover_text_candidates\": {\n          \"items\": {\n\
              \            \"type\": \"string\"\n          },\n          \"type\": \"array\"\n        },\n        \"ending_line\"\
              : {\n          \"type\": \"string\"\n        },\n        \"hook_0_3s\": {\n          \"type\": \"string\"\n\
              \        },\n        \"os_lines\": {\n          \"items\": {\n            \"type\": \"string\"\n          },\n\
              \          \"type\": \"array\"\n        },\n        \"speaking_shot_ids\": {\n          \"items\": {\n     \
              \       \"type\": \"string\"\n          },\n          \"type\": \"array\"\n        },\n        \"story_title\"\
              : {\n          \"type\": \"string\"\n        },\n        \"subtitle_style\": {\n          \"type\": \"string\"\
              \n        },\n        \"voice_style_hint\": {\n          \"type\": \"string\"\n        }\n      },\n      \"\
              required\": [\n        \"story_title\",\n        \"hook_0_3s\",\n        \"beat_outline\",\n        \"os_lines\"\
              ,\n        \"speaking_shot_ids\",\n        \"voice_style_hint\",\n        \"ending_line\",\n        \"subtitle_style\"\
              ,\n        \"cover_text_candidates\",\n        \"character_card_summary\"\n      ],\n      \"type\": \"object\"\
              \n    }\n  },\n  \"required\": [\n    \"story_plan\"\n  ],\n  \"type\": \"object\"\n}"
            temperature: 0.35
            max_completion_tokens: 4096
          mode: chat
          name: gpt-5.5-2026-04-24
          provider: aict/ai_hub/ai_hub
        prompt_template:
        - id: f47bffa4-1b84-4779-bd42-ac16c2ec13f4
          role: system
          text: '你是 AI 萌宠故事规划 Agent。


            你要基于以下输入,生成一条强拟人化 AI 萌宠短视频的故事规划:

            - 节点1输出:{{#1880000000002.structured_output#}}

            - 节点2输出:{{#1880000000003.structured_output#}}

            - 用户主角音色:{{#1880000000001.voice_gender#}}


            要求:

            1. 故事必须严格服从 platform_policy:时长、镜头数倾向、钩子窗口、字幕密度、语气风格都要匹配目标平台。

            2. 故事必须严格服从 role_policy:人设不能跑偏。

            3. 角色是强拟人化角色,不是宠物纪录片。

            4. 如果 input_profile.creation_mode=topic_driven,story_title、hook_0_3s、beat_outline、ending_line、cover_text_candidates
            都必须优先围绕 input_profile.topic 展开,不能把选题只当成一句点缀。

            5. 如果 input_profile.creation_mode=role_driven,则完全根据 pet_role_preset 和 role_policy 展开,不要强行编造额外选题。

            6. 输出 2-4 句短口播台词,控制在短视频节奏内,每句尽量 6-14 个字。

            7. 明确 speaking_shot_ids,告诉后续哪些镜头需要说话。

            8. voice_style_hint 必须参考 voice_policy,和 voice_policy.voice_anchor 保持同一基础音色身份,只允许情绪轻微变化,不允许变成另一种声线。

            9. 剧本必须更有趣、更有梗,但不能堆网络热词。优先使用“人设反差 + 宠物习性 + 当代日常”的笑点:例如外卖员的嘴硬、大学生的早八崩溃、打工人的班味和摸鱼。

            10. 每条口播台词都要像真人短视频里的吐槽,短、狠、好记,避免说明书式旁白。

            11. hook_0_3s 必须有明确反差或悬念;ending_line 必须有回扣前文的包袱,不能只是普通总结。

            12. cover_text_candidates 要像平台短视频标题,口语化、有冲突感,但不能低俗、不能攻击具体群体、不能使用侵权台词。



            固定结构建议:

            - 前 0-3 秒建立钩子

            - 中段 3-5 个生活动作片段推进

            - 结尾落一个反差收束


            输出必须是严格 JSON,不要输出 Markdown。


            质量标准:

            - 输出必须能被下游节点直接消费,字段完整、类型稳定、不得漏填 required 字段。

            - 内容必须同时保持宠物识别点、人设一致性、平台节奏和短视频可看性。

            - 对不确定信息要写“待确认”,不要编造成确定事实。


            迭代反馈信号:

            - 如果后续生成结果出现角色不像原宠物、笑点平、镜头拖、口播像说明书、视频拼接缺 URL,应优先回到本节点检查视觉锚点、故事钩子、字段完整性和下游依赖字段。


            输出合同:

            - 只输出符合 JSON Schema 的 JSON 对象,不输出 Markdown、解释文字或额外字段。

            '
        - id: ece37b4a-6c00-40c5-90af-0ba68d97b3a6
          role: user
          text: '请基于角色基础建模和拟人角色设定,生成更有趣、更有梗的短视频故事规划 JSON。


            节点1结构化结果:{{#1880000000002.structured_output#}}

            节点2结构化结果:{{#1880000000003.structured_output#}}

            主角音色:{{#1880000000001.voice_gender#}}

            用户选题:{{#1880000000001.topic#}}


            请严格按 JSON Schema 输出 story_plan。'
        selected: false
        structured_output:
          schema:
            additionalProperties: false
            properties:
              story_plan:
                additionalProperties: false
                properties:
                  beat_outline:
                    items:
                      type: string
                    type: array
                  character_card_summary:
                    type: string
                  cover_text_candidates:
                    items:
                      type: string
                    type: array
                  ending_line:
                    type: string
                  hook_0_3s:
                    type: string
                  os_lines:
                    items:
                      type: string
                    type: array
                  speaking_shot_ids:
                    items:
                      type: string
                    type: array
                  story_title:
                    type: string
                  subtitle_style:
                    type: string
                  voice_style_hint:
                    type: string
                required:
                - story_title
                - hook_0_3s
                - beat_outline
                - os_lines
                - speaking_shot_ids
                - voice_style_hint
                - ending_line
                - subtitle_style
                - cover_text_candidates
                - character_card_summary
                type: object
            required:
            - story_plan
            type: object
        structured_output_enabled: true
        title: 节点3:故事规划
        type: llm
        variables: []
        video:
          configs:
            variable_selector: []
          enabled: false
        vision:
          enabled: false
      height: 120
      id: '1880000000005'
      position:
        x: 1238
        y: 1143
      positionAbsolute:
        x: 1238
        y: 1143
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
    - data:
        audio:
          configs:
            variable_selector: []
          enabled: false
        context:
          enabled: false
          variable_selector: []
        desc: ''
        document:
          configs:
            variable_selector: []
          enabled: false
        model:
          completion_params:
            response_format: json_schema
            json_schema: "{\n  \"additionalProperties\": false,\n  \"properties\": {\n    \"shot_package\": {\n      \"items\"\
              : {\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"camera_style\": {\n  \
              \          \"type\": \"string\"\n          },\n          \"duration_sec\": {\n            \"type\": \"number\"\
              \n          },\n          \"gesture_action\": {\n            \"type\": \"string\"\n          },\n          \"\
              image_prompt\": {\n            \"type\": \"string\"\n          },\n          \"mouth_action\": {\n         \
              \   \"type\": \"string\"\n          },\n          \"negative_prompt\": {\n            \"type\": \"string\"\n\
              \          },\n          \"purpose\": {\n            \"type\": \"string\"\n          },\n          \"shot_id\"\
              : {\n            \"type\": \"string\"\n          },\n          \"shot_title\": {\n            \"type\": \"string\"\
              \n          },\n          \"subtitle\": {\n            \"type\": \"string\"\n          },\n          \"video_prompt\"\
              : {\n            \"type\": \"string\"\n          },\n          \"visual_desc\": {\n            \"type\": \"\
              string\"\n          },\n          \"voice_emotion\": {\n            \"type\": \"string\"\n          },\n   \
              \       \"voice_line\": {\n            \"type\": \"string\"\n          }\n        },\n        \"required\":\
              \ [\n          \"shot_id\",\n          \"shot_title\",\n          \"duration_sec\",\n          \"purpose\",\n\
              \          \"visual_desc\",\n          \"camera_style\",\n          \"subtitle\",\n          \"voice_line\"\
              ,\n          \"voice_emotion\",\n          \"mouth_action\",\n          \"gesture_action\",\n          \"image_prompt\"\
              ,\n          \"video_prompt\",\n          \"negative_prompt\"\n        ],\n        \"type\": \"object\"\n  \
              \    },\n      \"type\": \"array\"\n    }\n  },\n  \"required\": [\n    \"shot_package\"\n  ],\n  \"type\":\
              \ \"object\"\n}"
            temperature: 0.35
            max_completion_tokens: 4096
          mode: chat
          name: gpt-5.5-2026-04-24
          provider: aict/ai_hub/ai_hub
        prompt_template:
        - id: 0cb38881-6554-4e02-9003-339ea82d3c8e
          role: system
          text: "你是 AI 萌宠分镜与镜头提示词合并 Agent。\n\n任务:把故事规划拆成可直接驱动分镜图生成、分镜视频生成和最终视频拼接的结构化镜头包。\n\n你要基于以下输入,一次性输出整条视频的分镜表和每镜的图像 /\
            \ 视频提示词:\n- 节点1输出:{{#1880000000002.structured_output#}}\n- 节点2输出:{{#1880000000003.structured_output#}}\n- 节点3输出:{{#1880000000005.structured_output#}}\n\
            \n关键要求:\n1. 输出镜头数必须符合 platform_policy.shot_count。\n2. 总时长必须尽量落入 platform_policy.duration_range_sec,并尽量贴近 target_duration_sec。\n\
            3. 第一镜必须在 hook_window_sec 内建立钩子。\n4. 后续镜头生成只允许参考“拟人角色三视图”,不要再把原宠物图作为后续镜头锚点。\n5. 如果 input_profile.creation_mode=topic_driven,每个镜头都必须服务\
            \ input_profile.topic,镜头动作、场景、字幕和台词都要围绕该选题推进。\n6. 如果 input_profile.creation_mode=role_driven,则围绕 pet_role_preset\
            \ 的典型日常展开。\n7. 每镜都必须输出:\n   shot_id、shot_title、duration_sec、purpose、visual_desc、camera_style、subtitle、voice_line、voice_emotion、mouth_action、gesture_action、image_prompt、video_prompt、negative_prompt。\n\
            8. image_prompt 用于关键帧图生成,video_prompt 用于图生视频,negative_prompt 用于防止角色漂移、人脸化、毛色花纹错误、肢体畸形、文字和 UI。\n9. 图像和视频提示词都必须服从\
            \ platform_policy.aspect_ratio、platform_policy.image_size、platform_policy.video_ratio 对应的平台尺寸策略。\n10. 说话镜头要根据\
            \ story_plan.speaking_shot_ids 分配 voice_line;静默镜头 voice_line 留空,mouth_action 设为 none。\n11. 所有说话镜头必须共享同一个 voice_policy.voice_anchor,不允许分镜之间切换声线。\n\
            12. 角色可以像人一样站立、做动作、说话、穿衣服,但始终保持宠物脸部识别点。\n13. 每个镜头都要承担一个明确笑点功能:反差钩子、铺垫、升级、误会、嘴硬、崩溃或反转,不能只是平铺直叙的生活动作。\n14. subtitle\
            \ 和 voice_line 要更像短视频热评式吐槽,允许轻微夸张,但必须贴合宠物动作和人物设定。\n15. image_prompt / video_prompt 要把笑点转成可见动作,例如眼神躲闪、假装镇定、突然加速、原地愣住、抱着道具嘴硬,不要只写“有趣”。\n\
            16. 避免过时烂梗、低俗梗、饭圈黑话和侵权台词;梗感来自生活反差,不靠复制流行语。\n\n\n输出必须是严格 JSON,不要输出 Markdown。\n\n质量标准:\n- 输出必须能被下游节点直接消费,字段完整、类型稳定、不得漏填\
            \ required 字段。\n- 内容必须同时保持宠物识别点、人设一致性、平台节奏和短视频可看性。\n- 对不确定信息要写“待确认”,不要编造成确定事实。\n\n迭代反馈信号:\n- 如果后续生成结果出现角色不像原宠物、笑点平、镜头拖、口播像说明书、视频拼接缺\
            \ URL,应优先回到本节点检查视觉锚点、故事钩子、字段完整性和下游依赖字段。\n\n输出合同:\n- 只输出符合 JSON Schema 的 JSON 对象,不输出 Markdown、解释文字或额外字段。\n"
        - id: 0b66c0a8-052d-4e60-8e8e-bb127a7f0255
          role: user
          text: '请把故事规划拆成可生成分镜图和分镜视频的 shot_package JSON。


            节点1结构化结果:{{#1880000000002.structured_output#}}

            节点2结构化结果:{{#1880000000003.structured_output#}}

            节点3结构化结果:{{#1880000000005.structured_output#}}


            请严格按 JSON Schema 输出 shot_package,每个镜头都要保留笑点功能、字幕、口播、图像提示词和视频提示词。'
        selected: false
        structured_output:
          schema:
            additionalProperties: false
            properties:
              shot_package:
                items:
                  additionalProperties: false
                  properties:
                    camera_style:
                      type: string
                    duration_sec:
                      type: number
                    gesture_action:
                      type: string
                    image_prompt:
                      type: string
                    mouth_action:
                      type: string
                    negative_prompt:
                      type: string
                    purpose:
                      type: string
                    shot_id:
                      type: string
                    shot_title:
                      type: string
                    subtitle:
                      type: string
                    video_prompt:
                      type: string
                    visual_desc:
                      type: string
                    voice_emotion:
                      type: string
                    voice_line:
                      type: string
                  required:
                  - shot_id
                  - shot_title
                  - duration_sec
                  - purpose
                  - visual_desc
                  - camera_style
                  - subtitle
                  - voice_line
                  - voice_emotion
                  - mouth_action
                  - gesture_action
                  - image_prompt
                  - video_prompt
                  - negative_prompt
                  type: object
                type: array
            required:
            - shot_package
            type: object
        structured_output_enabled: true
        title: 节点4:分镜与提示词合并
        type: llm
        variables: []
        video:
          configs:
            variable_selector: []
          enabled: false
        vision:
          enabled: false
      height: 120
      id: '1880000000006'
      position:
        x: 1540
        y: 1143
      positionAbsolute:
        x: 1540
        y: 1143
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
    - data:
        desc: ''
        error_handle_mode: continue-on-error
        height: 1886
        is_parallel: true
        iterator_input_type: array[object]
        iterator_selector:
        - '1880000000006'
        - structured_output
        - shot_package
        output_selector:
        - '1880000000011'
        - url
        output_type: array[string]
        parallel_nums: 8
        selected: false
        start_node_id: 1880000000007start
        title: 遍历-镜头图与视频生成
        type: iteration
        width: 1110
      height: 1886
      id: '1880000000007'
      position:
        x: 1869.4082155158476
        y: 814.6983453579518
      positionAbsolute:
        x: 1869.4082155158476
        y: 814.6983453579518
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 1110
      zIndex: 1
    - data:
        desc: ''
        outputs:
        - value_selector:
          - '1880000000014'
          - video_url
          value_type: string
          variable: video_url
        selected: false
        title: 结束
        type: end
      height: 120
      id: '1880000000008'
      position:
        x: 3918
        y: 1143
      positionAbsolute:
        x: 3918
        y: 1143
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
    - data:
        code: "function main({ storyboard_payload, videos, canvas_width, canvas_height }) {\n  const parseJson = (value) =>\
          \ {\n    if (typeof value !== \"string\") return value\n    const trimmed = value.trim()\n    if (!trimmed) return\
          \ null\n    return JSON.parse(trimmed)\n  }\n\n  const getShots = (value) => {\n    const parsed = parseJson(value)\n\
          \    if (Array.isArray(parsed)) return parsed\n    if (parsed && Array.isArray(parsed.shot_package)) return parsed.shot_package\n\
          \    return []\n  }\n\n  const flattenVideos = (value) => {\n    if (!Array.isArray(value)) return []\n    return\
          \ value.flatMap((item) => Array.isArray(item) ? item : [item])\n  }\n\n  const pickVideoUrl = (file) => {\n    if\
          \ (typeof file === \"string\" && file.trim()) return file.trim()\n    const candidates = [\n      file?.remote_url,\n\
          \      file?.url,\n      file?.download_url,\n      file?.view_url,\n      file?.file_url,\n      file?.presigned_url,\n\
          \      file?.video_url,\n      file?.path,\n      file?.data?.remote_url,\n      file?.data?.url,\n      file?.data?.download_url\n\
          \    ]\n    return candidates.find((item) => typeof item === \"string\" && item.trim()) || null\n  }\n\n  const\
          \ positiveNumber = (value, label) => {\n    const numberValue = Number(value)\n    if (!Number.isFinite(numberValue)\
          \ || numberValue <= 0) {\n      throw new Error(`${label} 必须是大于 0 的数字`)\n    }\n    return numberValue\n  }\n\n\
          \  const shots = getShots(storyboard_payload)\n  const videoItems = flattenVideos(videos)\n\n  if (!shots.length)\
          \ {\n    throw new Error(\"shot_package 为空,无法生成视频拼接参数\")\n  }\n  if (!videoItems.length) {\n    throw new Error(\"\
          分镜视频输出为空,无法生成视频拼接参数\")\n  }\n  if (shots.length !== videoItems.length) {\n    throw new Error(`镜头数与视频数不一致:shots=${shots.length},\
          \ videos=${videoItems.length}`)\n  }\n\n  let cursor = 0\n  const videoParams = []\n  const subtitleParams = []\n\
          \  const normalizedWidth = String(positiveNumber(canvas_width || 1080, \"canvas_width\"))\n  const normalizedHeight\
          \ = String(positiveNumber(canvas_height || 1920, \"canvas_height\"))\n\n  shots.forEach((shot, index) => {\n   \
          \ const duration = positiveNumber(shot?.duration_sec, `第 ${index + 1} 个镜头 duration_sec`)\n    const url = pickVideoUrl(videoItems[index])\n\
          \n    if (!url) {\n      throw new Error(`第 ${index + 1} 个镜头缺少可用的视频 URL`)\n    }\n\n    const caption = String(\n\
          \      shot?.subtitle ||\n      shot?.voice_line ||\n      shot?.shot_title ||\n      `镜头${index + 1}`\n    ).trim()\n\
          \n    videoParams.push({\n      url,\n      start: 0,\n      end: duration,\n      duration,\n      order: index\
          \ + 1,\n      caption\n    })\n\n    if (caption) {\n      subtitleParams.push({\n        text: caption,\n     \
          \   start: cursor,\n        end: cursor + duration\n      })\n    }\n\n    cursor += duration\n  })\n\n  return\
          \ {\n    video_params: JSON.stringify(videoParams),\n    audio_params: JSON.stringify([]),\n    subtitle_params:\
          \ JSON.stringify(subtitleParams),\n    width: normalizedWidth,\n    height: normalizedHeight,\n    is_web_project:\
          \ \"true\",\n    segment_count: String(shots.length),\n    total_duration_sec: String(cursor)\n  }\n}"
        code_language: javascript
        desc: ''
        outputs:
          audio_params:
            children: null
            type: string
          height:
            children: null
            type: string
          is_web_project:
            children: null
            type: string
          segment_count:
            children: null
            type: string
          subtitle_params:
            children: null
            type: string
          total_duration_sec:
            children: null
            type: string
          video_params:
            children: null
            type: string
          width:
            children: null
            type: string
        selected: false
        title: 生成视频拼接参数
        type: code
        variables:
        - value_selector:
          - '1880000000006'
          - structured_output
          - shot_package
          value_type: array[object]
          variable: storyboard_payload
        - value_selector:
          - '1880000000007'
          - output
          value_type: array[file]
          variable: videos
        - value_selector:
          - '1880000000002'
          - structured_output
          - platform_policy
          - canvas_width
          value_type: number
          variable: canvas_width
        - value_selector:
          - '1880000000002'
          - structured_output
          - platform_policy
          - canvas_height
          value_type: number
          variable: canvas_height
      height: 52
      id: '1880000000012'
      position:
        x: 3012
        y: 1143
      positionAbsolute:
        x: 3012
        y: 1143
      selected: true
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
    - data:
        desc: ''
        isInIteration: true
        selected: false
        title: ''
        type: iteration-start
        iteration_id: '1880000000007'
      draggable: false
      height: 48
      id: 1880000000007start
      parentId: '1880000000007'
      position:
        x: 60
        y: 919
      positionAbsolute:
        x: 1929.4082155158476
        y: 1733.698345357952
      selectable: false
      sourcePosition: right
      targetPosition: left
      type: custom-iteration-start
      width: 44
      zIndex: 1002
    - data:
        code: "function main({ arg1, identity_brief, face_lock, costume_rule, prop_rule, voice_gender, topic, creation_mode,\
          \ aspect_ratio, image_size, video_ratio, canvas_width, canvas_height, voice_anchor, voice_style, voice_consistency_rule\
          \ }) {\n  const item = typeof arg1 === \"string\" ? JSON.parse(arg1) : arg1\n\n  return {\n    shot_id: item.shot_id,\n\
          \    shot_title: item.shot_title,\n    duration_sec: String(item.duration_sec),\n    purpose: item.purpose,\n  \
          \  visual_desc: item.visual_desc,\n    camera_style: item.camera_style,\n    subtitle: item.subtitle,\n    voice_line:\
          \ item.voice_line,\n    voice_emotion: item.voice_emotion,\n    mouth_action: item.mouth_action,\n    gesture_action:\
          \ item.gesture_action,\n    image_prompt: item.image_prompt,\n    video_prompt: item.video_prompt,\n    negative_prompt:\
          \ item.negative_prompt,\n    identity_brief,\n    face_lock,\n    costume_rule,\n    prop_rule,\n    voice_gender,\n\
          \    topic,\n    creation_mode,\n    aspect_ratio,\n    image_size,\n    video_ratio,\n    canvas_width: String(canvas_width),\n\
          \    canvas_height: String(canvas_height),\n    voice_anchor,\n    voice_style,\n    voice_consistency_rule\n  }\n\
          }"
        code_language: javascript
        desc: ''
        isInIteration: true
        isInLoop: false
        iteration_id: '1880000000007'
        outputs:
          aspect_ratio:
            children: null
            type: string
          camera_style:
            children: null
            type: string
          canvas_height:
            children: null
            type: string
          canvas_width:
            children: null
            type: string
          costume_rule:
            children: null
            type: string
          creation_mode:
            children: null
            type: string
          duration_sec:
            children: null
            type: string
          face_lock:
            children: null
            type: array[string]
          gesture_action:
            children: null
            type: string
          identity_brief:
            children: null
            type: string
          image_prompt:
            children: null
            type: string
          image_size:
            children: null
            type: string
          mouth_action:
            children: null
            type: string
          negative_prompt:
            children: null
            type: string
          prop_rule:
            children: null
            type: string
          purpose:
            children: null
            type: string
          shot_id:
            children: null
            type: string
          shot_title:
            children: null
            type: string
          subtitle:
            children: null
            type: string
          topic:
            children: null
            type: string
          video_prompt:
            children: null
            type: string
          video_ratio:
            children: null
            type: string
          visual_desc:
            children: null
            type: string
          voice_anchor:
            children: null
            type: string
          voice_consistency_rule:
            children: null
            type: string
          voice_emotion:
            children: null
            type: string
          voice_gender:
            children: null
            type: string
          voice_line:
            children: null
            type: string
          voice_style:
            children: null
            type: string
        selected: false
        title: 代码执行
        type: code
        variables:
        - value_selector:
          - '1880000000007'
          - item
          value_type: object
          variable: arg1
        - value_selector:
          - '1880000000003'
          - structured_output
          - anthro_character_spec
          - identity_brief
          value_type: string
          variable: identity_brief
        - value_selector:
          - '1880000000003'
          - structured_output
          - anthro_character_spec
          - face_lock
          value_type: array[string]
          variable: face_lock
        - value_selector:
          - '1880000000003'
          - structured_output
          - anthro_character_spec
          - costume_rule
          value_type: string
          variable: costume_rule
        - value_selector:
          - '1880000000003'
          - structured_output
          - anthro_character_spec
          - prop_rule
          value_type: string
          variable: prop_rule
        - value_selector:
          - '1880000000001'
          - voice_gender
          value_type: string
          variable: voice_gender
        - value_selector:
          - '1880000000002'
          - structured_output
          - input_profile
          - topic
          value_type: string
          variable: topic
        - value_selector:
          - '1880000000002'
          - structured_output
          - input_profile
          - creation_mode
          value_type: string
          variable: creation_mode
        - value_selector:
          - '1880000000002'
          - structured_output
          - platform_policy
          - aspect_ratio
          value_type: string
          variable: aspect_ratio
        - value_selector:
          - '1880000000002'
          - structured_output
          - platform_policy
          - image_size
          value_type: string
          variable: image_size
        - value_selector:
          - '1880000000002'
          - structured_output
          - platform_policy
          - video_ratio
          value_type: string
          variable: video_ratio
        - value_selector:
          - '1880000000002'
          - structured_output
          - platform_policy
          - canvas_width
          value_type: number
          variable: canvas_width
        - value_selector:
          - '1880000000002'
          - structured_output
          - platform_policy
          - canvas_height
          value_type: number
          variable: canvas_height
        - value_selector:
          - '1880000000002'
          - structured_output
          - voice_policy
          - voice_anchor
          value_type: string
          variable: voice_anchor
        - value_selector:
          - '1880000000002'
          - structured_output
          - voice_policy
          - voice_style
          value_type: string
          variable: voice_style
        - value_selector:
          - '1880000000002'
          - structured_output
          - voice_policy
          - voice_consistency_rule
          value_type: string
          variable: voice_consistency_rule
      height: 52
      id: '1880000000009'
      parentId: '1880000000007'
      position:
        x: 87.42245703277831
        y: 580.0180398603745
      positionAbsolute:
        x: 1956.830672548626
        y: 1394.7163852183262
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 1002
    - data:
        desc: ''
        isInIteration: true
        isInLoop: false
        iteration_id: '1880000000007'
        model_info:
          config_version: v1
          model_id: jimeng-seedream-4.5-img2img
          model_name: 即梦 SeedDream 4.5 图生图
          provider: jimeng
          provider_name: 即梦
        params:
          custom_size:
            type: constant
            value: null
          enable_cs_transfer:
            type: constant
            value: true
          images:
            type: variable
            value_selector:
            - '1880000000004'
            - images
          max_images:
            type: constant
            value: 1
          prompt:
            type: constant
            value: '你是一名 AI 萌宠分镜图生成 Agent。基于输入的“拟人角色三视图参考板”,为当前镜头生成 1 张符合目标平台尺寸策略的关键帧图。


              角色总锚点如下:

              - identity_brief={{#1880000000009.identity_brief#}}

              - face_lock={{#1880000000009.face_lock#}}

              - costume_rule={{#1880000000009.costume_rule#}}

              - prop_rule={{#1880000000009.prop_rule#}}

              - creation_mode={{#1880000000009.creation_mode#}}

              - topic={{#1880000000009.topic#}}

              - aspect_ratio={{#1880000000009.aspect_ratio#}}

              - image_size={{#1880000000009.image_size#}}


              当前镜头信息如下:

              - shot_id={{#1880000000009.shot_id#}}

              - shot_title={{#1880000000009.shot_title#}}

              - purpose={{#1880000000009.purpose#}}

              - visual_desc={{#1880000000009.visual_desc#}}

              - camera_style={{#1880000000009.camera_style#}}

              - subtitle={{#1880000000009.subtitle#}}

              - gesture_action={{#1880000000009.gesture_action#}}


              请围绕以下提示词出图:

              {{#1880000000009.image_prompt#}}


              必须保持同一个拟人角色,不要重新设计角色脸,不要改变毛色、花纹、耳朵、眼睛和服装基调,并严格服从 aspect_ratio 和 image_size 对应的平台画幅要求。

              如果 creation_mode=topic_driven,则画面必须围绕 topic 展开,不要把选题弱化成无关背景。

              不要生成文字、字幕、UI、水印。


              负向约束:

              {{#1880000000009.negative_prompt#}}'
          sequential_image_generation:
            type: constant
            value: false
          size:
            type: variable
            value_selector:
            - '1880000000009'
            - image_size
          watermark:
            type: constant
            value: false
        selected: false
        title: 图像生成
        type: image-generation
      height: 1206
      id: '1880000000010'
      parentId: '1880000000007'
      position:
        x: 464.1049454961544
        y: 90.45119708579091
      positionAbsolute:
        x: 2333.513161012002
        y: 905.1495424437427
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 1002
    - data:
        desc: 使用本地可运行样本验证过的 AI Hub workflow-backed tool 生成图生视频。
        is_team_authorization: true
        output_schema: null
        outputs:
        - type: any
          value_selector:
          - '1880000000011'
          - video_url
          value_type: string
          variable: url
        - type: any
          value_selector:
          - '1880000000011'
          - last_frame_url
          value_type: string
          variable: last_frame_url
        - type: any
          value_selector:
          - '1880000000011'
          - error_message
          value_type: string
          variable: error_message
        paramSchemas:
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 提示词(建议不超过500个汉字或1000个英文单词)
            ja_JP: 提示词(建议不超过500个汉字或1000个英文单词)
            pt_BR: 提示词(建议不超过500个汉字或1000个英文单词)
            zh_Hans: 提示词(建议不超过500个汉字或1000个英文单词)
          llm_description: ''
          max: null
          min: null
          name: prompt
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: true
          scope: null
          template: null
          type: string
        - auto_generate: null
          default: 720p
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 视频分辨率(默认值:720p;可选:480p、720p、1080p)
            ja_JP: 视频分辨率(默认值:720p;可选:480p、720p、1080p)
            pt_BR: 视频分辨率(默认值:720p;可选:480p、720p、1080p)
            zh_Hans: 视频分辨率(默认值:720p;可选:480p、720p、1080p)
          llm_description: ''
          max: null
          min: null
          name: resolution
          options:
          - icon: null
            label:
              en_US: 480p
              ja_JP: 480p
              pt_BR: 480p
              zh_Hans: 480p
            value: 480p
          - icon: null
            label:
              en_US: 720p
              ja_JP: 720p
              pt_BR: 720p
              zh_Hans: 720p
            value: 720p
          - icon: null
            label:
              en_US: 1080p
              ja_JP: 1080p
              pt_BR: 1080p
              zh_Hans: 1080p
            value: 1080p
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: false
          scope: null
          template: null
          type: select
        - auto_generate: null
          default: adaptive
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 宽高比(默认值:adaptive;可选:16:9、4:3、1:1、3:4、9:16、21:9、adaptive)
            ja_JP: 宽高比(默认值:adaptive;可选:16:9、4:3、1:1、3:4、9:16、21:9、adaptive)
            pt_BR: 宽高比(默认值:adaptive;可选:16:9、4:3、1:1、3:4、9:16、21:9、adaptive)
            zh_Hans: 宽高比(默认值:adaptive;可选:16:9、4:3、1:1、3:4、9:16、21:9、adaptive)
          llm_description: ''
          max: null
          min: null
          name: ratio
          options:
          - icon: null
            label:
              en_US: '16:9'
              ja_JP: '16:9'
              pt_BR: '16:9'
              zh_Hans: '16:9'
            value: '16:9'
          - icon: null
            label:
              en_US: '4:3'
              ja_JP: '4:3'
              pt_BR: '4:3'
              zh_Hans: '4:3'
            value: '4:3'
          - icon: null
            label:
              en_US: '1:1'
              ja_JP: '1:1'
              pt_BR: '1:1'
              zh_Hans: '1:1'
            value: '1:1'
          - icon: null
            label:
              en_US: '3:4'
              ja_JP: '3:4'
              pt_BR: '3:4'
              zh_Hans: '3:4'
            value: '3:4'
          - icon: null
            label:
              en_US: '9:16'
              ja_JP: '9:16'
              pt_BR: '9:16'
              zh_Hans: '9:16'
            value: '9:16'
          - icon: null
            label:
              en_US: '21:9'
              ja_JP: '21:9'
              pt_BR: '21:9'
              zh_Hans: '21:9'
            value: '21:9'
          - icon: null
            label:
              en_US: adaptive
              ja_JP: adaptive
              pt_BR: adaptive
              zh_Hans: adaptive
            value: adaptive
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: true
          scope: null
          template: null
          type: select
        - auto_generate: null
          default: '5'
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 视频时长(默认值:5;可选:[4, 12]或-1自动选择)
            ja_JP: 视频时长(默认值:5;可选:[4, 12]或-1自动选择)
            pt_BR: 视频时长(默认值:5;可选:[4, 12]或-1自动选择)
            zh_Hans: 视频时长(默认值:5;可选:[4, 12]或-1自动选择)
          llm_description: ''
          max: null
          min: null
          name: duration
          options:
          - icon: null
            label:
              en_US: '-1'
              ja_JP: '-1'
              pt_BR: '-1'
              zh_Hans: '-1'
            value: '-1'
          - icon: null
            label:
              en_US: '4'
              ja_JP: '4'
              pt_BR: '4'
              zh_Hans: '4'
            value: '4'
          - icon: null
            label:
              en_US: '5'
              ja_JP: '5'
              pt_BR: '5'
              zh_Hans: '5'
            value: '5'
          - icon: null
            label:
              en_US: '6'
              ja_JP: '6'
              pt_BR: '6'
              zh_Hans: '6'
            value: '6'
          - icon: null
            label:
              en_US: '7'
              ja_JP: '7'
              pt_BR: '7'
              zh_Hans: '7'
            value: '7'
          - icon: null
            label:
              en_US: '8'
              ja_JP: '8'
              pt_BR: '8'
              zh_Hans: '8'
            value: '8'
          - icon: null
            label:
              en_US: '9'
              ja_JP: '9'
              pt_BR: '9'
              zh_Hans: '9'
            value: '9'
          - icon: null
            label:
              en_US: '10'
              ja_JP: '10'
              pt_BR: '10'
              zh_Hans: '10'
            value: '10'
          - icon: null
            label:
              en_US: '11'
              ja_JP: '11'
              pt_BR: '11'
              zh_Hans: '11'
            value: '11'
          - icon: null
            label:
              en_US: '12'
              ja_JP: '12'
              pt_BR: '12'
              zh_Hans: '12'
            value: '12'
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: false
          scope: null
          template: null
          type: select
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 随机数种子(默认值-1;取值范围:[-1, 2^32-1] )
            ja_JP: 随机数种子(默认值-1;取值范围:[-1, 2^32-1] )
            pt_BR: 随机数种子(默认值-1;取值范围:[-1, 2^32-1] )
            zh_Hans: 随机数种子(默认值-1;取值范围:[-1, 2^32-1] )
          llm_description: ''
          max: null
          min: null
          name: seed
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: false
          scope: null
          template: null
          type: number
        - auto_generate: null
          default: 'false'
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 是否固定摄像头(默认值:false)
            ja_JP: 是否固定摄像头(默认值:false)
            pt_BR: 是否固定摄像头(默认值:false)
            zh_Hans: 是否固定摄像头(默认值:false)
          llm_description: ''
          max: null
          min: null
          name: camerafixed
          options:
          - icon: null
            label:
              en_US: 'true'
              ja_JP: 'true'
              pt_BR: 'true'
              zh_Hans: 'true'
            value: 'true'
          - icon: null
            label:
              en_US: 'false'
              ja_JP: 'false'
              pt_BR: 'false'
              zh_Hans: 'false'
            value: 'false'
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: false
          scope: null
          template: null
          type: select
        - auto_generate: null
          default: 'false'
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 是否添加水印(默认值:false)
            ja_JP: 是否添加水印(默认值:false)
            pt_BR: 是否添加水印(默认值:false)
            zh_Hans: 是否添加水印(默认值:false)
          llm_description: ''
          max: null
          min: null
          name: watermark
          options:
          - icon: null
            label:
              en_US: 'true'
              ja_JP: 'true'
              pt_BR: 'true'
              zh_Hans: 'true'
            value: 'true'
          - icon: null
            label:
              en_US: 'false'
              ja_JP: 'false'
              pt_BR: 'false'
              zh_Hans: 'false'
            value: 'false'
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: false
          scope: null
          template: null
          type: select
        - auto_generate: null
          default: 'false'
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 是否返回生成视频的尾帧图像(默认值:false)
            ja_JP: 是否返回生成视频的尾帧图像(默认值:false)
            pt_BR: 是否返回生成视频的尾帧图像(默认值:false)
            zh_Hans: 是否返回生成视频的尾帧图像(默认值:false)
          llm_description: ''
          max: null
          min: null
          name: return_last_frame
          options:
          - icon: null
            label:
              en_US: 'true'
              ja_JP: 'true'
              pt_BR: 'true'
              zh_Hans: 'true'
            value: 'true'
          - icon: null
            label:
              en_US: 'false'
              ja_JP: 'false'
              pt_BR: 'false'
              zh_Hans: 'false'
            value: 'false'
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: false
          scope: null
          template: null
          type: select
        - auto_generate: null
          default: 'true'
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 是否生成音频(默认值:true)
            ja_JP: 是否生成音频(默认值:true)
            pt_BR: 是否生成音频(默认值:true)
            zh_Hans: 是否生成音频(默认值:true)
          llm_description: ''
          max: null
          min: null
          name: generate_audio
          options:
          - icon: null
            label:
              en_US: 'true'
              ja_JP: 'true'
              pt_BR: 'true'
              zh_Hans: 'true'
            value: 'true'
          - icon: null
            label:
              en_US: 'false'
              ja_JP: 'false'
              pt_BR: 'false'
              zh_Hans: 'false'
            value: 'false'
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: false
          scope: null
          template: null
          type: select
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 给模型的图片对象,大于176x98px,小于6000x6000px
            ja_JP: 给模型的图片对象,大于176x98px,小于6000x6000px
            pt_BR: 给模型的图片对象,大于176x98px,小于6000x6000px
            zh_Hans: 给模型的图片对象,大于176x98px,小于6000x6000px
          llm_description: ''
          max: null
          min: null
          name: image
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: true
          scope: null
          template: null
          type: file
        params:
          camerafixed: ''
          duration: ''
          generate_audio: ''
          image: ''
          prompt: ''
          ratio: ''
          resolution: ''
          return_last_frame: ''
          seed: ''
          watermark: ''
        provider_id: 41d6c1fa-5cd4-460d-9f6d-65d728614438
        provider_name: 即梦图生视频-3.5 Pro
        provider_type: workflow
        selected: false
        title: 即梦图生视频-3.5 Pro
        tool_configurations: {}
        tool_description: 即梦图生视频
        tool_label: 即梦图生视频-3.5 Pro
        tool_name: dreamina_image_generate_video_3_5_pro
        tool_node_version: '2'
        tool_parameters:
          camerafixed:
            type: constant
            value: 'false'
          duration:
            type: constant
            value: '-1'
          generate_audio:
            type: constant
            value: 'true'
          image:
            type: variable
            value:
            - '1880000000010'
            - images
          prompt:
            type: mixed
            value: "基于输入图生成一段符合目标平台尺寸的视频,必须保持同一个 AI 萌宠拟人角色,不换脸、不换毛色、不换花纹、不换服装基调。\n\n当前镜头信息如下:\n- shot_id={{#1880000000009.shot_id#}}\n\
              - shot_title={{#1880000000009.shot_title#}}\n- purpose={{#1880000000009.purpose#}}\n- visual_desc={{#1880000000009.visual_desc#}}\n\
              - camera_style={{#1880000000009.camera_style#}}\n- voice_line={{#1880000000009.voice_line#}}\n- voice_emotion={{#1880000000009.voice_emotion#}}\n\
              - mouth_action={{#1880000000009.mouth_action#}}\n- gesture_action={{#1880000000009.gesture_action#}}\n- voice_gender={{#1880000000009.voice_gender#}}\n\
              - creation_mode={{#1880000000009.creation_mode#}}\n- topic={{#1880000000009.topic#}}\n- video_ratio={{#1880000000009.video_ratio#}}\n\
              - voice_anchor={{#1880000000009.voice_anchor#}}\n- voice_style={{#1880000000009.voice_style#}}\n- voice_consistency_rule={{#1880000000009.voice_consistency_rule#}}\n\
              \n角色总锚点:\n- identity_brief={{#1880000000009.identity_brief#}}\n- face_lock={{#1880000000009.face_lock#}}\n-\
              \ costume_rule={{#1880000000009.costume_rule#}}\n- prop_rule={{#1880000000009.prop_rule#}}\n\n动态要求:\n1. 严格遵循以下视频提示词:{{#1880000000009.video_prompt#}}\n\
              2. 如果 voice_line{{#1880000000009.voice_line#}} 为空,则该镜头静默表演,只保留自然呼吸、眨眼、头部和手部轻微动作。\n3. 如果 voice_line {{#1880000000009.voice_line#}}不为空,则让角色自然说出这句台词,音色按\
              \ voice_anchor{{#1880000000009.voice_anchor#}} 和 voice_style{{#1880000000009.voice_style#}} 固定处理,整条视频都必须复用同一个基础音色身份,绝对不能在不同分镜切换成另一种声线:\n\
              \   - male:男声\n   - female:女声\n4. 说话镜头优先自然感,不要夸张口型;mouth_action=none 时不做口型,mouth_action=light 时做轻口型,mouth_action=clear\
              \ 时做更清晰但不过度的口型。\n5. 角色表情、耳朵、眼神和手部动作应配合 voice_emotion 与 gesture_action。\n6. 严格遵守 video_ratio{{#1880000000009.video_ratio#}}\
              \ 对应的平台比例;如果 creation_mode=topic_driven,则镜头动作和表演也要持续围绕 topic。\n7. 不要生成字幕、文字、UI、水印,不要突然新增其他角色,不要做复杂无关走位。\n\n\
              负向约束:\n{{#1880000000009.negative_prompt#}}"
          ratio:
            type: variable
            value:
            - '1880000000009'
            - video_ratio
          resolution:
            type: constant
            value: 720p
          return_last_frame:
            type: constant
            value: 'false'
          seed:
            type: constant
            value: null
          watermark:
            type: constant
            value: 'false'
        type: tool
        isInIteration: true
        isInLoop: false
        iteration_id: '1880000000007'
      height: 240
      id: '1880000000011'
      parentId: '1880000000007'
      position:
        x: 810.4408240891889
        y: 65
      positionAbsolute:
        x: 2679.8490396050365
        y: 879.6983453579518
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 1002
    - data:
        desc: 使用本地指纹记录的 workflow-backed 火山视频点播-视频合成工具,把多个分镜片段拼接为一个完整 MP4。
        is_team_authorization: true
        output_schema: null
        outputs:
        - type: any
          value_selector:
          - '1880000000013'
          - vid
          value_type: string
          variable: vid
        - type: any
          value_selector:
          - '1880000000013'
          - video_url
          value_type: string
          variable: video_url
        - type: any
          value_selector:
          - '1880000000013'
          - web_result
          value_type: string
          variable: web_result
        paramSchemas:
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: video_params
            ja_JP: video_params
            pt_BR: video_params
            zh_Hans: 视频参数 JSON 字符串
          llm_description: ''
          max: null
          min: null
          name: video_params
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: true
          scope: null
          template: null
          type: string
        - auto_generate: null
          default: '[]'
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: audio_params
            ja_JP: audio_params
            pt_BR: audio_params
            zh_Hans: 音频参数 JSON 字符串
          llm_description: ''
          max: null
          min: null
          name: audio_params
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: true
          scope: null
          template: null
          type: string
        - auto_generate: null
          default: '[]'
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: subtitle_params
            ja_JP: subtitle_params
            pt_BR: subtitle_params
            zh_Hans: 字幕参数 JSON 字符串
          llm_description: ''
          max: null
          min: null
          name: subtitle_params
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: true
          scope: null
          template: null
          type: string
        - auto_generate: null
          default: '1080'
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: width
            ja_JP: width
            pt_BR: width
            zh_Hans: 宽度
          llm_description: ''
          max: null
          min: null
          name: width
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: true
          scope: null
          template: null
          type: string
        - auto_generate: null
          default: '1920'
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: height
            ja_JP: height
            pt_BR: height
            zh_Hans: 高度
          llm_description: ''
          max: null
          min: null
          name: height
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: true
          scope: null
          template: null
          type: string
        - auto_generate: null
          default: 'true'
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: is_web_project
            ja_JP: is_web_project
            pt_BR: is_web_project
            zh_Hans: 是否 Web 项目
          llm_description: ''
          max: null
          min: null
          name: is_web_project
          options:
          - icon: null
            label:
              en_US: 'true'
              ja_JP: 'true'
              pt_BR: 'true'
              zh_Hans: 'true'
            value: 'true'
          - icon: null
            label:
              en_US: 'false'
              ja_JP: 'false'
              pt_BR: 'false'
              zh_Hans: 'false'
            value: 'false'
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: true
          scope: null
          template: null
          type: select
        params:
          audio_params: ''
          height: ''
          is_web_project: ''
          subtitle_params: ''
          video_params: ''
          width: ''
        provider_id: e5d9c6cd-a06f-4b0f-9d42-09fa0f79b13b
        provider_name: 火山视频点播-视频合成
        provider_type: workflow
        selected: false
        title: 火山视频点播-视频合成
        tool_configurations: {}
        tool_description: 把多个视频片段、字幕和音频参数合成为一个完整视频
        tool_label: 火山视频点播-视频合成
        tool_name: volc_diaobo_videoconcat
        tool_node_version: '2'
        tool_parameters:
          video_params:
            type: variable
            value:
            - '1880000000012'
            - video_params
          audio_params:
            type: variable
            value:
            - '1880000000012'
            - audio_params
          subtitle_params:
            type: variable
            value:
            - '1880000000012'
            - subtitle_params
          width:
            type: variable
            value:
            - '1880000000012'
            - width
          height:
            type: variable
            value:
            - '1880000000012'
            - height
          is_web_project:
            type: variable
            value:
            - '1880000000012'
            - is_web_project
        type: tool
      height: 240
      id: '1880000000013'
      position:
        x: 3314
        y: 1143
      positionAbsolute:
        x: 3314
        y: 1143
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 244
    - data:
        code: "function main({ video_url, vid, web_result, segment_count, total_duration_sec }) {\n  const text = String(video_url\
          \ || \"\").trim()\n  if (!/^https?:\\/\\//i.test(text)) {\n    throw new Error(\"视频拼接结果缺少可用的 video_url\")\n  }\n\
          \  const diagnostics = {\n    vid: String(vid || \"\").trim(),\n    segment_count: String(segment_count || \"\"\
          ).trim(),\n    total_duration_sec: String(total_duration_sec || \"\").trim(),\n    has_web_result: String(web_result\
          \ || \"\").trim() ? \"true\" : \"false\"\n  }\n  return {\n    video_url: text,\n    diagnostics: JSON.stringify(diagnostics)\n\
          \  }\n}"
        code_language: javascript
        desc: ''
        outputs:
          video_url:
            children: null
            type: string
          diagnostics:
            children: null
            type: string
        selected: false
        title: 最终视频 URL 校验
        type: code
        variables:
        - value_selector:
          - '1880000000013'
          - video_url
          value_type: string
          variable: video_url
        - value_selector:
          - '1880000000013'
          - vid
          value_type: string
          variable: vid
        - value_selector:
          - '1880000000013'
          - web_result
          value_type: string
          variable: web_result
        - value_selector:
          - '1880000000012'
          - segment_count
          value_type: string
          variable: segment_count
        - value_selector:
          - '1880000000012'
          - total_duration_sec
          value_type: string
          variable: total_duration_sec
      height: 52
      id: '1880000000014'
      position:
        x: 3616
        y: 1143
      positionAbsolute:
        x: 3616
        y: 1143
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
    viewport:
      x: -418.4241978088112
      y: -309.36625707880387
      zoom: 0.598120505050764