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

艺术家生平-故事演绎

来源:/Users/ljn/Desktop/自动化搭建/AI生产线知识库/raw/old_dsl/艺术家生平-故事演绎.yml

艺术家生平-故事演绎

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

文件大小
286115 bytes
来源路径
/Users/ljn/Desktop/自动化搭建/AI生产线知识库/raw/old_dsl/艺术家生平-故事演绎.yml
app:
  description: 艺术家生平-故事演绎
  icon: 🤖
  icon_background: '#E3E5E8'
  icon_type: emoji
  mode: workflow
  name: 艺术家生平-故事演绎
  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: []
      allowed_file_upload_methods:
      - local_file
      - cs_file
      audio:
        enabled: false
        number_limits: 1
        transfer_methods:
        - local_file
      enabled: false
      fileUploadConfig:
        audio_file_size_limit: 100
        batch_count_limit: 5
        file_size_limit: 50
        image_file_size_limit: 20
        video_file_size_limit: 100
        workflow_file_upload_limit: 10
      image:
        enabled: false
        number_limits: 3
        transfer_methods:
        - local_file
        - cs_file
      number_limits: 3
      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: true
        isInLoop: false
        iteration_id: '1766574059102'
        sourceType: iteration-start
        targetType: code
      id: 1766574059102start-source-1766574094213-target
      selected: false
      source: 1766574059102start
      sourceHandle: source
      target: '1766574094213'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1766574059102'
        sourceType: code
        targetType: llm
      id: 1766574094213-source-1766574211446-target
      selected: false
      source: '1766574094213'
      sourceHandle: source
      target: '1766574211446'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInLoop: false
        sourceType: if-else
        targetType: code
      id: 1766557310716-true-1766565906395-target
      selected: false
      source: '1766557310716'
      sourceHandle: 'true'
      target: '1766565906395'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1766574059102'
        sourceType: tool
        targetType: code
      id: 1766574707339-source-1766577511976-target
      selected: false
      source: '1766574707339'
      sourceHandle: source
      target: '1766577511976'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1766574059102'
        sourceType: code
        targetType: tool
      id: 1766577511976-source-1766577671094-target
      selected: false
      source: '1766577511976'
      sourceHandle: source
      target: '1766577671094'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1766574059102'
        sourceType: tool
        targetType: code
      id: 1766577671094-source-1766577709907-target
      selected: false
      source: '1766577671094'
      sourceHandle: source
      target: '1766577709907'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: iteration
        targetType: iteration
      id: 1766574059102-source-1766579168310-target
      selected: false
      source: '1766574059102'
      sourceHandle: source
      target: '1766579168310'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1766579168310'
        sourceType: iteration-start
        targetType: code
      id: 1766579168310start-source-1766579221158-target
      selected: false
      source: 1766579168310start
      sourceHandle: source
      target: '1766579221158'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1766579168310'
        sourceType: tool
        targetType: code
      id: 1766579307542-source-1766580740909-target
      selected: false
      source: '1766579307542'
      sourceHandle: source
      target: '1766580740909'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: iteration
        targetType: iteration
      id: 1766579168310-source-1766631985311-target
      selected: false
      source: '1766579168310'
      sourceHandle: source
      target: '1766631985311'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1766631985311'
        sourceType: iteration-start
        targetType: code
      id: 1766631985311start-source-1766632013010-target
      selected: false
      source: 1766631985311start
      sourceHandle: source
      target: '1766632013010'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1766631985311'
        sourceType: code
        targetType: llm
      id: 1766632013010-source-1766632190094-target
      selected: false
      source: '1766632013010'
      sourceHandle: source
      target: '1766632190094'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1766631985311'
        sourceType: llm
        targetType: code
      id: 1766632190094-source-1766632617565-target
      selected: false
      source: '1766632190094'
      sourceHandle: source
      target: '1766632617565'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: iteration
        targetType: iteration
      id: 1766631985311-source-1766632760253-target
      selected: false
      source: '1766631985311'
      sourceHandle: source
      target: '1766632760253'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1766632760253'
        sourceType: iteration-start
        targetType: code
      id: 1766632760253start-source-1766632810839-target
      selected: false
      source: 1766632760253start
      sourceHandle: source
      target: '1766632810839'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1766632760253'
        sourceType: code
        targetType: tool
      id: 1766633846590-source-1766637839537-target
      selected: false
      source: '1766633846590'
      sourceHandle: source
      target: '1766637839537'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1766632760253'
        sourceType: tool
        targetType: code
      id: 1766637839537-source-1766633797134-target
      selected: false
      source: '1766637839537'
      sourceHandle: source
      target: '1766633797134'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1766579168310'
        sourceType: tool
        targetType: code
      id: 1767168888271-source-1766580740909-target
      selected: false
      source: '1767168888271'
      sourceHandle: source
      target: '1766580740909'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInLoop: false
        sourceType: llm
        targetType: if-else
      id: 1767513600761-source-1766557310716-target
      selected: false
      source: '1767513600761'
      sourceHandle: source
      target: '1766557310716'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1766579168310'
        sourceType: if-else
        targetType: tool
      id: 1767168795046-true-1766579307542-target
      selected: false
      source: '1767168795046'
      sourceHandle: 'true'
      target: '1766579307542'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1766579168310'
        sourceType: if-else
        targetType: tool
      id: 1767168795046-false-1767168888271-target
      selected: false
      source: '1767168795046'
      sourceHandle: 'false'
      target: '1767168888271'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1766632760253'
        sourceType: code
        targetType: if-else
      id: 1766632810839-source-1767612074064-target
      selected: false
      source: '1766632810839'
      sourceHandle: source
      target: '1767612074064'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1766632760253'
        sourceType: if-else
        targetType: tool
      id: 1767612074064-true-1767611826573-target
      selected: false
      source: '1767612074064'
      sourceHandle: 'true'
      target: '1767611826573'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1766632760253'
        sourceType: if-else
        targetType: http-request
      id: 1767612074064-false-1766647889824-target
      selected: false
      source: '1767612074064'
      sourceHandle: 'false'
      target: '1766647889824'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1766632760253'
        sourceType: tool
        targetType: code
      id: 1767611826573-source-1766633846590-target
      selected: false
      source: '1767611826573'
      sourceHandle: source
      target: '1766633846590'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1766574059102'
        sourceType: llm
        targetType: if-else
      id: 1766574211446-source-1767710910480-target
      selected: false
      source: '1766574211446'
      sourceHandle: source
      target: '1767710910480'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1766574059102'
        sourceType: if-else
        targetType: tool
      id: 1767710910480-false-1767711018753-target
      selected: false
      source: '1767710910480'
      sourceHandle: 'false'
      target: '1767711018753'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1766574059102'
        sourceType: tool
        targetType: code
      id: 1767711018753-source-1766577511976-target
      selected: false
      source: '1767711018753'
      sourceHandle: source
      target: '1766577511976'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInLoop: false
        sourceType: if-else
        targetType: code
      id: 1766557310716-false-1766565906395-target
      selected: false
      source: '1766557310716'
      sourceHandle: 'false'
      target: '1766565906395'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInLoop: false
        sourceType: code
        targetType: if-else
      id: 1768184532311-source-1767513946983-target
      selected: false
      source: '1768184532311'
      sourceHandle: source
      target: '1767513946983'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: start
        targetType: if-else
      id: 1765354062480-source-1768806919571-target
      selected: false
      source: '1765354062480'
      sourceHandle: source
      target: '1768806919571'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInLoop: false
        sourceType: llm
        targetType: if-else
      id: 1768894989678-source-1766557310716-target
      selected: false
      source: '1768894989678'
      sourceHandle: source
      target: '1766557310716'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInLoop: false
        sourceType: code
        targetType: code
      id: 1768803191521-source-1768184532311-target
      selected: false
      source: '1768803191521'
      sourceHandle: source
      target: '1768184532311'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInLoop: false
        sourceType: code
        targetType: iteration
      id: 1766565906395-source-1766574059102-target
      selected: false
      source: '1766565906395'
      sourceHandle: source
      target: '1766574059102'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1766574059102'
        sourceType: if-else
        targetType: tool
      id: 1767710910480-true-1768915366540-target
      selected: false
      source: '1767710910480'
      sourceHandle: 'true'
      target: '1768915366540'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1766574059102'
        sourceType: tool
        targetType: tool
      id: 1768915366540-source-1766574707339-target
      selected: false
      source: '1768915366540'
      sourceHandle: source
      target: '1766574707339'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: iteration
        targetType: code
      id: 1766632760253-source-1768987193454-target
      source: '1766632760253'
      sourceHandle: source
      target: '1768987193454'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInLoop: false
        sourceType: if-else
        targetType: code
      id: 1768806919571-false-1768803191521-target
      source: '1768806919571'
      sourceHandle: 'false'
      target: '1768803191521'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: code
        targetType: tool
      id: 1768987193454-source-1769069698077-target
      source: '1768987193454'
      sourceHandle: source
      target: '1769069698077'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInLoop: false
        sourceType: tool
        targetType: end
      id: 1769069698077-source-1766575021174-target
      source: '1769069698077'
      sourceHandle: source
      target: '1766575021174'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1766579168310'
        sourceType: if-else
        targetType: tool
      id: 1767168795046-c11347ba-0f2b-48c0-898e-6a88baa1a5cd-1769510509007-target
      source: '1767168795046'
      sourceHandle: c11347ba-0f2b-48c0-898e-6a88baa1a5cd
      target: '1769510509007'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1766579168310'
        sourceType: tool
        targetType: code
      id: 1769510509007-source-1766580740909-target
      source: '1769510509007'
      sourceHandle: source
      target: '1766580740909'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1766579168310'
        sourceType: code
        targetType: if-else
      id: 1766579221158-source-1769519278388-target
      source: '1766579221158'
      sourceHandle: source
      target: '1769519278388'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1766579168310'
        sourceType: if-else
        targetType: if-else
      id: 1769519278388-true-1767168795046-target
      source: '1769519278388'
      sourceHandle: 'true'
      target: '1767168795046'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1766579168310'
        sourceType: if-else
        targetType: tool
      id: 1769519278388-false-1767168888271-target
      source: '1769519278388'
      sourceHandle: 'false'
      target: '1767168888271'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: if-else
        targetType: tool
      id: 1768806919571-true-1772677692387-target
      source: '1768806919571'
      sourceHandle: 'true'
      target: '1772677692387'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInLoop: false
        sourceType: tool
        targetType: code
      id: 1772677692387-source-1768803191521-target
      source: '1772677692387'
      sourceHandle: source
      target: '1768803191521'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInLoop: false
        sourceType: llm
        targetType: if-else
      id: 1773732078844-source-1766557310716-target
      source: '1773732078844'
      sourceHandle: source
      target: '1766557310716'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInLoop: false
        sourceType: if-else
        targetType: llm
      id: 1767513946983-0c081d5e-e816-41a9-a860-7e10b654ac47-1773732078844-target
      source: '1767513946983'
      sourceHandle: 0c081d5e-e816-41a9-a860-7e10b654ac47
      target: '1773732078844'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInLoop: false
        sourceType: if-else
        targetType: llm
      id: 1767513946983-368673b3-3987-4923-80f8-eee8e3477fe3-1768894989678-target
      source: '1767513946983'
      sourceHandle: 368673b3-3987-4923-80f8-eee8e3477fe3
      target: '1768894989678'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInLoop: false
        sourceType: llm
        targetType: llm
      id: 1768990832178-source-1767513600761-target
      source: '1768990832178'
      sourceHandle: source
      target: '1767513600761'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInLoop: false
        sourceType: llm
        targetType: llm
      id: 1776397744783-source-1768990832178-target
      source: '1776397744783'
      sourceHandle: source
      target: '1768990832178'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInLoop: false
        sourceType: if-else
        targetType: llm
      id: 1767513946983-true-1776397744783-target
      source: '1767513946983'
      sourceHandle: 'true'
      target: '1776397744783'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1766632760253'
        sourceType: http-request
        targetType: tool
      id: 1766647889824-source-1779099074767-target
      source: '1766647889824'
      sourceHandle: source
      target: '1779099074767'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1766632760253'
        sourceType: tool
        targetType: code
      id: 1779099074767-source-1766633846590-target
      source: '1779099074767'
      sourceHandle: source
      target: '1766633846590'
      targetHandle: target
      type: custom
      zIndex: 1002
    nodes:
    - data:
        desc: ''
        selected: false
        title: 开始
        type: start
        variables:
        - label: 剧本
          max_length: 20000
          options: []
          required: true
          type: paragraph
          variable: content
        - default: 旁白
          label: 场景分析模式
          max_length: 48
          options:
          - 独白
          - 旁白
          - 19 世纪风
          required: true
          type: select
          variable: scene_mode
        - default: 3D皮克斯风格
          label: 全局风格提示词
          max_length: 400000
          options:
          - 19世纪油画风格
          - 3D皮克斯风格
          - 波普艺术风格
          - 吉卜力手绘水彩风格
          - 新中式东方奇幻
          - 写实
          required: false
          type: select
          variable: global_style
        - label: 角色信息列表
          max_length: 4800000
          options: []
          required: false
          type: paragraph
          variable: all_actors_text
        - allowed_file_extensions: []
          allowed_file_types:
          - image
          allowed_file_upload_methods:
          - local_file
          label: 角色垫图
          max_length: 6
          options: []
          required: false
          type: file-list
          variable: character_ref_image
        - label: 角色锚点描述
          max_length: 4800000
          options: []
          required: false
          type: paragraph
          variable: characterAncher
        - default: '16:9'
          label: 视频高宽比
          max_length: 48
          options:
          - '1:1'
          - '16:9'
          - '9:16'
          - '4:3'
          - '32:9'
          required: false
          type: select
          variable: video_aspect
        - label: 自动翻译的第二字幕语言
          max_length: 256
          options: []
          required: false
          type: text-input
          variable: translate_language
        - label: 高优先级自定义风格
          max_length: 4800000
          options: []
          required: false
          type: paragraph
          variable: custom_global_style
        - default: 否
          label: 忽略字幕
          max_length: 48
          options:
          - 是
          - 否
          required: false
          type: select
          variable: ignore_subtitle
        - label: 带时间戳文本
          max_length: 480000
          options: []
          required: false
          type: paragraph
          variable: timestamped_lines
      height: 349
      id: '1765354062480'
      position:
        x: -1145.2642840255203
        y: -1360.4570940737062
      positionAbsolute:
        x: -1145.2642840255203
        y: -1360.4570940737062
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
    - data:
        cases:
        - case_id: 'true'
          conditions:
          - comparison_operator: not empty
            id: 98962e8c-6978-4374-972e-cf33f7aa3348
            value: ''
            varType: string
            variable_selector:
            - '1765354062480'
            - content
          id: 'true'
          logical_operator: and
        desc: ''
        selected: false
        title: 条件分支 5
        type: if-else
      height: 125
      id: '1766557310716'
      position:
        x: 711.3244894650169
        y: -356.99609724310164
      positionAbsolute:
        x: 711.3244894650169
        y: -356.99609724310164
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
    - data:
        code: "function parseVideoAspect(video_aspect) {\n    var video_width = 2560;\n\
          \    var video_height = 1440;\n    if (video_aspect == \"1:1\") {\n    \
          \    video_width = 2048;\n        video_height = 2048;\n    } else if (video_aspect\
          \ == \"16:9\") {\n        video_width = 2560;\n        video_height = 1440;\n\
          \    } else if (video_aspect == \"9:16\") {\n        video_width = 1440;\n\
          \        video_height = 2560;\n    } else if (video_aspect == \"4:3\") {\n\
          \        video_width = 2304;\n        video_height = 1782;\n    } else if\
          \ (video_aspect == \"21:9\") {\n        video_width = 3024;\n        video_height\
          \ = 1296;\n    }\n    return {\n        video_width: video_width,\n    \
          \    video_height: video_height,\n        video_resolution: String(video_width)\
          \ + \"x\" + String(video_height),\n    }\n}\n/**\n * 拆分场景节点\n * 将剧本拆分成单个场景,用于循环调用优化节点\n\
          \ * \n * 输入:script2.json 格式的完整剧本\n * 输出:project_info + scenes 数组\n */\n\n\
          function main({  json3, json4, actors , video_aspect, json5}) {\n    const\
          \ data = json3 || json4 || json5;\n\n    const {\n        project_info =\
          \ {},\n        scenes = [],\n    } = data;\n\n    const {\n        video_width,\n\
          \        video_height,\n        video_resolution,\n    } = parseVideoAspect(video_aspect);\n\
          \n    // 提取项目信息\n    const projectInfo = {\n        title: project_info.title\
          \ || '',\n        global_style: project_info.global_style || '',\n     \
          \   actors: actors,\n        video_width: video_width,\n        video_height:\
          \ video_height,\n        video_aspect: video_aspect,\n    };\n\n    // 构建场景列表\n\
          \    const sceneList = scenes.map((scene) => ({\n        ...scene,\n   \
          \ }));\n\n    return {\n        // 项目信息(传递给每次循环)\n        projectInfo: projectInfo,\n\
          \        \n        // 场景列表(用于循环迭代)\n        scenes: sceneList,\n       \
          \ projectInfoStr: JSON.stringify(projectInfo),\n        video_width: video_width,\n\
          \        video_height: video_height,\n        video_resolution: video_resolution,\n\
          \    };\n}\n"
        code_language: javascript
        desc: ''
        outputs:
          projectInfo:
            children: null
            type: object
          projectInfoStr:
            children: null
            type: string
          scenes:
            children: null
            type: array[object]
          video_height:
            children: null
            type: number
          video_resolution:
            children: null
            type: string
          video_width:
            children: null
            type: number
        selected: false
        title: 统一场景基本信息
        type: code
        variables:
        - value_selector:
          - '1767513600761'
          - structured_output
          value_type: object
          variable: json3
        - value_selector:
          - '1768894989678'
          - structured_output
          value_type: object
          variable: json4
        - value_selector:
          - '1768803191521'
          - actors
          value_type: array[object]
          variable: actors
        - value_selector:
          - '1765354062480'
          - video_aspect
          value_type: string
          variable: video_aspect
        - value_selector:
          - '1773732078844'
          - structured_output
          value_type: object
          variable: json5
      height: 53
      id: '1766565906395'
      position:
        x: 350.66290517552244
        y: 73.42562567858332
      positionAbsolute:
        x: 350.66290517552244
        y: 73.42562567858332
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
    - data:
        desc: ''
        error_handle_mode: terminated
        height: 475
        is_parallel: true
        iterator_input_type: array[object]
        iterator_selector:
        - '1766565906395'
        - scenes
        output_selector:
        - '1766577709907'
        - result
        output_type: array[object]
        parallel_nums: 10
        selected: false
        start_node_id: 1766574059102start
        title: 生成场景图套件
        type: iteration
        width: 2619.1849501891425
      height: 475
      id: '1766574059102'
      position:
        x: -449.9746639053287
        y: 797.5655251175879
      positionAbsolute:
        x: -449.9746639053287
        y: 797.5655251175879
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 2619
      zIndex: 1
    - data:
        desc: ''
        isInIteration: true
        selected: false
        title: ''
        type: iteration-start
      draggable: false
      height: 48
      id: 1766574059102start
      parentId: '1766574059102'
      position:
        x: 24
        y: 68
      positionAbsolute:
        x: -425.9746639053287
        y: 865.5655251175879
      selectable: false
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom-iteration-start
      width: 44
      zIndex: 1002
    - data:
        code: "function getImageUrls(namesOrCharacters, objects) {\n  // 创建一个映射,便于快速查找\n\
          \  const objectMap = new Map();\n  objects.forEach(obj => {\n    objectMap.set(obj.name,\
          \ obj.image_url);\n  });\n  \n  // 统一处理:无论输入是字符串还是对象,都尝试提取name\n  const\
          \ imageUrls = namesOrCharacters.map(item => {\n    if (typeof item === 'string')\
          \ {\n      return objectMap.get(item);\n    } else if (item && typeof item\
          \ === 'object' && item.name) {\n      return objectMap.get(item.name);\n\
          \    }\n    return undefined;\n  });\n  \n  // 过滤掉未找到的项\n  const filteredUrls\
          \ = imageUrls.filter(url => url !== undefined);\n  \n  // 生成逗号拼接的字符串\n \
          \ const concatenatedString = filteredUrls.join(',');\n  \n  return {\n \
          \   urls: filteredUrls,\n    concatenatedString: concatenatedString\n  };\n\
          }\n\nfunction main({item, projectInfo}) {\n    const {\n        global_style,\n\
          \        actors\n    } = projectInfo\n\n    const scene = item\n\n    const\
          \ {urls, concatenatedString} = getImageUrls(scene.characters, actors)\n\n\
          \    return {\n        global_style: global_style,\n        id: String(scene.id),\n\
          \        narration:  scene.narration,\n        visual_description: scene.visual_description,\n\
          \        visual_prompt: scene.visual_prompt,\n        has_character: scene.has_character,\n\
          \n        actor_urls: urls,\n        concatenatedString: concatenatedString,\n\
          \    }\n}\n"
        code_language: javascript
        desc: ''
        isInIteration: true
        isInLoop: false
        iteration_id: '1766574059102'
        outputs:
          actor_urls:
            children: null
            type: array[string]
          concatenatedString:
            children: null
            type: string
          global_style:
            children: null
            type: string
          has_character:
            children: null
            type: number
          id:
            children: null
            type: string
          narration:
            children: null
            type: string
          visual_description:
            children: null
            type: string
          visual_prompt:
            children: null
            type: string
        selected: false
        title: 获取单个场景信息
        type: code
        variables:
        - value_selector:
          - '1766574059102'
          - item
          value_type: object
          variable: item
        - value_selector:
          - '1766565906395'
          - projectInfo
          value_type: object
          variable: projectInfo
      height: 53
      id: '1766574094213'
      parentId: '1766574059102'
      position:
        x: 91.56977576817872
        y: 70.76495918732974
      positionAbsolute:
        x: -358.40488813715
        y: 868.3304843049176
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
      zIndex: 1002
    - data:
        audio:
          configs:
            variable_selector: []
          enabled: false
        context:
          enabled: false
          variable_selector: []
        desc: ''
        isInIteration: true
        isInLoop: false
        iteration_id: '1766574059102'
        model:
          completion_params:
            json_schema: "{\n  \"type\": \"object\",\n  \"properties\": {\n    \"\
              id\": {\n      \"type\": \"number\"\n    },\n    \"optimized_prompt\"\
              : {\n      \"type\": \"string\"\n    },\n    \"include_character\":\
              \ {\n      \"type\": \"string\"\n    },\n    \"shot_type\": {\n    \
              \  \"type\": \"string\"\n    }\n  },\n  \"required\": [\n    \"id\"\
              ,\n    \"optimized_prompt\",\n    \"include_character\",\n    \"shot_type\"\
              \n  ],\n  \"additionalProperties\": false\n}"
            max_completion_tokens: 71472
            response_format: json_schema
          mode: chat
          name: gpt-5.1-2025-11-13
          provider: aict/ai_hub/ai_hub
        prompt_template:
        - id: 0c1f4242-e5ed-4c2c-90bd-928308de4023
          role: system
          text: "你是一位专业的 AI 绘图提示词工程师。将输入字段生成安全合规、时代绝对一致且【完美兼容角色参考图】的【英文】绘画提示词,并以严格\
            \ JSON 输出。\n\n---\n\n## 输入字段\n- id: {{#1766574094213.id#}}\n- narration:\
            \ {{#1766574094213.narration#}}\n- visual_description: {{#1766574094213.visual_description#}}\n\
            - current_visual_prompt: {{#1766574094213.visual_prompt#}}\n- has_character:\
            \ {{#1766574094213.has_character#}}\n- global_style: {{#1766574094213.global_style#}}\n\
            \n---\n\n## 核心安全与遮蔽协议(最高优先级 - 零容忍)\n**目标:物理性地消除任何触发 NSFW 过滤器的可能性。**\n\n\
            1) **绝对禁止内容:**\n   - 色情、性暗示、裸体(包括真人、雕塑、绘画、人体模型)、露点、甚至“看起来像裸体”的肤色紧身衣。\n\
            \   - 暴力、血腥、非法、仇恨内容。\n\n2) **强制着装规则(Physical Clothing Layer):**\n   -\
            \ **真人角色:** 若 include_character=true:默认继承 current_visual_prompt 中已存在的服装设定,不得为了“安全”新增或改写为\
            \ heavy fabric / high-collar 等刻板模板。\n   - 仅当 narration/visual_description\
            \ 明确涉及裸露风险场景(洗澡/更衣/亲密/医疗检查等)时,才进行“安全改写”,改写方式优先为:改成 head-and-shoulders\
            \ close-up,或 POV of objects,或人物背影且穿着日常衣物;使用中性措辞:fully dressed / wearing\
            \ regular clothing。\n   - 禁止输出任何“免责声明式句子”(例如以 all visible people fully\
            \ clothed... 开头的固定模板句)。\n   - **雕塑/艺术品/背景人物:** 必须明确描述为“穿着衣服”或“抽象化”(如:draped\
            \ marble statue, abstract stone carving)。禁止使用 marble statue 等易误判词。\n\n\
            3) **敏感场景清洗(Sanitization):**\n   - 若涉及洗澡、更衣、睡觉、医疗:必须转为 wearing thick heavy\
            \ robe / full nightgown,或 head and shoulders close-up,或转为 POV of objects。严禁出现\
            \ bath, bed, skin, body 等词。\n\n4) **英文禁词库(清洗 optimized_prompt):**\n  \
            \ - 屏蔽:naked, nude, bare, breast, chest, cleavage, lingerie, underwear,\
            \ bikini, muscle, anatomy, flesh, sexy, seductive, bath, shower.\n   -\
            \ 替换为:wrapped in fabric, heavy coat, silhouette, modest.\n\n---\n\n##\
            \ 角色一致性保护协议(Character Consistency Protocol - 解决参考图失效的核心)\n**目标:防止文本提示词干扰下游的“图生图/角色参考图”节点,确保角色特征由参考图主导。**\n\
            \n1) **外貌极简原则 (Minimal Physical Description):** \n   - 严禁在 prompt 中详细描述角色的五官、发型、发色、瞳色、体型(例如禁止写\
            \ blonde hair, blue eyes, tall, beautiful face)。\n   - 仅使用基础代词或身份词(如 1girl,\
            \ 1boy, the man, the warrior, the protagonist)。将外貌定义权 100% 交给参考图。\n2)\
            \ **服装继承铁律 (Clothing Inheritance):**\n   - 如果 `current_visual_prompt`\
            \ 中已存在具体的服装描述,**必须原样保留**,绝对禁止为了“时代一致性”或“安全”强行覆盖或添加额外的服装补丁(如 traditional\
            \ robes),否则会破坏参考图的角色轮廓。\n   - 仅在 `current_visual_prompt` 完全没有提及服装,且场景需要时,才补充符合时代的服装。\n\
            \n---\n\n## 通用时代与语境一致性协议(Universal Era & Context Consistency)\n**目标:强制分离“渲染风格”与“物理内容”,确保画面所有物理元素100%忠于设定的时代,杜绝风格干扰导致的穿越。**\n\
            \n**Step A: 时代最高优先级侦测 (Absolute Era Priority)**\n- **最高权重:** 优先检查 `current_visual_prompt`\
            \ 中是否已存在具体的时代背景(如 ancient China, 1920s, medieval)。如果存在,**该时代设定具有绝对统治力**。\n\
            - **降级推断:** 仅当 `current_visual_prompt` 无明确时代时,才基于 `narration` 和 `visual_description`\
            \ 推断。\n- **风格解耦铁律:** `global_style`(如 Pixar, 3D, Cyberpunk render)**仅决定画面的笔触、光影、材质渲染方式,绝对不能改变人物的服饰、道具和建筑年代**。\n\
            \n**Step B: 元素强制对齐 (Element Alignment)**\n- **Props & Environment:** 提取时代后,所有道具和背景必须转换为该时代的专有物品。\n\
            \n**Step C: 时代错误清洗 (Anachronism Check)**\n- 剔除任何不属于确立时代的元素。例如时代为古代,严格删除\
            \ smartphone, modern street, t-shirt, jeans 等一切现代隐含词。\n\n---\n\n## 工作流与生成逻辑\n\
            \n**Step 1 — Shot Logic**\n仅基于 visual_description + current_visual_prompt\
            \ 判断 shot_type 与 include_character:\nA) 画面能看见人物本体(即使 has_character 为 0,只要描述中有人、人群、身体部位)\
            \ -> include_character = true\nB) 纯环境 / 主观镜头 (POV) / 仅手部特写 -> include_character\
            \ = false\n\n**Step 2 — 构建 optimized_prompt(英文一行,逗号分隔)**\n- optimized_prompt\
            \ 必须为一行英文,逗号分隔。\n\n**Path A — include_character: true**\n拼接顺序:\n1. Style:\
            \ `global_style`\n2. Era Lock: 确立的具体时代 (e.g., Ancient China era)\n3. Scene\
            \ & Environment: 从 `visual_description` 和 `current_visual_prompt` 提取的场景背景\n\
            4. Character & Action (极简原则): 基础角色词 (1girl/1boy/etc.) + 动作/状态。**切勿描述五官发型**。\n\
            5. Clothing Status: 仅继承 `current_visual_prompt` 中的原有服装;若无,则简写为穿着符合时代的衣物。**禁止使用\
            \ all visible people fully clothed in... 这种破坏性长句**。\n6. Props: 必须符合时代的道具\n\
            7. Composition & Lighting: 镜头类型,符合时代的灯光,cinematic composition, detailed\
            \ rendering, --ar\n\n**Path B — include_character: false**\n拼接顺序:\n1.\
            \ Style: `global_style`\n2. Era Lock: 确立的具体时代 (e.g., Ancient China era)\n\
            3. Perspective & Environment: POV shot / Environment shot, 加上符合该时代的建筑/道具/材质描述\n\
            4. 剔除一切人物锚点。\n5. Composition & Lighting: 同上\n\n**画中画/照片规则:** 不得使用任何角色锚点,画中画内容必须符合检测到的时代背景。\n\
            \n---\n\n## 输出格式(严格 JSON,仅输出 JSON)\n{\n  \"id\": \"输入时的id\",\n  \"optimized_prompt\"\
            : \"one-line English prompt...\",\n  \"include_character\": true/false,\n\
            \  \"shot_type\": \"Wide shot / Medium shot / POV shot ...\",\n  \"safety_note\"\
            : \"简述:检测到的时代背景、角色极简处理说明、防风格干扰的道具调整、以及安全清洗操作\"\n}"
        selected: false
        structured_output:
          schema:
            additionalProperties: false
            properties:
              id:
                type: number
              include_character:
                type: string
              optimized_prompt:
                type: string
              shot_type:
                type: string
            required:
            - id
            - optimized_prompt
            - include_character
            - shot_type
            type: object
        structured_output_enabled: true
        title: 文生图提示词生成
        type: llm
        variables: []
        video:
          configs:
            variable_selector: []
          enabled: false
        vision:
          enabled: false
      height: 121
      id: '1766574211446'
      parentId: '1766574059102'
      position:
        x: 98.42487140153776
        y: 174.68218124158102
      positionAbsolute:
        x: -351.54979250379097
        y: 972.2477063591689
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
      zIndex: 1002
    - data:
        desc: 使用垫图
        isInIteration: true
        isInLoop: false
        is_team_authorization: true
        iteration_id: '1766574059102'
        output_schema: null
        outputs:
        - type: any
          value_selector:
          - '1753035060851'
          - error
          variable: error_message
        - type: any
          value_selector:
          - '1753289226679'
          - url_list
          variable: url_list
        paramSchemas:
        - auto_generate: null
          default: doubao-seedream-4-0-250828
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 模型
            ja_JP: 模型
            pt_BR: 模型
            zh_Hans: 模型
          llm_description: ''
          max: null
          min: null
          name: model
          options:
          - icon: null
            label:
              en_US: doubao-seedream-4-0-250828
              ja_JP: doubao-seedream-4-0-250828
              pt_BR: doubao-seedream-4-0-250828
              zh_Hans: doubao-seedream-4-0-250828
            value: doubao-seedream-4-0-250828
          - icon: null
            label:
              en_US: doubao-seedream-4-5-251128
              ja_JP: doubao-seedream-4-5-251128
              pt_BR: doubao-seedream-4-5-251128
              zh_Hans: doubao-seedream-4-5-251128
            value: doubao-seedream-4-5-251128
          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: 提示词(建议不超过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: 2048x2048
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 宽高像素(默认值2048x2048,4.5版本不支持1K)
            ja_JP: 宽高像素(默认值2048x2048,4.5版本不支持1K)
            pt_BR: 宽高像素(默认值2048x2048,4.5版本不支持1K)
            zh_Hans: 宽高像素(默认值2048x2048,4.5版本不支持1K)
          llm_description: ''
          max: null
          min: null
          name: size
          options:
          - icon: null
            label:
              en_US: 1K
              ja_JP: 1K
              pt_BR: 1K
              zh_Hans: 1K
            value: 1K
          - icon: null
            label:
              en_US: 2K
              ja_JP: 2K
              pt_BR: 2K
              zh_Hans: 2K
            value: 2K
          - icon: null
            label:
              en_US: 4K
              ja_JP: 4K
              pt_BR: 4K
              zh_Hans: 4K
            value: 4K
          - icon: null
            label:
              en_US: 2048x2048
              ja_JP: 2048x2048
              pt_BR: 2048x2048
              zh_Hans: 2048x2048
            value: 2048x2048
          - icon: null
            label:
              en_US: 2304x1728
              ja_JP: 2304x1728
              pt_BR: 2304x1728
              zh_Hans: 2304x1728
            value: 2304x1728
          - icon: null
            label:
              en_US: 1728x2304
              ja_JP: 1728x2304
              pt_BR: 1728x2304
              zh_Hans: 1728x2304
            value: 1728x2304
          - icon: null
            label:
              en_US: 2560x1440
              ja_JP: 2560x1440
              pt_BR: 2560x1440
              zh_Hans: 2560x1440
            value: 2560x1440
          - icon: null
            label:
              en_US: 1440x2560
              ja_JP: 1440x2560
              pt_BR: 1440x2560
              zh_Hans: 1440x2560
            value: 1440x2560
          - icon: null
            label:
              en_US: 2496x1664
              ja_JP: 2496x1664
              pt_BR: 2496x1664
              zh_Hans: 2496x1664
            value: 2496x1664
          - icon: null
            label:
              en_US: 1664x2496
              ja_JP: 1664x2496
              pt_BR: 1664x2496
              zh_Hans: 1664x2496
            value: 1664x2496
          - icon: null
            label:
              en_US: 3024x1296
              ja_JP: 3024x1296
              pt_BR: 3024x1296
              zh_Hans: 3024x1296
            value: 3024x1296
          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: 自定义像素(取值范围:4.5[2560x1440, 4096x4096],4.0[1280x720, 4096x4096],优先级高于宽高像素)
            ja_JP: 自定义像素(取值范围:4.5[2560x1440, 4096x4096],4.0[1280x720, 4096x4096],优先级高于宽高像素)
            pt_BR: 自定义像素(取值范围:4.5[2560x1440, 4096x4096],4.0[1280x720, 4096x4096],优先级高于宽高像素)
            zh_Hans: 自定义像素(取值范围:4.5[2560x1440, 4096x4096],4.0[1280x720, 4096x4096],优先级高于宽高像素)
          llm_description: ''
          max: null
          min: null
          name: custom_size
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: false
          scope: null
          template: null
          type: string
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 是否关闭组图功能(默认disabled)
            ja_JP: 是否关闭组图功能(默认disabled)
            pt_BR: 是否关闭组图功能(默认disabled)
            zh_Hans: 是否关闭组图功能(默认disabled)
          llm_description: ''
          max: null
          min: null
          name: sequential_image_generation
          options:
          - icon: null
            label:
              en_US: auto
              ja_JP: auto
              pt_BR: auto
              zh_Hans: auto
            value: auto
          - icon: null
            label:
              en_US: disabled
              ja_JP: disabled
              pt_BR: disabled
              zh_Hans: disabled
            value: disabled
          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: 最大生成数量(仅当组图功能为auto时设置,范围[1,15],默认值1)
            ja_JP: 最大生成数量(仅当组图功能为auto时设置,范围[1,15],默认值1)
            pt_BR: 最大生成数量(仅当组图功能为auto时设置,范围[1,15],默认值1)
            zh_Hans: 最大生成数量(仅当组图功能为auto时设置,范围[1,15],默认值1)
          llm_description: ''
          max: null
          min: null
          name: max_images
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: false
          scope: null
          template: null
          type: number
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 原始图片(图片格式:jpeg、png、webp、gif)
            ja_JP: 原始图片(图片格式:jpeg、png、webp、gif)
            pt_BR: 原始图片(图片格式:jpeg、png、webp、gif)
            zh_Hans: 原始图片(图片格式:jpeg、png、webp、gif)
          llm_description: ''
          max: null
          min: null
          name: images
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: false
          scope: null
          template: null
          type: files
        - auto_generate: null
          default: null
          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: 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
        params:
          custom_size: ''
          images: ''
          max_images: ''
          model: ''
          prompt: ''
          sequential_image_generation: ''
          size: ''
          watermark: ''
        provider_id: 22632cc7-732a-4b68-94e7-5be7e1b48ba9
        provider_name: 即梦-文/图生图-4.x版本
        provider_type: workflow
        retry_config:
          max_retries: 3
          retry_enabled: true
          retry_interval: 1000
        selected: false
        title: 即梦-文/图生图-4.x版本-垫图
        tool_configurations: {}
        tool_description: 即梦-文/图生图-4.x版本
        tool_label: 即梦-文/图生图-4.x版本
        tool_name: seedream_i2i_t2i_tool
        tool_node_version: '2'
        tool_parameters:
          custom_size:
            type: mixed
            value: null
          images:
            type: variable
            value:
            - '1768915366540'
            - download_files
          max_images:
            type: constant
            value: null
          model:
            type: constant
            value: doubao-seedream-4-5-251128
          prompt:
            type: mixed
            value: '{{#1766574211446.structured_output.optimized_prompt#}}'
          sequential_image_generation:
            type: constant
            value: auto
          size:
            type: variable
            value:
            - '1766565906395'
            - video_resolution
          watermark:
            type: constant
            value: 'false'
        type: tool
      height: 162
      id: '1766574707339'
      parentId: '1766574059102'
      position:
        x: 1468.4944261537582
        y: 75.56272384531894
      positionAbsolute:
        x: 1018.5197622484295
        y: 873.1282489629068
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
      zIndex: 1002
    - data:
        desc: ''
        outputs:
        - value_selector:
          - '1769069698077'
          - draft_url
          value_type: string
          variable: draft_url
        - value_selector:
          - '1769069698077'
          - export_video_url
          value_type: string
          variable: export_video_url
        - value_selector:
          - '1769069698077'
          - script_url
          value_type: string
          variable: script_url
        - value_selector:
          - '1768987193454'
          - project_info
          value_type: object
          variable: project_info
        - value_selector:
          - '1768987193454'
          - storyboard
          value_type: array[object]
          variable: storyboard
        - value_selector:
          - '1765354062480'
          - video_aspect
          value_type: string
          variable: video_aspect
        - value_selector:
          - '1765354062480'
          - translate_language
          value_type: string
          variable: translate_language
        selected: false
        title: 结束 3
        type: end
      height: 245
      id: '1766575021174'
      position:
        x: 281.78842816109204
        y: 3629.334894185703
      positionAbsolute:
        x: 281.78842816109204
        y: 3629.334894185703
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
    - data:
        code: "\nfunction main({json, json1}) {\n    var url = \"\"\n    if (json\
          \ != null) {\n        url = json[0].url_list[0]\n    } else {\n        url\
          \ = json1[0].url_list[0]\n    }\n    \n    return {\n        result: url\n\
          \    }\n}\n"
        code_language: javascript
        desc: ''
        isInIteration: true
        isInLoop: false
        iteration_id: '1766574059102'
        outputs:
          result:
            children: null
            type: string
        selected: false
        title: 提取图片地址
        type: code
        variables:
        - value_selector:
          - '1766574707339'
          - json
          value_type: array[object]
          variable: json
        - value_selector:
          - '1767711018753'
          - json
          value_type: array[object]
          variable: json1
      height: 53
      id: '1766577511976'
      parentId: '1766574059102'
      position:
        x: 2021.8588859988195
        y: 170.56933838022474
      positionAbsolute:
        x: 1571.8842220934907
        y: 968.1348634978126
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
      zIndex: 1002
    - data:
        desc: ''
        isInIteration: true
        isInLoop: false
        is_team_authorization: true
        iteration_id: '1766574059102'
        output_schema: null
        outputs:
        - type: string
          value_selector:
          - '1760867387289'
          - url
          variable: url
        paramSchemas:
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 资源地址
            ja_JP: 资源地址
            pt_BR: 资源地址
            zh_Hans: 资源地址
          llm_description: ''
          max: null
          min: null
          name: url
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: true
          scope: null
          template: null
          type: string
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 资源类型
            ja_JP: 资源类型
            pt_BR: 资源类型
            zh_Hans: 资源类型
          llm_description: ''
          max: null
          min: null
          name: type
          options:
          - icon: null
            label:
              en_US: jpg/image
              ja_JP: jpg/image
              pt_BR: jpg/image
              zh_Hans: jpg/image
            value: jpg/image
          - icon: null
            label:
              en_US: mp4/video
              ja_JP: mp4/video
              pt_BR: mp4/video
              zh_Hans: mp4/video
            value: mp4/video
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: true
          scope: null
          template: null
          type: select
        params:
          type: ''
          url: ''
        provider_id: 8e9ef31b-83d5-4a5a-a717-1e7d86250a62
        provider_name: AI课件-资源转存
        provider_type: workflow
        selected: false
        title: AI课件-资源转存
        tool_configurations: {}
        tool_description: 把外网的资源转存的ndr上
        tool_label: AI课件-资源转存
        tool_name: aic_resource_storage
        tool_node_version: '2'
        tool_parameters:
          isCdn:
            type: constant
            value: 否
          type:
            type: constant
            value: jpg/image
          url:
            type: mixed
            value: '{{#1766577511976.result#}}'
        type: tool
      height: 93
      id: '1766577671094'
      parentId: '1766574059102'
      position:
        x: 2359.1849501891425
        y: 83.09452933769182
      positionAbsolute:
        x: 1909.2102862838137
        y: 880.6600544552797
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
      zIndex: 1002
    - data:
        code: "\nfunction main({item, url, structured_output, actor_urls}) {\n   \
          \ const newItem = {\n        ...item,\n        image_url: url,\n       \
          \ ...structured_output,\n        actor_urls: actor_urls,\n    }\n    return\
          \ {\n        result: newItem\n    }\n}\n"
        code_language: javascript
        desc: ''
        isInIteration: true
        isInLoop: false
        iteration_id: '1766574059102'
        outputs:
          result:
            children: null
            type: object
        selected: false
        title: 装配场景信息
        type: code
        variables:
        - value_selector:
          - '1766574059102'
          - item
          value_type: object
          variable: item
        - value_selector:
          - '1766577671094'
          - url
          value_type: string
          variable: url
        - value_selector:
          - '1766574211446'
          - structured_output
          value_type: object
          variable: structured_output
        - value_selector:
          - '1766574094213'
          - actor_urls
          value_type: array[string]
          variable: actor_urls
      height: 53
      id: '1766577709907'
      parentId: '1766574059102'
      position:
        x: 2313.6465314750703
        y: 291.85849659907933
      positionAbsolute:
        x: 1863.6718675697416
        y: 1089.424021716667
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
      zIndex: 1002
    - data:
        desc: ''
        error_handle_mode: terminated
        height: 529
        is_parallel: true
        iterator_input_type: array[object]
        iterator_selector:
        - '1766574059102'
        - output
        output_selector:
        - '1766580740909'
        - result
        output_type: array[object]
        parallel_nums: 10
        selected: false
        start_node_id: 1766579168310start
        title: 生成 tts 套件
        type: iteration
        width: 1786.184379480382
      height: 529
      id: '1766579168310'
      position:
        x: -1055.3167020451433
        y: 1440.7653726068438
      positionAbsolute:
        x: -1055.3167020451433
        y: 1440.7653726068438
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 1786
      zIndex: 1
    - data:
        desc: ''
        isInIteration: true
        selected: false
        title: ''
        type: iteration-start
      draggable: false
      height: 48
      id: 1766579168310start
      parentId: '1766579168310'
      position:
        x: 24
        y: 68
      positionAbsolute:
        x: -1031.3167020451433
        y: 1508.7653726068438
      selectable: false
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom-iteration-start
      width: 44
      zIndex: 1002
    - data:
        code: "/**\n * 根据一组名字或角色对象,从给定对象列表中找到第一个匹配的 voice 信息\n * @param {Array<string|{name:\
          \ string}>} namesOrCharacters - 名字字符串或包含 name 属性的对象\n * @param {Array<{name:\
          \ string, voiceid: string, actor_voice_source: string, actor_voice_type?:\
          \ string}>} objects - 源对象列表\n * @returns {{voiceid: string, actor_voice_source:\
          \ string, actor_voice_type: string} | null} 匹配到的 voice 信息,没有则返回 fallback\n\
          \ */\nfunction getVoiceSource(namesOrCharacters, objects) {\n  const fallback\
          \ = {\n    voiceid: \"任运\",\n    actor_voice_source: \"NDTTS\",\n    actor_voice_type:\
          \ \"\",\n  };\n  \n  // 参数校验\n  if (!Array.isArray(namesOrCharacters) ||\
          \ namesOrCharacters.length === 0) {\n    return fallback;\n  }\n  if (!Array.isArray(objects)\
          \ || objects.length === 0) {\n    return fallback;\n  }\n\n  // 创建 name\
          \ -> 对象 的映射\n  const objectMap = new Map();\n  for (const obj of objects)\
          \ {\n    if (obj && typeof obj === 'object' && obj.name) {\n      objectMap.set(obj.name,\
          \ obj);\n    }\n  }\n\n  // 按顺序尝试匹配 namesOrCharacters 中的每一项\n  for (const\
          \ item of namesOrCharacters) {\n    let nameKey;\n\n    if (typeof item\
          \ === 'string') {\n      nameKey = item;\n    } else if (item && typeof\
          \ item === 'object' && item.name) {\n      nameKey = item.name;\n    }\n\
          \n    if (!nameKey) continue;\n\n    const voiceObj = objectMap.get(nameKey);\n\
          \    if (voiceObj && voiceObj.voiceid && voiceObj.actor_voice_source) {\n\
          \      return {\n        voiceid: voiceObj.voiceid,\n        actor_voice_source:\
          \ voiceObj.actor_voice_source,\n        actor_voice_type: voiceObj.actor_voice_type\
          \ || voiceObj.voiceid || \"\", // 确保有默认值\n      };\n    }\n  }\n\n  // 没有任何匹配\n\
          \  return fallback;\n}\n\nfunction main({item, actors}) {\n  const narrator_name\
          \ = item.narrator_name || \"\";\n  let charactersToSearch;\n  \n  if (narrator_name\
          \ !== \"\") {\n    charactersToSearch = [narrator_name];\n  } else {\n \
          \   charactersToSearch = item.characters || [];\n  }\n  \n  const actor\
          \ = getVoiceSource(charactersToSearch, actors);\n  \n  return {\n    voiceid:\
          \ actor.voiceid,\n    actor_voice_source: actor.actor_voice_source,\n  \
          \  actor_voice_type: actor.actor_voice_type,\n    result: item.narration\
          \ || \"\",\n    narrator_name: narrator_name,\n  };\n}"
        code_language: javascript
        desc: ''
        isInIteration: true
        isInLoop: false
        iteration_id: '1766579168310'
        outputs:
          actor_voice_source:
            children: null
            type: string
          actor_voice_type:
            children: null
            type: string
          narrator_name:
            children: null
            type: string
          result:
            children: null
            type: string
          voiceid:
            children: null
            type: string
        selected: false
        title: 获取单个 tts场景信息
        type: code
        variables:
        - value_selector:
          - '1766579168310'
          - item
          value_type: object
          variable: item
        - value_selector:
          - '1768803191521'
          - actors
          value_type: array[object]
          variable: actors
      height: 53
      id: '1766579221158'
      parentId: '1766579168310'
      position:
        x: 120.04463516245073
        y: 65.63570812996068
      positionAbsolute:
        x: -935.2720668826926
        y: 1506.4010807368045
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
      zIndex: 1002
    - data:
        desc: ''
        isInIteration: true
        isInLoop: false
        is_team_authorization: true
        iteration_id: '1766579168310'
        output_schema: null
        outputs:
        - type: any
          value_selector:
          - '1753035060851'
          - error
          variable: error_message
        - type: any
          value_selector:
          - '1753289226679'
          - url
          variable: url
        - type: any
          value_selector:
          - '1753289226679'
          - duration
          value_type: string
          variable: duration
        paramSchemas:
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 文本(长度不超过300)
            ja_JP: 文本(长度不超过300)
            pt_BR: 文本(长度不超过300)
            zh_Hans: 文本(长度不超过300)
          llm_description: ''
          max: null
          min: null
          name: text
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: true
          scope: null
          template: null
          type: string
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 发音人
            ja_JP: 发音人
            pt_BR: 发音人
            zh_Hans: 发音人
          llm_description: ''
          max: null
          min: null
          name: speaker
          options:
          - icon: null
            label:
              en_US: 儿童绘本
              ja_JP: 儿童绘本
              pt_BR: 儿童绘本
              zh_Hans: 儿童绘本
            value: 儿童绘本
          - icon: null
            label:
              en_US: vivi
              ja_JP: vivi
              pt_BR: vivi
              zh_Hans: vivi
            value: vivi
          - icon: null
            label:
              en_US: 大壹
              ja_JP: 大壹
              pt_BR: 大壹
              zh_Hans: 大壹
            value: 大壹
          - icon: null
            label:
              en_US: 黑猫侦探社咪仔
              ja_JP: 黑猫侦探社咪仔
              pt_BR: 黑猫侦探社咪仔
              zh_Hans: 黑猫侦探社咪仔
            value: 黑猫侦探社咪仔
          - icon: null
            label:
              en_US: 鸡汤女
              ja_JP: 鸡汤女
              pt_BR: 鸡汤女
              zh_Hans: 鸡汤女
            value: 鸡汤女
          - icon: null
            label:
              en_US: 魅力女友
              ja_JP: 魅力女友
              pt_BR: 魅力女友
              zh_Hans: 魅力女友
            value: 魅力女友
          - icon: null
            label:
              en_US: 流畅女声
              ja_JP: 流畅女声
              pt_BR: 流畅女声
              zh_Hans: 流畅女声
            value: 流畅女声
          - icon: null
            label:
              en_US: 儒雅逸辰
              ja_JP: 儒雅逸辰
              pt_BR: 儒雅逸辰
              zh_Hans: 儒雅逸辰
            value: 儒雅逸辰
          - icon: null
            label:
              en_US: 小何
              ja_JP: 小何
              pt_BR: 小何
              zh_Hans: 小何
            value: 小何
          - icon: null
            label:
              en_US: 云舟
              ja_JP: 云舟
              pt_BR: 云舟
              zh_Hans: 云舟
            value: 云舟
          - icon: null
            label:
              en_US: 小天
              ja_JP: 小天
              pt_BR: 小天
              zh_Hans: 小天
            value: 小天
          - icon: null
            label:
              en_US: 可爱女生
              ja_JP: 可爱女生
              pt_BR: 可爱女生
              zh_Hans: 可爱女生
            value: 可爱女生
          - icon: null
            label:
              en_US: 调皮公主
              ja_JP: 调皮公主
              pt_BR: 调皮公主
              zh_Hans: 调皮公主
            value: 调皮公主
          - icon: null
            label:
              en_US: 爽朗少年
              ja_JP: 爽朗少年
              pt_BR: 爽朗少年
              zh_Hans: 爽朗少年
            value: 爽朗少年
          - icon: null
            label:
              en_US: 天才同桌
              ja_JP: 天才同桌
              pt_BR: 天才同桌
              zh_Hans: 天才同桌
            value: 天才同桌
          - icon: null
            label:
              en_US: 知性灿灿
              ja_JP: 知性灿灿
              pt_BR: 知性灿灿
              zh_Hans: 知性灿灿
            value: 知性灿灿
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: true
          scope: null
          template: null
          type: select
        - auto_generate: null
          default: mp3
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 音频格式
            ja_JP: 音频格式
            pt_BR: 音频格式
            zh_Hans: 音频格式
          llm_description: ''
          max: null
          min: null
          name: audio_params_format
          options:
          - icon: null
            label:
              en_US: mp3
              ja_JP: mp3
              pt_BR: mp3
              zh_Hans: mp3
            value: mp3
          - icon: null
            label:
              en_US: ogg_opus
              ja_JP: ogg_opus
              pt_BR: ogg_opus
              zh_Hans: ogg_opus
            value: ogg_opus
          - icon: null
            label:
              en_US: pcm
              ja_JP: pcm
              pt_BR: pcm
              zh_Hans: pcm
            value: pcm
          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: 语速 取值范围[-50,100](100代表2.0倍速,-50代表0.5倍数)
            ja_JP: 语速 取值范围[-50,100](100代表2.0倍速,-50代表0.5倍数)
            pt_BR: 语速 取值范围[-50,100](100代表2.0倍速,-50代表0.5倍数)
            zh_Hans: 语速 取值范围[-50,100](100代表2.0倍速,-50代表0.5倍数)
          llm_description: ''
          max: null
          min: null
          name: audio_params_speech_rate
          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: enable_language_detector
          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
        params:
          audio_params_format: ''
          audio_params_speech_rate: ''
          enable_language_detector: ''
          speaker: ''
          text: ''
        provider_id: e2b4769f-5a09-444b-9066-5f4ca9967cc9
        provider_name: 豆包TTS语音合成
        provider_type: workflow
        selected: false
        title: 豆包TTS语音合成
        tool_configurations: {}
        tool_description: 豆包TTS语音合成
        tool_label: 豆包TTS语音合成
        tool_name: seed_gen_audio
        tool_node_version: '2'
        tool_parameters:
          audio_params_format:
            type: constant
            value: mp3
          audio_params_speech_rate:
            type: constant
            value: null
          enable_language_detector:
            type: constant
            value: 'true'
          speaker:
            type: variable
            value:
            - '1766579221158'
            - actor_voice_type
          text:
            type: mixed
            value: '{{#1766579221158.result#}}'
        type: tool
      height: 93
      id: '1766579307542'
      parentId: '1766579168310'
      position:
        x: 1173.1992879026402
        y: 75.93045507304487
      positionAbsolute:
        x: 117.8825858574969
        y: 1516.6958276798887
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
      zIndex: 1002
    - data:
        code: "\n\n\n/**\n * 将浮点型字符串转换为向上取整的整数字符串\n * @param {string} floatStr - 浮点型字符串,如\
          \ \"3.14\"、\"5.7\"、\"-2.3\"\n * @returns {string} 向上取整后的整数字符串\n * @throws\
          \ {Error} 如果输入不是有效的数字字符串\n */\nfunction ceilFloatString(floatStr) {\n  //\
          \ 1. 验证输入是否为字符串\n  if (typeof floatStr !== 'string') {\n    throw new Error('输入必须是字符串类型');\n\
          \  }\n  \n  // 2. 去除前后空格\n  const trimmedStr = floatStr.trim();\n  \n  //\
          \ 3. 验证是否为有效数字\n  if (trimmedStr === '' || isNaN(trimmedStr) || trimmedStr\
          \ === ' ') {\n    throw new Error(`无效的数字字符串: \"${floatStr}\"`);\n  }\n \
          \ \n  // 4. 使用 Math.ceil 向上取整\n  const num = parseFloat(trimmedStr);\n \
          \ const result = Math.ceil(num);\n  \n  // 5. 返回整数字符串\n  return result.toString();\n\
          }\n\nfunction parseDoubaoTTS(json) {\n  if (json == null) {\n    return\
          \ null;\n  }\n    const audioUrl = json[0].url\n    const duration = json[0].duration\n\
          \    const ceilDuration = ceilFloatString(duration)\n    return {\n    \
          \  duration: duration,\n      ceilDuration: ceilDuration,\n      audioUrl:\
          \ audioUrl\n    }\n}\n\n\nfunction parseNdAudioText(nd_json) {\n  if (nd_json\
          \ == null) {\n    return null;\n  }\n  const json = JSON.parse(nd_json[0].result);\n\
          \  const url = json.data.down_audio;\n  const duration = json.data.audio_duration;\n\
          \  const ceilDuration = Math.ceil(duration);\n  return {\n    duration:\
          \ duration.toString(),\n    ceilDuration: ceilDuration.toString(),\n   \
          \ audioUrl: url\n  }\n}\n\nfunction main({nd_json, item, doubao_json, doubao_json1})\
          \ {\n    var audioResult = parseDoubaoTTS(doubao_json) || parseDoubaoTTS(doubao_json1)\
          \ || parseNdAudioText(nd_json);\n\n    audioResult.audioUrl = audioResult.audioUrl.replace('gcdncs.101.com',\
          \ 'cs.101.com').replace('cdncs.101.com', 'cs.101.com');\n\n    const newItem\
          \ = {\n        ...item,\n        ...audioResult\n    }\n    return {\n \
          \       result: newItem\n    }\n}\n"
        code_language: javascript
        desc: ''
        isInIteration: true
        isInLoop: false
        iteration_id: '1766579168310'
        outputs:
          result:
            children: null
            type: object
        selected: false
        title: 装配 tts 资源到场景
        type: code
        variables:
        - value_selector:
          - '1767168888271'
          - json
          value_type: array[object]
          variable: nd_json
        - value_selector:
          - '1766579168310'
          - item
          value_type: object
          variable: item
        - value_selector:
          - '1766579307542'
          - json
          value_type: array[object]
          variable: doubao_json
        - value_selector:
          - '1769510509007'
          - json
          value_type: array[object]
          variable: doubao_json1
      height: 53
      id: '1766580740909'
      parentId: '1766579168310'
      position:
        x: 1526.184379480382
        y: 243.35733020189218
      positionAbsolute:
        x: 470.86767743523865
        y: 1684.122702808736
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
      zIndex: 1002
    - data:
        desc: ''
        error_handle_mode: terminated
        height: 363
        is_parallel: true
        iterator_input_type: array[object]
        iterator_selector:
        - '1766579168310'
        - output
        output_selector:
        - '1766632617565'
        - result
        output_type: array[object]
        parallel_nums: 10
        selected: false
        start_node_id: 1766631985311start
        title: 图生视频提示词优化套件
        type: iteration
        width: 1085
      height: 363
      id: '1766631985311'
      position:
        x: -449.9746639053287
        y: 2187.9127466193163
      positionAbsolute:
        x: -449.9746639053287
        y: 2187.9127466193163
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 1085
      zIndex: 1
    - data:
        desc: ''
        isInIteration: true
        selected: false
        title: ''
        type: iteration-start
      draggable: false
      height: 48
      id: 1766631985311start
      parentId: '1766631985311'
      position:
        x: 24
        y: 68
      positionAbsolute:
        x: -425.9746639053287
        y: 2255.9127466193163
      selectable: false
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom-iteration-start
      width: 44
      zIndex: 1002
    - data:
        code: "\nfunction main({item}) {\n    const output = {\n        id: item.id,\n\
          \        narration: item.narration,\n        visual_description: item.visual_description,\n\
          \        visual_prompt: item.visual_prompt,\n        include_character:\
          \ item.include_character\n    }\n    const json = JSON.stringify(output);\n\
          \    return {\n        result: json\n    }\n}\n"
        code_language: javascript
        desc: ''
        isInIteration: true
        isInLoop: false
        iteration_id: '1766631985311'
        outputs:
          result:
            children: null
            type: string
        selected: false
        title: 提取场景信息
        type: code
        variables:
        - value_selector:
          - '1766631985311'
          - item
          value_type: object
          variable: item
      height: 53
      id: '1766632013010'
      parentId: '1766631985311'
      position:
        x: 124.93643624831634
        y: 113.35811064773111
      positionAbsolute:
        x: -325.0382276570124
        y: 2301.270857267047
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
      zIndex: 1002
    - data:
        audio:
          configs:
            variable_selector: []
          enabled: false
        context:
          enabled: false
          variable_selector: []
        desc: ''
        isInIteration: true
        isInLoop: false
        iteration_id: '1766631985311'
        model:
          completion_params:
            json_schema: "{\n  \"type\": \"object\",\n  \"properties\": {\n    \"\
              id\": {\n      \"type\": \"number\"\n    },\n    \"motion_prompt\":\
              \ {\n      \"type\": \"string\"\n    },\n    \"camera_movement\": {\n\
              \      \"type\": \"string\"\n    },\n    \"camera_movement_cn\": {\n\
              \      \"type\": \"string\"\n    },\n    \"motion_intensity\": {\n \
              \     \"type\": \"number\"\n    },\n    \"notes\": {\n      \"type\"\
              : \"string\"\n    }\n  },\n  \"required\": [\n    \"id\",\n    \"motion_prompt\"\
              ,\n    \"camera_movement\",\n    \"camera_movement_cn\",\n    \"motion_intensity\"\
              ,\n    \"notes\"\n  ],\n  \"additionalProperties\": false\n}"
            max_tokens: 32768
            response_format: json_schema
            thinking_type: enabled
          mode: chat
          name: doubao-seed-1-8-251228
          provider: aict/ai_hub/ai_hub
        prompt_template:
        - id: ba340605-d9d7-4c90-8e8a-1ab210345f63
          role: system
          text: "# 图生视频提示词优化\n\n\n你是一位专业的AI视频生成提示词工程师,擅长为即梦(Jimeng)等图生视频模型编写高质量的运动提示词。\n\
            \n\n## 任务\n根据场景信息和已生成的静态图片,为每个场景生成优化的图生视频提示词,使静态图片转化为具有电影感的动态视频。\n\n\n\
            ## 即梦提示词结构(必须遵守)\n\n\n```\n[运镜] + [主体微动] + [氛围特效]\n```\n\n\n### 1. 运镜类型\
            \ (Camera Movement)\n\n\n| 运镜 | 英文 | 适用场景 | 示例 |\n|------|------|----------|------|\n\
            | 推进 | Zoom In / Dolly Forward | 聚焦人物、强调细节、开篇引入 | `Slow cinematic zoom\
            \ in` |\n| 拉远 | Zoom Out | 展示全景、结尾收束、表现孤独 | `Slow zoom out` |\n| 左移 |\
            \ Pan Left | 场景扫描、追随动作 | `Cinematic pan left` |\n| 右移 | Pan Right | 场景扫描、时间流逝\
            \ | `Slow pan right` |\n| 上移 | Tilt Up | 仰视建筑、展示高度 | `Slow tilt up` |\n\
            | 下移 | Tilt Down | 俯视、从天到地 | `Slow tilt down` |\n| 跟随 | Tracking Shot\
            \ | 跟随人物移动 | `Tracking shot` |\n| 固定 | Static | 特写、静态氛围、专注感 | `Static\
            \ camera` |\n| 手持 | Handheld | 紧张感、不稳定、犹豫 | `Handheld camera movement`\
            \ |\n| 环绕 | Orbit | 360度展示主体 | `Slow orbit around subject` |\n\n\n###\
            \ 2. 主体微动 (Subject Motion)\n\n\n| 类型 | 适用对象 | 示例 |\n|------|----------|------|\n\
            | 人物微动 | 头部/眼睛 | `turns head slightly`, `subtle blinking`, `eyes focusing\
            \ sharply` |\n| 人物微动 | 身体 | `subtle body sway`, `breathing softly`, `shoulders\
            \ slumping` |\n| 人物微动 | 手部 | `hand moving rhythmically`, `small precise\
            \ movements` |\n| 人物静止 | 对比效果 | `remains perfectly still and stoic` |\n\
            | 环境微动 | 植物 | `tall grass blowing in the wind`, `leaves rustling gently`\
            \ |\n| 环境微动 | 织物 | `fabric fluttering slightly`, `tulle skirts moving`,\
            \ `curtains blowing gently` |\n| 环境微动 | 水面 | `sunlight shimmering on water\
            \ surface` |\n\n\n### 3. 氛围特效 (Atmosphere Effects)\n\n\n| 类型 | 示例 |\n\
            |------|------|\n| 光影变化 | `cinematic lighting changes`, `changing shadows`,\
            \ `light sweeping slowly` |\n| 丁达尔效应 | `dust particles floating in volumetric\
            \ light beams (Tyndall effect)` |\n| 尘埃粒子 | `dust motes dancing in the\
            \ light` |\n| 火焰光源 | `oil lamp flame flickering`, `warm gaslight flickering`\
            \ |\n| 蒸汽烟雾 | `steam rising gently` |\n| 天空云朵 | `clouds drifting quickly\
            \ across the sky` |\n| 动态光斑 | `dynamic light spots` |\n\n\n## 运镜选择规则\n\
            \n\n| 场景类型 | 推荐运镜 | 运动幅度 |\n|----------|----------|----------|\n| 开篇/引入\
            \ | Zoom In | 中等 (4-5) |\n| 人物特写 | Static / Slow Zoom | 极低 (2-3) |\n|\
            \ 全景展示 | Zoom Out / Pan | 中等 (4-5) |\n| 动作跟随 | Tracking | 中高 (5-6) |\n\
            | 对比反差 | Zoom Out | 低 (3-4) |\n| 紧张/犹豫 | Handheld | 低 (2-3) |\n| 静态画作\
            \ | Pan (仅运镜) | 极低 (2-3) |\n| 深夜/沉思 | Slow Zoom Out | 低 (3-4) |\n| 建筑/空间\
            \ | Tilt Up / Dolly | 中等 (4-5) |\n\n## 重要要求\n1. 绝对不能包含“黄政暴”相关内容\n2. 绝对不能包含裸体内容\n\
            \n## 输入信息\n\n\n### 项目信息\n```json\n{{#1766565906395.projectInfoStr#}}}\n\
            ```\n\n\n### 场景信息\n```json\n{{#1766632013010.result#}}}}\n```\n\n\n字段说明:\n\
            - `id`: 场景ID\n- `narration`: 旁白文案\n- `visual_description`: 视觉描述\n- `visual_prompt`:\
            \ 文生图提示词(已生成的静态图)\n- `include_character`: 是否包含主角\n\n\n## 输出格式\n\n\n```json\n\
            {\n  \"id\": 1,\n  \"motion_prompt\": \"完整的图生视频提示词(英文)\",\n  \"camera_movement\"\
            : \"运镜类型\",\n  \"camera_movement_cn\": \"运镜中文\",\n  \"motion_intensity\"\
            : \"1-10 运动幅度建议\",\n  \"notes\": \"特殊注意事项\"\n}\n```\n\n\n## 示例\n\n\n###\
            \ 输入\n```json\n{\n  \"id\": 5,\n  \"narration\": \"但在他们中间,德加显得格格不入。\"\
            ,\n  \"visual_description\": \"Medium shot of Degas standing apart from\
            \ the group of painters\",\n  \"include_character\": true\n}\n```\n\n\n\
            ### 输出\n```json\n{\n  \"id\": 5,\n  \"motion_prompt\": \"Slow zoom out,\
            \ Degas remains perfectly still and stoic, while background artists move\
            \ and paint busily, wind blowing clothes, contrast between stillness and\
            \ motion, cinematic atmosphere.\",\n  \"camera_movement\": \"Zoom Out\"\
            ,\n  \"camera_movement_cn\": \"拉远\",\n  \"motion_intensity\": 4,\n  \"\
            notes\": \"主角保持静止形成对比,背景人物有动作\"\n}\n```\n\n\n### 输入\n```json\n{\n  \"\
            id\": 11,\n  \"narration\": \"那时候的他,痴迷于像相机一样精准的画面。\",\n  \"visual_description\"\
            : \"Close-up of Degas' face with intense analytical gaze\",\n  \"include_character\"\
            : true\n}\n```\n\n\n### 输出\n```json\n{\n  \"id\": 11,\n  \"motion_prompt\"\
            : \"Extremely slow zoom in, subtle blinking, eyes focusing sharply, pupils\
            \ adjusting, micro-expressions, high fidelity, 8k detail.\",\n  \"camera_movement\"\
            : \"Zoom In\",\n  \"camera_movement_cn\": \"微推\",\n  \"motion_intensity\"\
            : 2,\n  \"notes\": \"特写镜头,运动幅度要极低,强调眼神细节\"\n}\n```\n\n\n## 重要提示\n\n\n\
            1. **英文输出**: 提示词必须使用英文,效果更精准\n2. **运动幅度**: 特写镜头用低幅度(2-3),全景用中等幅度(4-5)\n\
            3. **静态画作**: 如果是展示画作,画中人不要动,只用运镜和光影\n4. **对比效果**: 可以让主角静止、背景运动,形成反差\n\
            5. **氛围优先**: 每个场景至少包含一个氛围特效元素\n\n\n## 开始处理\n\n\n请根据以上规则,为输入的场景生成图生视频提示词。"
        selected: false
        structured_output:
          schema:
            additionalProperties: false
            properties:
              camera_movement:
                type: string
              camera_movement_cn:
                type: string
              id:
                type: number
              motion_intensity:
                type: number
              motion_prompt:
                type: string
              notes:
                type: string
            required:
            - id
            - motion_prompt
            - camera_movement
            - camera_movement_cn
            - motion_intensity
            - notes
            type: object
        structured_output_enabled: true
        title: 优化图生视频提示词
        type: llm
        variables: []
        video:
          configs:
            variable_selector: []
          enabled: false
        vision:
          enabled: false
      height: 121
      id: '1766632190094'
      parentId: '1766631985311'
      position:
        x: 432
        y: 116.42167439941477
      positionAbsolute:
        x: -17.974663905328725
        y: 2304.334421018731
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
      zIndex: 1002
    - data:
        code: "\nfunction main({ item,structured_output}) {\n    const newItem = {\n\
          \        ...item,\n        ...structured_output\n    }\n    return {\n \
          \       result: newItem\n    }\n}\n"
        code_language: javascript
        desc: ''
        isInIteration: true
        isInLoop: false
        iteration_id: '1766631985311'
        outputs:
          result:
            children: null
            type: object
        selected: false
        title: 装配图生视频提示词
        type: code
        variables:
        - value_selector:
          - '1766631985311'
          - item
          value_type: object
          variable: item
        - value_selector:
          - '1766632190094'
          - structured_output
          value_type: object
          variable: structured_output
      height: 53
      id: '1766632617565'
      parentId: '1766631985311'
      position:
        x: 736
        y: 116.42167439941477
      positionAbsolute:
        x: 286.0253360946713
        y: 2304.334421018731
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
      zIndex: 1002
    - data:
        desc: ''
        error_handle_mode: terminated
        height: 673.3417675072399
        is_parallel: true
        iterator_input_type: array[object]
        iterator_selector:
        - '1766631985311'
        - output
        output_selector:
        - '1766633797134'
        - result
        output_type: array[object]
        parallel_nums: 10
        selected: false
        start_node_id: 1766632760253start
        title: 生成视频片段套件
        type: iteration
        width: 1287.745744993265
      height: 673
      id: '1766632760253'
      position:
        x: -580.7089336491448
        y: 2688.509080781484
      positionAbsolute:
        x: -580.7089336491448
        y: 2688.509080781484
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 1288
      zIndex: 1
    - data:
        desc: ''
        isInIteration: true
        selected: false
        title: ''
        type: iteration-start
      draggable: false
      height: 48
      id: 1766632760253start
      parentId: '1766632760253'
      position:
        x: 24
        y: 68
      positionAbsolute:
        x: -556.7089336491448
        y: 2756.509080781484
      selectable: false
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom-iteration-start
      width: 44
      zIndex: 1002
    - data:
        code: "\n/**\n * 钳制数值到指定范围 [min, max]\n * @param {string} numStr - 字符串形式的整数\n\
          \ * @param {number} min - 最小值(默认1)\n * @param {number} max - 最大值(默认12)\n\
          \ * @returns {string} 钳制后的整数字符串\n */\nfunction clampNumberString(numStr,\
          \ min = 1, max = 12) {\n  // 1. 转换为数字\n  const num = parseInt(numStr, 10);\n\
          \  \n  // 2. 检查是否为有效数字\n  if (isNaN(num)) {\n    throw new Error(`无效的数字字符串:\
          \ \"${numStr}\"`);\n  }\n  \n  // 3. 钳制到范围\n  let clamped;\n  if (num <\
          \ min) {\n    clamped = min;\n  } else if (num > max) {\n    clamped = max;\n\
          \  } else {\n    clamped = num;\n  }\n  \n  // 4. 返回字符串\n  return clamped.toString();\n\
          }\n\nfunction safe_lip_sync(need_lip_sync) {\n  if (need_lip_sync == null\
          \ || need_lip_sync == \"\") {\n     return 0;\n  }\n  return Number(need_lip_sync);\n\
          }\n\nfunction main({item}) {\n   const duration = item.shot_duration ||\
          \ item.ceilDuration; // 根据时间戳计算的时长或 tts 时长\n    const ceilDuration = clampNumberString(duration)\n\
          \    return {\n        image_url: item.image_url,\n        motion_prompt:\
          \ item.motion_prompt,\n        ceilDuration: ceilDuration,\n        audioUrl:\
          \ item.audioUrl,\n        need_lip_sync: safe_lip_sync(item.need_lip_sync)\n\
          \    }\n}\n"
        code_language: javascript
        desc: ''
        isInIteration: true
        isInLoop: false
        iteration_id: '1766632760253'
        outputs:
          audioUrl:
            children: null
            type: string
          ceilDuration:
            children: null
            type: string
          image_url:
            children: null
            type: string
          motion_prompt:
            children: null
            type: string
          need_lip_sync:
            children: null
            type: number
        selected: false
        title: 获取图片地址和提示词和时长
        type: code
        variables:
        - value_selector:
          - '1766632760253'
          - item
          value_type: object
          variable: item
      height: 53
      id: '1766632810839'
      parentId: '1766632760253'
      position:
        x: 97.48292570624722
        y: 69
      positionAbsolute:
        x: -483.2260079428976
        y: 2757.509080781484
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
      zIndex: 1002
    - data:
        code: "\nfunction main({item, url, need_lip_sync, ceilDuration}) {\n    const\
          \ newItem = {\n        ...item,\n        videoUrl: url,\n        ceilDuration\
          \ : need_lip_sync == 1 ? item.duration : ceilDuration\n    }\n    return\
          \ {\n        result: newItem\n    }\n}\n"
        code_language: javascript
        desc: ''
        isInIteration: true
        isInLoop: false
        iteration_id: '1766632760253'
        outputs:
          result:
            children: null
            type: object
        selected: false
        title: 装配视频地址
        type: code
        variables:
        - value_selector:
          - '1766632760253'
          - item
          value_type: object
          variable: item
        - value_selector:
          - '1766637839537'
          - url
          value_type: string
          variable: url
        - value_selector:
          - '1766632810839'
          - need_lip_sync
          value_type: number
          variable: need_lip_sync
        - value_selector:
          - '1766632810839'
          - ceilDuration
          value_type: string
          variable: ceilDuration
      height: 53
      id: '1766633797134'
      parentId: '1766632760253'
      position:
        x: 984.2083309619272
        y: 476.9462551526485
      positionAbsolute:
        x: 403.49939731278243
        y: 3165.4553359341326
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
      zIndex: 1002
    - data:
        code: "\nfunction main({json, video_url}) {\n    const url = video_url ||\
          \ json[0].url\n    return {\n        url: url\n    }\n}\n"
        code_language: javascript
        desc: ''
        isInIteration: true
        isInLoop: false
        iteration_id: '1766632760253'
        outputs:
          url:
            children: null
            type: string
        selected: true
        title: 提取视频地址
        type: code
        variables:
        - value_selector:
          - '1779099074767'
          - json
          value_type: array[object]
          variable: json
        - value_selector:
          - '1767611826573'
          - video_url
          value_type: string
          variable: video_url
      height: 53
      id: '1766633846590'
      parentId: '1766632760253'
      position:
        x: 963.7536439523323
        y: 119.1536843003023
      positionAbsolute:
        x: 383.04471030318746
        y: 2807.6627650817863
      selected: true
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
      zIndex: 1002
    - data:
        desc: ''
        isInIteration: true
        isInLoop: false
        is_team_authorization: true
        iteration_id: '1766632760253'
        output_schema: null
        outputs:
        - type: string
          value_selector:
          - '1760867387289'
          - url
          variable: url
        paramSchemas:
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 资源地址
            ja_JP: 资源地址
            pt_BR: 资源地址
            zh_Hans: 资源地址
          llm_description: ''
          max: null
          min: null
          name: url
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: true
          scope: null
          template: null
          type: string
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 资源类型
            ja_JP: 资源类型
            pt_BR: 资源类型
            zh_Hans: 资源类型
          llm_description: ''
          max: null
          min: null
          name: type
          options:
          - icon: null
            label:
              en_US: jpg/image
              ja_JP: jpg/image
              pt_BR: jpg/image
              zh_Hans: jpg/image
            value: jpg/image
          - icon: null
            label:
              en_US: mp4/video
              ja_JP: mp4/video
              pt_BR: mp4/video
              zh_Hans: mp4/video
            value: mp4/video
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: true
          scope: null
          template: null
          type: select
        params:
          type: ''
          url: ''
        provider_id: 8e9ef31b-83d5-4a5a-a717-1e7d86250a62
        provider_name: AI课件-资源转存
        provider_type: workflow
        selected: false
        title: AI课件-资源转存
        tool_configurations: {}
        tool_description: 把外网的资源转存的ndr上
        tool_label: AI课件-资源转存
        tool_name: aic_resource_storage
        tool_node_version: '2'
        tool_parameters:
          isCdn:
            type: constant
            value: 否
          type:
            type: constant
            value: mp4/video
          url:
            type: mixed
            value: '{{#1766633846590.url#}}'
        type: tool
      height: 93
      id: '1766637839537'
      parentId: '1766632760253'
      position:
        x: 992.8140989630824
        y: 321.22335953774837
      positionAbsolute:
        x: 412.1051653139376
        y: 3009.7324403192324
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
      zIndex: 1002
    - data:
        authorization:
          config: null
          type: no-auth
        body:
          data: []
          type: none
        desc: ''
        headers: ''
        isInIteration: true
        isInLoop: false
        iteration_id: '1766632760253'
        method: get
        params: ''
        retry_config:
          max_retries: 3
          retry_enabled: true
          retry_interval: 100
        selected: false
        ssl_verify: true
        timeout:
          max_connect_timeout: 0
          max_read_timeout: 0
          max_write_timeout: 0
        title: 下载图片到文件
        type: http-request
        url: '{{#1766632810839.image_url#}}'
        variables: []
      height: 125
      id: '1766647889824'
      parentId: '1766632760253'
      position:
        x: 411.6661839955682
        y: 444.6083986192025
      positionAbsolute:
        x: -169.0427496535766
        y: 3133.1174794006865
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
      zIndex: 1002
    - data:
        cases:
        - case_id: 'true'
          conditions:
          - comparison_operator: contains
            id: 6b926b8e-52ff-4979-8c7a-c9b82c68bd27
            value: 豆包2.0
            varType: string
            variable_selector:
            - '1766579221158'
            - actor_voice_source
          id: 'true'
          logical_operator: and
        - case_id: c11347ba-0f2b-48c0-898e-6a88baa1a5cd
          conditions:
          - comparison_operator: contains
            id: 35d3a167-6dde-4781-a076-d00abc461888
            value: 豆包1.0
            varType: string
            variable_selector:
            - '1766579221158'
            - actor_voice_source
          id: c11347ba-0f2b-48c0-898e-6a88baa1a5cd
          logical_operator: and
        desc: ''
        isInIteration: true
        isInLoop: false
        iteration_id: '1766579168310'
        selected: false
        title: 条件分支 6
        type: if-else
      height: 173
      id: '1767168795046'
      parentId: '1766579168310'
      position:
        x: 812.9980375722414
        y: 159.8624892274313
      positionAbsolute:
        x: -242.3186644729019
        y: 1600.627861834275
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
      zIndex: 1002
    - data:
        desc: ''
        isInIteration: true
        isInLoop: false
        is_team_authorization: true
        iteration_id: '1766579168310'
        output_schema: null
        outputs:
        - type: string
          value_selector:
          - '1737085425314'
          - body
          variable: body
        - type: string
          value_selector:
          - '17370953178210'
          - body
          variable: result
        - type: string
          value_selector:
          - '1764819725877'
          - url
          value_type: string
          variable: audio_url
        paramSchemas:
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: 应用id
            ja_JP: 应用id
            pt_BR: 应用id
            zh_Hans: 应用id
          label:
            en_US: 应用ID
            ja_JP: 应用ID
            pt_BR: 应用ID
            zh_Hans: 应用ID
          llm_description: 应用id
          max: null
          min: null
          name: app_id
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: true
          scope: null
          template: null
          type: string
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: 应用密钥
            ja_JP: 应用密钥
            pt_BR: 应用密钥
            zh_Hans: 应用密钥
          label:
            en_US: 应用密钥
            ja_JP: 应用密钥
            pt_BR: 应用密钥
            zh_Hans: 应用密钥
          llm_description: 应用密钥
          max: null
          min: null
          name: app_key
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: true
          scope: null
          template: null
          type: string
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: 模型id
            ja_JP: 模型id
            pt_BR: 模型id
            zh_Hans: 模型id
          label:
            en_US: 声音模型编码
            ja_JP: 声音模型编码
            pt_BR: 声音模型编码
            zh_Hans: 声音模型编码
          llm_description: 模型id
          max: null
          min: null
          name: model
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: true
          scope: null
          template: null
          type: number
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: 参考音频id
            ja_JP: 参考音频id
            pt_BR: 参考音频id
            zh_Hans: 参考音频id
          label:
            en_US: 参考音频编号,需要和模型编码配套
            ja_JP: 参考音频编号,需要和模型编码配套
            pt_BR: 参考音频编号,需要和模型编码配套
            zh_Hans: 参考音频编号,需要和模型编码配套
          llm_description: 参考音频id
          max: null
          min: null
          name: ref_audio
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: true
          scope: null
          template: null
          type: number
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: 语言,可选
            ja_JP: 语言,可选
            pt_BR: 语言,可选
            zh_Hans: 语言,可选
          label:
            en_US: 生成语音的语言
            ja_JP: 生成语音的语言
            pt_BR: 生成语音的语言
            zh_Hans: 生成语音的语言
          llm_description: 语言,可选
          max: null
          min: null
          name: language
          options:
          - icon: null
            label:
              en_US: 中文
              ja_JP: 中文
              pt_BR: 中文
              zh_Hans: 中文
            value: 中文
          - icon: null
            label:
              en_US: 粤语
              ja_JP: 粤语
              pt_BR: 粤语
              zh_Hans: 粤语
            value: 粤语
          - icon: null
            label:
              en_US: 英文
              ja_JP: 英文
              pt_BR: 英文
              zh_Hans: 英文
            value: 英文
          - icon: null
            label:
              en_US: 日文
              ja_JP: 日文
              pt_BR: 日文
              zh_Hans: 日文
            value: 日文
          - icon: null
            label:
              en_US: 韩文
              ja_JP: 韩文
              pt_BR: 韩文
              zh_Hans: 韩文
            value: 韩文
          - icon: null
            label:
              en_US: 中英混合
              ja_JP: 中英混合
              pt_BR: 中英混合
              zh_Hans: 中英混合
            value: 中英混合
          - icon: null
            label:
              en_US: 粤英混合
              ja_JP: 粤英混合
              pt_BR: 粤英混合
              zh_Hans: 粤英混合
            value: 粤英混合
          - icon: null
            label:
              en_US: 日英混合
              ja_JP: 日英混合
              pt_BR: 日英混合
              zh_Hans: 日英混合
            value: 日英混合
          - icon: null
            label:
              en_US: 韩英混合
              ja_JP: 韩英混合
              pt_BR: 韩英混合
              zh_Hans: 韩英混合
            value: 韩英混合
          - icon: null
            label:
              en_US: 多语种混合
              ja_JP: 多语种混合
              pt_BR: 多语种混合
              zh_Hans: 多语种混合
            value: 多语种混合
          - icon: null
            label:
              en_US: 多语种混合(粤语)
              ja_JP: 多语种混合(粤语)
              pt_BR: 多语种混合(粤语)
              zh_Hans: 多语种混合(粤语)
            value: 多语种混合(粤语)
          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: ' 待转成语音的文本内容'
            ja_JP: ' 待转成语音的文本内容'
            pt_BR: ' 待转成语音的文本内容'
            zh_Hans: ' 待转成语音的文本内容'
          llm_description: 语音文本内容
          max: null
          min: null
          name: content
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: true
          scope: null
          template: null
          type: string
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: 语速,默认为1
            ja_JP: 语速,默认为1
            pt_BR: 语速,默认为1
            zh_Hans: 语速,默认为1
          label:
            en_US: 语速
            ja_JP: 语速
            pt_BR: 语速
            zh_Hans: 语速
          llm_description: 语速,默认为1
          max: null
          min: null
          name: speed
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: false
          scope: null
          template: null
          type: string
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: 其他参数,以json的格式输入
            ja_JP: 其他参数,以json的格式输入
            pt_BR: 其他参数,以json的格式输入
            zh_Hans: 其他参数,以json的格式输入
          label:
            en_US: 其他的参数,以Json的格式输入
            ja_JP: 其他的参数,以Json的格式输入
            pt_BR: 其他的参数,以Json的格式输入
            zh_Hans: 其他的参数,以Json的格式输入
          llm_description: 其他参数,以json的格式输入
          max: null
          min: null
          name: other_params
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: false
          scope: null
          template: null
          type: string
        params:
          app_id: ''
          app_key: ''
          content: ''
          language: ''
          model: ''
          other_params: ''
          ref_audio: ''
          speed: ''
        provider_id: 1dfe06b5-c6cc-4a8d-b92e-cc6b958c1a79
        provider_name: NDTTS-文本转语音(比如:任运)
        provider_type: workflow
        selected: false
        title: NDTTS-文本转语音(比如:任运)
        tool_configurations: {}
        tool_description: 按角色,比如:任运
        tool_label: NDTTS-文本转语音(比如:任运)
        tool_name: NDTTS
        tool_node_version: '2'
        tool_parameters:
          app_id:
            type: mixed
            value: D982E9D2
          app_key:
            type: mixed
            value: UqlJVIyN5r8Ws1c4
          content:
            type: mixed
            value: '{{#1766579221158.result#}}'
          language:
            type: constant
            value: 中文
          model:
            type: constant
            value: 10046
          other_params:
            type: mixed
            value: null
          ref_audio:
            type: constant
            value: 10174
          speed:
            type: mixed
            value: null
        type: tool
      height: 93
      id: '1767168888271'
      parentId: '1766579168310'
      position:
        x: 1163.0241159501666
        y: 396.0626615885328
      positionAbsolute:
        x: 107.70741390502326
        y: 1836.8280341953766
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
      zIndex: 1002
    - data:
        audio:
          configs:
            variable_selector: []
          enabled: false
        context:
          enabled: false
          variable_selector: []
        desc: ''
        model:
          completion_params:
            json_schema: "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\"\
              ,\n  \"title\": \"Art Project Schema\",\n  \"description\": \"Schema\
              \ for art project configuration with scenes\",\n  \"type\": \"object\"\
              ,\n  \"required\": [\n    \"project_info\",\n    \"scenes\"\n  ],\n\
              \  \"properties\": {\n    \"project_info\": {\n      \"type\": \"object\"\
              ,\n      \"description\": \"Project metadata and global settings\",\n\
              \      \"required\": [\n        \"title\",\n        \"global_style\"\
              \n      ],\n      \"properties\": {\n        \"title\": {\n        \
              \  \"type\": \"string\",\n          \"description\": \"Project title\"\
              ,\n          \"minLength\": 1\n        },\n        \"global_style\"\
              : {\n          \"type\": \"string\",\n          \"description\": \"\
              Global artistic style description\",\n          \"minLength\": 1\n \
              \       }\n      },\n      \"additionalProperties\": false\n    },\n\
              \    \"scenes\": {\n      \"type\": \"array\",\n      \"description\"\
              : \"List of scenes in the project\",\n      \"minItems\": 1,\n     \
              \ \"items\": {\n        \"type\": \"object\",\n        \"description\"\
              : \"Individual scene configuration\",\n        \"required\": [\n   \
              \       \"id\",\n          \"narration\",\n          \"target_narration\"\
              ,\n          \"visual_description\",\n          \"visual_prompt\",\n\
              \          \"need_lip_sync\",\n          \"has_character\",\n      \
              \    \"characters\",\n          \"narrator_name\"\n        ],\n    \
              \    \"properties\": {\n          \"id\": {\n            \"type\": \"\
              integer\",\n            \"description\": \"Unique identifier for the\
              \ scene\",\n            \"minimum\": 1\n          },\n          \"narration\"\
              : {\n            \"type\": \"string\",\n            \"description\"\
              : \"Relevant sentence extracted from script\",\n            \"minLength\"\
              : 1\n          },\n          \"target_narration\": {\n            \"\
              type\": \"string\",\n            \"description\": \"Narration translated\
              \ to the target language (or identical copy when no translation is needed)\"\
              ,\n            \"minLength\": 1\n          },\n          \"visual_description\"\
              : {\n            \"type\": \"string\",\n            \"description\"\
              : \"Director's note for visual direction\",\n            \"minLength\"\
              : 1\n          },\n          \"visual_prompt\": {\n            \"type\"\
              : \"string\",\n            \"description\": \"Full English prompt for\
              \ image generation\",\n            \"minLength\": 1\n          },\n\
              \          \"need_lip_sync\": {\n            \"type\": \"string\",\n\
              \            \"description\": \"Whether the scene requires lip-sync\
              \ alignment for the narration\"\n          },\n          \"has_character\"\
              : {\n            \"type\": \"number\",\n            \"description\"\
              : \"has character\"\n          },\n          \"characters\": {\n   \
              \         \"type\": \"array\",\n            \"items\": {\n         \
              \     \"type\": \"string\"\n            },\n            \"description\"\
              : \"List of on-screen actor names selected from actors_json. Empty array\
              \ when has_character=0\"\n          },\n          \"narrator_name\"\
              : {\n            \"type\": \"string\",\n            \"description\"\
              : \"narrator name\"\n          }\n        },\n        \"additionalProperties\"\
              : false\n      }\n    }\n  },\n  \"additionalProperties\": false\n}"
            max_completion_tokens: 128000
            response_format: json_schema
          mode: chat
          name: gpt-5.1-2025-11-13
          provider: aict/ai_hub/ai_hub
        prompt_template:
        - id: f9d2de94-de8d-4902-91b7-eef448308aae
          role: system
          text: "## 角色(Role)\n你是一名资深的 AI 视频导演与提示词工程师。请把给定的【独白讲稿】(已按指定 SCENE 标记格式提供)转换为\
            \ JSON 分镜脚本,并且必须严格符合下方 JSON Schema 与全部约束。\n\n---\n\n## 固定项目设置(输出中必须写入\
            \ project_info)\n【Global Style Prompt】(输出中必须原样使用):{{#1768184532311.global_style#}}\n\
            【Actors JSON】(本项目可用角色全集;包含同一角色的不同变体,如“...(青年)”、“...(老年)”):\n{{#1768803191521.actors_text#}}\n\
            \n**硬规则(角色相关):**\n- `has_character` 的判断只依据“该场景是否需要可见人物出镜承载信息”,与是否能选到角色无关。\n\
            - 角色一致性来源:按 name 在 Actors JSON 中匹配(仅使用 name;不要使用/输出 actor.prompt)。\n-\
            \ 不要在 visual_description / visual_prompt 中描述角色风格(如外貌设定清单、固定服装口号等一致性锚定语),也不要写任何\
            \ url。\n\n---\n\n年代与世界观\n0) 核心目标(必须达成)\n从剧本【年代设定】中抽取“唯一年代/世界观”并在全片锁死为 ERA_LOCK。除非剧本明确标注“穿越/回忆/史料插叙”,否则所有分镜必须严格属于\
            \ ERA_LOCK,每个分镜都不得出现任何超出该年代上限的产物、材料、工艺、语言符号与审美风格(含“看起来很现代”的装修与灯具)。\n1)\
            \ 年代设定解析(Era Profile:先建模再出画面)\n读取【年代设定】后,为本片构建一个 Era Profile(仅用于推理与约束,不写入输出字段):\n\
            TIME_RANGE(时间范围):把“唐朝/维多利亚/1980s/近未来”等映射为一个近似范围:era_start ~ era_end(至少要确定 era_end 作为“时代上限”)。\n\
            REGION/CULTURE(地域文化):中国/法国/美国/架空赛博城市等,用于建筑、服饰、文字系统、器物风格约束。\nTECH_CEILING(技术上限):以 era_end 为准设定“允许出现的最高技术形态”(照明、动力、交通、通信、材料、印刷/显示介质)。\n\
            STYLE_PALETTE(风格调色板):该时代常见的室内/街景形制、材质与工艺(木/石/砖/夯土/黄铜/铸铁/丝绸/羊毛等),以及不应出现的“后世风格信号”。\n\
            2) 年代强制约束(Anachronism Check,硬失败条件)\n对每个 scene 的 visual_description 与 visual_prompt 执行以下硬约束:\n\
            全篇统一:无明确“穿越/回忆”标注则不得换年代,不得混搭两种时代的建筑/服装/道具体系。\n双向时代错误都禁止:\n过新(最常见):出现任何晚于\
            \ era_end 的产物/材料/工业语言 = 违规。\n过旧且不合理:在明确“现代商务/当代都市”等年代里无理由出现古装、马车、冷兵器体系等也属违规(除非\
            \ META/VISUAL 明确是表演/博物馆/影视拍摄/复古活动)。\n角色造型年代一致:服装材质、剪裁、发型、配饰、鞋型必须匹配 Era\
            \ Profile 的阶层与地域文化;不得用“现代时装语汇”去描述古代/近代角色。\n3) “每个分镜必须带年代锚点”的硬要求(防漂移关键)\n\
            为防止模型默认生成“现代室内/现代灯具/现代装修”,每个 scene 必须满足:\nvisual_description 必须包含至少 1\
            \ 个“年代锚点(Era Anchor)”:来自该年代典型的 光源/材质/器物/建筑细节/交通方式/文字载体 任一类。\n例(仅示意,需按【年代设定】动态选择):油灯/蜡烛/煤气灯/早期白炽灯语汇;木作榫卯/夯土院落/砖石拱券;马车/帆船/蒸汽机车;竹简/宣纸/羊皮纸/打字机/胶片相机;等。\n\
            visual_prompt 必须显式重复年代标签:写入 historically accurate to [年代设定] 或 era-accurate:\
            \ [年代设定],并要求 no anachronistic objects。\n4) 高风险漂移项:强制“时代化”处理(重点针对你反馈的灯具/装修)\n\
            以下类别最容易在任何年代设定下“自动现代化”,必须强约束:\n照明(Lighting Source):必须符合 TECH_CEILING。\n\
            禁止默认“现代筒灯/射灯/灯带/LED/荧光灯/极简台灯”。\n若需室内补光,优先用“当时代真实光源语汇”描述(如窗光、烛光、油灯、煤气灯、当时代早期电灯形制等;具体取决于【年代设定】)。\n\
            室内装修与家具(Interior Style):\n禁止出现“现代极简、白盒子、开放式厨房吧台、隐形灯槽、无框玻璃、现代橱柜五金、塑料感强的家具”等后世风格信号。\n\
            必须用 Era Profile 的材质与工艺词汇(木、石、砖、灰泥、织物、金属工艺等)去落实空间。\n材料(Materials):若【年代设定】早于大规模塑料/现代复合材料普及,则禁止“塑料、亚克力、碳纤维、铝合金现代加工质感、不锈钢家电质感”等。\n\
            文字/标识介质(Typography & Signage):禁止出现明显现代 UI、现代印刷排版、LED屏、现代路牌体系;必须匹配时代的招牌/海报/题字方式。\n\
            5) 输出前强制自检(每个 scene 必做)\n在生成每个 scene 的画面前,执行一次 Self‑Check(推理步骤,不写入输出):\n\
            列出该镜头将出现的:light source / key props / furniture / architecture / transport\
            \ / materials / signage / costume\n对每一项问一句:“它是否可能晚于 era_end 才出现或普及?是否带有明显后世审美信号?”\n\
            若“是/不确定” → 必须替换为更符合年代的替代物,直到通过。\n\n任务目标(核心功能)\n把讲稿按“原文顺序”拆成多个可拍摄分镜场景:\n\
            智能开场(Smart Intro):\n若第一句是旁白(VO):Scene 1 必须是环境/情景空镜(Establishing Shot),禁止\
            \ Talking Head。\n若第一句是角色台词(Dialogue):Scene 1 必须是主角面对镜头自述(Talking Head)。\n\
            首个对白镜头(First Dialogue Shot):全片中第一个由“非旁白角色”说话的场景,必须处理为 Talking Head(对镜自述/特写),以建立角色印象。\n\
            Scene 2+(其余场景):以“正常演绎/情景化呈现”为主(第三人称叙事、动作、特写等)。当某场景被判定为 First Dialogue\
            \ Shot 时,禁止使用视角 A/B 随机切换规则;必须 Talking Head,need_lip_sync=1。\nFirst Dialogue\
            \ Shot(可执行判定)\n定义 IS_VO:满足任一条件即为 VO/旁白场景\nSPEAKER 含 “旁白” 或 “VO”(可选)MODE:\
            \ VO 仅在 SPEAKER 不是角色发声标签时才算 VO\n硬例外(最高优先级):如果 SPEAKER 形如 独白(角色名)/对话(角色名)/角色名,则该场景一律视为 IS_CHARACTER_SPEECH,即使\
            \ MODE=VO 也不得当作 VO。\n同时把 IS_CHARACTER_SPEECH 改成“不受 MODE 影响”:\n定义 IS_CHARACTER_SPEECH:满足任一条件即为角色发声场景\n\
            SPEAKER 为角色名,或形如 独白(角色名)/对话(角色名)\n且 SPEAKER 不含 旁白/VO\n不要求 MODE 必须是 ONCAM/DIALOGUE(MODE\
            \ 可忽略)\n定义 IS_CHARACTER_SPEECH:满足全部条件才算“角色发声场景”\n非 IS_VO\nSPEAKER 为角色名,或形如 独白(角色名) / 对话(角色名)(括号内为角色名)\n\
            全片第一个 IS_CHARACTER_SPEECH 场景 = First Dialogue Shot:\n必须 has_character=1\n\
            必须 need_lip_sync=1\n角色必须 面对镜头(looking at camera),嘴部可见(mouth visible),执行对口型\n\
            visual_prompt 必须使用 Talking Head 模板\n特别强调(防误判)\n任意 IS_VO 场景 永远不计入 “首次亮相/首个对白镜头”,即使 SPEAKER=旁白(某角色名),也只视为\
            \ VO,不触发 lip sync。\nHard Priority Order(硬优先级,冲突时按此执行)\nSchema/字段硬规则(JSON\
            \ keys、narration 来源、characters 约束等)\nSmart Intro(只约束 Scene 1 的镜头类型)\n\
            First Dialogue Shot(全片第一次“角色在非 VO 条件下发声”必须 Talking Head + lip sync)\n\
            Talking Head 严格限制 / 独白多样化(仅在不违反 2/3 的前提下执行)\n输入格式与解析规则(完整定义)\n输入讲稿由若干块组成,每块以如下行开始:\n\
            [SCENE <number>] 块内允许的行类型(按需出现):\nMETA: 时间/地点/背景设定(不可朗读)\nVISUAL: 画面动作/调度/镜头提示(不可朗读)\n\
            SFX: 音效/环境声(不可朗读)\nSPEAKER: 说话者名字(元信息,不可朗读)。特别注意:此处内容可能为 角色名 或 旁白类型(角色名)(如:旁白(任运)、独白(莱顿)),需解析括号内容。\n\
            MODE: 说话方式(ONCAM/VO/DIALOGUE)(元信息,不可朗读)\nLINE: 唯一可朗读文本(供 narration 抽取)\n\
            \n硬规则:\nnarration 只能来自 LINE: 行的内容(不包含“LINE:”前缀本身)。\n严禁把 META/VISUAL/SFX/SPEAKER/MODE\
            \ 的任何字符放进 narration。\n输出要求(严格:必须符合 Schema)\n只返回合法 JSON(不要 markdown、不要代码块、不要注释、不要多余解释文字)。\
            \ 顶层 JSON 必须是以下结构:\n{\n  \"project_info\": {\n    \"title\": \"...\",\n\
            \    \"global_style\": \"...\"\n  },\n  \"scenes\": [...]\n}\n\n强制规则:\n\
            project_info.global_style 必须与【Global Style Prompt】完全一致(逐字相同)。\n每个 scene\
            \ 对象只能包含以下键(不得多、不得少):\n{ \"id\", \"narration\", \"visual_description\"\
            , \"visual_prompt\", \"has_character\", \"need_lip_sync\", \"characters\"\
            , \"narrator_name\" }\nhas_character 必须为数字 0 或 1(禁止 true/false,禁止字符串)。\n\
            need_lip_sync 必须为数字 0 或 1(禁止 true/false,禁止字符串)。\nnarrator_name 必须为字符串(String),且严禁为空字符串。\n\
            characters 必须存在:\n当 has_character=1:characters 为对象数组;每个对象只能有 name。\nname\
            \ 必须能在 Actors JSON 的 actors[].name 中找到完全一致的项;\n允许多角色同框。\n当 has_character=0:characters\
            \ 必须为 []。\n任何位置都不允许出现额外字段(additionalProperties=false)。\nid 使用严格递增的整数(1,2,3...),不得使用\
            \ 2a/2b。\nnarrator_name 字段强制赋值逻辑(核心优化:全局一致性)\nnarrator_name 定义了当前分镜声音的归属。必须严格区分“角色音”与“旁白音”。\
            \ 请对每个分镜执行以下 **Priority Check(优先级检查)**,一旦满足条件立即停止并赋值: 优先级 1:显式指定名字(Explicit\
            \ Assignment) 情况 A:命名旁白(Named Narrator)- 最高优先级\n识别条件:SPEAKER 包含“旁白”或“VO”关键词,并且\
            \ 带有括号指定名字(例如:旁白(任运))。\n执行动作:\n提取括号内的名字(如 \"任运\")。\n直接赋值 narrator_name\
            \ = \"任运\"。\n记录:将此名字标记为“当前全局旁白音”。\n情况 B:角色独白/对话(Character Speech)\n识别条件:SPEAKER\
            \ 是角色名(如 莱顿) 或 独白(角色名)(如 独白(莱顿))。\n执行动作(需映射到全名):\n提取核心名字(如 \"莱顿\")。\n\
            历史锚定检查:若前文已将“莱顿”映射为“弗雷德里克·莱顿(中老年)”,则强制复用该全名。\n全名查找:若无历史,则在 Actors JSON\
            \ 中查找包含该名字的项。\n赋值 narrator_name = 找到的官方全名。\n优先级 2:通用旁白 + 全局历史回溯(Global\
            \ History Lookup)\n条件:SPEAKER 仅为“旁白”或“VO”(无括号指定名字)。\n逻辑:通用旁白通常由同一个声音完成。\n\
            执行动作:\n检查整个剧本的前文(Previous Scenes),是否曾经出现过 “命名旁白(优先级1-A)”?\n若有(例如 Scene\
            \ 1 是 旁白(任运)):则当前分镜继承该名字 -> narrator_name = \"任运\"。\n若无:进入优先级 3。\n优先级\
            \ 3:通用旁白 + 默认兜底(Default Fallback)\n条件:SPEAKER 仅为“旁白”或“VO”,且前文从未指定过旁白名字。\n\
            执行动作:\n直接赋值 narrator_name = \"旁白\"。\n严禁使用当前画面中的角色名字(characters),也严禁使用上一句说话的角色名字。\n\
            \nnarration 原文锁定规则(最高优先级)\nnarration 必须从【讲稿原文】中“逐字逐符号”复制粘贴得到:一个字符都不许变。\n\
            允许的唯一操作:切分(segmentation)。\n你只能把原文拆成多段;每段 narration 必须是原文中的“连续子串”。\nscenes\
            \ 的 narration 必须按原文出现顺序输出;不得重排;不得跳跃拼接非相邻片段。\n关键规则:LINE 过长时的“多场景切分输出”\n\
            对每个 [SCENE k] 块的 LINE 都必须进行切分评估;当 LINE 过长时,必须把同一块扩展为多个输出 scene,且保持该块的\
            \ META/VISUAL/SPEAKER/MODE 语义一致。\n1) 必须切分的触发条件\n预计单段朗读 > 12 秒;\n单段包含 >\
            \ 2 个完整句子;\n单段语义明显包含多个核心点。\n2) 切分方式\n只能在原文已有自然边界切分(标点符号)。\n不得自行添加或改动任何标点。\n\
            3) 信息继承(硬约束)\n当 [SCENE k] 被切分为 n 段时:\n必须按顺序生成 n 个 scene。\n所有切分出的 scene\
            \ 必须保持 narrator_name 一致(遵循上述赋值规则)。\n视觉风格与对口型策略(Visual Variety & Lip Sync)\n\
            核心原则:除了“首次亮相”,独白应被视为“心声(Inner Voice)”,画面应多样化。\n1) Talking Head(对镜自述)的严格限制\n\
            Talking Head 镜头(need_lip_sync=1,角色看着镜头说话)仅限用于以下情况:\nScene 1:如果第一句就是角色独白。\n\
            首次亮相:全片第一个由主角说话的场景。\n特殊强调:剧本 VISUAL 中明确写有 \"Facing camera\" / \"Interview\
            \ style\" / \"Talking to audience\"。\n除此之外,严禁使用 Talking Head。\n2) 独白的多样化视觉呈现(Scene\
            \ 2+)\n当 SPEAKER 是角色(独白模式),且不是上述 Talking Head 情况时,必须在以下两种视角中随机切换,并强制 need_lip_sync=0:\n\
            视角 A:第三人称动作(Cinematic Action)\n画面内容:角色正在进行某种动作(绘画、行走、凝视远方、抚摸物体)。\nVisual\
            \ Prompt:medium shot / long shot, side profile or back view, [action description],\
            \ cinematic lighting\n约束:need_lip_sync = 0(嘴巴不动,声音作为画外音)。\n视角 B:第一人称/特写(POV\
            \ / Close-up)\n画面内容:角色眼中的画面(手部特写、画笔特写、环境细节),或者角色的局部特写(眼睛、手)。\nVisual Prompt:close\
            \ up shot, POV shot, focus on [object/hand/eye], macro details, depth\
            \ of field\n约束:need_lip_sync = 0(看不见嘴,或嘴不动)。\n3) 旁白模式(VO)\n始终保持 Cinematic\
            \ 风格(空镜、环境、意境)。\nneed_lip_sync = 0。\n主角识别与角色选择策略(含变体选择)\n原则:先确定 SPEAKER\
            \ 类型,再决定画面。\n1) 旁白/画外音模式(SPEAKER 含 VO/旁白 关键词)\n画面判定:严禁直接将 SPEAKER 中的名字作为画面角色。必须仅根据\
            \ VISUAL/META 决定。\n2) 正常对话/独白模式(SPEAKER 为正常角色名)\n变体选择规则:若 Actors JSON\
            \ 中存在同名角色的多个变体(如 青年/老年):\n优先检查 META 块中的时间/年龄提示。\n其次检查 VISUAL 块中的外貌描述。\n\
            若无明确提示,默认保持与上一场景中该角色出场时的变体一致。\n匹配规则:必须使用 Actors JSON 中的全名(如“弗雷德里克·莱顿(中老年)”)。\n\
            画面字段规则(Visual Rules)\n1) visual_description(English only)\n1–2 句,具体可执行。\n\
            一致性检查:\nneed_lip_sync=1:必须描述“on-screen speaking / mouth visible, looking\
            \ at camera”。\nneed_lip_sync=0:不得描述角色在说话。描述动作(painting, touching, walking)或细节(hands,\
            \ eyes, canvas)。\nMust include at least one era anchor that matches [年代设定] (lighting/props/architecture/materials/transport/signage).\n\
            Must avoid any modern/late-era cues if the era is earlier (e.g., modern\
            \ lamp, recessed ceiling lights, minimalist renovation, plastic objects,\
            \ screens).\nIf uncertain, choose a simpler, lower-tech, older alternative\
            \ consistent with the era.\n2) visual_prompt(English only)\n必须以【Global\
            \ Style Prompt】原样开头。\nTalking Head 模式(仅当 need_lip_sync=1 时):\n[Global\
            \ Style Prompt], talking head, medium shot, looking at camera, natural\
            \ lip movement, soft key light\nCinematic / Action 模式(当 need_lip_sync=0\
            \ 且 has_character=1 时):\n[Global Style Prompt], cinematic shot, side view\
            \ or back view, [action details], realistic lighting, closed mouth\nPOV\
            \ / Detail 模式(当 need_lip_sync=0 且 has_character=1 时):\n[Global Style Prompt],\
            \ close up shot, macro details, focus on hands or objects, depth of field\n\
            在每条模板中强制加入:historically accurate to [年代设定], era-accurate props and architecture,\
            \ no anachronistic objects, no modern lighting, no modern interior\n且不得使用会诱发现代化的泛词:modern, contemporary, minimalist, IKEA, LED, neon, fluorescent, recessed\
            \ lights, light strip(除非【年代设定】本就是现代/未来且合理)。"
        - id: dcb95686-5577-463a-b1d3-dbaf705129bc
          role: user
          text: '

            # Source Text

            {{#1768990832178.text#}}'
        selected: false
        structured_output:
          schema:
            $schema: http://json-schema.org/draft-07/schema#
            additionalProperties: false
            description: Schema for art project configuration with scenes
            properties:
              project_info:
                additionalProperties: false
                description: Project metadata and global settings
                properties:
                  global_style:
                    description: Global artistic style description
                    minLength: 1
                    type: string
                  title:
                    description: Project title
                    minLength: 1
                    type: string
                required:
                - title
                - global_style
                type: object
              scenes:
                description: List of scenes in the project
                items:
                  additionalProperties: false
                  description: Individual scene configuration
                  properties:
                    characters:
                      description: List of on-screen actor names selected from actors_json.
                        Empty array when has_character=0
                      items:
                        type: string
                      type: array
                    has_character:
                      description: has character
                      type: number
                    id:
                      description: Unique identifier for the scene
                      minimum: 1
                      type: integer
                    narration:
                      description: Relevant sentence extracted from script
                      minLength: 1
                      type: string
                    narrator_name:
                      description: narrator name
                      type: string
                    need_lip_sync:
                      description: Whether the scene requires lip-sync alignment for
                        the narration
                      type: string
                    target_narration:
                      description: Narration translated to the target language (or
                        identical copy when no translation is needed)
                      minLength: 1
                      type: string
                    visual_description:
                      description: Director's note for visual direction
                      minLength: 1
                      type: string
                    visual_prompt:
                      description: Full English prompt for image generation
                      minLength: 1
                      type: string
                  required:
                  - id
                  - narration
                  - target_narration
                  - visual_description
                  - visual_prompt
                  - need_lip_sync
                  - has_character
                  - characters
                  - narrator_name
                  type: object
                minItems: 1
                type: array
            required:
            - project_info
            - scenes
            title: Art Project Schema
            type: object
        structured_output_enabled: true
        title: 独白-统一角色版本
        type: llm
        variables: []
        video:
          configs:
            variable_selector: []
          enabled: false
        vision:
          enabled: false
      height: 121
      id: '1767513600761'
      position:
        x: 219.8963342269864
        y: -417.5372345420261
      positionAbsolute:
        x: 219.8963342269864
        y: -417.5372345420261
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
    - data:
        cases:
        - case_id: 0c081d5e-e816-41a9-a860-7e10b654ac47
          conditions:
          - comparison_operator: not empty
            id: c67a6802-cadf-4db7-86ba-1596a76eea44
            value: ''
            varType: string
            variable_selector:
            - '1765354062480'
            - timestamped_lines
          id: 0c081d5e-e816-41a9-a860-7e10b654ac47
          logical_operator: and
        - case_id: 'true'
          conditions:
          - comparison_operator: contains
            id: 330c0caf-3cb1-469b-a564-3c2b8ef2fcca
            value: 独白
            varType: string
            variable_selector:
            - '1765354062480'
            - scene_mode
          id: 'true'
          logical_operator: and
        - case_id: 368673b3-3987-4923-80f8-eee8e3477fe3
          conditions:
          - comparison_operator: contains
            id: f5fcce3b-79f8-4445-9bc4-92a03465148e
            value: 旁白
            varType: string
            variable_selector:
            - '1765354062480'
            - scene_mode
          id: 368673b3-3987-4923-80f8-eee8e3477fe3
          logical_operator: and
        desc: ''
        selected: false
        title: 条件分支 7
        type: if-else
      height: 221
      id: '1767513946983'
      position:
        x: -1145.2642840255203
        y: -417.5372345420261
      positionAbsolute:
        x: -1145.2642840255203
        y: -417.5372345420261
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
    - data:
        desc: ''
        isInIteration: true
        isInLoop: false
        is_team_authorization: true
        iteration_id: '1766632760253'
        output_schema: null
        outputs:
        - type: any
          value_selector:
          - '1764222660299'
          - output
          value_type: string
          variable: error_message
        - type: string
          value_selector:
          - '1764676748859'
          - video_url
          value_type: string
          variable: video_url
        - type: string
          value_selector:
          - '1764676712844'
          - mask_url
          value_type: string
          variable: mask_url
        paramSchemas:
        - auto_generate: null
          default: null
          form: form
          human_description:
            en_US: 仅限 jpg、png、jfif 等常见格式,建议 jpg 格式;体积小于 5MB,分辨率小于 4096×4096
            ja_JP: 仅限 jpg、png、jfif 等常见格式,建议 jpg 格式;体积小于 5MB,分辨率小于 4096×4096
            pt_BR: 仅限 jpg、png、jfif 等常见格式,建议 jpg 格式;体积小于 5MB,分辨率小于 4096×4096
            zh_Hans: 仅限 jpg、png、jfif 等常见格式,建议 jpg 格式;体积小于 5MB,分辨率小于 4096×4096
          label:
            en_US: 图像地址
            ja_JP: 图像地址
            pt_BR: 图像地址
            zh_Hans: 图像地址
          llm_description: 仅限 jpg、png、jfif 等常见格式,建议 jpg 格式;体积小于 5MB,分辨率小于 4096×4096
          max: null
          min: null
          name: image_url
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: true
          scope: null
          template: null
          type: string
        - auto_generate: null
          default: null
          form: form
          human_description:
            en_US: 时长必须小于 35 秒
            ja_JP: 时长必须小于 35 秒
            pt_BR: 时长必须小于 35 秒
            zh_Hans: 时长必须小于 35 秒
          label:
            en_US: 音频地址
            ja_JP: 音频地址
            pt_BR: 音频地址
            zh_Hans: 音频地址
          llm_description: 时长必须小于 35 秒
          max: null
          min: null
          name: audio_url
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: true
          scope: null
          template: null
          type: string
        - auto_generate: null
          default: null
          form: form
          human_description:
            en_US: 仅限中文、英文、日文、韩文、墨西哥语、印尼语
            ja_JP: 仅限中文、英文、日文、韩文、墨西哥语、印尼语
            pt_BR: 仅限中文、英文、日文、韩文、墨西哥语、印尼语
            zh_Hans: 仅限中文、英文、日文、韩文、墨西哥语、印尼语
          label:
            en_US: 提示词
            ja_JP: 提示词
            pt_BR: 提示词
            zh_Hans: 提示词
          llm_description: 仅限中文、英文、日文、韩文、墨西哥语、印尼语
          max: null
          min: null
          name: prompt
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: false
          scope: null
          template: null
          type: string
        - auto_generate: null
          default: null
          form: form
          human_description:
            en_US: 作为确定扩散初始状态的基础,默认 -1(随机)
            ja_JP: 作为确定扩散初始状态的基础,默认 -1(随机)
            pt_BR: 作为确定扩散初始状态的基础,默认 -1(随机)
            zh_Hans: 作为确定扩散初始状态的基础,默认 -1(随机)
          label:
            en_US: 随机种子
            ja_JP: 随机种子
            pt_BR: 随机种子
            zh_Hans: 随机种子
          llm_description: 作为确定扩散初始状态的基础,默认 -1(随机)
          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: 否
          form: form
          human_description:
            en_US: 开启后会通过牺牲部分效果加快生成速度,且生成视频的效果会与即梦稍有不同
            ja_JP: 开启后会通过牺牲部分效果加快生成速度,且生成视频的效果会与即梦稍有不同
            pt_BR: 开启后会通过牺牲部分效果加快生成速度,且生成视频的效果会与即梦稍有不同
            zh_Hans: 开启后会通过牺牲部分效果加快生成速度,且生成视频的效果会与即梦稍有不同
          label:
            en_US: 快速模式
            ja_JP: 快速模式
            pt_BR: 快速模式
            zh_Hans: 快速模式
          llm_description: 开启后会通过牺牲部分效果加快生成速度,且生成视频的效果会与即梦稍有不同
          max: null
          min: null
          name: pe_fast_mode
          options:
          - icon: null
            label:
              en_US: 是
              ja_JP: 是
              pt_BR: 是
              zh_Hans: 是
            value: 是
          - icon: null
            label:
              en_US: 否
              ja_JP: 否
              pt_BR: 否
              zh_Hans: 否
            value: 否
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: false
          scope: null
          template: null
          type: select
        params:
          audio_url: ''
          image_url: ''
          pe_fast_mode: ''
          prompt: ''
          seed: ''
        provider_id: 31e79e87-ac19-416d-a8fe-c36521c0d2b8
        provider_name: 即梦数字人生成
        provider_type: workflow
        retry_config:
          max_retries: 3
          retry_enabled: true
          retry_interval: 1000
        selected: false
        title: 即梦数字人生成
        tool_configurations:
          audio_url:
            type: mixed
            value: '{{#1766632810839.audioUrl#}}'
          image_url:
            type: mixed
            value: '{{#1766632810839.image_url#}}'
          pe_fast_mode:
            type: constant
            value: 否
          prompt:
            type: mixed
            value: '{{#1766632810839.motion_prompt#}}'
          seed:
            type: constant
            value: null
        tool_description: 即梦数字人生成,生成的视频链接有效期为 2 个小时
        tool_label: 即梦数字人生成
        tool_name: jimeng_realman
        tool_node_version: '2'
        tool_parameters:
          skip_subject_detection:
            type: constant
            value: 'false'
        type: tool
      height: 250
      id: '1767611826573'
      parentId: '1766632760253'
      position:
        x: 508.8804968821719
        y: 95.35775265398252
      positionAbsolute:
        x: -71.82843676697291
        y: 2783.8668334354666
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
      zIndex: 1002
    - data:
        cases:
        - case_id: 'true'
          conditions:
          - comparison_operator: '='
            id: 0225124a-33ab-4016-bbfa-6302d7ea1bd6
            value: '1'
            varType: number
            variable_selector:
            - '1766632810839'
            - need_lip_sync
          id: 'true'
          logical_operator: and
        desc: ''
        isInIteration: true
        isInLoop: false
        iteration_id: '1766632760253'
        selected: false
        title: 是否需要对口型
        type: if-else
      height: 125
      id: '1767612074064'
      parentId: '1766632760253'
      position:
        x: 102.97342519537301
        y: 218.39409891554533
      positionAbsolute:
        x: -477.7355084537718
        y: 2906.9031796970294
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
      zIndex: 1002
    - data:
        cases:
        - case_id: 'true'
          conditions:
          - comparison_operator: '='
            id: 6fd3abc0-34ea-4749-8a42-a06f931ec73d
            value: '1'
            varType: number
            variable_selector:
            - '1766574094213'
            - has_character
          - comparison_operator: not empty
            id: b4ebfcd7-6adb-4cc5-8176-cf9c735795e5
            value: ''
            varType: array[string]
            variable_selector:
            - '1766574094213'
            - actor_urls
          id: 'true'
          logical_operator: and
        desc: ''
        isInIteration: true
        isInLoop: false
        iteration_id: '1766574059102'
        selected: false
        title: 是否需要主角
        type: if-else
      height: 151
      id: '1767710910480'
      parentId: '1766574059102'
      position:
        x: 408.7323935471123
        y: 138.31806655805144
      positionAbsolute:
        x: -41.242270358216444
        y: 935.8835916756393
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
      zIndex: 1002
    - data:
        desc: 不使用垫图
        isInIteration: true
        isInLoop: false
        is_team_authorization: true
        iteration_id: '1766574059102'
        output_schema: null
        outputs:
        - type: any
          value_selector:
          - '1753035060851'
          - error
          variable: error_message
        - type: any
          value_selector:
          - '1753289226679'
          - url_list
          variable: url_list
        paramSchemas:
        - auto_generate: null
          default: doubao-seedream-4-0-250828
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 模型
            ja_JP: 模型
            pt_BR: 模型
            zh_Hans: 模型
          llm_description: ''
          max: null
          min: null
          name: model
          options:
          - icon: null
            label:
              en_US: doubao-seedream-4-0-250828
              ja_JP: doubao-seedream-4-0-250828
              pt_BR: doubao-seedream-4-0-250828
              zh_Hans: doubao-seedream-4-0-250828
            value: doubao-seedream-4-0-250828
          - icon: null
            label:
              en_US: doubao-seedream-4-5-251128
              ja_JP: doubao-seedream-4-5-251128
              pt_BR: doubao-seedream-4-5-251128
              zh_Hans: doubao-seedream-4-5-251128
            value: doubao-seedream-4-5-251128
          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: 提示词(建议不超过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: 2048x2048
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 宽高像素(默认值2048x2048,4.5版本不支持1K)
            ja_JP: 宽高像素(默认值2048x2048,4.5版本不支持1K)
            pt_BR: 宽高像素(默认值2048x2048,4.5版本不支持1K)
            zh_Hans: 宽高像素(默认值2048x2048,4.5版本不支持1K)
          llm_description: ''
          max: null
          min: null
          name: size
          options:
          - icon: null
            label:
              en_US: 1K
              ja_JP: 1K
              pt_BR: 1K
              zh_Hans: 1K
            value: 1K
          - icon: null
            label:
              en_US: 2K
              ja_JP: 2K
              pt_BR: 2K
              zh_Hans: 2K
            value: 2K
          - icon: null
            label:
              en_US: 4K
              ja_JP: 4K
              pt_BR: 4K
              zh_Hans: 4K
            value: 4K
          - icon: null
            label:
              en_US: 2048x2048
              ja_JP: 2048x2048
              pt_BR: 2048x2048
              zh_Hans: 2048x2048
            value: 2048x2048
          - icon: null
            label:
              en_US: 2304x1728
              ja_JP: 2304x1728
              pt_BR: 2304x1728
              zh_Hans: 2304x1728
            value: 2304x1728
          - icon: null
            label:
              en_US: 1728x2304
              ja_JP: 1728x2304
              pt_BR: 1728x2304
              zh_Hans: 1728x2304
            value: 1728x2304
          - icon: null
            label:
              en_US: 2560x1440
              ja_JP: 2560x1440
              pt_BR: 2560x1440
              zh_Hans: 2560x1440
            value: 2560x1440
          - icon: null
            label:
              en_US: 1440x2560
              ja_JP: 1440x2560
              pt_BR: 1440x2560
              zh_Hans: 1440x2560
            value: 1440x2560
          - icon: null
            label:
              en_US: 2496x1664
              ja_JP: 2496x1664
              pt_BR: 2496x1664
              zh_Hans: 2496x1664
            value: 2496x1664
          - icon: null
            label:
              en_US: 1664x2496
              ja_JP: 1664x2496
              pt_BR: 1664x2496
              zh_Hans: 1664x2496
            value: 1664x2496
          - icon: null
            label:
              en_US: 3024x1296
              ja_JP: 3024x1296
              pt_BR: 3024x1296
              zh_Hans: 3024x1296
            value: 3024x1296
          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: 自定义像素(取值范围:4.5[2560x1440, 4096x4096],4.0[1280x720, 4096x4096],优先级高于宽高像素)
            ja_JP: 自定义像素(取值范围:4.5[2560x1440, 4096x4096],4.0[1280x720, 4096x4096],优先级高于宽高像素)
            pt_BR: 自定义像素(取值范围:4.5[2560x1440, 4096x4096],4.0[1280x720, 4096x4096],优先级高于宽高像素)
            zh_Hans: 自定义像素(取值范围:4.5[2560x1440, 4096x4096],4.0[1280x720, 4096x4096],优先级高于宽高像素)
          llm_description: ''
          max: null
          min: null
          name: custom_size
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: false
          scope: null
          template: null
          type: string
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 是否关闭组图功能(默认disabled)
            ja_JP: 是否关闭组图功能(默认disabled)
            pt_BR: 是否关闭组图功能(默认disabled)
            zh_Hans: 是否关闭组图功能(默认disabled)
          llm_description: ''
          max: null
          min: null
          name: sequential_image_generation
          options:
          - icon: null
            label:
              en_US: auto
              ja_JP: auto
              pt_BR: auto
              zh_Hans: auto
            value: auto
          - icon: null
            label:
              en_US: disabled
              ja_JP: disabled
              pt_BR: disabled
              zh_Hans: disabled
            value: disabled
          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: 最大生成数量(仅当组图功能为auto时设置,范围[1,15],默认值1)
            ja_JP: 最大生成数量(仅当组图功能为auto时设置,范围[1,15],默认值1)
            pt_BR: 最大生成数量(仅当组图功能为auto时设置,范围[1,15],默认值1)
            zh_Hans: 最大生成数量(仅当组图功能为auto时设置,范围[1,15],默认值1)
          llm_description: ''
          max: null
          min: null
          name: max_images
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: false
          scope: null
          template: null
          type: number
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 原始图片(图片格式:jpeg、png、webp、gif)
            ja_JP: 原始图片(图片格式:jpeg、png、webp、gif)
            pt_BR: 原始图片(图片格式:jpeg、png、webp、gif)
            zh_Hans: 原始图片(图片格式:jpeg、png、webp、gif)
          llm_description: ''
          max: null
          min: null
          name: images
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: false
          scope: null
          template: null
          type: files
        - auto_generate: null
          default: null
          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: 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
        params:
          custom_size: ''
          images: ''
          max_images: ''
          model: ''
          prompt: ''
          sequential_image_generation: ''
          size: ''
          watermark: ''
        provider_id: 22632cc7-732a-4b68-94e7-5be7e1b48ba9
        provider_name: 即梦-文/图生图-4.x版本
        provider_type: workflow
        retry_config:
          max_retries: 3
          retry_enabled: true
          retry_interval: 1000
        selected: false
        title: 即梦-文/图生图-4.x版本-不垫图
        tool_configurations: {}
        tool_description: 即梦-文/图生图-4.x版本
        tool_label: 即梦-文/图生图-4.x版本
        tool_name: seedream_i2i_t2i_tool
        tool_node_version: '2'
        tool_parameters:
          custom_size:
            type: mixed
            value: null
          images:
            type: constant
            value: null
          max_images:
            type: constant
            value: null
          model:
            type: constant
            value: doubao-seedream-4-5-251128
          prompt:
            type: mixed
            value: '{{#1766574211446.structured_output.optimized_prompt#}}'
          sequential_image_generation:
            type: constant
            value: auto
          size:
            type: variable
            value:
            - '1766565906395'
            - video_resolution
          watermark:
            type: constant
            value: 'false'
        type: tool
      height: 162
      id: '1767711018753'
      parentId: '1766574059102'
      position:
        x: 1037.6412941034116
        y: 276
      positionAbsolute:
        x: 587.6666301980829
        y: 1073.5655251175879
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
      zIndex: 1002
    - data:
        code: "\nfunction main({global_style, custom_global_style}) {\n    var global_style_result\
          \ = \"\";\n    if (global_style == \"19世纪油画风格\") {\n        global_style_result\
          \ = \"19th Century Cinematic Oil Painting Style, Classical Realism, rich\
          \ textures, soft volumetric lighting, muted earth tones, heavy brushstrokes,\
          \ chiaroscuro lighting\";\n    }\n    else if (global_style == \"3D皮克斯风格\"\
          ) {\n        global_style_result = \"3D Disney Pixar animation style, high\
          \ quality 3D render, C4D, Octane render\";\n    }\n    else if (global_style\
          \ == \"波普艺术风格\") {\n        global_style_result = \"Pop art style, Ben-Day\
          \ dots shading, thick black outlines, retro American comic book aesthetic,\
          \ vibrant contrasting colors, Andy Warhol vibe, 8k.\";\n    }\n     else\
          \ if (global_style == \"吉卜力手绘水彩风格\") {\n        global_style_result = \"\
          Studio Ghibli style, Hayao Miyazaki aesthetic, fresh and natural, beautiful\
          \ watercolor background, lush greenery, cumulus clouds, healing colors,\
          \ hand-drawn texture, whimsical atmosphere\";\n    }\n    else if (global_style\
          \ == \"新中式东方奇幻\") {\n        global_style_result = \"New Chinese fantasy\
          \ illustration, high saturation neon contrasting colors, cel shading, deep\
          \ blue night, volumetric fog, minimalist composition, ethereal, 8k resolution.\"\
          ;\n    }\n        else if (global_style == \"写实\") {\n        global_style_result\
          \ = \"Hyper-realistic style, cinematic photography, realistic textures,\
          \ 85mm lens, depth of field, realistic skin pores, natural lighting, photorealistic,\
          \ movie still, highly detailed, 8k.\";\n    }\n    return {\n        global_style:\
          \ custom_global_style || global_style_result\n    }\n}\n"
        code_language: javascript
        desc: ''
        outputs:
          global_style:
            children: null
            type: string
        selected: false
        title: 全局风格映射
        type: code
        variables:
        - value_selector:
          - '1765354062480'
          - global_style
          value_type: string
          variable: global_style
        - value_selector:
          - '1765354062480'
          - custom_global_style
          value_type: string
          variable: custom_global_style
      height: 53
      id: '1768184532311'
      position:
        x: -667.2969344196229
        y: -734.7970348673688
      positionAbsolute:
        x: -667.2969344196229
        y: -734.7970348673688
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
    - data:
        code: "\nfunction main({all_actors_text1, all_actors_text2}) {\n    const\
          \ all_actors_text = all_actors_text1 || all_actors_text2;\n    const all_actors\
          \ = JSON.parse(all_actors_text);\n    let actor_list = [];\n    if (Array.isArray(all_actors))\
          \ {\n        actor_list = all_actors;\n    } else {\n        actor_list\
          \ = all_actors.all_actors;\n    }\n    const actors = actor_list.map(\n\
          \        actor => ({\n            name: actor.name,\n            gender:\
          \ actor.gender,\n            age: actor.age,\n            image_url: actor.image_url,\n\
          \            voiceid: actor.voiceid,\n            actor_voice_source: actor.actor_voice_source,\n\
          \            actor_voice_type: actor.actor_voice_type,\n        })\n   \
          \ );\n    const actors_text = JSON.stringify(actors);\n\n    return {\n\
          \        actors: actors,\n        actors_text: actors_text\n    }\n}\n"
        code_language: javascript
        desc: ''
        outputs:
          actors:
            children: null
            type: array[object]
          actors_text:
            children: null
            type: string
        selected: false
        title: 提取角色基本信息
        type: code
        variables:
        - value_selector:
          - '1772677692387'
          - text
          value_type: string
          variable: all_actors_text1
        - value_selector:
          - '1765354062480'
          - all_actors_text
          value_type: string
          variable: all_actors_text2
      height: 53
      id: '1768803191521'
      position:
        x: -244.32558025928017
        y: -1020.381368936795
      positionAbsolute:
        x: -244.32558025928017
        y: -1020.381368936795
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
    - data:
        cases:
        - case_id: 'true'
          conditions:
          - comparison_operator: empty
            id: 9c6e17a5-d2f2-4f19-b29a-040097b94a94
            value: ''
            varType: string
            variable_selector:
            - '1765354062480'
            - all_actors_text
          id: 'true'
          logical_operator: and
        desc: ''
        selected: false
        title: 是否需要调用角色生成
        type: if-else
      height: 125
      id: '1768806919571'
      position:
        x: -803.8769249212731
        y: -1360.4570940737062
      positionAbsolute:
        x: -803.8769249212731
        y: -1360.4570940737062
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
    - data:
        audio:
          configs:
            variable_selector: []
          enabled: false
        context:
          enabled: false
          variable_selector: []
        desc: ''
        model:
          completion_params:
            json_schema: "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\"\
              ,\n  \"title\": \"Art Project Schema (v2)\",\n  \"description\": \"\
              Schema for art project configuration with scenes (v2): no character_anchor_prompt;\
              \ scene supports multi-actors via characters[]\",\n  \"type\": \"object\"\
              ,\n  \"required\": [\n    \"project_info\",\n    \"scenes\"\n  ],\n\
              \  \"properties\": {\n    \"project_info\": {\n      \"type\": \"object\"\
              ,\n      \"description\": \"Project metadata and global settings\",\n\
              \      \"required\": [\n        \"title\",\n        \"global_style\"\
              \n      ],\n      \"properties\": {\n        \"title\": {\n        \
              \  \"type\": \"string\",\n          \"description\": \"Project title\"\
              ,\n          \"minLength\": 1\n        },\n        \"global_style\"\
              : {\n          \"type\": \"string\",\n          \"description\": \"\
              Global artistic style prompt (must be copied verbatim from the provided\
              \ Global Style Prompt variable)\",\n          \"minLength\": 1\n   \
              \     }\n      },\n      \"additionalProperties\": false\n    },\n \
              \   \"scenes\": {\n      \"type\": \"array\",\n      \"description\"\
              : \"List of scenes in the project\",\n      \"minItems\": 1,\n     \
              \ \"items\": {\n        \"type\": \"object\",\n        \"description\"\
              : \"Individual scene configuration\",\n        \"required\": [\n   \
              \       \"id\",\n          \"narration\",\n          \"visual_description\"\
              ,\n          \"visual_prompt\",\n          \"has_character\",\n    \
              \      \"characters\"\n        ],\n        \"properties\": {\n     \
              \     \"id\": {\n            \"type\": \"integer\",\n            \"\
              description\": \"Unique identifier for the scene\",\n            \"\
              minimum\": 1\n          },\n          \"narration\": {\n           \
              \ \"type\": \"string\",\n            \"description\": \"Exact substring\
              \ copied verbatim from Courseware Text (no edits); only segmentation\
              \ allowed\",\n            \"minLength\": 1\n          },\n         \
              \ \"visual_description\": {\n            \"type\": \"string\",\n   \
              \         \"description\": \"Director's note for visual direction (Chinese,\
              \ 1-2 sentences, executable on screen)\",\n            \"minLength\"\
              : 1\n          },\n          \"visual_prompt\": {\n            \"type\"\
              : \"string\",\n            \"description\": \"Prompt for image/video\
              \ generation (recommended English keywords). Must start with project_info.global_style;\
              \ if has_character=1 include selected actors' prompt + reference image\
              \ URLs\",\n            \"minLength\": 1\n          },\n          \"\
              has_character\": {\n            \"type\": \"integer\",\n           \
              \ \"description\": \"Whether on-screen characters appear in this scene\
              \ (0=no, 1=yes)\",\n            \"enum\": [\n              0,\n    \
              \          1\n            ]\n          },\n          \"characters\"\
              : {\n            \"type\": \"array\",\n            \"description\":\
              \ \"List of on-screen actor names selected from actors_json. Empty array\
              \ when has_character=0\",\n            \"items\": {\n              \"\
              type\": \"string\",\n              \"minLength\": 1\n            }\n\
              \          }\n        },\n        \"allOf\": [\n          {\n      \
              \      \"if\": {\n              \"properties\": {\n                \"\
              has_character\": {\n                  \"const\": 0\n               \
              \ }\n              },\n              \"required\": [\n             \
              \   \"has_character\"\n              ]\n            },\n           \
              \ \"then\": {\n              \"properties\": {\n                \"characters\"\
              : {\n                  \"maxItems\": 0\n                }\n        \
              \      }\n            },\n            \"else\": {\n              \"\
              properties\": {\n                \"characters\": {\n               \
              \   \"minItems\": 1\n                }\n              }\n          \
              \  }\n          }\n        ],\n        \"additionalProperties\": false\n\
              \      }\n    }\n  },\n  \"additionalProperties\": false\n}"
            response_format: json_schema
          mode: chat
          name: gpt-5-2025-08-07
          provider: aict/ai_hub/ai_hub
        prompt_template:
        - id: aa3577c9-d6d4-499c-9a12-7101d5c3b50e
          role: system
          text: "### 角色(Role)\n你是一名资深的 AI 视频导演与提示词工程师。请把给定的【课件文本(Courseware Text)】切分为多个逻辑分镜,并输出严格符合下方\
            \ JSON Schema 与全部约束的 JSON。\n\n---\n\n### 固定项目设置(输出中必须写入 project_info)\n\
            【Global Style Prompt】(输出中必须原样使用):\n{{#1768184532311.global_style#}}\n\n\
            【Actors JSON】(本项目可用角色全集;从中挑选出镜角色的 name ):\n{{#1768803191521.actors_text#}}\n\
            \n### 硬规则(角色相关)\nhas_character 的判断只依据“该场景是否需要人物出镜承载信息”,与是否能选到角色无关。\n角色一致性来源:按\
            \ name 在 Actors JSON 中匹配(仅使用 name ;不要使用/输出 actor.prompt)。\n不要在 visual_description\
            \ / visual_prompt 中描述角色风格,也不要写任何 url。\n\n### 输出要求(严格:必须符合 Schema)\n只返回合法\
            \ JSON(不要 markdown、不要代码块、不要注释)。\n顶层 JSON 必须是以下结构:\n{\n  \"project_info\"\
            : {\n    \"title\": \"...\",\n    \"global_style\": \"...\"\n  },\n  \"\
            scenes\": [...]\n}\n强制规则:\nproject_info.global_style 必须与【Global Style\
            \ Prompt】完全一致(逐字相同)。\n每个 scene 对象只能包含以下键(不得多、不得少):\n{ \"id\", \"narration\"\
            , \"visual_description\", \"visual_prompt\", \"has_character\", \"characters\"\
            \ }\nhas_character 必须存在,且为数字 0 或 1(禁止 true/false,禁止字符串)。\ncharacters 必须存在:\n\
            当 has_character=1:characters 为对象数组;每个对象只能有 name\nname 必须能在 Actors JSON\
            \ 的 actors[].name 中找到完全一致的项;\n允许多角色同框。\n当 has_character=0:characters 必须为\
            \ []。\n任何位置都不允许出现额外字段(additionalProperties=false)。\n\n### narration 逐字拷贝硬规则(最高优先级)\n\
            narration 必须是【课件文本】中的原文片段,逐字逐符号完全一致。\n允许的唯一操作:切分(segmentation)\n不允许:\n\
            改写/同义替换/缩写/扩写/总结/解释/补充\n纠错、润色、调整语序\n改变任何标点(全角/半角均不行)\n改变大小写、数字格式、单位、日期\n\
            新增或删除任何字符(包括空格、换行、制表符)\n合并非相邻片段(只能截取连续原文子串)\n自检要求:\n每条 narration 必须能在课件文本中找到完全相同的连续子串。\n\
            narration 输出=复制粘贴原文。\n\n### 长度红线与节奏拆分(关键更新:防超时 & 防零碎)\n视频生成模型存在时长物理极限,同时需要保证视频节奏不至于稀碎。\n\
            1. **长度目标与红线**:\n   - 中文:最佳区间 **15–35 个中文字符**。**绝对红线:≤ 45 个字符**(含标点,超过\
            \ 45 字视频生成将直接崩溃!)。\n   - 英文:最佳区间 **15–25 个单词**。**绝对红线:≤ 35 个单词**。\n  \
            \ - 极短防碎:除非原文本身就是极短的独立句,否则严禁切出 <10 个字符的零碎片段。\n2. **冲突裁决优先级**:\n   - 第一优先:逐字拷贝(永不改字)。\n\
            \   - 第二优先:字数绝对红线(超过 45 字必须强行切分)。\n   - 第三优先:语义完整与句子连贯(在不超过 45 字的前提下,尽量保持一整句话不拆)。\n\
            \   - 第四优先:均衡节奏(面临超长需切分时,避免头重脚轻,如切成 40字 + 5字)。\n\n### 逗号切分规则(关键更新:均衡拆分)\n\
            默认优先在句号/分号/问号/感叹号处切分。\n**只有当一句话逼近或超过 45 个字符的红线时,才必须使用逗号切分,且需遵循以下“均衡原则”:**\n\
            1. **寻找居中停顿**:不要逢逗号就切,而是寻找长句中逻辑最居中、停顿最明显的逗号,将长句拆分为长度相对均衡的两段(例如 25字 + 22字)。\n\
            2. **放宽自洽要求**:为了满足物理限制,**允许拆分后半句没有主语**。只要相邻分镜的 visual_description 保持画面主体一致、动作连贯即可。\n\
            \n\U0001F4A1 **【超长句切分标准示例】**\n原文:“但最后,这些情绪好像都融化了,变成了一种对自然、对生命更深沉的凝视,仿佛在向全人类诉说着无声的悲悯与宽容。”(54字,超过\
            \ 45 字红线,必须切分!)\n❌ 错误切分1(超长崩溃):\"但最后,这些情绪好像都融化了,变成了一种对自然、对生命更深沉的凝视,仿佛在向全人类诉说着无声的悲悯与宽容。\"\
            (54字,直接超时崩溃)\n❌ 错误切分2(过度零碎):\"但最后,\" / \"这些情绪好像都融化了,\" / \"变成了一种对自然、\"\
            \ / \"对生命更深沉的凝视,\"...(切得太碎,节奏断裂)\n✅ **正确均衡切分**:\n- Scene 1: \"但最后,这些情绪好像都融化了,变成了一种对自然、对生命更深沉的凝视,\"\
            \ (35字,保留了大部分语义,未超红线)\n- Scene 2: \"仿佛在向全人类诉说着无声的悲悯与宽容。\" (19字,虽无主语,但长度合适,画面连贯即可)\n\
            \n### 话语标记合并规则\n若片段以话语标记开头或本身仅包含话语标记,必须与其后最近的“实质信息片段”合并,不得单独作为一个 scene\
            \ 的 narration。\n典型话语标记示例:Of course, Well, So, Anyway, 其实、所以、那么、总之、不过、你看等。\n\
            **例外**:如果合并后总长度超过 45 字红线,则必须在话语标记之后的长句内部,寻找合适的逗号进行“均衡切分”。\n\n### 切分策略(只能用原文边界切)\n\
            按优先级选择切分点,并在每次切分后做“自洽校验”:\n1. 句号/分号/问号/感叹号/换行(首选;尽量一景一整句)\n2. 冒号(用于“定义/解释:后文”结构时,优先不拆;若必须拆,优先把“冒号后解释段”整体成景)\n\
            3. 破折号边界(优先在破折号两侧形成自洽段;避免切到中间残片)\n4. 括号/引号规则:不在同一对中文括号/引号内部切分;若必须切,先在括号外侧边界找。\n\
            5. 逗号/顿号(仅在面临超长风险时,按“均衡拆分”原则切分)。\n\n### 英文切分策略\n优先按句号/分号/问号/感叹号切分;尽量保持完整句。\n\
            若单句过长(>35词):优先在逗号、连词(and/but/so/because/which/that)前后切;仍需保证每段能独立读通,或通过画面保持连贯。必要时按空格边界切为短语,但禁止只切出孤立介词短语。\n\
            \n### 自洽校验与回退\n切分得到的每条 narration 必须通过以下检查;不通过则与相邻片段合并(只要合并后不超过 45 字红线):\n\
            1. 禁止“悬空连接词”开头(如“但是/因此/而且”等单独成镜)。\n2. 禁止“语法未闭合”结尾(如落在“的/地/得/把/被/在”等后面)。\n\
            3. 列表与分步:出现“第一/其次”时,优先“列表引导句+至少第一项”同景。\n4. 话语标记残片回退:若 narration 仅为 1–3\
            \ 个单词的话语标记,必须合并。\n\n### 生成顺序(关键)\n对每个场景严格按以下顺序执行:\n1. 静默提取并锁定 Era Anchor\
            \ 与 Location Anchor。\n2. 判定 has_character(0/1)。\n3. 写 narration(逐字拷贝;**严守\
            \ 45 字红线,优先均衡拆分**)。\n4. 写 visual_description(中文 1–2 句,可拍可执行。**注意:长句被切断时,相邻分镜的画面必须保持主体一致与微小推进,确保视觉连贯**)。\n\
            5. 写 visual_prompt(英文关键词逗号分隔;必须以 Global Style Prompt 开头)。\n6. 若 has_character=1:填写\
            \ characters。\n\n### has_character 判定规则\nhas_character=1:画面需要出现人物承载信息(讲解、演示、指向、情绪/视角表达等)。\n\
            has_character=0:只需环境/物体/文字/图表/抽象演示,不出现人物。\n主角识别与继承:课件文本出现明确人物,将第一个被持续指代的人物视为主角。主角一旦出现,后续若用代词或讲者视角叙述,默认主角继续出镜。\n\
            两可时用“是否需要人物完成动作/指向/演示来承载信息”裁决。\n\n### 时代/地域锁定(Period & Location Lock,硬规则)\n\
            必须从【课件文本】中抽取并锁定“时代锚点(Era Anchor)”与“地点锚点(Location Anchor)”。\n一旦课件明确给出(如“19世纪法国”),除非后文明确切换,否则所有\
            \ scene 的 visual_description 与 visual_prompt 都必须持续符合该时代/地点。\n每条 scene\
            \ 的 visual_description 必须显式体现时代一致性(服饰/建筑/交通/室内陈设等至少 1–2 个可执行细节)。\n每条 scene\
            \ 的 visual_prompt 必须包含 Era Anchor + Location Anchor 的英文关键词(放在 Global Style\
            \ Prompt 之后即可)。\n\n### 反时代错误(Anachronism)硬禁止清单(硬规则)\n在历史时期锁定期间,visual_description\
            \ / visual_prompt 中禁止出现或暗示以下元素:\n现代交通与城市:car, modern bus, subway, airplane,\
            \ skyscraper\n现代电子与屏幕:smartphone, computer, laptop, TV, projector screen,\
            \ LED, neon sign\n现代服饰与材质:hoodie, sneakers, plastic products\n现代室内与道具:whiteboard\
            \ marker, modern classroom, PowerPoint\n\n### 画面规则(Visual Rules)\nvisual_description:中文\
            \ 1–2 句;镜头、场景、动作、构图明确;与全篇叙事连贯。\nvisual_prompt:英文关键词逗号分隔;避免长段落;每条必须以 Global\
            \ Style Prompt 原样开头。\n角色相关:visual_prompt 与 visual_description 中不要出现角色\
            \ url;has_character=1 时可用通用人物词描述动作与构图。\n\n### 场景输出模板(每条 scene 必须齐全 6 键)\n\
            {\n  \"id\": 1,\n  \"narration\": \"...\",\n  \"visual_description\":\
            \ \"(中文1–2句;结合全篇故事与当前旁白,可执行。若旁白是被切断的半句,画面需与前一镜保持连贯)\",\n  \"visual_prompt\"\
            : \"{{#1768184532311.global_style#}}, ...\",\n  \"has_character\": 0,\n\
            \  \"characters\": []\n}\n\n### 生成前静默自检(Silent Self-check)\n1. 顶层仅 project_info\
            \ 与 scenes。每条 scene 恰好 6 个键。\n2. narration 为课件原文连续子串,逐字逐符号一致;不拼接不相邻片段。\n\
            3. **【生死红线检查】**:是否有任何一条 narration 超过了 45 个中文字符?如果有,**必须强制回退**,寻找居中的逗号进行“均衡拆分”!\n\
            4. **【防零碎检查】**:是否切出了大量 5-10 字的极短分镜?如果是,在不超过 45 字红线的前提下,将它们合并。\n5. 年代一致性自检:是否包含时代物证细节?是否混入了现代违禁物品(手机/LED等)?若出现,必须重写画面描述。"
        - id: a861d1c5-31ba-4aea-9615-37644be31741
          role: user
          text: '## 输入Courseware Text 格式


            剧本格式的文本片段,包含以下结构化要素:

            1. 【剧本】

            2. 【年代设定】

            3. 【角色设定】

            4. 【正文】


            只有正文需要作为讲稿进行分镜划分,年代设定、角色设定作为元信息使用,不要出现在 narration 中


            ## Courseware Text

            {{#1765354062480.content#}}'
        selected: false
        structured_output:
          schema:
            $schema: http://json-schema.org/draft-07/schema#
            additionalProperties: false
            description: 'Schema for art project configuration with scenes (v2): no
              character_anchor_prompt; scene supports multi-actors via characters[]'
            properties:
              project_info:
                additionalProperties: false
                description: Project metadata and global settings
                properties:
                  global_style:
                    description: Global artistic style prompt (must be copied verbatim
                      from the provided Global Style Prompt variable)
                    minLength: 1
                    type: string
                  title:
                    description: Project title
                    minLength: 1
                    type: string
                required:
                - title
                - global_style
                type: object
              scenes:
                description: List of scenes in the project
                items:
                  additionalProperties: false
                  allOf:
                  - else:
                      properties:
                        characters:
                          minItems: 1
                    if:
                      properties:
                        has_character:
                          const: 0
                      required:
                      - has_character
                    then:
                      properties:
                        characters:
                          maxItems: 0
                  description: Individual scene configuration
                  properties:
                    characters:
                      description: List of on-screen actor names selected from actors_json.
                        Empty array when has_character=0
                      items:
                        minLength: 1
                        type: string
                      type: array
                    has_character:
                      description: Whether on-screen characters appear in this scene
                        (0=no, 1=yes)
                      enum:
                      - 0
                      - 1
                      type: integer
                    id:
                      description: Unique identifier for the scene
                      minimum: 1
                      type: integer
                    narration:
                      description: Exact substring copied verbatim from Courseware
                        Text (no edits); only segmentation allowed
                      minLength: 1
                      type: string
                    visual_description:
                      description: Director's note for visual direction (Chinese,
                        1-2 sentences, executable on screen)
                      minLength: 1
                      type: string
                    visual_prompt:
                      description: Prompt for image/video generation (recommended
                        English keywords). Must start with project_info.global_style;
                        if has_character=1 include selected actors' prompt + reference
                        image URLs
                      minLength: 1
                      type: string
                  required:
                  - id
                  - narration
                  - visual_description
                  - visual_prompt
                  - has_character
                  - characters
                  type: object
                minItems: 1
                type: array
            required:
            - project_info
            - scenes
            title: Art Project Schema (v2)
            type: object
        structured_output_enabled: true
        title: 旁白-统一角色版本
        type: llm
        variables: []
        video:
          configs:
            variable_selector: []
          enabled: false
        vision:
          enabled: false
      height: 121
      id: '1768894989678'
      position:
        x: -80.1036657730136
        y: -185.01294724995353
      positionAbsolute:
        x: -80.1036657730136
        y: -185.01294724995353
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
    - data:
        desc: ''
        isInIteration: true
        isInLoop: false
        is_team_authorization: true
        iteration_id: '1766574059102'
        output_schema: null
        outputs:
        - type: array[file]
          value_selector:
          - '1765786558047'
          - output
          value_type: array[file]
          variable: download_files
        paramSchemas:
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 文件地址,用英文逗号隔开
            ja_JP: 文件地址,用英文逗号隔开
            pt_BR: 文件地址,用英文逗号隔开
            zh_Hans: 文件地址,用英文逗号隔开
          llm_description: ''
          max: null
          min: null
          name: file_urls
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: true
          scope: null
          template: null
          type: string
        params:
          file_urls: ''
        provider_id: cbfb0a5d-db67-4a7f-ac2c-414c16027f00
        provider_name: AI课件 - 批量下载文件
        provider_type: workflow
        retry_config:
          max_retries: 3
          retry_enabled: true
          retry_interval: 1000
        selected: false
        title: AI课件 - 批量下载文件
        tool_configurations: {}
        tool_description: AI课件 - 批量下载文件
        tool_label: AI课件 - 批量下载文件
        tool_name: aic_batch_download_file
        tool_node_version: '2'
        tool_parameters:
          file_urls:
            type: mixed
            value: '{{#1766574094213.concatenatedString#}}'
        type: tool
      height: 122
      id: '1768915366540'
      parentId: '1766574059102'
      position:
        x: 843.7849975311423
        y: 99.86043609268609
      positionAbsolute:
        x: 393.81033362581354
        y: 897.425961210274
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
      zIndex: 1002
    - data:
        code: "\nfunction main({scenes, project_info,video_aspect, translate_language,\
          \ content,global_style}) {\n    const new_project_info = {\n        ...project_info,\n\
          \        video_aspect: video_aspect,\n        translate_language: translate_language,\n\
          \        content: content,\n        global_style: global_style,\n    };\n\
          \    const storyboard = scenes.map(\n        item => ({\n            id\
          \ : item.id,\n            lines: item.narration,\n            visual_description:\
          \ item.visual_description,\n            motion_description: item.notes,\n\
          \            image_prompt: item.optimized_prompt,\n            actor_urls:\
          \ item.actor_urls,\n            actor_names: item.characters,\n        \
          \    image_url: item.image_url,\n            motion_prompt: item.motion_prompt,\n\
          \            need_lip_sync: item.need_lip_sync,\n            voice_id: item.voice_id,\n\
          \            voice_source: item.voice_source,\n            tts_url: item.audioUrl,\n\
          \            tts_duration: item.duration,\n            video_url: item.videoUrl,\n\
          \            video_duration: item.ceilDuration,\n\n            has_character:\
          \ item.has_character,\n            include_character: item.include_character,\n\
          \         })\n    );\n    const obj = {\n        project_info: new_project_info,\n\
          \        storyboard: storyboard,\n    };\n    const jsonString = JSON.stringify(obj);\n\
          \    return {\n        storyboard: storyboard,\n        jsonString: jsonString,\n\
          \        project_info: new_project_info,\n    }\n}\n"
        code_language: javascript
        desc: ''
        outputs:
          jsonString:
            children: null
            type: string
          project_info:
            children: null
            type: object
          storyboard:
            children: null
            type: array[object]
        selected: false
        title: 统一输出字段
        type: code
        variables:
        - value_selector:
          - '1766632760253'
          - output
          value_type: array[object]
          variable: scenes
        - value_selector:
          - '1766565906395'
          - projectInfo
          value_type: object
          variable: project_info
        - value_selector:
          - '1765354062480'
          - video_aspect
          value_type: string
          variable: video_aspect
        - value_selector:
          - '1765354062480'
          - translate_language
          value_type: string
          variable: translate_language
        - value_selector:
          - '1765354062480'
          - content
          value_type: string
          variable: content
        - value_selector:
          - '1768184532311'
          - global_style
          value_type: string
          variable: global_style
      height: 53
      id: '1768987193454'
      position:
        x: -629.1540626202004
        y: 3617.1554607865783
      positionAbsolute:
        x: -629.1540626202004
        y: 3617.1554607865783
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
    - data:
        audio:
          configs:
            variable_selector: []
          enabled: false
        context:
          enabled: false
          variable_selector: []
        desc: ''
        model:
          completion_params: {}
          mode: chat
          name: gpt-5.1-2025-11-13
          provider: aict/ai_hub/ai_hub
        prompt_template:
        - id: af5ff621-35f5-4517-982d-35c6ab06fb67
          role: system
          text: '你是一位专业的影视脚本分镜师和格式化专家。你的任务是将用户提供的【原始讲稿】转化为严格的【分镜脚本格式】。

            Rules & Logic

            分段原则 ([SCENE X]):

            每一个独立的“动作+台词”组合应作为一个独立的 [SCENE]。

            如果一段台词中间插入了动作描述(括号内容),必须将该动作前后的台词拆分为两个不同的 [SCENE] 块。

            每一个编号 [SCENE X] 代表一个独立的镜头或节拍。

            内容提取 (Extraction):

            META:从文首提取时间、地点、环境描写。如果后续镜头场景未变,可简写或留空。

            VISUAL:提取原始文本中圆括号 () 内的动作、神态、调度描写。不要把这些内容留在台词里。

            SPEAKER:提取说话的角色名。

            MODE:

            如果角色是“旁白”或“画外音”,填 VO。

            如果角色在画面中对话或独白,填 DIALOGUE。

            如果角色直视镜头说话(如采访/主播),填 ONCAM。

            LINE:提取纯净的口语台词。严禁包含任何括号或动作描写。

            Format Constraint: 请严格按照以下模板输出,不要添加额外的寒暄或总结:

            [SCENE #]

            META: <时间/地点/背景>

            VISUAL: <提取的动作描述>

            SPEAKER: <角色名>

            MODE: <ONCAM / VO / DIALOGUE>

            LINE: <纯净台词>

            Workflow Example

            Input:

            (他叹了口气)

            张三:今天天气真不好。(看向窗外)甚至有点想下雨。

            Output:

            [SCENE 1]

            META: ...

            VISUAL: 他叹了口气

            SPEAKER: 张三

            MODE: DIALOGUE

            LINE: 今天天气真不好。

            [SCENE 2]

            META: ...

            VISUAL: 看向窗外

            SPEAKER: 张三

            MODE: DIALOGUE

            LINE: 甚至有点想下雨。

            Task

            请读取下方的【原始讲稿】,并按上述规则转化为指定格式:

            '
        - id: 1241753d-0c1f-470c-b26c-fd155a722b02
          role: user
          text: '【讲稿】:

            {{#1776397744783.text#}}'
        selected: false
        title: 讲稿格式转换
        type: llm
        variables: []
        video:
          configs:
            variable_selector: []
          enabled: false
        vision:
          enabled: false
      height: 121
      id: '1768990832178'
      position:
        x: -87.82401233670322
        y: -428.647731270818
      positionAbsolute:
        x: -87.82401233670322
        y: -428.647731270818
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
    - data:
        desc: ''
        is_team_authorization: true
        output_schema: null
        outputs:
        - type: string
          value_selector:
          - '1767837407358'
          - draft_url
          value_type: string
          variable: draft_url
        - type: string
          value_selector:
          - '1767837407361'
          - script_url
          value_type: string
          variable: script_url
        - type: string
          value_selector:
          - '1769066911304'
          - video_url
          value_type: string
          variable: export_video_url
        - type: array[object]
          value_selector:
          - '1769066210458'
          - storyboard
          value_type: object
          variable: storyboard
        - type: object
          value_selector:
          - '1769066210458'
          - project_info
          value_type: object
          variable: project_info
        paramSchemas:
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 分镜描述脚本
            ja_JP: 分镜描述脚本
            pt_BR: 分镜描述脚本
            zh_Hans: 分镜描述脚本
          llm_description: ''
          max: null
          min: null
          name: script
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: true
          scope: null
          template: null
          type: string
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: video_width
            ja_JP: video_width
            pt_BR: video_width
            zh_Hans: video_width
          llm_description: ''
          max: null
          min: null
          name: video_width
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: false
          scope: null
          template: null
          type: number
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: video_height
            ja_JP: video_height
            pt_BR: video_height
            zh_Hans: video_height
          llm_description: ''
          max: null
          min: null
          name: video_height
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: false
          scope: null
          template: null
          type: number
        params:
          script: ''
          video_height: ''
          video_width: ''
        provider_id: db719041-7cc2-40c1-9278-38810f5d2c49
        provider_name: 构建剪映草稿
        provider_type: workflow
        selected: false
        title: 构建剪映草稿
        tool_configurations: {}
        tool_description: 按照约定的数据结构自动生成剪映草稿
        tool_label: 构建剪映草稿
        tool_name: aic_jianying_draft
        tool_node_version: '2'
        tool_parameters:
          ignore_subtitle:
            type: variable
            value:
            - '1765354062480'
            - ignore_subtitle
          script:
            type: mixed
            value: '{{#1768987193454.jsonString#}}'
          translate_language:
            type: mixed
            value: '{{#1765354062480.translate_language#}}'
          video_aspect:
            type: variable
            value:
            - '1765354062480'
            - video_aspect
          video_height:
            type: variable
            value:
            - '1766565906395'
            - video_height
          video_width:
            type: variable
            value:
            - '1766565906395'
            - video_width
        type: tool
      height: 93
      id: '1769069698077'
      position:
        x: -208.92701615362444
        y: 3617.1554607865783
      positionAbsolute:
        x: -208.92701615362444
        y: 3617.1554607865783
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
    - data:
        desc: ''
        isInIteration: true
        isInLoop: false
        is_team_authorization: true
        iteration_id: '1766579168310'
        output_schema: null
        outputs:
        - type: any
          value_selector:
          - '1753035060851'
          - error
          variable: error_message
        - type: any
          value_selector:
          - '1753289226679'
          - url
          variable: url
        - type: any
          value_selector:
          - '1753289226679'
          - duration
          value_type: string
          variable: duration
        paramSchemas:
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 文本(长度不超过300)
            ja_JP: 文本(长度不超过300)
            pt_BR: 文本(长度不超过300)
            zh_Hans: 文本(长度不超过300)
          llm_description: ''
          max: null
          min: null
          name: text
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: true
          scope: null
          template: null
          type: string
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 发音人(音色列表:https://w.101.com/FZF7Bv,取1.0版本列表的voice_type字段)
            ja_JP: 发音人(音色列表:https://w.101.com/FZF7Bv,取1.0版本列表的voice_type字段)
            pt_BR: 发音人(音色列表:https://w.101.com/FZF7Bv,取1.0版本列表的voice_type字段)
            zh_Hans: 发音人(音色列表:https://w.101.com/FZF7Bv,取1.0版本列表的voice_type字段)
          llm_description: ''
          max: null
          min: null
          name: speaker
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: true
          scope: null
          template: null
          type: string
        - auto_generate: null
          default: mp3
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 音频格式
            ja_JP: 音频格式
            pt_BR: 音频格式
            zh_Hans: 音频格式
          llm_description: ''
          max: null
          min: null
          name: audio_params_format
          options:
          - icon: null
            label:
              en_US: mp3
              ja_JP: mp3
              pt_BR: mp3
              zh_Hans: mp3
            value: mp3
          - icon: null
            label:
              en_US: ogg_opus
              ja_JP: ogg_opus
              pt_BR: ogg_opus
              zh_Hans: ogg_opus
            value: ogg_opus
          - icon: null
            label:
              en_US: pcm
              ja_JP: pcm
              pt_BR: pcm
              zh_Hans: pcm
            value: pcm
          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: 语速 取值范围[-50,100](100代表2.0倍速,-50代表0.5倍数)
            ja_JP: 语速 取值范围[-50,100](100代表2.0倍速,-50代表0.5倍数)
            pt_BR: 语速 取值范围[-50,100](100代表2.0倍速,-50代表0.5倍数)
            zh_Hans: 语速 取值范围[-50,100](100代表2.0倍速,-50代表0.5倍数)
          llm_description: ''
          max: null
          min: null
          name: audio_params_speech_rate
          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: enable_language_detector
          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: 音色情感
            ja_JP: 音色情感
            pt_BR: 音色情感
            zh_Hans: 音色情感
          llm_description: ''
          max: null
          min: null
          name: audio_params_emotion
          options:
          - icon: null
            label:
              en_US: 开心
              ja_JP: 开心
              pt_BR: 开心
              zh_Hans: 开心
            value: 开心
          - icon: null
            label:
              en_US: 悲伤
              ja_JP: 悲伤
              pt_BR: 悲伤
              zh_Hans: 悲伤
            value: 悲伤
          - icon: null
            label:
              en_US: 生气
              ja_JP: 生气
              pt_BR: 生气
              zh_Hans: 生气
            value: 生气
          - icon: null
            label:
              en_US: 惊讶
              ja_JP: 惊讶
              pt_BR: 惊讶
              zh_Hans: 惊讶
            value: 惊讶
          - icon: null
            label:
              en_US: 恐惧
              ja_JP: 恐惧
              pt_BR: 恐惧
              zh_Hans: 恐惧
            value: 恐惧
          - icon: null
            label:
              en_US: 厌恶
              ja_JP: 厌恶
              pt_BR: 厌恶
              zh_Hans: 厌恶
            value: 厌恶
          - icon: null
            label:
              en_US: 激动
              ja_JP: 激动
              pt_BR: 激动
              zh_Hans: 激动
            value: 激动
          - icon: null
            label:
              en_US: 冷漠
              ja_JP: 冷漠
              pt_BR: 冷漠
              zh_Hans: 冷漠
            value: 冷漠
          - icon: null
            label:
              en_US: 中性
              ja_JP: 中性
              pt_BR: 中性
              zh_Hans: 中性
            value: 中性
          - icon: null
            label:
              en_US: 沮丧
              ja_JP: 沮丧
              pt_BR: 沮丧
              zh_Hans: 沮丧
            value: 沮丧
          - icon: null
            label:
              en_US: 愉悦
              ja_JP: 愉悦
              pt_BR: 愉悦
              zh_Hans: 愉悦
            value: 愉悦
          - icon: null
            label:
              en_US: 愤怒
              ja_JP: 愤怒
              pt_BR: 愤怒
              zh_Hans: 愤怒
            value: 愤怒
          - icon: null
            label:
              en_US: 兴奋
              ja_JP: 兴奋
              pt_BR: 兴奋
              zh_Hans: 兴奋
            value: 兴奋
          - icon: null
            label:
              en_US: 对话/闲聊
              ja_JP: 对话/闲聊
              pt_BR: 对话/闲聊
              zh_Hans: 对话/闲聊
            value: 对话/闲聊
          - icon: null
            label:
              en_US: 深情
              ja_JP: 深情
              pt_BR: 深情
              zh_Hans: 深情
            value: 深情
          - icon: null
            label:
              en_US: 权威
              ja_JP: 权威
              pt_BR: 权威
              zh_Hans: 权威
            value: 权威
          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-5],默认4)
            ja_JP: 情感程度(取值范围[1-5],默认4)
            pt_BR: 情感程度(取值范围[1-5],默认4)
            zh_Hans: 情感程度(取值范围[1-5],默认4)
          llm_description: ''
          max: null
          min: null
          name: audio_params_emotion_scale
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: false
          scope: null
          template: null
          type: number
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 静音阈值
            ja_JP: 静音阈值
            pt_BR: 静音阈值
            zh_Hans: 静音阈值
          llm_description: ''
          max: null
          min: null
          name: additions_mute_cut_threshold
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: false
          scope: null
          template: null
          type: number
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 需要保留的静音长度(需要配置静音阈值)
            ja_JP: 需要保留的静音长度(需要配置静音阈值)
            pt_BR: 需要保留的静音长度(需要配置静音阈值)
            zh_Hans: 需要保留的静音长度(需要配置静音阈值)
          llm_description: ''
          max: null
          min: null
          name: additions_mute_cut_remain_ms
          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: 是否开启markdown解析过滤
            ja_JP: 是否开启markdown解析过滤
            pt_BR: 是否开启markdown解析过滤
            zh_Hans: 是否开启markdown解析过滤
          llm_description: ''
          max: null
          min: null
          name: disable_markdown_filter
          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: 是否可以播报latex公式(需开启markdown解析过滤)
            ja_JP: 是否可以播报latex公式(需开启markdown解析过滤)
            pt_BR: 是否可以播报latex公式(需开启markdown解析过滤)
            zh_Hans: 是否可以播报latex公式(需开启markdown解析过滤)
          llm_description: ''
          max: null
          min: null
          name: additions_enable_latex_tn
          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: 是否过滤括号内的部分
            ja_JP: 是否过滤括号内的部分
            pt_BR: 是否过滤括号内的部分
            zh_Hans: 是否过滤括号内的部分
          llm_description: ''
          max: null
          min: null
          name: length_to_filter_parenthesis
          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
        params:
          additions_enable_latex_tn: ''
          additions_mute_cut_remain_ms: ''
          additions_mute_cut_threshold: ''
          audio_params_emotion: ''
          audio_params_emotion_scale: ''
          audio_params_format: ''
          audio_params_speech_rate: ''
          disable_markdown_filter: ''
          enable_language_detector: ''
          length_to_filter_parenthesis: ''
          speaker: ''
          text: ''
        provider_id: 2405d153-9a5e-4285-8732-ac68bb7e902a
        provider_name: 豆包TTS语音合成1.0
        provider_type: workflow
        selected: false
        title: 豆包TTS语音合成1.0
        tool_configurations: {}
        tool_description: 豆包TTS语音合成1.0
        tool_label: 豆包TTS语音合成1.0
        tool_name: doubao_seed_tts_1_0
        tool_node_version: '2'
        tool_parameters:
          additions_enable_latex_tn:
            type: constant
            value: 'false'
          additions_mute_cut_remain_ms:
            type: constant
            value: null
          additions_mute_cut_threshold:
            type: constant
            value: null
          audio_params_emotion:
            type: constant
            value: null
          audio_params_emotion_scale:
            type: constant
            value: null
          audio_params_format:
            type: constant
            value: mp3
          audio_params_speech_rate:
            type: constant
            value: null
          disable_markdown_filter:
            type: constant
            value: 'false'
          enable_language_detector:
            type: constant
            value: 'false'
          length_to_filter_parenthesis:
            type: constant
            value: 'false'
          speaker:
            type: mixed
            value: '{{#1766579221158.actor_voice_type#}}'
          text:
            type: mixed
            value: '{{#1766579221158.result#}}'
        type: tool
      height: 93
      id: '1769510509007'
      parentId: '1766579168310'
      position:
        x: 1177.3437726577554
        y: 233.12308963170312
      positionAbsolute:
        x: 122.02707061261208
        y: 1673.888462238547
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
      zIndex: 1002
    - data:
        cases:
        - case_id: 'true'
          conditions:
          - comparison_operator: contains
            id: 8fcaee35-0313-4e21-b6cc-b9c15edb6ab1
            value: 独白
            varType: string
            variable_selector:
            - '1765354062480'
            - scene_mode
          id: 'true'
          logical_operator: and
        desc: ''
        isInIteration: true
        isInLoop: false
        iteration_id: '1766579168310'
        selected: false
        title: 条件分支 7
        type: if-else
      height: 125
      id: '1769519278388'
      parentId: '1766579168310'
      position:
        x: 288.65674915335455
        y: 190.0928756101182
      positionAbsolute:
        x: -766.6599528917887
        y: 1630.858248216962
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
      zIndex: 1002
    - data:
        desc: ''
        is_team_authorization: true
        output_schema: null
        outputs:
        - type: array[object]
          value_selector:
          - '1769687883065'
          - output
          value_type: array[object]
          variable: all_actors
        paramSchemas:
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 剧本片段/描述性文案
            ja_JP: 剧本片段/描述性文案
            pt_BR: 剧本片段/描述性文案
            zh_Hans: 剧本片段/描述性文案
          llm_description: ''
          max: null
          min: null
          name: content
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: true
          scope: null
          template: null
          type: string
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 选择风格/自定义描述
            ja_JP: 选择风格/自定义描述
            pt_BR: 选择风格/自定义描述
            zh_Hans: 选择风格/自定义描述
          llm_description: ''
          max: null
          min: null
          name: artistic_style
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: true
          scope: null
          template: null
          type: string
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 角色形象图(上传角色正面图,并标注用途【直接使用】/【参考人物特征】)
            ja_JP: 角色形象图(上传角色正面图,并标注用途【直接使用】/【参考人物特征】)
            pt_BR: 角色形象图(上传角色正面图,并标注用途【直接使用】/【参考人物特征】)
            zh_Hans: 角色形象图(上传角色正面图,并标注用途【直接使用】/【参考人物特征】)
          llm_description: ''
          max: null
          min: null
          name: images
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: false
          scope: null
          template: null
          type: files
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 角色列表2
            ja_JP: 角色列表2
            pt_BR: 角色列表2
            zh_Hans: 角色列表2
          llm_description: ''
          max: null
          min: null
          name: images2
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: false
          scope: null
          template: null
          type: files
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 角色参考图说明(第N张:姓名-直接使用/参考人物特征;)
            ja_JP: 角色参考图说明(第N张:姓名-直接使用/参考人物特征;)
            pt_BR: 角色参考图说明(第N张:姓名-直接使用/参考人物特征;)
            zh_Hans: 角色参考图说明(第N张:姓名-直接使用/参考人物特征;)
          llm_description: ''
          max: null
          min: null
          name: image_discription
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: false
          scope: null
          template: null
          type: string
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          label:
            en_US: 角色列表
            ja_JP: 角色列表
            pt_BR: 角色列表
            zh_Hans: 角色列表
          llm_description: ''
          max: null
          min: null
          name: all_actors
          options: []
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: false
          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: 是否入库
            ja_JP: 是否入库
            pt_BR: 是否入库
            zh_Hans: 是否入库
          llm_description: ''
          max: null
          min: null
          name: save_to_db
          options:
          - icon: null
            label:
              en_US: 是
              ja_JP: 是
              pt_BR: 是
              zh_Hans: 是
            value: 是
          - icon: null
            label:
              en_US: 否
              ja_JP: 否
              pt_BR: 否
              zh_Hans: 否
            value: 否
          placeholder:
            en_US: ''
            ja_JP: ''
            pt_BR: ''
            zh_Hans: ''
          precision: null
          required: false
          scope: null
          template: null
          type: select
        params:
          all_actors: ''
          artistic_style: ''
          content: ''
          image_discription: ''
          images: ''
          images2: ''
          save_to_db: ''
        provider_id: 93c73102-c21f-4f33-84fa-98932da1d480
        provider_name: AI课件 - AIGC - 角色生成V2
        provider_type: workflow
        selected: false
        title: AI课件 - AIGC - 角色生成V2
        tool_configurations: {}
        tool_description: AI课件 - 角色生成
        tool_label: AI课件 - AIGC - 角色生成V2
        tool_name: aic_aigc_gen_actor_v2
        tool_node_version: '2'
        tool_parameters:
          all_actors:
            type: mixed
            value: null
          artistic_style:
            type: mixed
            value: '{{#1765354062480.global_style#}}'
          content:
            type: mixed
            value: '{{#1765354062480.content#}}'
          image_discription:
            type: mixed
            value: '{{#1765354062480.characterAncher#}}'
          images:
            type: variable
            value:
            - '1765354062480'
            - character_ref_image
          images2:
            type: constant
            value: null
          save_to_db:
            type: constant
            value: 是
        type: tool
      height: 93
      id: '1772677692387'
      position:
        x: -468.8664809328596
        y: -1338.5594862198675
      positionAbsolute:
        x: -468.8664809328596
        y: -1338.5594862198675
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
    - data:
        audio:
          configs:
            variable_selector: []
          enabled: false
        context:
          enabled: false
          variable_selector: []
        desc: ''
        document:
          configs:
            variable_selector: []
          enabled: false
        model:
          completion_params:
            json_schema: "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\"\
              ,\n  \"title\": \"Art Project Schema (v2)\",\n  \"description\": \"\
              Schema for art project configuration with scenes (v2): no character_anchor_prompt;\
              \ scene supports multi-actors via characters[]\",\n  \"type\": \"object\"\
              ,\n  \"required\": [\n    \"project_info\",\n    \"scenes\"\n  ],\n\
              \  \"properties\": {\n    \"project_info\": {\n      \"type\": \"object\"\
              ,\n      \"description\": \"Project metadata and global settings\",\n\
              \      \"required\": [\n        \"title\",\n        \"global_style\"\
              \n      ],\n      \"properties\": {\n        \"title\": {\n        \
              \  \"type\": \"string\",\n          \"description\": \"Project title\"\
              ,\n          \"minLength\": 1\n        },\n        \"global_style\"\
              : {\n          \"type\": \"string\",\n          \"description\": \"\
              Global artistic style prompt (must be copied verbatim from the provided\
              \ Global Style Prompt variable)\",\n          \"minLength\": 1\n   \
              \     }\n      },\n      \"additionalProperties\": false\n    },\n \
              \   \"scenes\": {\n      \"type\": \"array\",\n      \"description\"\
              : \"List of scenes in the project\",\n      \"minItems\": 1,\n     \
              \ \"items\": {\n        \"type\": \"object\",\n        \"description\"\
              : \"Individual scene configuration\",\n        \"required\": [\n   \
              \       \"id\",\n          \"narration\",\n          \"visual_description\"\
              ,\n          \"visual_prompt\",\n          \"has_character\",\n    \
              \      \"characters\"\n        ],\n        \"properties\": {\n     \
              \     \"id\": {\n            \"type\": \"integer\",\n            \"\
              description\": \"Unique identifier for the scene\",\n            \"\
              minimum\": 1\n          },\n          \"narration\": {\n           \
              \ \"type\": \"string\",\n            \"description\": \"Exact substring\
              \ copied verbatim from Courseware Text (no edits); only segmentation\
              \ allowed\",\n            \"minLength\": 1\n          },\n         \
              \ \"visual_description\": {\n            \"type\": \"string\",\n   \
              \         \"description\": \"Director's note for visual direction (Chinese,\
              \ 1-2 sentences, executable on screen)\",\n            \"minLength\"\
              : 1\n          },\n          \"visual_prompt\": {\n            \"type\"\
              : \"string\",\n            \"description\": \"Prompt for image/video\
              \ generation (recommended English keywords). Must start with project_info.global_style;\
              \ if has_character=1 include selected actors' prompt + reference image\
              \ URLs\",\n            \"minLength\": 1\n          },\n          \"\
              has_character\": {\n            \"type\": \"integer\",\n           \
              \ \"description\": \"Whether on-screen characters appear in this scene\
              \ (0=no, 1=yes)\",\n            \"enum\": [\n              0,\n    \
              \          1\n            ]\n          },\n          \"characters\"\
              : {\n            \"type\": \"array\",\n            \"description\":\
              \ \"List of on-screen actor names selected from actors_json. Empty array\
              \ when has_character=0\",\n            \"items\": {\n              \"\
              type\": \"string\",\n              \"minLength\": 1\n            }\n\
              \          }\n        },\n        \"allOf\": [\n          {\n      \
              \      \"if\": {\n              \"properties\": {\n                \"\
              has_character\": {\n                  \"const\": 0\n               \
              \ }\n              },\n              \"required\": [\n             \
              \   \"has_character\"\n              ]\n            },\n           \
              \ \"then\": {\n              \"properties\": {\n                \"characters\"\
              : {\n                  \"maxItems\": 0\n                }\n        \
              \      }\n            },\n            \"else\": {\n              \"\
              properties\": {\n                \"characters\": {\n               \
              \   \"minItems\": 1\n                }\n              }\n          \
              \  }\n          }\n        ],\n        \"additionalProperties\": false\n\
              \      }\n    }\n  },\n  \"additionalProperties\": false\n}"
            response_format: json_schema
          mode: chat
          name: gemini-2.5-pro
          provider: aict/ai_hub/ai_hub
        prompt_template:
        - id: 03ed7e43-45b6-4f30-9d0d-9d30ea1c697e
          role: system
          text: "### 角色(Role)\n你是一名资深的 AI 视频导演与提示词工程师。你的任务是接收一份【背景故事】和一段【带时间戳的台词】,将台词切分为多个逻辑分镜。每个分镜的时长必须严格符合约束。最后,输出严格符合下方\
            \ JSON Schema 与全部约束的 JSON,其中必须包含每个分镜的精确时长(单位:秒)。\n\n---\n\n### 输入定义(Input\
            \ Definition)\n*   **【背景故事 (Background Story)】**: 一段描述故事整体背景、人物、环境和主旨的文本。这部分**不用于**生成\
            \ `narration`,仅作为创作 `visual_description` 时的情境参考。\n*   **【带时间戳的台词 (Timestamped\
            \ Lines)】**: 需要被切分成具体分镜的核心内容。这是一个文本列表,每行都以 `[分:秒.毫秒]` 的格式开头。这是生成 `narration`\
            \ 和计算 `shot_duration` 的唯一来源。\n\n---\n\n### 固定项目设置(输出中必须写入 project_info)\n\
            【Global Style Prompt】(输出中必须原样使用):\n{{#1768184532311.global_style#}}\n\n\
            【Actors JSON】(本项目可用角色全集;从中挑选出镜角色的 name ):\n{{#1768803191521.actors_text#}}\n\
            \n### **核心任务:基于时间戳的分镜切分(最高优先级)**\n\n1.  **时长硬性约束 (Hard Duration Constraint)**:每个分镜(scene)的**时长(单位:秒)必须严格控制在\
            \ 2 到 12 秒之间**。这是最高优先级的规则,优先于所有基于文本内容的切分偏好。\n2.  **时长计算方法 (Duration Calculation)**:\n\
            \    *   **对于非最后的分镜**:其时长 = **下一个分镜**第一句台词的【起始时间戳】 - **当前分镜**第一句台词的【起始时间戳】。结果以秒为单位。\n\
            \    *   **对于最后的分镜**:其时长 = (`T_final_line_start` + `T_final_line_estimated_duration`)\
            \ - `T_last_scene_start`。结果以秒为单位。\n        *   `T_last_scene_start` 是指这最后一个分镜第一句台词的起始时间戳。\n\
            \        *   `T_final_line_start` 是指【带时间戳的台词】输入中,**最后一句台词**的起始时间戳。\n \
            \       *   `T_final_line_estimated_duration` 是指最后一句台词的估算朗读时长,按 `文本字数\
            \ / 4.5` 秒来估算。\n3.  **切分策略 (Splitting Strategy)**:\n    *   **起始**:从【带时间戳的台词】的第一行开始,创建一个新分镜。\n\
            \    *   **累加**:不断将后续的连续台词行加入当前分镜。\n    *   **检查**:每加入一行,就使用上述“时长计算方法”计算一次当前分镜的累计时长(单位:秒)。\n\
            \    *   **决策**:\n        *   **上限触发**:如果加入**下一行**会导致分镜总时长**超过 12 秒**,则必须在当前行结束当前分镜,并从下一行开始一个新分镜。\n\
            \        *   **下限满足与择优**:一旦分镜时长**超过 2 秒**,就进入“可切分窗口”。此时,继续向后检查,寻找最佳的语义切分点(如句号、问号、感叹号)。目标是在满足\
            \ 2-12 秒的前提下,让分镜的结尾尽可能符合语义和句子完整性。\n        *   **合并过短分镜**:如果一个分镜根据语义切分后,时长**不足\
            \ 2 秒**,必须将其与下一个分镜合并,直到总时长满足要求。\n\n### 输出要求(严格:必须符合 Schema)\n*   只返回合法\
            \ JSON(不要 markdown、不要代码块、不要注释)。\n*   顶层 JSON 必须是以下结构:\n    ```json\n \
            \   {\n      \"project_info\": {\n        \"title\": \"...\",\n      \
            \  \"global_style\": \"...\"\n      },\n      \"scenes\": [...]\n    }\n\
            \    ```\n*   `project_info.global_style` 必须与【Global Style Prompt】完全一致。\n\
            *   每个 `scene` 对象只能包含以下键(不得多、不得少):`{ \"id\", \"narration\", \"shot_duration\"\
            , \"visual_description\", \"visual_prompt\", \"has_character\", \"characters\"\
            \ }`\n\n### 字段生成规则(按顺序)\n\n1.  **`narration` (旁白)**\n    *   **来源唯一性**:`narration`\
            \ 必须且只能来自【带时间戳的台词】。\n    *   **内容处理**:\n        *   将一个分镜内包含的所有台词行合并成一个字符串。\n\
            \        *   合并时,**必须彻底移除**每行开头的 `[分:秒.毫秒]` 时间戳标记。\n        *   保留原始台词之间的换行符\
            \ `\\n`,以维持对话格式。\n    *   **禁止操作**:不允许改写、总结、纠错或改变任何原始文本内容(除了移除时间戳)。\n\n\
            2.  **`shot_duration` (时长)**\n    *   **单位 (Unit)**: **秒 (Seconds)**。\n\
            \    *   **格式 (Format)**: 必须是一个数字(浮点数),代表该分镜的总时长,**单位为秒**。建议精确到小数点后两位。\n\
            \    *   **计算 (Calculation)**: 严格遵循【核心任务】中定义的“时长计算方法”。\n\n3.  **`has_character`\
            \ & `characters` (角色)**\n    *   `has_character` 必须为数字 `0` 或 `1`。\n  \
            \  *   判断依据:画面是否需要人物出镜来承载信息、完成动作或表达情绪。参考【背景故事】和当前 `narration` 来判断。\n \
            \   *   当 `has_character=1` 时,`characters` 为对象数组,`name` 必须在【Actors JSON】中精确匹配。\n\
            \    *   当 `has_character=0` 时,`characters` 必须为 `[]`。\n\n4.  **`visual_description`\
            \ (画面描述)**\n    *   **情境结合**:必须**综合【背景故事】提供的整体情境**和**当前分镜 `narration`\
            \ 的具体内容**来构思画面。\n    *   **要求**:中文 1–2 句,描述一个清晰、可拍摄的镜头。包含场景、人物(若有)的动作、表情、构图和氛围。确保分镜之间的人物、地点、道具具有连续性。\n\
            \n5.  **`visual_prompt` (视觉提示词)**\n    *   **格式**:英文关键词,用逗号分隔。\n    *\
            \   **强制前缀**:必须以【Global Style Prompt】的内容原样开头。\n    *   **时代/地点锁定**:若【背景故事】明确了时代(如“春秋时期”、“古代中国”)或地点,必须在提示词中加入相应的英文关键词(如\
            \ `ancient China`, `Spring and Autumn period`)来锁定视觉风格。\n\n### 其他约束(继承自原版)\n\
            *   **句子完整性**:在满足时长约束的前提下,尽量保持句子(以句号、问号、感叹号结尾)的完整性。\n*   **年代一致性**:`visual_description`\
            \ 和 `visual_prompt` 中描绘的服饰、建筑、道具等必须符合【背景故事】设定的时代,严禁出现时代错乱的物品(如古代场景出现手机)。\n\
            \n### 生成前静默自检(Silent Self-check)\n1.  **时长约束自检**:每个分镜的 `shot_duration`\
            \ 是否严格在 2 到 12 秒之间?\n2.  **`narration` 格式自检**:`narration` 是否已移除所有时间戳?是否为原文?\n\
            3.  **`shot_duration` 字段自检**:每个分镜是否都包含一个名为 `shot_duration` 的数字字段?其值是否代表秒?其计算是否符合规则?\n\
            4.  **`visual_description` 情境自检**:画面描述是否同时反映了【背景故事】和当前 `narration`?\n\
            5.  **JSON 结构自检**:顶层结构、scene 键(7个,不多不少)、`has_character` (0/1)、`characters`\
            \ 数组格式是否完全正确?\n6.  **风格与角色自检**:`visual_prompt` 是否以 `global_style` 开头?`characters`\
            \ 的 `name` 是否来自【Actors JSON】?"
        - id: 2cfdcff8-500a-4292-92d1-f0def750dfb2
          role: user
          text: '# 背景故事 (Background Story)


            {{#1765354062480.content#}}


            #带时间戳的台词 (Timestamped Lines)


            {{#1765354062480.timestamped_lines#}}'
        selected: false
        structured_output:
          schema:
            $schema: http://json-schema.org/draft-07/schema#
            additionalProperties: false
            description: 'Schema for art project configuration with scenes (v2): no
              character_anchor_prompt; scene supports multi-actors via characters[]'
            properties:
              project_info:
                additionalProperties: false
                description: Project metadata and global settings
                properties:
                  global_style:
                    description: Global artistic style prompt (must be copied verbatim
                      from the provided Global Style Prompt variable)
                    minLength: 1
                    type: string
                  title:
                    description: Project title
                    minLength: 1
                    type: string
                required:
                - title
                - global_style
                type: object
              scenes:
                description: List of scenes in the project
                items:
                  additionalProperties: false
                  allOf:
                  - else:
                      properties:
                        characters:
                          minItems: 1
                    if:
                      properties:
                        has_character:
                          const: 0
                      required:
                      - has_character
                    then:
                      properties:
                        characters:
                          maxItems: 0
                  description: Individual scene configuration
                  properties:
                    characters:
                      description: List of on-screen actor names selected from actors_json.
                        Empty array when has_character=0
                      items:
                        minLength: 1
                        type: string
                      type: array
                    has_character:
                      description: Whether on-screen characters appear in this scene
                        (0=no, 1=yes)
                      enum:
                      - 0
                      - 1
                      type: integer
                    id:
                      description: Unique identifier for the scene
                      minimum: 1
                      type: integer
                    narration:
                      description: Exact substring copied verbatim from Courseware
                        Text (no edits); only segmentation allowed
                      minLength: 1
                      type: string
                    shot_duration:
                      description: 'Storyboard duration, unit: seconds'
                      type: number
                    visual_description:
                      description: Director's note for visual direction (Chinese,
                        1-2 sentences, executable on screen)
                      minLength: 1
                      type: string
                    visual_prompt:
                      description: Prompt for image/video generation (recommended
                        English keywords). Must start with project_info.global_style;
                        if has_character=1 include selected actors' prompt + reference
                        image URLs
                      minLength: 1
                      type: string
                  required:
                  - id
                  - narration
                  - visual_description
                  - visual_prompt
                  - has_character
                  - characters
                  - shot_duration
                  type: object
                minItems: 1
                type: array
            required:
            - project_info
            - scenes
            title: Art Project Schema (v2)
            type: object
        structured_output_enabled: true
        title: 按时间戳划分分镜-旁白
        type: llm
        variables: []
        video:
          configs:
            variable_selector: []
          enabled: false
        vision:
          enabled: false
      height: 121
      id: '1773732078844'
      position:
        x: -80.1036657730136
        y: -610.9822976146623
      positionAbsolute:
        x: -80.1036657730136
        y: -610.9822976146623
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
    - data:
        audio:
          configs:
            variable_selector: []
          enabled: false
        context:
          enabled: false
          variable_selector: []
        desc: ''
        document:
          configs:
            variable_selector: []
          enabled: false
        model:
          completion_params: {}
          mode: chat
          name: gpt-5.4-2026-03-05
          provider: aict/ai_hub/ai_hub
        prompt_template:
        - id: fafb25fb-dfd4-4e00-8ddc-04b89edb9b86
          role: system
          text: "<role>\n你是一位资深的舞台剧本旁白改编师,擅长为主人翁独白剧本中的旁白进行润色与改编。你精通舞台叙事节奏,能精准把握旁白在独白剧本中的衔接功能——铺垫情感、承接转折、收束升华。\n\
            </role>\n\n\n<task>\n对用户提供的【主人翁独白】剧本进行旁白改编。仅改写剧本中所有「旁白」行的内容,使其更自然地衔接上下文;独白行及所有元信息必须原封不动地保留。\n\
            </task>\n\n\n<input_format>\n用户提供的剧本采用以下固定结构:\n\n\n【剧本】\n【年代设定】\n(年代与地点信息)\n\
            \n\n【角色设定】\n(角色名-年龄阶段)\n\n\n【正文】\n—— 场景N:场景名称 ——\n(场景类型 · 时间)\n旁白(旁白者名):旁白内容\n\
            独白(角色名):独白台词 △ 舞台指示\n……\n旁白(旁白者名):旁白内容\n\n\n其中:\n- 以「旁白(xxx):」开头的行为旁白行,是本次改编的唯一对象。\n\
            - 以「独白(xxx):」开头的行为独白行,包含台词文本和 △ 后的舞台指示。\n- 旁白可能出现在正文的任意位置:场景开头、独白段落之间、场景结尾。\n\
            - 一个剧本内可能包含多个场景。\n</input_format>\n\n\n<adaptation_rules>\n1. **旁白改编(唯一可修改内容)**:改写旁白行「:」之后的内容,使旁白更好地服务于以下目标:\n\
            \   - 开场旁白:快速建立场景情绪和氛围,为即将展开的独白做情感铺垫。\n   - 中间旁白(若有):承接前后独白段落的情感转折或主题切换,起到叙事呼吸与节奏调节的作用。\n\
            \   - 结尾旁白:收束独白的情感线索,进行适当升华或留白,衔接后续场景或全篇。\n2. **独白锁定(最高优先级)**:所有「独白(xxx):」行必须逐字逐符号完整保留,包括台词文本和\
            \ △ 后的舞台指示,**一个字符都不许变**。\n3. **旁白行数灵活**:旁白的行数可以根据改编需要增加或减少,不必与原稿行数一一对应。但应保持精练,旁白总量不应喧宾夺主。\n\
            4. **旁白位置区域不变**:旁白在正文中的相对位置区域保持不变——开头的旁白仍在开头,结尾的旁白仍在结尾,中间的旁白仍在对应的独白段落之间。不得将旁白挪到其他位置区域。\n\
            5. **旁白者名称不变**:旁白括号内的旁白者名称(如「讲师」)必须与原稿保持一致,不得修改。\n6. **元信息完全保留**:【剧本】【年代设定】【角色设定】标题行、场景分隔行(——\
            \ 场景N ——)、场景类型描述行(如「内景 · 日」)等所有非旁白、非独白的结构行,必须原样输出,不得增删改。\n</adaptation_rules>\n\
            \n\n<narration_style_guide>\n1. **衔接自然**:旁白应自然承上启下,不生硬、不突兀,让观众感受到场景的连贯流动。\n\
            2. **风格协调**:旁白的语言风格和情感温度应与相邻独白的基调一致——独白沉静则旁白内敛,独白激昂则旁白有力。\n3. **精练克制**:旁白是配角,不是主角。每句旁白都应有明确的衔接功能,避免空泛抒情或重复独白已表达的内容。\n\
            4. **年代呼应**:旁白的用词和意象应贴合剧本的年代设定,增强时代沉浸感。\n5. **画面感**:旁白可适当描写场景中的视觉/听觉/氛围细节,为观众构建想象空间,但必须与场景设定吻合。\n\
            6. **不越界**:旁白不得替独白表态、下结论或透露独白未涉及的信息,不得添加原剧本中不存在的事实性内容。\n</narration_style_guide>\n\
            \n\n<output_format>\n输出格式必须与输入格式**完全一致**,严格遵循:\n- 【剧本】【年代设定】【角色设定】等段落标题原样保留\n\
            - 场景分隔行(—— 场景N:场景名称 ——)原样保留\n- 场景类型描述行(如「内景 · 日」)原样保留\n- 旁白行格式:旁白(旁白者名):改编后的内容\n\
            - 独白行格式:独白(角色名):原文内容 △ 原文舞台指示(逐字不变)\n\n\n仅旁白行的「:」之后的内容会被改编,其余所有内容原样输出。\n\
            </output_format>\n\n\n<constraints>\n- 严禁修改独白行的任何内容,包括台词文本和 △ 后的舞台指示。\n\
            - 严禁修改元信息(年代设定、角色设定、场景标题、场景类型行等)。\n- 严禁改变旁白者括号内的名称标签。\n- 旁白不得添加原剧本中不存在的事实性信息或虚构情节。\n\
            - 改编后所有旁白行的总字数不应超过原旁白总字数的 2 倍。\n- 不得在旁白中直接引用或复述独白的原文台词。\n</constraints>\n\
            \n\n<example>\n<input>\n【剧本】\n【年代设定】\n1944年 法国尼斯\n\n\n【角色设定】\n亨利·马蒂斯-老年\n\
            \n\n【正文】\n—— 场景22:尼斯工作室 ——\n内景 · 日\n旁白(讲师):窗外的海光反射进屋里,\n旁白(讲师):老旧的画架旁,\n\
            旁白(讲师):我在纸上铺开成片的色彩。\n独白(亨利·马蒂斯):如果你问我是妥协,还是跃向前方的一步,我更愿意相信是后者。 △ 靠在椅背上,轻轻合眼\n\
            独白(亨利·马蒂斯):画笔其实还在我手里,可是心里那条线,已经不愿再乖乖服从透视的规矩了。 △ 低头看向手中的画笔,露出淡淡笑意\n独白(亨利·马蒂斯):我慢慢放下那些严苛的消失点和构图法则,让画面不必再向现实交代一切。\
            \ △ 抬手在空中比划透视线,又随即打散\n独白(亨利·马蒂斯):我开始用大块的色面铺下去,让颜色像幕布一样平展在画面上,而不是假装伸进远处的空间。\
            \ △ 伸手比划出大面积色块的形状\n独白(亨利·马蒂斯):线条也变得干脆,它们不再解释体积和深度,只是像符号一样,记录节奏和停顿。 △ 手指在桌上轻敲,像数拍子\n\
            独白(亨利·马蒂斯):有时我觉得,这些线只是在呼吸,在画面上跳动,它们更像是音乐,而不是建筑图纸。 △ 目光追随墙上的作品,轻轻晃头\n独白(亨利·马蒂斯):其实,我只是提前排练,排练一个更自由、更纯粹的色彩世界。\
            \ △ 身体微微前倾,语气压低\n独白(亨利·马蒂斯):在那个世界里,一切复杂的东西都被简化成最清晰的节奏,只剩色彩和线条本身的情感。 △\
            \ 缓缓摊开手掌,像摊开一幅画\n独白(亨利·马蒂斯):所以哪怕我还没彻底放下画笔,我已经悄悄摆脱了旧的束缚,先一步走进了那片新的境界。 △\
            \ 望向窗外的光线,神情安然坚定\n旁白(讲师):在这场无声的排练里,\n旁白(讲师):新的力量缓缓酝酿,\n旁白(讲师):准备冲破旧有边界,\n\
            旁白(讲师):也改写他对色彩的全部想象。\n</input>\n<output>\n【剧本】\n【年代设定】\n1944年 法国尼斯\n\n\
            \n【角色设定】\n亨利·马蒂斯-老年\n\n\n【正文】\n—— 场景22:尼斯工作室 ——\n内景 · 日\n旁白(讲师):地中海的光穿过纱帘落在画布上,\n\
            旁白(讲师):七十五岁的马蒂斯坐在画架前,手边散落着剪刀和彩纸。\n独白(亨利·马蒂斯):如果你问我是妥协,还是跃向前方的一步,我更愿意相信是后者。\
            \ △ 靠在椅背上,轻轻合眼\n独白(亨利·马蒂斯):画笔其实还在我手里,可是心里那条线,已经不愿再乖乖服从透视的规矩了。 △ 低头看向手中的画笔,露出淡淡笑意\n\
            独白(亨利·马蒂斯):我慢慢放下那些严苛的消失点和构图法则,让画面不必再向现实交代一切。 △ 抬手在空中比划透视线,又随即打散\n独白(亨利·马蒂斯):我开始用大块的色面铺下去,让颜色像幕布一样平展在画面上,而不是假装伸进远处的空间。\
            \ △ 伸手比划出大面积色块的形状\n独白(亨利·马蒂斯):线条也变得干脆,它们不再解释体积和深度,只是像符号一样,记录节奏和停顿。 △ 手指在桌上轻敲,像数拍子\n\
            独白(亨利·马蒂斯):有时我觉得,这些线只是在呼吸,在画面上跳动,它们更像是音乐,而不是建筑图纸。 △ 目光追随墙上的作品,轻轻晃头\n独白(亨利·马蒂斯):其实,我只是提前排练,排练一个更自由、更纯粹的色彩世界。\
            \ △ 身体微微前倾,语气压低\n独白(亨利·马蒂斯):在那个世界里,一切复杂的东西都被简化成最清晰的节奏,只剩色彩和线条本身的情感。 △\
            \ 缓缓摊开手掌,像摊开一幅画\n独白(亨利·马蒂斯):所以哪怕我还没彻底放下画笔,我已经悄悄摆脱了旧的束缚,先一步走进了那片新的境界。 △\
            \ 望向窗外的光线,神情安然坚定\n旁白(讲师):画笔尚未搁下,新的篇章已悄然翻开——\n旁白(讲师):那些即将从剪刀下诞生的色彩,将重新定义他与艺术的对话。\n\
            </output>\n</example>\n\n\n<self_check>\n改编完成后,逐项检查以下要点,不通过则修正后再输出:\n\
            1. 所有独白行是否与原稿逐字完全一致(包括 △ 后的舞台指示)?\n2. 元信息(【年代设定】【角色设定】、场景标题行、场景类型行)是否原样保留?\n\
            3. 旁白者括号内的名称是否与原稿一致?\n4. 旁白的衔接是否自然流畅,是否有效服务于独白的情感推进?\n5. 旁白是否精练克制,没有复述独白内容或喧宾夺主?\n\
            6. 旁白内容是否贴合年代设定,没有出现违和的时代错位?\n7. 输出的整体格式是否与输入完全一致?\n8. 旁白总字数是否在合理范围内(不超过原旁白总字数的\
            \ 2 倍)?\n</self_check>\n"
        - id: ed7b75c3-842d-4e56-b397-1b17d19edce3
          role: user
          text: '【原始讲稿】:

            {{#1765354062480.content#}}'
        selected: false
        title: LLM 7
        type: llm
        variables: []
        video:
          configs:
            variable_selector: []
          enabled: false
        vision:
          enabled: false
      height: 121
      id: '1776397744783'
      position:
        x: -413.41856763676833
        y: -434.2029796352138
      positionAbsolute:
        x: -413.41856763676833
        y: -434.2029796352138
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
    - data:
        desc: ''
        isInIteration: true
        isInLoop: false
        is_team_authorization: true
        iteration_id: '1766632760253'
        output_schema: null
        outputs:
        - type: any
          value_selector:
          - '1766758899587'
          - video_url
          value_type: string
          variable: url
        - type: any
          value_selector:
          - '1766758899587'
          - last_frame_url
          value_type: string
          variable: last_frame_url
        - type: any
          value_selector:
          - '1753292759443'
          - 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: variable
            value:
            - '1766632810839'
            - ceilDuration
          generate_audio:
            type: constant
            value: 'false'
          image:
            type: variable
            value:
            - '1766647889824'
            - files
          prompt:
            type: mixed
            value: '{{#1766632810839.motion_prompt#}}'
          ratio:
            type: variable
            value:
            - '1765354062480'
            - video_aspect
          resolution:
            type: constant
            value: 1080p
          return_last_frame:
            type: constant
            value: 'false'
          seed:
            type: constant
            value: null
          watermark:
            type: constant
            value: 'false'
        type: tool
      height: 93
      id: '1779099074767'
      parentId: '1766632760253'
      position:
        x: 681.0544063805041
        y: 445.85424339063593
      positionAbsolute:
        x: 100.34547273135934
        y: 3134.36332417212
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
      zIndex: 1002
    viewport:
      x: 495.75813551395436
      y: -2835.955792019721
      zoom: 1.0800597212636867