Skip to content

AdolfReputationBack — API Reference

Версия: 1.2.50 Base URL: https://your-server.com (dev: http://localhost:8000) Swagger UI: {BASE_URL}/docs


Содержание

  1. Health
  2. Reviews — Чтение
  3. Reviews — Генерация ответов
  4. Reviews — Модерация
  5. Reviews — Публикация
  6. Reviews — История
  7. Polling (сбор отзывов)
  8. Statistics (аналитика)
  9. Settings (настройки)
  10. Prompt Management (промт генерации)
  11. Автоматические процессы (Scheduler)
  12. Схема БД
  13. Пайплайн обработки
  14. Миграции

1. Health

GET /

Информация о сервисе.

Ответ:

json
{
  "service": "AdolfReputationBack",
  "version": "1.2.50",
  "docs": "/docs"
}

GET /health

Проверка соединения с БД.

Ответ:

json
{
  "status": "ok",
  "db": "connected"
}

GET /worker/status

Статус worker'а авто-генерации. Проверяет последний запуск по auto_process_log.

Ответ:

json
{
  "status": "healthy",
  "last_run": "2026-03-25T12:00:00",
  "age_minutes": 4.2,
  "last_action": "auto_generate:success"
}
ПолеТипОписание
statusstringnever_run / healthy / stale (stale если > 15 мин)
last_rundatetime?ISO-дата последнего запуска (null если не запускался)
age_minutesfloatМинут с последнего запуска
last_actionstringТип последней операции

2. Reviews — Чтение

GET /api/v1/reviews

Список отзывов/вопросов с фильтрацией и пагинацией.

Query-параметры:

ПараметрТипПо умолчаниюОписание
marketplacestringwildberries, ozon, yandex_market
statusstringnew, analyzing, pending_review, approved, publishing, published, answered, skipped, escalated, error, manual_required
item_typestringreview, question
sort_bystringcreated_atПоле сортировки: created_at, rating, wb_created_at
orderstringdescПорядок: asc, desc
ratingintФильтр по оценке (1–5)
searchstringПоиск по тексту, имени клиента, плюсам, минусам, артикулу (ILIKE)
date_fromdateНачало периода (YYYY-MM-DD), фильтр по wb_created_at
date_todateКонец периода (YYYY-MM-DD), фильтр по wb_created_at
pageint1Номер страницы (≥ 1)
page_sizeint20Записей на странице (1–100)

Ответ: ItemListResponse

json
{
  "items": [ItemResponse],
  "total": 150,
  "page": 1,
  "page_size": 20
}

GET /api/v1/reviews/{item_id}

Детали одного отзыва/вопроса.

Ответ: ItemResponse

json
{
  "id": 1,
  "wb_id": "12345678",
  "item_type": "review",
  "marketplace": "wildberries",
  "client_name": "Анна",
  "client_text": "Отличное платье, хорошо сидит!",
  "rating": 5,
  "status": "pending_review",
  "product_id": 987654,
  "vendor_code": "ART-12345",
  "pros": "Качество ткани, посадка",
  "cons": null,
  "wb_created_at": "2026-03-10T12:00:00",
  "created_at": "2026-03-10T13:05:00",
  "is_viewed": false,
  "response": {
    "id": 1,
    "ai_variants": [
      {
        "text": "Добрый день, Анна! Благодарим...",
        "classification": { "sentiment": "positive", "tags": ["качество"], "scenario": "five_stars" },
        "generated_at": "2026-03-10T13:06:00",
        "generation_id": "uuid",
        "draft_id": "uuid"
      }
    ],
    "final_text": null,
    "status": "draft",
    "manager_notes": null,
    "generated_at": "2026-03-10T13:06:00",
    "published_at": null,
    "wb_error": null,
    "marketplace": "wildberries",
    "source": "ai"
  }
}

Поля ItemResponse:

