{
  "data": {
    "edges": [
      {
        "animated": false,
        "className": "",
        "data": {
          "sourceHandle": {
            "dataType": "File",
            "id": "File-c3b4c",
            "name": "data",
            "output_types": [
              "Data"
            ]
          },
          "targetHandle": {
            "fieldName": "run1",
            "id": "FlakyDiff-ced42",
            "inputTypes": [
              "Data"
            ],
            "type": "other"
          }
        },
        "id": "reactflow__edge-File-c3b4c{\u0153dataType\u0153:\u0153File\u0153,\u0153id\u0153:\u0153File-c3b4c\u0153,\u0153name\u0153:\u0153data\u0153,\u0153output_types\u0153:[\u0153Data\u0153]}-FlakyDiff-ced42{\u0153fieldName\u0153:\u0153run1\u0153,\u0153id\u0153:\u0153FlakyDiff-ced42\u0153,\u0153inputTypes\u0153:[\u0153Data\u0153],\u0153type\u0153:\u0153other\u0153}",
        "selected": false,
        "source": "File-c3b4c",
        "sourceHandle": "{\u0153dataType\u0153: \u0153File\u0153, \u0153id\u0153: \u0153File-c3b4c\u0153, \u0153name\u0153: \u0153data\u0153, \u0153output_types\u0153: [\u0153Data\u0153]}",
        "target": "FlakyDiff-ced42",
        "targetHandle": "{\u0153fieldName\u0153: \u0153run1\u0153, \u0153id\u0153: \u0153FlakyDiff-ced42\u0153, \u0153inputTypes\u0153: [\u0153Data\u0153], \u0153type\u0153: \u0153other\u0153}"
      },
      {
        "animated": false,
        "className": "",
        "data": {
          "sourceHandle": {
            "dataType": "File",
            "id": "File-5a2b0",
            "name": "data",
            "output_types": [
              "Data"
            ]
          },
          "targetHandle": {
            "fieldName": "run2",
            "id": "FlakyDiff-ced42",
            "inputTypes": [
              "Data"
            ],
            "type": "other"
          }
        },
        "id": "reactflow__edge-File-5a2b0{\u0153dataType\u0153:\u0153File\u0153,\u0153id\u0153:\u0153File-5a2b0\u0153,\u0153name\u0153:\u0153data\u0153,\u0153output_types\u0153:[\u0153Data\u0153]}-FlakyDiff-ced42{\u0153fieldName\u0153:\u0153run2\u0153,\u0153id\u0153:\u0153FlakyDiff-ced42\u0153,\u0153inputTypes\u0153:[\u0153Data\u0153],\u0153type\u0153:\u0153other\u0153}",
        "selected": false,
        "source": "File-5a2b0",
        "sourceHandle": "{\u0153dataType\u0153: \u0153File\u0153, \u0153id\u0153: \u0153File-5a2b0\u0153, \u0153name\u0153: \u0153data\u0153, \u0153output_types\u0153: [\u0153Data\u0153]}",
        "target": "FlakyDiff-ced42",
        "targetHandle": "{\u0153fieldName\u0153: \u0153run2\u0153, \u0153id\u0153: \u0153FlakyDiff-ced42\u0153, \u0153inputTypes\u0153: [\u0153Data\u0153], \u0153type\u0153: \u0153other\u0153}"
      },
      {
        "animated": false,
        "className": "",
        "data": {
          "sourceHandle": {
            "dataType": "FlakyDiff",
            "id": "FlakyDiff-ced42",
            "name": "comparison",
            "output_types": [
              "Message"
            ]
          },
          "targetHandle": {
            "fieldName": "comparison",
            "id": "Prompt-e7334",
            "inputTypes": [
              "Message"
            ],
            "type": "str"
          }
        },
        "id": "reactflow__edge-FlakyDiff-ced42{\u0153dataType\u0153:\u0153FlakyDiff\u0153,\u0153id\u0153:\u0153FlakyDiff-ced42\u0153,\u0153name\u0153:\u0153comparison\u0153,\u0153output_types\u0153:[\u0153Message\u0153]}-Prompt-e7334{\u0153fieldName\u0153:\u0153comparison\u0153,\u0153id\u0153:\u0153Prompt-e7334\u0153,\u0153inputTypes\u0153:[\u0153Message\u0153],\u0153type\u0153:\u0153str\u0153}",
        "selected": false,
        "source": "FlakyDiff-ced42",
        "sourceHandle": "{\u0153dataType\u0153: \u0153FlakyDiff\u0153, \u0153id\u0153: \u0153FlakyDiff-ced42\u0153, \u0153name\u0153: \u0153comparison\u0153, \u0153output_types\u0153: [\u0153Message\u0153]}",
        "target": "Prompt-e7334",
        "targetHandle": "{\u0153fieldName\u0153: \u0153comparison\u0153, \u0153id\u0153: \u0153Prompt-e7334\u0153, \u0153inputTypes\u0153: [\u0153Message\u0153], \u0153type\u0153: \u0153str\u0153}"
      },
      {
        "animated": false,
        "className": "",
        "data": {
          "sourceHandle": {
            "dataType": "Prompt",
            "id": "Prompt-e7334",
            "name": "prompt",
            "output_types": [
              "Message"
            ]
          },
          "targetHandle": {
            "fieldName": "input_value",
            "id": "GroqModel-61884",
            "inputTypes": [
              "Message"
            ],
            "type": "str"
          }
        },
        "id": "reactflow__edge-Prompt-e7334{\u0153dataType\u0153:\u0153Prompt\u0153,\u0153id\u0153:\u0153Prompt-e7334\u0153,\u0153name\u0153:\u0153prompt\u0153,\u0153output_types\u0153:[\u0153Message\u0153]}-GroqModel-61884{\u0153fieldName\u0153:\u0153input_value\u0153,\u0153id\u0153:\u0153GroqModel-61884\u0153,\u0153inputTypes\u0153:[\u0153Message\u0153],\u0153type\u0153:\u0153str\u0153}",
        "selected": false,
        "source": "Prompt-e7334",
        "sourceHandle": "{\u0153dataType\u0153: \u0153Prompt\u0153, \u0153id\u0153: \u0153Prompt-e7334\u0153, \u0153name\u0153: \u0153prompt\u0153, \u0153output_types\u0153: [\u0153Message\u0153]}",
        "target": "GroqModel-61884",
        "targetHandle": "{\u0153fieldName\u0153: \u0153input_value\u0153, \u0153id\u0153: \u0153GroqModel-61884\u0153, \u0153inputTypes\u0153: [\u0153Message\u0153], \u0153type\u0153: \u0153str\u0153}"
      },
      {
        "animated": false,
        "className": "",
        "data": {
          "sourceHandle": {
            "dataType": "GroqModel",
            "id": "GroqModel-61884",
            "name": "text_output",
            "output_types": [
              "Message"
            ]
          },
          "targetHandle": {
            "fieldName": "input_value",
            "id": "StructuredOutput-4d899",
            "inputTypes": [
              "Message"
            ],
            "type": "str"
          }
        },
        "id": "reactflow__edge-GroqModel-61884{\u0153dataType\u0153:\u0153GroqModel\u0153,\u0153id\u0153:\u0153GroqModel-61884\u0153,\u0153name\u0153:\u0153text_output\u0153,\u0153output_types\u0153:[\u0153Message\u0153]}-StructuredOutput-4d899{\u0153fieldName\u0153:\u0153input_value\u0153,\u0153id\u0153:\u0153StructuredOutput-4d899\u0153,\u0153inputTypes\u0153:[\u0153Message\u0153],\u0153type\u0153:\u0153str\u0153}",
        "selected": false,
        "source": "GroqModel-61884",
        "sourceHandle": "{\u0153dataType\u0153: \u0153GroqModel\u0153, \u0153id\u0153: \u0153GroqModel-61884\u0153, \u0153name\u0153: \u0153text_output\u0153, \u0153output_types\u0153: [\u0153Message\u0153]}",
        "target": "StructuredOutput-4d899",
        "targetHandle": "{\u0153fieldName\u0153: \u0153input_value\u0153, \u0153id\u0153: \u0153StructuredOutput-4d899\u0153, \u0153inputTypes\u0153: [\u0153Message\u0153], \u0153type\u0153: \u0153str\u0153}"
      },
      {
        "animated": false,
        "className": "",
        "data": {
          "sourceHandle": {
            "dataType": "GroqModel",
            "id": "GroqModel-61884",
            "name": "model_output",
            "output_types": [
              "LanguageModel"
            ]
          },
          "targetHandle": {
            "fieldName": "llm",
            "id": "StructuredOutput-4d899",
            "inputTypes": [
              "LanguageModel"
            ],
            "type": "other"
          }
        },
        "id": "reactflow__edge-GroqModel-61884{\u0153dataType\u0153:\u0153GroqModel\u0153,\u0153id\u0153:\u0153GroqModel-61884\u0153,\u0153name\u0153:\u0153model_output\u0153,\u0153output_types\u0153:[\u0153LanguageModel\u0153]}-StructuredOutput-4d899{\u0153fieldName\u0153:\u0153llm\u0153,\u0153id\u0153:\u0153StructuredOutput-4d899\u0153,\u0153inputTypes\u0153:[\u0153LanguageModel\u0153],\u0153type\u0153:\u0153other\u0153}",
        "selected": false,
        "source": "GroqModel-61884",
        "sourceHandle": "{\u0153dataType\u0153: \u0153GroqModel\u0153, \u0153id\u0153: \u0153GroqModel-61884\u0153, \u0153name\u0153: \u0153model_output\u0153, \u0153output_types\u0153: [\u0153LanguageModel\u0153]}",
        "target": "StructuredOutput-4d899",
        "targetHandle": "{\u0153fieldName\u0153: \u0153llm\u0153, \u0153id\u0153: \u0153StructuredOutput-4d899\u0153, \u0153inputTypes\u0153: [\u0153LanguageModel\u0153], \u0153type\u0153: \u0153other\u0153}"
      },
      {
        "animated": false,
        "className": "",
        "data": {
          "sourceHandle": {
            "dataType": "StructuredOutput",
            "id": "StructuredOutput-4d899",
            "name": "structured_output",
            "output_types": [
              "Data"
            ]
          },
          "targetHandle": {
            "fieldName": "input_value",
            "id": "ChatOutput-18ba6",
            "inputTypes": [
              "Message"
            ],
            "type": "str"
          }
        },
        "id": "reactflow__edge-StructuredOutput-4d899{\u0153dataType\u0153:\u0153StructuredOutput\u0153,\u0153id\u0153:\u0153StructuredOutput-4d899\u0153,\u0153name\u0153:\u0153structured_output\u0153,\u0153output_types\u0153:[\u0153Data\u0153]}-ChatOutput-18ba6{\u0153fieldName\u0153:\u0153input_value\u0153,\u0153id\u0153:\u0153ChatOutput-18ba6\u0153,\u0153inputTypes\u0153:[\u0153Message\u0153],\u0153type\u0153:\u0153str\u0153}",
        "selected": false,
        "source": "StructuredOutput-4d899",
        "sourceHandle": "{\u0153dataType\u0153: \u0153StructuredOutput\u0153, \u0153id\u0153: \u0153StructuredOutput-4d899\u0153, \u0153name\u0153: \u0153structured_output\u0153, \u0153output_types\u0153: [\u0153Data\u0153]}",
        "target": "ChatOutput-18ba6",
        "targetHandle": "{\u0153fieldName\u0153: \u0153input_value\u0153, \u0153id\u0153: \u0153ChatOutput-18ba6\u0153, \u0153inputTypes\u0153: [\u0153Message\u0153], \u0153type\u0153: \u0153str\u0153}"
      }
    ],
    "nodes": [
      {
        "data": {
          "description": "Loads the Playwright JSON report from the first run.",
          "display_name": "File \u2014 Build 1 (results.json)",
          "id": "File-c3b4c",
          "node": {
            "base_classes": [
              "Data"
            ],
            "beta": false,
            "conditional_paths": [],
            "custom_fields": {},
            "description": "Loads the Playwright JSON report from the first run.",
            "display_name": "File \u2014 Build 1 (results.json)",
            "documentation": "",
            "edited": false,
            "field_order": [
              "path",
              "silent_errors",
              "use_multithreading"
            ],
            "frozen": false,
            "icon": "file-json",
            "legacy": false,
            "lf_version": "1.7.0",
            "metadata": {
              "module": "lfx.components.data.file.FileComponent"
            },
            "output_types": [],
            "outputs": [
              {
                "allows_loop": false,
                "cache": true,
                "display_name": "Data",
                "group_outputs": false,
                "method": "load_files",
                "name": "data",
                "selected": "Data",
                "tool_mode": true,
                "types": [
                  "Data"
                ],
                "value": "__UNDEFINED__"
              }
            ],
            "pinned": false,
            "template": {
              "_type": "Component",
              "code": {
                "advanced": true,
                "dynamic": true,
                "fileTypes": [],
                "file_path": "",
                "info": "",
                "list": false,
                "load_from_db": false,
                "multiline": true,
                "name": "code",
                "password": false,
                "placeholder": "",
                "required": true,
                "show": true,
                "title_case": false,
                "type": "code",
                "value": "# File loader (Langflow built-in). Reads Playwright results.json for Build 1.\n"
              },
              "path": {
                "advanced": false,
                "display_name": "Build 1 \u2014 results.json",
                "dynamic": false,
                "info": "Upload the Playwright JSON report from the FIRST run (build 1).",
                "list": false,
                "load_from_db": false,
                "name": "path",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "file",
                "value": "",
                "_input_type": "FileInput",
                "fileTypes": [
                  "json"
                ]
              },
              "silent_errors": {
                "advanced": true,
                "display_name": "Silent Errors",
                "dynamic": false,
                "info": "",
                "list": false,
                "load_from_db": false,
                "name": "silent_errors",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "bool",
                "value": false
              },
              "use_multithreading": {
                "advanced": true,
                "display_name": "Use Multithreading",
                "dynamic": false,
                "info": "",
                "list": false,
                "load_from_db": false,
                "name": "use_multithreading",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "bool",
                "value": false
              }
            }
          },
          "type": "File"
        },
        "dragging": false,
        "id": "File-c3b4c",
        "measured": {
          "height": 320,
          "width": 320
        },
        "position": {
          "x": 80,
          "y": 80
        },
        "selected": false,
        "type": "genericNode"
      },
      {
        "data": {
          "description": "Loads the Playwright JSON report from the second run.",
          "display_name": "File \u2014 Build 2 (results.json)",
          "id": "File-5a2b0",
          "node": {
            "base_classes": [
              "Data"
            ],
            "beta": false,
            "conditional_paths": [],
            "custom_fields": {},
            "description": "Loads the Playwright JSON report from the second run.",
            "display_name": "File \u2014 Build 2 (results.json)",
            "documentation": "",
            "edited": false,
            "field_order": [
              "path",
              "silent_errors",
              "use_multithreading"
            ],
            "frozen": false,
            "icon": "file-json",
            "legacy": false,
            "lf_version": "1.7.0",
            "metadata": {
              "module": "lfx.components.data.file.FileComponent"
            },
            "output_types": [],
            "outputs": [
              {
                "allows_loop": false,
                "cache": true,
                "display_name": "Data",
                "group_outputs": false,
                "method": "load_files",
                "name": "data",
                "selected": "Data",
                "tool_mode": true,
                "types": [
                  "Data"
                ],
                "value": "__UNDEFINED__"
              }
            ],
            "pinned": false,
            "template": {
              "_type": "Component",
              "code": {
                "advanced": true,
                "dynamic": true,
                "fileTypes": [],
                "file_path": "",
                "info": "",
                "list": false,
                "load_from_db": false,
                "multiline": true,
                "name": "code",
                "password": false,
                "placeholder": "",
                "required": true,
                "show": true,
                "title_case": false,
                "type": "code",
                "value": "# File loader (Langflow built-in). Reads Playwright results.json for Build 2.\n"
              },
              "path": {
                "advanced": false,
                "display_name": "Build 2 \u2014 results.json",
                "dynamic": false,
                "info": "Upload the Playwright JSON report from the SECOND run (build 2).",
                "list": false,
                "load_from_db": false,
                "name": "path",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "file",
                "value": "",
                "_input_type": "FileInput",
                "fileTypes": [
                  "json"
                ]
              },
              "silent_errors": {
                "advanced": true,
                "display_name": "Silent Errors",
                "dynamic": false,
                "info": "",
                "list": false,
                "load_from_db": false,
                "name": "silent_errors",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "bool",
                "value": false
              },
              "use_multithreading": {
                "advanced": true,
                "display_name": "Use Multithreading",
                "dynamic": false,
                "info": "",
                "list": false,
                "load_from_db": false,
                "name": "use_multithreading",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "bool",
                "value": false
              }
            }
          },
          "type": "File"
        },
        "dragging": false,
        "id": "File-5a2b0",
        "measured": {
          "height": 320,
          "width": 320
        },
        "position": {
          "x": 80,
          "y": 460
        },
        "selected": false,
        "type": "genericNode"
      },
      {
        "data": {
          "description": "Indexes both Playwright reports and classifies each test: flaky (mixed/retry) vs consistent failure vs stable.",
          "display_name": "Flaky Diff \u2014 Compare Two Runs",
          "id": "FlakyDiff-ced42",
          "node": {
            "base_classes": [
              "Message"
            ],
            "beta": false,
            "conditional_paths": [],
            "custom_fields": {},
            "description": "Indexes both Playwright reports and classifies each test: flaky (mixed/retry) vs consistent failure vs stable.",
            "display_name": "Flaky Diff \u2014 Compare Two Runs",
            "documentation": "",
            "edited": false,
            "field_order": [
              "run1",
              "run2"
            ],
            "frozen": false,
            "icon": "git-compare",
            "legacy": false,
            "lf_version": "1.7.0",
            "metadata": {
              "module": "custom.flaky_diff.FlakyDiff"
            },
            "output_types": [],
            "outputs": [
              {
                "allows_loop": false,
                "cache": true,
                "display_name": "Comparison",
                "group_outputs": false,
                "method": "build_comparison",
                "name": "comparison",
                "selected": "Message",
                "tool_mode": true,
                "types": [
                  "Message"
                ],
                "value": "__UNDEFINED__"
              }
            ],
            "pinned": false,
            "template": {
              "_type": "Component",
              "code": {
                "advanced": true,
                "dynamic": true,
                "fileTypes": [],
                "file_path": "",
                "info": "",
                "list": false,
                "load_from_db": false,
                "multiline": true,
                "name": "code",
                "password": false,
                "placeholder": "",
                "required": true,
                "show": true,
                "title_case": false,
                "type": "code",
                "value": "from lfx.custom.custom_component.component import Component\nfrom lfx.io import DataInput, Output\nfrom lfx.schema.message import Message\nimport json\n\n\nclass FlakyDiff(Component):\n    display_name = \"Flaky Diff\"\n    description = \"Compares two Playwright JSON reports and classifies tests as flaky, consistent failure, or stable.\"\n    icon = \"git-compare\"\n    name = \"FlakyDiff\"\n\n    inputs = [\n        DataInput(name=\"run1\", display_name=\"Build 1 Data\", info=\"Playwright results.json from run 1.\"),\n        DataInput(name=\"run2\", display_name=\"Build 2 Data\", info=\"Playwright results.json from run 2.\"),\n    ]\n    outputs = [\n        Output(display_name=\"Comparison\", name=\"comparison\", method=\"build_comparison\"),\n    ]\n\n    def _index(self, data_obj):\n        \"\"\"Return {testTitle: {'status': 'passed|failed', 'retries': int}} from a Playwright JSON report.\"\"\"\n        raw = getattr(data_obj, \"data\", data_obj)\n        if isinstance(raw, str):\n            raw = json.loads(raw)\n        if isinstance(raw, dict) and \"text\" in raw and isinstance(raw[\"text\"], str):\n            raw = json.loads(raw[\"text\"])\n        results = {}\n\n        def walk(suite, prefix=\"\"):\n            title = suite.get(\"title\", \"\")\n            path = f\"{prefix} > {title}\".strip(\" >\") if title else prefix\n            for spec in suite.get(\"specs\", []):\n                spec_title = f\"{path} > {spec.get('title','')}\".strip(\" >\")\n                for test in spec.get(\"tests\", []):\n                    test_results = test.get(\"results\", [])\n                    retries = max(0, len(test_results) - 1)\n                    # Final outcome = status of last result; \"ok\" field marks expected pass\n                    final = test_results[-1].get(\"status\") if test_results else \"unknown\"\n                    passed = spec.get(\"ok\", final in (\"passed\", \"expected\"))\n                    results[spec_title] = {\n                        \"status\": \"passed\" if passed else \"failed\",\n                        \"retries\": retries,\n                    }\n            for child in suite.get(\"suites\", []):\n                walk(child, path)\n\n        for suite in raw.get(\"suites\", []):\n            walk(suite)\n        return results\n\n    def build_comparison(self) -> Message:\n        r1 = self._index(self.run1)\n        r2 = self._index(self.run2)\n        all_tests = sorted(set(r1) | set(r2))\n\n        flaky, consistent_fail, stable, retry_flaky = [], [], [], []\n        for t in all_tests:\n            a = r1.get(t, {}).get(\"status\", \"absent\")\n            b = r2.get(t, {}).get(\"status\", \"absent\")\n            ra = r1.get(t, {}).get(\"retries\", 0)\n            rb = r2.get(t, {}).get(\"retries\", 0)\n            # Mixed across runs => flaky\n            if {a, b} == {\"passed\", \"failed\"}:\n                flaky.append(t)\n            # Failed in both runs => consistent failure (real bug)\n            elif a == \"failed\" and b == \"failed\":\n                consistent_fail.append(t)\n            # Passed but needed a retry in either run => flaky signal\n            elif a == \"passed\" and b == \"passed\" and (ra > 0 or rb > 0):\n                retry_flaky.append(t)\n            elif a == \"passed\" and b == \"passed\":\n                stable.append(t)\n\n        report = {\n            \"total_unique_tests\": len(all_tests),\n            \"build1_failures\": sum(1 for t in r1 if r1[t][\"status\"] == \"failed\"),\n            \"build2_failures\": sum(1 for t in r2 if r2[t][\"status\"] == \"failed\"),\n            \"flaky_mixed_results\": flaky,\n            \"flaky_passed_on_retry\": retry_flaky,\n            \"consistent_failures\": consistent_fail,\n            \"stable_tests_count\": len(stable),\n        }\n        text = json.dumps(report, indent=2)\n        self.status = text\n        return Message(text=text)\n"
              },
              "run1": {
                "advanced": false,
                "display_name": "Build 1 Data",
                "dynamic": false,
                "info": "Connect Build 1 file output.",
                "list": false,
                "load_from_db": false,
                "name": "run1",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "other",
                "value": "",
                "_input_type": "DataInput"
              },
              "run2": {
                "advanced": false,
                "display_name": "Build 2 Data",
                "dynamic": false,
                "info": "Connect Build 2 file output.",
                "list": false,
                "load_from_db": false,
                "name": "run2",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "other",
                "value": "",
                "_input_type": "DataInput"
              }
            }
          },
          "type": "FlakyDiff"
        },
        "dragging": false,
        "id": "FlakyDiff-ced42",
        "measured": {
          "height": 320,
          "width": 320
        },
        "position": {
          "x": 480,
          "y": 270
        },
        "selected": false,
        "type": "genericNode"
      },
      {
        "data": {
          "description": "Tells the model the strict flaky vs consistent-failure definitions and what to output.",
          "display_name": "Prompt Template \u2014 Reliability Brief",
          "id": "Prompt-e7334",
          "node": {
            "base_classes": [
              "Message"
            ],
            "beta": false,
            "conditional_paths": [],
            "custom_fields": {
              "template": [
                "comparison"
              ]
            },
            "description": "Tells the model the strict flaky vs consistent-failure definitions and what to output.",
            "display_name": "Prompt Template \u2014 Reliability Brief",
            "documentation": "",
            "edited": false,
            "field_order": [
              "template",
              "comparison",
              "use_double_brackets",
              "tool_placeholder"
            ],
            "frozen": false,
            "icon": "prompts",
            "legacy": false,
            "lf_version": "1.7.0",
            "metadata": {
              "module": "lfx.components.models_and_agents.prompt.PromptComponent"
            },
            "output_types": [],
            "outputs": [
              {
                "allows_loop": false,
                "cache": true,
                "display_name": "Prompt",
                "group_outputs": false,
                "method": "build_prompt",
                "name": "prompt",
                "selected": "Message",
                "tool_mode": true,
                "types": [
                  "Message"
                ],
                "value": "__UNDEFINED__"
              }
            ],
            "pinned": false,
            "template": {
              "_type": "Component",
              "code": {
                "advanced": true,
                "dynamic": true,
                "fileTypes": [],
                "file_path": "",
                "info": "",
                "list": false,
                "load_from_db": false,
                "multiline": true,
                "name": "code",
                "password": false,
                "placeholder": "",
                "required": true,
                "show": true,
                "title_case": false,
                "type": "code",
                "value": "# Prompt Template (Langflow built-in)\n"
              },
              "template": {
                "advanced": false,
                "display_name": "Template",
                "dynamic": true,
                "info": "Reliability instructions. {comparison} is the diff output.",
                "list": false,
                "name": "template",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "prompt",
                "value": "You are a senior test reliability engineer. You are given a comparison of two Playwright runs (Build 1 and Build 2) of the same suite.\n\nCOMPARISON REPORT:\n{comparison}\n\nDefinitions you MUST follow:\n- FLAKY = a test whose result is non-deterministic: it passed in one build and failed in the other, OR it passed but only after a retry. Flaky tests need a rerun / quarantine, not a code fix.\n- CONSISTENT FAILURE = a test that failed in BOTH builds. This is a real, reproducible bug, NOT flaky. It needs a code or test fix.\n\nProduce:\n1. FLAKY_TESTS \u2014 the flaky test names and, for each, a one-line hypothesis of the likely flake cause (timing/wait, test data, parallelism, network, animation, etc.).\n2. CONSISTENT_FAILURES \u2014 the tests failing in both builds, each with a probable root cause.\n3. RERUN_RECOMMENDATION \u2014 which tests to rerun (the flaky ones) and which to send to engineering as bugs.\n4. SUMMARY \u2014 counts and one sentence on overall suite health.\n\nBase everything only on the comparison data. Do not invent test names.",
                "_input_type": "PromptInput"
              },
              "comparison": {
                "advanced": false,
                "display_name": "comparison",
                "dynamic": false,
                "info": "Connect the Flaky Diff output here.",
                "list": false,
                "load_from_db": false,
                "name": "comparison",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "str",
                "value": "",
                "_input_type": "MessageTextInput"
              },
              "tool_placeholder": {
                "advanced": true,
                "display_name": "Tool Placeholder",
                "dynamic": false,
                "info": "",
                "list": false,
                "load_from_db": false,
                "name": "tool_placeholder",
                "placeholder": "",
                "required": false,
                "show": false,
                "title_case": false,
                "type": "str",
                "value": ""
              },
              "use_double_brackets": {
                "advanced": true,
                "display_name": "Use Double Brackets",
                "dynamic": false,
                "info": "",
                "list": false,
                "load_from_db": false,
                "name": "use_double_brackets",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "bool",
                "value": false
              }
            }
          },
          "type": "Prompt"
        },
        "dragging": false,
        "id": "Prompt-e7334",
        "measured": {
          "height": 320,
          "width": 320
        },
        "position": {
          "x": 880,
          "y": 270
        },
        "selected": false,
        "type": "genericNode"
      },
      {
        "data": {
          "description": "Runs the reliability reasoning on Groq.",
          "display_name": "Groq Model \u2014 gpt-oss-120b",
          "id": "GroqModel-61884",
          "node": {
            "base_classes": [
              "Message",
              "LanguageModel"
            ],
            "beta": false,
            "conditional_paths": [],
            "custom_fields": {},
            "description": "Runs the reliability reasoning on Groq.",
            "display_name": "Groq Model \u2014 gpt-oss-120b",
            "documentation": "",
            "edited": false,
            "field_order": [
              "api_key",
              "model_name",
              "base_url",
              "temperature",
              "input_value",
              "stream",
              "system_message"
            ],
            "frozen": false,
            "icon": "Groq",
            "legacy": false,
            "lf_version": "1.7.0",
            "metadata": {
              "module": "lfx.components.groq.groq.GroqModel"
            },
            "output_types": [],
            "outputs": [
              {
                "allows_loop": false,
                "cache": true,
                "display_name": "Model Response",
                "group_outputs": false,
                "method": "text_response",
                "name": "text_output",
                "selected": "Message",
                "tool_mode": true,
                "types": [
                  "Message"
                ],
                "value": "__UNDEFINED__"
              },
              {
                "allows_loop": false,
                "cache": true,
                "display_name": "Language Model",
                "group_outputs": false,
                "method": "build_model",
                "name": "model_output",
                "selected": "LanguageModel",
                "tool_mode": true,
                "types": [
                  "LanguageModel"
                ],
                "value": "__UNDEFINED__"
              }
            ],
            "pinned": false,
            "template": {
              "_type": "Component",
              "code": {
                "advanced": true,
                "dynamic": true,
                "fileTypes": [],
                "file_path": "",
                "info": "",
                "list": false,
                "load_from_db": false,
                "multiline": true,
                "name": "code",
                "password": false,
                "placeholder": "",
                "required": true,
                "show": true,
                "title_case": false,
                "type": "code",
                "value": "# Groq model. Runs gpt-oss-120b for reliability analysis.\n"
              },
              "api_key": {
                "advanced": false,
                "display_name": "Groq API Key",
                "dynamic": false,
                "info": "Your Groq API key (gsk_...).",
                "list": false,
                "load_from_db": true,
                "name": "api_key",
                "placeholder": "",
                "required": true,
                "show": true,
                "title_case": false,
                "type": "str",
                "value": "",
                "_input_type": "SecretStrInput",
                "password": true
              },
              "model_name": {
                "advanced": false,
                "display_name": "Model",
                "dynamic": false,
                "info": "",
                "list": false,
                "load_from_db": false,
                "name": "model_name",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "str",
                "value": "openai/gpt-oss-120b",
                "_input_type": "DropdownInput",
                "options": [
                  "openai/gpt-oss-120b",
                  "openai/gpt-oss-20b",
                  "llama-3.3-70b-versatile",
                  "llama-3.1-8b-instant",
                  "moonshotai/kimi-k2-instruct"
                ]
              },
              "base_url": {
                "advanced": true,
                "display_name": "Groq API Base",
                "dynamic": false,
                "info": "",
                "list": false,
                "load_from_db": false,
                "name": "base_url",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "str",
                "value": "https://api.groq.com/openai/v1"
              },
              "temperature": {
                "advanced": false,
                "display_name": "Temperature",
                "dynamic": false,
                "info": "Low for deterministic classification.",
                "list": false,
                "load_from_db": false,
                "name": "temperature",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "float",
                "value": 0.1
              },
              "input_value": {
                "advanced": false,
                "display_name": "Input",
                "dynamic": false,
                "info": "",
                "list": false,
                "load_from_db": false,
                "name": "input_value",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "str",
                "value": "",
                "_input_type": "MessageInput"
              },
              "stream": {
                "advanced": true,
                "display_name": "Stream",
                "dynamic": false,
                "info": "",
                "list": false,
                "load_from_db": false,
                "name": "stream",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "bool",
                "value": false
              },
              "system_message": {
                "advanced": true,
                "display_name": "System Message",
                "dynamic": false,
                "info": "",
                "list": false,
                "load_from_db": false,
                "name": "system_message",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "str",
                "value": "",
                "_input_type": "MultilineInput",
                "multiline": true
              }
            }
          },
          "type": "GroqModel"
        },
        "dragging": false,
        "id": "GroqModel-61884",
        "measured": {
          "height": 320,
          "width": 320
        },
        "position": {
          "x": 1280,
          "y": 270
        },
        "selected": false,
        "type": "genericNode"
      },
      {
        "data": {
          "description": "Forces output into JSON: flaky_tests, consistent_failures, rerun_recommendation, counts, summary.",
          "display_name": "Structured Output \u2014 Flaky JSON",
          "id": "StructuredOutput-4d899",
          "node": {
            "base_classes": [
              "Data"
            ],
            "beta": false,
            "conditional_paths": [],
            "custom_fields": {},
            "description": "Forces output into JSON: flaky_tests, consistent_failures, rerun_recommendation, counts, summary.",
            "display_name": "Structured Output \u2014 Flaky JSON",
            "documentation": "",
            "edited": false,
            "field_order": [
              "input_value",
              "llm",
              "format_instructions",
              "schema_name",
              "output_schema"
            ],
            "frozen": false,
            "icon": "braces",
            "legacy": false,
            "lf_version": "1.7.0",
            "metadata": {
              "module": "lfx.components.processing.structured_output.StructuredOutputComponent"
            },
            "output_types": [],
            "outputs": [
              {
                "allows_loop": false,
                "cache": true,
                "display_name": "Structured Output",
                "group_outputs": false,
                "method": "build_structured_output",
                "name": "structured_output",
                "selected": "Data",
                "tool_mode": true,
                "types": [
                  "Data"
                ],
                "value": "__UNDEFINED__"
              }
            ],
            "pinned": false,
            "template": {
              "_type": "Component",
              "code": {
                "advanced": true,
                "dynamic": true,
                "fileTypes": [],
                "file_path": "",
                "info": "",
                "list": false,
                "load_from_db": false,
                "multiline": true,
                "name": "code",
                "password": false,
                "placeholder": "",
                "required": true,
                "show": true,
                "title_case": false,
                "type": "code",
                "value": "# Structured Output forces reliability verdict into strict JSON.\n"
              },
              "input_value": {
                "advanced": false,
                "display_name": "Input Message",
                "dynamic": false,
                "info": "Connect the Groq text response.",
                "list": false,
                "load_from_db": false,
                "name": "input_value",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "str",
                "value": "",
                "_input_type": "MessageTextInput"
              },
              "llm": {
                "advanced": false,
                "display_name": "Language Model",
                "dynamic": false,
                "info": "Connect the Groq LanguageModel output.",
                "list": false,
                "load_from_db": false,
                "name": "llm",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "other",
                "value": "",
                "_input_type": "HandleInput"
              },
              "format_instructions": {
                "advanced": true,
                "display_name": "Format Instructions",
                "dynamic": false,
                "info": "",
                "list": false,
                "load_from_db": false,
                "name": "format_instructions",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "str",
                "value": "Extract the reliability verdict into the schema. Return valid JSON only. Empty arrays if none.",
                "_input_type": "MultilineInput",
                "multiline": true
              },
              "schema_name": {
                "advanced": false,
                "display_name": "Schema Name",
                "dynamic": false,
                "info": "",
                "list": false,
                "load_from_db": false,
                "name": "schema_name",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "str",
                "value": "FlakyReport"
              },
              "output_schema": {
                "advanced": false,
                "display_name": "Output Schema",
                "dynamic": false,
                "info": "Reliability fields.",
                "list": true,
                "name": "output_schema",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "table",
                "value": [
                  {
                    "name": "flaky_tests",
                    "description": "Tests with mixed/retry results + flake cause hypothesis",
                    "type": "str",
                    "multiple": true
                  },
                  {
                    "name": "consistent_failures",
                    "description": "Tests failing in both builds + probable root cause",
                    "type": "str",
                    "multiple": true
                  },
                  {
                    "name": "rerun_recommendation",
                    "description": "Which tests to rerun vs file as bugs",
                    "type": "str",
                    "multiple": false
                  },
                  {
                    "name": "flaky_count",
                    "description": "Number of flaky tests",
                    "type": "int",
                    "multiple": false
                  },
                  {
                    "name": "consistent_failure_count",
                    "description": "Number of consistent failures",
                    "type": "int",
                    "multiple": false
                  },
                  {
                    "name": "summary",
                    "description": "One-sentence suite health summary",
                    "type": "str",
                    "multiple": false
                  }
                ],
                "_input_type": "TableInput"
              }
            }
          },
          "type": "StructuredOutput"
        },
        "dragging": false,
        "id": "StructuredOutput-4d899",
        "measured": {
          "height": 320,
          "width": 320
        },
        "position": {
          "x": 1680,
          "y": 270
        },
        "selected": false,
        "type": "genericNode"
      },
      {
        "data": {
          "description": "Displays the final reliability verdict.",
          "display_name": "Chat Output \u2014 Flaky Report",
          "id": "ChatOutput-18ba6",
          "node": {
            "base_classes": [
              "Message"
            ],
            "beta": false,
            "conditional_paths": [],
            "custom_fields": {},
            "description": "Displays the final reliability verdict.",
            "display_name": "Chat Output \u2014 Flaky Report",
            "documentation": "",
            "edited": false,
            "field_order": [
              "input_value",
              "clean_data",
              "data_template",
              "sender",
              "sender_name",
              "session_id",
              "should_store_message"
            ],
            "frozen": false,
            "icon": "MessagesSquare",
            "legacy": false,
            "lf_version": "1.7.0",
            "metadata": {
              "module": "lfx.components.input_output.chat.ChatOutput"
            },
            "output_types": [],
            "outputs": [
              {
                "allows_loop": false,
                "cache": true,
                "display_name": "Message",
                "group_outputs": false,
                "method": "message_response",
                "name": "message",
                "selected": "Message",
                "tool_mode": true,
                "types": [
                  "Message"
                ],
                "value": "__UNDEFINED__"
              }
            ],
            "pinned": false,
            "template": {
              "_type": "Component",
              "code": {
                "advanced": true,
                "dynamic": true,
                "fileTypes": [],
                "file_path": "",
                "info": "",
                "list": false,
                "load_from_db": false,
                "multiline": true,
                "name": "code",
                "password": false,
                "placeholder": "",
                "required": true,
                "show": true,
                "title_case": false,
                "type": "code",
                "value": "# ChatOutput component (Langflow built-in)\n"
              },
              "input_value": {
                "advanced": false,
                "display_name": "Inputs",
                "dynamic": false,
                "info": "The flaky report JSON.",
                "list": false,
                "load_from_db": false,
                "name": "input_value",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "str",
                "value": "",
                "_input_type": "MessageInput"
              },
              "clean_data": {
                "advanced": true,
                "display_name": "Clean Data",
                "dynamic": false,
                "info": "",
                "list": false,
                "load_from_db": false,
                "name": "clean_data",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "bool",
                "value": true
              },
              "data_template": {
                "advanced": true,
                "display_name": "Data Template",
                "dynamic": false,
                "info": "",
                "list": false,
                "load_from_db": false,
                "name": "data_template",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "str",
                "value": "{text}"
              },
              "sender": {
                "advanced": true,
                "display_name": "Sender",
                "dynamic": false,
                "info": "",
                "list": false,
                "load_from_db": false,
                "name": "sender",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "str",
                "value": "Machine"
              },
              "sender_name": {
                "advanced": true,
                "display_name": "Sender Name",
                "dynamic": false,
                "info": "",
                "list": false,
                "load_from_db": false,
                "name": "sender_name",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "str",
                "value": "AI"
              },
              "session_id": {
                "advanced": true,
                "display_name": "Session Id",
                "dynamic": false,
                "info": "",
                "list": false,
                "load_from_db": false,
                "name": "session_id",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "str",
                "value": ""
              },
              "should_store_message": {
                "advanced": true,
                "display_name": "Should Store Message",
                "dynamic": false,
                "info": "",
                "list": false,
                "load_from_db": false,
                "name": "should_store_message",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "bool",
                "value": true
              }
            }
          },
          "type": "ChatOutput"
        },
        "dragging": false,
        "id": "ChatOutput-18ba6",
        "measured": {
          "height": 320,
          "width": 320
        },
        "position": {
          "x": 2080,
          "y": 270
        },
        "selected": false,
        "type": "genericNode"
      }
    ],
    "viewport": {
      "x": 0,
      "y": 0,
      "zoom": 0.45
    }
  },
  "description": "Compares two Playwright runs, flags flaky tests (mixed/retry results) vs consistent failures (failed in both), and recommends reruns.",
  "endpoint_name": "flaky_analyzer",
  "id": "6bda2e8b-1a05-4bc1-868f-38dfb03f7213",
  "is_component": false,
  "last_tested_version": "1.7.0",
  "name": "Flaky Test Analyzer",
  "tags": [
    "qa",
    "playwright",
    "flaky",
    "reliability"
  ]
}