{
  "data": {
    "edges": [
      {
        "animated": false,
        "className": "",
        "data": {
          "sourceHandle": {
            "dataType": "ChatInput",
            "id": "ChatInput-f7d38",
            "name": "message",
            "output_types": [
              "Message"
            ]
          },
          "targetHandle": {
            "fieldName": "curls",
            "id": "Prompt-14a3a",
            "inputTypes": [
              "Message"
            ],
            "type": "str"
          }
        },
        "id": "reactflow__edge-ChatInput-f7d38{\u0153dataType\u0153:\u0153ChatInput\u0153,\u0153id\u0153:\u0153ChatInput-f7d38\u0153,\u0153name\u0153:\u0153message\u0153,\u0153output_types\u0153:[\u0153Message\u0153]}-Prompt-14a3a{\u0153fieldName\u0153:\u0153curls\u0153,\u0153id\u0153:\u0153Prompt-14a3a\u0153,\u0153inputTypes\u0153:[\u0153Message\u0153],\u0153type\u0153:\u0153str\u0153}",
        "selected": false,
        "source": "ChatInput-f7d38",
        "sourceHandle": "{\u0153dataType\u0153: \u0153ChatInput\u0153, \u0153id\u0153: \u0153ChatInput-f7d38\u0153, \u0153name\u0153: \u0153message\u0153, \u0153output_types\u0153: [\u0153Message\u0153]}",
        "target": "Prompt-14a3a",
        "targetHandle": "{\u0153fieldName\u0153: \u0153curls\u0153, \u0153id\u0153: \u0153Prompt-14a3a\u0153, \u0153inputTypes\u0153: [\u0153Message\u0153], \u0153type\u0153: \u0153str\u0153}"
      },
      {
        "animated": false,
        "className": "",
        "data": {
          "sourceHandle": {
            "dataType": "Prompt",
            "id": "Prompt-14a3a",
            "name": "prompt",
            "output_types": [
              "Message"
            ]
          },
          "targetHandle": {
            "fieldName": "input_value",
            "id": "GroqModel-8e637",
            "inputTypes": [
              "Message"
            ],
            "type": "str"
          }
        },
        "id": "reactflow__edge-Prompt-14a3a{\u0153dataType\u0153:\u0153Prompt\u0153,\u0153id\u0153:\u0153Prompt-14a3a\u0153,\u0153name\u0153:\u0153prompt\u0153,\u0153output_types\u0153:[\u0153Message\u0153]}-GroqModel-8e637{\u0153fieldName\u0153:\u0153input_value\u0153,\u0153id\u0153:\u0153GroqModel-8e637\u0153,\u0153inputTypes\u0153:[\u0153Message\u0153],\u0153type\u0153:\u0153str\u0153}",
        "selected": false,
        "source": "Prompt-14a3a",
        "sourceHandle": "{\u0153dataType\u0153: \u0153Prompt\u0153, \u0153id\u0153: \u0153Prompt-14a3a\u0153, \u0153name\u0153: \u0153prompt\u0153, \u0153output_types\u0153: [\u0153Message\u0153]}",
        "target": "GroqModel-8e637",
        "targetHandle": "{\u0153fieldName\u0153: \u0153input_value\u0153, \u0153id\u0153: \u0153GroqModel-8e637\u0153, \u0153inputTypes\u0153: [\u0153Message\u0153], \u0153type\u0153: \u0153str\u0153}"
      },
      {
        "animated": false,
        "className": "",
        "data": {
          "sourceHandle": {
            "dataType": "GroqModel",
            "id": "GroqModel-8e637",
            "name": "text_output",
            "output_types": [
              "Message"
            ]
          },
          "targetHandle": {
            "fieldName": "input_value",
            "id": "StructuredOutput-2076c",
            "inputTypes": [
              "Message"
            ],
            "type": "str"
          }
        },
        "id": "reactflow__edge-GroqModel-8e637{\u0153dataType\u0153:\u0153GroqModel\u0153,\u0153id\u0153:\u0153GroqModel-8e637\u0153,\u0153name\u0153:\u0153text_output\u0153,\u0153output_types\u0153:[\u0153Message\u0153]}-StructuredOutput-2076c{\u0153fieldName\u0153:\u0153input_value\u0153,\u0153id\u0153:\u0153StructuredOutput-2076c\u0153,\u0153inputTypes\u0153:[\u0153Message\u0153],\u0153type\u0153:\u0153str\u0153}",
        "selected": false,
        "source": "GroqModel-8e637",
        "sourceHandle": "{\u0153dataType\u0153: \u0153GroqModel\u0153, \u0153id\u0153: \u0153GroqModel-8e637\u0153, \u0153name\u0153: \u0153text_output\u0153, \u0153output_types\u0153: [\u0153Message\u0153]}",
        "target": "StructuredOutput-2076c",
        "targetHandle": "{\u0153fieldName\u0153: \u0153input_value\u0153, \u0153id\u0153: \u0153StructuredOutput-2076c\u0153, \u0153inputTypes\u0153: [\u0153Message\u0153], \u0153type\u0153: \u0153str\u0153}"
      },
      {
        "animated": false,
        "className": "",
        "data": {
          "sourceHandle": {
            "dataType": "GroqModel",
            "id": "GroqModel-8e637",
            "name": "model_output",
            "output_types": [
              "LanguageModel"
            ]
          },
          "targetHandle": {
            "fieldName": "llm",
            "id": "StructuredOutput-2076c",
            "inputTypes": [
              "LanguageModel"
            ],
            "type": "other"
          }
        },
        "id": "reactflow__edge-GroqModel-8e637{\u0153dataType\u0153:\u0153GroqModel\u0153,\u0153id\u0153:\u0153GroqModel-8e637\u0153,\u0153name\u0153:\u0153model_output\u0153,\u0153output_types\u0153:[\u0153LanguageModel\u0153]}-StructuredOutput-2076c{\u0153fieldName\u0153:\u0153llm\u0153,\u0153id\u0153:\u0153StructuredOutput-2076c\u0153,\u0153inputTypes\u0153:[\u0153LanguageModel\u0153],\u0153type\u0153:\u0153other\u0153}",
        "selected": false,
        "source": "GroqModel-8e637",
        "sourceHandle": "{\u0153dataType\u0153: \u0153GroqModel\u0153, \u0153id\u0153: \u0153GroqModel-8e637\u0153, \u0153name\u0153: \u0153model_output\u0153, \u0153output_types\u0153: [\u0153LanguageModel\u0153]}",
        "target": "StructuredOutput-2076c",
        "targetHandle": "{\u0153fieldName\u0153: \u0153llm\u0153, \u0153id\u0153: \u0153StructuredOutput-2076c\u0153, \u0153inputTypes\u0153: [\u0153LanguageModel\u0153], \u0153type\u0153: \u0153other\u0153}"
      },
      {
        "animated": false,
        "className": "",
        "data": {
          "sourceHandle": {
            "dataType": "StructuredOutput",
            "id": "StructuredOutput-2076c",
            "name": "structured_output",
            "output_types": [
              "Data"
            ]
          },
          "targetHandle": {
            "fieldName": "request_plan",
            "id": "APIContractValidator-836da",
            "inputTypes": [
              "Data"
            ],
            "type": "other"
          }
        },
        "id": "reactflow__edge-StructuredOutput-2076c{\u0153dataType\u0153:\u0153StructuredOutput\u0153,\u0153id\u0153:\u0153StructuredOutput-2076c\u0153,\u0153name\u0153:\u0153structured_output\u0153,\u0153output_types\u0153:[\u0153Data\u0153]}-APIContractValidator-836da{\u0153fieldName\u0153:\u0153request_plan\u0153,\u0153id\u0153:\u0153APIContractValidator-836da\u0153,\u0153inputTypes\u0153:[\u0153Data\u0153],\u0153type\u0153:\u0153other\u0153}",
        "selected": false,
        "source": "StructuredOutput-2076c",
        "sourceHandle": "{\u0153dataType\u0153: \u0153StructuredOutput\u0153, \u0153id\u0153: \u0153StructuredOutput-2076c\u0153, \u0153name\u0153: \u0153structured_output\u0153, \u0153output_types\u0153: [\u0153Data\u0153]}",
        "target": "APIContractValidator-836da",
        "targetHandle": "{\u0153fieldName\u0153: \u0153request_plan\u0153, \u0153id\u0153: \u0153APIContractValidator-836da\u0153, \u0153inputTypes\u0153: [\u0153Data\u0153], \u0153type\u0153: \u0153other\u0153}"
      },
      {
        "animated": false,
        "className": "",
        "data": {
          "sourceHandle": {
            "dataType": "APIContractValidator",
            "id": "APIContractValidator-836da",
            "name": "report",
            "output_types": [
              "Data"
            ]
          },
          "targetHandle": {
            "fieldName": "report",
            "id": "Prompt-32192",
            "inputTypes": [
              "Message"
            ],
            "type": "str"
          }
        },
        "id": "reactflow__edge-APIContractValidator-836da{\u0153dataType\u0153:\u0153APIContractValidator\u0153,\u0153id\u0153:\u0153APIContractValidator-836da\u0153,\u0153name\u0153:\u0153report\u0153,\u0153output_types\u0153:[\u0153Data\u0153]}-Prompt-32192{\u0153fieldName\u0153:\u0153report\u0153,\u0153id\u0153:\u0153Prompt-32192\u0153,\u0153inputTypes\u0153:[\u0153Message\u0153],\u0153type\u0153:\u0153str\u0153}",
        "selected": false,
        "source": "APIContractValidator-836da",
        "sourceHandle": "{\u0153dataType\u0153: \u0153APIContractValidator\u0153, \u0153id\u0153: \u0153APIContractValidator-836da\u0153, \u0153name\u0153: \u0153report\u0153, \u0153output_types\u0153: [\u0153Data\u0153]}",
        "target": "Prompt-32192",
        "targetHandle": "{\u0153fieldName\u0153: \u0153report\u0153, \u0153id\u0153: \u0153Prompt-32192\u0153, \u0153inputTypes\u0153: [\u0153Message\u0153], \u0153type\u0153: \u0153str\u0153}"
      },
      {
        "animated": false,
        "className": "",
        "data": {
          "sourceHandle": {
            "dataType": "Prompt",
            "id": "Prompt-32192",
            "name": "prompt",
            "output_types": [
              "Message"
            ]
          },
          "targetHandle": {
            "fieldName": "input_value",
            "id": "GroqModel-ce792",
            "inputTypes": [
              "Message"
            ],
            "type": "str"
          }
        },
        "id": "reactflow__edge-Prompt-32192{\u0153dataType\u0153:\u0153Prompt\u0153,\u0153id\u0153:\u0153Prompt-32192\u0153,\u0153name\u0153:\u0153prompt\u0153,\u0153output_types\u0153:[\u0153Message\u0153]}-GroqModel-ce792{\u0153fieldName\u0153:\u0153input_value\u0153,\u0153id\u0153:\u0153GroqModel-ce792\u0153,\u0153inputTypes\u0153:[\u0153Message\u0153],\u0153type\u0153:\u0153str\u0153}",
        "selected": false,
        "source": "Prompt-32192",
        "sourceHandle": "{\u0153dataType\u0153: \u0153Prompt\u0153, \u0153id\u0153: \u0153Prompt-32192\u0153, \u0153name\u0153: \u0153prompt\u0153, \u0153output_types\u0153: [\u0153Message\u0153]}",
        "target": "GroqModel-ce792",
        "targetHandle": "{\u0153fieldName\u0153: \u0153input_value\u0153, \u0153id\u0153: \u0153GroqModel-ce792\u0153, \u0153inputTypes\u0153: [\u0153Message\u0153], \u0153type\u0153: \u0153str\u0153}"
      },
      {
        "animated": false,
        "className": "",
        "data": {
          "sourceHandle": {
            "dataType": "GroqModel",
            "id": "GroqModel-ce792",
            "name": "text_output",
            "output_types": [
              "Message"
            ]
          },
          "targetHandle": {
            "fieldName": "input_value",
            "id": "StructuredOutput-a6ff8",
            "inputTypes": [
              "Message"
            ],
            "type": "str"
          }
        },
        "id": "reactflow__edge-GroqModel-ce792{\u0153dataType\u0153:\u0153GroqModel\u0153,\u0153id\u0153:\u0153GroqModel-ce792\u0153,\u0153name\u0153:\u0153text_output\u0153,\u0153output_types\u0153:[\u0153Message\u0153]}-StructuredOutput-a6ff8{\u0153fieldName\u0153:\u0153input_value\u0153,\u0153id\u0153:\u0153StructuredOutput-a6ff8\u0153,\u0153inputTypes\u0153:[\u0153Message\u0153],\u0153type\u0153:\u0153str\u0153}",
        "selected": false,
        "source": "GroqModel-ce792",
        "sourceHandle": "{\u0153dataType\u0153: \u0153GroqModel\u0153, \u0153id\u0153: \u0153GroqModel-ce792\u0153, \u0153name\u0153: \u0153text_output\u0153, \u0153output_types\u0153: [\u0153Message\u0153]}",
        "target": "StructuredOutput-a6ff8",
        "targetHandle": "{\u0153fieldName\u0153: \u0153input_value\u0153, \u0153id\u0153: \u0153StructuredOutput-a6ff8\u0153, \u0153inputTypes\u0153: [\u0153Message\u0153], \u0153type\u0153: \u0153str\u0153}"
      },
      {
        "animated": false,
        "className": "",
        "data": {
          "sourceHandle": {
            "dataType": "GroqModel",
            "id": "GroqModel-ce792",
            "name": "model_output",
            "output_types": [
              "LanguageModel"
            ]
          },
          "targetHandle": {
            "fieldName": "llm",
            "id": "StructuredOutput-a6ff8",
            "inputTypes": [
              "LanguageModel"
            ],
            "type": "other"
          }
        },
        "id": "reactflow__edge-GroqModel-ce792{\u0153dataType\u0153:\u0153GroqModel\u0153,\u0153id\u0153:\u0153GroqModel-ce792\u0153,\u0153name\u0153:\u0153model_output\u0153,\u0153output_types\u0153:[\u0153LanguageModel\u0153]}-StructuredOutput-a6ff8{\u0153fieldName\u0153:\u0153llm\u0153,\u0153id\u0153:\u0153StructuredOutput-a6ff8\u0153,\u0153inputTypes\u0153:[\u0153LanguageModel\u0153],\u0153type\u0153:\u0153other\u0153}",
        "selected": false,
        "source": "GroqModel-ce792",
        "sourceHandle": "{\u0153dataType\u0153: \u0153GroqModel\u0153, \u0153id\u0153: \u0153GroqModel-ce792\u0153, \u0153name\u0153: \u0153model_output\u0153, \u0153output_types\u0153: [\u0153LanguageModel\u0153]}",
        "target": "StructuredOutput-a6ff8",
        "targetHandle": "{\u0153fieldName\u0153: \u0153llm\u0153, \u0153id\u0153: \u0153StructuredOutput-a6ff8\u0153, \u0153inputTypes\u0153: [\u0153LanguageModel\u0153], \u0153type\u0153: \u0153other\u0153}"
      },
      {
        "animated": false,
        "className": "",
        "data": {
          "sourceHandle": {
            "dataType": "StructuredOutput",
            "id": "StructuredOutput-a6ff8",
            "name": "structured_output",
            "output_types": [
              "Data"
            ]
          },
          "targetHandle": {
            "fieldName": "input_value",
            "id": "ChatOutput-d5686",
            "inputTypes": [
              "Message"
            ],
            "type": "str"
          }
        },
        "id": "reactflow__edge-StructuredOutput-a6ff8{\u0153dataType\u0153:\u0153StructuredOutput\u0153,\u0153id\u0153:\u0153StructuredOutput-a6ff8\u0153,\u0153name\u0153:\u0153structured_output\u0153,\u0153output_types\u0153:[\u0153Data\u0153]}-ChatOutput-d5686{\u0153fieldName\u0153:\u0153input_value\u0153,\u0153id\u0153:\u0153ChatOutput-d5686\u0153,\u0153inputTypes\u0153:[\u0153Message\u0153],\u0153type\u0153:\u0153str\u0153}",
        "selected": false,
        "source": "StructuredOutput-a6ff8",
        "sourceHandle": "{\u0153dataType\u0153: \u0153StructuredOutput\u0153, \u0153id\u0153: \u0153StructuredOutput-a6ff8\u0153, \u0153name\u0153: \u0153structured_output\u0153, \u0153output_types\u0153: [\u0153Data\u0153]}",
        "target": "ChatOutput-d5686",
        "targetHandle": "{\u0153fieldName\u0153: \u0153input_value\u0153, \u0153id\u0153: \u0153ChatOutput-d5686\u0153, \u0153inputTypes\u0153: [\u0153Message\u0153], \u0153type\u0153: \u0153str\u0153}"
      }
    ],
    "nodes": [
      {
        "data": {
          "description": "The user pastes the cURL requests to validate.",
          "display_name": "Chat Input \u2014 cURL Commands",
          "id": "ChatInput-f7d38",
          "node": {
            "base_classes": [
              "Message"
            ],
            "beta": false,
            "conditional_paths": [],
            "custom_fields": {},
            "description": "The user pastes the cURL requests to validate.",
            "display_name": "Chat Input \u2014 cURL Commands",
            "documentation": "",
            "edited": false,
            "field_order": [
              "input_value",
              "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.ChatInput"
            },
            "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": "# ChatInput (Langflow built-in)\n"
              },
              "input_value": {
                "advanced": false,
                "display_name": "cURL Commands",
                "dynamic": false,
                "info": "Paste the cURL requests to validate. The agent runs auth first, then the rest in order.",
                "list": false,
                "load_from_db": false,
                "name": "input_value",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "str",
                "value": "# Paste your cURL commands here, one per line.\n# Example (Restful Booker):\ncurl -X POST https://restful-booker.herokuapp.com/auth -H 'Content-Type: application/json' -d '{\"username\":\"admin\",\"password\":\"password123\"}'\ncurl -X POST https://restful-booker.herokuapp.com/booking -H 'Content-Type: application/json' -H 'Accept: application/json' -d '{\"firstname\":\"Jim\",\"lastname\":\"Brown\",\"totalprice\":111,\"depositpaid\":true,\"bookingdates\":{\"checkin\":\"2025-01-01\",\"checkout\":\"2025-01-05\"},\"additionalneeds\":\"Breakfast\"}'\ncurl -X GET https://restful-booker.herokuapp.com/booking/1 -H 'Accept: application/json'\ncurl -X PUT https://restful-booker.herokuapp.com/booking/1 -H 'Content-Type: application/json' -H 'Accept: application/json' -d '{\"firstname\":\"James\",\"lastname\":\"Brown\",\"totalprice\":200,\"depositpaid\":false,\"bookingdates\":{\"checkin\":\"2025-02-01\",\"checkout\":\"2025-02-10\"},\"additionalneeds\":\"Lunch\"}'\ncurl -X DELETE https://restful-booker.herokuapp.com/booking/1",
                "_input_type": "MultilineInput",
                "multiline": true
              },
              "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": "User"
              },
              "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": "User"
              },
              "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": "ChatInput"
        },
        "dragging": false,
        "id": "ChatInput-f7d38",
        "measured": {
          "height": 340,
          "width": 320
        },
        "position": {
          "x": 60,
          "y": 300
        },
        "selected": false,
        "type": "genericNode"
      },
      {
        "data": {
          "description": "Instructs the model to turn cURLs into a structured request plan with per-call contract expectations.",
          "display_name": "Prompt Template \u2014 cURL Parser",
          "id": "Prompt-14a3a",
          "node": {
            "base_classes": [
              "Message"
            ],
            "beta": false,
            "conditional_paths": [],
            "custom_fields": {
              "template": [
                "curls"
              ]
            },
            "description": "Instructs the model to turn cURLs into a structured request plan with per-call contract expectations.",
            "display_name": "Prompt Template \u2014 cURL Parser",
            "documentation": "",
            "edited": false,
            "field_order": [
              "template",
              "curls",
              "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": "cURL \u2192 request-plan instructions. {curls} is filled by Chat Input.",
                "list": false,
                "name": "template",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "prompt",
                "value": "You convert raw cURL commands into a clean JSON request plan for an API contract test runner.\n\nCURL COMMANDS:\n{curls}\n\nFor EACH cURL, extract: name (short label), method (GET/POST/PUT/PATCH/DELETE), url, headers (object), body (object or null), expects (the contract: an object with 'status' = expected HTTP status code, and 'schema_kind' = one of auth | booking | create | none).\n\nRules:\n- The /auth call expects status 200 and schema_kind 'auth'.\n- POST /booking expects status 200 and schema_kind 'create' (response is wrapped: bookingid + booking).\n- GET/PUT/PATCH /booking/{id} expect status 200 and schema_kind 'booking'.\n- DELETE /booking/{id} expects status 201 and schema_kind 'none'.\n- Do NOT add a Cookie/token header yourself \u2014 the runner injects the auth token automatically.\nReturn ONLY the structured plan. Do not execute anything.",
                "_input_type": "PromptInput"
              },
              "curls": {
                "advanced": false,
                "display_name": "curls",
                "dynamic": false,
                "info": "Connect Chat Input here.",
                "list": false,
                "load_from_db": false,
                "name": "curls",
                "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-14a3a",
        "measured": {
          "height": 340,
          "width": 320
        },
        "position": {
          "x": 440,
          "y": 120
        },
        "selected": false,
        "type": "genericNode"
      },
      {
        "data": {
          "description": "Parses the messy cURLs into a clean structured plan.",
          "display_name": "Groq Model \u2014 Parse cURLs",
          "id": "GroqModel-8e637",
          "node": {
            "base_classes": [
              "Message",
              "LanguageModel"
            ],
            "beta": false,
            "conditional_paths": [],
            "custom_fields": {},
            "description": "Parses the messy cURLs into a clean structured plan.",
            "display_name": "Groq Model \u2014 Parse cURLs",
            "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 component. Runs openai/gpt-oss-120b via the OpenAI-compatible endpoint.\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": "",
                "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-8e637",
        "measured": {
          "height": 340,
          "width": 320
        },
        "position": {
          "x": 840,
          "y": 120
        },
        "selected": false,
        "type": "genericNode"
      },
      {
        "data": {
          "description": "Turns the parsed cURLs into a clean JSON request plan the runner can execute.",
          "display_name": "Structured Output \u2014 Request Plan",
          "id": "StructuredOutput-2076c",
          "node": {
            "base_classes": [
              "Data"
            ],
            "beta": false,
            "conditional_paths": [],
            "custom_fields": {},
            "description": "Turns the parsed cURLs into a clean JSON request plan the runner can execute.",
            "display_name": "Structured Output \u2014 Request Plan",
            "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: emit the request plan as JSON.\n"
              },
              "input_value": {
                "advanced": false,
                "display_name": "Input Message",
                "dynamic": false,
                "info": "Connect the parse 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 parse 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 ordered request plan. Return valid JSON only. Each request is a JSON object with name, method, url, headers, body, expects.",
                "_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": "RequestPlan"
              },
              "output_schema": {
                "advanced": false,
                "display_name": "Output Schema",
                "dynamic": false,
                "info": "Request plan.",
                "list": true,
                "name": "output_schema",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "table",
                "value": [
                  {
                    "name": "requests",
                    "description": "Ordered list of requests: each has name, method, url, headers, body, expects{status,schema_kind}",
                    "type": "str",
                    "multiple": true
                  }
                ],
                "_input_type": "TableInput"
              }
            }
          },
          "type": "StructuredOutput"
        },
        "dragging": false,
        "id": "StructuredOutput-2076c",
        "measured": {
          "height": 340,
          "width": 320
        },
        "position": {
          "x": 1240,
          "y": 120
        },
        "selected": false,
        "type": "genericNode"
      },
      {
        "data": {
          "description": "Authenticates, threads the token through, fires every request for real, and validates each response with jsonschema.",
          "display_name": "API Contract Validator \u2014 Real Calls + Schema Check",
          "id": "APIContractValidator-836da",
          "node": {
            "base_classes": [
              "Data"
            ],
            "beta": false,
            "conditional_paths": [],
            "custom_fields": {},
            "description": "Authenticates, threads the token through, fires every request for real, and validates each response with jsonschema.",
            "display_name": "API Contract Validator \u2014 Real Calls + Schema Check",
            "documentation": "",
            "edited": true,
            "field_order": [
              "request_plan",
              "base_url",
              "username",
              "password",
              "timeout"
            ],
            "frozen": false,
            "icon": "ShieldCheck",
            "legacy": false,
            "lf_version": "1.7.0",
            "metadata": {
              "module": "custom.api_contract_validator.APIContractValidator"
            },
            "output_types": [],
            "outputs": [
              {
                "allows_loop": false,
                "cache": true,
                "display_name": "Validation Report",
                "group_outputs": false,
                "method": "run_validation",
                "name": "report",
                "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": "from lfx.custom.custom_component.component import Component\nfrom lfx.io import DataInput, MultilineInput, MessageTextInput, SecretStrInput, IntInput, Output\nfrom lfx.schema.data import Data\nimport json\nimport re\nimport requests\n\ntry:\n    import jsonschema\n    HAS_JSONSCHEMA = True\nexcept ImportError:\n    HAS_JSONSCHEMA = False\n\nDATE = {\"type\": \"string\", \"pattern\": r\"^\\d{4}-\\d{2}-\\d{2}$\"}\nBOOKING = {\n    \"type\": \"object\",\n    \"required\": [\"firstname\", \"lastname\", \"totalprice\", \"depositpaid\", \"bookingdates\"],\n    \"properties\": {\n        \"firstname\": {\"type\": \"string\"},\n        \"lastname\": {\"type\": \"string\"},\n        \"totalprice\": {\"type\": \"integer\"},\n        \"depositpaid\": {\"type\": \"boolean\"},\n        \"bookingdates\": {\n            \"type\": \"object\",\n            \"required\": [\"checkin\", \"checkout\"],\n            \"properties\": {\"checkin\": DATE, \"checkout\": DATE},\n        },\n        \"additionalneeds\": {\"type\": \"string\"},\n    },\n}\nSCHEMAS = {\n    \"auth\": {\"type\": \"object\", \"required\": [\"token\"], \"properties\": {\"token\": {\"type\": \"string\"}}},\n    \"booking\": BOOKING,\n    \"create\": {\n        \"type\": \"object\",\n        \"required\": [\"bookingid\", \"booking\"],\n        \"properties\": {\"bookingid\": {\"type\": \"integer\"}, \"booking\": BOOKING},\n    },\n    \"none\": None,\n}\n\n\nclass APIContractValidator(Component):\n    display_name = \"API Contract Validator\"\n    description = \"Runs the real auth -> token -> chained API calls and validates each response against a JSON Schema.\"\n    icon = \"ShieldCheck\"\n    name = \"APIContractValidator\"\n\n    inputs = [\n        DataInput(name=\"request_plan\", display_name=\"Request Plan\",\n                  info=\"Structured request plan from the Structured Output node.\"),\n        MultilineInput(name=\"base_url\", display_name=\"Base URL\",\n                       value=\"https://restful-booker.herokuapp.com\"),\n        MessageTextInput(name=\"username\", display_name=\"Auth Username\", value=\"admin\"),\n        SecretStrInput(name=\"password\", display_name=\"Auth Password\", value=\"password123\"),\n        IntInput(name=\"timeout\", display_name=\"Timeout (s)\", value=30),\n    ]\n    outputs = [Output(name=\"report\", display_name=\"Validation Report\", method=\"run_validation\")]\n\n    def _plan(self):\n        \"\"\"Normalise the incoming plan into a list of request dicts.\"\"\"\n        raw = self.request_plan\n        data = getattr(raw, \"data\", raw)\n        if isinstance(data, dict):\n            data = data.get(\"requests\", data)\n        if isinstance(data, str):\n            data = json.loads(data)\n        reqs = []\n        for item in (data if isinstance(data, list) else [data]):\n            if isinstance(item, str):\n                item = json.loads(item)\n            reqs.append(item)\n        return reqs\n\n    def _validate(self, body, kind):\n        schema = SCHEMAS.get(kind)\n        if schema is None:\n            return True, []\n        if not HAS_JSONSCHEMA:\n            return True, [\"jsonschema not installed - schema check skipped\"]\n        v = jsonschema.Draft7Validator(schema)\n        errors = [f\"{'/'.join(map(str, e.path))}: {e.message}\" for e in v.iter_errors(body)]\n        return (len(errors) == 0), errors\n\n    def run_validation(self) -> Data:\n        session = requests.Session()\n        results = []\n        token = None\n\n        # 1) AUTH first - get the token. Restful Booker returns 200 even on bad creds,\n        #    so we assert the token is actually present, not just the status.\n        try:\n            auth = session.post(\n                f\"{self.base_url}/auth\",\n                json={\"username\": self.username, \"password\": self.password},\n                timeout=self.timeout,\n            )\n            token = auth.json().get(\"token\")\n            results.append({\n                \"name\": \"AUTH POST /auth\", \"method\": \"POST\",\n                \"expected_status\": 200, \"actual_status\": auth.status_code,\n                \"status_ok\": auth.status_code == 200,\n                \"schema_ok\": token is not None,\n                \"errors\": [] if token else [\"No token in auth response (bad credentials?)\"],\n                \"passed\": auth.status_code == 200 and token is not None,\n            })\n        except Exception as e:\n            results.append({\"name\": \"AUTH POST /auth\", \"passed\": False, \"errors\": [str(e)]})\n\n        # 2) Run the rest of the plan in order, injecting Cookie: token=<token> on writes.\n        for req in self._plan():\n            name = req.get(\"name\", req.get(\"method\", \"?\"))\n            method = (req.get(\"method\") or \"GET\").upper()\n            url = req.get(\"url\", \"\")\n            if url.startswith(\"/\"):\n                url = self.base_url + url\n            # skip a /auth entry in the plan - we already authenticated above\n            if \"/auth\" in url:\n                continue\n            headers = dict(req.get(\"headers\") or {})\n            headers.setdefault(\"Accept\", \"application/json\")\n            if method in (\"PUT\", \"PATCH\", \"DELETE\") and token:\n                headers[\"Cookie\"] = f\"token={token}\"\n            body = req.get(\"body\")\n            expects = req.get(\"expects\") or {}\n            exp_status = expects.get(\"status\", 200)\n            kind = expects.get(\"schema_kind\", \"none\")\n            try:\n                resp = session.request(method, url, headers=headers,\n                                       json=body if body else None, timeout=self.timeout)\n                try:\n                    parsed = resp.json()\n                except Exception:\n                    parsed = {}\n                schema_ok, errors = self._validate(parsed, kind)\n                status_ok = resp.status_code == exp_status\n                results.append({\n                    \"name\": name, \"method\": method, \"url\": url,\n                    \"expected_status\": exp_status, \"actual_status\": resp.status_code,\n                    \"status_ok\": status_ok, \"schema_ok\": schema_ok, \"errors\": errors,\n                    \"passed\": status_ok and schema_ok,\n                })\n            except Exception as e:\n                results.append({\"name\": name, \"method\": method, \"url\": url,\n                                \"passed\": False, \"errors\": [str(e)]})\n\n        passed = sum(1 for r in results if r.get(\"passed\"))\n        report = {\n            \"overall_passed\": passed == len(results),\n            \"total\": len(results), \"passed_count\": passed,\n            \"failed_count\": len(results) - passed,\n            \"results\": results,\n        }\n        self.status = json.dumps(report, indent=2)\n        return Data(data=report)\n"
              },
              "request_plan": {
                "advanced": false,
                "display_name": "Request Plan",
                "dynamic": false,
                "info": "Connect the request-plan Structured Output here.",
                "list": false,
                "load_from_db": false,
                "name": "request_plan",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "other",
                "value": "",
                "_input_type": "DataInput"
              },
              "base_url": {
                "advanced": false,
                "display_name": "Base URL",
                "dynamic": false,
                "info": "",
                "list": false,
                "load_from_db": false,
                "name": "base_url",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "str",
                "value": "https://restful-booker.herokuapp.com",
                "_input_type": "MultilineInput",
                "multiline": true
              },
              "username": {
                "advanced": false,
                "display_name": "Auth Username",
                "dynamic": false,
                "info": "",
                "list": false,
                "load_from_db": false,
                "name": "username",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "str",
                "value": "admin",
                "_input_type": "MessageTextInput"
              },
              "password": {
                "advanced": false,
                "display_name": "Auth Password",
                "dynamic": false,
                "info": "Restful Booker default: password123.",
                "list": false,
                "load_from_db": true,
                "name": "password",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "str",
                "value": "password123",
                "_input_type": "SecretStrInput",
                "password": true
              },
              "timeout": {
                "advanced": false,
                "display_name": "Timeout (s)",
                "dynamic": false,
                "info": "",
                "list": false,
                "load_from_db": false,
                "name": "timeout",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "int",
                "value": 30,
                "_input_type": "IntInput"
              }
            }
          },
          "type": "APIContractValidator"
        },
        "dragging": false,
        "id": "APIContractValidator-836da",
        "measured": {
          "height": 340,
          "width": 320
        },
        "position": {
          "x": 1640,
          "y": 300
        },
        "selected": false,
        "type": "genericNode"
      },
      {
        "data": {
          "description": "Turns the raw validation Data into a readable contract report. Cannot overturn the real verdicts.",
          "display_name": "Prompt Template \u2014 Report Writer",
          "id": "Prompt-32192",
          "node": {
            "base_classes": [
              "Message"
            ],
            "beta": false,
            "conditional_paths": [],
            "custom_fields": {
              "template": [
                "report"
              ]
            },
            "description": "Turns the raw validation Data into a readable contract report. Cannot overturn the real verdicts.",
            "display_name": "Prompt Template \u2014 Report Writer",
            "documentation": "",
            "edited": false,
            "field_order": [
              "template",
              "report",
              "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": "Reporter instructions. {report} is the validator's JSON output.",
                "list": false,
                "name": "template",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "prompt",
                "value": "You are an API contract test reporter. You are given a machine-produced validation report (real HTTP results + JSON Schema checks). Do NOT change any pass/fail verdict \u2014 the runner already decided those by making real calls.\n\nVALIDATION REPORT:\n{report}\n\nProduce a clear summary:\n1. OVERALL - passed or failed, with the passed/total count.\n2. PER_CALL - for each call: name, expected vs actual status, and if it failed, a plain-English reason from the errors (status mismatch or which schema field was wrong).\n3. NEXT_STEPS - what a QA engineer should do about the failures.\nBase everything only on the report. Never invent a passing result.",
                "_input_type": "PromptInput"
              },
              "report": {
                "advanced": false,
                "display_name": "report",
                "dynamic": false,
                "info": "Connect the validator output here.",
                "list": false,
                "load_from_db": false,
                "name": "report",
                "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-32192",
        "measured": {
          "height": 340,
          "width": 320
        },
        "position": {
          "x": 2040,
          "y": 120
        },
        "selected": false,
        "type": "genericNode"
      },
      {
        "data": {
          "description": "Explains the failures in plain English.",
          "display_name": "Groq Model \u2014 Report Writer",
          "id": "GroqModel-ce792",
          "node": {
            "base_classes": [
              "Message",
              "LanguageModel"
            ],
            "beta": false,
            "conditional_paths": [],
            "custom_fields": {},
            "description": "Explains the failures in plain English.",
            "display_name": "Groq Model \u2014 Report Writer",
            "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 component. Runs openai/gpt-oss-120b via the OpenAI-compatible endpoint.\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": "",
                "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-ce792",
        "measured": {
          "height": 340,
          "width": 320
        },
        "position": {
          "x": 2440,
          "y": 120
        },
        "selected": false,
        "type": "genericNode"
      },
      {
        "data": {
          "description": "Forces the final report into JSON: overall_passed, counts, per_call, next_steps.",
          "display_name": "Structured Output \u2014 Contract Report",
          "id": "StructuredOutput-a6ff8",
          "node": {
            "base_classes": [
              "Data"
            ],
            "beta": false,
            "conditional_paths": [],
            "custom_fields": {},
            "description": "Forces the final report into JSON: overall_passed, counts, per_call, next_steps.",
            "display_name": "Structured Output \u2014 Contract Report",
            "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: final contract report JSON.\n"
              },
              "input_value": {
                "advanced": false,
                "display_name": "Input Message",
                "dynamic": false,
                "info": "Connect the report 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 report 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 contract report into the schema. Return valid JSON only. Preserve the runner's verdicts exactly.",
                "_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": "ContractReport"
              },
              "output_schema": {
                "advanced": false,
                "display_name": "Output Schema",
                "dynamic": false,
                "info": "Final report.",
                "list": true,
                "name": "output_schema",
                "placeholder": "",
                "required": false,
                "show": true,
                "title_case": false,
                "type": "table",
                "value": [
                  {
                    "name": "overall_passed",
                    "description": "true if all calls passed",
                    "type": "bool",
                    "multiple": false
                  },
                  {
                    "name": "passed_count",
                    "description": "number of calls that passed",
                    "type": "int",
                    "multiple": false
                  },
                  {
                    "name": "total",
                    "description": "total number of calls",
                    "type": "int",
                    "multiple": false
                  },
                  {
                    "name": "per_call",
                    "description": "per-call result: name, expected vs actual status, failure reason",
                    "type": "str",
                    "multiple": true
                  },
                  {
                    "name": "next_steps",
                    "description": "what the QA engineer should do about failures",
                    "type": "str",
                    "multiple": false
                  }
                ],
                "_input_type": "TableInput"
              }
            }
          },
          "type": "StructuredOutput"
        },
        "dragging": false,
        "id": "StructuredOutput-a6ff8",
        "measured": {
          "height": 340,
          "width": 320
        },
        "position": {
          "x": 2840,
          "y": 120
        },
        "selected": false,
        "type": "genericNode"
      },
      {
        "data": {
          "description": "Displays the final contract validation report.",
          "display_name": "Chat Output \u2014 Contract Report",
          "id": "ChatOutput-d5686",
          "node": {
            "base_classes": [
              "Message"
            ],
            "beta": false,
            "conditional_paths": [],
            "custom_fields": {},
            "description": "Displays the final contract validation report.",
            "display_name": "Chat Output \u2014 Contract 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 (Langflow built-in)\n"
              },
              "input_value": {
                "advanced": false,
                "display_name": "Inputs",
                "dynamic": false,
                "info": "The contract 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-d5686",
        "measured": {
          "height": 340,
          "width": 320
        },
        "position": {
          "x": 3240,
          "y": 120
        },
        "selected": false,
        "type": "genericNode"
      }
    ],
    "viewport": {
      "x": 0,
      "y": 0,
      "zoom": 0.4
    }
  },
  "description": "Parses cURL requests, runs a real Restful Booker-style auth-then-validate chain, checks each response against a JSON Schema, and reports the contract verdict.",
  "endpoint_name": "api_contract_validator",
  "id": "216d8bd8-427b-4e40-9e24-ad2ecc58110e",
  "is_component": false,
  "last_tested_version": "1.7.0",
  "name": "API Contract Validator",
  "tags": [
    "qa",
    "api",
    "contract",
    "schema"
  ]
}