Hopp til hovedinnhold

Julen er en travel tid for de fleste av oss. Det er gaver som skal handles, prosjekter som skal i mål – og ikke minst en evig strøm av Slack-meldinger som venter på å bli lest, forstått og reagert på 🧑‍🎄

Nissens hjelpere er svært opptatt. Derfor skal vi, i denne luken, bygge egne agenter i n8n som kan rydde i meldingskaoset for deg – mens du selv synker ned i sofaen og ser Tre nøtter til Askepott med en kopp gløgg under teppet.

Hva er n8n – og hvorfor bruke det?

n8n er et automasjonsverktøy. Det er laget for å koble sammen systemer, flytte data og automatisere oppgaver som ellers må gjøres manuelt. I praksis betyr det at du kan bygge workflows som henter data fra et API, sender e-post, oppdaterer databaser – eller kobler på en språkmodell. AI er bare én av mange byggeklosser, ikke noe alt må dreie seg rundt.

Samtidig gjør n8n det veldig enkelt å bygge agent-lignende løsninger. På mange måter minner det om Agent Builder-verktøyene som har dukket opp i det siste, men med noen forskjeller:

  • n8n er bygget for generell automasjon, ikke bare AI
  • du låser deg ikke til én leverandør
  • open source for det meste

Det betyr at du kan bruke n8n til helt seriøse formål: automatisere bort dine tidstyver og gjøre hverdagen litt mer effektiv. 🧠


Men det betyr også at du kan bruke det til det motsatte – å lage små, gøyale workflows du bruker langt mer tid på å bygge enn du noen gang kommer til å spare. 😎

Workflows og noder

En node er den minste byggeklossen i n8n. Den tar imot data, gjør én konkret oppgave og sender resultatet videre til neste steg. Dette kan være alt fra http-requests, datatransformasjon eller bare å kjøre noe logikk. Alt som flyter gjennom en workflow er strukturert data, typisk JSON inn og JSON ut.

Selve byggingen skjer i et click-ops-basert brukergrensesnitt. Du drar inn noder, kobler dem sammen, og setter sammen en workflow som beskriver hva som skal skje – fra start til slutt.

enkel-n8n-workflow

Alle workflows begynner med en trigger. Triggeren bestemmer når workflowen skal kjøre, enten det er på en fast tidsplan, via et manuelt klikk, gjennom en chat-melding eller ved hjelp av en webhook som lytter på hendelser.

hva-skjer-så

Etter triggeren kobler du sammen noder som gjør selve jobben. Det kan være alt fra web-søk og API-kall til egendefinert logikk i Code-noder. n8n kommer med over 400 ferdige noder, og gjennom communityet finnes det i tillegg tusenvis av ekstra noder og integrasjoner du kan bygge videre på.

Slack-nissen: hva vi skal bygge

I denne guiden bygger vi en Slack-nisse 🧑‍🎄 som:

  • kjører en gang om dagen
  • henter nye meldinger fra en slack kanal
  • oppsummerer meldingene i en språkmodell
  • sender deg samlet oppsummering på slack

Oppskrift (20-30 min i ovnen)

1. Sett opp lokal llm

Vi bruker Ollama for å sette opp lokal språkmodell. Last ned Ollama på hjemmesidene https://ollama.com/download eller via homebrew:

brew install ollama

Hent en LLM modell for lokalt bruk. Disse modellene er mulig å hoste uten å sitte på et Nvidia supercluster:

ollama pull gpt-oss:20b
ollama pull llama3.2:3b

Deretter setter vi opp modellen til å ta i mot forespørsler.

ollama serve

2. Få n8n opp å gå

Vi bruker docker for å gjøre oppsettet enklest mulig. Det første vi trenger er et sted å lagre workflows i n8n. Vi oppretter et docker volum for dette

docker volume create n8n_data

Deretter henter vi docker image for n8n og kobler det til lagringen

docker run -it --rm \\
 --name n8n \\
 -p 5678:5678 \\
 -v n8n_data:/home/node/.n8n \\
 docker.n8n.io/n8nio/n8n


Opprett n8n bruker og du er inne 🕺

velkommen

3. Gi Slack-nissen tilganger (tokens og scopes)

For at Slack-nissen skal kunne lese meldinger og sende deg en oppsummering, trenger den tilgang til slack privilegier gjennom et Bot-token:


app_mentions:read

channels:history

channels:join

channels:read

groups:history

groups:read

im:history

mpim:history

users:read

Den enkleste måten å sette dette opp på er å:

  1. opprette en Slack-app i workspacet ditt. Velg Create new app og fyll ut.
  2. gå til OAuth & Permissions deretter Add an OAuth Scope. Bot-en trenger en del tilganger - legg til hele listen over.
  3. gå til toppen av OAuth & Permissions og trykk Install to <ditt-workspace>
  4. token dukker så opp under Bot User OAuth Token. Dette kan vi bruke til i Slack-node i n8n
  5. siste på listen er å invitere Nissen til slack kanalen du vil ha oppsummert manuelt gjennom slack appen

4. Bygg workflowen

n8n-slack-workflow
n8n-slack-workflow

Workflowen består av noen få, enkle steg som er koblet sammen visuelt. Først starter en Schedule Trigger som kjører hver morgen klokken 07. Denne triggeren kobles til en node som henter meldinger fra en valgt Slack-kanal fra det siste døgnet.