ПолеТипОписание
idintВнутренний ID
wb_idstringID на маркетплейсе
item_typestringreview / question
marketplacestringwildberries / ozon / yandex_market
client_namestring?Имя покупателя
client_textstring?Текст отзыва/вопроса
ratingint?Оценка 1–5 (null для вопросов)
statusstringТекущий статус обработки
product_idint?ID товара на маркетплейсе
vendor_codestring?Артикул продавца
prosstring?Достоинства
consstring?Недостатки
wb_created_atdatetime?Дата создания на маркетплейсе
created_atdatetime?Дата загрузки в систему
is_viewedbool?Просмотрен менеджером
responseResponseInfo?Вложенный объект с ответом

Поля ResponseInfo:

ПолеТипОписание
idintID ответа
ai_variantslist?Массив сгенерированных вариантов (макс. 5)
final_textstring?Одобренный текст
statusstring?draft / approved / published / failed
manager_notesstring?Заметки менеджера
generated_atdatetime?Дата первой генерации
published_atdatetime?Дата публикации
wb_errorstring?Ошибка от маркетплейса
marketplacestring?Маркетплейс
sourcestring?ai / manager

3. Reviews — Генерация ответов

POST /api/v1/reviews/{item_id}/generate

Классификация отзыва + генерация черновика.

Тело запроса (необязательно):

json
{
  "instructions": "Упомяни скидку 20% на следующий заказ"
}

Что происходит:

  1. Статус → analyzing
  2. Создаётся ReputationGeneration
  3. Отзыв классифицируется → sentiment, tags, scenario
  4. Генерируется ответ (50–700 символов, до 3 попыток с валидацией)
  5. Создаётся ReputationDraft
  6. Статус → pending_review

Правила валидации:

ПравилоУсловие
Длина50–700 символов
Запрещённые словаконкуренты, сторонние сайты
Извинение для негативаПри rating ≤ 3 обязательно: «сожалеем» / «извин» / «жаль»
Чужой маркетплейсНельзя упоминать другие площадки

Ответ: GenerateResponse

json
{
  "item_id": 1,
  "generation_id": "uuid",
  "draft_id": "uuid",
  "draft_text": "Добрый день, Анна! Благодарим за тёплый отзыв...",
  "ai_variants": [...]
}

POST /api/v1/reviews/{item_id}/regenerate

Генерация нового варианта. Максимум 5 вариантов на один отзыв.

Тело запроса (обязательно):

json
{
  "instructions": "Сделай ответ короче"
}

Предусловия: сначала вызвать /generate, количество черновиков < 5.

Ошибки: 400 — лимит превышен или нет базового ответа.


POST /api/v1/reviews/bulk-regenerate

Массовая перегенерация для всех неопубликованных items.

Query-параметры: item_type, marketplace (необязательны).

Ответ:

json
{
  "updated": 12,
  "errors": 1,
  "total": 13,
  "message": "Перегенерировано 12 из 13"
}

4. Reviews — Модерация

POST /api/v1/reviews/{item_id}/approve

Одобрение последнего черновика.

Тело запроса (необязательно):

json
{
  "final_text": "Мой отредактированный текст"
}

Приоритет текста: final_text из тела → текст черновика → последний вариант ai_variants.

Результат: черновик, ответ и отзыв → approved. Ответ: ItemResponse.


POST /api/v1/reviews/bulk-approve

Массовое одобрение.

Тело запроса:

json
{
  "item_ids": [1, 2, 3]
}

Ответ:

json
{
  "approved_count": 3,
  "item_ids": [1, 2, 3]
}

POST /api/v1/reviews/{item_id}/skip

Пропустить отзыв. Статус → skipped. Ответ: ItemResponse.

POST /api/v1/reviews/{item_id}/escalate

Эскалация. Статус → escalated. Ответ: ItemResponse.


5. Reviews — Публикация

POST /api/v1/reviews/{item_id}/publish

Отправка одобренного ответа на маркетплейс.

Предусловия: response.statusapproved или failed.

Маркетплейсы и API:

МаркетплейсОтзывыВопросы
WildberriesPOST /api/v1/feedbacks/answerPATCH /api/v1/questions
Яндекс МаркетPOST /v2/businesses/{id}/goods-feedback/commentsPOST /v1/businesses/{id}/goods-questions/answers
OzonPOST /v1/review/comment/createPOST /v1/question/answer/create

