В окне чата на сайте у каждого ответа видно, кто его написал: ИИ-ассистент, сотрудник или компания. Подпись задаёт поле author в запросе отправки. Другие каналы это поле не читают.
Где работает
author принимают sendMessage, sendFileByUpload, sendFileByUrl, sendInteractiveButtons и sendButtons, sendForm и sendTyping. В multipart/form-data — строкой JSON.
Поля
| Поле | Тип | Обязательный | Описание |
|---|---|---|---|
kind |
string | да | assistant — ИИ-ассистент, operator — сотрудник, company — компания |
name |
string | нет | имя: до 64 знаков, без управляющих символов |
avatarUrl |
string | нет | аватар у подписи — только ссылка uploadFile этого канала на JPEG, PNG, GIF или WebP |
kind |
Подпись в окне |
|---|---|
assistant |
«Алина · ИИ»; без имени — «ИИ-ассистент» и название компании. «Печатает» — «Алина · ИИ отвечает…» |
operator |
«Ольга, сотрудник»; слово «сотрудник» меняет настройка siteOperatorTitle |
company или поля нет |
название компании — настройка siteTitle |
Пример запроса
Ответ ИИ-ассистента Алины:
curl
curl -X POST "$GRATIO_URL/v1/instances/$GRATIO_ID/sendMessage" \
-H "Authorization: Bearer $GRATIO_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"chatId": "vq3k7m2x4a6b2c4d6e7f2g3h4",
"message": "Пробное занятие бесплатное. Записать вас на субботу?",
"author": {
"kind": "assistant",
"name": "Алина"
},
"clientMessageId": "site-reply-1"
}'
Python
import os
import requests
BASE = f"{os.environ['GRATIO_URL']}/v1/instances/{os.environ['GRATIO_ID']}"
HEADERS = {"Authorization": f"Bearer {os.environ['GRATIO_TOKEN']}"}
url = f"{BASE}/sendMessage"
payload = {
"chatId": "vq3k7m2x4a6b2c4d6e7f2g3h4",
"message": "Пробное занятие бесплатное. Записать вас на субботу?",
"author": {"kind": "assistant", "name": "Алина"},
"clientMessageId": "site-reply-1",
}
response = requests.post(url, json=payload, headers=HEADERS, timeout=60)
print(response.status_code, response.json())
Node.js
const { GRATIO_URL, GRATIO_ID, GRATIO_TOKEN } = process.env;
const base = `${GRATIO_URL}/v1/instances/${GRATIO_ID}`;
const auth = { Authorization: `Bearer ${GRATIO_TOKEN}` };
const url = `${base}/sendMessage`;
const payload = {
chatId: "vq3k7m2x4a6b2c4d6e7f2g3h4",
message: "Пробное занятие бесплатное. Записать вас на субботу?",
author: { kind: "assistant", name: "Алина" },
clientMessageId: "site-reply-1",
};
const response = await fetch(url, {
method: "POST",
headers: { ...auth, "Content-Type": "application/json" },
body: JSON.stringify(payload),
});
console.log(response.status, await response.json());
PHP
<?php
$base = getenv('GRATIO_URL') . '/v1/instances/' . getenv('GRATIO_ID');
$auth = 'Authorization: Bearer ' . getenv('GRATIO_TOKEN');
$url = $base . '/sendMessage';
$payload = [
'chatId' => 'vq3k7m2x4a6b2c4d6e7f2g3h4',
'message' => 'Пробное занятие бесплатное. Записать вас на субботу?',
'author' => ['kind' => 'assistant', 'name' => 'Алина'],
'clientMessageId' => 'site-reply-1',
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [$auth, 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 60,
]);
$response = json_decode(curl_exec($ch), true);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE), PHP_EOL;
print_r($response);
Пример ответа
Ответ 200 OK:
{"idMessage": "o2b7e41c09d8f3a6b5c4d2e1f0a9b8c"}
Ещё примеры
Ответ сотрудника
curl -X POST "$GRATIO_URL/v1/instances/$GRATIO_ID/sendMessage" \
-H "Authorization: Bearer $GRATIO_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"chatId": "vq3k7m2x4a6b2c4d6e7f2g3h4",
"message": "Здравствуйте! Я Ольга, администратор. Подскажу по расписанию.",
"author": {
"kind": "operator",
"name": "Ольга"
}
}'
«Печатает» от имени ассистента
curl -X POST "$GRATIO_URL/v1/instances/$GRATIO_ID/sendTyping" \
-H "Authorization: Bearer $GRATIO_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"chatId": "vq3k7m2x4a6b2c4d6e7f2g3h4",
"typingTime": 3000,
"author": {
"kind": "assistant",
"name": "Алина"
}
}'
Как это работает
- Позвать сотрудника. В окне есть кнопка «Позвать сотрудника». После неё посетитель видит «Ждём сотрудника», пока не придёт первое сообщение не от
assistant, в том числе безauthor. - Аватар окно показывает у подписи автора. Посетителю картинка уходит с адреса окна, без метаданных.
- Повтор отправки. Автор входит в ключ повтора: тот же
clientMessageIdс другим автором —409 idempotency_conflict. - Персона ассистента — имя и аватар — задаётся в вашем приложении: Gratio подписывает ответ так, как указано в
author.
Ошибки
| Код | code |
Когда | Что делать |
|---|---|---|---|
400 |
validation |
неизвестный kind, имя длиннее 64 знаков, avatarUrl — не ссылка uploadFile этого канала или не картинка |
исправить author |
409 |
idempotency_conflict |
тот же clientMessageId уже отправлен с другим автором |
новый ключ для нового сообщения |
Что дальше
- sendInteractiveButtons и sendButtons — кнопки в ответе.
- sendForm — форма в ленте.
- Чат на сайте через API — что ещё умеет канал.
