Наша собственная статистика посещений включена всегда. Google Analytics помогает нам понять, как пользуются нашими публичными страницами (но не вашим рабочим пространством после входа), и включается только с вашего разрешения. См. нашу политику конфиденциальности.

Snowflake Cortex Agents MCP: как загрузить жалобы из соцсетей рядом с данными о возвратах

Коннекторы MCP в Snowflake принимают только OAuth. Примеры конфигурации внешнего доступа и оценка месячных расходов по итогам 12 вызовов API (отзывы Amazon получить не удалось).

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

Возвраты входят в число крупнейших скрытых расходов в потребительской рознице. По оценке Национальной федерации розничной торговли США (NRF), в 2025 году американские покупатели должны были вернуть товары примерно на $849,9 млрд. Это 15,8% объёма продаж, а для онлайн-покупок доля возвратов составляет 19,3% (пресс-релиз NRF). Большинство брендов уже загружают данные о продажах и возвратах в хранилище данных. Гораздо меньше брендов загружают то, что покупатели публично пишут о товаре. В этой статье мы связываем эти данные внутри Snowflake.

Поводом стала конференция Snowflake Expedition 2026. 3 ноября 2026 года Snowflake представила CoWork (новое название Snowflake Intelligence) и новые возможности Cortex Agents (пресс-релиз). Наше внимание привлекли MCP-коннекторы. С ними агент может вызывать инструменты на внешнем MCP-сервере (документация по MCP-коннекторам). Команда бренда сразу увидит, как это использовать: поместить отзывы Amazon, публикации Reddit и комментарии TikTok рядом с таблицами продаж и возвратов. Затем можно спросить агента, жалобы какого типа учащаются одновременно с ростом доли возвратов.

Работу с данными мы проверили на практике. 2026-11-06 с 00:16 до 00:36 по сингапурскому времени (SGT) мы сделали 12 вызовов API EveryInfra. Все запросы и ответы мы сохранили. Часть статьи про Snowflake состоит только из примеров конфигурации. На этом компьютере нет аккаунта Snowflake, поэтому SQL, процедуры и агента мы не запускали. Все факты о Snowflake взяты с snowflake.com или docs.snowflake.com, даты обращения указаны в разделе «Источники».

Коротко: подключить MCP-сервер EveryInfra как коннектор MCP в Snowflake сейчас нельзя.

Snowflake поддерживает только OAuth и требует определённого способа регистрации клиента, которого наш сервер пока не предлагает. Но даже с OAuth коннектор не решил бы эту задачу, потому что результаты коннектора остаются внутри одного чата и не попадают в таблицу. Рабочий вариант — интеграция внешнего доступа (external access integration) в Snowflake. Хранимая процедура на Python по расписанию вызывает API и записывает отзывы в таблицы. Затем Cortex Agent объединяет эти таблицы с данными о продажах и возвратах. Учтите, чего в этой статье нет. В ту ночь вызовы API для получения отзывов Amazon не вернули данных, а данных о возвратах у нас нет. Поэтому вы получите план реализации и оценку расходов, а не вывод о том, какая жалоба приводит к возвратам. У EveryInfra нет партнёрства со Snowflake. Все факты о Snowflake здесь взяты из публичной документации и пресс-релизов компании.

Иллюстрация: слева запертая дверь, перед ней ключ, который не подходит к замку. Справа открыта бирюзовая боковая калитка. Через неё проходит конвейерная лента и везёт стопку пустых карточек отзывов в стеклянный куб-хранилище.
Для двери коннектора MCP нужен зарегистрированный OAuth-клиент, и API-ключ к ней не подходит. Боковая калитка внешнего доступа открыта для одного фиксированного хоста и переносит данные прямо в таблицы.

Что Snowflake представила на Expedition 2026: Snowflake CoWork и Cortex Agents

Главным продуктом мероприятия стал Snowflake CoWork. В пресс-релизе он описан как рабочее пространство с агентами для бизнес-пользователей на ai.snowflake.com. Cortex Code, или CoCo, дополняет его как инструмент для разработчиков и дата-инженеров (пресс-релиз Expedition 2026, страница продукта CoWork).

Во втором пресс-релизе в тот же день анонсировали Business Ontology и Cortex AI Gateway. Business Ontology хранит утверждённые значения бизнес-терминов и передаёт эти определения агентам. Cortex AI Gateway управляет тем, как агенты обращаются к моделям, вызывают инструменты и выполняют действия в корпоративных системах (пресс-релиз о Business Ontology и AI Gateway). Оба продукта важны для вопроса, который мы рассмотрим ниже. У термина вроде «доля возвратов» должна быть одна согласованная формула, иначе два агента дадут два разных ответа.

В этой статье люди задают вопросы в CoWork, а работу выполняют Cortex Agents.

Каждый ассистент CoWork представляет собой объект Cortex Agent. В спецификации агента указаны его модель, инструкции и инструменты. Среди инструментов есть Cortex Analyst для SQL-запросов к семантическим представлениям и Cortex Search для поиска по тексту. Также доступны выполнение кода, пользовательские инструменты, MCP-коннекторы и веб-поиск («Cortex Agents overview», «Create and manage agents»). Поэтому качество ответа зависит в основном от таблиц и семантического представления. Агент превращает вопрос в SQL и объясняет результат.

В таблице ниже показан статус двух функций, важных для этой задачи, по состоянию на 2026-11-06. «Не указан» означает, что ни в документации, ни в пресс-релизе статус не назван.

ФункцияСтатус на 2026-11-06Источник
CoWork AutomationsНе указаноДокументация по Automations
MCP-коннекторы Cortex AgentsВ документации статус не указан, только OAuthДокументация по коннекторам

В посте о CoWork также упоминается аналитический поиск, который пока находится на этапе предварительного доступа (preview). Его пример близок к нашему: какие проблемы клиентов чаще всего возникали в прошлом месяце (блог CoWork). Ограничения и правила доступа Automations описаны ниже, в разделе о еженедельной рассылке.

Аналитический поиск работает с документами, которые уже хранятся в Snowflake. Он сужает выборку с помощью Cortex Search, а затем считает и сравнивает с помощью AI-функций и SQL. В нашей задаче есть ещё один шаг. Мнения клиентов находятся на Amazon, Reddit и TikTok, за пределами хранилища. Поэтому сначала их нужно по расписанию загружать в Snowflake в формате, позволяющем объединить их с данными о продажах и возвратах товаров.

Можно ли подключить Snowflake Cortex Agents к EveryInfra напрямую через MCP?

Это первое, что приходит в голову. У EveryInfra уже есть удалённый MCP-сервер (MCP-сервер EveryInfra). Cortex Agents теперь умеют вызывать внешние MCP-серверы. Почему бы просто не вставить адрес сервера в Snowflake? Мы пункт за пунктом сравнили требования Snowflake с возможностями нашего сервера. Ответ — нет: препятствием оказался способ регистрации OAuth-клиента.

Документация Snowflake говорит об этом прямо: для подключения к MCP-серверам Snowflake поддерживает только OAuth. Администратор создаёт объект API integration с API_PROVIDER = external_mcp, в котором хранятся настройки OAuth. Затем администратор создаёт объект external MCP server, который ссылается на эту интеграцию (документация по MCP-коннекторам). Заполнить настройки OAuth можно двумя способами.

Первый способ — стандартный OAuth. Вы регистрируете приложение на удалённом сервере авторизации и получаете идентификатор клиента (client ID). У клиента может быть секрет; также это может быть публичный клиент без секрета.

Для этого приложения также нужно зарегистрировать URL обратного вызова https://identity.snowflake.com/oauth2/callback. Второй способ — динамическая регистрация клиента, при которой Snowflake самостоятельно запрашивает у удалённого сервера идентификатор клиента. Для этого удалённый сервер должен реализовывать RFC 7591 (RFC 7591). Готовые коннекторы есть для Atlassian, GitHub, Glean, Linear и Salesforce, причём в примере с Atlassian используется динамическая регистрация.

Скриншот страницы документации Snowflake о MCP-коннекторах, раздел «Key considerations and best practices». Бирюзовыми рамками отмечены две строки: «Custom MCP servers», где сказано использовать пользовательские серверы для MCP-эндпоинтов, которых нет в списке доступных коннекторов, и «OAuth authentication», где сказано, что для подключения к MCP-серверам Snowflake поддерживает только OAuth.
Скриншот документации Snowflake по MCP-коннекторам; дата обращения: 2026-11-06 по сингапурскому времени. Бирюзовые рамки добавлены нами. docs.snowflake.com, «Cortex Agents MCP connectors»

У EveryInfra два MCP-адреса. Основной, https://api.everyinfra.com/mcp, использует API-ключ в заголовке Bearer. В 00:43 SGT 2026-11-06 мы запросили у него метаданные защищённого ресурса и метаданные сервера авторизации. Оба запроса вернули 404, значит, этот адрес не поддерживает OAuth discovery. Полный адрес, https://api.everyinfra.com/mcp/all, ведёт себя иначе. В ту же минуту запрос к нему без учётных данных вернул 401 с заголовком WWW-Authenticate.

Этот заголовок указывает на метаданные ресурса в формате RFC 9728, а в метаданных сервером авторизации указан auth.everyinfra.com/oidc (RFC 9728). Затем мы прочитали метаданные сервера авторизации, которые соответствуют RFC 8414 (RFC 8414). Сервер поддерживает PKCE с S256 и публичные клиенты без секрета. Но значение registration_endpoint пустое, то есть динамической регистрации нет. В нашей публичной документации также нет страницы, где пользователь мог бы самостоятельно зарегистрировать OAuth-клиент.

Что требуется SnowflakeEveryInfra `/mcp` (API-ключ)EveryInfra `/mcp/all` (проверено в 00:43 SGT, 2026-11-06)
Только OAuthНет, используется API-ключ в заголовке BearerДа, 401 с метаданными RFC 9728
Динамическая регистрация клиента (RFC 7591)НеприменимоНет, в метаданных нет эндпоинта регистрации
Стандартный OAuth с зарегистрированным клиентом и URL обратного вызоваНеприменимоВ публичной документации нет возможности самостоятельной регистрации
Поддерживаются только инструменты (tools)Да, все возможности реализованы как MCP-инструментыДа
Имя хоста без символов подчёркиванияДаДа