Ответ: PublishResponse

json
{
  "item_id": 1,
  "publication_id": "uuid",
  "status": "published",
  "error": null
}
statusОписание
publishedУспешно, отзыв → answered
failedОшибка, отзыв → error (автоповтор раз в час)

6. Reviews — История

GET /api/v1/reviews/{item_id}/history

Полная история: генерации, черновики, публикации.

Ответ:

json
{
  "item_id": 1,
  "generations": [
    {
      "id": "uuid",
      "status": "completed",
      "analysis_result": { "sentiment": "positive", "scenario": "five_stars" },
      "created_at": "2026-03-10T13:05:30",
      "completed_at": "2026-03-10T13:05:35"
    }
  ],
  "drafts": [
    {
      "id": "uuid",
      "generation_id": "uuid",
      "response_text": "Добрый день, Анна!...",
      "is_valid": true,
      "status": "approved",
      "created_at": "2026-03-10T13:05:36"
    }
  ],
  "publications": [
    {
      "id": "uuid",
      "draft_id": "uuid",
      "published_text": "Добрый день, Анна!...",
      "status": "success",
      "published_at": "2026-03-10T14:00:00"
    }
  ]
}

7. Polling (сбор отзывов)

POST /api/v1/polling/{marketplace}/trigger

Ручной запуск сбора. marketplace: wildberries, ozon, yandex_market.

Query: item_type (review / question). Если не указан — оба типа.

Ответ:

json
{
  "results": [
    {
      "status": "success",
      "marketplace": "wildberries",
      "item_type": "review",
      "fetched": 45,
      "new": 12,
      "duplicates": 33
    }
  ]
}

Особенности: дедупликация по (marketplace, wb_id). Circuit breaker: 5 ошибок → пауза 60 сек.


GET /api/v1/polling/status

Состояние поллинга по всем маркетплейсам.

Ответ:

json
{
  "states": [
    {
      "marketplace": "wildberries",
      "item_type": "review",
      "last_poll_time": "2026-03-10T13:00:00+00:00",
      "last_poll_status": "success",
      "items_fetched_total": 1500,
      "consecutive_errors": 0,
      "circuit_breaker_open": false
    }
  ]
}

8. Statistics (аналитика)

GET /api/v1/stats

Ежедневная статистика + счётчики неотвеченных + агрегированная сводка.

Query-параметры:

ПараметрТипОписание
date_fromdateYYYY-MM-DD, фильтр по created_at
date_todateYYYY-MM-DD, фильтр по created_at
marketplacestringwildberries / ozon / yandex_market

Ответ: StatsResponse

json
{
  "stats": [StatsItem],
  "total": 30,
  "counters": {
    "total_unanswered": 42,
    "by_marketplace": [
      {
        "marketplace": "wildberries",
        "new_reviews": 12,
        "new_questions": 5,
        "pending_review": 8
      }
    ]
  },
  "summary": { ... }
}

Поля StatsItem:

ПолеТипОписание
datedateДата
marketplacestringМаркетплейс
total_itemsintВсего отзывов + вопросов
reviews_countintТолько отзывы
questions_countintТолько вопросы
positive_countintrating ≥ 4
neutral_countintrating = 3
negative_countintrating ≤ 2
avg_ratingfloat?Средняя оценка
published_countintОпубликовано (всего)
our_published_countintОпубликовано нами
seller_published_countintОпубликовано продавцом
our_avg_response_time_minint?Среднее время ответа — наши

GET /api/v1/stats/summary

Агрегированные метрики для дашборда.

Query: marketplace (необязательно).

Ответ: DashboardSummary

json
{
  "total_items": 5000,
  "avg_rating": 4.3,
  "positive_count": 3500,
  "published_count": 4200,
  "our_published_count": 3000,
  "our_avg_response_time_min": 30,
  "marketplaces": [
    {
      "marketplace": "wildberries",
      "total": 3000,
      "avg_rating": 4.5,
      "response_pct": 85,
      "our_response_pct": 60
    }
  ]
}

