{
  "name": "Nordwerk-Wissen fragen",
  "nodes": [
    {
      "parameters": {
        "authentication": "n8nUserAuth",
        "formTitle": "Frag das Nordwerk-Wissen",
        "formDescription": "Die Antwort stammt nur aus den Texten in der Tabelle wissen.",
        "formFields": {
          "values": [
            { "fieldLabel": "Frage", "fieldType": "textarea", "requiredField": true }
          ]
        },
        "responseMode": "lastNode",
        "options": {}
      },
      "name": "Frage stellen",
      "type": "n8n-nodes-base.formTrigger",
      "typeVersion": 2.6,
      "position": [0, 0]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://auxdata.ai/v1/embeddings",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "openAiApi",
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ { model: 'bge-m3', input: $json.Frage } }}",
        "options": {}
      },
      "name": "Frage in Vektor",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [220, 0]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "http://api-gw:8000/rest/v1/rpc/match_wissen",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "supabaseApi",
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ { frage: $json.data[0].embedding, anzahl: 3 } }}",
        "options": {}
      },
      "name": "Wissen suchen",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [440, 0],
      "alwaysOutputData": true
    },
    {
      "parameters": {
        "jsCode": "// Treffer zu einem Text mit Nummern zusammenfassen. Kein Treffer = leere Liste.\nconst treffer = $input.all().map(i => i.json).filter(t => t.inhalt);\nreturn [{ json: {\n  frage: $('Frage stellen').first().json.Frage,\n  anzahl: treffer.length,\n  kontext: treffer.map((t, n) => `[${n + 1}] (${t.quelle}) ${t.inhalt}`).join('\\n'),\n  quellen: [...new Set(treffer.map(t => t.quelle))].join(', ')\n} }];"
      },
      "name": "Fundstellen bündeln",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [660, 0]
    },
    {
      "parameters": {
        "conditions": {
          "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "loose", "version": 2 },
          "conditions": [
            {
              "id": "4f0c2a2e-5b1d-4c8e-9a51-1b7f3d0c9e11",
              "leftValue": "={{ $json.anzahl }}",
              "rightValue": 0,
              "operator": { "type": "number", "operation": "gt" }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "name": "Etwas gefunden?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [880, 0]
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Frage: {{ $json.frage }}\n\nAbschnitte aus dem Firmenwissen:\n{{ $json.kontext }}",
        "messages": {
          "messageValues": [
            {
              "type": "SystemMessagePromptTemplate",
              "message": "Du beantwortest Fragen für die Nordwerk GmbH, einen Hersteller von Werkstattmöbeln. Antworte auf Deutsch, per Sie, in höchstens drei Sätzen.\nRegeln:\n- Benutze nur die mitgelieferten Abschnitte. Was dort nicht steht, weißt Du nicht.\n- Nenne hinter jeder Aussage die Nummer des Abschnitts in eckigen Klammern, z. B. [2].\n- Beantworten die Abschnitte die Frage nicht, schreibe genau: Dazu steht nichts im Firmenwissen."
            }
          ]
        },
        "batching": {}
      },
      "name": "Antwort schreiben",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.7,
      "position": [1100, -100]
    },
    {
      "parameters": {
        "model": { "__rl": true, "mode": "id", "value": "mistral/zai-glm-5-3" },
        "responsesApiEnabled": false,
        "options": {}
      },
      "name": "GLM über AuxData",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.3,
      "position": [1100, 120]
    },
    {
      "parameters": {
        "operation": "completion",
        "respondWith": "text",
        "completionTitle": "Antwort",
        "completionMessage": "={{ $json.text }}\n\nQuellen: {{ $('Fundstellen bündeln').item.json.quellen }}",
        "options": {}
      },
      "name": "Antwort zeigen",
      "type": "n8n-nodes-base.form",
      "typeVersion": 2.5,
      "position": [1400, -100]
    },
    {
      "parameters": {
        "operation": "completion",
        "respondWith": "text",
        "completionTitle": "Nichts gefunden",
        "completionMessage": "Dazu steht nichts im Firmenwissen. Die Frage geht an einen Menschen.",
        "options": {}
      },
      "name": "Nichts gefunden",
      "type": "n8n-nodes-base.form",
      "typeVersion": 2.5,
      "position": [1100, 300]
    }
  ],
  "connections": {
    "Frage stellen": { "main": [[{ "node": "Frage in Vektor", "type": "main", "index": 0 }]] },
    "Frage in Vektor": { "main": [[{ "node": "Wissen suchen", "type": "main", "index": 0 }]] },
    "Wissen suchen": { "main": [[{ "node": "Fundstellen bündeln", "type": "main", "index": 0 }]] },
    "Fundstellen bündeln": { "main": [[{ "node": "Etwas gefunden?", "type": "main", "index": 0 }]] },
    "Etwas gefunden?": {
      "main": [
        [{ "node": "Antwort schreiben", "type": "main", "index": 0 }],
        [{ "node": "Nichts gefunden", "type": "main", "index": 0 }]
      ]
    },
    "GLM über AuxData": { "ai_languageModel": [[{ "node": "Antwort schreiben", "type": "ai_languageModel", "index": 0 }]] },
    "Antwort schreiben": { "main": [[{ "node": "Antwort zeigen", "type": "main", "index": 0 }]] }
  },
  "settings": { "executionOrder": "v1" }
}
