[ blog · use-case ]8 min read

Costruisci un agente di briefing mattutino con la News Search API

Sarah ChoyPubblicato il 2 maggio 20268 min di lettura
Costruisci un agente di briefing mattutino con la News Search API

Ogni founder, PM e analista vuole la stessa cosa alle 8 del mattino: un digest pulito di cosa è cambiato durante la notte. Con una News Search API, un LLM e una piattaforma con cron via HTTP, lo realizzi in un pomeriggio.

In breve

  • Architettura: cron → News Search → URL Extract delle storie promettenti → riassunto con LLM → post su Slack/email.
  • Regola la freschezza con <code>start_date</code> = oggi − 1; regola il locale con <code>country_code</code>.
  • Suddividi il briefing per tema con query parallele su News Search; l'LLM unisce e deduplica.
  • Il costo totale è di ~15 crediti per tema al giorno, più i token dell'LLM. Un briefing di 5 temi costa &lt; 0,10 $/giorno a prezzo di listino.

La forma di un briefing utile

Un agente di briefing mattutino deve rispondere a una domanda: 'cosa è cambiato durante la notte che ho bisogno di sapere?' L'asticella è più alta di quanto sembri. Uno scarico di titoli fallisce — è la stessa cosa dell'RSS e viene silenziato nel giro di una settimana. Ciò che sopravvive è un digest di 5 punti con link, organizzato per tema, nella voce dell'utente.

Questo si scompone in una piccola pipeline:

  • Recuperare notizie recenti su N temi — News Search API.
  • Estrarre il corpo di qualsiasi link che il modello voglia citare — URL Extract API.
  • Riassumere + raggruppare con un LLM — il modello che preferisci.
  • Pubblicare su Slack / email / Notion — il tuo canale di comunicazione esistente.
  • Pianificare con un cron — Vercel Cron, GitHub Actions, n8n, ecc.

Passo 1: scegli i tuoi temi

Restano 3–6 temi. I briefing con 12 temi vengono superati con lo scroll. Esempi:

  • Per un founder di SaaS B2B: 'round di funding sull'IA', 'notizie OpenAI / Anthropic', 'mosse dei concorrenti'.
  • Per un analista finanziario: 'FOMC e Treasury', 'catena di fornitura dei semiconduttori', 'ticker specifici'.
  • Per un PM healthcare: 'approvazioni FDA', 'risultati di trial clinici', 'cambiamenti nei rimborsi'.

Passo 2: recupera il segnale grezzo

Esegui una chiamata a News Search per tema, in parallelo. Usa start_date per limitare la freschezza:

from datetime import date, timedelta
import asyncio, aiohttp

KEY = "pk_yourkey"
TOPICS = [
    "AI agent infrastructure funding",
    "OpenAI Anthropic Google new releases",
    "RAG and LLM tool calling research",
]

async def fetch_topic(session, q):
    yesterday = (date.today() - timedelta(days=1)).isoformat()
    async with session.post(
        "https://www.apipick.com/api/search/news",
        headers={"x-api-key": KEY},
        json={"query": q, "start_date": yesterday},
    ) as r:
        return q, await r.json()

async def fetch_all():
    async with aiohttp.ClientSession() as s:
        return await asyncio.gather(*[fetch_topic(s, q) for q in TOPICS])

Ogni chiamata restituisce fino a 5 titoli ordinati (max 10 con num_results). Per un briefing di 3 temi sono 3 × 15 = 45 crediti per esecuzione. Alla tariffa di 5 $ / 5.000 crediti, 0,045 $/giorno. Il costo giornaliero è dominato dall'LLM, non dalla News API.

Passo 3: estrai i corpi in modo selettivo

Non ti serve il contenuto completo di ogni storia — solo di quelle che il modello vuole citare in dettaglio. Un'euristica semplice: estrai le 2 storie migliori per tema. Con API Pick è un'unica chiamata batch:

import requests

urls = [r["url"] for topic, payload in results for r in payload["results"][:2]]

extracted = requests.post(
    "https://www.apipick.com/api/extract",
    headers={"x-api-key": KEY},
    json={"urls": urls, "extract_effort": "auto"},
).json()

A 2 crediti per URL, il passo di estrazione aggiunge ~12 crediti/giorno per un briefing di 3 temi.

Passo 4: il prompt del riassuntore

Il prompt è dove vive la voce del briefing. Un punto di partenza:

You are an assistant that writes a morning briefing in <Sarah's> voice:
direct, no fluff, no marketing language.

