# 【必填】Flow 名称,展示用
name: 测试工作流
# 【必填】Flow 描述。将影响大模型效果。
description: |
  这是一个测试工作流,用于测试工作流的执行流程。
# 【必填】Flow出错时的错误处理步骤
on_error:
  # [必填] 是否直接使用大模型自动向用户报错?
  use_llm: false
  # 不使用大模型时,使用以下模板拼接提示信息并返回
  output_format: |
    **当前工作流{{ flow.name }}执行发生错误!**
    
    错误信息:{{ error.message }}

# 各个节点定义
steps:
  start:
    node: none
    name: 开始
    description: 开始工作流
    pos: # 节点在画布上的位置
      x: 100
      y: 100
  query_data:  # 节点的Pool ID
    node: api
    name: 查询数据    # 节点名称
    description: 从API中查询测试数据 # 节点描述
    pos: # 节点在画布上的位置
      x: 100
      y: 100
    params:  # 节点的参数
      endpoint: GET /api/test  # API Endpoint名称
  check_data:
    node: choice
    name: 判断数据
    description: 判断工具的返回值是否包含有效数据
    pos: # 节点在画布上的位置
      x: 200
      y: 100
    params:
      propose: 上一步返回值是否包含有效数据?  # 判断命题
      choices:  # 判断选项
        - branch: valid
          description: 返回值存在有效数据   # 选项说明,满足就会选择此项
        - branch: invalid
          description: 返回值不存在有效数据
  gen_reply:
    node: llm
    name: 生成回复
    description: 使用大模型生成回复
    pos: # 节点在画布上的位置
      x: 300
      y: 100
    depends:  # 节点的后向依赖
      - format_output
    params:
      system: 你是一个擅长Linux系统性能优化,且能够根据具体情况撰写分析报告的智能助手。  # 系统提示词,jinja2语法
      user: |  # 用户提示词,jinja2语法,多行;可以使用step name引用对应的数据;可以使用storage[-1]引用上一个步骤的数据
        上下文:
        {{ context }}
        
        当前时间:
        {{ time }}

        主机信息:
        {{ start.output.result.machines[0] }}
        
        测试数据:{{ storage[-1].output.result.machines[0].data }}

        使用自然语言解释这一信息,并展示为Markdown列表。
  format_output:
    node: convert
    name: 格式化输出
    description: 按照特定格式输出
    pos: # 节点在画布上的位置
      x: 400
      y: 100
    params:
      message: | # 对生成的文字信息进行格式化,没有则不改动;jinja2语法
        # 测试报告
        
        声明: 这是一份由AI生成的报告,仅供参考。
        
        时间: {{ time }}
        机器ID: {{ start.output.result.machines[0].id }}
        
        {% if storage[-1].output.result.machines[0].data %}
        ## 数据解析
        ......
        {% endif %}
      output: | # 对生成的结构化数据进行格式化,没有则不改动;jsonnet语法
        # 注意: 只能使用storage访问之前的数据,不能通过step名访问;其他内容在extra变量中
        {
          "id": storage[-1].id,
          "time": extras.time,
          "machines": [x for x.id in storage[-1].output.result.machines]
        }
  gen_suggest:
    node: suggest
    name: 问题推荐
    description: 推荐问题
    pos: # 节点在画布上的位置
      x: 500
      y: 100
    params:
      num: 3
      configs:
        - flow_id: flow_01
          question: 这是固定的推荐问题
        - flow_id: flow_02
  end:
    node: none
    name: 结束
    description: 结束工作流
    pos: # 节点在画布上的位置
      x: 600
      y: 100

# 各个边定义
# 格式:边ID: 来源节点名称 --> 目标节点名称
# 若来源节点有多个输出分支,则使用“节点名称.分支名称”表示
edges:
  - id: edge_00
    from: start
    to: query_data
    type: normal  # 边的类型,可不填
  - id: edge_01
    from: query_data
    to: check_data
  - id: edge_02
    from: check_data.valid
    to: gen_reply
  - id: edge_03
    from: check_data.invalid
    to: format_output
  - id: edge_04
    from: gen_reply
    to: end
  - id: edge_05
    from: format_output
    to: end