Chuỗi Hội Thoại

Chuỗi hội thoại nhóm các tin nhắn liên quan thành cuộc hội thoại. AgentSend tự động gom chuỗi tin nhắn dựa trên header email chuẩn, để các agent luôn có đầy đủ ngữ cảnh của cuộc hội thoại.

Tổng Quan

Mọi cuộc hội thoại email trong AgentSend được tổ chức thành một chuỗi. Một chuỗi thu thập tất cả tin nhắn liên quan — email ban đầu, mọi phản hồi, và mọi phản hồi của phản hồi — vào một đối tượng hội thoại duy nhất, có thứ tự. Điều này giúp các agent dễ dàng đọc toàn bộ lịch sử trước khi soạn phản hồi.

Chuỗi hội thoại được tạo tự động. Khi AgentSend nhận hoặc gửi một tin nhắn bắt đầu cuộc hội thoại mới, một chuỗi sẽ được tạo. Khi có phản hồi đến, AgentSend ghép nó với chuỗi hiện có và thêm tin nhắn mới vào.

Chuỗi hội thoại được giới hạn trong phạm vi của một hộp thư. Cùng một chuỗi email nhận bởi hai hộp thư khác nhau sẽ tạo ra hai đối tượng chuỗi riêng biệt.

Cách Gom Chuỗi Hoạt Động

AgentSend tuân theo mô hình gom chuỗi email chuẩn được sử dụng bởi mọi email client lớn. Khi một phản hồi đến, AgentSend kiểm tra các header In-Reply-ToReferences để xác định chuỗi hiện có mà tin nhắn thuộc về. Nếu tìm thấy khớp, tin nhắn được thêm vào chuỗi đó. Nếu không, một chuỗi mới sẽ được tạo.

Bạn cũng có thể chỉ định rõ ràng tin nhắn thuộc chuỗi nào bằng cách bao gồm trường threadId khi gửi. Điều này hữu ích khi bạn khởi xướng theo dõi từ phía agent và muốn giữ nó cùng chuỗi với cuộc hội thoại trước đó, ngay cả khi người nhận bắt đầu chuỗi phản hồi mới.

💡

Luôn đọc threadId từ payload webhook đến và truyền lại khi trả lời. Điều này đảm bảo gom chuỗi chính xác ngay cả khi người nhận thay đổi tiêu đề.

Thuật toán ghép

  1. Kiểm tra header In-Reply-To với tất cả ID tin nhắn đã biết trong hộp thư.
  2. Nếu không khớp, quét danh sách header References từ phải (mới nhất) sang trái.
  3. Nếu vẫn không khớp, tạo một chuỗi mới cho tin nhắn này.

Thuộc Tính Chuỗi

Mỗi đối tượng chuỗi có các trường sau:

Thuộc tính Kiểu Mô tả
id string Định danh duy nhất của chuỗi.
inboxId string Hộp thư mà chuỗi này thuộc về.
subject string Dòng tiêu đề của tin nhắn đầu tiên trong chuỗi.
messageCount integer Tổng số tin nhắn trong chuỗi này.
lastMessageAt string (ISO 8601) Dấu thời gian của tin nhắn gần nhất.
createdAt string (ISO 8601) Dấu thời gian khi chuỗi được tạo lần đầu.

Liệt Kê Chuỗi

Lấy tất cả chuỗi cho một hộp thư bằng yêu cầu GET. Kết quả được sắp xếp theo lastMessageAt giảm dần, nên các cuộc hội thoại hoạt động gần đây nhất sẽ xuất hiện trước.

javascript
// GET /inboxes/{id}/threads?limit=20&offset=0
const res = await fetch(
  `https://api.agentsend.io/inboxes/${inboxId}/threads?limit=20&offset=0`,
  { headers: { "x-api-key": process.env.AGENTSEND_API_KEY } }
);

const { data, total } = await res.json();

for (const thread of data) {
  console.log(thread.id, thread.subject, thread.messageCount);
}

Tham số truy vấn

Tham số Kiểu Mặc định Mô tả
limit integer 20 Số lượng chuỗi tối đa trả về. Tối đa 100.
offset integer 0 Số lượng chuỗi bỏ qua để phân trang.

Lấy Tin Nhắn Của Chuỗi

Lấy mọi tin nhắn trong một chuỗi theo thứ tự thời gian. Điều này cho agent lịch sử hội thoại đầy đủ cần thiết để soạn phản hồi có ngữ cảnh.

javascript
// GET /threads/{id}/messages
const res = await fetch(
  `https://api.agentsend.io/threads/${threadId}/messages`,
  { headers: { "x-api-key": process.env.AGENTSEND_API_KEY } }
);

const { data } = await res.json();

// Xây dựng lịch sử hội thoại cho LLM của bạn
const history = data.map(msg => ({
  role: msg.direction === "outbound" ? "assistant" : "user",
  content: msg.bodyText,
}));

console.log(`Đã nạp ${history.length} tin nhắn từ chuỗi`);

Tin nhắn trong một chuỗi được trả về theo thứ tự thời gian tăng dần (sentAt cũ nhất trước). Điều này khớp với thứ tự tự nhiên mà hầu hết API hội thoại LLM mong đợi.

Trả Lời Trong Chuỗi

Để tiếp tục cuộc hội thoại hiện có, bao gồm threadId khi gửi tin nhắn. AgentSend sẽ tự động đặt các header In-Reply-ToReferences đúng để phản hồi xuất hiện trong email client của người nhận như một phần của cùng cuộc hội thoại.

javascript
// POST /inboxes/{id}/messages — trả lời trong chuỗi hiện có
await fetch(`https://api.agentsend.io/inboxes/${inboxId}/messages`, {
  method: "POST",
  headers: {
    "x-api-key": process.env.AGENTSEND_API_KEY,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    to: ["customer@example.com"],
    subject: "Re: Your support request",
    bodyText: "Thanks for reaching out! Here is the information you requested...",
    threadId: "thrd_abc123", // gắn tin nhắn này với cuộc hội thoại hiện có
  }),
});

Nếu bạn bỏ qua threadId, tin nhắn gửi đi sẽ bắt đầu một chuỗi mới ngay cả khi bạn dùng cùng tiêu đề. Luôn truyền threadId khi tiếp tục cuộc hội thoại.

Các Trường Hợp Sử Dụng

Chuỗi hội thoại mở ra tập hợp các quy trình yêu cầu bộ nhớ qua nhiều lần trao đổi email.