|

Создаём агента для формирования сводок мониторинга по расписанию: 4 компонента и руководство по выбору интерфейсов

Создаём агента для формирования сводок мониторинга по расписанию: 4 компонента и руководство по выбору интерфейсов

Примечание автора: разберём четыре компонента Agent для мониторинга и подготовки сводок по расписанию, покажем, как отделить слой вызова модели от конкретного SDK с помощью OpenAI-совместимого интерфейса, и приведём рабочий пример на Python.

Недавно OpenRouter опубликовал руководство по созданию на TypeScript постоянно работающего AI Agent с помощью @openrouter/agent 0.11.0. Agent запускается по расписанию, следит за Hacker News и готовит сводки. Такой сценарий хорошо знаком многим командам: хочется каждое утро автоматически получать подборку отраслевых новостей, обновлений конкурентов или популярных тем из технических сообществ. Возьмём это руководство за отправную точку и разберём универсальную архитектуру Agent для мониторинга и подготовки сводок без привязки к конкретному SDK.

Это не пересказ того руководства. В оригинале опубликовано лишь краткое описание, поэтому мы не будем предполагать, как именно реализован Agent. Нас интересует более общий вопрос: из каких частей состоит Agent для мониторинга и подготовки сводок и как спроектировать слой вызова модели, чтобы в любой момент можно было сменить модель или поставщика.

Что вы получите: разобравшись со структурой из четырёх этапов — «запуск по расписанию, получение данных, подготовка сводки моделью, вывод результата», — вы сможете адаптировать под свои задачи готовую реализацию на Python на основе OpenAI-совместимого интерфейса.

scheduled-monitoring-summary-agent-architecture-ru-image-0


Главное об агенте для мониторинга и создания сводок

Для начала соберём основные выводы статьи в одной таблице. В следующих разделах разберём каждый пункт подробнее.

Ключевой момент Описание Польза
Структура из четырёх этапов Запуск по расписанию → получение данных → создание сводки моделью → вывод результата Каждый этап можно отдельно заменить и протестировать
Управление состоянием Сохраняем сведения об обработанных записях, чтобы не включать их в сводку повторно Меньше вызовов модели и чище результат
Независимый слой вызова модели Бизнес-логика работает с единым интерфейсом создания сводок и не зависит напрямую от SDK конкретного поставщика Для смены модели или поставщика достаточно изменить конфигурацию
Протокол, совместимый с OpenAI Единый формат Chat Completions лежит в основе слоя вызова моделей Зрелая экосистема с доступом к моделям разных поставщиков
Выбор модели под задачу Для создания сводок важны длина контекста, следование инструкциям, стабильность и стоимость Не приходится переплачивать за простые задачи

Четыре компонента агента для мониторинга и создания сводок

Так называемый «постоянно работающий агент» по сути представляет собой конвейер, который периодически запускается по таймеру. Ему не нужны сложные многошаговые рассуждения, зато стабильность критически важна: никто не будет постоянно следить за его работой. Разделение на четыре компонента с чёткими обязанностями — основа для надёжной работы в долгосрочной перспективе.

Компонент Задача Типичные реализации Особенности проектирования
Планировщик Запускает задачу через заданные интервалы cron, systemd timer, таймер облачной функции, запланированный CI-процесс, библиотека планирования внутри процесса Отделить запуск от бизнес-логики, предусмотреть повторный запуск при сбое
Загрузчик данных Получает новый контент из источников Публичные API, RSS, сбор данных с веб-страниц Задать таймаут, ограничить количество записей, сохранять ID уже обработанных записей
Модуль создания сводки Вызывает большую языковую модель для создания сводки Интерфейс Chat Completions Сокращать входные данные, использовать фиксированный промпт, задавать формат вывода
Модуль вывода Отправляет результат туда, где его увидят люди Электронная почта, Webhook бота в мессенджере, Markdown-файл, база данных Предусмотреть запасной вариант при сбое отправки, например сохранение на диск

