{
  "name": "FPCRequirementAnalyzer",
  "nodes": [
    {
      "parameters": {
        "inputSource": "passthrough"
      },
      "type": "n8n-nodes-base.executeWorkflowTrigger",
      "typeVersion": 1.1,
      "position": [
        0,
        0
      ],
      "id": "ra-trigger-0001-0001-000000000001",
      "name": "WorkflowTrigger"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "fpc-requirement-analyzer",
        "responseMode": "lastNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        0,
        -200
      ],
      "id": "ra-webhook-0006-0006-000000000006",
      "name": "WebhookTrigger"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "={{$json.chatInput || $json.input || $json.query || $json.userPrompt || JSON.stringify($json)}}",
        "options": {
          "systemMessage": "# FPC Requirement Analyzer (SWF)\n\nDu bist die Analyse-Stufe einer 4-stufigen FPC-Entwicklungs-Pipeline.\nDeine einzige Aufgabe: Benutzeranforderung analysieren und passende FPCKnowledge-Bausteine ermitteln.\n\nRegeln:\n- Rufe bei jeder technischen Anfrage zuerst FPCKnowledge auf.\n- Bei Bedarf max. 2 verfeinerte Nachsuchen.\n- Erzeuge KEINEN finalen FPC-Code.\n- Nutze keine Validator/MCP/Deploy-Tools (du hast sie nicht).\n- Gib NUR JSON aus, kein Freitext ausserhalb von JSON.\n\nJSON-Ausgabeformat (PFLICHT):\n{\n  \"mode\": \"knowledge_only | implementation\",\n  \"requestSummary\": \"...\",\n  \"intent\": \"code|debug|explain|deploy|validate|knowledge|general\",\n  \"channelLabels\": {\"inputs\": [], \"outputs\": []},\n  \"constraints\": [],\n  \"selectedPatterns\": [\n    {\"title\":\"...\",\"whyRelevant\":\"...\"}\n  ],\n  \"acceptanceTests\": [\"...\"],\n  \"openQuestions\": [],\n  \"originalPrompt\": \"...\"\n}\n\nMode-Regel:\n- knowledge_only nur bei expliziter Anfrage nach Beispielen/Trefferliste ohne Implementierung.\n- sonst implementation.\n\nFeld originalPrompt: kopiere den eingegangenen User-Prompt 1:1, damit der Developer ihn zusammen mit der Analyse erhaelt.\n\nRegeln fuer acceptanceTests (KRITISCH):\n- Leite jeden Acceptance Test DIREKT und AUSSCHLIESSLICH aus der Anforderung ab (Tabellen, Text, Bedingungen).\n- Interpretiere NIEMALS Signalnamen semantisch (z.B. 'NOTAUS' bedeutet NICHT automatisch 'alle Ausgaenge aus').\n- Lies den exakten Ausgangszustand fuer jeden Eingangs-/Zeitfall aus der Anforderung ab und uebernimm ihn 1:1.\n- Jeder Acceptance Test muss konkrete Eingangs- und Ausgangswerte nennen (z.B. 'E0=1 \u2192 A0=1, A1=0, A2=0').\n- Niemals allgemeine oder semantisch abgeleitete Aussagen wie 'alle Ausgaenge aus' ohne Pruefung gegen die Anforderung.",
          "maxIterations": 20
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 3.1,
      "position": [
        400,
        0
      ],
      "id": "ra-agent-0002-0002-000000000002",
      "name": "RequirementAnalyzer"
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "value": "gpt-4.1",
          "mode": "list",
          "cachedResultName": "gpt-4.1"
        },
        "builtInTools": {},
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.3,
      "position": [
        200,
        240
      ],
      "id": "ra-model-0003-0003-000000000003",
      "name": "ChatModel",
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "mode": "retrieve-as-tool",
        "toolDescription": "FPC Knowledge Base: Suche nach existierenden FPC-Beispielen und Mustern. Nutze dieses Tool verpflichtend, um fertige Teilloesungen und passende Musterbausteine zur Anfrage zu finden.",
        "tableName": "fpc_doc_vectors",
        "topK": 5,
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.vectorStorePGVector",
      "typeVersion": 1.3,
      "position": [
        448,
        240
      ],
      "id": "ra-knowledge-0004-0004-000000000004",
      "name": "FPCKnowledge",
      "credentials": {
        "postgres": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "model": "text-embedding-3-large",
        "options": {
          "dimensions": 3072
        }
      },
      "type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
      "typeVersion": 1.2,
      "position": [
        448,
        448
      ],
      "id": "ra-embed-0005-0005-000000000005",
      "name": "Embeddings",
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      }
    }
  ],
  "connections": {
    "WorkflowTrigger": {
      "main": [
        [
          {
            "node": "RequirementAnalyzer",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "WebhookTrigger": {
      "main": [
        [
          {
            "node": "RequirementAnalyzer",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ChatModel": {
      "ai_languageModel": [
        [
          {
            "node": "RequirementAnalyzer",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "FPCKnowledge": {
      "ai_tool": [
        [
          {
            "node": "RequirementAnalyzer",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Embeddings": {
      "ai_embedding": [
        [
          {
            "node": "FPCKnowledge",
            "type": "ai_embedding",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1",
    "binaryMode": "separate"
  },
  "versionId": "ra-version-0001-0001-000000000001",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "id": "ReqAnalyzerSWF01",
  "tags": []
}