Skip to content

CChat

Khung hội thoại AI hoàn chỉnh: danh sách tin nhắn tự cuộn, ô soạn có phím tắt, nút Gửi đổi thành Dừng khi đang nhận dữ liệu.

Dùng khi: sản phẩm có trợ lý AI — tra cứu, tóm tắt, soạn nội dung.

Không dùng khi: chỉ cần một lần gọi AI không có hội thoại (tóm tắt một đoạn văn bản) — gọi thẳng useAiChat rồi hiển thị kết quả theo cách của trang.

Component được điều khiển

CChat không gọi API. Nó nhận messages, status, error từ ngoài và phát send, stop, clear — nhờ vậy tầng UI không phụ thuộc tầng AI.

Nối với useAiChat của @tasco/ai:

vue
<script setup lang="ts">
import { useAiChat } from '@tasco/ai'

const { messages, status, error, send, abort, reset } = useAiChat()
</script>

<template>
  <CChat
    :messages="messages"
    :status="status"
    :error="error?.message"
    @send="send"
    @stop="abort"
    @clear="reset"
  />
</template>
Sự kiệnNối vàoÝ nghĩa
@send(text)sendNgười dùng nhấn Enter hoặc bấm Gửi
@stopabortDừng stream, giữ phần đã nhận
@clearresetXoá hội thoại

Phím tắt và IME

  • Enter gửi, Shift + Enter xuống dòng.
  • Đang gõ tiếng Việt kiểu telex/VNI (IME đang soạn) thì Enter không cắt ngang — tránh gửi nhầm khi đang chọn dấu.
  • Ô nhập khoá khi status === 'streaming' hoặc khi truyền disabled.

Trạng thái

statusGiao diện
idleNút Gửi; ô nhập mở
streamingNút đổi thành Dừng; ô nhập khoá; tin nhắn cuối hiện chấm gõ tới khi có token đầu
errorÔ nhập mở lại để người dùng thử lại

Lỗi hiển thị bằng error (chuỗi) dưới dạng dải cảnh báo trong khung chat:

vue
<CChat :error="error?.message" />

Tin nhắn role: 'system' bị lọc khỏi giao diện — prompt hệ thống không bao giờ phô ra cho người dùng.

API

Props

TênKiểuMặc địnhMô tả
messages*ChatMessage[]Lịch sử hội thoại — bind thẳng `messages` của useAiChat.
status"idle" | "error" | "streaming"'idle'Vòng đời phiên chat — 'streaming' đổi nút Gửi thành Dừng.
errorstring | nullnullThông báo lỗi hiển thị dạng Alert (thường là error.message).
titlestring''Tiêu đề khung chat.
placeholderstring'Nhập tin nhắn… (Enter để gửi, Shift+Enter xuống dòng)'Gợi ý trong ô nhập.
emptyTextstring'Bắt đầu cuộc trò chuyện với trợ lý AI.'Văn bản khi hội thoại trống.
disabledbooleanfalseKhoá ô nhập (ví dụ chưa đăng nhập / hết quota).

Sự kiện

TênPayloadMô tả
send[text: string]Gửi tin nhắn (Enter hoặc bấm Gửi) — nối thẳng vào useAiChat().send.
stop[]Dừng stream đang chạy, giữ lại phần đã nhận — useAiChat().abort.
clear[]Xoá hội thoại — useAiChat().reset.

Khả năng tiếp cận

  • Ô soạn là <textarea> thật, có nhãn; phím tắt không thay thế nút — nút Gửi luôn hiện và bấm được.
  • Danh sách tin nhắn tự cuộn xuống cuối khi có nội dung mới; người dùng cuộn lên đọc lại thì đó là thao tác của họ, đừng ép cuộn lại bằng code của trang.
  • Nội dung trả về hiển thị nguyên văn, không parse markdown — không có nguy cơ HTML lạ chen vào.

Lưu ý

  • Khoá bằng disabled khi người dùng chưa đăng nhập hoặc hết hạn mức, kèm empty-text giải thích.
  • Nội dung AI có thể sai: đặt câu nhắc kiểm chứng ngay cạnh khung chat với nghiệp vụ quan trọng.
  • Đừng đưa dữ liệu nhạy cảm vào prompt mặc định — xem AI trong sản phẩm.

Liên quan