POST /api/v1/stats/recompute

Пересчёт аналитики за последние N дней.

Query: days (int, по умолчанию 90, максимум 365).

Ответ:

json
{
  "recomputed_days": 270,
  "message": "Пересчитано 270 записей за 90 дней"
}

9. Settings (настройки)

GET /api/v1/settings

Все настройки. Ответ: list[SettingResponse].

GET /api/v1/settings/{key}

Одна настройка. Ответ:

json
{
  "key": "auto_generate_enabled",
  "value": "true",
  "updated_at": "2026-03-10T12:00:00"
}

Ошибки: 404 — ключ не найден.

PUT /api/v1/settings/{key}

Создать или обновить. Тело: {"value": "true"}. Ответ: SettingResponse.


10. Prompt Management (промт генерации)

Менеджер может просматривать и редактировать системный промт AI-генерации без деплоя. Дефолтное значение захардкожено в ai_prompts.py; кастомное хранится в app_settings и имеет приоритет.

Менеджер пишет свободный текст (тон, правила, стиль) — данные по отзыву и товару код всегда добавляет сам.

GET /api/v1/prompts

Получить текущий промт.

Ответ:

json
{
  "current_value": "Ты вежливый менеджер...",
  "default_value": "Ты представитель бренда...",
  "is_customized": true,
  "updated_at": "2026-03-30T12:00:00"
}
ПолеОписание
current_valueЧто реально используется при генерации
default_valueДефолт из кода — для кнопки «Посмотреть оригинал»
is_customizedМенеджер изменял промт — для бейджа «изменён» и кнопки «Сбросить»
updated_atДата последнего изменения, null если не менял

PUT /api/v1/prompts

Сохранить кастомный промт.

Тело: {"value": "Новый текст..."}. Пустая строка → 400.

Ответ: тот же объект с is_customized: true.


DELETE /api/v1/prompts

Сбросить к дефолту (удаляет запись из app_settings).

Ответ: тот же объект с is_customized: false, current_value == default_value, updated_at: null.


11. Автоматические процессы (Scheduler)

Scheduler активен с v1.2.50. Запускается при старте сервера. Backfill убран из автозапуска — для исторических данных: POST /stats/recompute.

Периодические задачи

ЗадачаИнтервалОписание
auto_generate_pendingКаждые 5 минутБерёт до 5 отзывов со статусом new, классифицирует и генерирует черновик. Управляется настройкой auto_generate_enabled в app_settings
retry_failed_publicationsКаждый часПовторяет публикацию для отзывов со статусом error (до 50 шт.)
refresh_today_analyticsКаждые 30 минутПересчитывает статистику за сегодня и вчера

Управление авто-генерацией: PUT /api/v1/settings/auto_generate_enabled со значением "true" / "false".


12. Схема БД

reputation_products

Данные о товарах (заполняются из AdolfDataSync).

ПолеТипОписание
external_idBIGINT (PK)ID товара на маркетплейсе
marketplaceVARCHAR (PK)wildberries / ozon / yandex_market
vendor_codeVARCHARАртикул
titleTEXTНазвание
descriptionTEXTОписание
compositionTEXTСостав
size_measurementsJSONBРазмеры
media_urlsJSONBФото
attributesJSONBХарактеристики

Composite PK: (external_id, marketplace)


reputation_items

Отзывы и вопросы.

ПолеТипОписание
idINTEGER (PK)Внутренний ID
wb_idVARCHAR(50)ID на маркетплейсе
item_typeVARCHARreview / question
marketplaceVARCHARМаркетплейс
client_nameVARCHARИмя покупателя
client_textTEXTТекст
ratingINTEGER1–5 (null для вопросов)
statusVARCHARСтатус (default: new)
product_idBIGINTreputation_products.external_id
prosTEXTДостоинства
consTEXTНедостатки
wb_created_atDATETIMEДата создания на маркетплейсе
created_atDATETIMEДата загрузки в систему
is_viewedBOOLEANПросмотрен

