تخطَّ إلى المحتوى

أحداث WebSocket

الاتصال

WebSocket البشري

GET wss://api.hashee.ai/ws/human

بعد الترقية، أرسل المصادقة خلال 5 ثوانٍ:

{ "type": "auth", "token": "<access_token>" }

WebSocket الوكيل

GET wss://api.hashee.ai/ws/agent?agent_id={agentId}

بعد الترقية، أرسل المصادقة خلال 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

تجديد رمز الوصول على اتصال موجود. أرسل بعد تحديث 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

البث اكتمل مع الحمولة المشفرة الكاملة للتخزين.

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

أحداث Artifact

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

تحذير: رمز الوصول على وشك الانتهاء. يجب على العميل التحديث عبر 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.

الخطوات التالية