Сама спецификация MCP не требует OAuth. В версии 2025-06-18 сказано, что авторизация необязательна. Если сервер её поддерживает, он обязан публиковать метаданные RFC 9728 и RFC 8414, а динамическая регистрация отнесена к уровню «should», не «must» («MCP authorization, 2025-06-18»). Значит, сервер с API-ключом соответствует спецификации, и клиент, который работает только с OAuth, тоже ей соответствует. Просто они несовместимы друг с другом.

Для внешних MCP-серверов в Snowflake есть ещё один вариант. Cortex AI Gateway позволяет администратору добавить пользовательский MCP-сервер. Его документация тоже требует OAuth, URL, оканчивающийся на /mcp, и роль ACCOUNTADMIN (AI Gateway custom apps). Наш OAuth-адрес оканчивается на /mcp/all, а адрес, оканчивающийся на /mcp, принимает только ключ. Ни один из адресов не соответствует обоим условиям.

Допустим, проблема с регистрацией исчезнет. Коннектор всё равно не подошёл бы для этой задачи. Каждый пользователь нажимает кнопку «Connect» в CoWork, входит в систему на странице удалённого сервиса и подтверждает доступ. После этого агент вызывает удалённые инструменты во время чата, и результаты остаются в этом чате (Use MCP connectors in Snowflake CoWork). Каждому, кто задаёт вопросы, нужен собственный аккаунт EveryInfra. Важнее другое: ни один отзыв не попадает в таблицу, поэтому агент не может объединить отзывы за три месяца с возвратами за те же три месяца.

Для вопроса о трендах нужна история, а история хранится в таблицах. Коннекторы подходят для вопросов другого типа, например «о чём люди спорят под этим видео прямо сейчас». Такой вопрос разовый и не требует хранения данных.

Мы нашли четыре способа связать Snowflake с внешним API данных. В таблице они сравниваются по двум критериям: попадают ли данные в таблицу и требует ли способ OAuth.

СпособДанные попадают в таблицуНужен OAuthДля чего подходитИсточник
MCP-коннектор (объект external MCP server)Нет, только в чатеДаРазовые вопросыДокументация по коннекторам
Интеграция внешнего доступа, хранимая процедура и задачаДаНет, ключ хранится в секретеЕжедневные загрузки, наш выборВнешний сетевой доступ
Сборщик вне Snowflake, затем SnowpipeДаНетКоманды, которые уже используют сборщики данныхSnowpipe
Внешний MCP-сервер в Cortex Code Agent SDKНет, если только ваш код не записывает данные обратноНет, заголовки разрешеныРазработчики, которые тестируют в кодеПользовательские инструменты Agent SDK

В четвёртом способе инструмент разработчика Snowflake позволяет передать API-ключ в заголовке запроса (документация Agent SDK). Этот способ работает в коде разработчика, а не в бизнес-интерфейсе CoWork. Дальше в статье разбирается второй способ: он по расписанию записывает данные в таблицы при стандартном контроле доступа Snowflake.

Рабочий способ: внешний доступ и хранимая процедура (пример конфигурации)

Весь процесс умещается на одной схеме. API EveryInfra собирает публичные отзывы и комментарии с Amazon, Reddit и TikTok. Внутри Snowflake задача по расписанию раз в день вызывает хранимую процедуру. Процедура обращается к API через интеграцию внешнего доступа, сохраняет каждый сырой ответ, а затем разворачивает его в таблицы отзывов. Ваши собственные данные о продажах и отчёт о возвратах Amazon FBA загружаются ещё в две таблицы, как и сейчас. Поверх них работают семантическое представление и Cortex Agent, а бизнес-пользователи задают вопросы в CoWork.

Анимированная схема из пяти этапов слева направо. Первый этап — API EveryInfra, под ним перечислены amazon/reviews, reddit/search и tiktok/comments. Второй этап — интеграция внешнего доступа Snowflake с правилом, которое разрешает только api.everyinfra.com, и секретом, в котором хранится ключ. Третий этап — две задачи по расписанию: одна отправляет асинхронные запросы, другая собирает результаты. Четвёртый этап — четыре таблицы: отзывы, упоминания в соцсетях, продажи и возвраты. Пятый этап — семантическое представление и Cortex Agent рядом с облачком чата, в котором спрашивается, какая тема жалоб растёт вместе с долей возвратов. По стрелкам движутся небольшие бирюзовые точки.

Интеграция внешнего доступа — стандартный механизм Snowflake, который позволяет процедурам и функциям обращаться к интернету. Для этого нужны три объекта. Сетевое правило перечисляет хосты и порты, к которым может обращаться код. Секрет хранит учётные данные. Интеграция связывает правило и секрет. Доступ к интеграции предоставляют определённым ролям (обзор внешнего сетевого доступа, создание и использование интеграции внешнего доступа).

Наше правило разрешает только api.everyinfra.com. Даже если кто-то изменит код процедуры, она не сможет обратиться к другому хосту. Ключ хранится в объекте секрета, поэтому в коде его никогда нет в открытом виде. Роль, которая запускает процедуру, тоже не может его прочитать. В примере ниже voc — имя базы данных. Оно расшифровывается как «voice of the customer» («голос клиента»).

sql
-- 1. Allow outbound traffic to one host only
CREATE OR REPLACE NETWORK RULE voc.raw.everyinfra_egress
  MODE = EGRESS
  TYPE = HOST_PORT
  VALUE_LIST = ('api.everyinfra.com');

-- 2. Store the API key. Create a separate key in the EveryInfra console
--    and give it its own per-minute call limit.
CREATE OR REPLACE SECRET voc.raw.everyinfra_key
  TYPE = GENERIC_STRING
  SECRET_STRING = '<EveryInfra API key>';

-- 3. Tie the rule and the secret together
CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION everyinfra_access
  ALLOWED_NETWORK_RULES = (voc.raw.everyinfra_egress)
  ALLOWED_AUTHENTICATION_SECRETS = (voc.raw.everyinfra_key)
  ENABLED = TRUE;

-- 4. Grant it only to the loading role
GRANT USAGE ON INTEGRATION everyinfra_access TO ROLE voc_loader;
GRANT READ ON SECRET voc.raw.everyinfra_key TO ROLE voc_loader;

Синтаксис соответствует справочнику Snowflake SQL (CREATE NETWORK RULE, CREATE SECRET, CREATE EXTERNAL ACCESS INTEGRATION). Для создания интеграции требуется привилегия уровня учётной записи, поэтому обычно администратор создаёт её один раз. После этого роли, которая загружает данные, нужны только право на использование интеграции и право на чтение секрета. На странице примеров Snowflake приведены полные примеры процедур, которые обращаются к внешним API с использованием секрета (примеры внешнего сетевого доступа).

При проектировании процедуры нужно принять одно решение, от которого зависят расходы: дожидаться каждого результата или отправлять запросы и забирать результаты позже. API EveryInfra поддерживает оба режима.

Синхронный вызов оставляет соединение открытым, пока не придут данные. В нашем тесте при самом медленном вызове API для отзывов Amazon соединение оставалось открытым 67 секунд. При асинхронном вызове в тело запроса добавляется "mode": "async". API примерно через две секунды возвращает HTTP-статус 202 и ID задания. Позже результат можно получить запросом GET /api/v1/jobs/{job_id} (документация).

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

В таблице перечислены все объекты Snowflake в этой настройке, их назначение и то, кто обычно их создаёт.

ОбъектНазначениеКто обычно создаёт
Сетевое правило everyinfra_egressРазрешает исходящий трафик к одному хостуАдминистратор аккаунта
Секрет everyinfra_keyХранит API-ключ EveryInfraАдминистратор аккаунта
Интеграция внешнего доступа everyinfra_accessСвязывает правило и секретАдминистратор аккаунта
Процедура submit_pullsОтправляет асинхронные задания для каждой записи в списке отслеживанияДата-инженер
Процедура collect_resultsСобирает завершённые задания в таблицы сырых данныхДата-инженер
Задачи t_submit и t_collectЗапускают обе процедуры по расписаниюДата-инженер
Семантическое представление voc_returnsОпределяет темы, недели и метрики возвратовИнженер-аналитик
Агент с VocAnalystОтвечает на вопросы в CoWorkИнженер-аналитик
sql
CREATE OR REPLACE PROCEDURE voc.raw.submit_pulls()
  RETURNS VARIANT
  LANGUAGE PYTHON
  RUNTIME_VERSION = '3.11'
  PACKAGES = ('snowflake-snowpark-python', 'requests')
  HANDLER = 'run'
  EXTERNAL_ACCESS_INTEGRATIONS = (everyinfra_access)
  SECRETS = ('ei' = voc.raw.everyinfra_key)
AS
$$
import json, requests, _snowflake

API = "https://api.everyinfra.com/api/v1/social"

def run(session):
    key = _snowflake.get_generic_secret_string("ei")
    headers = {"Authorization": f"Bearer {key}", "Content-Type": "application/json"}
    # watchlist: one row per product URL, video URL or search keyword
    rows = session.sql(
        "SELECT watch_id, platform, action, params FROM voc.raw.watchlist WHERE active"
    ).collect()
    submitted = 0
    for r in rows:
        body = {"platform": r["PLATFORM"], "action": r["ACTION"],
                "params": json.loads(r["PARAMS"]), "mode": "async"}
        resp = requests.post(API, headers=headers, json=body, timeout=30)
        payload = resp.json()
        session.sql(
            """INSERT INTO voc.raw.jobs
               (watch_id, job_id, http_status, charged_usd, first_payload, submitted_at)
               SELECT ?, ?, ?, ?, PARSE_JSON(?), CURRENT_TIMESTAMP()""",
            params=[r["WATCH_ID"], payload.get("job_id"), resp.status_code,
                    (payload.get("billing") or {}).get("charged_usd"), json.dumps(payload)],
        ).collect()
        submitted += 1
    return {"submitted": submitted}
$$;

Процедура написана по руководству Snowflake для процедур на Python. Блок SECRETS связывает объект секрета с именем, а код читает его через _snowflake.get_generic_secret_string. В блоке PACKAGES перечислены внешние пакеты (обзор хранимых процедур на Python). Стоит учесть две детали. Во-первых, сохраняйте первый ответ целиком. В нём указана точная сумма списания в долларах, поэтому каждый месяц можно сверяться со страницей биллинга EveryInfra.

Во-вторых, не повторяйте запрос к той же цели внутри процедуры. API не списывает средства за неверные параметры, временно недоступные цели и пустые результаты, а в ответе указывает причину. Пусть повторную попытку сделает завтрашний запуск. В наших ответах 503 от Amazon даже прямо говорилось, что немедленная повторная попытка для того же товара вряд ли поможет.