Статусы:

new → analyzing → pending_review → approved → publishing → answered
                                                          └→ error (retry)
new → skipped
new → escalated

reputation_responses

Backward-compatibility слой.

ПолеТипОписание
idINTEGER (PK)
item_idINTEGER (FK)reputation_items.id
ai_variantsJSONBМассив вариантов
final_textTEXTОдобренный текст
statusVARCHARdraft / approved / published / failed
manager_notesTEXT
generated_atDATETIME
published_atDATETIME
wb_errorTEXTОшибка от маркетплейса
sourceVARCHAR(20)ai / manager

reputation_generations

Аудит вызовов генерации.

ПолеТипОписание
idUUID (PK)
item_idINTEGER (FK)reputation_items.id
statusVARCHAR(20)pending / processing / completed / failed
contextJSONB{client_text, pros, cons, product_context, instructions, rating, item_type}
analysis_resultJSONB{sentiment, sentiment_score, tags, category, key_points, scenario}
error_messageTEXT
created_atDATETIME
completed_atDATETIME

reputation_drafts

Immutable черновики ответов.

ПолеТипОписание
idUUID (PK)
generation_idUUID (FK)reputation_generations.id
item_idINTEGER (FK)reputation_items.id
response_textTEXTТекст ответа
classificationJSONBКлассификация
is_validBOOLEANПрошёл валидацию
statusVARCHAR(20)draft / approved / rejected
manager_notesTEXT
created_atDATETIME

reputation_publications

Записи публикаций.

ПолеТипОписание
idUUID (PK)
draft_idUUID (FK)reputation_drafts.id
item_idINTEGER (FK)reputation_items.id
published_textTEXTОпубликованный текст
statusVARCHAR(20)success / failed
error_messageTEXT
api_responseJSONBПолный ответ API маркетплейса
published_atDATETIME
sourceVARCHAR(20)manual / auto / scheduler

polling_state

Состояние поллинга.

ПолеТипОписание
marketplaceVARCHAR(30)
item_typeVARCHAR(20)review / question
last_poll_timeDATETIME(tz)
last_poll_statusVARCHAR(20)success / error / circuit_breaker
items_fetched_totalINTEGERНакопительный итог
consecutive_errorsINTEGERОшибки подряд
circuit_breaker_openBOOLEAN

UNIQUE: (marketplace, item_type)


reputation_analytics

Ежедневная агрегация.

ПолеТипОписание
dateDATE
marketplaceVARCHAR(30)
total_itemsINTEGER
reviews_countINTEGER
questions_countINTEGER
positive_countINTEGERrating ≥ 4
neutral_countINTEGERrating = 3
negative_countINTEGERrating ≤ 2
avg_ratingNUMERIC(3,2)
published_countINTEGER
our_published_countINTEGER
our_avg_response_time_minINTEGER

UNIQUE: (date, marketplace)


app_settings

Key-value хранилище настроек и промтов.

ПолеТипОписание
keyVARCHAR(100) (PK)Ключ
valueTEXTЗначение
updated_atDATETIME

Используемые ключи:

КлючОписание
auto_generate_enabled"true" / "false" — управление авто-генерацией
generation_system_promptКастомный системный промт (если задан менеджером)

13. Пайплайн обработки

Polling → new → analyzing → pending_review → approved → publishing → answered
                                                                   └→ error (retry hourly)
               → skipped
               → escalated

Таблицы по этапам:

ЭтапТаблицы
Pollingreputation_items (INSERT), polling_state (UPDATE)
Generatereputation_generations, reputation_drafts, reputation_responses, auto_process_log, reputation_items
Approvereputation_drafts, reputation_responses, reputation_items
Publishreputation_publications, reputation_responses, reputation_items, auto_process_log

14. Миграции

ФайлОписание
add_response_source.sqlДобавляет колонку source (VARCHAR(20), default 'manager') в reputation_responses. Backfill: source='ai' для ответов с непустым ai_variants

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