Комбинированные запросы с несколькими проверками
Вам не нужен отдельный API-вызов для каждой проверки. Один POST /api/v2/check может одновременно выполнить проверки текста, изображения, badword и антивирусную проверку для смешанного контента, а затем вернуть один ответ с результатом по каждой из них. Это самый эффективный способ модерировать публикацию, в которой сразу есть подпись, изображение и вложение.
Зачем модерировать всё одним вызовом?
Пользовательская отправка обычно представляет собой набор: текст, медиафайлы и ссылки. Если вызывать API отдельно для каждой части, будет больше сетевых обращений, выше задержка и больше расход квоты. Один комбинированный запрос запускает включённые проверки параллельно и даёт единый вердикт, на основании которого можно действовать.
Как запустить несколько проверок одновременно?
Поместите каждый тип контента в content, включите нужные проверки в settings и прочитайте результаты по каждой проверке. Каждая включённая проверка выполняется для соответствующего контента.
curl -X POST https://api.discuse.com/api/v2/check \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_API_KEY" \
-d '{
"content": {
"text": "Great deal, check my profile!",
"image_urls": ["https://example.com/post-image.jpg"],
"document_urls": ["https://example.com/attachment.pdf"]
},
"settings": {
"check_spam": true,
"check_sentiment": true,
"check_images": true,
"check_antivirus": true
}
}'
Ответ
{
"has_violations": true,
"cached": false,
"results": {
"hits": true,
"spamfinder": { "label": "spam", "confidence": 0.91, "is_spam": true, "hit": true },
"sentiment": { "is_negative": false, "is_toxic": false, "score": 0.1, "hit": false },
"images": { "status": "OK", "porn": 0.02, "sexual": 0.05, "neutral": 0.93, "hit": false },
"antivirus": { "status": "OK", "hit": false, "details": [] }
},
"usage": {
"api_requests_used": 530,
"api_requests_limit": 10000,
"api_requests_remaining": 9470
}
}
Как читать комбинированный результат?
Используйте has_violations для общего решения, затем смотрите на каждый results.<check>.hit, чтобы понять, какая проверка сработала и почему:
| Поле | Значение |
|---|---|
has_violations |
True, если любая включённая проверка пометила контент — ваш краткий итоговый вердикт |
results.hits |
Тот же общий сигнал внутри объекта результатов |
results.spamfinder.hit |
Сработала проверка спама (с учётом порога; ориентируйтесь на hit, а не на сырое значение is_spam) |
results.sentiment.hit |
Токсальная/негативная тональность выше заданных вами порогов |
results.images.hit |
Изображение превысило ваш порог NSFW |
results.antivirus.hit |
В документе найдено вредоносное ПО |
results.badwords.hit |
Найдено совпадение с настроенным badword |
results.skipped_features |
Проверки, которые были запрошены, но не выполнены (например, функция, у которой исчерпана квота) |
В results появляются только те проверки, которые вы включили и для которых был соответствующий контент. Проверка, для которой нет контента, — например, check_images без image_urls — просто не запускается.
Какой контент соответствует какой проверке?
| Проверка | Какой контент читает |
|---|---|
check_sentiment, check_spam, check_badwords, check_language |
content.text |
check_images |
content.image_urls |
check_antivirus |
content.document_urls |
Один запрос может содержать до 10 URL изображений, 5 URL документов и текст длиной до 10 000 символов. Отправляйте части одной пользовательской отправки вместе, а не разделяйте их по разным вызовам.
Что насчёт частичных сбоев?
Если одна проверка завершается ошибкой (например, URL изображения недоступен), остальные всё равно вернутся — вы получите успешные результаты, а проверка со сбоем сообщит свою ошибку или пустой результат, не проваливая весь запрос целиком. Принимайте решение по каждой проверке отдельно: блокируйте при подтверждённом hit и решайте, должна ли проверка с ошибкой пропускать контент или отправлять его в очередь на ручную проверку.
Рекомендации
Включайте только то, что нужно
Каждая включённая проверка добавляет работу. Включайте проверки, которые соответствуют контенту, фактически поступающему к вам, — нет смысла запускать check_antivirus для сообщений, состоящих только из текста.
Один вердикт, затем детализация
Сначала ветвитесь по has_violations для быстрого сценария, а затем проверяйте results только тогда, когда нужно понять, какая именно проверка сработала (для логирования, апелляций или направления подходящему модератору).
const res = await check(content, settings);
if (!res.has_violations) return allow();
const r = res.results;
if (r.antivirus?.hit) return quarantine(); // most severe first
if (r.images?.hit) return blockMedia();
if (r.spamfinder?.hit || r.badwords?.hit) return shadowban();
return queueForReview(r);
Связанные материалы
- Анализ текста — тональность, спам и поля результата для текста
- Обнаружение NSFW на изображениях — оценка изображений и пороги
- Антивирусная проверка файлов — проверки документов на вредоносное ПО
- Коды ошибок и ответов — оболочка ответа и обработка квоты