Эти четыре компонента обмениваются простыми структурами данных: загрузчик выдаёт список записей, модуль создания сводки — её текст, а модуль вывода отправляет его дальше. Благодаря этому неполадки на любом этапе можно разбирать отдельно: если качество сводки оставляет желать лучшего, настраиваем соответствующий модуль; если не работает отправка — проверяем модуль вывода.

В первой версии многие помещают всю логику в один скрипт. Он работает, но поддерживать его сложно. Как только понадобится заменить Hacker News на GitHub Trending или перейти на модель другого поставщика, придётся переделывать значительную часть кода. Если же разделить систему на компоненты, для подключения нового источника достаточно добавить загрузчик, а для смены модели — изменить конфигурацию.

scheduled-monitoring-summary-agent-architecture-ru-image-1

Как выбрать способ запуска Agent для мониторинга и сводок по расписанию

Именно запуск по расписанию делает Agent «постоянно работающим». В руководстве OpenRouter для этого используется фоновый процесс, но при развёртывании есть и другие варианты. Выбор зависит от того, какая инфраструктура у вас уже есть.

Способ запуска Как работает Преимущества Что учесть
Системный cron Каждый раз запускает новый процесс, который завершается после выполнения Просто и надёжно, процесс не работает постоянно, память не накапливается Состояние нужно сохранять на диск, переменные окружения — настраивать отдельно
Планировщик внутри процесса Процесс работает постоянно и выполняет задачи по расписанию Удобно использовать общие соединения и кэш Нужно обеспечить восстановление после сбоя, например с помощью systemd или политики перезапуска контейнера
Таймер облачной функции Бессерверный запуск по расписанию Не нужно обслуживать сервер, оплата за вызовы Есть ограничение на время выполнения, состояние нужно хранить во внешнем хранилище
Рабочий процесс CI по расписанию Запускается на платформе CI по графику Не нужно платить за сервер, доступны логи Запуск может задерживаться, не подходит для частых задач

Для сводок, которые нужны раз в час или раз в день, системный cron и скрипт, завершающийся после выполнения, обычно дают лучшее соотношение простоты и затрат. Такой подход позволяет избежать роста потребления памяти постоянно работающим процессом, а после сбоя задача автоматически запустится в следующий раз. Постоянный процесс стоит выбирать, если нужен мониторинг с интервалом в несколько минут или требуется использовать ресурсоёмкие компоненты между запусками.


Как отделить слой вызова модели в Agent для сводок мониторинга

Это главная тема статьи. В руководстве OpenRouter используется собственный SDK @openrouter/agent — с ним удобно быстро начать работу. Но в доступных описаниях не сказано, поддерживает ли SDK собственные OpenAI-совместимые эндпоинты. Мы этого тоже не проверяли, поэтому не будем обсуждать подключение SDK к другим платформам.

Вместо этого пойдём другим путём: бизнес-код не будет напрямую зависеть от чьего-либо Agent SDK. Мы добавим между ними тонкий «интерфейс сводки». Бизнес-код вызывает только summarize(items), а интерфейс по настройкам определяет, какую модель и какой эндпоинт использовать.

Проектирование интерфейса слоя вызовов

При проектировании слоя вызовов стоит придерживаться трёх простых принципов. Они помогут избежать множества переделок в будущем:

  • Предоставлять только бизнес-интерфейс: наружу доступен summarize(items) -> str, а низкоуровневые параметры вроде messages и temperature скрыты от бизнес-кода.
  • Использовать единый протокол внутри: применять OpenAI-совместимый формат Chat Completions, а base_url, api_key и model считывать из переменных окружения.
  • Предусмотреть запасной вариант: при ошибке повторять вызов ограниченное число раз. Если все попытки не удались, выводить исходный список заголовков, чтобы за день всё равно был хотя бы один читаемый результат.

OpenAI-совместимый протокол выбран за основу, потому что он стал фактически универсальным форматом: официальный SDK и множество сторонних инструментов позволяют менять base_url. Если сервер поддерживает этот формат, переключение модели сводится к изменению одной строки конфигурации.