Сборщик работает аналогично. Он читает ID ещё не закрытых заданий из voc.raw.jobs и запрашивает статус каждого. Задания в состоянии running или finalizing он пропускает. Результаты завершённых заданий он записывает в voc.raw.api_responses и помечает как собранные. В нашем тесте мы сначала считали незавершёнными только задания в состоянии running. В результате мы попытались забрать результат одного задания слишком рано, пока оно ещё находилось в состоянии finalizing. Учитывайте при проверке оба состояния.

Запланируйте задачу отправки ежедневно на 02:00 по сингапурскому времени. Сборщик запланируйте на 02:20 и 03:20, чтобы второй запуск подхватил всё, что пропустил первый. Не запускайте сборщик каждые несколько минут. При каждом возобновлении работы виртуального склада оплачивается не менее 60 секунд, поэтому при частых запусках вы в основном платите за простой. Мы также советуем настроить автоматическую приостановку через 60 секунд вместо стандартных 10 минут.

sql
CREATE OR REPLACE TASK voc.raw.t_submit
  WAREHOUSE = voc_xs_wh
  SCHEDULE = 'USING CRON 0 2 * * * Asia/Singapore'
AS
  CALL voc.raw.submit_pulls();

CREATE OR REPLACE TASK voc.raw.t_collect
  WAREHOUSE = voc_xs_wh
  SCHEDULE = 'USING CRON 20 2,3 * * * Asia/Singapore'
AS
  CALL voc.raw.collect_results();

ALTER TASK voc.raw.t_collect RESUME;
ALTER TASK voc.raw.t_submit RESUME;

Синтаксис задач описан в разделах CREATE TASK и «Введение в задачи». Можно также убрать WAREHOUSE и использовать бессерверную задачу, работу которой Snowflake тарифицирует по фактическому объёму вычислений. В таблице Service Consumption Table для бессерверных задач указан коэффициент 0,9.

Четыре таблицы: отзывы, упоминания в соцсетях, продажи и возвраты

Структуру таблиц определяют три правила. Храните каждый сырой ответ в том виде, в каком он пришёл. В развёрнутых таблицах оставляйте только поля, нужные для анализа. По возможности удаляйте персональные данные. API возвращает имена и аватары авторов отзывов, а в анализе доли возвратов они не используются. Отказ от их хранения экономит место и снимает вопрос конфиденциальности. Ниже приведены четыре основные таблицы и одна таблица сопоставления. Продажи и возвраты берутся из ваших собственных систем, поэтому для них показана только структура.

sql
-- Raw responses: one row per API response, stored as VARIANT
CREATE TABLE IF NOT EXISTS voc.raw.api_responses (
  job_id        STRING,
  platform      STRING,
  action        STRING,
  fetched_at    TIMESTAMP_TZ,
  payload       VARIANT
);

-- Amazon reviews (expanded from amazon/reviews)
CREATE TABLE IF NOT EXISTS voc.core.reviews (
  review_id            STRING PRIMARY KEY,
  asin                 STRING,
  country              STRING,
  rating               NUMBER(3,1),
  title                STRING,
  body                 STRING,
  posted_at            TIMESTAMP_TZ,
  is_verified_purchase BOOLEAN,
  helpful_count        NUMBER,
  variant              STRING,
  fetched_at           TIMESTAMP_TZ
);

-- Social mentions: TikTok comments and Reddit posts in one table
CREATE TABLE IF NOT EXISTS voc.core.social_mentions (
  platform      STRING,          -- tiktok or reddit
  source_id     STRING,          -- comment or post ID
  source_url    STRING,          -- video URL or post URL
  community     STRING,          -- Reddit community, empty for TikTok
  product_key   STRING,          -- key from product_map
  body          STRING,
  like_count    NUMBER,
  reply_count   NUMBER,
  is_reply      BOOLEAN,
  posted_at     TIMESTAMP_TZ,
  fetched_at    TIMESTAMP_TZ,
  themes        ARRAY,           -- labels from AI_CLASSIFY
  PRIMARY KEY (platform, source_id)
);

-- Daily sales from your order system
CREATE TABLE IF NOT EXISTS voc.core.sales_daily (
  sale_date     DATE,
  sku           STRING,
  asin          STRING,
  units_ordered NUMBER,
  PRIMARY KEY (sale_date, sku)
);

-- FBA customer returns report (GET_FBA_FULFILLMENT_CUSTOMER_RETURNS_DATA)
CREATE TABLE IF NOT EXISTS voc.core.fba_returns (
  return_date           TIMESTAMP_TZ,
  order_id              STRING,
  sku                   STRING,
  asin                  STRING,
  fnsku                 STRING,
  quantity              NUMBER,
  fulfillment_center_id STRING,
  detailed_disposition  STRING,
  reason                STRING,
  status                STRING,
  customer_comments     STRING,
  return_themes         ARRAY
);

-- Product map: which ASINs, SKUs, videos and keywords belong to one product
CREATE TABLE IF NOT EXISTS voc.core.product_map (
  product_key   STRING,
  asin          STRING,
  sku           STRING,
  tiktok_urls   ARRAY,
  reddit_terms  ARRAY
);

Таблица возвратов воспроизводит структуру отчёта Amazon SP-API о возвратах покупателей FBA. Тип отчёта: GET_FBA_FULFILLMENT_CUSTOMER_RETURNS_DATA. Среди его полей: дата возврата, ID заказа, SKU, ASIN, FNSKU, название товара, количество, фулфилмент-центр, подробное состояние товара, причина, статус, номер LPN и комментарии покупателя. Согласно документации, Amazon обновляет отчёт ежедневно (типы отчётов SP-API для FBA).

Здесь важнее всего столбец комментариев покупателя. Это свободный текст, как комментарий в TikTok. Если классифицировать оба источника по одному списку тем, они сопоставятся по темам. В столбце причины используются фиксированные коды Amazon, которые гораздо грубее темы вроде «протекает крышка». По одним только кодам причин нельзя понять, какая тема приводит к возвратам.

В следующей таблице поля API сопоставлены со столбцами таблиц. Названия полей взяты из каталога EveryInfra по адресу GET /api/v1/social/catalog, прочитанного 2026-11-06 (каталог).

ВозможностьПоля APIСтолбец таблицыПримечание
amazon/reviewsreview_id, product_asin, countryreviews.review_id, asin, countryДедупликация по ID отзыва
amazon/reviewsrating, title, text, posted_atrating, title, body, posted_atОценка от 1 до 5
amazon/reviewsis_verified_purchase, helpful_count, variantТе же названияЦвет и размер хранятся в variant
amazon/reviewsauthor_name, author_id, author_avatar_urlНе сохраняютсяПерсональные данные, не нужные для анализа
tiktok/commentsid, text, like_count, reply_count, is_reply, posted_atСоответствующие столбцы social_mentionsКаждый комментарий верхнего уровня содержит до 2 ответов
tiktok/commentsauthor_username, author_idНе сохраняютсяПо той же причине
reddit/searchid, url, title и text, community, like_count, comment_countsource_id, source_url, body, community, like_count, reply_countЗаголовок и основной текст объединены в один текст
reddit/searchauthor_usernameНе сохраняютсяПо той же причине

Для шага развёртывания достаточно SQL. Выберите записи по платформе из api_responses, примените LATERAL FLATTEN к payload:results и выполните MERGE в целевую таблицу по ID. При повторном сборе данных с того же видео у старых комментариев обновляется число лайков, а новые комментарии добавляются. Дальше в статье вы увидите, что повторный сбор данных с того же видео через несколько месяцев оказывается самым полезным шагом в этой схеме.

Один реальный прогон: REST, асинхронный режим и MCP

Запустить часть на стороне Snowflake мы не смогли. Но процедура отправляет те же запросы к тому же API, которым мы пользовались на своей машине, и получает ответы в том же формате. 2026-11-06 с 00:16 до 00:36 SGT мы сделали 12 вызовов с тестовым ключом. Они охватывают три возможности из этой статьи и ещё два поиска, которые помогли нам выбрать цели. Для каждого вызова мы сохранили запрос, время начала и окончания, HTTP-статус, длительность и сумму списания.

#SGTВозможностьРежимРезультатДлительностьСписание
100:16:52amazon/search, ключевое слово «portable blender»Синхронно10 товаров, 9 из них — Ninja42.14 s$0.002236
200:17:41amazon/reviews, товар B0C2FF4JD1Синхронно503, временно недоступно (без списания)60.12 s$0
300:18:41amazon/reviews, товар B0CN3S2SW2Синхронно50358.57 s$0
400:19:47amazon/reviews, товар B09B8V1LZ3Синхронно0 записей, средства за пустой результат возвращены67.25 s$0
500:20:55reddit/search, portable blender, сначала новыеСинхронно14 постов6.56 s$0.000556
600:21:13tiktok/search, ninja blast portable blender reviewСинхронно10 видео3.78 s$0.000556
700:21:21tiktok/comments, видео со сравнением дешёвого и дорогого блендеровСинхронно200 комментариев52.30 s$0.000556
800:22:13walmart/reviews, страница товараСинхронно0 записей, средства за пустой результат возвращены54.34 s$0
900:24:22amazon/reviews, товар B0D2YYHN1BСинхронно50319.48 s$0
1000:25:26reddit/search, ninja blastMCP7 постов7.62 s$0.000556
1100:27:36tiktok/comments, видео с тестом одного товараАсинхронно202, готово примерно через 100 с, 73 комментарияОтправка 1,95 с$0.000556
1200:36:23amazon/reviews, товар B0C2FF4JD1 повторноСинхронно50338.42 s$0

Из 12 вызовов оплачены шесть, всего на $0,005016. Остальные шесть вернули 503 или пустой результат, и за них ничего не списано. URL товара Walmart в вызове 8 мы угадали по названию товара, так что пустой результат вызван нашей ошибкой. Тем не менее он подтверждает, что возврат средств за пустой результат действует и для отзывов Walmart.

Скриншот реальных ответов нашего API: светлая карточка с кодом из трёх частей. Первая часть показывает асинхронную отправку: POST https://api.everyinfra.com/api/v1/social с platform tiktok, action comments и mode async, который за 1,95 секунды вернул статус 202 с state running, ID задания и URL для опроса. Бирюзовая рамка выделяет списание 0,000556 доллара США. Вторая часть показывает фрагмент завершённого задания: state succeeded, 73 комментария, а также время, число лайков и текст первых двух, поле автора скрыто. Третья часть показывает ответ на запрос отзывов Amazon со статусом 503, причиной access_blocked, повторной попыткой через 900 секунд и списанием 0.
Скриншот асинхронной отправки и результата в 00:27 SGT 2026-11-06, а также ответа 503 в 00:17. Данные авторов скрыты. Ответ API EveryInfra

