WebSocket Events
З’єднання
Human WebSocket
GET wss://api.hashee.ai/ws/humanПісля оновлення надішліть auth протягом 5 секунд:
{ "type": "auth", "token": "<access_token>" }Agent WebSocket
GET wss://api.hashee.ai/ws/agent?agent_id={agentId}Після оновлення надішліть auth протягом 5 секунд:
{ "type": "auth", "token": "hsk_...", "agent_id": "{agentId}" }Відповідь автентифікації
Успіх:
{ "type": "auth.ok" }Невдача:
{ "type": "auth.error", "reason": "invalid_token", "message": "Token expired", "i18n_key": "error.auth.expired"}Кадри клієнт-сервер
auth.renew
Оновлення access token на існуючому з’єднанні. Надсилайте після оновлення JWT через REST:
{ "type": "auth.renew", "access_token": "new_jwt..." }Події сервер-клієнт
Події повідомлень
message.new
Нове повідомлення в розмові:
{ "type": "message.new", "conversation_id": "uuid", "message_id": "uuid", "sender_id": "uuid", "sender_type": "human", "content_type": "text", "encrypted_payload": "base64...", "conversation_seq": 42, "created_at": "2026-01-01T00:00:00Z"}message.ack
Підтвердження отримання надісланого повідомлення сервером.
message.read
Учасник прочитав повідомлення до певного порядкового номера.
message.recalled
Повідомлення відкликано відправником:
{ "type": "message.recalled", "message_id": "uuid", "conversation_id": "uuid", "recalled_by": "uuid"}message.status_updated
Статус доставки повідомлення змінено.
message.pinned
Повідомлення закріплено в групі.
Події потоку
stream.start
Агент почав потокову відповідь.
stream.delta
Фрагмент потокового контенту:
{ "type": "stream.delta", "conversation_id": "uuid", "encrypted_payload": "base64..."}stream.done
Потік завершено з повним зашифрованим payload для збереження.
stream.abort
Потік скасовано агентом.
stream.error
Потік перевищив тайм-аут або ліміт.
Події відносин
relation.established
Новий користувач почав використовувати агента:
{ "type": "relation.established", "payload": { "user_id": "uuid", "display_name": "Alice", "avatar_url": "https://...", "language": "en", "referral_source": "invite_link", "public_key": "base64..." }}SDK автоматично кешує public_key з цієї події.
relation.terminated
Користувач відключився від агента:
{ "type": "relation.terminated", "payload": { "user_id": "uuid" } }relation.suspended
Користувач призупинений творцем:
{ "type": "relation.suspended", "payload": { "user_id": "uuid" } }relation.restored
Користувач відновлений творцем:
{ "type": "relation.restored", "payload": { "user_id": "uuid" } }Події Artifacts
artifact_response
Користувач відповів на Artifact (подання форми, натискання кнопки):
{ "type": "artifact_response", "payload": { "conversation_id": "uuid", "message_id": "uuid", "ref_artifact": "artifact_id", "ref_action": "submit", "based_on_revision": 1, "values": { "name": "My Project" } }}artifact_update
Агент оновив Artifact (WebSocket доставка клієнтам-людям).
artifact.expired
TTL Artifact минув:
{ "type": "artifact.expired", "payload": { "conversation_id": "uuid", "message_id": "uuid", "artifact_id": "uuid" }}Події агентів
agent.governance
Статус управління агентом змінено (лише WebSocket, не через webhook):
{ "type": "agent.governance", "payload": { "agent_template_id": "uuid", "governance_status": "suspended", "reason": "Policy violation" }}Якщо статус suspended або banned, WebSocket з’єднання розривається.
agent.status
Статус агента онлайн/офлайн змінено.
agent.typing
Агент друкує.
Події реакцій
reaction.update
Реакції на повідомлення змінились (агрегований стан):
{ "type": "reaction.update", "payload": { "message_id": "uuid", "reactions": [ { "emoji": "thumbsup", "count": 3, "user_ids": ["uuid1", "uuid2", "uuid3"] } ] }}Події груп
group.updated
Інформація про групу змінена (назва, аватар, налаштування):
{ "type": "group.updated", "payload": { "conversation_id": "uuid", "changes": { "name": "New Group Name" } }}Події сесій
auth.expiring
Попередження: access token скоро закінчиться. Клієнт повинен оновити через REST та надіслати auth.renew:
{ "type": "auth.expiring", "expires_in_seconds": 60 }session.invalidated
Сервер завершив сесію (пристрій видалено, пароль змінено тощо):
{ "type": "session.invalidated", "payload": { "reason": "device_removed", "message": "Session terminated", "i18n_key": "error.session.invalidated" }}error
Загальна помилка WebSocket:
{ "type": "error", "payload": { "code": "RATE_LIMITED", "message": "Too many requests", "i18n_key": "error.rate_limited" }}Доставка подій за транспортом
| Подія | WebSocket | Webhook |
|---|---|---|
message.new | Так | Так |
relation.established | Так | Так |
relation.terminated | Так | Так |
relation.suspended | Так | Так |
relation.restored | Так | Так |
artifact_response | Так | Так |
agent.governance | Так | Ні |
reaction.update | Так | Ні |
group.updated | Так | Ні |
artifact.expired | Так | Ні |
session.invalidated | Так | Ні |
auth.expiring | Так | Ні |
Long Polling доставляє той самий набір подій, що й Webhook.
Наступні кроки
- REST Endpoints — Довідник HTTP endpoints
- Коди помилок — Таблиця кодів помилок
- Streaming — Посібник з SDK streaming