Оценка ответа
Сохраните оценку конкретного сообщения ассистента. GET подходит для готовых ссылок из ответа генерации; PUT также позволяет снять реакцию. Оценки покупателей отображаются отдельно от отзывов команды в личном кабинете.
GET /shopping/feedback
После сохранения ответа генерация добавляет в корневой events[] ссылки двух типов:
{
"events": [
{
"type": "like",
"url": "https://shopping-assistant-api.gravityfield.ai/shopping/feedback?tenant_id=demo-section&resourceId=demo-user&threadId=demo-thread&messageId=demo-answer&reaction=like"
},
{
"type": "dislike",
"url": "https://shopping-assistant-api.gravityfield.ai/shopping/feedback?tenant_id=demo-section&resourceId=demo-user&threadId=demo-thread&messageId=demo-answer&reaction=dislike"
}
]
}
Идентификаторы в примере условные. Используйте готовый url из фактического ответа: тело запроса и дополнительный токен не требуются.
- Найдите событие нужного типа рядом с сохранённым ответом.
- Вызовите его URL методом GET только при нажатии соответствующей кнопки.
- После
200обновите состояние оценки; при ошибке сохраните предыдущее состояние.
async function rateAnswer(result, reaction) {
const event = result.events?.find(item => item.type === reaction);
if (!event?.url) throw new Error('Для ответа нет ссылки оценки');
const response = await fetch(event.url, { method: 'GET', cache: 'no-store' });
if (!response.ok) throw new Error('Не удалось сохранить оценку');
return response.json();
}
// В обработчике кнопки «Нравится»: rateAnswer(result, 'like').
Не вызывайте все URL из events[] при получении ответа: like и dislike меняют состояние одного сообщения. Повторная реакция не создаёт дубликат, противоположная заменяет предыдущую.
Обязательные query-параметры: непустые tenant_id, resourceId, threadId, messageId и reaction: like | dislike. GET не принимает null; для снятия оценки используйте PUT. Все готовые ссылки ведут на production-домен, включая ссылки из другого окружения. Ответ должен существовать в принимающем сервисе.
GET не ограничивается списком разрешённых IP секции. Сервер проверяет принадлежность сообщения указанным секции, пользователю и диалогу; ссылка не подтверждает личность отправителя. Ответы используют Cache-Control: no-store.
Debug-ответы не сохраняются и не получают feedback-ссылки. History API не добавляет эти ссылки: для восстановленного ответа используйте PUT и id сообщения. Готовый Web-виджет 1.41 также использует PUT.
PUT /shopping/feedback
Чтобы собрать оценку конкретного ответа Shopping Assistant, вызовите:
PUT https://shopping-assistant-api.gravityfield.ai/shopping/feedback
Content-Type: application/json
Endpoint сохраняет текущую реакцию пользователя на сообщение ассистента. Повторная отправка того же состояния идемпотентна: она не создает дубликат оценки.
Запрос
curl --request PUT \
--url 'https://shopping-assistant-api.gravityfield.ai/shopping/feedback' \
--header 'Content-Type: application/json' \
--data '{
"tenant_id": "demo-section",
"resourceId": "demo-user",
"threadId": "thread-8f2b1c",
"messageId": "shopping:assistant:8a21...",
"reaction": "like"
}'
API принимает оценку только при точном совпадении tenant_id, resourceId, threadId и messageId. Это не позволяет записать реакцию на сообщение из другого диалога или профиля пользователя.
Ответ
{
"reaction": "like",
"updatedAt": "2026-08-07T10:00:00.000Z"
}
В reaction возвращается сохраненное состояние. Поле updatedAt содержит время его последнего изменения.
Чтобы заменить оценку, отправьте тот же запрос с другим значением reaction. Чтобы пользователь мог снять выбранную оценку, отправьте reaction: null.
Ошибки отправки оценки
Проверьте положительную, отрицательную и повторную оценку, смену реакции и снятие через PUT. Диагностика: Оценка не сохраняется.