Chuyển tới nội dung chính

Tổng Quan Kiến Trúc

Simplize Agent WebSocket là gì?

Simplize Agent WebSocket là giao thức streaming hai chiều cho phép client nhận kết quả từ AI agent theo thời gian thực. Agent xử lý ở phía server (background), client có thể ngắt kết nối và kết nối lại bất kỳ lúc nào mà không mất dữ liệu.


So Sánh WebSocket và SSE

Tiêu chíSSE (HTTP)WebSocket
EndpointPOST /v2/chatwss://host/v2/ws
Loại kết nốiMỗi request tạo kết nối mớiKết nối persistent
ReconnectRe-fetch kèm Last-Event-IDsubscribe với last_event_id
Multi-turn chatMỗi lượt là 1 HTTP requestNhiều lượt trên 1 kết nối
Dừng agentPOST /v2/sessions/{id}/terminate{"type": "stop", ...}
Phê duyệt toolPolling API riêngInline qua cùng kết nối

Khuyến nghị: Dùng WebSocket cho chat UI cần tương tác cao, reconnect liền mạch và HITL approval.


Luồng Tổng Quan

Client                      Server
│ │
│──── kết nối ──────────────▶│
│◀─── connected ─────────────│ ← thông số kết nối
│ │
│──── auth {token} ─────────▶│ ← JWT bearer token
│◀─── auth_ok ───────────────│
│ │
│──── chat {message} ───────▶│ ← bắt đầu lượt mới
│◀─── subscribed {running} ──│ ← task đã khởi động
│ │
│◀─── message_start ─────────│
│◀─── content_block_start ───│ ← block thinking
│◀─── content_block_delta ───│ (streaming...)
│◀─── content_block_stop ────│
│◀─── content_block_start ───│ ← block text
│◀─── content_block_delta ───│ (streaming...)
│◀─── content_block_stop ────│
│◀─── message_delta ─────────│
│◀─── message_stop ──────────│ ← lượt hoàn thành

Vòng Đời Session

Mỗi session đại diện cho một chuỗi hội thoại liên tục (nhiều lượt với cùng context).

Tạo session mới:
chat (không có session_id)
→ server tạo session_id
→ subscribed {session_id, status: "running"}

Lượt tiếp theo trong session:
chat {session_id: "uuid"}
→ subscribed {status: "running"}

Reconnect giữa chừng:
subscribe {session_id, last_event_id}
→ subscribed {status: "running"}
→ replay events còn thiếu + tiếp tục live

Reconnect sau khi xong:
subscribe {session_id, last_event_id}
→ subscribed {status: "completed"}
→ replay events còn thiếu, sau đó dừng

Gửi message khi agent đang bận:
chat {session_id} hoặc push_message
→ message_queued (xếp hàng, tự động xử lý sau)

Vòng Đời Một Lượt (Turn)

Mỗi lượt agent trả lời luôn bắt đầu bằng message_start và kết thúc bằng message_stop. Giữa hai event này là các block nội dung.

message_start
content_block_start (index: 0, type: "thinking")
content_block_delta × N
content_block_stop

content_block_start (index: 1, type: "tool_use")
content_block_delta × N
content_block_stop

content_block_start (index: 2, type: "tool_result")
content_block_delta × N
content_block_stop

content_block_start (index: 3, type: "text")
content_block_delta × N
content_block_stop

message_delta
message_stop

index là số nguyên tăng dần từ 0 trong phạm vi một lượt.


Trạng Thái Session

Trạng tháiMô tả
runningAgent đang xử lý, có thể subscribe để nhận live events
completedAgent đã xong, có thể replay lịch sử events

Event Replay (Không Mất Dữ Liệu)

Mọi event được server lưu lại có thứ tự, mỗi event có event_id dạng UUID v7 (sortable theo thời gian). Client lưu event_id cuối cùng nhận được, dùng khi reconnect để nhận lại các events còn thiếu.

TTL của event log: 1 giờ sau khi session hoàn thành.


Danh Sách Đầy Đủ Tất Cả Events

Client → Server

typeBắt buộc sauMô tả
authconnectedXác thực
chatauth_okBắt đầu lượt hội thoại
subscribeauth_okĐăng ký nhận events session có sẵn
stopauth_okDừng agent
push_messageauth_okXếp hàng message
approvalnhận approval_requestPhê duyệt / trả lời
pingbất kỳ lúc nàoKeep-alive
pongnhận pingPhản hồi keep-alive

Server → Client

typeNhómMô tả
connectedControlKết nối thành công
auth_okControlXác thực thành công
subscribedControlĐã đăng ký stream
message_queuedControlMessage đã xếp hàng
pingControlKeep-alive từ server
pongControlPhản hồi ping từ client
errorControlLỗi
message_startTurnBắt đầu lượt agent
message_deltaTurnLý do kết thúc lượt
message_stopTurnKết thúc lượt
content_block_startBlockBắt đầu block
content_block_deltaBlockNội dung block
content_block_stopBlockKết thúc block

Block Types (trong content_block_start.content_block.type)

typeXuất hiện khiCó delta không
thinkingĐầu lượt, Claude suy luậnCó (thinking_delta)
textCâu trả lời văn bảnCó (text_delta)
tool_useAgent gọi toolCó (input_json_delta)
tool_resultSau khi tool thực thi xongCó (tool_result_delta)
file_processingcontent_urls trong chatCó (cập nhật status)
approval_requestTool cần phê duyệtKhông
approval_resultSau khi user quyết địnhCó (decisions)
approval_timeoutHết thời gian phê duyệtKhông
terminal_user_stoppedUser gửi lệnh stopCó (terminal_user_stopped)
terminal_errorLỗi agent không phục hồiCó (terminal_error)