16. AI & Trợ Lý
16.1 Tạo Bản Nháp Phản Hồi
POST /api/v1/ai/reply-draft
Tạo phản hồi do AI hỗ trợ cho tin nhắn.
Thân Yêu Cầu:
{
"conversationId": "conv-001",
"messageId": "msg-001",
"tone": "professional"
}
Phản hồi:
{
"draft": "Cảm ơn bạn đã hỏi! Chúng tôi rất vui được giúp bạn với...",
"confidence": 0.87
}
16.2 Tạo Tóm Tắt
POST /api/v1/ai/summary
Tạo tóm tắt AI cho cuộc trò chuyện.
Thân Yêu Cầu:
{
"conversationId": "conv-001"
}
Phản hồi:
{
"summary": "Khách hàng hỏi về giá gói premium. Quan tâm đến so sánh tính năng với các đối thủ cạnh tranh.",
"keyPoints": [
"Quan tâm đến gói premium",
"Muốn so sánh tính năng",
"Ngân sách khoảng 500 USD/tháng"
]
}
16.3 Phân Tích Cảm Xúc
POST /api/v1/ai/sentiment
Phân tích cảm xúc của tin nhắn/cuộc trò chuyện.
Thân Yêu Cầu:
{
"text": "Tôi thực sự hài lòng với dịch vụ của bạn! Đội hỗ trợ rất tuyệt vời."
}
Phản hồi:
{
"sentiment": "positive",
"score": 0.92,
"emotions": ["happy", "satisfied"]
}
16.4 Danh Sách AI Provider
GET /api/v1/ai/providers
Lấy danh sách provider (anthropic, gemini, openai, qwen, kimi) kèm base URL và trạng thái API key của tổ chức hiện tại. Key chỉ trả về dạng che (mask), không bao giờ trả key thật.
Phản hồi:
[
{ "id": "openai", "name": "OpenAI", "baseUrl": "https://api.openai.com", "hasKey": true, "keyMask": "••••f5QA" },
{ "id": "anthropic", "name": "Anthropic", "baseUrl": "https://api.anthropic.com", "hasKey": false, "keyMask": "" }
]
16.5 Cập Nhật API Key / Base URL Của Provider
PUT /api/v1/ai/providers/:id
Quyền: settings:edit. Đặt hoặc xoá API key (mã hoá AES-GCM khi lưu) và base URL cho provider, theo từng tổ chức. Key/URL cấu hình ở đây được ưu tiên hơn .env. Gửi apiKey rỗng để xoá key (quay về cấu hình .env).
Thân Yêu Cầu:
{
"apiKey": "sk-proj-...",
"baseUrl": "https://api.openai.com"
}
Phản hồi:
{ "ok": true }
16.6 Danh Sách Model Của Provider
GET /api/v1/ai/providers/:id/models
Lấy danh sách model trực tiếp từ API của provider (dùng key + base URL đã cấu hình). Nếu provider không hỗ trợ liệt kê model hoặc key sai → trả mảng rỗng kèm error (UI cho phép gõ tay tên model).
Phản hồi:
{
"models": [
{ "title": "gpt-4o-mini", "value": "gpt-4o-mini" },
{ "title": "gpt-5.4-nano", "value": "gpt-5.4-nano" }
]
}
Phản hồi khi lỗi (vẫn HTTP 200):
{ "models": [], "error": "Chưa cấu hình API key" }