Skip to main content
profile pic
Anders Thoresson

Så använder jag GPT-4o mini och n8n för omvärldsbevakning

| | | | Lästid: 12 minuter (12201 tecken)

Texten jag skrev om “vibe monitoring” – att använda språkmodeller med en (artificiell) känsla för sammanhang och innehåll istället för nyckelord för omvärldsbevakning – väckte större intresse än jag hade trott. Många har frågat efter mer detaljer om hur jag byggt lösningen i n8n.

Mitt omvärldsbevakningsflöde i n8n.

Den här texten har två övergripande delar: Först en beskrivning som på ett generellt plan går igenom upplägget, och på slutet tekniska detaljer för alla som vill testa själva. Där finns också ett json-fil med hela mitt workflow. Laddar man upp den till ett konto på n8n så är det bara några få inställningar som behöver göras innan man är igång.

Det här är sannolikt långt ifrån så bra som det kan bli. Jag är nybörjare på n8n, så där går säkert att göra mycket bättre. Och om prompter går ju alltid att skruva mer på. Så jag tar gärna feedback!

Vad jag menar med omvärldsbevakning och vibe monitoring dyker jag inte in i här.

Tre byggstenar: 2 x inläsning, och så ett mail #

Upplägget i n8n bygger på tre olika delar:

  1. Vi börjar bakifrån, med slutmålet: Att en gång per dygn få ett mail som dels sammanfattar innehållet i mina prioriterade nyhetsbrev, dels innehåller länkar till andra artiklar och blogginlägg som jag eventuellt kan vara intresserad av. Här står GPT-4o mini för både sammanfattning och urval.
  2. Ett par gånger per dygn görs en koll om nyhetsbreven, som Platformer och Stratechery, jag prenumererar på publicerat något nytt. I så fall sparas de texterna.
  3. Ett par gånger per dygn görs också en koll av nya artiklar på ett gäng webbplatser, som Techmeme. Här sparas bara rubrik och länk efter GPT-4o mini analyserat innehållet och gjort en bedömning om jag är intresserad av texten eller inte. Det här steget blir en grovgallring, där en del sorteras bort varje morgon.

Tekniken

Jag har efter förra inlägget fått några kommentarer om att Make och Zapier är enklare att komma igång med än n8n. Jag använt båda, och håller nog med om att de är enklare. Jag tror också att det jag beskriver här skulle gå att bygga i något av de två verktygen också.

Att jag ändå valde n8n beror på att det går att installera på egen server. För mig blir det primärt en kostnadsfråga, eftersom jag nu kan bygga hur många flöden som helst. Men för några av er kan det kanske också vara en dataskyddsfråga, eftersom möjligheten att använda lokala språkmodeller finns.

1. Hämta nyhetsbrev #

Newsletter ingestion.

Det här steget är det enklaste i hela bygget. Det startas, precis som de övriga två delarna, automatiskt ett par gånger per dygn. I det andra blocket finns en lista med RSS-flöden till de nyhetsbrev jag prioriterar högst.

Därefter följer en loop där RSS-flödena hanteras ett och ett:

  1. Först läser n8n in innehållet (Parse newsletter).
  2. Sen normaliseras innehållet i flödet, vilket innebär att jag har ett skript i det efterföljande {}-blocket (ett så kallat kod-block där det finns lite javascript bakom kulisserna – all kod finns längst) som ser till att samma namn används för fälten med rubrik, avsändare, länk och så vidare.
  3. Slutligen skickas alla nya texter in i databasen i Supabase.

Här finns alltså ingen AI med i leken alls. (Åtminstone inte i själva flödet i n8n. Men utan ChatGPT/Claude hade jag inte kunnat få till all javascript som finns i de olika kod-blocken!)

Det skulle också gå att koppla på exempelvis ett Gmail-konto och hämta nyhetsbrev från inkorgen där. Kanske det förväntade sättet, när man pratar om nyhetsbrev. Men eftersom alla de jag prioriterar finns som RSS-flöden väljer jag att plocka dem den vägen. Föredelen med det är att informationen är lite mer strukturerad, med separata fält för rubrik, innehåll, länk och så vidare. Gör det lättare att spara till databasen.

2. Hämta och gallra i andra nyhetsflöden #

Feed ingestion.

I inläsningen av länkar från de övriga flödena spelar GPT-4o mini däremot en avgörande roll. Det är här gallringen sker baserat på “vibe” istället för förutbestämda nyckelord.

