[ blog · use-case ]8 min read

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

Sarah ChoyОпубликовано 2 мая 2026 г.Обновлено 3 мая 2026 г.8 мин чтения
Утренний 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, использованные в статье

Sarah Choy
Автор
Sarah Choy
CEO, API Pick

Сара Чой — CEO API Pick. Пишет о продакшен-готовых API для AI-агентов и LLM-воркфлоу.