{
  "name": "Kalima: neue KI-Zusammenfassungen",
  "nodes": [
    {
      "parameters": {
        "content": "## Kalima: neue KI-Zusammenfassungen\n\n**1. Kalima verbinden.** Öffnen Sie **Neue Zusammenfassungen aus Kalima holen** und legen Sie Zugangsdaten vom Typ **Header Auth** an, mit dem Namen `Authorization` und dem Wert `Bearer `, gefolgt von Ihrem Kalima-API-Schlüssel. Den Schlüssel erstellen Sie in Kalima unter **Einstellungen > Integrationen > API-Schlüssel** (ab Pro). **Nur lesen** genügt.\n\n**2. Ihre App anschließen.** Ersetzen Sie **Hier Ihre App anschließen** durch Slack, Notion, Google Drive, HubSpot, Asana oder einen anderen Knoten und ordnen Sie die Felder zu: `recording`, `link`, `overview`, `keyPoints`, `decisions`, `actionItems`, `openQuestions`, `markdown`.\n\n**3. Workflow aktivieren.** Er prüft alle 15 Minuten und liefert jede Zusammenfassung genau einmal.\n\nEin manueller Testlauf liefert immer die neueste Zusammenfassung. Nur der aktive Workflow merkt sich, wo er aufgehört hat.",
        "height": 440,
        "width": 540
      },
      "id": "00006b61-6c69-6d61-0000-000000000069",
      "name": "Einrichtung",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -640,
        -140
      ]
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "minutes",
              "minutesInterval": 15
            }
          ]
        }
      },
      "id": "00006b61-6c69-6d61-0000-000000000064",
      "name": "Alle 15 Minuten",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        0,
        0
      ]
    },
    {
      "parameters": {
        "jsCode": "// Wo der letzte geplante Lauf aufgehört hat. n8n merkt sich das zwischen den\n// Läufen des aktiven Workflows; ein manueller Testlauf beginnt jedes Mal neu.\nconst state = $getWorkflowStaticData('global');\nconst params = new URLSearchParams({ limit: '50' });\nif (state.lastSequence) params.set('afterSequence', state.lastSequence);\nreturn [{ json: { url: `https://meetkalima.com/api/v1/summaries?${params}` } }];\n"
      },
      "id": "00006b61-6c69-6d61-0000-000000000065",
      "name": "Anfrage vorbereiten",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        220,
        0
      ]
    },
    {
      "parameters": {
        "url": "={{ $json.url }}",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "options": {}
      },
      "id": "00006b61-6c69-6d61-0000-000000000066",
      "name": "Neue Zusammenfassungen aus Kalima holen",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        440,
        0
      ]
    },
    {
      "parameters": {
        "jsCode": "// Auf false setzen, um eine Zusammenfassung nach jeder Neuerstellung oder\n// Bearbeitung erneut zu erhalten.\nconst ONLY_FIRST_SUMMARY = true;\n\nconst state = $getWorkflowStaticData('global');\nconst firstRun = !state.lastSequence;\nconst items = $input.first().json.data ?? [];\n\n// Die neueste Position merken, damit der nächste Lauf nur nach Neuem fragt.\nfor (const item of items) {\n  if (!state.lastSequence || BigInt(item.sequence) > BigInt(state.lastSequence)) {\n    state.lastSequence = item.sequence;\n  }\n}\n\nconst list = (values) => (values ?? []).map((value) => `- ${value}`).join('\\n');\n// Kalima liefert die neueste Zusammenfassung zuerst.\nlet summaries = items.filter((item) => !ONLY_FIRST_SUMMARY || item.version === 1);\n// Der allererste Lauf würde bis zu eine Woche an Zusammenfassungen auf einmal\n// liefern, deshalb liefert er nur die neueste: genug, um die Felder zuzuordnen.\nif (firstRun) summaries = summaries.slice(0, 1);\n\n// Älteste zuerst, damit die Nachrichten in der Reihenfolge der Aufnahmen ankommen.\nreturn summaries.reverse().map((item) => ({\n  json: {\n    recording: item.recording.name ?? 'Aufnahme ohne Titel',\n    link: item.recording.url,\n    project: item.recording.projectName ?? '',\n    overview: item.summary.overview,\n    keyPoints: list(item.summary.keyPoints),\n    decisions: list(item.summary.decisions),\n    actionItems: (item.summary.actionItems ?? [])\n      .map((a) => `- ${a.task}${a.owner ? ` (${a.owner})` : ''}${a.due ? `, ${a.due}` : ''}`)\n      .join('\\n'),\n    openQuestions: list(item.summary.openQuestions),\n    markdown: item.summary.markdown ?? '',\n    version: item.version,\n    createdAt: item.createdAt,\n  },\n}));\n"
      },
      "id": "00006b61-6c69-6d61-0000-000000000067",
      "name": "Ein Eintrag pro Zusammenfassung",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        660,
        0
      ]
    },
    {
      "parameters": {},
      "id": "00006b61-6c69-6d61-0000-000000000068",
      "name": "Hier Ihre App anschließen",
      "type": "n8n-nodes-base.noOp",
      "typeVersion": 1,
      "position": [
        880,
        0
      ]
    }
  ],
  "connections": {
    "Alle 15 Minuten": {
      "main": [
        [
          {
            "node": "Anfrage vorbereiten",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Anfrage vorbereiten": {
      "main": [
        [
          {
            "node": "Neue Zusammenfassungen aus Kalima holen",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Neue Zusammenfassungen aus Kalima holen": {
      "main": [
        [
          {
            "node": "Ein Eintrag pro Zusammenfassung",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Ein Eintrag pro Zusammenfassung": {
      "main": [
        [
          {
            "node": "Hier Ihre App anschließen",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  }
}