Deretter samles og ryddes meldingene i en enkel Code-node, slik at kun relevant tekst sendes videre. Meldingslisten mates så inn i en oppsummeringsagent, som bruker en lokal språkmodell via Ollama til å lage en kort og presis oppsummering.

Til slutt sendes resultatet rett til deg som en Slack-melding – én samlet digest i stedet for mange varsler.

Her er en fungerende workflow som kan kopieres inn i n8n:

{
  "nodes": [
    {
      "parameters": {
        "model": "llama3.2:3b",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOllama",
      "typeVersion": 1,
      "position": [-48, 192],
      "id": "ollama_chat_model",
      "name": "Ollama Chat Model"
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            { "triggerAtHour": 7 }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.3,
      "position": [-624, -16],
      "id": "schedule_trigger",
      "name": "Schedule Trigger"
    },
    {
      "parameters": {
        "jsCode": "const items = $input.all();\n\nconst messages = items\n  .map(i => i.json)\n  .filter(m => m?.text)\n  .filter(m => m.subtype === undefined)\n  .map(m => ({\n    text: (m.text || '').replace(/\\s+/g, ' ').trim(),\n  }))\n  .filter(m => m.text.length > 0);\n\nreturn [{\n  json: {\n    count: messages.length,\n    messages\n  }\n}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [-224, -16],
      "id": "collect_messages",
      "name": "Samle til liste"
    },
    {
      "parameters": {
        "select": "user",
        "user": {
          "__rl": true,
          "value": "REPLACE_WITH_YOUR_USER_ID",
          "mode": "list"
        },
        "text": "={{ $json.output }}",
        "otherOptions": {}
      },
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.4,
      "position": [256, -16],
      "id": "send_summary",
      "name": "Send oppsummering"
    },
    {
      "parameters": {
        "resource": "channel",
        "operation": "history",
        "channelId": {
          "__rl": true,
          "value": "REPLACE_WITH_CHANNEL_ID",
          "mode": "list"
        },
        "returnAll": true,
        "filters": {}
      },
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.4,
      "position": [-416, -16],
      "id": "fetch_slack_history",
      "name": "Hent slack meldinger fra siste døgn"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Oppsummer følgende Slack-meldinger (JSON-liste):\n{{ JSON.stringify($json.messages) }}",
        "options": {
          "systemMessage": "Du er en nissehjelper som oppsummerer Slack-meldinger for en travel mottaker.\n\nOppgave:\n- Oppsummer innholdet kort og presist.\n- Fremhev tidskritiske saker, beslutninger, spørsmål, blockers og frister.\n- Inkluder alltid hvem som er avsender per punkt.\n- Ignorer småprat, reaksjoner og bekreftelser.\n\nRegler:\n- Skriv på norsk.\n- Bruk korte punktlister.\n- Ikke forklar, resoner eller vis tankeprosess.\n- Ikke gjenta input.\n- Ikke legg til antakelser eller råd utover det som eksplisitt fremgår.\n\nReturner KUN oppsummeringen.",
          "returnIntermediateSteps": false
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 3,
      "position": [-48, -16],
      "id": "summary_agent",
      "name": "Oppsummeringsagent"
    }
  ],
  "connections": {
    "Schedule Trigger": {
      "main": [[{ "node": "Hent slack meldinger fra siste døgn", "type": "main", "index": 0 }]]
    },
    "Hent slack meldinger fra siste døgn": {
      "main": [[{ "node": "Samle til liste", "type": "main", "index": 0 }]]
    },
    "Samle til liste": {
      "main": [[{ "node": "Oppsummeringsagent", "type": "main", "index": 0 }]]
    },
    "Ollama Chat Model": {
      "ai_languageModel": [[{ "node": "Oppsummeringsagent", "type": "ai_languageModel", "index": 0 }]]
    },
    "Oppsummeringsagent": {
      "main": [[{ "node": "Send oppsummering", "type": "main", "index": 0 }]]
    }
  }
}

Før man kan kjøre koden over er man nødt til å fikse opp varsellampene. Her har du gjort alt forarbeidet allerede. Dette innebærer å kopiere inn bot-tokenet, velge llm modellen du lastet ned gjennom ollama pull ... i tillegg til å bestemme om deg selv eller en heldig kollega som får oppsummeringen servert.

koble sammen workflow

5. Ferdig resultat: én Slack-melding, ferdig innpakket

Trykk 'Activate' og du får nå morgen én Slack-melding – ferdig oppsummert og lett å lese. Enten det handler om viktige beslutninger, åpne spørsmål … eller oppskrifter på gløgg.

Personlig agent oppsummering

Oppsummert: mindre støy, mer julefred

Når Slack renner over av “bare til info”, “FYI” og tråder som egentlig ikke trenger full oppmerksomhet, kan du lene deg tilbake og la Slack-nissen gjøre jobben.

Den leser, sorterer og gir deg én samlet oppsummering du faktisk orker å lese. Og hvis nissen blir litt for kreativ, er det bare å justere workflowen.

Med n8n får du mindre støy og mer tid til det som faktisk betyr noe – enten det er å bygge ting, fikse bugs eller ta juleferie med god samvittighet 🎄

Det finnes også et stort galleri med åpne workflows du kan ta utgangspunkt i.

God jul 🎅

Liker du innlegget?

Del gjerne med kollegaer og venner