EzyChat là plugin trò chuyện dành cho EzyPlatform, cung cấp một hệ thống thống nhất cho chat hỗ trợ khách hàng, hội thoại thời gian thực và chatbot. Plugin không chỉ hiển thị khung chat mà còn quản lý toàn bộ vòng đời của kênh trò chuyện, thành viên, tin nhắn, trạng thái đọc, tệp đính kèm và cấu hình chatbot.

Kiến trúc tổng quát

EzyChat được chia thành nhiều thành phần có trách nhiệm riêng:
  • SDK dùng chung chứa mô hình dữ liệu, repository, service và các quy tắc nghiệp vụ cốt lõi.
  • Web plugin cung cấp widget, giao diện hỗ trợ, REST API và luồng phản hồi chatbot qua Server-Sent Events.
  • Admin plugin cung cấp màn hình và API quản trị.
  • Socket application xử lý gửi tin nhắn, trạng thái đang nhập và phân phối sự kiện thời gian thực.
  • Socket plugin tích hợp ứng dụng chat vào vùng socket của EzyPlatform.
  • Support view là giao diện phía trình duyệt dành cho người dùng và nhân viên hỗ trợ.
flowchart TB
    User[Người dùng]
    Supporter[Nhân viên hỗ trợ]
    Admin[Quản trị viên]

    Widget[Widget và giao diện chat]
    Web[Web plugin]
    AdminModule[Admin plugin]
    Socket[Socket application]
    Core[SDK và nghiệp vụ dùng chung]
    DB[(Cơ sở dữ liệu)]
    Bot[Chatbot service]
    Notification[Dịch vụ thông báo]

    User --> Widget
    Supporter --> Widget
    Admin --> AdminModule

    Widget -->|REST hoặc SSE| Web
    Widget <-->|Socket thời gian thực| Socket

    Web --> Core
    AdminModule --> Core
    Socket --> Core

    Core --> DB
    Web --> Bot
    Socket --> Bot
    Socket --> Notification
Kiến trúc này cho phép REST, SSE và socket sử dụng cùng một mô hình nghiệp vụ. Việc tạo tin nhắn, kiểm tra thành viên, cập nhật số lượng chưa đọc hay gọi chatbot không bị phụ thuộc hoàn toàn vào một giao thức truyền tải cụ thể.

Mô hình nghiệp vụ

Hồ sơ chat

Hồ sơ chat, hay chat profile, là tập hợp cấu hình dùng để triển khai một trải nghiệm chat cụ thể. Mỗi hồ sơ có thể chứa:
  • Loại hồ sơ: widget chat hoặc chatbot.
  • Khóa nhúng để xác định widget.
  • Giao diện của nút mở chat.
  • Ảnh đại diện và hiệu ứng launcher.
  • Yêu cầu về thông tin, email, số điện thoại hoặc mật khẩu của người dùng.
  • Quyền đính kèm tệp.
  • Phương thức giao tiếp HTTP hoặc socket.
  • System message và dịch vụ chatbot cần sử dụng.
  • Cấu hình mô hình AI, giới hạn token, thời gian chờ và nguồn dữ liệu.
Một kênh có thể được gắn với một hồ sơ chat. Khi đó, cấu hình giao diện, thành viên hỗ trợ và chatbot của hồ sơ được áp dụng cho kênh.

Kênh trò chuyện

Kênh là không gian chứa hội thoại. Mỗi kênh lưu các thông tin chính như:
  • Người tạo và loại người tạo.
  • Danh sách thành viên.
  • Hồ sơ chat liên kết.
  • Loại kênh, chẳng hạn kênh thông thường, hỗ trợ hoặc kênh tích hợp.
  • Phạm vi public hoặc private.
  • Hội thoại trực tiếp hoặc theo nhóm.
  • Trạng thái kích hoạt, lưu trữ hoặc xóa.
  • Thời điểm trao đổi gần nhất.