Vi tar det steg för steg igen:

  1. De tre första blocken känns igen från nyhetsbreven: En tidsinställd trigger, ett block med RSS-flödena och sedan ett block som läser in innehållet i flödena.
  2. Det som händer i fjärde blocket, Remove Duplicates, är att n8n kastar allt som kommer i flödena som hanterats i tidigare körningar. Det här blocket behövs eftersom jag kör inläsningen av nyhetsflödena flera gånger per dygn och jag inte vill att språkmodellen ska lägga tid och pengar på att nyhetsvärdera sånt som redan hanterats.
  3. Normaliseringen i femte blocket känns också igen från nyhetsbrevsinläsningen.
  4. Och så, i sjätte blocket, är det dags för GPT4o mini att göra sitt, utifrån den här nyhetsvärderingsprompten. En viktig del i den prompten, instruktionen till modellen, är att jag ber den värdera nyheten på en skala mellan ett till fem...
  5. ...vilket jag använder som urvalskriterium i nästa block, där alla nyheter som fått ett eller två i betyg kastas...
  6. ...innan de som bedömts vara en tre, fyra, eller femma sparas till Supabase.

3. Sammanfatta dygnets skörd och skicka ett morgonmail #

Mail compilation.

Den tredje och sista delen, för att skicka ut sammanfattningen varje morgon, ser betydligt rörigare ut men är egentligen också ganska rättfram.

  1. Tidsinställd trigger som går igång klockan 7 varje morgon.
  2. Tre anrop till Supabase som i tur och ordning hämtar senaste dygnets nyhetsbrev, de nyhetsartiklar som nyhetsvärderats som fyror och femmor och de som fått en trea.
  3. För nyhetsbreven görs en koll, Check if there are new newsletters, om det publicerats något nytt sen sist. Om inte skriver ”penn”-blocket en mening om det och skickar den till Merge-blocket. Om det däremot finns nya nyhetsbrev skickas de, ett och ett, till GPT-4o mini för en sammanfattning. Sammanfattningarna slås sen ihop till en enda text med hjälp av ett javascript i det efterföljande {}-blocket innan penn-blocket gör sammanfattningarna redo att bli en del av mailet.
  4. De två “spåren” under nyhetsbrevssammanfattningarna går igenom de länkar som värderats som 4 eller 5 respektive 3 (vilket jag kallar för top news respektive misc news). Varje länksamling skickas till GPT-4o mini med en prompt som väljer ut de som ser mest intressanta ut och grupperar dem efter ämne.
  5. I de tre följande stegen, merge-, {}-, och markdown-blocken skapas innehållet i ett mail...
  6. ...som till slut skickas till mig i det sista steget.

Några avslutande tankar #

Hur kan omvärldsbevakningen vässas? #

Det här fungerar bra nog för att sedan ett tag tillbaka vara en viktig del i min dagliga nyhetsbevakning. Det sparar tid, och hjälper mig hitta sånt jag annars hade missat. Men givetvis finns det idéer om hur det kan bli ännu bättre:

Om modeller som är tillräckligt bra #

Den här tillämpningen är också ett tydligt exempel på att man inte alltid behöver de senaste, största och därmed dyraste modellerna. GPT-4o mini räcker gott och väl för det här. Jag vet att jag vill läsa de flesta nyhetsbreven, men kommer inte hinna. Det jag behöver är en någorlunda bra sammanfattning för att kunna välja vad jag ska fokusera min tid på.

Samma sak med urvalet av de övriga länkarna. Det behöver inte vara perfekt – det viktiga är att jag får en tillräckligt bra översikt för att fatta beslut om vad jag vill läsa vidare. Om modellerna och därmed jag missar saker? Helt säkert. Men hand upp den som känner att du läser allt som är av intresse på internet! :)

Jag har gjort några experiment med Googles öppna modell Gemma 3, i en liten variant som går att köra på min MacBook. Det blir inte lika bra som med GPT-4o mini, men helt okej. Och då öppnas för intressanta möjligheter: Så väl n8n, Supabase som Gemma kan nämligen köras på egen hårdvara (precis som ett gäng andra alternativ för både databasdelen och språkmodellen).

Tekniska detaljer #

Prompterna #

De prompter jag använder kan förhoppningsvis fungera som inspiration oavsett om du väljer att bygga något liknande i n8n eller i ett annat verktyg.

Prompt för nyhetsvärdering (med några mer personliga delar bortplockade) #

Det här den här prompten som tar hand om det som kommer i de breda flödena, för att avgöra vad som troligen kommer att intressera mig.

You are an expert content curator for Anders Thoresson, who has an interest in AI, technology, and their societal implications. Your task is to evaluate whether a news item aligns with Anders' specific interests.

**ANDERS' CORE INTERESTS**
- AI and technology development, especially applied AI
- The intersection of technology and society:
  - Technology's impact on democracy and civic discourse*
  - AI's influence on labor markets and the future of work
  - Geopolitical implications of technological advancement
  - Digital rights, privacy, and surveillance
  - Technology and regulation
  - Digital sovereignty and digital resilience
  - Technology policy and governance
  - Other emerging technology trends with significant societal implications
