
# Hàm tùy chỉnh

Các hàm tùy chỉnh cho phép bot AI của bạn kết nối với các hệ thống khác trong các cuộc trò chuyện trực tiếp. Thay vì nói "Tôi sẽ kiểm tra và phản hồi lại cho bạn", bot có thể tra cứu trạng thái đơn hàng, kiểm tra hàng tồn kho hoặc tạo bản ghi trong CRM của bạn (hệ thống quản lý quan hệ khách hàng - phần mềm bạn sử dụng để theo dõi khách hàng tiềm năng và khách hàng, chẳng hạn như HubSpot hoặc Salesforce) - tất cả đều diễn ra trong thời gian thực, ngay khi khách hàng đang chờ đợi.


---

## Hàm tùy chỉnh so với Webhook

Đây là điểm gây nhầm lẫn phổ biến nhất, vì vậy cần làm rõ trước khi bạn bắt đầu xây dựng bất cứ thứ gì.

| | Webhook | Hàm tùy chỉnh |
|---|----------|------------------|
| **Hướng** | Một chiều (gửi và quên) | Hai chiều (gọi và chờ) |
| **Bot làm gì** | Gửi thông báo khi có sự kiện xảy ra, sau đó tiếp tục công việc. | Gọi ra ngoài, **tạm dừng, chờ phản hồi** và sử dụng kết quả trả về để tiếp tục cuộc trò chuyện. |
| **Khả năng hiển thị trong cuộc trò chuyện** | Kết quả ở phía sau là vô hình đối với bot — nó không bao giờ thấy điều gì đã xảy ra. | Phản hồi được đưa trực tiếp trở lại AI, vì vậy bot có thể trích dẫn, suy luận về nó và trả lời khách hàng bằng thông tin đó. |
| **Phù hợp nhất cho** | Ghi nhật ký sự kiện, đồng bộ dữ liệu với CRM, kích hoạt tự động hóa bên ngoài (Zapier, Make, n8n). | Bất cứ việc gì mà bot cần **câu trả lời** trước khi có thể phản hồi — tra cứu trực tiếp, định giá thời gian thực, tạo nội dung ngay lập tức. |

**Khi nào chọn cái nào:** Nếu bạn chỉ cần *thông báo* cho một hệ thống khác rằng điều gì đó đã xảy ra, hãy sử dụng webhook - một tin nhắn tự động một chiều được gửi đến hệ thống khác (xem **Cài đặt → Tích hợp → Webhooks**). Nếu bot cần *tìm hiểu* điều gì đó từ hệ thống khác trước khi tiếp tục cuộc trò chuyện, hãy sử dụng hàm tùy chỉnh.

---

## Ví dụ về những gì Hàm tùy chỉnh có thể thực hiện

Vì phản hồi được đưa ngược lại vào cuộc trò chuyện, các hàm tùy chỉnh mở ra những khả năng mà webhook đơn thuần không thể làm được:

- **Tra cứu hàng tồn kho trực tiếp trên Shopify hoặc WooCommerce** — Trước khi báo giá cho khách hàng, bot kiểm tra hàng tồn kho theo thời gian thực và trả lời "Vâng, chúng tôi còn 12 chiếc size M" thay vì "để tôi kiểm tra và phản hồi lại cho bạn sau".
- **Định giá động từ Google Sheet** — Nhóm bán hàng của bạn cập nhật giá trong bảng tính; bot đọc dòng mới nhất ngay giữa cuộc trò chuyện và báo giá hiện tại mà không cần ai phải can thiệp vào cấu hình AI.
- **Tác nhân gọi lại bằng AI giọng nói** — Khi bot xác định được khách hàng tiềm năng, nó kích hoạt một tác nhân giọng nói (ví dụ: trình gọi điện được hỗ trợ bởi ElevenLabs) để gọi lại cho khách hàng trong vài phút và xác nhận với khách hàng "tuyệt vời, hãy chờ cuộc gọi trong 5 phút tới".
- **Tạo và gửi email báo giá PDF ngay trong lúc chat** — Bot thu thập các yêu cầu, gọi đến trình tạo báo giá của bạn, nhận lại URL tệp PDF và nói với khách hàng "Tôi vừa gửi email báo giá cho bạn — hãy kiểm tra hộp thư đến nhé."

---

## Hàm tùy chỉnh có thể làm được gì?

Hãy coi các hàm tùy chỉnh như việc cung cấp cho bot của bạn những siêu năng lực vượt xa việc chỉ trò chuyện. Dưới đây là các ví dụ thực tế:

- **Theo dõi đơn hàng** - Khách hàng hỏi "Đơn hàng của tôi ở đâu?" và bot kiểm tra hệ thống thương mại điện tử của bạn rồi trả lời kèm trạng thái vận chuyển và liên kết theo dõi
- **Kiểm tra hàng tồn kho** - "Bạn có món này size 10 không?" Bot kiểm tra hệ thống kho của bạn và đưa ra câu trả lời theo thời gian thực
- **Cập nhật CRM** - Khi bot xác định được khách hàng tiềm năng, nó tự động tạo hoặc cập nhật bản ghi trong HubSpot, Salesforce hoặc bất kỳ CRM nào khác
- **Tạo báo giá** - Bot thu thập các yêu cầu của khách hàng và tạo báo giá cá nhân hóa từ hệ thống định giá của bạn
- **Đặt lịch** - Bot tạo một cuộc hẹn trong hệ thống đặt lịch bên ngoài của bạn
- **Xác minh giảm giá** - "Mã giảm giá này có hợp lệ không?" Bot kiểm tra và xác nhận
- **Tra cứu tài khoản** - Khách hàng cũ được tự động nhận diện và thông tin chi tiết tài khoản của họ được truy xuất

**Khách hàng không bao giờ thấy những gì xảy ra ở hậu trường.** Họ chỉ đơn giản trải nghiệm một con bot có thể trả lời các câu hỏi của họ bằng thông tin thực tế, cập nhật.

---

## Hàm tùy chỉnh hoạt động như thế nào (Phiên bản đơn giản)

Đây là những gì xảy ra khi một hàm tùy chỉnh được kích hoạt trong cuộc trò chuyện:

1. **Khách hàng hỏi một điều gì đó** cần dữ liệu thời gian thực (ví dụ: "Đơn hàng của tôi đâu rồi?")
2. **Bot nhận diện** rằng nó cần sử dụng một hàm tùy chỉnh để trả lời
3. **Bot thu thập** bất kỳ thông tin còn thiếu nào từ khách hàng (ví dụ: "Số đơn hàng của bạn là gì?")
4. **Nền tảng gửi yêu cầu** đến hệ thống của bạn (trang web, CRM hoặc bất kỳ công cụ nào khác) kèm theo các chi tiết liên quan
5. **Hệ thống của bạn phản hồi** bằng dữ liệu (ví dụ: trạng thái đơn hàng, mã vận đơn, ngày giao hàng)
6. **Bot đọc phản hồi** và soạn một câu trả lời tự nhiên: "Đơn hàng ORD-4582 của bạn đã được gửi và dự kiến sẽ đến vào thứ Sáu!"

### Chi phí cho một lệnh gọi hàm tùy chỉnh

Mỗi lệnh gọi hàm tùy chỉnh được tính phí theo cấp độ Chất lượng AI của Tác nhân (Agent) của bạn:

