Budowa agenta porannego briefingu z News Search API

Każdy founder, PM i analityk chce o 8 rano tego samego: czytelnego streszczenia tego, co zmieniło się w nocy. Z News Search API, LLM-em i platformą cron przez HTTP zbudujesz go w jedno popołudnie.
TL;DR
- •Architektura: cron → News Search → URL Extract dla obiecujących artykułów → streszczenie LLM → publikacja na Slacku/e-mail.
- •Świeżość dostrajaj przez <code>start_date</code> = dziś − 1; locale dostrajaj przez <code>country_code</code>.
- •Podziel briefing tematycznie równoległymi zapytaniami News Search; LLM scala i usuwa duplikaty.
- •Łączny koszt to ~15 kredytów na temat dziennie, plus tokeny LLM. Briefing 5-tematowy to < $0,10/dzień w cenie katalogowej.
Kształt użytecznego briefingu
Agent porannego briefingu powinien odpowiadać na jedno pytanie: 'co zmieniło się w nocy, o czym muszę wiedzieć?' Poprzeczka jest wyżej, niż się wydaje. Wysyp nagłówków zawodzi — to to samo co RSS i zostaje wyciszony w tydzień. Tym, co przetrwa, jest 5-punktowy digest z linkami, uporządkowany tematycznie, w głosie użytkownika.
To rozkłada się na mały pipeline:
- Pobierz najnowsze wiadomości w N tematach — News Search API.
- Wyodrębnij treść każdego linku, który model chce zacytować — URL Extract API.
- Streść + sklastruj za pomocą LLM — model wedle wyboru.
- Opublikuj na Slacku / e-mail / Notion — twój istniejący kanał komunikacji.
- Zaplanuj przez cron — Vercel Cron, GitHub Actions, n8n itd.
Krok 1: wybierz tematy
Trzymaj się 3–6 tematów. Briefingi z 12 tematami są przewijane bez czytania. Przykłady:
- Dla foundera SaaS B2B: 'rundy finansowania AI', 'wiadomości OpenAI / Anthropic', 'ruchy konkurencji'.
- Dla analityka finansowego: 'FOMC i Treasury', 'łańcuch dostaw półprzewodników', 'konkretne tickery'.
- Dla PM-a w healthcare: 'zatwierdzenia FDA', 'wyniki badań klinicznych', 'zmiany w refundacji'.
Krok 2: pobierz surowy sygnał
Uruchom jedno wywołanie News Search na temat, równolegle. Użyj start_date, by ograniczyć świeżość:
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])Każde wywołanie zwraca do 5 uszeregowanych nagłówków (maks. 10 z num_results). Dla briefingu 3-tematowego to 3 × 15 = 45 kredytów na uruchomienie. Przy stawce $5 / 5000 kredytów, $0,045/dzień. W dziennym koszcie dominuje LLM, nie News API.
Krok 3: wyodrębniaj treści selektywnie
Nie potrzebujesz pełnej treści każdego artykułu — tylko tych, które model chce zacytować szczegółowo. Prosta heurystyka: wyodrębnij 2 najlepsze artykuły na temat. W API Pick to jedno wywołanie wsadowe:
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()Przy 2 kredytach za URL krok ekstrakcji dokłada ~12 kredytów/dzień dla briefingu 3-tematowego.
Krok 4: prompt streszczający
To w prompcie żyje głos briefingu. Punkt wyjścia:
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.Instrukcja 'SKIP przy niskim sygnale' to pojedyncza reguła o największej dźwigni. To dlatego twój briefing nie zostanie wyciszony.
Krok 5: publikuj i planuj
Dla crona w Pythonie cały skrypt ma < 80 linii. Publikacja na Slacku:
if briefing.strip() == "SKIP":
return
requests.post(
SLACK_WEBHOOK_URL,
json={"text": briefing, "username": "Morning Briefing", "icon_emoji": ":sunrise:"},
)Zaplanuj przez Vercel Cron (w vercel.json), GitHub Actions, AWS EventBridge lub n8n. Uruchamiaj o 7:45 w twojej strefie czasowej — chodzi o to, by czekał, gdy siadasz do pracy o 8.
Zrobienie tego w n8n, jeśli wolisz no-code
- Schedule trigger — codziennie, 7:45 w strefie użytkownika.
- Węzły HTTP Request (po jednym na temat), POST
/api/search/newszstart_datez wczoraj. - Węzeł Merge łączy wyniki tematów.
- Węzeł HTTP Request wywołuje
/api/extractz najlepszymi URL-ami. - Węzeł OpenAI / Anthropic uruchamia prompt streszczający.
- Węzeł If sprawdza, że wynik to nie SKIP.
- Węzeł Slack publikuje briefing.
Na co uważać na produkcji
- Dryf tematu. 'AI agents' po 6 miesiącach robi się zbyt szerokie — indeks API rośnie; twój briefing musi pozostać konkretny. Zacieśniaj zapytania co kwartał.
- Powtórzenia między dniami. Przekaż modelowi URL-e z poprzedniego dnia z 'don't re-cover stories from this list', jeśli ten sam artykuł wciąż się pojawia.
- Ciche weekendy. Reguła SKIP już to obsługuje; po prostu nie przywiązuj swojego nawyku codziennego przeglądu do briefingu.
Iteruj, nie wdrażaj-i-zapominaj
Czytaj briefing co rano przez tydzień. Notuj, gdzie model skłamał, źle skategoryzował lub coś przeoczył. Aktualizuj prompt. Po tygodniu iteracji briefing staje się nawykiem — a ty zbudowałeś działającego agenta z około 80 liniami kodu i trzema wywołaniami API.
Najczęściej zadawane pytania
Czemu nie użyć po prostu Google News albo agregatora RSS?
Oba działają — i oba zostawiają ci nudną część: klastrowanie, deduplikację, streszczanie i napisanie właściwego briefingu. Agent robi tę część za pomocą LLM. RSS daje ci nagłówki; agent daje akapit, który mówi, co się liczy, i linkuje do źródeł.
Jak świeże jest News Search API?
API indeksuje duże media niemal w czasie rzeczywistym. Dla briefingu o 8 rano obejmującego poprzednie 24 godziny ustaw start_date na wczoraj. Dla botów wiadomości na żywo działających co godzinę ustaw start_date na dziś i uruchom agenta ponownie z deduplikacją względem poprzedniego uruchomienia.
Co jeśli briefing nie ma nic nowego do powiedzenia?
Wpisz to w prompt: 'If fewer than 3 substantive stories changed overnight, return SKIP.' Twój cron job powinien respektować SKIP i nie publikować briefingu o niskim sygnale. Zmęczenie briefingiem to najszybsza droga do wyciszenia kanału na Slacku.
Czy mogę to uruchomić bez n8n?
Tak. Ten sam przepływ działa jako 30-liniowy skrypt w Pythonie na cronie — patrz przykład poniżej. n8n jest wygodny do wizualnego debugowania i integracji ze Slackiem, ale nie jest wymagany.
Jak zapobiec streszczaniu tego samego artykułu w kilku tematach?
Przekaż modelowi adresy URL z poprzednich zapytań w tym samym uruchomieniu z instrukcją: 'do not re-mention any URL already covered.' Albo uruchom jedno wyszukiwanie wielotematyczne i pozwól modelowi podzielić materiał. Oba działają; drugie jest tańsze.
API użyte w tym artykule
Sarah Choy jest CEO API Pick. Pisze o budowaniu produkcyjnych API dla agentów AI i przepływów pracy z LLM.