Утренний brief-агент на News Search API

Основатели, PM и аналитики хотят одного и того же в 8 утра: чистый дайджест того, что изменилось за ночь. С News Search API, LLM и cron-платформой это собирается за полдня.
Кратко
- •Архитектура: cron → News Search → URL Extract топовых стори → LLM-саммари → пост в Slack/email.
- •Свежесть через <code>start_date</code> = вчера; локаль через <code>country_code</code>.
- •Параллельно по теме; LLM мерджит и дедуплицирует.
- •Итог ≈ 15 кредитов/тема/день + LLM-токены. 5-темный бриф < $0.10/день по прайсу.
Форма полезного брифа
Утренний бриф-агент должен ответить на один вопрос: 'что за ночь изменилось из того, что мне надо знать?' Планка выше, чем кажется. Список заголовков провалится — это RSS, замьютят за неделю. Что выживает: 5-пунктовый дайджест со ссылками, сгруппированный по темам, в голосе пользователя.
Это раскладывается в маленький пайплайн:
- Получить свежие новости по N темам — News Search API.
- Извлечь тело ссылок, которые модель захочет процитировать — URL Extract API.
- Саммари + кластеризация вашим LLM.
- Опубликовать в Slack / email / Notion — ваш канал.
- Запланировать через cron — Vercel Cron, GitHub Actions, n8n и т. д.
Шаг 1: выбрать темы
3–6 тем достаточно. 12-темный бриф пролистают. Примеры:
- B2B SaaS-основатель: 'AI-раунды', 'новости OpenAI/Anthropic', 'движения конкурентов'.
- Финаналитик: 'FOMC и Treasury', 'цепочка полупроводников', 'конкретные тикеры'.
- Healthcare-PM: 'одобрения FDA', 'результаты клинических испытаний', 'изменения возмещений'.
Шаг 2: забрать сырой сигнал
По одному News Search-вызову на тему параллельно. Свежесть через start_date:
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])Каждый вызов возвращает до 5 ranked-заголовков (с num_results до 10). 3 темы = 3 × 15 = 45 кредитов/день, $0.045/день по тарифу $5 / 5 000. News API — не основной расход, доминируют LLM-токены.
Шаг 3: выборочно извлечь тело
Не нужны полные тексты всех новостей — только тех, что модель будет цитировать подробно. Эвристика: топ 2 на тему. На API Pick — один батч-вызов:
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()2 кредита за URL — extract на 3-темный бриф добавляет ~12 кредитов/день.
Шаг 4: промпт для саммари
Промпт задаёт 'голос' брифа. Стартовая точка:
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.Правило 'SKIP при низком сигнале' — самое окупаемое. Именно благодаря ему бриф не замьютят.
Шаг 5: публикация и расписание
Весь Python-cron укладывается в < 80 строк. Slack-публикация:
if briefing.strip() == "SKIP":
return
requests.post(
SLACK_WEBHOOK_URL,
json={"text": briefing, "username": "Morning Briefing", "icon_emoji": ":sunrise:"},
)Расписание: Vercel Cron (в vercel.json), GitHub Actions, AWS EventBridge, n8n. Запускайте в 7:45 вашего пояса — чтобы к 8:00 бриф уже ждал.
Без кода в n8n
- Schedule trigger — ежедневно, 7:45 пояс пользователя.
- HTTP Request-узлы (по одному на тему): POST
/api/search/news,start_date= вчера. - Merge объединяет темы.
- HTTP Request вызывает
/api/extractс топ-URL. - OpenAI / Anthropic — промпт саммари.
- If отфильтровывает SKIP.
- Slack публикует.
За чем следить в продакшене
- Дрейф темы. 'AI agents' через 6 месяцев становится слишком широким — индекс растёт, бриф должен оставаться конкретным. Подкручивайте query поквартально.
- Повторы между днями. Передавайте модели вчерашние URL с 'don't re-cover stories from this list'.
- Тихие выходные. SKIP уже это решает; не привязывайте ежедневный ритуал check-in к брифу.
Итерируйте, не fire-and-forget
Читайте бриф каждое утро неделю. Записывайте, где модель соврала, неправильно классифицировала или пропустила. Правьте промпт. Через неделю бриф становится привычкой — и вы построили работающий агент в ~80 строках кода и трёх API-вызовах.
Часто задаваемые вопросы
Почему не Google News или RSS-агрегатор?
Они работают — и оставляют скучную часть на вас: кластеризация, дедупликация, саммари, написание самого брифа. Агент решает это LLM. RSS даёт заголовки; агент даёт абзац о том, что важно, со ссылками.
Насколько свежа News Search API?
Индексирует крупные издания почти в реальном времени. Для брифа в 8 утра, покрывающего сутки, ставьте start_date на вчера. Для часовых ботов breaking-news — на сегодня и дедуп против прошлого запуска.
Что если бриф нечего сказать?
Заложите в промпт: 'If fewer than 3 substantive stories changed overnight, return SKIP.' Cron должен уважать SKIP и не постить слабый бриф. Бриф-усталость — самый быстрый путь к mute канала в Slack.
Можно ли без n8n?
Да. Тот же поток помещается в 30-строчный Python-скрипт с cron — пример ниже. n8n удобен для визуального дебага и интеграции со Slack, но необязателен.
Как избежать дублирования одной истории на разных темах?
Передайте модели URL предыдущих запросов того же запуска с инструкцией 'do not re-mention any URL already covered'. Или сделайте мульти-тематический поиск одной операцией и пусть модель распределит. Оба работают; второй дешевле.
API, использованные в статье
Сара Чой — CEO API Pick. Пишет о продакшен-готовых API для AI-агентов и LLM-воркфлоу.