| Cấp độ Chất lượng AI | Tín dụng cho mỗi lệnh gọi hàm tùy chỉnh | Khi kết nối với khóa Anthropic của riêng bạn (BYOK) |
|---|---|---|
| Pro | 1 tín dụng | 0 tín dụng — chạy trên khóa của bạn |
| Economy (đã ngừng hỗ trợ) | 0,5 tín dụng | 0 tín dụng — chạy trên khóa của bạn |
| Max | 0,25 tín dụng | vẫn là 0,25 tín dụng, vẫn bị tính phí ngay cả khi đã kết nối khóa của riêng bạn, vì Max chạy trên mô hình của chúng tôi |
| Mini | 0,15 tín dụng | vẫn là 0,15 tín dụng, vẫn bị tính phí ngay cả khi đã kết nối khóa của riêng bạn, vì Mini chạy trên mô hình của chúng tôi |

---

## Thiết lập Hàm Tùy chỉnh (Từng bước)

1. Trong thanh bên chính, bên dưới **AI Studio**, nhấp vào **Custom Functions**.


2. Nhấp vào nút **+ Add Function** (hoặc **New function**) màu xanh lá cây ở góc trên bên phải.


Danh sách các hàm tùy chỉnh hiển thị một bảng với các cột sau:

| Cột | Nội dung hiển thị |
|--------|--------------|
| **Name** | Tên hàm (ví dụ: `check_order_status`) |
| **Description** | Tóm tắt ngắn gọn về chức năng của hàm (bị cắt bớt còn 50 ký tự trong bảng) |
| **Method** | Phương thức HTTP được sử dụng, hiển thị dưới dạng huy hiệu màu: GET (xanh dương), POST (xanh lá), PUT (cam), DELETE (đỏ) |
| **Created** | Ngày tạo hàm |

Điều này giúp bạn dễ dàng xem lướt qua các hàm của mình và tìm thấy hàm bạn cần.

### Bước 1: Đặt tên và mô tả


| Trường | Nội dung cần nhập | Ví dụ |
|-------|--------------|---------|
| **Name** | Một tên ngắn gọn sử dụng chữ cái, số và dấu gạch dưới | `check_order_status` |
| **Description** | Giải thích chức năng của hàm này (AI đọc phần này để quyết định khi nào nên sử dụng) | "Tra cứu trạng thái hiện tại của đơn hàng khách hàng bằng số đơn hàng" |
| **Purpose (AI Action)** | Cho AI biết chính xác khi nào và làm thế nào để sử dụng hàm này | "Sử dụng khi khách hàng hỏi về trạng thái đơn hàng, vận chuyển hoặc giao hàng. Hãy hỏi số đơn hàng của họ trước." |

**Mẹo:** Hãy thật cụ thể trong phần mô tả và mục đích. Bạn càng làm rõ khi nào hàm nên được sử dụng, bot sẽ càng sử dụng nó một cách đáng tin cậy vào đúng thời điểm.

### Bước 2: Thiết lập kết nối

Bạn cần cho ứng dụng biết nơi gửi yêu cầu:

| Trường | Nội dung cần nhập | Ví dụ |
|-------|--------------|---------|
| **URL** | Địa chỉ web của điểm cuối (endpoint) hệ thống của bạn (địa chỉ cụ thể trên hệ thống của bạn nhận yêu cầu và gửi lại dữ liệu) | `https://api.yourstore.com/v1/orders/status` |
| **Method** | Loại yêu cầu cần gửi | Xem các tùy chọn bên dưới |

**Cách chọn phương thức:**

| Phương thức | Khi nào nên sử dụng |
|--------|---------------|
| **GET** | Tra cứu thông tin (trạng thái đơn hàng, hàng tồn kho, chi tiết tài khoản) |
| **POST** | Tạo bản ghi mới (phiếu hỗ trợ, khách hàng tiềm năng, đặt chỗ) hoặc tra cứu phức tạp |
| **PUT** | Cập nhật hoàn toàn một bản ghi hiện có |
| **PATCH** | Cập nhật một phần của bản ghi hiện có |
| **DELETE** | Xóa một bản ghi |

Nếu bạn không chắc chắn nên sử dụng phương thức nào, hãy kiểm tra với nhà phát triển của bạn hoặc tài liệu của hệ thống mà bạn đang kết nối. **GET** (để tra cứu) và **POST** (để tạo bản ghi) là những phương thức phổ biến nhất.

### Bước 3: Thêm Tiêu đề Xác thực

Hầu hết các hệ thống đều yêu cầu xác thực để chấp nhận yêu cầu. Hãy thêm bất kỳ tiêu đề bắt buộc nào:

| Tiêu đề | Giá trị Ví dụ |
|--------|--------------|
| `Authorization` | `Bearer your-api-key-here` |
| `Content-Type` | `application/json` |

**Mẹo bảo mật:** Sử dụng khóa API chuyên dụng với quyền hạn hạn chế. Không sử dụng thông tin đăng nhập cấp quản trị viên.

**Nơi tìm khóa API:** Kiểm tra phần cài đặt hoặc phần dành cho nhà phát triển của hệ thống mà bạn đang kết nối (ví dụ: CRM, nền tảng thương mại điện tử hoặc công cụ đặt chỗ của bạn).

### Bước 4: Xác định Đầu vào (Những gì Bot gửi đi)

Các tham số đầu vào là những thông tin mà bot thu thập từ cuộc trò chuyện và gửi đến hệ thống của bạn.

Đối với mỗi tham số, bạn cần chỉ định:

| Thuộc tính | Ý nghĩa |
|----------|--------------|
| **Tên** | Tên tham số (phải khớp với những gì hệ thống của bạn mong đợi) |
| **Loại** | Loại dữ liệu (văn bản, số, đúng/sai, v.v.) |
| **Mô tả** | Cho AI biết thông tin này là gì và tìm thấy nó ở đâu trong cuộc trò chuyện |
| **Bắt buộc** | Nếu đặt là Có, bot sẽ hỏi khách hàng thông tin này trước khi tiếp tục |

**Các loại tham số khả dụng:**

| Loại | Ý nghĩa |
|------|--------------|
| **string** | Văn bản (tên, số đơn hàng, địa chỉ) |
| **number** | Giá trị số (số lượng, giá cả) |
| **boolean** | Đúng hoặc sai (giá trị có/không) |
| **array** | Một danh sách các mục. Được gửi dưới dạng danh sách JSON thực — trong **Run Test**, bạn có thể nhập dưới dạng `[8624]`, `["a", "b"]` hoặc đơn giản là phân tách bằng dấu phẩy (`8624, 8625`) và nó sẽ được chuyển đổi cho bạn. Nếu API của bạn nghiêm ngặt về nội dung danh sách — ví dụ: chỉ chứa số — hãy đặt **Item type** tùy chọn bên cạnh loại và mọi giá trị trong danh sách sẽ được chuyển đổi sang loại đó. |
| **query_param** | Văn bản được gửi dưới dạng tham số URL thay vì trong phần thân yêu cầu. Sử dụng loại này khi API của bạn yêu cầu dữ liệu trong URL (ví dụ: `?order_id=123`). |

Mỗi tham số cũng có một trường **Đường dẫn nội dung yêu cầu** (Request body path) tùy chọn. Thông thường, một tham số được gửi dưới dạng trường cấp cao nhất trong nội dung yêu cầu (hoặc dưới dạng giá trị chuỗi truy vấn, đối với loại `query_param`). Nếu endpoint của bạn yêu cầu tham số đó được lồng bên trong — ví dụ: `{"order": {"id": "ORD-123"}}` — hãy đặt đường dẫn thành `order.id` và nền tảng sẽ tự động lồng giá trị đó vào cho bạn.


**Ví dụ: Để tra cứu trạng thái đơn hàng, bạn có thể xác định:**

- **order_number** (chuỗi, bắt buộc): "Số đơn hàng của khách hàng. Thường bắt đầu bằng ORD- theo sau là các chữ số. Hãy hỏi khách hàng thông tin này nếu họ chưa đề cập đến."
- **email** (chuỗi, tùy chọn): "Địa chỉ email của khách hàng để xác minh thêm. Chỉ cần thiết nếu số đơn hàng không tìm thấy kết quả khớp."

