Три маркетплейса, три API, три набора подводных камней — и ноль ручного кодинга. Рассказываю, как мультиагентный пайплайн в OpenClaw самостоятельно написал интеграцию с Ozon, Wildberries и Яндекс Маркетом: 35 задач, 23 новых файла, ~4700 строк кода за 11 минут. Плюс 14 минут на код-ревью с CISO-агентом, который нашёл 21 баг — включая три критических.
Это вторая статья про OpenClaw — open-source платформу для AI-агентов. В первой мы собирали skill для российских LLM и Яндекс 360, и формат «подводные камни API» зашёл читателям. Сегодня — та же идея, но масштабнее: три реальных API одновременно.
Если вы продаёте на одной площадке — всё терпимо. Открыл кабинет, посмотрел заказы, обновил цены. Но если у вас Ozon + WB + Яндекс Маркет одновременно (а это реальность для большинства селлеров), начинается ад:
Три личных кабинета с разной логикой
Три разных API, которые даже аутентификацию делают по-разному
Три формата цен — рубли, копейки, и "RUR" вместо "RUB"
Мониторинг разбросан по трём вкладкам
Идея простая: AI-агент, который умеет ходить во все три API и отвечать на человеческий язык:
OpenClaw позволяет создавать такие интеграции через skills — наборы bash-инструментов, которые агент вызывает по контексту.
Весь skill был написан не мной руками, а четырьмя специализированными агентами OpenClaw:
Researcher → Planner → Coder → Researcher (review) → CISO (security) → [fix loop] × 3
Researcher (11 мин): Проанализировал документацию всех трёх API. Сходил на dev.wildberries.ru, api.partner.market.yandex.ru, сравнил с уже реализованным Ozon. Написал 500-строчный отчёт с таблицей сравнения.
Planner (3 мин): Получил отчёт, разбил на 35 пронумерованных задач в 4 фазы. Каждая задача — конкретный файл, конкретная функция. Включил FMA (Failure Mode Analysis) — 10 рисков с митигациями.
Coder (11 мин): Получил план, написал код. 23 новых файла, 12 модифицированных. 4 фазы: scaffolding → WB → Яндекс Маркет → тесты и документация. 18 коммитов.
Review loop (14 мин, 3 итерации):
Researcher — функциональное ревью (логика, edge cases, пропущенные требования)
CISO — security audit (credentials в логах, race conditions, валидация входных данных)
Цикл: Bugs найдены → Coder фиксит → повторное ревью → пока не останутся только LOW severity
Это часть Kai Protocol — системы самообучения агентов через A3 post-mortems (Toyota Production System). Каждая найденная ошибка документируется: триггер → причина → митигация → обновление системных файлов. Цель: никогда не повторять одну ошибку дважды.
Итого: 25 минут от "нужна интеграция с WB и Яндекс Маркет" до работающего skill'а с тестами.
Ключевое решение — не три отдельных skill'а, а один с флагом --platform:
mp-orders list --platform wb --mock # заказы WB mp-prices get SKU123 --platform ymarket # цена на Яндекс Маркете mp-stocks list --platform ozon # остатки на Ozon
Без --platform всё работает как раньше — ozon по умолчанию. Обратная совместимость — святое.
Структура:
lib/ ├── common/ # Общий слой │ ├── platform.sh # --platform парсинг, dispatch │ ├── http.sh # mock_request(), batch_execute() │ ├── formatter.sh # kopecks_to_rubles(), normalize_currency() │ └── audit.sh # audit log с полем PLATFORM ├── ozon/, wb/, ymarket/ # Платформо-специфичная логика │ ├── auth.sh, http.sh, orders.sh, prices.sh, stocks.sh └── wb/mocks/ # Тестовые данные tools/ ├── mp-orders, mp-prices, mp-stocks # Все платформы ├── mp-setup # Настройка credential'ов └── mp-test # Проверка подключения
У каждой платформы — свой HTTP-клиент (wb_request, ymarket_request, ozon_request), потому что различия слишком фундаментальные для единого враппера.
Вот таблица, которую собрал Researcher-агент:
|
Аспект |
Ozon |
Wildberries |
Яндекс Маркет |
|---|---|---|---|
|
Авторизация |
|
|
|
|
Base URL |
Один |
Несколько по категориям! |
Один |
|
Формат цен |
|
|
|
|
Валюта |
|
|
|
|
Rate limit |
429 |
429 (+ 409 конфликт) |
420 (не 429!) |
|
Sandbox |
Есть |
Есть (ограниченный) |
Нет |
Подводный камень #1: Несколько base URL. WB разнёс API по поддоменам:
declare -A WB_API_HOSTS=( [content]="content-api.wildberries.ru" [marketplace]="marketplace-api.wildberries.ru" [prices]="discounts-prices-api.wildberries.ru" )
Заказы — на marketplace-api. Цены — на discounts-prices-api. Каталог — на content-api. Каждый запрос нужно маршрутизировать правильно.
Подводный камень #2: Цены в копейках. "salePrice": 504600 — это не 500 тысяч рублей, а 5046.00₽. Если забыть конвертировать при обновлении — поставите товар за 25₽ вместо 2500₽.
Подводный камень #3: Двойной статус заказа. У WB два статуса:
supplierStatus — управляете вы (new → confirm → complete)
wbStatus — управляет WB (waiting → sorted → sold)
Нужно показывать оба, иначе селлер не понимает реальное состояние.
Подводный камень #1: HTTP 420 вместо 429. Rate limit — это 420 Enhance Your Calm, а не стандартный 429. Generic retry-логика его пропустит.
Подводный камень #2: Ценовой карантин. Если меняете цену >5%, она попадает в карантин и требует подтверждения. Ни Ozon, ни WB такого не имеют.
Подводный камень #3: RUR, не RUB. API использует старый код рубля "RUR". Отправите "RUB" — получите ошибку.
Подводный камень #4: businessId vs campaignId. Двухуровневая система — для разных операций нужны разные ID. Перепутали — получите 404 Not Found на существующем эндпоинте.
На фоне WB и Яндекса, Ozon — образец последовательного дизайна:
Один base URL
Цены в рублях
Стандартный 429 для rate limit
Консистентная пагинация
Это не реклама — просто факт: Ozon API проще всего интегрировать.
После того как Coder написал код, Researcher и CISO получили задачу найти всё, что сломано.
Результат первого прохода:
|
Severity |
Кол-во |
Примеры |
|---|---|---|
|
CRITICAL |
3 |
Rollback парсил 9 полей в 8 переменных — все данные сдвинуты |
|
HIGH |
6 |
YM stocks = 0 у всех товаров, WB prices не фильтровал по SKU |
|
MEDIUM |
7 |
Токены не маскировались в логах, |
|
LOW |
5 |
Неверные комментарии, опечатки |
Три критических бага:
Баг #1 (CRITICAL): Сдвиг полей в rollback.
Audit log пишет 9 полей: TIMESTAMP|USER|PLATFORM|BATCH_ID|ACTION|SKU|OLD_VALUE|NEW_VALUE|STATUS
Но rollback_batch парсил только 8 переменных — без PLATFORM. Результат: каждое поле сдвинуто на позицию. Проверка if [[ "$action" == "price_update" ]] никогда не срабатывала — в $action лежал batch_id.
Баг #2 (CRITICAL): Rollback всегда идёт в Ozon.
Даже после парсинга — rollback вызывал жёстко прописанные update_price() и update_stock() (только для Ozon). Откат цены на WB отправлял запрос в Ozon API. Нужен был platform dispatch.
Баг #3 (HIGH): YM stocks = 0 у всех товаров.mp-stocks get использовал .stock // .count // 0, но Яндекс возвращает .stocks[0].count. Все товары показывали 0 единиц.
Итерация 1: 21 баг → 12 исправлено (все CRITICAL + HIGH)
Итерация 2: 6 MEDIUM → исправлены
Итерация 3: финальная проверка, 0 новых багов
Без review loop эти баги попали бы в продакшен. Особенно баг #1 — rollback молча не делал ничего, и обнаружился бы только когда реальный селлер пытался бы откатить неправильную цену.
Установка:
openclaw skills add https://github.com/smvlx/openclaw-marketplace-ru
Первый запуск — в mock-режиме:
mp-orders list --platform wb --mock mp-prices list --platform ymarket --mock ./examples/morning-digest.sh --platform all --mock
Настройка реального подключения:
mp-setup --platform ozon # Client-Id + Api-Key mp-setup --platform wb # API токен mp-setup --platform ymarket # API Key mp-test --platform wb # Проверка
WB base URL'ы из OpenAPI-спеки. Если WB их поменяет — URL'ы настраиваемые через wb.env.
Яндекс без песочницы. Рекомендуется тестировать на hidden offers.
bash 4+. На macOS со стандартным bash 3.2 не запустится — нужен brew install bash.
Это open-source проект, нужны контрибьюторы:
Селлеры с реальными аккаунтами для тестирования
Разработчики для расширения покрытия API
Баг-репорты из реальной эксплуатации
GitHub: github.com/smvlx/openclaw-marketplace-ru
Три маркетплейса, три совершенно разных API. WB с ценами в копейках и зоопарком URL'ов, Яндекс с HTTP 420 и ценовым карантином, Ozon — предсказуемый.
Мультиагентный пайплайн справился за 25 минут: 35 задач, 23 файла, 3 раунда код-ревью, 21 баг найден и исправлен автоматически. Без CISO-агента три критических бага ушли бы в продакшен.
Skill работает в mock-режиме из коробки. Если готовы поучаствовать в боевом тестировании - пишите в тг @smvlx.
Источник