Первая часть скриншота показывает то, что получает процедура отправки. Запрос вернул 202 за 1,95 секунды вместе с ID задания, а в ответе указано списание $0,000556 в момент отправки. Вторая часть показывает то, что получает сборщик. Состояние сменилось с running на finalizing, затем на succeeded. Мы опрашивали статус примерно каждые 8 секунд, всего 12 раз, и задание завершилось примерно через 100 секунд после отправки.

Третья часть показывает сбой. Статус 503, причина access_blocked, повторную попытку рекомендуется сделать через 900 секунд, списание равно 0. Процедуре достаточно выбирать ветвь по коду статуса и значениям этих полей.

Вызов 10 сделан для сравнения. Тот же поиск по Reddit через MCP-инструмент everyinfra_call_api за 7,62 секунды вернул 7 постов. Результат инструмента содержал 18 619 символов, а весь ответ занимал 19 490 байт. Если бы такой вызов сделал Cortex Agent через MCP-коннектор, эти 18 619 символов попали бы в контекст модели как входные токены. Если же загрузить те же данные в таблицу, в контекст агента попадут только те несколько записей, которые он прочитает. Поэтому мы предпочитаем подход «сначала загрузить, потом спрашивать», а не «получать данные вживую в каждом чате».

Горизонтальная линейчатая диаграмма с 12 полосами, по одной на каждый реальный вызов, и осью от 0 до 120 секунд. Шесть бирюзовых полос обозначают оплаченные вызовы: поиск Amazon 42,14 секунды, поиск Reddit 6,56, поиск TikTok 3,78, синхронный запрос комментариев TikTok 52,30, поиск Reddit через MCP 7,62 и асинхронная отправка запроса комментариев TikTok 1,95. Шесть серых полос обозначают неоплаченные вызовы: четыре ошибки при запросе отзывов Amazon и один пустой результат Amazon в диапазоне от 19 до 67 секунд, а также пустой результат Walmart за 54,34 секунды. В подзаголовке указан период с 00:16 до 00:36 по сингапурскому времени 2026-11-06.

Эта диаграмма задержек определяет модель затрат в Snowflake. Для всех трёх возможностей объём данных невелик. Объём ответа на один вызов комментариев TikTok с 200 комментариями составил 71 228 байт, а на один поиск по Reddit — около 30 000 байт. По времени ожидания синхронный запрос отзывов или комментариев часто занимает от 50 до 70 секунд.

Виртуальный склад тарифицируется посекундно, причём при каждом возобновлении работы действует минимум в 60 секунд («Warehouses overview», «Understanding compute cost»). Во время синхронного вызова виртуальный склад почти всё время ждёт ответа по сети. В разделе о затратах это пересчитано в доллары.

Тест 1: сколько комментариев в TikTok описывают проблему с товаром?

Мы выбрали категорию, знакомую большинству читателей: портативные блендеры. В вызове 1 мы искали через amazon/search по запросу «portable blender». Девять из первых 10 результатов оказались товарами Ninja по цене от $19,95 до $59,99 (API данных Amazon, поиск Amazon). В вызове 6 мы искали через tiktok/search по запросу «ninja blast portable blender review». Из 10 найденных видео мы взяли два с наибольшим числом комментариев и выгрузили их комментарии через tiktok/comments (API данных TikTok, API комментариев TikTok, API поиска TikTok).

Первое видео сравнивает дешёвый и дорогой блендеры и опубликовано 2025-07-27. На момент выгрузки у него было 2 586 703 просмотра и 251 комментарий. Мы получили 200 комментариев: это лимит одного вызова. Второе видео, где тестируют один товар, опубликовано 2026-01-20; у него 208 916 просмотров и 98 комментариев. Мы получили 73 комментария, из них 17 ответов. Авторов обоих видео мы в статье не называем.

ВидеоОпубликованВерсииКомментариев под видеоПолучено комментариевОтветыПроблемы с товаромДоля
Сравнение дешёвого и дорогого2025-07-272,586,7032512002342.0%
Тест одного товара2026-01-20208,9169873171317.8%

Сначала мы попробовали самый распространённый способ упростить задачу: список ключевых слов battery, leak, broke, returned, expensive, too small. Комментарий считался жалобой, если содержал хотя бы одно из этих слов. В первом видео хотя бы одно ключевое слово нашлось в 42 из 200 комментариев. Затем мы вручную прочитали каждый комментарий. Лишь 4 из 42 описывали проблему с блендером, то есть правило ключевых слов давало верный результат в 9,5% случаев.

Причину легко увидеть. В комментариях под видео со сравнением дешёвого и дорогого в основном шутят про сам формат и просят сравнить дешёвые и дорогие версии других вещей. Тридцать комментариев содержали слово «expensive» или другое слово о цене. Лишь в 7 из них говорилось, что блендер не стоит своих денег. В Snowflake метки тем должна присваивать модель, а понятие «проблема с товаром» нужно сначала определить письменно.

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

Ручная меткаКомментарии
Не относится к товару (шутки, другие темы)29
Только претензия к цене7
Проблема с товаром4
Неясно2
Всего совпадений по ключевым словам42

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

Горизонтальная линейчатая диаграмма с накоплением и двумя полосами. Верхняя полоса относится к видео со сравнением дешёвого и дорогого блендеров, набравшему 2,59 млн просмотров: 4 из 200 комментариев описывают проблему с товаром, то есть 2,0%. Нижняя полоса относится к видео с тестом одного товара, набравшему 209 тыс. просмотров: 13 из 73 комментариев описывают проблему с товаром, то есть 17,8%. Бирюзовым отмечены комментарии о проблемах с товаром, серым — все остальные.

У видео, набравшего в десять раз больше просмотров, лишь 2,0% комментариев описывают проблемы с товаром. У менее популярного видео с тестом одного товара таких комментариев 17,8%. Причина в аудитории. Сравнительное видео привлекает тех, кто смотрит его ради развлечения. Видео с тестом привлекает владельцев товара и тех, кто собирается его купить; именно они пишут: «Мой тоже протекал». Для схемы в Snowflake выбор видео в product_map важнее количества комментариев на видео.

При одинаковой цене $0,000556 за вызов видео с тестом одного товара дало почти в девять раз больше полезных сигналов. Этот выбор тоже можно автоматизировать. Ищите через tiktok/search, а затем оставляйте видео, в подписях к которым есть слова вроде «review», «trying» или «honest» и у которых от десятков до сотен комментариев.

В двух видео вместе 17 из 273 комментариев описывали проблему с товаром. По темам они распределяются так.

ТемаКомментарииПример (исходный текст, автор скрыт)Лайки
Крышка или протекание6The way I just gasped when it spilled. Were you supposed to open it from the top instead?79
Батарея3the batteries do not last long enough to make a full smoothie9
Общая негативная оценка, товар возвращён2Not worth it, returned after a week0
Плохо справляется со льдом или замороженными фруктами2It's not. I returned mine. Barely could get through frozen fruit97
Отсутствующая деталь2ours both didn't come with the blade cap0
Быстро сломался1they are shit, lasts 2 spins1
Трудно мыть1Hard to wash0
Горизонтальная линейчатая диаграмма с семью темами в порядке убывания числа комментариев: крышка или протекание — 6 (бирюзовым), батарея — 3, общая негативная оценка — 2, плохо справляется с замороженными фруктами — 2, отсутствующая деталь — 2, быстро сломался — 1, трудно мыть — 1. В подзаголовке сказано, что большинство комментариев о крышке связаны с тем, что покупатели не понимают, как её открыть, а в 2 комментариях говорится о возврате товара.

Самая большая группа связана с крышкой и протеканием. Самый популярный комментарий в ней, с 79 лайками, спрашивает, не нужно ли было открывать крышку сверху. В другом автор пишет, что в первый раз пролил так же и не догадался воспользоваться колпачком. Комментарий от 2026-01-22 предупреждает не пользоваться кнопкой на крышке, потому что она ломается, а замену не продают.

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

Сохраняйте в таблице число лайков. Комментарий «я свой вернул» с 97 лайками и жалоба с 0 лайков отражают мнение разного числа людей. В семантическом представлении задайте две меры: число комментариев и взвешенное по лайкам число комментариев. Попросите агента выводить обе.

В Snowflake разметку может выполнить AI_CLASSIFY. Используйте в качестве категорий семь тем плюс «не проблема с товаром». Настройте вывод нескольких меток. Добавьте описание задачи, которое исключает жалобы на цену и шутки. Документация рекомендует ограничиться примерно 20 категориями и позволяет добавлять примеры (документация AI_CLASSIFY).

В этой документации есть одно важное замечание. Лучшие результаты дают входные данные на английском языке, а на других языках качество может быть ниже. Большинство комментариев в TikTok и на Amazon US написаны по-английски, поэтому для американского бренда это небольшая проблема. Если вы также отслеживаете испаноязычные или другие рынки, сначала проверьте выборку, размеченную вручную. Кроме того, описание задачи и категории тоже учитываются как токены для каждой записи. Поэтому реальное число токенов на запись больше длины комментария.

sql
UPDATE voc.core.social_mentions
SET themes = AI_CLASSIFY(
      body,
      ['lid_or_spill', 'battery', 'weak_on_ice', 'missing_part',
       'breaks_quickly', 'hard_to_clean', 'general_negative', 'not_a_product_issue'],
      {'output_mode': 'multi',
       'task_description': 'Label only comments that report a problem with this blender. Price complaints, jokes and brand comparisons are not_a_product_issue.'}
    ):labels
WHERE themes IS NULL;

Запустите ту же классификацию для столбца customer_comments таблицы возвратов и запишите результат в return_themes. Тогда обе стороны используют одни и те же темы, модель и описание, и сравнение по темам имеет смысл. AI_SENTIMENT также может оценить каждый комментарий по шкале от негативного до позитивного (документация AI_SENTIMENT). Здесь от него меньше пользы, потому что вопрос в том, какая именно проблема, а не в том, насколько покупатель недоволен.

Тест 2: что возвращает поиск по Reddit?