Выбор интерфейса Стоимость переключения модели Экосистема и инструменты Когда подходит
Привязка к специализированному Agent SDK При смене провайдера обычно нужно менять код Встроенные возможности SDK доступны из коробки Платформа выбрана надолго и важны встроенные функции
Официальный SDK OpenAI + совместимый эндпоинт Достаточно изменить base_url и model Самая зрелая экосистема и больше всего примеров Большинство задач по созданию сводок мониторинга
Собственная обёртка для HTTP-вызовов Достаточно изменить конфигурацию, но сопровождать код придётся самостоятельно Минимум зависимостей Среды, где размер зависимостей критичен

scheduled-monitoring-summary-agent-architecture-ru-image-2

При такой архитектуре агрегирующие платформы вроде APIYI можно использовать как один из вариантов для слоя вызова модели. APIYI совместим с форматом OpenAI API и поддерживает подключение через официальный SDK OpenAI. Для смены модели достаточно изменить её название. Для Agent, создающего сводки мониторинга, это означает, что можно сравнивать результаты разных моделей с одним API-ключом, не написав отдельный код подключения для каждого провайдера.

Что учитывать при выборе модели для сводок мониторинга

Подготовка сводок кажется простой задачей, но требования к модели сильно зависят от источников информации. У нас пока нет систематических тестов для таких задач, поэтому мы не будем утверждать, какая модель лучше. Вместо этого рассмотрим факторы, которые стоит взвесить при выборе.

Фактор Почему это важно Практический совет
Длина контекста За один раз модели приходится передавать десятки заголовков, а иногда и полные тексты Сначала сократите входные данные, затем выбирайте модель с подходящим контекстным окном
Следование инструкциям Для отправки и обработки сводок нужен фиксированный формат Запустите несколько проверок с одним и тем же промптом и посмотрите, насколько стабилен формат
Языковые способности По англоязычным источникам нужно готовить сводки на китайском Уделите особое внимание точности перевода профессиональных терминов
Стоимость вызовов Задачи по расписанию работают долго, и расходы накапливаются Делайте один вызов за каждый цикл, ограничивайте количество входных материалов и длину ответа
Стабильность сервиса Процесс работает без присмотра, поэтому сбой часто обнаруживается только на следующий день Настройте повторные попытки и запасной сценарий, а также держите резервную модель

💡 Совет по выбору: универсального ответа здесь нет. Надёжнее всего несколько дней сравнивать модели на ваших реальных источниках. Через APIYI apiyi.com можно переключаться между несколькими моделями-кандидатами, используя один и тот же код. Сравните стабильность формата и качество текста на китайском, а затем решите, какую модель использовать на постоянной основе.


Быстрый старт: агент для мониторинга и создания сводок

Реализуем минимальную рабочую версию на Python. В качестве источника данных используем публичный API Hacker News (hacker-news.firebaseio.com/v0) — как в руководстве по OpenRouter, чтобы примеры было проще сравнить.

Простой пример: сбор данных и создание сводки

Код ниже получает заголовки 10 популярных публикаций Hacker News и передаёт их модели, чтобы та составила сводку на китайском языке. Так можно проверить, работает ли вся цепочка:

import requests
import openai

client = openai.OpenAI(
    api_key="YOUR_API_KEY",
    base_url="https://api.apiyi.com/v1"  # OpenAI 兼容端点
)

HN = "https://hacker-news.firebaseio.com/v0"
ids = requests.get(f"{HN}/topstories.json", timeout=10).json()[:10]
titles = [requests.get(f"{HN}/item/{i}.json", timeout=10).json().get("title", "") for i in ids]

resp = client.chat.completions.create(
    model="gpt-4o-mini",  # 示例模型名,以平台模型列表为准
    messages=[{"role": "user", "content": "用中文分 3 点总结这些热帖的主题:\n" + "\n".join(titles)}]
)
print(resp.choices[0].message.content)

Этот код работает, но для постоянного запуска пока не подходит: в нём нет дедупликации и обработки ошибок, а модель и эндпоинт заданы напрямую. В полной версии ниже четыре компонента разделены и добавлено управление состоянием.

