app:
  description: 将法律文本转换为规范的 Markdown 格式
  icon: 🤖
  icon_background: '#FFEAD5'
  mode: workflow
  name: 法律文本格式化助手
  use_icon_as_answer_icon: false
kind: app
version: 0.1.5
workflow:
  conversation_variables: []
  environment_variables: []
  features:
    file_upload:
      allowed_file_extensions: []
      allowed_file_types: []
      allowed_file_upload_methods: []
      enabled: false
      fileUploadConfig:
        audio_file_size_limit: 50
        batch_count_limit: 5
        file_size_limit: 15
        image_file_size_limit: 10
        video_file_size_limit: 100
        workflow_file_upload_limit: 10
      image:
        enabled: false
        number_limits: 3
        transfer_methods: []
      number_limits: 3
    opening_statement: ''
    retriever_resource:
      enabled: false
    sensitive_word_avoidance:
      enabled: false
    speech_to_text:
      enabled: false
    suggested_questions: []
    suggested_questions_after_answer:
      enabled: false
    text_to_speech:
      enabled: false
      language: ''
      voice: ''
  graph:
    edges:
    - data:
        isInIteration: false
        sourceType: start
        targetType: llm
      id: 1735626727052-source-1735632132331-target
      source: '1735626727052'
      sourceHandle: source
      target: '1735632132331'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        sourceType: llm
        targetType: code
      id: 1735632132331-source-1735629665760-target
      source: '1735632132331'
      sourceHandle: source
      target: '1735629665760'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: true
        iteration_id: '1735632653899'
        sourceType: iteration-start
        targetType: llm
      id: 1735632653899start-source-1735632981287-target
      source: 1735632653899start
      sourceHandle: source
      target: '1735632981287'
      targetHandle: target
      type: custom
      zIndex: 1002
    - data:
        isInIteration: false
        sourceType: code
        targetType: end
      id: 1735633258714-source-1735628174959-target
      source: '1735633258714'
      sourceHandle: source
      target: '1735628174959'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        sourceType: code
        targetType: iteration
      id: 1735629665760-source-1735632653899-target
      source: '1735629665760'
      sourceHandle: source
      target: '1735632653899'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        sourceType: iteration
        targetType: code
      id: 1735632653899-source-1735633258714-target
      source: '1735632653899'
      sourceHandle: source
      target: '1735633258714'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        sourceType: code
        targetType: tool
      id: 1735633258714-source-1735802619533-target
      source: '1735633258714'
      sourceHandle: source
      target: '1735802619533'
      targetHandle: target
      type: custom
      zIndex: 0
    nodes:
    - data:
        desc: ''
        selected: false
        title: 开始
        type: start
        variables:
        - label: legal_text
          max_length: 80000
          options: []
          required: true
          type: paragraph
          variable: legal_text
      height: 88
      id: '1735626727052'
      position:
        x: 27.937620977678364
        y: 292
      positionAbsolute:
        x: 27.937620977678364
        y: 292
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
    - data:
        desc: ''
        outputs:
        - value_selector:
          - '1735633258714'
          - final_text
          variable: text
        selected: false
        title: 结束
        type: end
      height: 88
      id: '1735628174959'
      position:
        x: 1198.1485031082693
        y: 292
      positionAbsolute:
        x: 1198.1485031082693
        y: 292
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
    - data:
        code: "import json\nimport re\n\ndef main(text, analysis_result):\n    # 处理\
          \ analysis_result，移除可能的 markdown 标记\n    analysis_text = analysis_result.strip()\n\
          \    if analysis_text.startswith('```json'):\n        analysis_text = analysis_text[7:]\n\
          \    if analysis_text.endswith('```'):\n        analysis_text = analysis_text[:-3]\n\
          \    \n    # 使用 json.loads 而不是 eval\n    analysis = json.loads(analysis_text.strip())\n\
          \    text_type = analysis.get('text_type')\n    structure = analysis.get('structure',\
          \ {})\n    target_length = 2000  # 保持2000字符\n    max_length = target_length\
          \ * 1.1  # 允许超出10%\n    \n    def get_split_point_checker(text_type, structure):\n\
          \        if text_type == 'law_text':\n            def is_split_point(line,\
          \ current_length):\n                # 严格按照章节分割\n                return line.strip().startswith('第')\
          \ and ('章' in line or '编' in line)\n        else:\n            def is_split_point(line,\
          \ current_length):\n                # 严格按照案例分割\n                return (line.strip().startswith('案例')\
          \ or\n                       line.strip().endswith('案') or\n           \
          \            line.strip().endswith('判决书') or\n                       line.strip().endswith('裁定书'))\n\
          \                \n        return is_split_point\n    \n    is_split_point\
          \ = get_split_point_checker(text_type, structure)\n    \n    # 预处理：移除多余的空行，保留单个空行\n\
          \    raw_lines = text.split('\\n')\n    lines = []\n    prev_line_empty\
          \ = True\n    \n    for line in raw_lines:\n        line = line.rstrip()\n\
          \        is_empty = not line.strip()\n        \n        # 保留有意义的空行，但避免连续空行\n\
          \        if not is_empty or not prev_line_empty:\n            lines.append(line)\n\
          \        prev_line_empty = is_empty\n    \n    raw_segments = []  # 改名为\
          \ raw_segments\n    current_segment = []\n    current_length = 0\n    \n\
          \    for i, line in enumerate(lines):\n        line_length = len(line.strip())\n\
          \        \n        # 如果当前段落为空，直接添加\n        if not current_segment:\n  \
          \          current_segment.append(line)\n            current_length = line_length\n\
          \            continue\n        \n        # 检查是否是分割点\n        if is_split_point(line,\
          \ current_length):\n            # 在分割点处分割\n            if current_segment:\n\
          \                raw_segments.append('\\n'.join(current_segment))\n    \
          \        current_segment = [line]\n            current_length = line_length\n\
          \            continue\n        \n        # 如果超过最大长度，强制分割\n        if current_length\
          \ + line_length > max_length:\n            raw_segments.append('\\n'.join(current_segment))\n\
          \            current_segment = [line]\n            current_length = line_length\n\
          \        else:\n            current_segment.append(line)\n            current_length\
          \ += line_length\n    \n    # 添加最后一个段落\n    if current_segment:\n      \
          \  raw_segments.append('\\n'.join(current_segment))\n    \n    # 确保至少返回一个段落\n\
          \    if not raw_segments:\n        raw_segments = [text]\n    \n    # 格式化为字符串数组\n\
          \    segments = []\n    for segment in raw_segments:\n        if segment.strip():\
          \  # 确保段落不为空\n            segments.append(segment.strip())\n    \n    #\
          \ 如果没有有效段落，返回包含整个文本的单个段落\n    if not segments:\n        segments = [text.strip()]\n\
          \    \n    # 返回包含 segments 数组的字典\n    return {\n        \"segments\": segments\n\
          \    }"
        code_language: python3
        desc: '代码

          用于文本的分割，适应大模型一次性输出长度

          同时需要输出数组提供给迭代模块用于并行处理'
        outputs:
          segments:
            children: null
            type: array[string]
        selected: false
        title: 文本分割
        type: code
        variables:
        - value_selector:
          - '1735626727052'
          - legal_text
          variable: text
        - value_selector:
          - '1735632132331'
          - text
          variable: analysis_result
      height: 144
      id: '1735629665760'
      position:
        x: 730.6999387678718
        y: 58.97775019592794
      positionAbsolute:
        x: 730.6999387678718
        y: 58.97775019592794
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
    - data:
        context:
          enabled: true
          variable_selector:
          - '1735626727052'
          - legal_text
        desc: 用LLM分析文本是法条还是案例，返回json
        model:
          completion_params:
            temperature: 0.3
          mode: chat
          name: deepseek-chat
          provider: deepseek
        prompt_template:
        - edition_type: basic
          id: 8a14522d-d436-4e39-96cc-770cd9daee9e
          role: system
          text: "你是一个专业的法律文本分析助手。请分析输入的文本，判断其是法律条文还是法律案例，并分析其结构特征。\n\n请直接返回JSON格式（不要包含任何markdown标记），必须包含以下字段：\n\
            {\n  \"text_type\": \"law_text/case_text\",  // 文本类型：law_text为法律条文，case_text为法律案例\n\
            \  \"confidence\": number,                // 判断的置信度（0-1）\n  \"reason\"\
            : \"string\",                 // 判断依据\n  \"structure\": {            \
            \          // 结构特征\n    \"has_chapters\": boolean,          // 是否有章节划分\n\
            \    \"has_articles\": boolean,          // 是否有条款编号\n    \"has_case_number\"\
            : boolean,       // 是否有案号\n    \"has_court_parts\": boolean,       //\
            \ 是否有法院审理部分\n    \"main_sections\": [\"string\"]       // 主要段落类型\n  },\n\
            \  \"split_strategy\": \"string\",         // 建议的分割策略\n  \"suggested_length\"\
            : number          // 建议的每段最大字符数\n}\n\n注意：直接返回JSON对象，不要包含任何其他格式或标记。"
        - id: 763d1e40-d586-45e3-8f05-97e864649e50
          role: user
          text: '   请分析以下法律文本的类型和结构：

            {{#1735626727052.legal_text#}}'
        selected: false
        title: 文本分析
        type: llm
        variables: []
        vision:
          enabled: false
      height: 140
      id: '1735632132331'
      position:
        x: 364.0194119658755
        y: 263.74947118141506
      positionAbsolute:
        x: 364.0194119658755
        y: 263.74947118141506
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
    - data:
        desc: 将分割的文本
        error_handle_mode: terminated
        height: 212
        is_parallel: true
        iterator_selector:
        - '1735629665760'
        - segments
        output_selector:
        - '1735632981287'
        - text
        output_type: array[string]
        parallel_nums: 5
        selected: false
        start_node_id: 1735632653899start
        title: 段落迭代
        type: iteration
        width: 387
      height: 212
      id: '1735632653899'
      position:
        x: 679.7666095919487
        y: 263.74947118141506
      positionAbsolute:
        x: 679.7666095919487
        y: 263.74947118141506
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 387
      zIndex: 1
    - data:
        desc: ''
        isInIteration: true
        selected: false
        title: ''
        type: iteration-start
      draggable: false
      height: 48
      id: 1735632653899start
      parentId: '1735632653899'
      position:
        x: 24
        y: 68
      positionAbsolute:
        x: 703.7666095919487
        y: 331.74947118141506
      selectable: false
      sourcePosition: right
      targetPosition: left
      type: custom-iteration-start
      width: 44
      zIndex: 1002
    - data:
        context:
          enabled: false
          variable_selector: []
        desc: 用LLM进行格式调整，使用if else提示词可选择性调整法条或案例
        isInIteration: true
        iteration_id: '1735632653899'
        model:
          completion_params:
            temperature: 0.3
          mode: chat
          name: deepseek-chat
          provider: deepseek
        prompt_template:
        - id: e959760d-7fb9-4553-8696-7dcb4ebf039e
          role: system
          text: '{{#if (eq analysis_result.text_type "law_text")}}

            你是一个markdown格式调整助手，负责把我发送给你的法律条文进行格式的调整。请只处理我提供的这一段文本，不要考虑其他段落。除了我要求你修改的内容，其他部分不要做任何修改，包括序号、文字等，你只需要添加或删除markdown格式标记和回车就行


            格式调整规则：

            - 在章前面添加一级markdown格式

            - 在不同条文之间，添加空行

            - 每一条条文内部换行的时候，不应当有多余的空行

            - "第X条"进行加粗

            - 如果一段文字的最后没有句号或分号，则删除后方的回车

            - 输出我想要的内容，不需要其他格式包裹

            {{else}}


            # 角色

            你是一个案例汇编的格式助手，负责帮我调整文档的格式


            # 调整规则

            1.案例序号或者名称前添加一级markdown格式

            2.每个案例的章节前添加二级markdown格式

            3.每个案例的章节内部，不应当有大于1个的回车

            4.输出我想要的内容，不需要其他格式包裹，除了我要求你修改的内容，其他部分不要做任何修改，包括序号、文字等，你只需要添加或删除markdown格式标记和回车就行



            # 示例

            ## 示例1

            """

            首例汇校他人作品的著作权纠纷案


            ——钱某书、某文学出版社与胥某芬、某文艺出版社著作权纠纷案

            一审：上海市中级人民法院（1993）沪中民初字第35号


            二审：上海市高级人民法院（1995）沪高民（知）终字第7号

            案情摘要

            《围城》一书的作者原告钱某书发现被告胥某芬、被告某文艺出版社未经其同意，对《围城》进行汇校并予出版，侵害了自己对《围城》一书的演绎权和出版使用权，故诉至法院，请求判令胥某芬、某文艺出版社停止侵权、赔偿损失，并在全国性报纸上公开赔礼道歉。


            裁判结果

            一审法院经审理认为，胥某芬未经著作权人同意，对《围城》进行汇校，某文艺出版社出版《围城》汇校本，共同侵害了钱某书就作品《围城》享有的著作权。

            """

            应当调整为：

            """

            # 首例汇校他人作品的著作权纠纷案

            ——钱某书、某文学出版社与胥某芬、某文艺出版社著作权纠纷案


            一审：上海市中级人民法院（1993）沪中民初字第35号

            二审：上海市高级人民法院（1995）沪高民（知）终字第7号


            ## 案情摘要

            《围城》一书的作者原告钱某书发现被告胥某芬、被告某文艺出版社未经其同意，对《围城》进行汇校并予出版，侵害了自己对《围城》一书的演绎权和出版使用权，故诉至法院，请求判令胥某芬、某文艺出版社停止侵权、赔偿损失，并在全国性报纸上公开赔礼道歉。


            ## 裁判结果

            一审法院经审理认为，胥某芬未经著作权人同意，对《围城》进行汇校，某文艺出版社出版《围城》汇校本，共同侵害了钱某书就作品《围城》享有的著作权。"""



            ## 示例2

            """

            01


            微某公司诉简某公司等不正当竞争纠纷案


            ——未经授权调用服务器API接口获取数据构成不正当竞争



            基本案情


            微某公司是新浪微博的经营者，简某公司及其深圳分公司是iDataAPI网站经营者。iDataAPI用户可通过网站提供的API（应用程序编程接口）获取大量新浪微博数据，不但完全覆盖了微博网页上的相应内容数据，还包含大量微博平台运营管理过程的后台服务数据，以及微某公司的大数据产品“微指数”，截至2019年5月，用户总调用次数超过21.79亿次。


            裁判结果


            广东省高级人民法院生效判决认为，微某公司对依法依规持有的微博数据享有自主管控、合法利用并获取经济利益的权益。


            典型意义


            数据是数字经济高质量发展的“石油”，是加快发展新质生产力、提升全要素生产率的重要基础资源。本案为数据竞争纠纷最高判赔数额之一，系全国首例非法调用服务器API接口获取数据予以交易转卖的案件。

            """

            应当调整为：

            """

            # 01 微某公司诉简某公司等不正当竞争纠纷案——未经授权调用服务器API接口获取数据构成不正当竞争


            ## 基本案情

            微某公司是新浪微博的经营者，简某公司及其深圳分公司是iDataAPI网站经营者。iDataAPI用户可通过网站提供的API（应用程序编程接口）获取大量新浪微博数据，不但完全覆盖了微博网页上的相应内容数据，还包含大量微博平台运营管理过程的后台服务数据，以及微某公司的大数据产品“微指数”，截至2019年5月，用户总调用次数超过21.79亿次。


            ## 裁判结果

            广东省高级人民法院生效判决认为，微某公司对依法依规持有的微博数据享有自主管控、合法利用并获取经济利益的权益。


            ## 典型意义

            数据是数字经济高质量发展的“石油”，是加快发展新质生产力、提升全要素生产率的重要基础资源。本案为数据竞争纠纷最高判赔数额之一，系全国首例非法调用服务器API接口获取数据予以交易转卖的案件。

            """

            ## 示例3

            """

            案例一



            首例大数据搬家软件不正当竞争案


            ——公开数据权益归属及不正当数据利用行为的认定


            【案号】




            （2021）粤0192民初1692号/（2023）粤73民终995号[浙江天某网络有限公司、浙江淘某网络有限公司诉广州锐某信息科技有限公司等不正当竞争纠纷案]




            【案情与裁判】




            广州锐某信息科技有限公司（以下简称锐某公司）开发运营“铺货易”“代销易”软件，按权限等级、服务周期不同在拼多多服务市场内宣传销售。



            广州互联网法院经审理认为，商品数据是电商平台提供服务的基本要素，天某公司、淘某公司作为电商平台经营者，依法依约收集并处理商品数据，既有资金、技术、人力投入，也有防范、监测、维权支出，有权对平台内商品数据进行衍生利用和开发，有权对平台内商品数据主张权利。


            锐某公司向广州知识产权法院提起上诉后，撤回上诉。本案现已经生效。




            【典型意义】




            本案系全国首例涉电商平台商品大数据不正当竞争案。本案裁判通过有效规范大数据不正当利用行为，有助于健全数据治理规则，发挥司法赋能数据产业发展的积极效能。

            """

            应当调整为：

            """

            # 案例一 首例大数据搬家软件不正当竞争案——公开数据权益归属及不正当数据利用行为的认定


            ## 【案号】

            （2021）粤0192民初1692号/（2023）粤73民终995号[浙江天某网络有限公司、浙江淘某网络有限公司诉广州锐某信息科技有限公司等不正当竞争纠纷案]


            ## 【案情与裁判】

            广州锐某信息科技有限公司（以下简称锐某公司）开发运营“铺货易”“代销易”软件，按权限等级、服务周期不同在拼多多服务市场内宣传销售。

            广州互联网法院经审理认为，商品数据是电商平台提供服务的基本要素，天某公司、淘某公司作为电商平台经营者，依法依约收集并处理商品数据，既有资金、技术、人力投入，也有防范、监测、维权支出，有权对平台内商品数据进行衍生利用和开发，有权对平台内商品数据主张权利。

            锐某公司向广州知识产权法院提起上诉后，撤回上诉。本案现已经生效。


            ## 【典型意义】

            本案系全国首例涉电商平台商品大数据不正当竞争案。本案裁判通过有效规范大数据不正当利用行为，有助于健全数据治理规则，发挥司法赋能数据产业发展的积极效能。

            """


            ## 示例4

            """

            6浙江某生物技术有限公司与某生物医药股份有限公司技术秘密许可使用合同纠纷案


            【案例索引】

            一审：杭州中院（2018）浙01民初4088号

            二审：最高法院（2021）最高法知民终955号


            【入选理由】

            本案系因干细胞及免疫细胞制备、运输、存储、保管、复苏及质控技术，干细胞库及免疫系统储存库建设、运行和管理技术等硬件建设等引起的技术秘密许可使用合同纠纷，涉及生物医药中的高精尖问题，法律关系复杂。


            【裁判要旨】

            在技术许可合同中，交付方主张其交付了技术资料，应当承担举证证明责任。在合同对交付方应当履行的交付内容和期限有明确约定的情况下，应结合涉案合同约定审查判断交付方是否已经履行了交付相关技术资料的合同义务。


            【简要案情】

            2015年8月27日，甲方（许可方）浙江某生物技术有限公司、乙方（被许可方）某生物医药股份有限公司和丙方陆某、王某签订《技术授权许可协议》，就某生物医药股份有限公司（包括其子公司等关联实体）在地域范围内使用浙江某生物技术有限公司以下技术相关的包括技术秘密等在内的所有知识产权达成合意。


            浙江某生物技术有限公司公司主张其积极履行约定义务，交付专有技术，某生物医药股份有限公司未依约履行支付剩余技术许可费用的义务构成违约，故成讼要求某生物医药股份有限公司承担合同约定的违约责任，并要求某生物医药股份有限公司继续履行案涉协议。


            杭州中院经审查认为，双方均未全面、完整按照涉案合同约定履行各自义务，在浙江某生物技术有限公司未能提供证据证明其已经履行相关交付义务的情形下，要求某生物医药股份有限公司继续履行支付授权费等合同义务，不予支持。


            一审判决后，浙江某生物技术有限公司不服，向最高法院提起上诉，最高法院二审驳回上诉，维持原判。

            """

            应当调整为：

            """

            # 6 浙江某生物技术有限公司与某生物医药股份有限公司技术秘密许可使用合同纠纷案


            ## 【案例索引】

            一审：杭州中院（2018）浙01民初4088号

            二审：最高法院（2021）最高法知民终955号


            ## 【入选理由】

            本案系因干细胞及免疫细胞制备、运输、存储、保管、复苏及质控技术，干细胞库及免疫系统储存库建设、运行和管理技术等硬件建设等引起的技术秘密许可使用合同纠纷，涉及生物医药中的高精尖问题，法律关系复杂。


            ## 【裁判要旨】

            在技术许可合同中，交付方主张其交付了技术资料，应当承担举证证明责任。在合同对交付方应当履行的交付内容和期限有明确约定的情况下，应结合涉案合同约定审查判断交付方是否已经履行了交付相关技术资料的合同义务。


            ## 【简要案情】

            2015年8月27日，甲方（许可方）浙江某生物技术有限公司、乙方（被许可方）某生物医药股份有限公司和丙方陆某、王某签订《技术授权许可协议》，就某生物医药股份有限公司（包括其子公司等关联实体）在地域范围内使用浙江某生物技术有限公司以下技术相关的包括技术秘密等在内的所有知识产权达成合意。

            浙江某生物技术有限公司公司主张其积极履行约定义务，交付专有技术，某生物医药股份有限公司未依约履行支付剩余技术许可费用的义务构成违约，故成讼要求某生物医药股份有限公司承担合同约定的违约责任，并要求某生物医药股份有限公司继续履行案涉协议。

            杭州中院经审查认为，双方均未全面、完整按照涉案合同约定履行各自义务，在浙江某生物技术有限公司未能提供证据证明其已经履行相关交付义务的情形下，要求某生物医药股份有限公司继续履行支付授权费等合同义务，不予支持。

            一审判决后，浙江某生物技术有限公司不服，向最高法院提起上诉，最高法院二审驳回上诉，维持原判。

            """

            {{/if}}'
        - edition_type: basic
          id: 89b7f77e-0371-448c-93d4-fadac18e4d13
          role: user
          text: '{{#1735632653899.item#}}'
        selected: false
        title: 格式化文本
        type: llm
        variables: []
        vision:
          enabled: false
      height: 140
      id: '1735632981287'
      parentId: '1735632653899'
      position:
        x: 16
        y: 52
      positionAbsolute:
        x: 695.7666095919487
        y: 315.74947118141506
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
      zIndex: 1002
    - data:
        code: "def main(formatted_segments):\n    # 移除空值和None\n    valid_segments\
          \ = [seg for seg in formatted_segments if seg]\n    \n    # 移除重复的段落，但保持原有顺序\n\
          \    seen = set()\n    unique_segments = []\n    for segment in valid_segments:\n\
          \        # 去除段落前后的空白字符，但保留段落内部的格式\n        cleaned_segment = segment.strip()\n\
          \        if cleaned_segment and cleaned_segment not in seen:\n         \
          \   seen.add(cleaned_segment)\n            unique_segments.append(segment)\n\
          \    \n    # 如果没有有效段落，返回空字符串\n    if not unique_segments:\n        return\
          \ {'final_text': ''}\n    \n    # 合并去重后的段落，使用两个换行符分隔\n    final_text = '\\\
          n\\n'.join(unique_segments)\n    \n    # 清理可能出现的多余空行\n    lines = final_text.split('\\\
          n')\n    cleaned_lines = []\n    prev_empty = True\n    \n    for line in\
          \ lines:\n        is_empty = not line.strip()\n        if not is_empty or\
          \ not prev_empty:\n            cleaned_lines.append(line)\n        prev_empty\
          \ = is_empty\n    \n    final_text = '\\n'.join(cleaned_lines)\n    \n \
          \   return {\n        'final_text': final_text\n    }"
        code_language: python3
        desc: '代码

          将迭代的格式化后的文本进行拼接'
        outputs:
          final_text:
            children: null
            type: string
        selected: false
        title: 文本合并
        type: code
        variables:
        - value_selector:
          - '1735632653899'
          - output
          variable: formatted_segments
      height: 96
      id: '1735633258714'
      position:
        x: 730.6999387678718
        y: 558.9628124524471
      positionAbsolute:
        x: 730.6999387678718
        y: 558.9628124524471
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
    - data:
        desc: ''
        provider_id: feishu_document
        provider_name: feishu_document
        provider_type: builtin
        selected: true
        title: 创建飞书文档
        tool_configurations: {}
        tool_label: 创建飞书文档
        tool_name: create_document
        tool_parameters:
          content:
            type: mixed
            value: '{{#1735633258714.final_text#}}'
          folder_token:
            type: mixed
            value: ''
          title:
            type: mixed
            value: ''
        type: tool
      height: 52
      id: '1735802619533'
      position:
        x: 1198.1485031082693
        y: 417.27296869319014
      positionAbsolute:
        x: 1198.1485031082693
        y: 417.27296869319014
      selected: true
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 243
    viewport:
      x: 142.39931505314144
      y: 196.8953342102784
      zoom: 1.250030353583873