Многие команды считают Reddit местом честных обсуждений между пользователями, поэтому мы проверили, может ли он дополнить TikTok. В вызове 5 мы искали через reddit/search по запросу «portable blender» с сортировкой по новизне и получили 14 постов. В вызове 10 мы искали «ninja blast» через MCP и получили 7 постов (API данных Reddit, API поиска Reddit). Эта возможность всегда выполняет поиск только по данным за последний месяц и возвращает до 25 постов за вызов. Наши 14 постов охватывали лишь период с 2026-10-30 по 2026-11-05 (UTC), а 7 постов — период с 3 по 5 ноября.

Мы прочитали каждый пост. Ни один из 21 поста не обсуждал, хорошо ли работает блендер. Из 14 постов по запросу «portable blender» 10 были постами о скидках. Большинство из них были опубликованы в сообществах скидок, например r/priceglitch, с заголовками вроде «Ninja Blast Max Portable Blender, Twist & Go, 22oz» плюс цвет и цена. Посты о скидках появлялись 2026-10-31, 2026-11-01 и 2026-11-05. Ежедневные подборки скидок Amazon появлялись 2026-11-02 и 2026-11-03.

Остальные 4 поста не имели отношения к блендерам. Один пользователь спрашивал о портативном ThinkPad, а в двух постах в сообществах 3D-программы Blender спрашивали о характеристиках ноутбуков. Из 7 постов по запросу «ninja blast» 4 были о скидках. Остальные 3 попали в результаты из-за случайного совпадения слов запроса: один был о видеоигре, а два были опубликованы в сообществе мультсериала Ninjago.

ЗапросПостыПосты о скидкахНе по темеОбсуждение товараПериод (UTC)
portable blender (REST)141040с 2026-10-30 по 2026-11-05
ninja blast (MCP)7430с 2026-11-03 по 2026-11-05
Горизонтальная линейчатая диаграмма с накоплением и двумя полосами. Portable blender, 14 постов: 10 постов о скидках, 4 не по теме, 0 обсуждений товара. Ninja blast через MCP, 7 постов: 4 поста о скидках, 3 не по теме, 0 обсуждений товара. В подзаголовке сказано, что результаты поиска отсортированы по новизне, 14 постов охватывают лишь период с 30 октября по 5 ноября, а посты не по теме попали в результаты из-за совпадений по словам, например с названием 3D-программы Blender, сериала Ninjago и игры.

Это не значит, что Reddit бесполезен. Это значит, что запрос из короткого ключевого слова с сортировкой по новизне сформулирован неправильно. Для загрузки в Snowflake внесите три изменения. Во-первых, оценивайте релевантность только по заголовку и требуйте, чтобы непосредственно перед «blender» стояло portable, personal, smoothie или название бренда. Наше первое правило находило «blender» в тексте постов и засчитывало посты о программах для 3D-моделирования как посты о товаре.

Во-вторых, выделите посты о скидках в отдельную категорию, потому что это полезные данные. Данные о том, сколько раз конкретный блендер упоминается за месяц в сообществах, посвящённых скидкам, и по какой цене его предлагают, можно хранить рядом с таблицей продаж. Тогда можно увидеть, приводит ли неделя скидок к всплеску возвратов. В-третьих, обсуждения самих товаров обычно сосредоточены в нескольких сообществах, например в группах о смузи или спортивном питании. Используйте reddit/comments для подходящих тредов в этих сообществах вместо поиска по всему сайту.

Тест 3: запрос отзывов Amazon вернул статус 503, списаний не было

Больше всего нам были нужны отзывы Amazon. Отзывы и возвраты поступают с одной платформы и от одних и тех же покупателей. Но ни один из пяти вызовов amazon/reviews не вернул отзывов (API отзывов Amazon). В 00:17, 00:18 и 00:24 SGT запросы для трёх разных товаров брендов Ninja и Hamilton Beach завершились со статусом 503 и причиной access_blocked. Это означает, что отзывы о товаре были временно недоступны, списаний не было, а ответ рекомендовал повторить запрос через 900 секунд.

В 00:19 SGT мы попробовали более старый товар. Он вернул 200 с 0 записей, и средства за вызов вернули как за пустой результат. В 00:36 SGT, через 19 минут после первой попытки, мы снова запросили первый товар и снова получили 503. У всех пяти вызовов charged_usd равно 0.

SGTПродуктHTTP-статусПричинаДлительностьСписание
00:17:41B0C2FF4JD1503access_blocked60.12 s$0
00:18:41B0CN3S2SW2503access_blocked58.57 s$0
00:19:47B09B8V1LZ3200Пустой результат, средства возвращены67.25 s$0
00:24:22B0D2YYHN1B503access_blocked19.48 s$0
00:36:23B0C2FF4JD1503access_blocked38.42 s$0

Мы описываем всё так, как было, потому что ежедневная задача в Snowflake столкнётся с тем же. По правилам EveryInfra для временно недоступных или требующих входа целевых ресурсов возвращается статус 503 с указанием причины и рекомендацией, когда повторить запрос. В таких случаях никогда не возвращается пустой ответ со статусом 200, создающий ложное впечатление, что отзывов нет. Для загрузчика важно различать эти статусы. Статус 503 означает «сегодня данных нет, повторите попытку завтра». Пустой ответ со статусом 200 означает «здесь действительно ничего нет».

Если процедура не различает эти два случая, для некоторых товаров в семантическом представлении появятся ложные дни «без жалоб». Агент сделает на их основе неверные выводы. Сохраняйте HTTP-статус и причину в таблице jobs. Разворачивайте только ответы со статусом 200. Добавьте в семантическое представление меру «дни без данных», чтобы агент мог указать, за какие дни данных не было.

В каталоге также указано, что amazon/reviews возвращает только избранные отзывы, показанные на странице товара. Обычно для одного товара это около десятка отзывов, но не более 100 за вызов. Отзывы можно получать с 11 маркетплейсов Amazon.

Поэтому даже в удачный день вы получаете не все отзывы, а только выбранный Amazon набор. Такого набора достаточно, чтобы ответить на вопрос «о чём говорят самые заметные жалобы», но его недостаточно, чтобы подсчитать все жалобы. Более полную картину дают данные Seller Central и комментарии покупателей из отчёта о возвратах FBA. Данные из этого отчёта загружаются в таблицу fba_returns, описанную выше.

Спросите Cortex Agent: какая тема жалоб растёт вместе с долей возвратов?

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

sql
CREATE OR REPLACE VIEW voc.core.theme_returns_weekly AS
WITH mentions AS (
  SELECT s.product_key,
         DATE_TRUNC('week', s.posted_at)::DATE AS week_start,
         t.value::STRING AS theme,
         COUNT(*) AS mentions,
         SUM(1 + COALESCE(s.like_count, 0)) AS weighted_mentions
  FROM voc.core.social_mentions s,
       LATERAL FLATTEN(input => s.themes) t
  WHERE t.value::STRING <> 'not_a_product_issue'
  GROUP BY 1, 2, 3
),
returns AS (
  SELECT pm.product_key,
         DATE_TRUNC('week', f.return_date)::DATE AS week_start,
         COALESCE(t.value::STRING, 'unclassified') AS theme,
         SUM(f.quantity) AS returned_units
  FROM voc.core.fba_returns f
  JOIN (SELECT DISTINCT product_key, asin FROM voc.core.product_map) pm
    ON pm.asin = f.asin,
       LATERAL FLATTEN(input => f.return_themes, OUTER => TRUE) t
  GROUP BY 1, 2, 3
),
sales AS (
  SELECT pm.product_key,
         DATE_TRUNC('week', d.sale_date)::DATE AS week_start,
         SUM(d.units_ordered) AS units_sold
  FROM voc.core.sales_daily d
  JOIN (SELECT DISTINCT product_key, asin FROM voc.core.product_map) pm
    ON pm.asin = d.asin
  GROUP BY 1, 2
),
theme_weeks AS (
  SELECT COALESCE(m.product_key, r.product_key) AS product_key,
         COALESCE(m.week_start, r.week_start) AS week_start,
         COALESCE(m.theme, r.theme) AS theme,
         COALESCE(m.mentions, 0) AS mentions,
         COALESCE(m.weighted_mentions, 0) AS weighted_mentions,
         COALESCE(r.returned_units, 0) AS returned_units
  FROM mentions m
  FULL OUTER JOIN returns r
    ON r.product_key = m.product_key
   AND r.week_start = m.week_start
   AND r.theme = m.theme
)
SELECT tw.product_key, tw.week_start, tw.theme,
       tw.mentions, tw.weighted_mentions, tw.returned_units,
       s.units_sold,
       tw.returned_units / NULLIF(s.units_sold, 0) AS theme_return_rate
FROM theme_weeks tw
LEFT JOIN sales s
  ON s.product_key = tw.product_key AND s.week_start = tw.week_start;

Три решения в этом представлении не позволяют потерять данные о возвратах. Во-первых, упоминания и возвраты объединяются полным внешним соединением (full outer join) по товару, неделе и теме, после чего к ним по товару и неделе присоединяются продажи. Поэтому, если посты в соцсетях за какую-то неделю упоминают только проблемы с крышкой, возвраты из-за проблем с батареей за эту неделю всё равно попадут в отдельную запись. Во-вторых, OUTER => TRUE сохраняет под меткой unclassified возвраты, у которых нет комментария или темы. В-третьих, одному ASIN могут соответствовать несколько SKU в product_map, поэтому представление соединяет таблицы по уникальным парам товара и ASIN. Иначе возвраты и продажи учитывались бы несколько раз. Учтите, что одному комментарию могут соответствовать две темы, поэтому сумма значений в записях по темам может превышать фактическое число возвращённых единиц. Общую долю возвратов рассчитывайте непосредственно по fba_returns, а не суммированием записей по темам.

Затем создайте поверх него семантическое представление. Оно сообщает Cortex Analyst, что означает каждый столбец и какие столбцы являются мерами («Semantic views overview», CREATE SEMANTIC VIEW). Задайте как минимум четыре меры: число упоминаний темы, взвешенное по лайкам число упоминаний, число возвращённых единиц товара по теме и долю возвратов по теме. В качестве измерений используются товар, тема и неделя. Добавьте также синонимы. Сопоставьте «leak», «spill» и «cap» с lid_or_spill, чтобы агент понимал слова, которые на самом деле вводят бизнес-пользователи.

Спецификация агента пишется в YAML. Как минимум нужен один инструмент Cortex Analyst, работающий с этим семантическим представлением. Мы добавляем один пользовательский инструмент, который возвращает комментарии с наибольшим числом лайков для заданных товара и темы. Структура соответствует CREATE AGENT. В документации Cortex Agents сказано, что параметры пользовательских инструментов не могут иметь тип object, поэтому используйте простые параметры («Cortex Agents overview»).

