langgenius / dify

Dify is an open-source LLM app development platform. Dify's intuitive interface combines AI workflow, RAG pipeline, agent capabilities, model management, observability features and more, letting you quickly go from prototype to production.
https://dify.ai
Other
51.75k stars 7.49k forks source link

BUG: Errors produced by Answer nodes and IF nodes #9560

Open Hisir0909 opened 3 weeks ago

Hisir0909 commented 3 weeks ago

Self Checks

Dify version

0.11.0 / 0.10.0 / 0.10.0-beta2 / 0.9.2

Cloud or Self Hosted

Self Hosted (Docker)

Steps to reproduce

  1. This is the wrong screenshot.:

image

  1. The ELIF1 template node didn't execute, but the ELIF answer was outputted.:

image

  1. Below is my ChatFlow's DSL file.
app:
  description: ''
  icon: 🤖
  icon_background: '#FFEAD5'
  mode: advanced-chat
  name: '111'
  use_icon_as_answer_icon: false
kind: app
version: 0.1.2
workflow:
  conversation_variables:
  - description: ''
    id: 583cb21a-80ab-4c11-8eb1-e09281747aef
    name: dic
    value: ''
    value_type: string
  - description: ''
    id: 8fe5d4b4-a493-4a1f-85a3-a8842cd90a38
    name: token
    value: ''
    value_type: string
  - description: ''
    id: de8a2f8b-79fe-4d21-abea-570eee2f2ae2
    name: is_first
    value: 'True'
    value_type: string
  environment_variables: []
  features:
    file_upload:
      allowed_file_extensions:
      - .JPG
      - .JPEG
      - .PNG
      - .GIF
      - .WEBP
      - .SVG
      allowed_file_types:
      - image
      allowed_file_upload_methods:
      - local_file
      - remote_url
      enabled: false
      image:
        enabled: false
        number_limits: 3
        transfer_methods:
        - local_file
        - remote_url
      number_limits: 3
    opening_statement: ''
    retriever_resource:
      enabled: true
    sensitive_word_avoidance:
      enabled: false
    speech_to_text:
      enabled: false
    suggested_questions: []
    suggested_questions_after_answer:
      enabled: false
    text_to_speech:
      enabled: false
      language: ''
      voice: ''
  graph:
    edges:
    - data:
        isInIteration: false
        sourceType: if-else
        targetType: answer
      id: 1729502294483-true-answer-target
      source: '1729502294483'
      sourceHandle: 'true'
      target: answer
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        sourceType: start
        targetType: if-else
      id: 1729502254427-source-1729502770085-target
      source: '1729502254427'
      sourceHandle: source
      target: '1729502770085'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        sourceType: if-else
        targetType: template-transform
      id: 1729502770085-true-1729504399874-target
      source: '1729502770085'
      sourceHandle: 'true'
      target: '1729504399874'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        sourceType: template-transform
        targetType: if-else
      id: 1729504399874-source-1729504411588-target
      source: '1729504399874'
      sourceHandle: source
      target: '1729504411588'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        sourceType: if-else
        targetType: template-transform
      id: 1729502770085-false-1729504464329-target
      source: '1729502770085'
      sourceHandle: 'false'
      target: '1729504464329'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        sourceType: template-transform
        targetType: assigner
      id: 1729504464329-source-1729504520147-target
      source: '1729504464329'
      sourceHandle: source
      target: '1729504520147'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        sourceType: if-else
        targetType: template-transform
      id: 1729504411588-false-1729504630229-target
      source: '1729504411588'
      sourceHandle: 'false'
      target: '1729504630229'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        sourceType: assigner
        targetType: template-transform
      id: 1729504520147-source-1729504630229-target
      source: '1729504520147'
      sourceHandle: source
      target: '1729504630229'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        sourceType: if-else
        targetType: if-else
      id: 1729504411588-true-1729502294483-target
      source: '1729504411588'
      sourceHandle: 'true'
      target: '1729502294483'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        sourceType: assigner
        targetType: if-else
      id: 1729504563978-source-1729502294483-target
      source: '1729504563978'
      sourceHandle: source
      target: '1729502294483'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        sourceType: if-else
        targetType: template-transform
      id: 1729502294483-0ed3cdc3-bc23-4adb-b57c-0fe9af3a579f-1729506714081-target
      source: '1729502294483'
      sourceHandle: 0ed3cdc3-bc23-4adb-b57c-0fe9af3a579f
      target: '1729506714081'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        sourceType: template-transform
        targetType: answer
      id: 1729506714081-source-1729502319083-target
      source: '1729506714081'
      sourceHandle: source
      target: '1729502319083'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        sourceType: if-else
        targetType: template-transform
      id: 1729502294483-false-1729506731473-target
      source: '1729502294483'
      sourceHandle: 'false'
      target: '1729506731473'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        sourceType: template-transform
        targetType: answer
      id: 1729506731473-source-1729502309450-target
      source: '1729506731473'
      sourceHandle: source
      target: '1729502309450'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        sourceType: template-transform
        targetType: assigner
      id: 1729504630229-source-1729504563978-target
      source: '1729504630229'
      sourceHandle: source
      target: '1729504563978'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        sourceType: if-else
        targetType: template-transform
      id: 1729502294483-7168f49c-982e-4e98-9e98-03958f31a4bc-1729507033350-target
      source: '1729502294483'
      sourceHandle: 7168f49c-982e-4e98-9e98-03958f31a4bc
      target: '1729507033350'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        sourceType: template-transform
        targetType: answer
      id: 1729507033350-source-1729507059519-target
      source: '1729507033350'
      sourceHandle: source
      target: '1729507059519'
      targetHandle: target
      type: custom
      zIndex: 0
    nodes:
    - data:
        desc: ''
        selected: false
        title: 开始
        type: start
        variables: []
      height: 54
      id: '1729502254427'
      position:
        x: -459.7505019130671
        y: 215.89131870774037
      positionAbsolute:
        x: -459.7505019130671
        y: 215.89131870774037
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 244
    - data:
        answer: "\nIF: \n"
        desc: ''
        selected: false
        title: IF
        type: answer
        variables: []
      height: 100
      id: answer
      position:
        x: 717.9242034335198
        y: 123.6178681818638
      positionAbsolute:
        x: 717.9242034335198
        y: 123.6178681818638
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 244
    - data:
        cases:
        - case_id: 'true'
          conditions:
          - comparison_operator: contains
            id: 2e881def-629a-406e-b774-c714092ab1cc
            value: 'True'
            varType: string
            variable_selector:
            - conversation
            - is_first
          id: 'true'
          logical_operator: and
        - case_id: 0ed3cdc3-bc23-4adb-b57c-0fe9af3a579f
          conditions:
          - comparison_operator: start with
            id: daf05a31-4a12-476d-936d-8017e9480497
            value: /
            varType: string
            variable_selector:
            - sys
            - query
          id: 0ed3cdc3-bc23-4adb-b57c-0fe9af3a579f
          logical_operator: and
        - case_id: 7168f49c-982e-4e98-9e98-03958f31a4bc
          conditions:
          - comparison_operator: start with
            id: c1e73d03-daf5-4cd0-b484-924e3217d640
            value: a
            varType: string
            variable_selector:
            - sys
            - query
          logical_operator: and
        desc: ''
        selected: false
        title: 条件分支
        type: if-else
      height: 222
      id: '1729502294483'
      position:
        x: 437.0053656957343
        y: 268.1020906963547
      positionAbsolute:
        x: 437.0053656957343
        y: 268.1020906963547
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 244
    - data:
        answer: '

          Else:

          {{#1729506731473.output#}}

          '
        desc: ''
        selected: false
        title: ELse
        type: answer
        variables: []
      height: 103
      id: '1729502309450'
      position:
        x: 975.6351748008005
        y: 529.790737143086
      positionAbsolute:
        x: 975.6351748008005
        y: 529.790737143086
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 244
    - data:
        answer: "\nELIF1: \n{{#1729506714081.output#}}\n"
        desc: ''
        selected: false
        title: ELIF
        type: answer
        variables: []
      height: 103
      id: '1729502319083'
      position:
        x: 980.92420343352
        y: 291.81385056019053
      positionAbsolute:
        x: 980.92420343352
        y: 291.81385056019053
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 244
    - data:
        cases:
        - case_id: 'true'
          conditions:
          - comparison_operator: not empty
            id: 0b3e781c-dd68-4ba8-883b-77aaa3d292ec
            value: ''
            varType: string
            variable_selector:
            - conversation
            - token
          id: 'true'
          logical_operator: and
        desc: ''
        selected: false
        title: Token is empty
        type: if-else
      height: 126
      id: '1729502770085'
      position:
        x: -459.7505019130671
        y: 282
      positionAbsolute:
        x: -459.7505019130671
        y: 282
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 244
    - data:
        desc: ''
        selected: false
        template: Text
        title: STR(text)
        type: template-transform
        variables: []
      height: 54
      id: '1729504399874'
      position:
        x: -150.35486399762755
        y: 164.52451015310336
      positionAbsolute:
        x: -150.35486399762755
        y: 164.52451015310336
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 244
    - data:
        cases:
        - case_id: 'true'
          conditions:
          - comparison_operator: contains
            id: 23e1724b-8583-4b18-90d7-03d849cc3a8c
            value: Text
            varType: string
            variable_selector:
            - '1729504399874'
            - output
          id: 'true'
          logical_operator: and
        desc: ''
        selected: false
        title: STR(Text)_is_Text
        type: if-else
      height: 126
      id: '1729504411588'
      position:
        x: -150.35486399762755
        y: 232.42521596775367
      positionAbsolute:
        x: -150.35486399762755
        y: 232.42521596775367
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 244
    - data:
        desc: ''
        selected: false
        template: '12345'
        title: STR(12345)
        type: template-transform
        variables: []
      height: 54
      id: '1729504464329'
      position:
        x: -150.35486399762755
        y: 414.2400720958687
      positionAbsolute:
        x: -150.35486399762755
        y: 414.2400720958687
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 244
    - data:
        assigned_variable_selector:
        - conversation
        - dic
        desc: ''
        input_variable_selector:
        - '1729504464329'
        - output
        selected: false
        title: set_DIC
        type: assigner
        write_mode: over-write
      height: 132
      id: '1729504520147'
      position:
        x: -150.35486399762755
        y: 488.3916166027999
      positionAbsolute:
        x: -150.35486399762755
        y: 488.3916166027999
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 244
    - data:
        assigned_variable_selector:
        - conversation
        - token
        desc: ''
        input_variable_selector:
        - '1729504630229'
        - output
        selected: false
        title: setToken
        type: assigner
        write_mode: over-write
      height: 132
      id: '1729504563978'
      position:
        x: 148.48056769917014
        y: 483.7907371430862
      positionAbsolute:
        x: 148.48056769917014
        y: 483.7907371430862
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 244
    - data:
        desc: ''
        selected: false
        template: Token
        title: STR(token)
        type: template-transform
        variables: []
      height: 54
      id: '1729504630229'
      position:
        x: 148.48056769917014
        y: 414.2400720958687
      positionAbsolute:
        x: 148.48056769917014
        y: 414.2400720958687
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 244
    - data:
        desc: ''
        selected: true
        template: 执行了ELIF1的模板
        title: ELIF1
        type: template-transform
        variables: []
      height: 54
      id: '1729506714081'
      position:
        x: 717.9242034335198
        y: 291.81385056019053
      positionAbsolute:
        x: 717.9242034335198
        y: 291.81385056019053
      selected: true
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 244
    - data:
        desc: ''
        selected: false
        template: 执行了ELSE的模板
        title: ELSE
        type: template-transform
        variables: []
      height: 54
      id: '1729506731473'
      position:
        x: 707.9242034335198
        y: 529.790737143086
      positionAbsolute:
        x: 707.9242034335198
        y: 529.790737143086
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 244
    - data:
        desc: ''
        selected: false
        template: 执行了ELIF2的模板
        title: ELIF2
        type: template-transform
        variables: []
      height: 54
      id: '1729507033350'
      position:
        x: 707.9242034335198
        y: 407.5947989166603
      positionAbsolute:
        x: 707.9242034335198
        y: 407.5947989166603
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 244
    - data:
        answer: '

          ELIF2:

          {{#1729507033350.output#}}'
        desc: ''
        selected: false
        title: 直接回复 4
        type: answer
        variables: []
      height: 103
      id: '1729507059519'
      position:
        x: 980.92420343352
        y: 407.5947989166603
      positionAbsolute:
        x: 980.92420343352
        y: 407.5947989166603
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 244
    viewport:
      x: -410.9242034335248
      y: 29.88213181813518
      zoom: 1.000000000000006

✔️ Expected Behavior

According to the IF node configuration, only the IF Answer node should be output.

❌ Actual Behavior

Output the content of all Answer nodes in all branches directly (even if the preceding nodes have not been executed).

dosubot[bot] commented 3 weeks ago

The issue you're experiencing, where all Answer nodes are executed regardless of the preceding nodes' execution, might be related to how the conditions in your IF, ELIF, and ELSE nodes are evaluated or how the workflow is configured. Here are a few things to check and consider:

  1. Condition Evaluation: Ensure that the conditions set in your IF and ELIF nodes are correctly defined and that they logically lead to the expected path. Double-check the conditions and logical operators (AND/OR) to ensure they are set up as intended [1][2].

  2. Node Connections: Verify that the connections between nodes are correctly established. Each node should be connected in a way that reflects the intended flow of logic. Misconfigured connections might lead to unexpected execution paths.

  3. Variable Values: Check the initial values and types of the conversation variables used in the conditions. Ensure they are correctly initialized and updated throughout the workflow. Incorrect variable values might cause conditions to evaluate unexpectedly [3].

  4. Template-Transform Node: If you're using template-transform nodes, ensure that they are correctly processing and transforming data before it reaches the IF or ELIF nodes. Incorrect transformations might affect the condition evaluations [4].

  5. Debugging and Logs: Utilize Dify's debugging and logging features to trace the execution path of your workflow. This can help identify where the logic might be failing or where unexpected executions occur [5].

If these checks do not resolve the issue, it might be beneficial to simplify the workflow to isolate the problem or to review the specific logic in the DSL file for any discrepancies.

To continue talking to Dosu, mention @dosu.

crazywoola commented 3 weeks ago

Not sure if this is existed in latest version. We just released the 0.10.0

Hisir0909 commented 3 weeks ago

Not sure if this is existed in latest version. We just released the 0.10.0不确定最新版本中是否存在此问题。我们刚刚发布了 0.10.0

I'm trying it now.

crazywoola commented 3 weeks ago

If this still persists, please update the version in this thread, we will take a look at it later.

Hisir0909 commented 3 weeks ago

If this still persists, please update the version in this thread, we will take a look at it later.

It still exists.😢