### Những gì Hệ thống của bạn Tự động Nhận được

Ngoài các tham số đầu vào mà bạn xác định, nền tảng sẽ tự động bao gồm dữ liệu hệ thống trong mỗi yêu cầu. Điểm cuối (endpoint) của bạn sẽ nhận dữ liệu này trong trường `system`:

| Trường hệ thống | Nội dung chứa |
|-------------|----------------|
| `system.contactId` | ID nền tảng của liên hệ trong cuộc trò chuyện |
| `system.campaignId` | ID chiến dịch mà cuộc trò chuyện thuộc về |
| `system.userId` | ID người dùng của bạn |
| `system.channel` | Kênh nhắn tin (ví dụ: `"whatsapp"`, `"instagram"`) |
| `system.contact` | Bản ghi liên hệ đầy đủ (tên, điện thoại, email, thẻ, v.v.) |
| `system.campaign` | Cấu hình chiến dịch |
| `system.test` | `true` nếu đây là bản dùng thử Try Out, `false` cho các cuộc trò chuyện trực tiếp |

Điều này rất hữu ích nếu hệ thống của bạn cần xác định liên hệ, kiểm tra chiến dịch nào đã kích hoạt hàm hoặc cần xử lý khác biệt trong quá trình thử nghiệm.

> **Bạn không cần dữ liệu hệ thống?** Hãy bật nút gạt **Bỏ qua dữ liệu hệ thống** (Skip System Data) trong trình tạo hàm. Bot sau đó sẽ chỉ gửi các tham số đầu vào mà bạn đã xác định — không bao gồm dữ liệu liên hệ hoặc chiến dịch. Hãy sử dụng tùy chọn này nếu điểm cuối của bạn từ chối các trường không mong đợi hoặc bạn chỉ đơn giản muốn một payload gọn nhẹ hơn.

### Bước 5: Kiểm tra, sau đó để bot đọc phản hồi

Thông thường, bạn không cần phải ánh xạ các trường phản hồi. Khi endpoint của bạn phản hồi, bot sẽ đọc toàn bộ phản hồi JSON và sử dụng **Mô tả** và **Mục đích (Hành động AI)** của hàm — cộng với mô tả riêng của từng tham số — để xác định những gì quan trọng và trình bày một cách tự nhiên. Một Mô tả rõ ràng về chính hàm đó ("Truy xuất trạng thái hiện tại của đơn hàng khách hàng bao gồm thông tin vận chuyển và theo dõi") sẽ mang lại hiệu quả cao hơn so với việc ánh xạ từng trường một.

Nếu endpoint của bạn trả về một phản hồi lớn và bạn chỉ muốn bot thấy một vài giá trị cụ thể, hãy mở phần **Ánh xạ phản hồi** (Response mapping) (mặc định bị thu gọn, ngay phía trên phần Kiểm tra). Mỗi hàng sẽ chọn một trường cấp cao nhất từ phản hồi: **Trường phản hồi** (Response field) là tên trường trong phản hồi JSON của API của bạn, và **Trường đầu ra** (Output field) là tên mà bot sẽ nhận được. Với ít nhất một hàng được điền, bot sẽ chỉ nhận được các giá trị bạn đã ánh xạ thay vì toàn bộ nội dung phản hồi. Hãy để trống phần này để giữ hành vi phản hồi đầy đủ mặc định.


Trước khi lưu, hãy sử dụng phần **Kiểm tra** ở cuối trình tạo để gửi yêu cầu chính xác như đã cấu hình và xem phản hồi thực tế mà không cần rời khỏi ứng dụng:


Phản hồi bạn thấy ở đây là phản hồi thô từ endpoint. Nếu bạn đã thiết lập **Ánh xạ phản hồi** ở trên, bot trong cuộc trò chuyện thực tế sẽ chỉ nhận được các trường đã ánh xạ đó — bài kiểm tra luôn hiển thị toàn bộ phản hồi thô để bạn có thể thấy những gì khả dụng để ánh xạ. Nếu có điều gì đó không ổn (tên trường không mong đợi, lồng ghép thừa), hãy sửa nó trên endpoint của bạn hoặc điều chỉnh ánh xạ của bạn.

---

## Gán hàm cho một Agent

Sau khi tạo một hàm tùy chỉnh, bạn cần cho mỗi Agent biết những hàm nào nó có thể sử dụng:

1. Mở [Agent](../ai-agents/ai-agents.md) trong **AI Studio → AI Agents**.
2. Chuyển đến tab **AI Abilities** của nó. (Đối với một chiến dịch vẫn giữ các cài đặt AI riêng thay vì thông qua một Agent riêng biệt, danh sách tương tự sẽ xuất hiện trên bước **AI Abilities** của chính chiến dịch đó.)
3. Bạn sẽ thấy danh sách mọi hàm tùy chỉnh mà bạn đã tạo. Bật từng hàm mà bạn muốn bot của Agent này có thể gọi.
4. Nhấp vào **Lưu thay đổi** ở dưới cùng. Các lựa chọn chỉ có hiệu lực sau khi được lưu.


Chỉ những hàm được gán mới khả dụng cho bot của Agent đó. Điều này ngăn bot vô tình sử dụng các hàm không liên quan.

---

## Kiểm thử các hàm tùy chỉnh của bạn

Trước khi triển khai thực tế, hãy kiểm tra kỹ lưỡng:

1. **Chạy Kiểm tra tích hợp** - Sử dụng phần **Kiểm tra** bên trong trình tạo hàm (xem ở trên) để kiểm tra nhanh mà không cần rời khỏi ứng dụng — điền các giá trị thực tế và nhấp vào Chạy kiểm tra.
2. **Kiểm tra trực tiếp endpoint hệ thống của bạn** - Đối với danh sách kiểm tra đầy đủ bên dưới, một công cụ chuyên dụng như Postman (hoặc nhà phát triển của bạn) sẽ đi sâu hơn một lần Chạy kiểm tra đơn lẻ.
3. **Kiểm tra trong Thử nghiệm (Try Out)** - Mô phỏng một cuộc trò chuyện nơi khách hàng hỏi điều gì đó sẽ kích hoạt hàm.
4. **Kiểm tra phản hồi** - Đảm bảo bot đọc và trình bày dữ liệu một cách chính xác.
5. **Kiểm tra các tình huống lỗi** - Điều gì sẽ xảy ra nếu khách hàng cung cấp số đơn hàng không hợp lệ? Điều gì xảy ra nếu hệ thống của bạn tạm thời ngừng hoạt động?

### Khi kết quả kiểm tra trả về 401 hoặc 403

Lỗi 401 hoặc 403 có nghĩa là điểm cuối (endpoint) của bạn đã nhận được yêu cầu nhưng từ chối nó. Dấu hiệu nhận biết là **không có gì xuất hiện trong nhật ký của chính bạn** — hầu hết các công cụ đều từ chối một lệnh gọi không được ủy quyền trước khi chúng bắt đầu quy trình làm việc, vì vậy không có gì để xem ở phía bạn và có vẻ như yêu cầu chưa bao giờ đến nơi.

