[ blog · use-case ]8 min read

Budowa agenta porannego briefingu z News Search API

Sarah ChoyOpublikowano 2 maja 20268 min czytania
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 &lt; $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/news z start_date z wczoraj.
  • Węzeł Merge łączy wyniki tematów.
  • Węzeł HTTP Request wywołuje /api/extract z 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
Autor
Sarah Choy
CEO, API Pick

Sarah Choy jest CEO API Pick. Pisze o budowaniu produkcyjnych API dla agentów AI i przepływów pracy z LLM.