Посмотреть полный код реализации (четыре компонента + дедупликация + резервный режим)
import json
import os
import time
from pathlib import Path

import openai
import requests

HN = "https://hacker-news.firebaseio.com/v0"
STATE_FILE = Path(os.getenv("STATE_FILE", "seen_ids.json"))
TOP_N = int(os.getenv("TOP_N", "30"))


# ---------- 数据获取器 ----------
def fetch_new_stories(seen: set) -> list:
    ids = requests.get(f"{HN}/topstories.json", timeout=10).json()[:TOP_N]
    items = []
    for i in ids:
        if i in seen:
            continue
        item = requests.get(f"{HN}/item/{i}.json", timeout=10).json() or {}
        if item.get("title"):
            items.append({"id": i, "title": item["title"],
                          "url": item.get("url", ""), "score": item.get("score", 0)})
    return items


# ---------- 状态管理 ----------
def load_seen() -> set:
    return set(json.loads(STATE_FILE.read_text())) if STATE_FILE.exists() else set()

def save_seen(seen: set) -> None:
    STATE_FILE.write_text(json.dumps(sorted(seen)[-2000:]))  # 只保留最近的 ID


# ---------- 摘要器(模型调用层) ----------
class Summarizer:
    def __init__(self):
        self.client = openai.OpenAI(
            api_key=os.environ["LLM_API_KEY"],
            base_url=os.getenv("LLM_BASE_URL", "https://api.apiyi.com/v1"),
        )
        self.model = os.getenv("SUMMARY_MODEL", "gpt-4o-mini")

    def summarize(self, items: list, retries: int = 2) -> str:
        lines = "\n".join(f"- [{x['score']}] {x['title']}" for x in items)
        prompt = ("你是技术资讯编辑。请用中文把下面的 Hacker News 新热帖归纳为 3-5 个主题,"
                  "每个主题一句话,并列出最值得关注的 3 条标题。\n" + lines)
        for attempt in range(retries + 1):
            try:
                resp = self.client.chat.completions.create(
                    model=self.model,
                    messages=[{"role": "user", "content": prompt}],
                    max_tokens=800,
                )
                return resp.choices[0].message.content
            except Exception as e:
                print(f"摘要失败(第 {attempt + 1} 次):{e}")
                time.sleep(2 ** attempt)
        return "【模型暂不可用,以下为原始标题】\n" + lines  # 降级输出


# ---------- 输出器 ----------
def deliver(text: str) -> None:
    webhook = os.getenv("WEBHOOK_URL")
    if webhook:
        try:
            requests.post(webhook, json={"text": text}, timeout=10).raise_for_status()
            return
        except Exception as e:
            print(f"推送失败,改为落盘:{e}")
    Path(f"digest-{time.strftime('%Y%m%d-%H%M')}.md").write_text(text, encoding="utf-8")


# ---------- 一次运行(由定时器触发) ----------
def run_once() -> None:
    seen = load_seen()
    items = fetch_new_stories(seen)
    if not items:
        print("没有新条目,本轮跳过")
        return
    deliver(Summarizer().summarize(items))
    save_seen(seen | {x["id"] for x in items})


if __name__ == "__main__":
    run_once()

В полной версии стоит обратить внимание на несколько решений. Во-первых, Summarizer предоставляет только метод summarize, а имя модели, эндпоинт и API-ключ берёт из переменных окружения. Это и есть упомянутое ранее отделение слоя вызова модели. Во-вторых, в файле состояния хранится только последняя партия ID, чтобы он не разрастался при длительной работе. Наконец, если модель не отвечает, выводятся исходные заголовки, а если отправка не удалась, результат сохраняется в файл. Так после каждого запуска остаётся результат, к которому можно вернуться.

Запуск агента для сводок по расписанию

Скрипт работает по принципу «запустился и завершился», поэтому его можно напрямую передать системному cron. Конфигурация ниже запускает его дважды в день: в 8:00 и 20:00.