yaml
models:
  orchestration: claude-sonnet-5-5
orchestration:
  budget:
    seconds: 120
    tokens: 40000
instructions:
  orchestration: >
    For questions about complaint themes and returns, use VocAnalyst on weekly data.
    Compare each theme's mentions with the same week and the next 1 to 4 weeks of
    theme_return_rate. Report weeks with missing review data. Never treat a missing
    week as zero complaints.
  response: >
    Give the theme, the weeks, both raw and like-weighted mention counts, and the
    return rate change. Quote at most two comments from TopComments, without author names.
  sample_questions:
    - question: "Which complaint theme rises together with the return rate?"
    - question: "Did lid complaints for the Ninja Blast track returns over the last four weeks?"
tools:
  - tool_spec:
      type: cortex_analyst_text_to_sql
      name: VocAnalyst
      description: Weekly social complaint themes, returns and sales by product.
  - tool_spec:
      type: generic
      name: TopComments
      description: Returns the most liked comments for one product and one theme.
      input_schema:
        type: object
        properties:
          product_key: {type: string, description: Product key from product_map}
          theme: {type: string, description: One theme label}
        required: [product_key, theme]
tool_resources:
  VocAnalyst:
    semantic_view: voc.core.voc_returns
  TopComments:
    type: procedure
    identifier: voc.core.top_comments
    execution_environment:
      type: warehouse
      warehouse: voc_xs_wh

Формулировке «растут вместе» нужно дать точное определение. Инструкции велят агенту сравнивать жалобы за определённую неделю с возвратами за ту же неделю и за период от одной до четырёх недель после неё. Наши собственные данные показывают, почему это важно. Жалобы и возвраты возникают не одновременно. На диаграмме ниже показаны 17 комментариев о проблемах с товаром по месяцам.

Сравнительное видео вышло 2025-07-27, и 4 комментария о проблемах под ним появились через 6, 44, 245 и 245 дней. Видео с тестированием товара вышло 2026-01-20. Лишь 2 из 13 комментариев о проблемах появились в первую неделю, а остальные распределились по периоду с марта по сентябрь. Оба комментария, где упоминается возврат, появились в марте 2026 года: один через 245 дней после публикации соответствующего видео, другой через 52 дня.

Комментарий (автор скрыт)ТемаДата комментарияДней после публикации видеоЛайки
Спрашивает, следует ли открывать крышку сверхуКрышка или протекание2026-01-20079
Не пользуйтесь кнопкой на крышке, она ломаетсяКрышка или протекание2026-01-2225
Пишет, что все называют этот блендер ужаснымОбщий негатив2026-03-014023
Товар вернули: плохо справляется с замороженными фруктамиПлохо колет лёд2026-03-135297
Заряда не хватает даже на один смузиБатарея2026-03-14539
Оба экземпляра пришли без защитного колпачка для ножаОтсутствующая деталь2026-07-311920
Купил второй экземпляр ради запасной крышкиКрышка или протекание2026-09-122350
Столбчатая диаграмма с накоплением. По горизонтальной оси отложен месяц комментария: август и сентябрь 2025 года, затем январь, март, апрель, июль и сентябрь 2026 года. По вертикальной оси отложено число комментариев о проблемах с товаром, от 0 до 8. Максимум приходится на март 2026 года: 8 комментариев в категориях «быстро сломался», «общий негатив», «плохо справляется с замороженными фруктами», «батарея», «крышка» и «трудно мыть». В январе 2026 года 2 комментария о крышке, в апреле 3, в остальных месяцах по 1. Категория «Крышка или протекание» выделена бирюзовым. В подзаголовке сказано, что большинство комментариев появляется через один-два месяца после публикации видео, поэтому при однократной выгрузке поздние жалобы теряются.

Эта диаграмма меняет архитектуру в Snowflake по двум направлениям. Во-первых, никогда не собирайте данные по видео только один раз. Если бы мы собрали данные только за первую неделю, то упустили бы 3 комментария о проблемах под первым видео и 11 под вторым. Поэтому watchlist должен собирать данные по одним и тем же видео каждую неделю или каждый месяц, а MERGE — добавлять новые комментарии.

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

Нужно честно сказать и об объёме данных. Два видео дали 17 комментариев о проблемах за 14 месяцев, так что в большинстве недель их число равно нулю. Корреляция на настолько разреженных данных ничего не значит.

Чтобы у агента была надёжная база, отслеживайте по 20–30 роликов с тестированием каждого товара, а также отзывы на Amazon и комментарии о возвратах. Начните с помесячной детализации и переходите на понедельную, когда данных станет достаточно. Это ограничение связано с объёмом данных, а не со Snowflake, и оно возникло бы при использовании любого инструмента. Поэтому в инструкциях агенту и сказано сообщать о неделях без данных. Честное «данных слишком мало» лучше, чем тренд, придуманный по трём комментариям.

Сколько стоит месяц работы: плата за API и расходы на Snowflake

Начните с конкретного плана, а затем рассчитайте его стоимость. Один бренд отслеживает 20 ASIN и 20 видео в TikTok и раз в день собирает отзывы или комментарии к каждому из них. Чтобы находить новые видео, он ежедневно ищет по 5 ключевым словам в Reddit, а раз в неделю — по 5 ключевым словам в TikTok. За 30 дней получается 1 370 вызовов API. Стоимость API рассчитана по ценам из каталога, актуальным на 2026-11-06, так что это реальная цена.

Каждая статья расходов на Snowflake является оценкой, а метод расчёта показан в таблице. Цены взяты из Service Consumption Table, действующей с 2026-11-04, и из цены on-demand для редакции Standard в регионе AWS US East. Кредит платформы стоит $2.00. ИИ-кредит стоит $2.00 по глобальному тарифу (Service Consumption Table, страница с ценами, цены Cortex AI).

ПунктМетодВ месяц
Плата за API EveryInfra600 amazon/reviews × $0.001389 + 600 tiktok/comments × $0.000556 + 150 reddit/search × $0.000556 + 20 tiktok/search × $0.000556$1.26
Виртуальный склад ждёт ответов (синхронно, последовательно)Результаты замеров: отзывы Amazon — 67.25 с (самый медленный из 5 наших вызовов, результат пустой; с учётом диапазона 19.48–60.12 с для вызовов, завершившихся ошибкой 503, стоимость по этой строке составит $24.61–38.16), комментарии TikTok — 52.3 с, Reddit — 7.62 с, поиск в TikTok — 3.78 с. Итого: 20.27 часа × 1 кредит в час для размера XS × $2$40.54
Виртуальный склад ждёт ответов (синхронно, 10 параллельных вызовов)То же, разделённое на 10$4.05
Виртуальный склад (асинхронная схема, две задачи)Около 46 отправок заданий в день × 2 с, плюс 2 запуска сборщика с минимальной тарификацией 60 с, плюс 60 с простоя до автоприостановки после каждого из 3 запусков. Около 392 с в день, или 3.3 часа в месяцОколо $6.5
Тематические метки AI_CLASSIFY10 000 комментариев × около 150 токенов = 1.5 млн токенов × 1.62 ИИ-кредита за миллион × $2$4.86
Вопросы к Cortex Agent (Sonnet 5.5)50 вопросов × 20 000 входных и 1 500 выходных токенов, по 1.30 ИИ-кредита за миллион входных и 6.50 за миллион выходных токенов$3.58
Вопросы к Cortex Agent (Haiku 5.5)То же, по 0.065 за входные и 0.325 за выходные$0.18
SQL-запросы агента на виртуальном складе50 запросов × минимум 60 с × $2 за кредит-час$1.67
Хранение1 ГБ по $23 за ТБ в месяцОколо $0.02
Горизонтальная столбчатая диаграмма в логарифмической шкале с восемью статьями ежемесячных расходов: плата за API EveryInfra — 1.26 доллара США, столбец бирюзовый; последовательное ожидание ответов виртуальным складом — 40.54 доллара, это самый длинный столбец; 10 параллельных вызовов — 4.05; метки AI_CLASSIFY — 4.86; 50 вопросов к Cortex Agent с Sonnet 5.5 — 3.58, а с Haiku 5.5 — 0.18; SQL-запросы агента на виртуальном складе — 1.67; хранение 1 ГБ — 0.022. В подзаголовке сказано, что плата за API является реальной ценой, а остальные значения представляют собой оценки по таблице потребления Snowflake, а не замеры.

Внимание стоит обратить на вторую строку. Сам API обходится в $1.26 в месяц. Но если процедура написана самым простым способом, с синхронными вызовами один за другим, виртуальный склад работает больше 20 часов в месяц. Это около $40.54, то есть в 32 раза больше платы за API. При 10 параллельных вызовах или асинхронной схеме с двумя задачами расходы по этой строке снижаются до $4–7.

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

В сумме последовательная схема обходится примерно в $51.93 в месяц, а параллельная — примерно в $15.44. В регионе Singapore кредит редакции Standard стоит $2.50, поэтому статьи расходов на виртуальный склад нужно умножить на 1.25. В редакции Enterprise цена on-demand в US East составляет $3.00 за кредит; масштабирование выполняется так же.

Второй рычаг экономии связан с выбором модели. Оркестрация Cortex Agent тарифицируется по токенам, а цены моделей в таблице потребления сильно различаются. За те же 50 вопросов Sonnet 5.5 обойдётся примерно в $3.58, а Haiku 5.5 — примерно в $0.18. Opus 5.5 стоит 2.60 за миллион входных токенов и 13.00 за миллион выходных, вдвое дороже Sonnet. В таблице приведены цены, важные для этой статьи, в ИИ-кредитах за миллион токенов. ИИ-функции тарифицируются по общему числу токенов, без разделения на входные и выходные.

Модель или функцияВходные данныеВыводПрименение в этой статье
claude-sonnet-5-5 (CoWork, Agents)1.306.50Оркестрация агента; используется по умолчанию в таблице расходов
claude-haiku-5-5 (CoWork, Agents)0.0650.325Недорогая оркестрация
claude-opus-5-5 (CoWork, Agents)2.6013.00Для регулярных отчётов не требуется
openai-gpt-6.1-sol (CoWork, Agents)1.306.50Та же цена, что у Sonnet
AI_CLASSIFY1.62 (суммарно)Тематические метки для комментариев и примечаний к возвратам
AI_SENTIMENT1.60 (суммарно)Необязательная оценка тональности
AI_AGG1.85 (суммарно)Необязательная сводка текстов по темам

