К содержимому

Документация

PHP SDK: Sources: входы процесса и сравнение цен

$ctx->sources() предназначен для сценария ежедневного процесса. Входы настраиваются заранее: список сайтов, проверенный почтовый адрес, метка в теме и допустимое время поступления. Платформа закрепляет конкретные прогоны и письмо до запуска.

input

input(string $key): array

Для входа типа records возвращает records, run_id, collected_at. Для входа mail возвращает проверенное письмо с текстом, темой, отправителем, сроком хранения и метаданными вложений.

$catalog = $ctx->sources()->input('catalog');
$mail = $ctx->sources()->input('supplier');
$ctx->log('В каталоге записей: '.count($catalog['records']));

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

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

document

document(string $key, string $id): Document

Читает безопасное вложение только из письма выбранного входа. Обработчик документов работает внутри системы. Содержимое вложения не передаётся внешней модели.

$mail = $ctx->sources()->input('supplier');
$attachment = $mail['attachments'][0];
$document = $ctx->sources()->document('supplier', $attachment['id']);
$ctx->log('Формат документа: '.$document->format());

Лимит чтения документов общий с documents() и mail()->document(): не более восьми в одном прогоне.

comparePrices

comparePrices(array $offers): array

Сравнивает от двух до десяти источников. Каждый источник содержит до 5000 записей с sku (строка), price (число до двух знаков после запятой) и currency (например, RUB). Артикулы сопоставляются точно. Разные валюты, отрицательные цены и повторяющиеся артикулы внутри одного источника отклоняются.

$rows = $ctx->sources()->comparePrices([
    'catalog' => [['sku' => '001', 'price' => 1250, 'currency' => 'RUB']],
    'supplier' => [['sku' => '001', 'price' => 1200, 'currency' => 'RUB']],
]);
foreach ($rows as $row) {
    $ctx->emit($row, $row['sku']);
}

Результат: sku, currency, prices, complete, best_source, best_price. Если товар отсутствует хотя бы в одном источнике, complete=false, победитель и минимальная цена остаются пустыми. При равной цене перечисляются все подходящие источники. Цена доставки, наличие и разные упаковки автоматически не учитываются: их нужно привести к сопоставимым условиям до сравнения.

compare

Внутренний класс PriceComparison исполняет тот же расчёт. В сценариях используйте sources()->comparePrices(). Сравнение выполняется обычным кодом и не расходует AI-токены.

Пробный запуск

Перед публикацией выполните обычный пробный прогон с параметром workflow_preview. Его входы содержат только ваши примеры: catalog: {type: "records", records: [...]} и supplier: {type: "mail", attachments: [{id: "sample", name: "prices.csv", content: "sku;price;currency\n001;1200;RUB"}]}. Для бинарного файла вместо content передайте base64. Готовый набор: resources/workflows/daily-prices.preview.json. Настоящие письма и записи из базы в пробном режиме недоступны. Успешный прогон с результатом позволяет опубликовать версию обычным способом. Генерация правила оплачивается как обычный AI-вызов, попадание в кэш не расходует AI-токены.