📖 Nội dung bài học
#### Summary
Khi xây dựng ứng dụng với nhiều tools, bạn cần xử lý các tình huống mà Claude có thể cần gọi nhiều tools theo trình tự để trả lời một câu hỏi của người dùng. Ví dụ, nếu người dùng hỏi "103 ngày nữa là thứ mấy?", Claude cần lấy ngày hiện tại, sau đó cộng thêm 103 ngày.

Điều này tạo ra một mẫu hội thoại đa lượt, nơi Claude thực hiện nhiều yêu cầu tool trước khi đưa ra câu trả lời cuối cùng. Ứng dụng của bạn cần xử lý điều này một cách tự động.
## Mẫu Tool Đa Lượt (Multi-Turn Tool Pattern)
Đây là những gì xảy ra bên dưới khi Claude cần nhiều tools:
1. Người dùng hỏi: "103 ngày nữa là thứ mấy?"
2. Claude phản hồi với một khối sử dụng tool yêu cầu `get_current_datetime`
3. Máy chủ của bạn gọi hàm và trả về kết quả
4. Claude nhận ra cần thêm thông tin và yêu cầu `add_duration_to_datetime`
5. Máy chủ của bạn gọi hàm đó và trả về kết quả
6. Claude giờ đã có đủ thông tin để đưa ra câu trả lời cuối cùng

```mermaid
sequenceDiagram
participant User
participant Claude
participant Server as Server (your code)
User->>Claude: "103 ngày nữa là thứ mấy?"
Claude->>Server: tool_use — get_current_datetime
Server-->>Claude: current datetime result
Claude->>Server: tool_use — add_duration_to_datetime
Server-->>Claude: future datetime result
Claude-->>User: Câu trả lời cuối cùng
Xây dựng Vòng lặp Hội thoại (Conversation Loop)
Để xử lý mẫu này, bạn cần một vòng lặp hội thoại tiếp tục cho đến khi Claude ngừng yêu cầu tools:
def run_conversation(messages):
while True:
response = chat(messages)
add_user_message(messages, response)
# Pseudo code
if response isn't asking for a tool:
break
tool_result_blocks = run_tools(response)
add_user_message(tool_result_blocks)
return messages

Tái cấu trúc các Hàm Hỗ trợ (Refactoring Helper Functions)
Trước khi triển khai vòng lặp hội thoại, bạn cần cập nhật các hàm hỗ trợ để xử lý nhiều khối tin nhắn một cách chính xác.
Cập nhật Trình xử lý Tin nhắn (Updating Message Handlers)
Các hàm add_user_message và add_assistant_message của bạn hiện đang giả định bạn luôn làm việc với văn bản thuần túy. Hãy cập nhật chúng để xử lý các đối tượng tin nhắn đầy đủ:
from anthropic.types import Message
def add_user_message(messages, message):
user_message = {
"role": "user",
"content": message.content if isinstance(message, Message) else message
}
messages.append(user_message)
Điều này cho phép bạn truyền vào một chuỗi, một danh sách các khối hoặc một đối tượng tin nhắn hoàn chỉnh.
Cập nhật Hàm Chat (Updating the Chat Function)
Sửa đổi hàm chat của bạn để chấp nhận một danh sách các tools và trả về toàn bộ tin nhắn thay vì chỉ văn bản:
def chat(messages, system=None, temperature=1.0, stop_sequences=[], tools=None):
params = {
"model": model,
"max_tokens": 1000,
"messages": messages,
"temperature": temperature,
"stop_sequences": stop_sequences,
}
if tools:
params["tools"] = tools
if system:
params["system"] = system
message = client.messages.create(**params)
return message
Trích xuất Văn bản từ Tin nhắn (Extracting Text from Messages)
Vì bạn hiện đang trả về các đối tượng tin nhắn đầy đủ, hãy tạo một hàm trợ giúp để trích xuất văn bản khi cần:
def text_from_message(message):
return "\n".join(
[block.text for block in message.content if block.type == "text"]
)
Hàm này tìm tất cả các khối văn bản trong một tin nhắn và nối chúng lại với nhau, rất hữu ích khi bạn cần hiển thị phản hồi cuối cùng cho người dùng.
Cải tiến Chính (Key Improvements)
Các bước tái cấu trúc này chuẩn bị mã của bạn cho việc xử lý tool mạnh mẽ:
- Xử lý tin nhắn linh hoạt - Các hàm trợ giúp của bạn giờ đây có thể hoạt động với các định dạng tin nhắn khác nhau
- Hỗ trợ Tool trong Chat - Hàm chat có thể nhận và truyền qua các schema tool
- Trả về tin nhắn đầy đủ - Bạn nhận được các đối tượng tin nhắn hoàn chỉnh thay vì chỉ văn bản, bảo toàn tất cả các khối
- Tiện ích trích xuất văn bản - Cách dễ dàng để lấy văn bản có thể đọc được từ các tin nhắn phức tạp
Với những nền tảng này, bạn đã sẵn sàng triển khai vòng lặp hội thoại tự động xử lý nhiều lệnh gọi tool, tạo ra trải nghiệm liền mạch nơi Claude có thể sử dụng bao nhiêu tool tùy thích để trả lời câu hỏi của người dùng.
Downloads
## 🔁 Bài học liên quan
- **Bài tiếp:** [Implementing multiple turns](../38-implementing-multiple-turns/vi.md)
- **Bài trước:** [Sending tool results](../36-sending-tool-results/vi.md)
- **Cùng section:** [Making a request](../05-making-a-request/vi.md) · [Multi-Turn conversations](../06-multi-turn-conversations/vi.md) · [Chat exercise](../07-chat-exercise/vi.md)
- **Thuộc lộ trình:** [Path C](../../../../../docs/learning-paths.md)
- **Docs tham khảo:** [Glossary](../../../../../docs/glossary.md) · [Skills atlas](../../../../../docs/skills-atlas.md) · [By use-case](../../../../../docs/by-use-case.md)
## 📚 Nguồn & ghi nhận
- Bài học gốc Anthropic Academy: [https://anthropic.skilljar.com/claude-with-the-anthropic-api/287750](https://anthropic.skilljar.com/claude-with-the-anthropic-api/287750)
- © 2025 Anthropic. Chỉ dùng cho mục đích giáo dục, fair-use.
- Crawl: — · Chuẩn hoá: 2026-05-01