Đối với kịch bản hỗ trợ khách hàng, hệ thống có thể tìm lại kênh hỗ trợ gần nhất của người dùng hoặc tạo một kênh mới. Các nhân viên hỗ trợ phù hợp sẽ được thêm vào kênh khi cần.

Thành viên

Quan hệ thành viên xác định một người dùng hoặc quản trị viên có thuộc kênh hay không. Ngoài định danh thành viên, hệ thống còn lưu:
  • Vai trò trong kênh.
  • Trạng thái thành viên.
  • Số lượng tin nhắn chưa đọc.
  • Thời điểm đọc gần nhất.
Vai trò được dùng để bảo vệ các thao tác đặc biệt. Ví dụ, việc kích hoạt, lưu trữ hoặc bật tắt chatbot trên một kênh yêu cầu thành viên có vai trò hỗ trợ khách hàng.

Tin nhắn

Tin nhắn thuộc về một kênh và chứa thông tin người gửi, nội dung, loại nội dung, định dạng cùng các mốc thời gian liên quan.
Mô hình tin nhắn hỗ trợ:
  • Tin nhắn văn bản.
  • Tệp và nhiều tài nguyên đính kèm.
  • Liên kết trong nội dung.
  • Trả lời một tin nhắn trước đó.
  • Thread và quan hệ cha–con.
  • Ghim và bỏ ghim.
  • Trạng thái gửi, nhận và đã xem.
  • Chỉnh sửa, thu hồi và xóa.