Hầu như luôn luôn đây là sự không khớp về xác thực: điểm cuối của bạn muốn một loại thông tin xác thực và hàm đang gửi một loại khác. Hãy kiểm tra xem tiêu đề bạn đã thêm trong [Bước 3](#step-3-add-authentication-headers) có chính xác là tiêu đề mà hệ thống của bạn mong đợi hay không.

Phiên bản phổ biến nhất của lỗi này là webhook được bảo vệ bằng **Basic Auth** (n8n, Make và hầu hết các công cụ tự lưu trữ đều cung cấp tùy chọn này dưới dạng hộp kiểm trên chính webhook) trong khi hàm gửi một tiêu đề bí mật tùy chỉnh như `X-My-Secret`. Basic Auth chỉ chấp nhận tiêu đề `Authorization`, vì vậy tiêu đề tùy chỉnh sẽ bị bỏ qua và lệnh gọi bị từ chối. Bạn có hai lựa chọn:

- **Tắt Basic Auth** trên webhook và kiểm tra tiêu đề tùy chỉnh của bạn bên trong quy trình làm việc thay thế.
- **Giữ Basic Auth bật** và thêm tiêu đề `Authorization` vào hàm với giá trị là từ `Basic` theo sau là `username:password` đã được mã hóa base64 của bạn.

Cách nào cũng được — chỉ cần đảm bảo cả hai bên đều thống nhất.

### Khi kết quả kiểm tra trả về 404

URL điểm cuối không chính xác hoặc quy trình làm việc chưa được xuất bản. Đặc biệt trong n8n, mỗi webhook có một URL **Kiểm tra (Test)** và URL **Sản xuất (Production)** riêng biệt, và URL Kiểm tra chỉ lắng nghe khi bạn đang mở trình chỉnh sửa. Hãy sao chép URL Sản xuất và đảm bảo quy trình làm việc đang hoạt động.

### Xem các lỗi trong Try Out và Chats

Khi AI gọi một hàm tùy chỉnh trong cuộc trò chuyện và lệnh gọi đó thất bại — do thông tin xác thực sai, điểm cuối (endpoint) bị lỗi, hoặc hết thời gian chờ — cuộc trò chuyện hiện sẽ hiển thị thông báo: một dấu hiệu **"(tên hàm) failed"** màu đỏ sẽ xuất hiện trong luồng hội thoại, ở cả tab **Try Out** của tác nhân và các cuộc trò chuyện thực tế trong **Chats**. Nhấp vào dấu hiệu này để mở rộng chi tiết: mã trạng thái mà điểm cuối của bạn đã trả về và nội dung phản hồi của nó, những thông tin này thường đủ để bạn biết chính xác cần sửa lỗi gì (ví dụ: `401` với thông báo "unauthorized" nghĩa là lỗi tiêu đề xác thực, còn lỗi timeout nghĩa là điểm cuối của bạn mất hơn 30 giây để phản hồi).

Các lệnh gọi thành công cũng hiển thị một dấu hiệu — hãy nhấp vào đó để xem điểm cuối của bạn thực sự đã phản hồi lại những gì. Đây là cách nhanh nhất để gỡ lỗi tích hợp từ đầu đến cuối: thực hiện cuộc trò chuyện thử nghiệm trong Try Out, sau đó nhấp vào dấu hiệu hàm để xem kết quả yêu cầu thực tế mà không cần rời khỏi trang.

---

## Ví dụ hoàn chỉnh: Tra cứu trạng thái đơn hàng

Dưới đây là một ví dụ đã được cấu hình đầy đủ mà bạn có thể sử dụng làm mẫu:

**Thông tin cơ bản:**
- **Tên:** `check_order_status`
- **Mô tả:** "Truy xuất trạng thái hiện tại của đơn hàng khách hàng bao gồm thông tin vận chuyển và theo dõi"
- **Hành động AI:** "Gọi hàm này khi khách hàng hỏi về trạng thái đơn hàng, vị trí gói hàng hoặc thời gian hàng đến. Luôn yêu cầu số đơn hàng trước."

**Kết nối:**
- **URL:** `https://api.mystore.com/orders/lookup`
- **Phương thức:** POST

**Tiêu đề (Headers):**
- `Authorization`: `Bearer sk_live_abc123`
- `Content-Type`: `application/json`

**Tham số đầu vào:**
- `order_number` (văn bản, bắt buộc): "Số đơn hàng do khách hàng cung cấp"
- `customer_email` (văn bản, tùy chọn): "Email của khách hàng để xác minh bổ sung"

**Không cần ánh xạ phản hồi** — với Mô tả và AI Action rõ ràng đã được thiết lập ở trên, bot sẽ đọc bất kỳ JSON nào mà endpoint của bạn trả về (trạng thái, số theo dõi, ngày giao hàng, mặt hàng) và tìm cách trình bày về nó.

**Cuộc hội thoại sẽ diễn ra như sau:**

> **Khách hàng:** Này, đơn hàng của tôi đâu rồi?
>
> **Bot:** Xin chào! Tôi rất sẵn lòng kiểm tra đơn hàng giúp bạn. Bạn có thể chia sẻ số đơn hàng với tôi không?
>
> **Khách hàng:** Là ORD-78234
>
> **Bot:** Để tôi tra cứu giúp bạn...
>
> Đơn hàng ORD-78234 của bạn đã được gửi đi và đang trên đường đến! Ngày giao hàng dự kiến là ngày 10 tháng 3. Bạn có thể theo dõi gói hàng của mình tại đây: https://tracking.example.com/1Z999AA1
>
> Tôi có thể giúp gì thêm cho bạn không?

---

## Ví dụ hoàn chỉnh: Trạng thái đơn hàng Shopify

Nếu cửa hàng chạy trên Shopify, bạn không cần nhà phát triển để xây dựng điểm cuối tra cứu — hệ thống của chính Shopify có thể trả lời trực tiếp các câu hỏi về đơn hàng. (Đối với các câu hỏi về sản phẩm và kho hàng trên cửa hàng Shopify, bạn hoàn toàn không cần hàm tùy chỉnh: hãy kết nối máy chủ tích hợp sẵn của cửa hàng thay thế — xem [Kết nối cửa hàng Shopify](mcp-servers.md#ready-made-example-connect-a-shopify-store).)

**Trước tiên, hãy tạo một mã truy cập (access token) trong Shopify.** Shopify đã thay đổi điều này trong năm 2026: các ứng dụng không còn có thể được tạo bên trong trang quản trị Shopify nữa, và màn hình ứng dụng mới sẽ cung cấp cho bạn **Client ID** và **Client secret** thay vì một mã token có sẵn. Các bước dưới đây sẽ chuyển đổi chúng thành một mã token vĩnh viễn. Hãy dành khoảng mười phút, thực hiện một lần cho mỗi cửa hàng. (Nếu cửa hàng đã có một ứng dụng cũ được tạo theo cách cũ, mã token hiện tại của nó vẫn sẽ tiếp tục hoạt động — hãy bỏ qua và chuyển thẳng đến hàm tùy chỉnh bên dưới.)

1. Truy cập Bảng điều khiển dành cho nhà phát triển Shopify tại [dev.shopify.com](https://dev.shopify.com), mở tổ chức của bạn và nhấp vào **Ứng dụng → Tạo ứng dụng**. Đặt tên cho ứng dụng, ví dụ như `Order lookup`.
2. Cấp cho ứng dụng quyền **read_orders**, phát hành phiên bản và cài đặt ứng dụng trên cửa hàng.
3. Mở **Cài đặt** của ứng dụng và thêm địa chỉ web của cửa hàng (ví dụ: `https://www.yourstore.com/`) vào các URL chuyển hướng được phép. Lưu lại.
4. Vẫn trong **Cài đặt**, sao chép **ID khách hàng** và **Mã bí mật khách hàng**.
5. Trong trình duyệt mà bạn đã đăng nhập vào quản trị viên Shopify của cửa hàng đó, hãy mở địa chỉ bên dưới, thay thế tên cửa hàng, ID khách hàng và địa chỉ chuyển hướng bằng thông tin của riêng bạn:
   `https://YOUR-STORE.myshopify.com/admin/oauth/authorize?client_id=YOUR-CLIENT-ID&scope=read_orders&redirect_uri=https://www.yourstore.com/&state=12345`
   Phê duyệt màn hình xuất hiện. Trình duyệt sẽ chuyển đến địa chỉ chuyển hướng của bạn và thanh địa chỉ bây giờ chứa `code=` theo sau là một giá trị dài — hãy sao chép giá trị đó. Nó chỉ có hiệu lực trong vài phút, vì vậy hãy chuyển ngay sang bước tiếp theo.
6. Đổi mã đó lấy mã thông báo, bạn có thể thực hiện việc này bên trong <span data-t="appName">Your AI Connector</span>. Trong trình tạo hàm tùy chỉnh, đặt **Phương thức** thành POST và **URL** thành `https://YOUR-STORE.myshopify.com/admin/oauth/access_token`, thêm ba tham số đầu vào văn bản có tên `client_id`, `client_secret` và `code`, sau đó nhấp vào **Kiểm tra**, điền ba giá trị và chạy nó. Phản hồi chứa `access_token` — đó là mã thông báo vĩnh viễn của bạn. Sao chép nó vào nơi an toàn, sau đó xóa trình tạo và thiết lập hàm thực tế bên dưới.

**Sau đó thiết lập hàm tùy chỉnh:**

**Thông tin cơ bản:**
- **Tên:** `check_shopify_order`
- **Mô tả:** "Tra cứu đơn hàng trong hệ thống Shopify của cửa hàng và trả về trạng thái, thông tin theo dõi và các mặt hàng"
- **Hành động AI:** "Gọi hàm này khi khách hàng hỏi về trạng thái đơn hàng hoặc việc giao hàng. Luôn yêu cầu cung cấp số đơn hàng trước."

**Kết nối:**
- **URL:** `https://YOUR-STORE.myshopify.com/admin/api/2026-01/orders.json?status=any` — thay thế `YOUR-STORE` bằng tên `.myshopify.com` của cửa hàng (địa chỉ này sử dụng tên miền kỹ thuật của Shopify, không phải tên miền tùy chỉnh của cửa hàng)
- **Phương thức:** GET

**Tiêu đề (Headers):**
- `X-Shopify-Access-Token`: `shpat_...` (mã truy cập từ bước trên)

**Tham số đầu vào:**
- `name` (query_param, bắt buộc): "Số đơn hàng của khách hàng chính xác như hiển thị trong xác nhận đơn hàng của họ, bao gồm cả dấu # — ví dụ: #1001. Hãy hỏi khách hàng nếu họ chưa đề cập đến số này."

**Không cần ánh xạ phản hồi** — bot sẽ đọc đơn hàng được trả về (trạng thái thanh toán, trạng thái hoàn tất, thông tin theo dõi, các mặt hàng) và trả lời một cách tự nhiên.

**Điều cần biết:** mã truy cập được tạo theo cách này có thể xem các đơn hàng trong **60 ngày qua** — đủ cho các câu hỏi hỗ trợ hàng ngày, nhưng không phải là toàn bộ lịch sử đơn hàng.

---

## Ví dụ hoàn chỉnh: Đặt lịch hẹn

**Thông tin cơ bản:**
- **Tên:** `create_booking`
- **Mô tả:** "Tạo một cuộc hẹn mới trong hệ thống đặt lịch của chúng tôi"
- **Hành động AI:** "Sử dụng hàm này sau khi xác nhận ngày, giờ và chi tiết liên hệ với khách hàng. Không gọi hàm cho đến khi khách hàng xác nhận rõ ràng rằng họ muốn đặt lịch."

**Kết nối:**
- **URL:** `https://booking.mycompany.com/api/appointments`
- **Phương thức:** POST

**Tham số đầu vào:**
- `date` (văn bản, bắt buộc): "Ngày hẹn theo định dạng YYYY-MM-DD"
- `time` (văn bản, bắt buộc): "Giờ hẹn theo định dạng HH:MM"
- `name` (văn bản, bắt buộc): "Họ và tên khách hàng"
- `phone` (văn bản, bắt buộc): "Số điện thoại khách hàng"
- `service_type` (văn bản, bắt buộc): "Loại dịch vụ được đặt"

---

## Ví dụ hoàn chỉnh: Thêm người đăng ký bản tin vào CRM của bạn

Một mô hình rất phổ biến: bot trả lời xong, đề nghị người dùng đăng ký bản tin, liên hệ trả lời bằng địa chỉ email của họ và địa chỉ đó sẽ được gửi thẳng vào công cụ email của bạn. Hầu hết các CRM (FluentCRM, ActiveCampaign, MailerLite, Brevo và các công cụ khác) đều chấp nhận một yêu cầu POST đơn giản cho việc này, vì vậy không cần nền tảng tự động hóa trung gian.

Ví dụ này sử dụng **FluentCRM** trên WordPress. Cấu trúc này cũng tương tự cho bất kỳ công cụ nào cung cấp cho bạn "webhook đầu vào" hoặc điểm cuối "tạo người đăng ký".

**Trước tiên, hãy lấy URL từ CRM của bạn.** Trong WordPress, mở **FluentCRM → Settings → Incoming Webhooks** và tạo một webhook. Chọn danh sách, thẻ và trạng thái đăng ký mà các liên hệ mới sẽ nhận được, sau đó sao chép URL webhook mà nó tạo ra. Mọi thứ bạn thiết lập ở đây sẽ được áp dụng tự động, vì vậy bot chỉ cần gửi địa chỉ email.

**Sau đó thiết lập hàm tùy chỉnh:**

**Thông tin cơ bản:**
- **Tên:** `add_newsletter_subscriber`
- **Mô tả:** "Thêm một người vào danh sách bản tin của chúng tôi bằng địa chỉ email họ đã cung cấp trong cuộc trò chuyện"
- **Hành động AI:** "Sử dụng hành động này ngay khi liên hệ đồng ý đăng ký bản tin và cung cấp địa chỉ email của họ. Không gọi hành động này trước khi họ thực sự cung cấp địa chỉ và không gọi hai lần cho cùng một người."

**Kết nối:**
- **URL:** URL webhook bạn đã sao chép từ CRM của mình
- **Phương thức:** POST

**Tham số đầu vào:**
- `email` (chuỗi, bắt buộc): "Địa chỉ email mà liên hệ đã cung cấp trong cuộc trò chuyện"
- `first_name` (chuỗi, tùy chọn): "Tên của liên hệ, nếu họ đã đề cập đến"

**Bỏ qua dữ liệu hệ thống:** bật tùy chọn này **on**. CRM của bạn chỉ cần các trường ở trên và một payload gọn nhẹ hơn sẽ tránh được lỗi từ các công cụ từ chối các trường không mong đợi.

**Ánh xạ phản hồi:** không cần thiết ở đây. Không cần phản hồi gì để bot tiếp tục hoạt động.

**Đừng quên bật hàm cho Tác nhân chạy cuộc hội thoại** (xem [Gán Hàm cho Tác nhân](#assigning-functions-to-an-agent)). Đây là lý do phổ biến nhất khiến một hàm được xây dựng chính xác không bao giờ kích hoạt.

::: tip
**Mẹo:** bot cũng có một công cụ **Cập nhật Email liên hệ** tích hợp sẵn, giúp lưu địa chỉ vào hồ sơ liên hệ bên trong nền tảng. Công cụ này tách biệt với chức năng này và rất hữu ích khi dùng kèm — công cụ tích hợp giúp giữ cho hồ sơ liên hệ của riêng bạn đầy đủ, còn chức năng tùy chỉnh sẽ đẩy địa chỉ đó vào CRM của bạn.
:::


---

## Mẹo để có các hàm tùy chỉnh đáng tin cậy

1. **Đảm bảo các yêu cầu lặp lại là an toàn.** Nếu cùng một yêu cầu vô tình được gửi hai lần, nó không được tạo ra các bản ghi trùng lặp. Các sự cố mạng đôi khi có thể gây ra điều này.

2. **Trả về thông báo lỗi rõ ràng.** Nếu có sự cố xảy ra từ phía hệ thống của bạn, hãy trả về một thông báo lỗi mà con người có thể đọc được. Bot sẽ chuyển tiếp thông báo đó đến khách hàng một cách khéo léo.

3. **Giữ thời gian phản hồi dưới 10 giây.** Nếu hệ thống của bạn mất nhiều thời gian hơn, hãy cân nhắc việc gửi phản hồi xác nhận nhanh trước.

4. **Xử lý thông tin xác thực hết hạn hoặc không hợp lệ.** Nếu khóa API của bạn hết hạn, hãy đảm bảo thông báo lỗi rõ ràng để bot biết cần thông báo cho con người thay vì thử lại.

5. **Viết mô tả chi tiết.** AI sử dụng các mô tả của bạn để xác định thời điểm gọi hàm và cách trích xuất thông tin chính xác từ cuộc trò chuyện. Những mô tả mơ hồ sẽ dẫn đến sai sót.

6. **Kiểm tra với các cuộc trò chuyện thực tế.** Try Out rất tốt cho việc kiểm tra ban đầu, nhưng hãy theo dõi một vài cuộc trò chuyện trực tiếp đầu tiên để đảm bảo mọi thứ hoạt động với các truy vấn thực tế của khách hàng.

7. **Lưu giữ nhật ký ở phía bạn.** Hãy yêu cầu nhà phát triển của bạn ghi lại các yêu cầu đến từ ứng dụng để bạn có thể nhanh chóng gỡ lỗi mọi vấn đề.

8. **Sử dụng URL công khai cuối cùng.** URL hàm của bạn phải là một địa chỉ web công khai (HTTP/HTTPS). Các địa chỉ nội bộ, localhost và mạng riêng tư sẽ bị từ chối vì lý do bảo mật, và nền tảng không theo dõi các chuyển hướng — hãy trỏ hàm trực tiếp đến URL cuối cùng, không phải URL chuyển hướng đến đó.

---

## Giới hạn thực thi

Mỗi hàm tùy chỉnh đều có phần **Giới hạn thực thi** tùy chọn ở cuối trình chỉnh sửa. Phần này kiểm soát tần suất AI có thể chạy hàm và liệu kết quả trước đó có thể được sử dụng lại hay không. Mọi thứ ở đây đều là tùy chọn — hãy để trống tất cả và hàm sẽ hoạt động chính xác như trước đây.


**Hàm chỉ đọc.** Bật tùy chọn này nếu hàm của bạn chỉ *đọc* dữ liệu — như tra cứu cổ phiếu, kiểm tra giá, tìm kiếm trạng thái đơn hàng — và không bao giờ tạo hoặc thay đổi bất cứ điều gì. Khi sự cố mạng tạm thời làm gián đoạn AI giữa chừng khi đang trả lời, nền tảng có thể thử lại lượt hội thoại một cách an toàn thay vì để khách hàng không nhận được câu trả lời. Chỉ bật tùy chọn này nếu hàm thực sự không bao giờ ghi bất cứ thứ gì: một hàm tạo bản ghi phải được tắt, để việc thử lại không bao giờ vô tình chạy nó hai lần.

**Phục vụ kết quả đã lưu vào bộ nhớ đệm khi gọi lặp lại.** Khi AI gọi lại hàm với cùng các đầu vào (ví dụ: khách hàng hỏi cùng một câu hỏi hai lần), kết quả trước đó sẽ được sử dụng lại thay vì gọi lại điểm cuối (endpoint) của bạn. Các kết quả đã lưu vào bộ nhớ đệm được giữ trong tối đa 24 giờ, và một lệnh gọi với các đầu vào *khác nhau* sẽ luôn được gửi đến điểm cuối của bạn như một lệnh gọi mới.

**Số lần chạy tối đa mỗi cuộc hội thoại.** Một giới hạn cứng về số lần hàm có thể chạy trong một cuộc hội thoại. Đặt thành 1 cho các hàm chỉ nên kích hoạt một lần mỗi cuộc trò chuyện — như tạo báo giá, kích hoạt cuộc gọi lại, bắt đầu tự động hóa. Khi đạt đến giới hạn, AI sẽ được thông báo rằng hàm đã chạy và được cung cấp kết quả gần đây nhất, vì vậy nó vẫn có thể trả lời khách hàng thay vì im lặng.

**Số lần chạy tối đa mỗi khoảng thời gian.** Một giới hạn tốc độ theo thời gian: ví dụ, tối đa 5 lần chạy trong vòng 60 phút. Hữu ích cho các hàm gọi các dịch vụ bên thứ ba trả phí hoặc kích hoạt các tự động hóa nặng hơn. Cả hai ô phải được điền cùng nhau (số lần chạy và khoảng thời gian tính bằng phút, tối đa 7 ngày).

Một vài điều cần lưu ý:

- Các giới hạn chỉ tính các lần chạy **thành công**. Một lệnh gọi thất bại ở phía điểm cuối của bạn sẽ không làm tiêu tốn ngân sách giới hạn.
- Khi một lần chạy bị chặn bởi giới hạn, khách hàng sẽ không bao giờ bị bỏ rơi — AI sẽ được thông báo lý do và làm việc với thông tin mà nó đã có.
- Các giới hạn áp dụng ở mọi nơi hàm chạy: các cuộc trò chuyện thông thường trên mọi kênh và các hàm được quản lý bởi tự động hóa. Các cuộc hội thoại thử nghiệm trong phần Thử nghiệm (Try Out) không được tính và không bị giới hạn.

---

## Các công cụ Bot tích hợp sẵn

Ngoài các hàm tùy chỉnh mà bạn tự xây dựng, nền tảng còn đi kèm với một thư viện các công cụ được xây dựng sẵn mà bot AI có thể sử dụng trong cuộc trò chuyện. Các công cụ này bao gồm những việc phổ biến nhất mà một bot cần làm — cảnh báo cho đồng đội, đặt lịch hẹn, gắn thẻ liên hệ, tìm kiếm trên trang web của bạn, lên lịch theo dõi, v.v. — vì vậy bạn không cần phải tự thiết lập từ đầu.

**Bot quyết định khi nào sử dụng từng công cụ** dựa trên những gì đang xảy ra trong cuộc trò chuyện và cách Agent (cùng chiến dịch đính kèm) của bạn được cấu hình. Hầu hết các công cụ này tự động bật khi tính năng liên quan được kích hoạt (ví dụ: các công cụ đặt lịch chỉ khả dụng khi bạn kết nối lịch và bật tính năng đặt lịch).

**Chi phí tín dụng:** Mỗi lệnh gọi công cụ được tính phí theo cấp độ Chất lượng AI của Tác nhân của bạn, và các hàm tùy chỉnh do bạn tự xây dựng cũng được tính phí theo cách tương tự:

| Cấp độ Chất lượng AI | Tín dụng cho mỗi lệnh gọi công cụ | Khi kết nối với khóa Anthropic của riêng bạn (BYOK) |
|---|---|---|
| Pro | 1 tín dụng | 0 tín dụng — chạy trên khóa của bạn |
| Economy (đã ngừng hỗ trợ) | 0,5 tín dụng | 0 tín dụng — chạy trên khóa của bạn |
| Max | 0,25 tín dụng | vẫn là 0,25 tín dụng, vẫn bị tính phí ngay cả khi đã kết nối khóa của riêng bạn, vì Max chạy trên mô hình của chúng tôi |
| Mini | 0,15 tín dụng | vẫn là 0,15 tín dụng, vẫn bị tính phí ngay cả khi đã kết nối khóa của riêng bạn, vì Mini chạy trên mô hình của chúng tôi |

### Công cụ Nhóm & Tác vụ

| Công cụ | Chức năng | Khi nào Bot sử dụng |
|------|--------------|----------------------|
| **Alert a Team Member** (Cảnh báo thành viên nhóm) | Tạm dừng bot cho liên hệ này và gửi email cho nhóm của bạn rằng cần có sự can thiệp của con người. Cuộc trò chuyện được gắn cờ để đồng nghiệp có thể tiếp nhận. | Khi khách hàng yêu cầu gặp người thật, cảm thấy thất vọng hoặc hỏi điều gì đó mà bot không được phép hoặc không thể trả lời. |
| **Create a Task** (Tạo tác vụ) | Tạo một tác vụ mới trên bảng tác vụ của bạn, tùy chọn liên kết với liên hệ và cuộc trò chuyện. Bot vẫn tiếp tục trả lời như bình thường — tác vụ chỉ là một ghi chú để nhóm của bạn theo dõi. | Đối với các mục không khẩn cấp như yêu cầu tính năng, cơ hội bán thêm hoặc cuộc gọi lại mà nhóm nên xử lý sau. |
| **Suggest an FAQ Update** (Đề xuất cập nhật FAQ) | Khi bot gặp câu hỏi không thể trả lời tốt, nó tạo một tác vụ yêu cầu nhóm của bạn thêm câu trả lời vào cơ sở kiến thức. | Khi một liên hệ hỏi điều gì đó không có trong các FAQ hiện có — để lỗ hổng kiến thức được khắc phục cho lần sau. |
| **Add Context to an FAQ Suggestion** (Thêm ngữ cảnh vào đề xuất FAQ) | Nếu một liên hệ khác sau đó hỏi một câu hỏi tương tự với góc độ khác, bot sẽ thêm ngữ cảnh đó vào đề xuất FAQ hiện có thay vì tạo tác vụ trùng lặp. | Tự động — giữ cho danh sách tác vụ của bạn gọn gàng khi nhiều người cùng nêu ra một lỗ hổng kiến thức. |

### Công cụ Liên hệ

| Công cụ | Chức năng | Khi nào Bot sử dụng |
|------|--------------|----------------------|
| **Gắn thẻ** | Chạy tự động sau mỗi lần bot trả lời — đây không phải là công cụ mà bot hướng tới khách hàng quyết định gọi. Hệ thống xem xét cuộc trò chuyện gần đây và áp dụng các thẻ liên quan, sử dụng lại các thẻ hiện có của bạn nếu có thể (và chỉ tạo thẻ mới khi cần). | Tự động — bất cứ khi nào cuộc trò chuyện tiết lộ điều gì đó đáng để phân đoạn, chẳng hạn như sự quan tâm, ý định, chất lượng khách hàng tiềm năng hoặc ngôn ngữ. |
| **Cập nhật tên liên hệ** | Lưu tên và/hoặc họ của liên hệ khi họ chia sẻ. | Khi khách hàng giới thiệu bản thân hoặc sửa lại tên. |
| **Cập nhật email liên hệ** | Lưu địa chỉ email của liên hệ khi họ chia sẻ. | Khi khách hàng cung cấp email — cho bản tin, biên lai, tra cứu tài khoản, v.v. |

### Công cụ Đặt lịch & Hẹn giờ

Các công cụ này chỉ khả dụng khi tính năng đặt lịch được bật trên chiến dịch liên kết với Agent của bạn và loại sự kiện lịch đã được cấu hình.

| Công cụ | Chức năng | Khi nào Bot sử dụng |
|------|--------------|----------------------|
| **Kiểm tra khung giờ trống** | Tìm kiếm các khung giờ còn trống trong lịch đã kết nối của bạn cho một ngày hoặc khoảng thời gian cụ thể. | Khi khách hàng muốn đặt lịch và bot cần đưa ra các khung giờ khả dụng thực tế. |
| **Đặt lịch hẹn** | Tạo cuộc hẹn trong lịch của bạn và xác nhận việc đặt lịch cho khách hàng. | Sau khi khách hàng xác nhận ngày và giờ cụ thể. |
| **Dời lịch hẹn** | Thay đổi lịch hẹn hiện có sang ngày và giờ mới. | Khi khách hàng yêu cầu dời lịch. |
| **Hủy lịch hẹn** | Hủy một cuộc hẹn đã có. | Khi khách hàng yêu cầu hủy. |
| **Tra cứu lịch hẹn** | Truy xuất các cuộc hẹn hiện có của liên hệ để bot biết những gì đã được đặt. | Khi khách hàng hỏi "lịch hẹn của tôi là khi nào?" hoặc trước khi đề nghị dời lịch. |

### Công cụ Kiến thức & Web

| Công cụ | Chức năng | Khi nào Bot sử dụng |
|------|--------------|----------------------|
| **Tìm kiếm trên trang web của bạn** | Quét các URL bạn đã thêm vào danh sách URL động của chiến dịch để tìm trang sản phẩm, bài viết hoặc nội dung khác trả lời câu hỏi của khách hàng. Chỉ khả dụng khi **Tìm kiếm Web bằng AI** được bật và bạn đã thêm ít nhất một URL Động. Nếu Tìm kiếm Web bằng AI bị tắt, bot không thể đọc các trang hoặc liên kết — ngay cả những liên kết mà khách hàng dán vào cuộc trò chuyện. | Khi khách hàng hỏi về điều gì đó có khả năng nằm trên trang web của bạn — sản phẩm, giá cả, địa điểm, chính sách. |
| **Kiểm tra liên kết** | Đọc nội dung của một URL cụ thể để bot có thể trả lời các câu hỏi về trang đó. Chỉ khả dụng khi **Tìm kiếm Web bằng AI** được bật và bạn đã thêm ít nhất một URL Động. Nếu Tìm kiếm Web bằng AI bị tắt, bot không thể đọc các trang hoặc liên kết — ngay cả những liên kết mà khách hàng dán vào cuộc trò chuyện. | Khi khách hàng chia sẻ một liên kết hoặc hỏi về một trang cụ thể trên trang web của bạn. |
| **Tìm kiếm trên Web** | Thực hiện tìm kiếm công khai trên Google và trả về các kết quả hàng đầu, để bot có thể trả lời các câu hỏi nằm ngoài nội dung của riêng bạn. | Khi khách hàng hỏi về điều gì đó chung chung (ví dụ: chỉ đường, thông tin công cộng) không có trong cơ sở kiến thức của bạn. Chỉ được sử dụng nếu tìm kiếm web được bật. |

### Công cụ Theo dõi (Follow-Up)

Các công cụ này yêu cầu tính năng theo dõi (follow-up) phải được bật trên chiến dịch được liên kết với Tác nhân (Agent) của bạn.

| Công cụ | Chức năng | Khi nào Bot sử dụng |
|------|--------------|----------------------|
| **Lên lịch Theo dõi Thông minh** | Lên lịch tin nhắn theo dõi thông minh bằng chuỗi theo dõi của bạn — chọn mẫu và thời điểm phù hợp dựa trên cuộc trò chuyện. | Khi khách hàng im lặng hoặc yêu cầu bot "kiểm tra lại sau". |
| **Lên lịch Theo dõi** | Lên lịch theo dõi cơ bản vào một thời điểm cụ thể. | Khi bot cần thúc đẩy cuộc trò chuyện tiến triển vào một thời điểm xác định. |

### Trình chạy Hàm tùy chỉnh

| Công cụ | Chức năng | Khi nào Bot sử dụng |
|------|--------------|----------------------|
| **Chạy Hàm Tùy chỉnh** | Thực thi một trong các hàm tùy chỉnh mà bạn đã xây dựng và gán cho Tác nhân (xem phần còn lại của trang này). | Khi yêu cầu của khách hàng khớp với mục đích của một trong các hàm tùy chỉnh của bạn. |

### Công cụ Đặt chỗ Nhà hàng (Zenchef và Formitable)

Các công cụ này chỉ khả dụng khi tích hợp Zenchef hoặc Formitable được kết nối. Chúng cho phép bot quản lý việc đặt bàn tại nhà hàng từ đầu đến cuối.

| Công cụ | Chức năng | Khi nào Bot sử dụng |
|------|--------------|----------------------|
| **Kiểm tra tình trạng sẵn sàng của nhà hàng** | Tìm kiếm các khung giờ đặt bàn trống cho một ngày, số lượng khách và (tùy chọn) khu vực ngồi. | Khi khách hàng yêu cầu đặt bàn. |
| **Tạo đặt chỗ nhà hàng** | Tạo một đặt chỗ mới. | Sau khi khách hàng xác nhận một khung giờ cụ thể. |
| **Cập nhật đặt chỗ nhà hàng** | Thay đổi ngày, giờ, số lượng khách hoặc ghi chú trên một đặt chỗ hiện có. | Khi khách hàng yêu cầu sửa đổi đặt chỗ của họ. |
| **Hủy hoặc thay đổi trạng thái đặt chỗ** | Hủy đặt chỗ hoặc cập nhật trạng thái của nó (ví dụ: đã xác nhận, không đến). | Khi khách hàng hủy hoặc khi bot cần đánh dấu thay đổi trạng thái. |
| **Tìm kiếm đặt chỗ** | Tìm các đặt chỗ hiện có khớp với các tiêu chí như tên, email hoặc ngày tháng. | Khi khách hàng cũ hỏi về một đặt chỗ hiện có. |
| **Cập nhật hồ sơ khách hàng** | Cập nhật hồ sơ của khách hàng trong hệ thống nhà hàng (sở thích, ghi chú, thông tin liên hệ). | Khi khách hàng chia sẻ sở thích ăn uống, số điện thoại mới hoặc thông tin cấp hồ sơ khác. |
| **Liệt kê sản phẩm nhà hàng** | Lấy danh sách thực đơn, thực đơn theo set hoặc các món bổ sung có sẵn để đặt trước. | Khi khách hàng hỏi "bạn có những thực đơn set nào?" hoặc bot cần đính kèm thực đơn vào đặt chỗ. |

### Bật và Tắt Công cụ

Hầu hết các công cụ được kiểm soát trên tab **Khả năng AI** của Tác nhân (hoặc bước **Khả năng AI** của chiến dịch, nếu bạn đang làm việc từ một chiến dịch kiểu cũ):

- **Công cụ đặt chỗ** sẽ bật khi bạn kích hoạt đặt chỗ và kết nối lịch — đây vẫn là cài đặt theo từng chiến dịch, với liên kết trực tiếp đến bước đó của chiến dịch từ tab Khả năng AI của chính Tác nhân
- **Công cụ theo dõi** sẽ bật khi bạn kích hoạt tính năng theo dõi
- **Công cụ nhà hàng** sẽ bật khi bạn kết nối tài khoản Zenchef hoặc Formitable
- **Tìm kiếm web** có nút bật/tắt riêng trên tab **Câu hỏi thường gặp & Kiến thức**
- **Công cụ tác vụ** có thể được tắt cho từng Tác nhân bằng nút **Cho phép AI tạo tác vụ** (chúng được bật theo mặc định; công tắc Tác vụ trên toàn tài khoản trong **Cài đặt → Hồ sơ → Tính năng** sẽ tắt toàn bộ hệ thống tác vụ ở mọi nơi)
- **Công cụ cập nhật liên hệ** được kiểm soát trên cùng tab **Khả năng AI** — liệu AI có được phép đổi tên liên hệ hoặc lưu thêm thông tin thu thập được vào liên hệ đó hay không
- **Công cụ cảnh báo** luôn khả dụng; **gắn thẻ** chạy tự động sau mỗi lần bot trả lời (đây không phải là công cụ mà bot chọn để gọi)

Nếu bạn muốn bot ngừng sử dụng một công cụ tích hợp cụ thể, cách sạch nhất là vô hiệu hóa tính năng cơ bản (ví dụ: tắt đặt chỗ để vô hiệu hóa tất cả các công cụ đặt chỗ).

---

## Các hàm được quản lý bởi tự động hóa

Một số mục trên trang Hàm tùy chỉnh của bạn có thể mang huy hiệu **Được quản lý bởi tự động hóa**. Những mục đó không được tạo tại đây — chúng đến từ một quy trình tự động hóa với trình kích hoạt **Hàm AI Agent**, cung cấp cho tác nhân của bạn một khả năng mà các bước thực hiện được bạn xây dựng trực quan trên bảng vẽ tự động hóa thay vì trỏ đến một địa chỉ web bên ngoài.

Một hàm được quản lý sẽ được chăm sóc giúp bạn: tên, mô tả và các trường của nó luôn tuân theo những gì được thiết lập trên trình kích hoạt của tự động hóa, vì vậy nó không thể bị chỉnh sửa hoặc xóa khỏi trang này — hãy sử dụng liên kết **Mở tự động hóa** của nó và thay đổi chính tự động hóa đó. Tuy nhiên, bạn vẫn có thể chọn tác nhân nào có hàm này theo cách thông thường: trên tab **Khả năng AI** của tác nhân, nó xuất hiện cùng với các khả năng khác của tác nhân với nút bật/tắt thông thường (nếu tự động hóa của nó bị tạm dừng, hàng đó sẽ hiển thị thông báo — khả năng này sẽ hoạt động khi tự động hóa được bật). Mọi thứ khác về nó đều hoạt động giống như bất kỳ hàm tùy chỉnh nào khác: AI quyết định khi nào cần gọi hàm, thu thập các chi tiết bạn đã xác định và có thể sử dụng phản hồi của tự động hóa trong cùng một cuộc trò chuyện.

Nếu bạn đang phân vân giữa hai lựa chọn: hãy trỏ một hàm tùy chỉnh thông thường vào một hệ thống đã có địa chỉ để gọi; hãy xây dựng một quy trình tự động hóa với trình kích hoạt Hàm Tác nhân AI (AI Agent Function) khi công việc là thứ bạn muốn lắp ghép từ các bước — tra cứu thông tin trong bảng tính hoặc cơ sở dữ liệu, phân nhánh dựa trên điều kiện, tạo bản ghi — mà không cần phải tự chạy máy chủ. Xem [Tự động hóa](../automations/automations.md#letting-your-ai-agent-call-an-automation).

---

## Yêu cầu về gói dịch vụ

Các hàm tùy chỉnh khả dụng trên các gói bao gồm tính năng hàm tùy chỉnh. Hãy kiểm tra gói đăng ký của bạn để xác nhận tính khả dụng.

---

## Các bước tiếp theo

- [Kết nối Máy chủ MCP với Bot của bạn](mcp-servers.md) — một gói công cụ có sẵn thay vì từng hàm một.
- [Tác nhân AI](../ai-agents/ai-agents.md) — trang chính của nhóm AI Studio nơi chứa các Hàm Tùy chỉnh, và là nơi các hàm tùy chỉnh được gán cho bot.