Цифра в 20 000 входных токенов на вопрос является нашим допущением. Она учитывает семантическое представление, инструкции и один-два раунда результатов инструментов. Если агент много раз вызывает инструменты в одном чате или загружает в контекст длинные комментарии, реальное число будет выше. После запуска реальные цифры покажет представление CORTEX_AGENT_USAGE_HISTORY. Вопросы из CoWork попадают в SNOWFLAKE_COWORK_USAGE_HISTORY, и ни одно из этих представлений не включает запросы другого (представление использования Cortex Agent, представление использования CoWork).

Каждый исходящий запрос процедуры отображается в представлении EXTERNAL_ACCESS_HISTORY, данные в котором могут запаздывать до 3 часов (история внешнего доступа). Сопоставьте его по времени со значениями charged_usd в voc.raw.jobs, и вы сможете каждый месяц сверять вызовы и расходы с обеих сторон. Snowflake также позволяет задать бюджеты ресурсов для каждого агента и квоты для каждого пользователя (бюджеты ресурсов Cortex Agents). На стороне EveryInfra задайте для этого ключа отдельный лимит вызовов в минуту. С лимитом на каждой стороне задача, работающая со сбоем, не сможет сделать десятки тысяч вызовов за ночь.

Одну строку в таблице потребления легко понять неправильно. «Cortex Tools» списывает 8 ИИ-кредитов за 1000 вызовов инструментов, когда сторонние агенты обращаются к эндпоинтам за пределами Snowflake, а за обращения к эндпоинтам Snowflake ничего не берёт. В нашей архитектуре API EveryInfra вызывает хранимая процедура Snowflake, а не агент. Агент только читает таблицы Snowflake, поэтому эту строку мы не учитывали.

Допустим, вы перейдёте на MCP-коннекторы и разрешите агенту вызывать внешние инструменты во время чатов. В документации не сказано, применяется ли тогда эта строка и как рассчитывается плата. Уточните это до запуска у команды Snowflake, сопровождающей ваш аккаунт. Новый аккаунт может опробовать всю схему в течение бесплатного пробного периода: на странице с ценами указаны 30 дней и пробные кредиты на сумму $400.

Еженедельное письмо через Snowflake CoWork Automations

Когда данные и агент готовы, остаётся вовремя доставить ответ нужным людям. Именно для этого нужны CoWork Automations. Вы задаёте вопрос, который выполняется по расписанию, например каждый понедельник в 09:00. Хороший вопрос: «Какая тема жалоб росла вместе с долей возвратов за последние четыре недели?» Результат приходит по электронной почте (документация по Automations).

Сначала разберитесь с ограничениями, описанными в документации. Автоматизация запускается не чаще раза в час. Результаты отправляются только по электронной почте, и каждый получатель должен предварительно подтвердить адрес электронной почты в Snowflake. История запусков хранится 60 дней. Каждая автоматизация выполняется с правами своего создателя, поэтому в письмо могут попасть данные из любой таблицы, к которой у создателя есть доступ на чтение.

Ограничение по документацииЗначениеВлияние на еженедельный отчёт о жалобах
Максимальная частота запусковРаз в часНе влияет: отчёт еженедельный
Способ доставкиТолько по электронной почте, на подтверждённые адресаПолучатели должны заранее подтвердить адрес
История запусков60 днейСохраняйте ответы в таблицу, если историю нужно хранить дольше
ПраваПрава создателяВ письмо может попасть любая таблица, которую может читать создатель
EXECUTE AGENT TASKПо умолчанию выдана роли PUBLICПри необходимости отзовите привилегию и предоставьте её отдельным ролям

Ни одно из этих ограничений не мешает нашему сценарию. Жалобы и возвраты отслеживаются понедельно, так что ежечасных запусков более чем достаточно. Доставка только по электронной почте означает, что напрямую публиковать результаты в Slack нельзя. В пресс-релизе сказано, что Snowflake for Slack сейчас находится в стадии публичной предварительной версии (пресс-релиз Expedition 2026).

Главное здесь — контроль доступа. Привилегия EXECUTE AGENT TASK по умолчанию предоставлена роли PUBLIC, поэтому любой пользователь аккаунта может создать автоматизацию для себя. Автоматизация выполняется с правами создателя. Значит, человек, который может читать все данные о продажах, может отправить их на любой указанный им адрес. Если это недопустимо, администратор должен отозвать привилегию у PUBLIC и предоставить её только нужным ролям.

Ограничения теста

Всё, что относится к Snowflake, является примером конфигурации. У нас нет аккаунта Snowflake, и мы не запускали ни этот SQL, ни эти процедуры, ни эту спецификацию агента. Синтаксис основан на документации docs.snowflake.com по состоянию на 2026-11-06. В этом месяце Snowflake выпустила крупный релиз, так что синтаксис и ограничения ещё могут измениться. Прежде чем полагаться на какой-либо блок, выполните его в своём аккаунте.

В таблице расходов реальной ценой является только плата за API. Все строки Snowflake представляют собой оценки на основе публичных цен и наших допущений. Две главные неизвестные: реальное число токенов на один классифицированный комментарий и на один вопрос к агенту.

Что касается данных, в этот раз ни один из 5 вызовов для отзывов Amazon не вернул отзывов. Поэтому тематический анализ построен только на 273 комментариях из TikTok. Их вручную разметил один автор по правилу выше, и повторно разметку никто не проверял. 17 комментариев о проблемах достаточно, чтобы сказать, что проблемы с крышкой и протечками заслуживают внимания. Но их недостаточно, чтобы оценить реальную долю проблем у этого товара.

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

Одно ограничение касается самой EveryInfra. Наш MCP-сервер сейчас нельзя добавить как коннектор Snowflake по причинам, описанным выше. На маршрут через внешний доступ это не влияет, и именно его мы рекомендуем. Но если вашей команде нужно подключение в один клик внутри CoWork, пока это невозможно. Мы ещё раз проверим статус к моменту публикации статьи.

Чем этот подход отличается от наших предыдущих статей

В наших предыдущих статьях об отзывах данные оставались внутри агента или файла: запланированные задачи Claude Cowork, Claude Managed Agents для ночной проверки отзывов, Qwen Agent MCP на практике и DeepSeek V4 в Claude Code для очистки отзывов. Они отвечают на вопрос «на что люди жалуются в последнее время». Здесь отзывы попадают в корпоративное хранилище данных, под те же правила доступа и бизнес-определения, что и продажи с возвратами, и вопрос превращается в «какая жалоба действительно стоит нам денег». Цена: ещё один счёт за хранилище и набор таблиц, по расчёту выше около пятнадцати долларов в месяц на один бренд. Если ваши продажи и возвраты ещё не в Snowflake, предыдущие подходы проще. Если они уже там, эта схема впервые позволяет сопоставить жалобы с финансовыми показателями.

Последние изменения

2026-11-04 вступила в силу новая Service Consumption Table Snowflake. Все цены моделей, цены AI-функций и строка «Cortex Tools» в этой статье взяты из этой версии (Service Consumption Table).

В тот же день вышло примечание к выпуску: в MCP-сервере под управлением Snowflake появились фоновые запуски. Инструменты CORTEX_AGENT_RUN и CODING_AGENT получили аргумент background, с которым вызов сразу возвращает дескриптор. Серверы с этими инструментами теперь автоматически получают ещё три инструмента: ASYNC_AGENT_RUN_STATUS, ASYNC_AGENT_RUN_CANCEL и AGENT_RUN_RESULT. Новый параметр content_cel_filter позволяет клиенту сначала получить оглавление, а затем прочитать только нужные части (примечание к выпуску от 4 ноября 2026 года).

Частые вопросы о Snowflake Cortex Agents MCP и Snowflake CoWork

MCP-сервер Snowflake Cortex Agents — это то же самое, что MCP-коннектор?

Нет. Они работают в противоположных направлениях. Источник: автодополнение Google по запросу «snowflake cortex agents mcp server». MCP-сервер под управлением Snowflake делает Snowflake сервером. Внешние клиенты через MCP вызывают ваших агентов, Cortex Search, Cortex Analyst и SQL. Типы инструментов этого сервера: CORTEX_AGENT_RUN, CODING_AGENT, CORTEX_SEARCH_SERVICE_QUERY, CORTEX_ANALYST_MESSAGE, SYSTEM_EXECUTE_SQL и GENERIC. Документация рекомендует OAuth вместо токенов, прописанных в коде (Snowflake-managed MCP server, CREATE MCP SERVER).

MCP-коннектор делает Snowflake клиентом: Cortex Agents и CoWork могут вызывать внешний MCP-сервер, причём только через OAuth (документация по коннекторам). В этой статье нужно второе направление, но в итоге мы используем внешний доступ (external access) вместо MCP.

Чем Snowflake CoWork отличается от CoCo (Cortex Code)?

Источник: автодополнение Google по запросу «snowflake cowork vs coco». Согласно пресс-релизу от 2026-11-03, CoWork предназначен для бизнес-пользователей. Они задают вопросы обычным языком на ai.snowflake.com, открывают дашборды и настраивают автоматизации. CoCo предназначен для разработчиков и дата-инженеров: с его помощью они пишут код и создают объекты данных. Аналитики тоже могут описать нужный дашборд в CoCo, и CoCo его построит (пресс-релиз Expedition 2026, документация Cortex Code).

В этой статье дата-инженеры создают таблицы, процедуры и семантическое представление с помощью CoCo или обычного SQL. Бизнес-пользователи задают вопросы и получают еженедельный отчёт в CoWork.

Могут ли Cortex Agents вызывать внешний API по API-ключу вместо OAuth?

Да, но не через MCP-коннектор. Источник: вопрос, который возникает после строки «только OAuth» в документации Snowflake по коннекторам. Сохраните ключ в секрете типа GENERIC_STRING и используйте его через интеграцию внешнего доступа (external access integration). Напишите хранимую процедуру на Python, которая вызывает API, и добавьте её агенту как пользовательский инструмент. Когда агент вызывает этот инструмент, процедура выполняется на виртуальном складе (warehouse), а плата начисляется за время работы склада (внешний сетевой доступ, обзор Cortex Agents). Мы предпочитаем задачу по расписанию, которая загружает данные в таблицы, чтобы при ответе на каждый вопрос не приходилось ждать ответа API.

Работает ли AI_CLASSIFY с комментариями не на английском языке?