Trạng thái đọc được lưu theo từng thành viên thay vì chỉ lưu một trạng thái chung cho toàn bộ tin nhắn.
erDiagram
    CHAT_PROFILE ||--o{ CHANNEL : "cấu hình"
    CHANNEL ||--o{ CHANNEL_MEMBER : "có"
    CHANNEL ||--o{ MESSAGE : "chứa"
    MESSAGE ||--o{ MESSAGE_STATUS : "có trạng thái"
    MESSAGE ||--o{ MESSAGE_RESOURCE : "đính kèm"
    MESSAGE ||--o{ MESSAGE_ACTION : "được thao tác"
    CHANNEL ||--o{ USER_CHANNEL_SETTING : "có thiết lập riêng"

Luồng gửi tin nhắn

Dù tin nhắn được gửi qua HTTP hay socket, luồng nghiệp vụ chính tương đối nhất quán:
  1. Xác thực người gửi.
  2. Kiểm tra kênh tồn tại và chưa bị xóa.
  3. Kiểm tra người gửi là thành viên của kênh.
  4. Kiểm tra kênh đã được mở khóa nếu có mật khẩu.
  5. Kiểm tra nội dung và giới hạn tin nhắn.
  6. Lưu tin nhắn.
  7. Lưu tệp, media và liên kết đi kèm.
  8. Cập nhật thời điểm hoạt động gần nhất của kênh.
  9. Tăng số lượng chưa đọc cho các thành viên khác.
  10. Tạo trạng thái gửi cho từng người nhận.
  11. Phân phối tin nhắn tới các thành viên đang kết nối.
  12. Yêu cầu chatbot phản hồi nếu kênh đáp ứng điều kiện.
sequenceDiagram
    actor Client as Người gửi
    participant API as Web hoặc Socket API
    participant Guard as Xác thực và phân quyền
    participant Chat as Dịch vụ chat
    participant DB as Cơ sở dữ liệu
    participant Realtime as Kênh thời gian thực
    participant Bot as Chatbot service

    Client->>API: Gửi tin nhắn
    API->>Guard: Kiểm tra thành viên và quyền truy cập
    Guard-->>API: Hợp lệ
    API->>Chat: Tạo tin nhắn
    Chat->>DB: Lưu nội dung và tài nguyên
    Chat->>DB: Cập nhật chưa đọc và trạng thái gửi
    Chat-->>API: Tin nhắn đã tạo
    API->>Realtime: Phân phối cho các thành viên
    API->>Bot: Yêu cầu trả lời nếu cần
    Bot-->>API: Nội dung phản hồi dạng stream
    API->>DB: Lưu câu trả lời của chatbot
    API-->>Client: Tin nhắn và phản hồi chatbot

REST, SSE và socket

EzyChat hỗ trợ nhiều cách trao đổi dữ liệu.
REST API phù hợp với các thao tác như:
  • Tạo hoặc lấy danh sách kênh.
  • Phân trang lịch sử tin nhắn.
  • Lấy các tin nhắn xung quanh một tin nhắn cụ thể.
  • Ghim hoặc bỏ ghim.
  • Quản lý trạng thái kênh.
  • Khóa, mở khóa hoặc đánh dấu spam.
  • Quản lý hồ sơ chat và thành viên.
Server-Sent Events được sử dụng khi gửi tin nhắn qua web và cần nhận phản hồi chatbot theo luồng. Client lần lượt có thể nhận:
  • Sự kiện chứa tin nhắn vừa gửi.
  • Các sự kiện thể hiện phần nội dung chatbot đang tạo.
  • Tin nhắn chatbot hoàn chỉnh.
  • Sự kiện kết thúc luồng.
Socket được dùng cho giao tiếp hai chiều thời gian thực. Khi một tin nhắn được gửi qua socket, server lưu tin nhắn rồi phát nó tới danh sách thành viên của kênh. Socket cũng truyền trạng thái đang nhập và có thể kích hoạt thông báo cho người nhận.
HTTP/SSE và socket là hai đường truyền độc lập cùng dựa trên nghiệp vụ chung; hệ thống không tự động chuyển một REST request thành socket request.

Tích hợp chatbot

Chatbot được thiết kế theo cơ chế mở rộng. Một dịch vụ chatbot cần triển khai hợp đồng chung và đăng ký với runtime. EzyChat lựa chọn dịch vụ dựa trên hồ sơ của kênh hoặc cấu hình mặc định.
Chatbot chỉ phản hồi khi:
  • Có tài khoản chatbot hợp lệ.
  • Chatbot là thành viên của kênh.
  • Tin nhắn không được gửi bởi chính chatbot.
  • Người gửi không phải quản trị viên.
  • Có ít nhất một chatbot service khả dụng.
  • Người gửi chưa vượt quá hạn mức phản hồi.
Khi bắt đầu xử lý, hệ thống tập hợp ngữ cảnh hội thoại và cấu hình hồ sơ rồi gọi chatbot bất đồng bộ. Nội dung phát sinh có thể được đẩy dần về client, sau đó câu trả lời hoàn chỉnh mới được lưu như một tin nhắn trong kênh.
EzyChat cung cấp cơ chế điều phối chatbot, nhưng không ràng buộc hệ thống với một nhà cung cấp AI duy nhất. Việc kết nối tới mô hình hoặc dịch vụ bên ngoài do implementation của chatbot service đảm nhiệm.

Widget và giao diện hỗ trợ

Web plugin cung cấp hai lớp giao diện:
  • Widget dùng để nhúng nút chat vào website.
  • Màn hình hỗ trợ hiển thị hội thoại đầy đủ.
Khóa nhúng xác định hồ sơ chat được sử dụng. Nhờ đó, một hệ thống có thể tạo nhiều widget với màu sắc, vị trí, ảnh đại diện, chatbot hoặc yêu cầu thông tin người dùng khác nhau.
Hồ sơ chat cũng có thể chọn HTTP hoặc socket làm phương thức giao tiếp. Điều này giúp cùng một widget hoạt động trong môi trường chỉ có web API hoặc trong hệ thống đã triển khai hạ tầng socket.

Quản trị

Admin plugin cung cấp chức năng vận hành hệ thống chat, bao gồm:
  • Theo dõi và phân trang danh sách kênh.
  • Xem lịch sử và trạng thái tin nhắn.
  • Ghim hoặc bỏ ghim tin nhắn.
  • Kích hoạt, lưu trữ hoặc xóa kênh.
  • Gán nhân viên hỗ trợ.
  • Bật hoặc tắt chatbot theo kênh.
  • Quản lý hồ sơ chat và thành viên của hồ sơ.
  • Cấu hình widget, quyền đính kèm và giới hạn tin nhắn.
  • Cấu hình chatbot mặc định và hạn mức phản hồi.
Các controller quản trị yêu cầu phiên đăng nhập. Phần nghiệp vụ tiếp tục kiểm tra tài nguyên và vai trò thay vì chỉ dựa vào việc người gọi đã đăng nhập.

Bảo mật và quyền truy cập

EzyChat áp dụng nhiều lớp kiểm tra:
  • Các API nghiệp vụ dành cho người dùng và quản trị viên yêu cầu xác thực.
  • Người dùng phải là thành viên của kênh trước khi đọc hoặc gửi tin nhắn.
  • Tin nhắn phải thực sự thuộc về kênh đang thao tác.
  • Một số thao tác quản lý yêu cầu vai trò hỗ trợ khách hàng.
  • Kênh có thể được khóa bằng mật khẩu riêng cho từng người dùng.
  • Mật khẩu khóa được so sánh dưới dạng giá trị băm có thêm secret phía hệ thống.
  • Token mở khóa có thời hạn.
  • Kênh đã xóa được coi như không còn khả dụng.
Khóa kênh bằng mật khẩu là lớp kiểm soát truy cập ở tầng ứng dụng. Nó không đồng nghĩa với mã hóa đầu cuối nội dung hội thoại.

Khả năng mở rộng

Thiết kế hiện tại có một số điểm mở rộng đáng chú ý:
  • Thay thế hoặc bổ sung chatbot service.
  • Tạo nhiều hồ sơ chat cho các website hay mục đích khác nhau.
  • Thêm thành viên hỗ trợ theo hồ sơ.
  • Chọn HTTP hoặc socket cho từng trải nghiệm chat.
  • Tích hợp media, thông báo và dịch vụ người dùng của EzyPlatform.
  • Mở rộng loại kênh, định dạng kênh và loại tin nhắn.
  • Tùy biến giao diện widget bằng cấu hình và tài nguyên frontend.
Việc đặt nghiệp vụ dùng chung trong SDK giúp các adapter web, admin và socket không phải triển khai lại toàn bộ quy tắc xử lý.

Giới hạn cần lưu ý

  • Chatbot chỉ hoạt động khi có service tương ứng được đăng ký và khả dụng.
  • Cấu hình chatbot không tự tạo kết nối tới một nhà cung cấp AI.
  • Socket application cần hạ tầng EzyFox Server và cơ chế nhận dạng socket user của EzyPlatform.
  • Widget có thể được tải công khai, nhưng thao tác với kênh và tin nhắn vẫn phụ thuộc vào danh tính người dùng và các quy tắc xác thực của hệ thống chủ.
  • SSE chủ yếu phục vụ phản hồi chatbot một chiều từ server; các sự kiện hội thoại hai chiều thời gian thực vẫn phù hợp hơn với socket.
  • Phân trang lịch sử sử dụng token và thứ tự sắp xếp; client không nên giả định toàn bộ lịch sử được trả về trong một request.

Kết luận

EzyChat là một nền tảng chat theo mô hình plugin chứ không chỉ là một widget giao diện. Phần lõi chịu trách nhiệm lưu trữ và thực thi nghiệp vụ, web plugin cung cấp API và giao diện nhúng, admin plugin phục vụ vận hành, còn socket application đảm nhiệm phân phối thời gian thực.
Điểm mạnh của thiết kế nằm ở việc REST, SSE, socket và chatbot cùng sử dụng một mô hình kênh–thành viên–tin nhắn thống nhất. Nhờ đó, EzyChat có thể phục vụ từ hộp thoại hỗ trợ đơn giản đến hệ thống chăm sóc khách hàng thời gian thực có chatbot và nhiều nhân viên tham gia.