Harnix

Cuộc hội thoại

Liệt kê và đọc cuộc hội thoại, cửa sổ lịch sử.

Các endpoint dưới đây dùng khi bạn tự xây giao diện chat của riêng mình thay vì dùng widget <harnix-chat> — chúng đều xác thực bằng token của end-user (Authorization: Bearer <token>, xem Xác thực), không phải API key.

Danh sách agent khả dụng

GET https://api.harnix.vn/v2/agents
Authorization: Bearer <token>
[{ "id": "b6b0f9b2-...", "name": "Trợ lý hỗ trợ" }]

Trả về mọi agent đang active của tổ chức — token không gắn với một agent cụ thể nào.

Tạo cuộc hội thoại mới

POST https://api.harnix.vn/v2/conversations
Authorization: Bearer <token>
Content-Type: application/json

{ "agent_id": "b6b0f9b2-..." }

Trả về 201 với ConversationRead: { id, agent_id, title, created_at, last_message_at }. title là null cho tới khi có một giá trị được đặt sau này (console cho phép đặt tên).

Liệt kê cuộc hội thoại

GET https://api.harnix.vn/v2/conversations?agent_id=...&limit=20&before=...
Authorization: Bearer <token>

Chỉ trả về cuộc hội thoại của chính end-user đang gọi — không có cách nào để một end-user đọc conversation của người khác, kể cả biết ID. Phân trang kiểu keyset: dùng next_before của trang trước làm before của trang sau; limit tối đa 50 (mặc định 50).

{
  "items": [{ "id": "77fd...", "agent_id": "b6b0f9b2-...", "title": null, "created_at": "...", "last_message_at": "..." }],
  "next_before": "77fd..."
}

Đọc một cuộc hội thoại

GET https://api.harnix.vn/v2/conversations/{conversation_id}?before_seq=...
Authorization: Bearer <token>

Trả về ConversationDetail — thông tin cuộc hội thoại kèm tối đa 50 message gần nhất (messages). Mỗi message có role (user hoặc assistant), content, citations (chỉ có ở message của assistant, hoặc null), seq (thứ tự tăng dần trong conversation), và run_id (run đã sinh ra message này, dùng để stream hoặc xem lại). Dùng before_seq để lấy trang cũ hơn.

pending_approval cho biết cuộc hội thoại có đang dừng chờ người dùng xác nhận một hành động hay không: null khi không có, hoặc { run_id, expires_at, calls: [{ call_id, server_name, name, title, arguments }] } — cùng nội dung với khung approval của stream. Dùng nó khi người dùng mở lại trang: dựng lại lời hỏi xác nhận từ đây và trả lời bằng POST /v2/runs/{run_id}/approval, không cần mở lại stream.

pending_question cho biết cuộc hội thoại có đang dừng chờ người dùng trả lời câu hỏi (ask_user) hay không: null khi không có, hoặc { run_id, call_id, expires_at, questions: [...] } — cùng nội dung với khung question của stream. Dùng nó khi người dùng mở lại trang: dựng lại giao diện câu hỏi từ đây và trả lời bằng POST /v2/runs/{run_id}/answer hoặc gửi tin nhắn tiếp theo mà không cần mở lại stream.

Một conversation không thuộc về bạn, hoặc không tồn tại — cùng một conversation_not_found (404): endpoint không xác nhận sự tồn tại của conversation người khác.

Gửi message trong một cuộc hội thoại

POST https://api.harnix.vn/v2/conversations/{conversation_id}/messages
Authorization: Bearer <token>
Idempotency-Key: 2f6a...   (khuyến nghị)
Content-Type: application/json

{ "content": "Chính sách hoàn tiền của chúng tôi là gì?" }

202 Accepted với { run_id, message_id, conversation_id } — giống hệt POST /v2/chat, khác ở chỗ conversation đã xác định sẵn qua URL và người gửi là end-user đang cầm token, không phải một API key.

Trong lúc cuộc hội thoại có một hành động chờ xác nhận (pending_approval khác null), gửi message mới trả 409 approval_pending — xác nhận hoặc từ chối hành động đó trước. Gửi lại đúng message đã tạo ra run đang chờ, với cùng Idempotency-Key, vẫn trả 202 với run đó như bình thường.

Ngược lại, khi cuộc hội thoại đang có câu hỏi chờ trả lời (pending_question khác null), gửi message mới không bị lỗi: tin nhắn mới được xem là câu trả lời văn bản tự do của người dùng cho câu hỏi đó. Endpoint trả 202 với chính run đang chờ (không tạo run mới, không tính vào trần 3 run đồng thời), ghi nhận message vào lịch sử và tiếp tục lượt chạy. Gửi lại cùng Idempotency-Key trả về cùng run mà không tạo message trùng lặp.

Cửa sổ lịch sử

Agent không nhìn thấy toàn bộ lịch sử conversation khi trả lời — chỉ một cửa sổ gần nhất (cấu hình theo agent, xem Xây dựng agent). Một conversation rất dài vẫn đọc lại được đầy đủ qua API này; chỉ phần đưa vào ngữ cảnh của model là bị giới hạn.

Bước tiếp theo

  • Streaming — theo dõi run_id vừa nhận theo thời gian thực.
  • Idempotency & huỷ — kể cả cách xác nhận hành động hay trả lời câu hỏi đang chờ.
  • Lượt chạy & Trace — lịch sử hội thoại qua API này không bị xoá theo cấu hình lưu trữ trace của tổ chức bạn.

Trên trang này