# crontab -e
0 8,20 * * * cd /opt/hn-digest && LLM_API_KEY=xxx SUMMARY_MODEL=gpt-4o-mini /usr/bin/python3 agent.py >> run.log 2>&1

Чтобы сравнить результаты другой модели, достаточно заменить имя модели в SUMMARY_MODEL — менять код не придётся. В продакшене лучше хранить ключ в файле .env или в сервисе управления секретами, а не записывать его прямо в crontab.

🚀 Совет для быстрого старта: сначала проверьте работу всей цепочки на минимальном примере, а затем переходите к полной версии и подключайте cron. APIYI apiyi.com предоставляет новым пользователям бесплатный тестовый лимит. Один API-ключ позволяет переключаться между моделями OpenAI, Claude, Gemini и другими — удобно для быстрого сравнения качества сводок на этапе прототипирования.

scheduled-monitoring-summary-agent-architecture-ru-image-3


Часто задаваемые вопросы (FAQ)

Q1: Что такое агент мониторинга и создания сводок, работающий по расписанию?

Это автоматизированная программа, которую таймер запускает через заданные промежутки времени. Она собирает новые материалы из источников, передаёт их большой языковой модели для создания сводки, а затем отправляет результат по электронной почте, в мессенджер или файл. В отличие от диалогового агента, он работает без присмотра в течение длительного времени, поэтому стабильность и устранение дубликатов важнее сложных рассуждений.

Q2: Чем специализированный SDK для агентов отличается от OpenAI-совместимого интерфейса?

Специализированный SDK обычно включает вызов инструментов, планирование и другие возможности. С ним проще начать, но код приложения оказывается привязан к платформе. OpenAI-совместимый интерфейс работает на более низком уровне: планирование и устранение дубликатов придётся реализовать самостоятельно. Зато для смены модели или поставщика услуг достаточно изменить конфигурацию. Для несложных задач создания сводок такая гибкость обычно полезнее.

Q3: Можно ли напрямую адаптировать руководство OpenRouter по @openrouter/agent для другой платформы?

В общедоступном описании сказано только, что в руководстве используется `@openrouter/agent` версии 0.11.0 для реализации на TypeScript. Поддерживает ли SDK пользовательские конечные точки, не указано; мы тоже это не проверяли. Если вы хотите сохранить возможность смены платформы, надёжнее взять из руководства идею сценария и реализовать её самостоятельно с помощью OpenAI-совместимого слоя вызовов, как в этой статье.

Q4: Для каких задач подходит агент мониторинга и создания сводок?

— **Ежедневная сводка популярных тем технических сообществ**: например, обзор тем Hacker News и технических форумов
— **Отслеживание обновлений конкурентов**: мониторинг блогов или журналов изменений конкурентов с созданием краткой сводки
— **Новости проектов с открытым исходным кодом**: обзор новых версий и важных Issue в интересующих репозиториях
— **Утренняя сводка отраслевых новостей**: сбор материалов из нескольких RSS-лент и ежедневная отправка краткого обзора на китайском языке

Q5: Как быстро вызвать модель через API для создания сводки?

Рекомендуем использовать агрегатор с поддержкой OpenAI-совместимого формата:

1. Зарегистрируйтесь на APIYI apiyi.com, чтобы получить API-ключ и бесплатный тестовый лимит
2. Установите для `base_url` в коде из этой статьи значение `https://api.apiyi.com/v1`
3. Переключайте модели через переменную окружения `SUMMARY_MODEL` и сравнивайте качество сводок

Q6: Как контролировать расходы на вызовы при длительной работе?

Главное — обрабатывать только новые данные и вызывать модель один раз за цикл. Используйте файл состояния для фильтрации уже просмотренных записей, ограничьте число записей на входе и значение `max_tokens`, а частоту запусков настройте под свои задачи. Цены на модели могут заметно отличаться. Сравните их на странице цен APIYI apiyi.com и выберите более экономичную модель для такой несложной задачи, как создание сводок.

Q7: Какие известные ограничения есть у агента мониторинга и создания сводок?

