30 luglio 2026
Un “News Agent” per React Native: aggiornamenti automatici su Slack con Eve
Dai repository GitHub a un riepilogo utile ogni mattina: architettura, prompt, filtri e integrazione, senza over-engineering.
Progettare un agente che monitora l’attività su repository React/React Native/Expo e pubblica su Slack un riepilogo quotidiano davvero leggibile richiede soprattutto buone scelte di architettura: cosa considerare “notizia”, come filtrare rumore (CI, chore), come gestire contesto e sub-agent, e come separare lo strato “cervello” dal canale (Slack, web, ecc.). In questo articolo vediamo un approccio pragmatico con Eve: dal setup del modello custom, alla schedulazione, fino alla forma finale dei messaggi su Slack (card + thread).
Costruire un agente che “legge” GitHub e ogni giorno ti consegna un riepilogo davvero utile sembra un problema di AI. In realtà è (soprattutto) un problema di prodotto e di architettura: cosa consideri informazione, come elimini il rumore e come fai arrivare il risultato nel posto giusto (Slack, web, Discord…)
L’obiettivo concreto è semplice:
- monitorare una lista di repository (es. React, React Native, Expo, Metro, Hermes…)
- individuare ciò che è “newsworthy” (PR con cambi di API, fix rilevanti, RFC/proposte, discussioni importanti)
- filtrare attività poco utile (CI, chore, refactor puramente interno, aggiornamenti automatici)
- pubblicare un riepilogo quotidiano su Slack in un formato leggibile: una “card” e, sotto, un thread con gli item per repo
Di seguito trovi un approccio pragmatico per arrivarci con Eve, mantenendo il sistema estendibile e senza cadere nell’over-engineering.
1) Progettare l’output: “card + thread” batte “muro di testo”
Il primo dettaglio che cambia tutto è decidere come vuoi consumare l’informazione.
Un formato efficace su Slack è:
- Messaggio principale (la card): titolo del digest, data, scope (quali repo), eventuale summary generale.
- Thread con un messaggio per ciascun repository, contenente:
- 3–8 punti massimi (dipende dal volume)
- link diretti a PR/discussioni
- perché è importante (una riga)
- eventuali “azioni” (es. “da tenere d’occhio”, “breaking change potenziale”)
Questo formato ha due vantaggi:
- non “intasa” il canale con 20 messaggi scollegati
- il thread rimane consultabile e riassumibile, anche a distanza di giorni
2) Separare “cervello” e “canale”: l’agente non deve essere uno Slack-bot
Una scelta architetturale che ripaga subito: l’agente produce un output strutturato, non “messaggi Slack”.
Esempio:
- l’agente restituisce un oggetto (o JSON) del tipo:
title,dateRangerepos: [{ name, items: [{ title, url, type, impact, summary }] }]
Poi:
- un layer di integrazione lo renderizza su Slack (card + thread)
- lo stesso output può essere usato da una UI web, da Discord o da email
Questo evita di legare prompt e logica al trasporto: se cambi canale, non riscrivi l’agente.
3) Repo supportati: hardcoded nel prompt o in storage?
Per un prototipo, mettere la lista dei repository nel prompt (o in config) è spesso la scelta migliore.
Sì, potresti esternalizzare tutto (DB con tabella supported_repos, tool call per caricarli, UI di gestione…), ma:
- aggiungi roundtrip e complessità
- aumenti il costo in token e la superficie di errore
- stai costruendo un “prodotto di configurazione” prima di validare l’utilità
Regola pratica:
- config statica finché non fa male
- quando la lista cambia spesso o serve delegare la gestione a non-dev, allora ha senso esternalizzare
4) “Notizie” vs “rumore”: il filtro è più importante del riassunto
Se prendi l’attività GitHub “as-is”, l’agente ti restituisce un digest inutilizzabile:
- bump di dipendenze
- fix a CI
- rename di file
- chore e housekeeping
- commenti automatici di bot
Quindi la pipeline tipica diventa:
- Raccolta dati: PR, issue, discussion, RFC/proposals (dipende dal repo)
- Pre-filtri deterministici (prima dell’LLM):
- escludi label come
ci,chore,dependencies - escludi path noti (es.
.github/,scripts/ci/) - ignora autori bot
- limita la finestra temporale
- escludi label come
- Classificazione con LLM (solo sul candidato “pulito”):
- impatto: API / behavior change / perf / bugfix / tooling
- “importance score”
- Selezione: top-N per repo + eventuali “high impact” sempre inclusi
L’LLM dà il meglio quando:
- non deve “spazzare il pavimento”
- lavora su segnali già abbastanza puliti
5) Modello custom: dichiarare esplicitamente il contesto (context window)
Quando usi modelli “standard”, spesso il framework conosce già i limiti (token/context window). Con un modello custom o self-hosted, questa informazione può non essere disponibile automaticamente.
In quel caso è fondamentale:
- dichiarare la context size per permettere al runtime di gestire correttamente:
- quando compattare la conversazione
- quanta storia mantenere
- come evitare errori di overflow
Compaction: utile, ma da conoscere bene
Molti runtime gestiscono la compaction: quando si arriva vicino al limite del contesto (ad esempio al 90%), il sistema riassume parte della conversazione e sostituisce la storia con un summary.
È comodo, ma introduce trade-off:
- ogni compaction può perdere dettaglio
- un sistema “long running” compatta molte volte: l’errore si accumula
- si perdono spesso anche vantaggi di caching/contesto (dipende dall’implementazione)
Conclusione pratica: non progettare un agente che “vive per sempre” nello stesso contesto se non è necessario.
6) Quando usare sub-agent (e che differenza fa il sandbox)
Per evitare contesti enormi e ridurre il rischio di degradazione, conviene spezzare il lavoro:
- un “controller” pianifica
- sub-agent analizzano singoli repo o singole categorie (PR vs discussions)
Qui conta capire due modelli:
- Sub-agent dedicato: ambiente isolato (tools e contesto propri). Ideale quando vuoi separazione netta.
- Copia fresca dell’agente root: contesto nuovo ma stesso sandbox/tools. Utile quando vuoi mantenere artefatti e strumenti condivisi (ad esempio file temporanei o cache locale), ma ripartire con un prompt pulito.
È una distinzione che influisce su:
- riproducibilità
- costi token
- facilità di debugging
7) Scheduling: farlo ogni giorno senza trasformarlo in un sistema enorme
Un digest quotidiano è un job periodico. La scelta più semplice:
- cron (o scheduler della piattaforma di deploy)
- esecuzione server-side
- output inviato a Slack via API
La cosa importante è rendere l’esecuzione idempotente:
- calcola una
time windowchiara (es. ultime 24h in UTC, o “da ieri alle 09:00 CET”) - salva un marker (timestamp/last run) per evitare buchi o duplicazioni
8) Slack: messaggi coerenti, link utili, zero fronzoli
Una buona integrazione Slack non è “mandare un testo”, ma produrre un oggetto consultabile:
- titolo chiaro
- bullet point sintetici
- link diretti (PR, discussion, RFC)
- indicazione di impatto (breaking/behavior/perf)
La regola d’oro: ogni bullet deve rispondere a “perché mi interessa?”
Sintesi e implicazione pratica
Un news agent efficace non si misura dalla qualità “letteraria” del riassunto, ma da quanto bene:
- riduce rumore prima di chiamare il modello
- classifica e seleziona ciò che ha impatto reale (API, behavior, perf, bug)
- mantiene il contesto sotto controllo (compaction e sub-agent)
- separa output strutturato dal canale di pubblicazione
Se stai pensando di introdurre un agente simile nel tuo team, parti da un MVP: 3–6 repo, un digest al giorno, filtri deterministici aggressivi e un formato Slack ben progettato. Dopo una settimana avrai dati reali su cosa serve davvero automatizzare (e cosa sarebbe solo “burnare token”).