Перейти до вмісту

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"
}
}

Доставка подій за транспортом

ПодіяWebSocketWebhook
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.

Наступні кроки