Работает, но сначала проверьте результат. Источник: примечания по использованию в документации Snowflake по AI_CLASSIFY. В документации сказано, что лучше всего функция работает с английским текстом, а на других языках качество может быть ниже (документация AI_CLASSIFY). Если вы отслеживаете испаноязычные или другие рынки, вручную разметьте около 100 комментариев и сравните результаты. Там, где категории расходятся, сделайте описание задачи и примеры конкретнее. Можно также поручить оценку каждого комментария более сильной модели в Cortex Agents, но это дороже.

Взимает ли EveryInfra плату за неудачные вызовы или вызовы с пустым результатом?

Нет. Источник: ответы на наши 12 реальных вызовов. За вызовы с неверными параметрами, временно недоступными целями (статус 503) и пустыми результатами плата не взимается, а в каждом ответе со списанием указана точная сумма. Во всех 6 вызовах в этой статье, которые не вернули данных, значение charged_usd равно 0. В асинхронном режиме средства списываются при отправке задания, а если оно позже завершается ошибкой, списанная сумма возвращается.

С чего начать

  1. Зарегистрируйтесь в EveryInfra и выполните инструкции из раздела «Быстрый старт». Создайте отдельный API-ключ, предназначенный только для Snowflake, и задайте для него собственный лимит запросов в минуту.
  2. Выполните через curl по одному вызову API для каждого URL товара, URL видео и ключевого слова. Проверьте поля и количество записей, прежде чем добавлять цели в таблицу watchlist.
  3. В Snowflake создайте сетевое правило, секрет и интеграцию внешнего доступа по примерам выше. Затем создайте две процедуры и две задачи.
  4. Через несколько дней после начала загрузки данных создайте еженедельное представление и семантическое представление. Разметьте комментарии и примечания к возвратам по тем же темам AI_CLASSIFY.
  5. Создайте Cortex Agent и задайте ему несколько вопросов в CoWork. Когда он начнёт правильно сообщать о пропущенных неделях, настройте еженедельную автоматизацию.

Все возможности сбора данных перечислены в каталоге EveryInfra. Настройка удалённого MCP-сервера описана на странице MCP-сервера, а цены за каждый вызов указаны на странице «Тарифы».

Источники

  1. Пресс-релиз Snowflake, «Expedition 2026: CoCo and CoWork», дата обращения 2026-11-06: https://www.snowflake.com/en/news/press-releases/expedition-2026-coco-cowork/
  2. Пресс-релиз Snowflake, «Business Ontology and Cortex AI Gateway», дата обращения 2026-11-06: https://www.snowflake.com/en/news/press-releases/expedition-2026-business-ontology-ai-gateway/
  3. Блог Snowflake, «AI agents, governed data and business context», дата обращения 2026-11-06: https://www.snowflake.com/en/blog/ai-agents-governed-data-business-context/
  4. Блог Snowflake, «Snowflake CoWork Adds Profiles, Dashboards and Automations», дата обращения 2026-11-06: https://www.snowflake.com/en/blog/snowflake-cowork-profiles-automations-dashboards
  5. Блог Snowflake, «Snowflake CoCo cloud agents and automations», дата обращения 2026-11-06: https://www.snowflake.com/en/blog/snowflake-coco-cloud-agents-automations/
  6. Страница продукта Snowflake CoWork, дата обращения 2026-11-06: https://www.snowflake.com/en/product/snowflake-cowork/
  7. Snowflake, «Pricing options», дата обращения 2026-11-06: https://www.snowflake.com/en/pricing-options/
  8. Snowflake, «Service Consumption Table», действует с 2026-11-04, дата обращения 2026-11-06: https://www.snowflake.com/legal-files/CreditConsumptionTable.pdf
  9. Документация Snowflake, «Cortex Agents MCP connectors», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents-mcp-connectors
  10. Документация Snowflake, «Cortex Agents MCP connectors», раздел «Limitations», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents-mcp-connectors#limitations
  11. Документация Snowflake, «Cortex Agents», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents
  12. Документация Snowflake, «Create and manage agents», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents-manage
  13. Документация Snowflake, «CREATE AGENT», дата обращения 2026-11-06: https://docs.snowflake.com/en/sql-reference/sql/create-agent
  14. Документация Snowflake, «Cortex Agents Run API», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents-run
  15. Документация Snowflake, «Cortex Agents resource budgets», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents-resource-budgets
  16. Документация Snowflake, «Cortex Agents code execution tool», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents-code-execution-tool
  17. Документация Snowflake, «Snowflake-managed MCP server», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents-mcp
  18. Документация Snowflake, «CREATE MCP SERVER», дата обращения 2026-11-06: https://docs.snowflake.com/en/sql-reference/sql/create-mcp-server
  19. Примечание к выпуску Snowflake от 4 ноября 2026 года, «Background runs and additional supplementary tools for agents», дата обращения 2026-11-06: https://docs.snowflake.com/en/release-notes/2026/other/2026-11-04-mcp-async-agent-tools
  20. Документация Snowflake, «Cortex AI Gateway custom apps and MCP servers», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-ai-gateway/tools/admin-custom-apps
  21. Документация Snowflake, «Cortex Code Agent SDK, MCP and custom tools», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/cortex-code-agent-sdk/mcp-custom-tools
  22. Документация Snowflake, «Cortex Code», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/cortex-code/cortex-code
  23. Документация Snowflake, «Snowflake CoWork», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/snowflake-cortex/snowflake-cowork
  24. Документация Snowflake, «CoWork Automations», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/snowflake-cortex/snowflake-cowork/automations
  25. Документация Snowflake, «Cortex AI pricing», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/snowflake-cortex/pricing
  26. Документация Snowflake, «Cortex AI Functions», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/snowflake-cortex/aisql
  27. Документация Snowflake, «AI_CLASSIFY», дата обращения 2026-11-06: https://docs.snowflake.com/en/sql-reference/functions/ai_classify
  28. Документация Snowflake, «AI_SENTIMENT», дата обращения 2026-11-06: https://docs.snowflake.com/en/sql-reference/functions/ai_sentiment
  29. Документация Snowflake, «Semantic views overview», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/views-semantic/overview
  30. Документация Snowflake, «CREATE SEMANTIC VIEW», дата обращения 2026-11-06: https://docs.snowflake.com/en/sql-reference/sql/create-semantic-view
  31. Документация Snowflake, «External network access overview», дата обращения 2026-11-06: https://docs.snowflake.com/en/developer-guide/external-network-access/external-network-access-overview
  32. Документация Snowflake, «Creating and using an external access integration», дата обращения 2026-11-06: https://docs.snowflake.com/en/developer-guide/external-network-access/creating-using-external-network-access
  33. Документация Snowflake, «External network access examples», дата обращения 2026-11-06: https://docs.snowflake.com/en/developer-guide/external-network-access/external-network-access-examples
  34. Документация Snowflake, «CREATE NETWORK RULE», дата обращения 2026-11-06: https://docs.snowflake.com/en/sql-reference/sql/create-network-rule
  35. Документация Snowflake, «CREATE SECRET», дата обращения 2026-11-06: https://docs.snowflake.com/en/sql-reference/sql/create-secret
  36. Документация Snowflake, «CREATE EXTERNAL ACCESS INTEGRATION», дата обращения 2026-11-06: https://docs.snowflake.com/en/sql-reference/sql/create-external-access-integration
  37. Документация Snowflake, «Writing stored procedures in Python», дата обращения 2026-11-06: https://docs.snowflake.com/en/developer-guide/stored-procedure/python/procedure-python-overview
  38. Документация Snowflake, «CREATE TASK», дата обращения 2026-11-06: https://docs.snowflake.com/en/sql-reference/sql/create-task
  39. Документация Snowflake, «Introduction to tasks», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/tasks-intro
  40. Документация Snowflake, «Snowpipe», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/data-load-snowpipe-intro
  41. Документация Snowflake, «Overview of warehouses», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/warehouses-overview
  42. Документация Snowflake, «Understanding compute cost», дата обращения 2026-11-06: https://docs.snowflake.com/en/user-guide/cost-understanding-compute
  43. Документация Snowflake, «CORTEX_AGENT_USAGE_HISTORY view», дата обращения 2026-11-06: https://docs.snowflake.com/en/sql-reference/account-usage/cortex_agent_usage_history
  44. Документация Snowflake, «SNOWFLAKE_COWORK_USAGE_HISTORY view», дата обращения 2026-11-06: https://docs.snowflake.com/en/sql-reference/account-usage/snowflake_cowork_usage_history_view
  45. Документация Snowflake, «EXTERNAL_ACCESS_HISTORY view», дата обращения 2026-11-06: https://docs.snowflake.com/en/sql-reference/account-usage/external_access_history
  46. Спецификация MCP, «Authorization», версия 2025-06-18, дата обращения 2026-11-06: https://modelcontextprotocol.io/specification/2025-06-18/basic/authorization
  47. IETF RFC 9728, «OAuth 2.0 Protected Resource Metadata», дата обращения 2026-11-06: https://datatracker.ietf.org/doc/html/rfc9728
  48. IETF RFC 8414, «OAuth 2.0 Authorization Server Metadata», дата обращения 2026-11-06: https://datatracker.ietf.org/doc/html/rfc8414
  49. IETF RFC 7591, «OAuth 2.0 Dynamic Client Registration Protocol», дата обращения 2026-11-06: https://datatracker.ietf.org/doc/html/rfc7591
  50. Документация Amazon SP-API, «FBA report type values», дата обращения 2026-11-06: https://developer-docs.amazon/sp-api/docs/report-type-values-fba
  51. National Retail Federation, «Consumers expected to return nearly $850 billion in merchandise in 2025», дата обращения 2026-11-06: https://nrf.com/media-center/press-releases/consumers-expected-to-return-nearly-850-billion-in-merchandise-in-2025
  52. Analytics India Magazine, «Snowflake introduces Business Ontology and Cortex AI Gateway», дата обращения 2026-11-06: https://analyticsindiamag.com/ai-news/snowflake-introduces-business-ontology-cortex-ai-gateway-to-bring-ai-agents-into-enterprise-workflows
  53. Каталог возможностей EveryInfra, GET /api/v1/social/catalog, дата обращения 2026-11-06: https://api.everyinfra.com/api/v1/social/catalog
  54. Адрес удалённого MCP-сервера EveryInfra (проверен 2026-11-06): https://api.everyinfra.com/mcp
  55. Метаданные защищённого ресурса EveryInfra для полного MCP-адреса (проверены 2026-11-06): https://api.everyinfra.com/.well-known/oauth-protected-resource/mcp/all

Справка BL-97