app:
  description: Routes each question to a specialised retrieval and prompt path. Answers
    only from the Jira knowledge base.
  icon: 🤖
  icon_background: '#FFEAD5'
  icon_type: emoji
  mode: advanced-chat
  name: 'Exercise 4: Advanced RAG'
  use_icon_as_answer_icon: false
dependencies:
- current_identifier: null
  type: marketplace
  value:
    marketplace_plugin_unique_identifier: langgenius/azure_openai:0.0.69@c744f6bf60699c296307a4420094a7f88b4f6e7fdf353b67b2b88ddb455074b2
    version: null
kind: app
version: 0.7.0
workflow:
  conversation_variables: []
  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
      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:
        - local_file
        - remote_url
      number_limits: 3
    opening_statement: 'Hi! I''m your AI testing assistant for the Atlassian REST
      project. I can:


      - explain a Jira issue ("What is REST-266 about?")

      - summarize or compare several issues

      - suggest what to test for a risk

      - write Gherkin test cases from issues or requirements


      Ask your question below.'
    retriever_resource:
      enabled: true
    sensitive_word_avoidance:
      enabled: false
    speech_to_text:
      enabled: false
    suggested_questions:
    - What is REST-266 about?
    - Summarize REST-266 and REST-265
    - What should we test for backward compatibility?
    - Generate test cases for REST-266
    suggested_questions_after_answer:
      enabled: true
    text_to_speech:
      enabled: false
      language: ''
      voice: ''
  graph:
    edges:
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: llm
        targetType: answer
      id: llm-answer
      selected: false
      source: llm
      sourceHandle: source
      target: answer
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: start
        targetType: question-classifier
      id: 1748687003240-source-1748756681684-target
      source: '1748687003240'
      sourceHandle: source
      target: '1748756681684'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: question-classifier
        targetType: parameter-extractor
      id: 1748756681684-1-1748719005808-target
      source: '1748756681684'
      sourceHandle: '1'
      target: '1748719005808'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: question-classifier
        targetType: knowledge-retrieval
      id: 1748756681684-1748767162845-1748767429892-target
      source: '1748756681684'
      sourceHandle: '1748767162845'
      target: '1748767429892'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: knowledge-retrieval
        targetType: llm
      id: 1748767429892-source-1748767447593-target
      source: '1748767429892'
      sourceHandle: source
      target: '1748767447593'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: llm
        targetType: answer
      id: 1748767447593-source-1748767451380-target
      source: '1748767447593'
      sourceHandle: source
      target: '1748767451380'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: question-classifier
        targetType: parameter-extractor
      id: 1748756681684-2-1748767570289-target
      source: '1748756681684'
      sourceHandle: '2'
      target: '1748767570289'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: llm
        targetType: answer
      id: 1748783029512-source-1748783041984-target
      source: '1748783029512'
      sourceHandle: source
      target: '1748783041984'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: parameter-extractor
        targetType: iteration
      id: 1748767570289-source-1748783526414-target
      source: '1748767570289'
      sourceHandle: source
      target: '1748783526414'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '1748783526414'
        sourceType: iteration-start
        targetType: knowledge-retrieval
      id: 1748783526414start-source-1748783571565-target
      source: 1748783526414start
      sourceHandle: source
      target: '1748783571565'
      targetHandle: target
      type: custom
      zIndex: 1001
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: question-classifier
        targetType: knowledge-retrieval
      id: 1748756681684-1748767109717-1748784602400-target
      source: '1748756681684'
      sourceHandle: '1748767109717'
      target: '1748784602400'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: knowledge-retrieval
        targetType: llm
      id: 1748784602400-source-1748784677999-target
      source: '1748784602400'
      sourceHandle: source
      target: '1748784677999'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: llm
        targetType: answer
      id: 1748784677999-source-1748784661836-target
      source: '1748784677999'
      sourceHandle: source
      target: '1748784661836'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: question-classifier
        targetType: parameter-extractor
      id: 1748756681684-1748774938291-17487850509710-target
      source: '1748756681684'
      sourceHandle: '1748774938291'
      target: '17487850509710'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: true
        isInLoop: false
        iteration_id: '17487852863990'
        sourceType: iteration-start
        targetType: knowledge-retrieval
      id: 1748785286399start-source-1748785286399017487852864000-target
      source: 1748785286399start
      sourceHandle: source
      target: '1748785286399017487852864000'
      targetHandle: target
      type: custom
      zIndex: 1001
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: parameter-extractor
        targetType: if-else
      id: 17487850509710-source-1748785479296-target
      source: '17487850509710'
      sourceHandle: source
      target: '1748785479296'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: if-else
        targetType: iteration
      id: 1748785479296-true-17487852863990-target
      source: '1748785479296'
      sourceHandle: 'true'
      target: '17487852863990'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: if-else
        targetType: llm
      id: 1748785479296-false-1748785532843-target
      source: '1748785479296'
      sourceHandle: 'false'
      target: '1748785532843'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: llm
        targetType: answer
      id: 1748785557565-source-1748785836978-target
      source: '1748785557565'
      sourceHandle: source
      target: '1748785836978'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: llm
        targetType: answer
      id: 1748785532843-source-1748786521492-target
      source: '1748785532843'
      sourceHandle: source
      target: '1748786521492'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: question-classifier
        targetType: llm
      id: 1748756681684-1748785172818-1748786653855-target
      source: '1748756681684'
      sourceHandle: '1748785172818'
      target: '1748786653855'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: llm
        targetType: answer
      id: 1748786653855-source-1748785149607-target
      source: '1748786653855'
      sourceHandle: source
      target: '1748785149607'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: iteration
        targetType: code
      id: 1748783526414-source-1762727584347-target
      source: '1748783526414'
      sourceHandle: source
      target: '1762727584347'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: code
        targetType: llm
      id: 1762727584347-source-1748783029512-target
      source: '1762727584347'
      sourceHandle: source
      target: '1748783029512'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: iteration
        targetType: code
      id: 17487852863990-source-1762728060345-target
      source: '17487852863990'
      sourceHandle: source
      target: '1762728060345'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: code
        targetType: llm
      id: 1762728060345-source-1748785557565-target
      source: '1762728060345'
      sourceHandle: source
      target: '1748785557565'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: knowledge-retrieval
        targetType: if-else
      id: 1748687775954-source-issue_found-target
      source: '1748687775954'
      sourceHandle: source
      target: issue_found
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: if-else
        targetType: llm
      id: issue_found-true-llm-target
      source: issue_found
      sourceHandle: 'true'
      target: llm
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: if-else
        targetType: answer
      id: issue_found-false-answer_not_found-target
      source: issue_found
      sourceHandle: 'false'
      target: answer_not_found
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: parameter-extractor
        targetType: if-else
      id: 1748719005808-source-has_key-target
      source: '1748719005808'
      sourceHandle: source
      target: has_key
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: if-else
        targetType: knowledge-retrieval
      id: has_key-true-1748687775954-target
      source: has_key
      sourceHandle: 'true'
      target: '1748687775954'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: if-else
        targetType: knowledge-retrieval
      id: has_key-false-1748784602400-target
      source: has_key
      sourceHandle: 'false'
      target: '1748784602400'
      targetHandle: target
      type: custom
      zIndex: 0
    nodes:
    - data:
        desc: ''
        selected: false
        title: User Input
        type: start
        variables: []
      height: 73
      id: '1748687003240'
      position:
        x: -1083.666487928184
        y: 288.65445462792803
      positionAbsolute:
        x: -1083.666487928184
        y: 288.65445462792803
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 0
    - data:
        context:
          enabled: true
          variable_selector:
          - '1748687775954'
          - result
        desc: ''
        model:
          completion_params:
            temperature: 0.3
          mode: chat
          name: gpt-35-turbo-16k
          provider: langgenius/azure_openai/azure_openai
        prompt_template:
        - id: 5c286fbf-33f9-4150-8c64-696789577558
          role: system
          text: 'You are a software testing assistant helping engineers understand
            Jira issues in the Atlassian REST project.


            Answer only from the context below. Never use outside knowledge.

            The context was filtered to the Jira issue the user asked about. If it
            is empty or does not mention that issue, reply exactly:

            "I''m sorry, I can''t find details about that issue in the project documentation."


            Your reply should:

            - Start with the issue key and its summary

            - List the type, status and assignee

            - Explain in two or three sentences what the issue changes or fixes

            - End with "What to test": two to four concrete test ideas based on the
            description


            Context:

            {{#context#}}


            User question:

            {{#sys.query#}}

            '
        selected: false
        title: LLM - Specific Issue
        type: llm
        variables: []
        vision:
          enabled: false
      height: 88
      id: llm
      position:
        x: 1500
        y: 33.57027864430731
      positionAbsolute:
        x: 1500
        y: 33.57027864430731
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 0
    - data:
        answer: '{{#llm.text#}}'
        desc: ''
        selected: false
        title: Answer - Specific Issue
        type: answer
        variables: []
      height: 103
      id: answer
      position:
        x: 1840
        y: 33.57027864430731
      positionAbsolute:
        x: 1840
        y: 33.57027864430731
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 0
    - data:
        dataset_ids:
        - W1plFG6wPRupvQB0T6LXXARA+GkduRuNFrUPXMZHtprMHDIwKWFC/Xl2XDIWt2EY
        desc: ''
        metadata_filtering_conditions:
          conditions:
          - comparison_operator: is
            id: 2cc78fcc-d7fd-49e1-a66d-e71af312b069
            name: issue_key
            value: '{{#1748719005808.issue_key#}}'
          logical_operator: and
        metadata_filtering_mode: manual
        multiple_retrieval_config:
          reranking_enable: false
          reranking_mode: weighted_score
          reranking_model:
            model: ''
            provider: ''
          score_threshold: null
          top_k: 4
          weights:
            keyword_setting:
              keyword_weight: 0
            vector_setting:
              embedding_model_name: text-embedding-3-large
              embedding_provider_name: langgenius/azure_openai/azure_openai
              vector_weight: 1
            weight_type: customized
        query_variable_selector:
        - '1748687003240'
        - sys.query
        retrieval_mode: multiple
        selected: false
        title: KR - Single Issue
        type: knowledge-retrieval
      height: 90
      id: '1748687775954'
      position:
        x: 456.25
        y: 33.57027864430731
      positionAbsolute:
        x: 456.25
        y: 33.57027864430731
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 0
    - data:
        desc: ''
        instruction: 'Extract the one Jira issue key the user is asking about.

          A Jira issue key is an uppercase project prefix, a hyphen and a number,
          for example REST-266.

          Normalize other spellings to that format. This project''s prefix is REST,
          so "rest 266", "REST266", "issue 266" and "ticket 266" all become REST-266.

          Return only the key.

          '
        model:
          completion_params:
            temperature: 0
          mode: chat
          name: gpt-35-turbo-16k
          provider: langgenius/azure_openai/azure_openai
        parameters:
        - description: The Jira issue key the user asks about, for example REST-266.
          name: issue_key
          required: false
          type: string
        query:
        - sys
        - query
        reasoning_mode: prompt
        selected: false
        title: Issue Key Extractor
        type: parameter-extractor
        variables: []
        vision:
          enabled: false
      height: 88
      id: '1748719005808'
      position:
        x: -284.44013680327953
        y: 33.57027864430731
      positionAbsolute:
        x: -284.44013680327953
        y: 33.57027864430731
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 0
    - data:
        classes:
        - id: '1'
          name: specific_issue
        - id: '2'
          name: list_issues
        - id: '1748767109717'
          name: general_project
        - id: '1748767162845'
          name: test_related
        - id: '1748774938291'
          name: test_generation
        - id: '1748785172818'
          name: unrelated_or_invalid
        desc: ''
        instruction: 'You classify questions sent to a software testing assistant
          for the Atlassian REST Jira project.

          Choose exactly ONE category:


          - specific_issue: asks about one Jira issue that it names by key or number.
          Examples: "What does REST-266 fix?", "Who is assigned to issue 259?"

          - list_issues: mentions two or more Jira issue keys and asks to summarize,
          compare or relate them. Example: "Summarize REST-266 and REST-265"

          - general_project: asks about the project as a whole (scope, modules, features,
          contributors), about a group of issues, or which issue matches a description,
          without naming a key. Examples: "What is this project about?", "Which issues
          relate to Jackson?", "Which issue reports that CORS preflight requests are
          not supported?"

          - test_related: asks about test strategy, risk, regression or coverage,
          without asking to write test cases. Example: "What should we test for backward
          compatibility?"

          - test_generation: asks to write, generate or create test cases or Gherkin
          scenarios, with or without issue keys. Examples: "Generate test cases for
          REST-266", "Create test scenarios for a password reset feature"

          - unrelated_or_invalid: not about this project, its Jira issues, its documentation
          or testing. Examples: "Write me a poem", "Why is the sky blue?"


          If the user asks to write or generate tests, choose test_generation even
          when the question contains issue keys.

          '
        instructions: ''
        model:
          completion_params:
            temperature: 0
          mode: chat
          name: gpt-35-turbo-16k
          provider: langgenius/azure_openai/azure_openai
        query_variable_selector:
        - '1748687003240'
        - sys.query
        selected: false
        title: Question Classifier
        topics: []
        type: question-classifier
        vision:
          enabled: false
      height: 346
      id: '1748756681684'
      position:
        x: -694.8206093064899
        y: 288.65445462792803
      positionAbsolute:
        x: -694.8206093064899
        y: 288.65445462792803
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 0
    - data:
        dataset_ids:
        - W1plFG6wPRupvQB0T6LXXARA+GkduRuNFrUPXMZHtprMHDIwKWFC/Xl2XDIWt2EY
        desc: ''
        multiple_retrieval_config:
          reranking_enable: false
          reranking_mode: weighted_score
          score_threshold: null
          top_k: 4
          weights:
            keyword_setting:
              keyword_weight: 0
            vector_setting:
              embedding_model_name: text-embedding-3-large
              embedding_provider_name: langgenius/azure_openai/azure_openai
              vector_weight: 1
            weight_type: customized
        query_variable_selector:
        - '1748687003240'
        - sys.query
        retrieval_mode: multiple
        selected: false
        title: KR - Test Related
        type: knowledge-retrieval
      height: 90
      id: '1748767429892'
      position:
        x: -284.44013680327953
        y: 610.4803953947226
      positionAbsolute:
        x: -284.44013680327953
        y: 610.4803953947226
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 0
    - data:
        context:
          enabled: true
          variable_selector:
          - '1748767429892'
          - result
        desc: ''
        model:
          completion_params:
            temperature: 0.3
          mode: chat
          name: gpt-35-turbo-16k
          provider: langgenius/azure_openai/azure_openai
        prompt_template:
        - id: 8c741de7-7353-402c-bfcb-a1e6b6798e35
          role: system
          text: 'You are a senior test engineer advising a team that works on the
            Atlassian REST project.


            Answer only from the Jira issues in the context below. Never use outside
            knowledge.

            If the context does not help answer the question, reply exactly:

            "I''m sorry, I can''t find relevant testing information in the project
            documentation to answer that."


            Your reply should:

            - Name the Jira issues that create the risk or need testing, with their
            keys

            - Explain each risk in one sentence

            - Recommend what to test: the test level (unit, integration, regression,
            security) and concrete checks

            - Order the recommendations by risk, highest first


            Context:

            {{#context#}}


            User question:

            {{#sys.query#}}

            '
        selected: false
        title: LLM - Test Related
        type: llm
        variables: []
        vision:
          enabled: false
      height: 88
      id: '1748767447593'
      position:
        x: 89.0778811944802
        y: 610.4803953947226
      positionAbsolute:
        x: 89.0778811944802
        y: 610.4803953947226
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 0
    - data:
        answer: '{{#1748767447593.text#}}'
        desc: ''
        selected: false
        title: Answer - Test Related
        type: answer
        variables: []
      height: 103
      id: '1748767451380'
      position:
        x: 456.2543663027028
        y: 610.4803953947226
      positionAbsolute:
        x: 456.2543663027028
        y: 610.4803953947226
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 0
    - data:
        desc: ''
        instruction: 'Extract every Jira issue key mentioned in the user''s question,
          in the order they appear.

          A Jira issue key is an uppercase project prefix, a hyphen and a number,
          for example REST-266.

          Normalize other spellings to that format. This project''s prefix is REST,
          so "rest 266", "REST266", "issue 266" and "ticket 266" all become REST-266.

          If the question contains no issue key, return an empty list.

          '
        model:
          completion_params:
            temperature: 0
          mode: chat
          name: gpt-35-turbo-16k
          provider: langgenius/azure_openai/azure_openai
        parameters:
        - description: Every Jira issue key in the question, for example ["REST-266",
            "REST-265"].
          name: issue_keys
          required: true
          type: array[string]
        query:
        - sys
        - query
        reasoning_mode: prompt
        selected: false
        title: Issue Keys Extractor
        type: parameter-extractor
        variables: []
        vision:
          configs:
            detail: high
            variable_selector:
            - sys
            - files
          enabled: false
      height: 88
      id: '1748767570289'
      position:
        x: -284.44013680327953
        y: 211.5747334168887
      positionAbsolute:
        x: -284.44013680327953
        y: 211.5747334168887
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 0
    - data:
        context:
          enabled: true
          variable_selector:
          - '1762727584347'
          - flat_context
        desc: ''
        model:
          completion_params:
            temperature: 0.3
          mode: chat
          name: gpt-35-turbo-16k
          provider: langgenius/azure_openai/azure_openai
        prompt_template:
        - id: 41d8a4b2-979b-4166-a924-d9b9e7b724da
          role: system
          text: 'You are a software testing assistant helping engineers understand
            Jira issues in the Atlassian REST project.


            Answer only from the context below. Never use outside knowledge.

            The context holds the Jira issues retrieved for the keys the user asked
            about.


            Batch status: {{#1762727584347.batch_status#}}

            If the batch status starts with "Partial result" or "No requested Jira
            issues", begin your reply with that status and name the missing keys.
            Never describe an issue that is not in the context.


            For each issue found, in the order the user asked:

            - A heading with the issue key and summary

            - Type, status and assignee

            - One or two sentences on what it changes

            - What to test: two or three concrete ideas


            If the issues share a component, risk or theme, finish with a short "How
            they relate" section.


            Context:

            {{#context#}}


            User question:

            {{#sys.query#}}

            '
        selected: false
        title: LLM - Multiple Issues
        type: llm
        variables: []
        vision:
          enabled: false
      height: 88
      id: '1748783029512'
      position:
        x: 1092.5667995574531
        y: 211.5747334168887
      positionAbsolute:
        x: 1092.5667995574531
        y: 211.5747334168887
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 0
    - data:
        answer: '{{#1748783029512.text#}}'
        desc: ''
        selected: false
        title: Answer - Multiple Issues
        type: answer
        variables: []
      height: 103
      id: '1748783041984'
      position:
        x: 1436.1121280862612
        y: 211.5747334168887
      positionAbsolute:
        x: 1436.1121280862612
        y: 211.5747334168887
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 0
    - data:
        desc: ''
        error_handle_mode: remove-abnormal-output
        height: 187
        is_parallel: true
        iterator_input_type: array[string]
        iterator_selector:
        - '1748767570289'
        - issue_keys
        output_selector:
        - '1748783571565'
        - result
        output_type: array[object]
        parallel_nums: 10
        selected: false
        start_node_id: 1748783526414start
        title: Iteration - Issues
        type: iteration
        width: 618
      height: 187
      id: '1748783526414'
      position:
        x: 89.0778811944802
        y: 211.5747334168887
      positionAbsolute:
        x: 89.0778811944802
        y: 211.5747334168887
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 618
      zIndex: 0
    - data:
        desc: ''
        isInIteration: true
        selected: false
        title: ''
        type: iteration-start
      draggable: false
      height: 48
      id: 1748783526414start
      parentId: '1748783526414'
      position:
        x: 24
        y: 68
      positionAbsolute:
        x: 113.0778811944802
        y: 279.5747334168887
      selectable: false
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom-iteration-start
      width: 44
      zIndex: 1001
    - data:
        dataset_ids:
        - W1plFG6wPRupvQB0T6LXXARA+GkduRuNFrUPXMZHtprMHDIwKWFC/Xl2XDIWt2EY
        desc: ''
        isInIteration: true
        isInLoop: false
        iteration_id: '1748783526414'
        metadata_filtering_conditions:
          conditions:
          - comparison_operator: is
            id: 2cc78fcc-d7fd-49e1-a66d-e71af312b069
            name: issue_key
            value: '{{#1748783526414.item#}}'
          logical_operator: and
        metadata_filtering_mode: manual
        multiple_retrieval_config:
          reranking_enable: false
          reranking_mode: weighted_score
          reranking_model:
            model: ''
            provider: ''
          score_threshold: null
          top_k: 4
          weights:
            keyword_setting:
              keyword_weight: 0
            vector_setting:
              embedding_model_name: text-embedding-3-large
              embedding_provider_name: langgenius/azure_openai/azure_openai
              vector_weight: 1
            weight_type: customized
        query_variable_selector:
        - '1748783526414'
        - item
        retrieval_mode: multiple
        selected: false
        title: KR - Each Issue
        type: knowledge-retrieval
      height: 90
      id: '1748783571565'
      parentId: '1748783526414'
      position:
        x: 213.39028285937735
        y: 65
      positionAbsolute:
        x: 302.46816405385755
        y: 276.5747334168887
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 1001
    - data:
        dataset_ids:
        - W1plFG6wPRupvQB0T6LXXARA+GkduRuNFrUPXMZHtprMHDIwKWFC/Xl2XDIWt2EY
        desc: ''
        multiple_retrieval_config:
          reranking_enable: false
          reranking_mode: weighted_score
          reranking_model:
            model: ''
            provider: ''
          score_threshold: null
          top_k: 4
          weights:
            keyword_setting:
              keyword_weight: 0
            vector_setting:
              embedding_model_name: text-embedding-3-large
              embedding_provider_name: langgenius/azure_openai/azure_openai
              vector_weight: 1
            weight_type: customized
        query_variable_selector:
        - sys
        - query
        retrieval_mode: multiple
        selected: false
        title: KR - General Project
        type: knowledge-retrieval
      height: 90
      id: '1748784602400'
      position:
        x: -284.44013680327953
        y: 464.40811576196575
      positionAbsolute:
        x: -284.44013680327953
        y: 464.40811576196575
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 0
    - data:
        answer: '{{#1748784677999.text#}}'
        desc: ''
        selected: false
        title: Answer - General Project
        type: answer
        variables: []
      height: 103
      id: '1748784661836'
      position:
        x: 456.2543663027028
        y: 464.40811576196575
      positionAbsolute:
        x: 456.2543663027028
        y: 464.40811576196575
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 0
    - data:
        context:
          enabled: true
          variable_selector:
          - '1748784602400'
          - result
        desc: ''
        model:
          completion_params:
            temperature: 0.3
          mode: chat
          name: gpt-35-turbo-16k
          provider: langgenius/azure_openai/azure_openai
        prompt_template:
        - id: b3c07274-69ce-4bb7-843b-e6db08c42df1
          role: system
          text: 'You are a software testing assistant helping engineers understand
            the Atlassian REST project: its scope, modules, features and open work.


            Answer only from the context below. Never use outside knowledge. The context
            contains several Jira issues; combine them into one answer.

            If the context does not help answer the question, reply exactly:

            "I''m sorry, I can''t find relevant project information in the documentation
            to answer that."


            Your reply should:

            - Answer the question directly in the first sentence

            - Support it with the Jira issues in the context, citing their keys (for
            example REST-320)

            - Point out what matters for testing when it is relevant


            Context:

            {{#context#}}


            User question:

            {{#sys.query#}}

            '
        selected: false
        structured_output_enabled: false
        title: LLM - General Project
        type: llm
        variables: []
        vision:
          enabled: false
      height: 88
      id: '1748784677999'
      position:
        x: 89.0778811944802
        y: 464.40811576196575
      positionAbsolute:
        x: 89.0778811944802
        y: 464.40811576196575
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 0
    - data:
        desc: ''
        instruction: 'Extract every Jira issue key mentioned in the user''s question,
          in the order they appear.

          A Jira issue key is an uppercase project prefix, a hyphen and a number,
          for example REST-266.

          Normalize other spellings to that format. This project''s prefix is REST,
          so "rest 266", "REST266", "issue 266" and "ticket 266" all become REST-266.

          If the question contains no issue key, return an empty list.

          '
        model:
          completion_params:
            temperature: 0
          mode: chat
          name: gpt-35-turbo-16k
          provider: langgenius/azure_openai/azure_openai
        parameters:
        - description: Every Jira issue key in the question, for example ["REST-266",
            "REST-265"].
          name: issue_keys
          required: false
          type: array[string]
        query:
        - sys
        - query
        reasoning_mode: prompt
        selected: false
        title: Issue Keys Extractor (Tests)
        type: parameter-extractor
        variables: []
        vision:
          configs:
            detail: high
            variable_selector:
            - sys
            - files
          enabled: false
      height: 88
      id: '17487850509710'
      position:
        x: -284.44013680327953
        y: 754.9250298061089
      positionAbsolute:
        x: -284.44013680327953
        y: 754.9250298061089
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 0
    - data:
        answer: '{{#1748786653855.text#}}'
        desc: ''
        selected: false
        title: Answer - Polite Redirect
        type: answer
        variables: []
      height: 103
      id: '1748785149607'
      position:
        x: 89.0778811944802
        y: 1011.2915512785755
      positionAbsolute:
        x: 89.0778811944802
        y: 1011.2915512785755
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 0
    - data:
        desc: ''
        error_handle_mode: remove-abnormal-output
        height: 187
        is_parallel: true
        iterator_input_type: array[string]
        iterator_selector:
        - '17487850509710'
        - issue_keys
        output_selector:
        - '1748785286399017487852864000'
        - result
        output_type: array[object]
        parallel_nums: 10
        selected: false
        start_node_id: 1748785286399start
        title: Iteration - Tests
        type: iteration
        width: 618
      height: 187
      id: '17487852863990'
      position:
        x: 456.2543663027028
        y: 743.564737158242
      positionAbsolute:
        x: 456.2543663027028
        y: 743.564737158242
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 618
      zIndex: 0
    - data:
        dataset_ids:
        - W1plFG6wPRupvQB0T6LXXARA+GkduRuNFrUPXMZHtprMHDIwKWFC/Xl2XDIWt2EY
        desc: ''
        isInIteration: true
        isInLoop: false
        iteration_id: '17487852863990'
        metadata_filtering_conditions:
          conditions:
          - comparison_operator: is
            id: 2cc78fcc-d7fd-49e1-a66d-e71af312b069
            name: issue_key
            value: '{{#17487852863990.item#}}'
          logical_operator: and
        metadata_filtering_mode: manual
        multiple_retrieval_config:
          reranking_enable: false
          reranking_mode: weighted_score
          reranking_model:
            model: ''
            provider: ''
          score_threshold: null
          top_k: 4
          weights:
            keyword_setting:
              keyword_weight: 0
            vector_setting:
              embedding_model_name: text-embedding-3-large
              embedding_provider_name: langgenius/azure_openai/azure_openai
              vector_weight: 1
            weight_type: customized
        query_variable_selector:
        - '17487852863990'
        - item
        retrieval_mode: multiple
        selected: false
        title: KR - Issue for Tests
        type: knowledge-retrieval
      height: 90
      id: '1748785286399017487852864000'
      parentId: '17487852863990'
      position:
        x: 213.39028285937735
        y: 65
      positionAbsolute:
        x: 669.6446491620802
        y: 808.564737158242
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 1001
    - data:
        desc: ''
        isInIteration: true
        selected: false
        title: ''
        type: iteration-start
      draggable: false
      height: 48
      id: 1748785286399start
      parentId: '17487852863990'
      position:
        x: 24
        y: 68
      positionAbsolute:
        x: 480.2543663027028
        y: 811.564737158242
      selectable: false
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom-iteration-start
      width: 44
      zIndex: 1001
    - data:
        cases:
        - case_id: 'true'
          conditions:
          - comparison_operator: not empty
            id: 1f00de1d-b3c7-4f97-8409-165cb5d04016
            value: ''
            varType: array[string]
            variable_selector:
            - '17487850509710'
            - issue_keys
          id: 'true'
          logical_operator: and
        desc: ''
        selected: false
        title: Has Issue Keys?
        type: if-else
      height: 140
      id: '1748785479296'
      position:
        x: 89.0778811944802
        y: 754.9250298061089
      positionAbsolute:
        x: 89.0778811944802
        y: 754.9250298061089
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 0
    - data:
        context:
          enabled: false
          variable_selector: []
        desc: ''
        model:
          completion_params:
            temperature: 0.3
          mode: chat
          name: gpt-35-turbo-16k
          provider: langgenius/azure_openai/azure_openai
        prompt_template:
        - id: f1e90d8d-abc0-478c-8604-f2805bc0c2f1
          role: system
          text: 'You are an experienced test designer. The user describes a requirement
            in their own words, without a Jira issue key.


            Write Gherkin test scenarios for that requirement:

            - One gherkin code block with a Feature and three to five Scenarios

            - Cover the main flow, invalid input and at least one edge case

            - Keep every step concrete and testable; leave out steps that check nothing

            - If the requirement is too vague to test, ask one clarifying question
            instead of guessing


            User requirement:

            {{#sys.query#}}

            '
        selected: false
        title: LLM - Gherkin from Requirement
        type: llm
        variables: []
        vision:
          enabled: false
      height: 88
      id: '1748785532843'
      position:
        x: 456.2543663027028
        y: 986.9215676569963
      positionAbsolute:
        x: 456.2543663027028
        y: 986.9215676569963
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 0
    - data:
        context:
          enabled: true
          variable_selector:
          - '1762728060345'
          - flat_context
        desc: ''
        model:
          completion_params:
            temperature: 0.3
          mode: chat
          name: gpt-35-turbo-16k
          provider: langgenius/azure_openai/azure_openai
        prompt_template:
        - id: 94d687e6-c23d-43e3-977c-65cb9c4a8cc1
          role: system
          text: 'You are an experienced test designer. Write Gherkin test scenarios
            for the Jira issues in the context below.


            Use only the behaviour described in the context. Do not invent endpoints,
            fields or error messages.


            Batch status: {{#1762728060345.batch_status#}}

            If the batch status starts with "Partial result" or "No requested Jira
            issues", begin your reply with that status and name the missing keys.
            Only write scenarios for issues that are in the context.


            For each issue:

            - A heading "### <issue key>: <summary>"

            - One gherkin code block with a Feature and two or three Scenarios: the
            main behaviour, an edge case, and a regression check when relevant

            - Concrete, testable Given/When/Then steps


            Context:

            {{#context#}}


            User request:

            {{#sys.query#}}

            '
        selected: false
        title: LLM - Gherkin from Issues
        type: llm
        variables: []
        vision:
          enabled: false
      height: 88
      id: '1748785557565'
      position:
        x: 1434.2543663027027
        y: 743.564737158242
      positionAbsolute:
        x: 1434.2543663027027
        y: 743.564737158242
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 0
    - data:
        answer: '{{#1748785557565.text#}}'
        desc: ''
        selected: false
        title: Answer - Gherkin from Issues
        type: answer
        variables: []
      height: 103
      id: '1748785836978'
      position:
        x: 1738.2543663027027
        y: 743.564737158242
      positionAbsolute:
        x: 1738.2543663027027
        y: 743.564737158242
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 0
    - data:
        answer: '{{#1748785532843.text#}}'
        desc: ''
        selected: false
        title: Answer - Gherkin from Requirement
        type: answer
        variables: []
      height: 103
      id: '1748786521492'
      position:
        x: 760.2543663027028
        y: 986.9215676569963
      positionAbsolute:
        x: 760.2543663027028
        y: 986.9215676569963
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 0
    - data:
        context:
          enabled: false
          variable_selector: []
        desc: ''
        model:
          completion_params:
            temperature: 0.3
          mode: chat
          name: gpt-35-turbo-16k
          provider: langgenius/azure_openai/azure_openai
        prompt_template:
        - id: 3c1b3adc-6c0e-4224-a8e1-18c5f6c6fb6d
          role: system
          text: 'You are Testus Patronus, an assistant that only helps with software
            testing for the Atlassian REST Jira project.


            The user''s message is outside that scope. Do not answer it, not even
            partially.

            Start your reply with exactly: "I''m sorry, I can''t help with that: it
            isn''t covered by the project documentation."

            Then add one friendly sentence: say what you can help with (Jira issues,
            project scope, test strategy and Gherkin test cases) and suggest one example
            question that doesn''t name a specific issue, such as "What is this project
            about?".


            User message:

            {{#sys.query#}}

            '
        selected: false
        title: LLM - Polite Redirect
        type: llm
        variables: []
        vision:
          enabled: false
      height: 88
      id: '1748786653855'
      position:
        x: -284.44013680327953
        y: 1011.2915512785755
      positionAbsolute:
        x: -284.44013680327953
        y: 1011.2915512785755
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 0
    - data:
        code: "import re\n\n\ndef main(inputs: list, expected_keys: list) -> dict:\n\
          \    flat_context = []\n    for item in inputs:\n        if isinstance(item,\
          \ list):\n            flat_context.extend(value for value in item if isinstance(value,\
          \ dict))\n        elif isinstance(item, dict):\n            flat_context.append(item)\n\
          \n    expected = [str(key).upper() for key in expected_keys if key]\n  \
          \  retrieved_keys = set(re.findall(\n        r\"(?<![A-Z0-9-])[A-Z][A-Z0-9]+-\\\
          d+(?![A-Z0-9-])\",\n        str(flat_context).upper(),\n    ))\n    completed\
          \ = [key for key in expected if key in retrieved_keys]\n    missing = [key\
          \ for key in expected if key not in retrieved_keys]\n\n    if not expected:\n\
          \        batch_status = \"No Jira issue keys were requested.\"\n    elif\
          \ not completed:\n        batch_status = \"No requested Jira issues were\
          \ retrieved: \" + \", \".join(expected) + \".\"\n    elif missing:\n   \
          \     batch_status = \"Partial result: retrieved \" + str(len(completed))\
          \ + \" of \" + str(len(expected)) + \" requested issues. Missing: \" + \"\
          , \".join(missing) + \".\"\n    else:\n        batch_status = \"Complete\
          \ result: retrieved all \" + str(len(expected)) + \" requested issues.\"\
          \n\n    return {\"flat_context\": flat_context, \"batch_status\": batch_status}\n"
        code_language: python3
        outputs:
          batch_status:
            children: null
            type: string
          flat_context:
            children: null
            type: array[object]
        selected: false
        title: Combine Results
        type: code
        variables:
        - value_selector:
          - '1748783526414'
          - output
          value_type: array[object]
          variable: inputs
        - value_selector:
          - '1748767570289'
          - issue_keys
          value_type: array[string]
          variable: expected_keys
      height: 52
      id: '1762727584347'
      position:
        x: 792.566799557453
        y: 211.5747334168887
      positionAbsolute:
        x: 792.566799557453
        y: 211.5747334168887
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 0
    - data:
        code: "import re\n\n\ndef main(inputs: list, expected_keys: list) -> dict:\n\
          \    flat_context = []\n    for item in inputs:\n        if isinstance(item,\
          \ list):\n            flat_context.extend(value for value in item if isinstance(value,\
          \ dict))\n        elif isinstance(item, dict):\n            flat_context.append(item)\n\
          \n    expected = [str(key).upper() for key in expected_keys if key]\n  \
          \  retrieved_keys = set(re.findall(\n        r\"(?<![A-Z0-9-])[A-Z][A-Z0-9]+-\\\
          d+(?![A-Z0-9-])\",\n        str(flat_context).upper(),\n    ))\n    completed\
          \ = [key for key in expected if key in retrieved_keys]\n    missing = [key\
          \ for key in expected if key not in retrieved_keys]\n\n    if not expected:\n\
          \        batch_status = \"No Jira issue keys were requested.\"\n    elif\
          \ not completed:\n        batch_status = \"No requested Jira issues were\
          \ retrieved: \" + \", \".join(expected) + \".\"\n    elif missing:\n   \
          \     batch_status = \"Partial result: retrieved \" + str(len(completed))\
          \ + \" of \" + str(len(expected)) + \" requested issues. Missing: \" + \"\
          , \".join(missing) + \".\"\n    else:\n        batch_status = \"Complete\
          \ result: retrieved all \" + str(len(expected)) + \" requested issues.\"\
          \n\n    return {\"flat_context\": flat_context, \"batch_status\": batch_status}\n"
        code_language: python3
        outputs:
          batch_status:
            children: null
            type: string
          flat_context:
            children: null
            type: array[object]
        selected: false
        title: Combine Results (Tests)
        type: code
        variables:
        - value_selector:
          - '17487852863990'
          - output
          value_type: array[object]
          variable: inputs
        - value_selector:
          - '17487850509710'
          - issue_keys
          value_type: array[string]
          variable: expected_keys
      height: 52
      id: '1762728060345'
      position:
        x: 1134.2543663027027
        y: 743.564737158242
      positionAbsolute:
        x: 1134.2543663027027
        y: 743.564737158242
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 0
    - data:
        cases:
        - case_id: 'true'
          conditions:
          - comparison_operator: not empty
            id: bbb8c3cb-24d6-4183-9c7b-ccf9e38a930d
            value: ''
            varType: array[object]
            variable_selector:
            - '1748687775954'
            - result
          id: 'true'
          logical_operator: and
        desc: ''
        selected: false
        title: Issue Found?
        type: if-else
      height: 140
      id: issue_found
      position:
        x: 820
        y: 33.57
      positionAbsolute:
        x: 820
        y: 33.57
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 0
    - data:
        answer: I'm sorry, I can't find {{#1748719005808.issue_key#}} in the project
          documentation. Check the issue key and try again.
        desc: ''
        selected: false
        title: Answer - Issue Not Found
        type: answer
        variables: []
      height: 151
      id: answer_not_found
      position:
        x: 1160
        y: -130
      positionAbsolute:
        x: 1160
        y: -130
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 0
    - data:
        cases:
        - case_id: 'true'
          conditions:
          - comparison_operator: not empty
            id: c04e27bb-4383-43de-9b1a-69763121ab78
            value: ''
            varType: string
            variable_selector:
            - '1748719005808'
            - issue_key
          id: 'true'
          logical_operator: and
        desc: ''
        selected: false
        title: Has Key?
        type: if-else
      height: 150
      id: has_key
      position:
        x: 89.08
        y: 33.57
      positionAbsolute:
        x: 89.08
        y: 33.57
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
      zIndex: 0
    viewport:
      x: 792.1891000984979
      y: 274.1399041636766
      zoom: 0.6944433269104796
  rag_pipeline_variables: []
