{
  "name": "HR Bewerbungs-Pipeline: E-Mail → PDF → KI-Zusammenfassung → Google Sheets",
  "nodes": [
    {
      "id": "trigger-1",
      "name": "Bewerbungs-E-Mail empfangen",
      "type": "n8n-nodes-base.emailReadImap",
      "typeVersion": 2.1,
      "position": [250, 300],
      "parameters": {
        "mailbox": "INBOX",
        "postProcessAction": "read",
        "format": "simple",
        "downloadAttachments": true
      },
      "credentials": {
        "imap": {
          "id": "",
          "name": "HR E-Mail IMAP"
        }
      },
      "notes": "Verbinde hier dein HR-Postfach per IMAP. Aktiviere 'Download Attachments', damit PDF-Anhänge heruntergeladen werden."
    },
    {
      "id": "extract-1",
      "name": "PDF-Text extrahieren",
      "type": "n8n-nodes-base.extractFromFile",
      "typeVersion": 1.1,
      "position": [500, 300],
      "parameters": {
        "operation": "pdf",
        "binaryPropertyName": "attachment_0",
        "options": {
          "joinPages": true
        }
      },
      "notes": "Extrahiert den Text aus dem PDF-Lebenslauf. Falls der Anhang anders heißt, passe 'binaryPropertyName' an."
    },
    {
      "id": "openai-1",
      "name": "KI Skills-Zusammenfassung",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "typeVersion": 2.1,
      "position": [750, 300],
      "parameters": {
        "resource": "text",
        "operation": "message",
        "modelId": {
          "__rl": true,
          "mode": "id",
          "value": "gpt-4o-mini"
        },
        "messages": {
          "values": [
            {
              "content": "=Du bist ein erfahrener HR-Analyst. Analysiere den folgenden Lebenslauf und extrahiere:\n\n1. **Name** des Bewerbers\n2. **E-Mail-Adresse**\n3. **Wichtigste Skills** (als kommaseparierte Liste)\n4. **Jahre Berufserfahrung** (geschätzt)\n5. **Letzte Position / Jobtitel**\n6. **Kurzfazit** (2-3 Sätze Gesamtbewertung)\n\nAntworte ausschließlich im folgenden JSON-Format:\n{\n  \"name\": \"\",\n  \"email\": \"\",\n  \"skills\": \"\",\n  \"erfahrung_jahre\": \"\",\n  \"letzte_position\": \"\",\n  \"fazit\": \"\"\n}\n\nLebenslauf:\n{{ $json.data }}"
            }
          ]
        },
        "options": {
          "temperature": 0.2,
          "maxTokens": 1000
        }
      },
      "credentials": {
        "openAiApi": {
          "id": "",
          "name": "OpenAI API"
        }
      },
      "notes": "Sendet den PDF-Text an GPT-4o-mini und lässt Name, Skills, Erfahrung etc. als JSON extrahieren."
    },
    {
      "id": "code-1",
      "name": "JSON parsen",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [1000, 300],
      "parameters": {
        "jsCode": "// Parse the AI response JSON\nconst aiResponse = $input.first().json.message.content;\n\ntry {\n  // Extract JSON from the response (handles markdown code blocks too)\n  let jsonStr = aiResponse;\n  const jsonMatch = aiResponse.match(/\\{[\\s\\S]*\\}/);\n  if (jsonMatch) {\n    jsonStr = jsonMatch[0];\n  }\n  \n  const parsed = JSON.parse(jsonStr);\n  \n  return [{\n    json: {\n      name: parsed.name || 'Nicht erkannt',\n      email: parsed.email || 'Nicht erkannt',\n      skills: parsed.skills || 'Nicht erkannt',\n      erfahrung_jahre: parsed.erfahrung_jahre || 'Nicht erkannt',\n      letzte_position: parsed.letzte_position || 'Nicht erkannt',\n      fazit: parsed.fazit || 'Nicht erkannt',\n      eingegangen_am: new Date().toISOString().split('T')[0]\n    }\n  }];\n} catch (e) {\n  return [{\n    json: {\n      name: 'Parse-Fehler',\n      email: '',\n      skills: aiResponse,\n      erfahrung_jahre: '',\n      letzte_position: '',\n      fazit: 'KI-Antwort konnte nicht geparst werden',\n      eingegangen_am: new Date().toISOString().split('T')[0]\n    }\n  }];\n}"
      },
      "notes": "Parst die KI-Antwort in saubere Felder für Google Sheets. Enthält Fehlerbehandlung für den Fall, dass die KI kein valides JSON liefert."
    },
    {
      "id": "sheets-1",
      "name": "In Google Sheets eintragen",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [1250, 300],
      "parameters": {
        "operation": "append",
        "documentId": {
          "__rl": true,
          "mode": "url",
          "value": "GOOGLE_SHEET_URL_HIER_EINFUEGEN"
        },
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Bewerbungen"
        },
        "columns": {
          "mappingMode": "autoMapInputData"
        },
        "options": {}
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "",
          "name": "Google Sheets OAuth2"
        }
      },
      "notes": "Schreibt die extrahierten Daten als neue Zeile in dein Google Sheet. Erstelle ein Sheet mit den Spalten: name, email, skills, erfahrung_jahre, letzte_position, fazit, eingegangen_am"
    }
  ],
  "connections": {
    "Bewerbungs-E-Mail empfangen": {
      "main": [
        [
          {
            "node": "PDF-Text extrahieren",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "PDF-Text extrahieren": {
      "main": [
        [
          {
            "node": "KI Skills-Zusammenfassung",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "KI Skills-Zusammenfassung": {
      "main": [
        [
          {
            "node": "JSON parsen",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "JSON parsen": {
      "main": [
        [
          {
            "node": "In Google Sheets eintragen",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "active": false,
  "tags": [
    {
      "name": "HR"
    },
    {
      "name": "Automatisierung"
    }
  ]
}