— **Заголовки не дают полной картины**: по одному заголовку или краткому описанию можно неверно оценить содержание. При необходимости можно загрузить полный текст, но стоит учитывать длину входных данных и правила доступа к источнику
— **Модель может выдумывать детали**: в промпте нужно требовать, чтобы она опиралась только на предоставленные материалы, а для ключевых выводов сохраняла ссылки на оригиналы
— **Источники меняются**: изменение формата API или ограничений частоты запросов может привести к сбоям при загрузке данных, поэтому нужно следить за логами


Главное об агенте для мониторинга и создания сводок

  • Структура из четырёх этапов: запуск по расписанию, получение данных, создание сводки моделью и вывод результата независимы друг от друга, поэтому их проще заменять и отлаживать
  • Завершение после выполнения надёжнее: для нечастых задач по созданию сводок cron и одноразовый скрипт удобнее постоянно работающего процесса
  • Качество зависит от состояния: сохраняйте ID уже обработанных материалов и на каждом запуске обрабатывайте только новые — это избавит от повторов и лишних расходов
  • Слой вызова нужно отделить от бизнес-логики: код приложения зависит только от интерфейса summarize, а модель, конечная точка и API-ключ задаются в конфигурации
  • Используйте совместимый протокол: формат, совместимый с OpenAI, позволяет сменить модель, изменив одну переменную окружения
  • Выбирайте модель на практике: сравнивайте контекстное окно, следование инструкциям, качество работы с языком, стоимость и стабильность. На APIYI apiyi.com модели можно переключать и проверять с одним и тем же кодом
  • Предусмотрите запасной вариант при сбоях: если модель не ответила, выводите исходные заголовки; если не удалось отправить результат, сохраняйте его на диск

Итоги

При создании агента, который по расписанию готовит сводку мониторинга, главное — не сложность фреймворка, а чёткое разделение структуры:

  1. Разделение на компоненты: запуск, получение данных, подготовка сводки и вывод результата связаны простыми структурами данных. Каждый компонент можно тестировать отдельно
  2. Независимость интерфейсов: тонкий интерфейс для подготовки сводки изолирует конкретный SDK, а на нижнем уровне используется протокол, совместимый с OpenAI
  3. Стабильность прежде всего: дедупликация, повторные попытки и резервные варианты — обязательные элементы задач, работающих без присмотра

Руководство OpenRouter по работе с Hacker News — хороший пример сценария. А универсальная архитектура из этой статьи позволяет применить тот же подход к любому источнику информации и любой модели. Для начала запустите минимальный пример, затем подключите cron и дайте системе поработать несколько дней. Оценив качество сводок, вы сможете выбрать модель для постоянного использования.

Для быстрой проверки рекомендуем APIYI apiyi.com: один API-ключ позволяет переключаться между популярными моделями. Новым пользователям также доступен бесплатный лимит для сравнительного тестирования на этапе прототипирования.


📚 Полезные материалы

  1. Краткое содержание руководства OpenRouter: создание постоянно работающего AI-агента для мониторинга Hacker News с помощью Agent SDK
  2. Ссылка: aihot.news/items/upl3hjjdokqe13w3ieo9opr0v
  3. Описание: материал, послуживший отправной точкой для этой статьи. В нём рассказывается, как создать на TypeScript агента, работающего по расписанию, с помощью @openrouter/agent 0.11.0

  4. Официальный API Hacker News: открытый интерфейс для чтения данных

  5. Ссылка: github.com/HackerNews/API
  6. Описание: документация источника данных для примера в статье, включая описание полей эндпоинтов topstories, item и других

  7. OpenAI Python SDK: официальная клиентская библиотека

  8. Ссылка: github.com/openai/openai-python
  9. Описание: руководство по подключению к совместимым эндпоинтам через параметр base_url

Автор: техническая команда APIYI
Технические вопросы: свяжитесь с нами через главную страницу сайта APIYI. Дополнительные материалы по подключению доступны в центре документации docs.apiyi.com

Читайте также

Похожие записи