- The global startup landscape
- Major news related to climate change

**EVALUATION CRITERIA**
Rate this news item on a scale of 1-5 based on:
- Alignment with Anders’ interest in technology-society intersection
- Potential to provide unique insights for a Swedish perspective

**NEWS ITEM TO EVALUATE**

Title: {{ $json.title }} (Det här är variabler som n8n ersätter med innehållet från tidigare block.)

Content: {{ $json.content }}

**OUTPUT FORMAT**
Provide your evaluation as valid JSON with the following structure:
{
  "score": [1-5 integer],
  "reasoning": [2-3 sentences explaining your evaluation. Don't include phrasing like "This news item..." or "This matches Anders' interest in..." Since Anders is the only person reading this summary, he is aware of that it is for him and a summary of a news article. Instead, just provide 2-3 sentences explaining why it fits Anders' interest.]
}

Focus on substance over hype, and prioritize items with depth and meaningful implications over purely technical or business news without broader context.

Prompt för sammanfattning #

“Läser” och sammanfattar mina prioriterade nyhetsbrev.

You are an expert newsletter summarizer for Anders Thoresson, who has an interest in AI, technology, and their societal implications. Your task is to evaluate whether a news item aligns with Anders' specific interests.

PROCESS
When presented with a newsletter, analyze its content and structure.

Write 2-3 sentences that in a concise summarize why this newsletter is of interest to Anders.

ANDERS' CORE INTERESTS
- AI and technology development, especially applied AI
- The intersection of technology and society:
  - Technology's impact on democracy and civic discourse*
  - AI's influence on labor markets and the future of work
  - Geopolitical implications of technological advancement
  - Digital rights, privacy, and surveillance
  - Technology and regulation
  - Digital sovereignty and digital resilience
  - Technology policy and governance
  - Other emerging technology trends with significant societal implications
- The global startup landscape
- Major news related to climate change

## NEWSLETTER ARTICLE TO SUMMARIZE
Title: {{ $json.title }}
Content: {{ $json.content }}

## OUTPUT FORMAT (MAKE SURE TO USE HTML AND INCLUDE THE CREATOR!)
<h1><a href="{{ $json.url }}">{{ $json.title }}</a></h1>
By {{ $json.creator }}.
2-3 sentences that in a concise summarize why this newsletter is of interest to Anders and his colleagues.

## DON'TS
- DO NOT directly mention Anders or any other recipient in the summary
- DO NOT directly mention Anders' employers 
- DO NOT start with a sentence like "In this newsletter..." – instead, cut right to the summary.

Prompt för urval och gruppering #

Väljer ut och grupperar länkar från de breda flödena.

You are an expert news curator and analyst. Your task is to organize a collection of news articles into meaningful categories that would help readers quickly understand the major stories of the day.

The input data contains news articles with URLs, titles, and importance rankings (1-5, with 5 being most important/relevant):

{{ $json.formattedText }}

Please:
1. Group articles into logical categories based on shared themes, topics, or narratives
2. Sort the categories with the most significant news stories first
3. Within each category, list articles in order of importance (highest ranking first)
4. Ensure each category has a clear, descriptive title that captures the theme
5. Aim for 4-8 categories total, depending on the diversity of news topics present. Ensure no article appears in more than one category.


Respond in the following format:

<h2>[Category Title 1]</h2>
<ul>
  <li><a href="[article_url]">[Article Title]</a></li>
  <li><a href="[article_url]">[Article Title]</a></li>
</ul>

<h2>[Category Title 2]</h2>
<ul>
  <li><a href="[article_url]">[Article Title]</a></li>
  <li><a href="[article_url]">[Article Title]</a></li>
</ul>

Installation i n8n #

Om du vill göra en egen installation av det här i n8n kan du använda min konfigurationsfil och sen ladda upp den till ditt n8n-konto. Jag har markerat vilka block du behöver göra ändringar i.

Du behöver dessutom ett konto på Supabase och skapa två databaser där. Den ena för nyhetsbreven:

create table public."newsMonitor_newsletters" (
  id bigint generated by default as identity not null,
  created_at timestamp with time zone not null default now(),
  creator text null,
  title text null,
  content text null,
  url text null,
  "pubDate" timestamp with time zone null,
  guid text null,
  embedding public.vector null,
  constraint newsMonitor_newsletters_pkey primary key (id),
  constraint unique_guid unique (guid)
) TABLESPACE pg_default;

Och den andra för utvalda länkar:

create table public."newsMonitor_filteredItems" (
  id bigint generated by default as identity not null,
  created_at timestamp with time zone not null default now(),
  headline text null,
  url text null,
  source text null,
  ranking numeric not null,
  content text null,
  "evalReasoning" text null,
  constraint newsMonitor_filteredItems_pkey primary key (id)
) TABLESPACE pg_default;