{
  "name": "Agent Flow — triage zgłoszeń z granicą decyzji",
  "nodes": [
    {
      "parameters": {
        "pollTimes": { "item": [{ "mode": "everyMinute" }] },
        "format": "simple",
        "options": {}
      },
      "id": "b1f0c2a4-1111-4a11-8a11-000000000001",
      "name": "E-mail (wyzwalacz)",
      "type": "n8n-nodes-base.emailReadImap",
      "typeVersion": 2,
      "position": [-260, 0]
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Zgłoszenie od klienta:\nTemat: {{ $json.subject }}\nTreść: {{ $json.textPlain }}",
        "options": {
          "systemMessage": "Jesteś asystentem obsługi zgłoszeń. ZAKRES: odpowiadasz wyłącznie na pytania o status zamówienia oraz zwroty do 300 zł. POZA ZAKRESEM: reklamacje jakościowe, kwoty powyżej 300 zł, sprawy prawne, klient wyrażający silne niezadowolenie.\n\nZwróć WYŁĄCZNIE obiekt JSON:\n{\"kategoria\":\"status_zamowienia|zwrot|poza_zakresem\",\"pewnosc\":0.0-1.0,\"kwota_pln\":liczba lub null,\"odpowiedz\":\"treść odpowiedzi dla klienta albo pusty string\",\"uzasadnienie\":\"jedno zdanie, dlaczego taka kategoria\"}"
        }
      },
      "id": "b1f0c2a4-2222-4a22-8a22-000000000002",
      "name": "AI Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.7,
      "position": [-40, 0]
    },
    {
      "parameters": { "options": {} },
      "id": "b1f0c2a4-3333-4a33-8a33-000000000003",
      "name": "Model językowy",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1,
      "position": [-40, 200],
      "notes": "Tani, szybki model do klasyfikacji. Klucz API trzymaj w credentials n8n, nigdy w treści węzła."
    },
    {
      "parameters": {
        "jsCode": "// Ustrukturyzowany wynik agenta -> pola, na których można podjąć decyzję.\nconst out = [];\nfor (const item of $input.all()) {\n  let dane;\n  try {\n    dane = JSON.parse(item.json.output ?? item.json.text ?? '{}');\n  } catch (e) {\n    dane = { kategoria: 'poza_zakresem', pewnosc: 0, kwota_pln: null, odpowiedz: '', uzasadnienie: 'Agent nie zwrócił poprawnego JSON-a' };\n  }\n  out.push({ json: { ...dane, oryginal: item.json } });\n}\nreturn out;"
      },
      "id": "b1f0c2a4-4444-4a44-8a44-000000000004",
      "name": "Parsuj wynik",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [180, 0]
    },
    {
      "parameters": {
        "conditions": {
          "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "loose", "version": 2 },
          "conditions": [
            {
              "id": "c1",
              "leftValue": "={{ $json.pewnosc }}",
              "rightValue": 0.8,
              "operator": { "type": "number", "operation": "gte" }
            },
            {
              "id": "c2",
              "leftValue": "={{ $json.kategoria }}",
              "rightValue": "poza_zakresem",
              "operator": { "type": "string", "operation": "notEquals" }
            },
            {
              "id": "c3",
              "leftValue": "={{ $json.kwota_pln ?? 0 }}",
              "rightValue": 300,
              "operator": { "type": "number", "operation": "lte" }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "b1f0c2a4-5555-4a55-8a55-000000000005",
      "name": "Granica decyzji",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [400, 0],
      "notes": "Sygnał granicy: pewność >= 0.8 ORAZ kategoria w zakresie ORAZ kwota <= 300 zł."
    },
    {
      "parameters": {
        "sendTo": "={{ $json.oryginal.from }}",
        "subject": "=Re: {{ $json.oryginal.subject }}",
        "message": "={{ $json.odpowiedz }}",
        "options": {}
      },
      "id": "b1f0c2a4-6666-4a66-8a66-000000000006",
      "name": "Automatyczna odpowiedź",
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [640, -120]
    },
    {
      "parameters": {
        "select": "channel",
        "text": "=*Zgłoszenie poza zakresem agenta*\nOd: {{ $json.oryginal.from }}\nTemat: {{ $json.oryginal.subject }}\nKategoria: {{ $json.kategoria }} (pewność {{ $json.pewnosc }})\nDlaczego zatrzymano: {{ $json.uzasadnienie }}\n\n*Szkic odpowiedzi do sprawdzenia:*\n{{ $json.odpowiedz || '(agent nie zaproponował odpowiedzi)' }}\n\n_Oryginalna treść:_\n{{ $json.oryginal.textPlain }}",
        "options": {}
      },
      "id": "b1f0c2a4-7777-4a77-8a77-000000000007",
      "name": "Człowiek (eskalacja)",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.2,
      "position": [640, 120],
      "notes": "Eskalacja z PEŁNYM kontekstem: oryginał, ustalenia agenta, powód zatrzymania i szkic odpowiedzi."
    }
  ],
  "connections": {
    "E-mail (wyzwalacz)": { "main": [[{ "node": "AI Agent", "type": "main", "index": 0 }]] },
    "AI Agent": { "main": [[{ "node": "Parsuj wynik", "type": "main", "index": 0 }]] },
    "Model językowy": { "ai_languageModel": [[{ "node": "AI Agent", "type": "ai_languageModel", "index": 0 }]] },
    "Parsuj wynik": { "main": [[{ "node": "Granica decyzji", "type": "main", "index": 0 }]] },
    "Granica decyzji": {
      "main": [
        [{ "node": "Automatyczna odpowiedź", "type": "main", "index": 0 }],
        [{ "node": "Człowiek (eskalacja)", "type": "main", "index": 0 }]
      ]
    }
  },
  "settings": { "executionOrder": "v1" },
  "pinData": {},
  "meta": { "instanceId": "agentflow-pl-example" },
  "tags": []
}