Input: a JSON list of {topic, headlines, extracted_bodies}.

Output rules:
- 1 short paragraph per topic, max 60 words.
- Each paragraph ends with up to 3 inline source links.
- If a topic has fewer than 2 substantive stories overnight, omit it.
- If the entire briefing has fewer than 2 substantive topics, output the
  literal token SKIP and nothing else.
- Never editorialise. Quote facts and figures verbatim from the sources.

Output format: Slack-flavoured markdown.

L'istruzione 'SKIP se basso segnale' è la regola con la leva più alta. È il motivo per cui il tuo briefing non verrà silenziato.

Passo 5: pubblica e pianifica

Per un cron in Python, l'intero script è < 80 righe. Il post su Slack:

if briefing.strip() == "SKIP":
    return
requests.post(
    SLACK_WEBHOOK_URL,
    json={"text": briefing, "username": "Morning Briefing", "icon_emoji": ":sunrise:"},
)

Pianifica con Vercel Cron (in vercel.json), GitHub Actions, AWS EventBridge o n8n. Eseguilo alle 7:45 del tuo fuso orario — l'obiettivo è che ti stia già aspettando quando ti siedi alle 8.

Farlo in n8n se preferisci il no-code

  • Schedule trigger — quotidiano, 7:45 nel fuso dell'utente.
  • Nodi HTTP Request (uno per tema), POST /api/search/news con start_date di ieri.
  • Il nodo Merge combina i risultati dei temi.
  • Il nodo HTTP Request chiama /api/extract con le URL principali.
  • Il nodo OpenAI / Anthropic esegue il prompt del riassuntore.
  • Il nodo If verifica che l'output non sia SKIP.
  • Il nodo Slack pubblica il briefing.

Cosa tenere d'occhio in produzione

  • Deriva del tema. 'AI agents' diventa troppo ampio dopo 6 mesi — l'indice dell'API cresce; il tuo briefing deve restare specifico. Stringi le query ogni trimestre.
  • Ripetizione tra i giorni. Passa al modello le URL del giorno precedente con 'don't re-cover stories from this list' se la stessa storia continua a comparire.
  • Weekend tranquilli. La regola SKIP gestisce già questo; semplicemente non legare la tua abitudine di check-in quotidiano al briefing.

Itera, non lanciare e dimenticare

Leggi il briefing ogni mattina per una settimana. Annota dove il modello ha mentito, classificato male o tralasciato qualcosa. Aggiorna il prompt. Dopo una settimana di iterazione il briefing diventa un'abitudine — e hai costruito un agente funzionante con circa 80 righe di codice e tre chiamate API.

Domande frequenti

Perché non usare semplicemente Google News o un aggregatore RSS?

Funzionano entrambi — e lasciano a te la parte noiosa: raggruppare, deduplicare, riassumere e scrivere davvero il briefing. Un agente fa quella parte con un LLM. L'RSS ti dà i titoli; l'agente ti dà un paragrafo che dice cosa conta, con i link alle fonti.

Quanto è fresca la News Search API?

L'API indicizza le principali testate quasi in tempo reale. Per un briefing delle 8 che copre le 24 ore precedenti, imposta start_date a ieri. Per i bot di breaking news che girano ogni ora, imposta start_date a oggi e riesegui l'agente deduplicando rispetto all'ultima esecuzione.

E se il briefing non ha niente di nuovo da dire?

Mettilo nel prompt: 'If fewer than 3 substantive stories changed overnight, return SKIP.' Il tuo cron job deve rispettare lo SKIP e non pubblicare un briefing a basso segnale. La fatica da briefing è la via più rapida per farsi silenziare un canale Slack.

Posso farlo senza n8n?

Sì. Lo stesso flusso gira come uno script Python di 30 righe su un cron — vedi l'esempio sotto. n8n è comodo per il debugging visivo e l'integrazione con Slack, ma non è obbligatorio.

Come evito che la stessa storia venga riassunta in più temi?

Passa al modello le URL delle query precedenti nella stessa esecuzione con l'istruzione: 'do not re-mention any URL already covered.' Oppure esegui un'unica ricerca multi-tema e lascia che il modello faccia la partizione. Funzionano entrambe; la seconda costa meno.

API usate in questo articolo

Sarah Choy
Scritto da
Sarah Choy
CEO, API Pick

Sarah Choy è la CEO di API Pick. Scrive sulla creazione di API pronte per la produzione per agenti IA e flussi di lavoro con LLM.