Hầu hết các agent (tác nhân) hữu ích đều cần sử dụng nhiều công cụ cùng một lúc. Một DevOps agent khi phát hiện mã lỗi CVE cũng cần phải tạo một phiếu ghi nhận (ticket) cho lỗi đó. Cho đến gần đây, bạn thường phải tự điều phối các bước bàn giao này hoặc chỉ có thể sử dụng các công cụ tùy chỉnh (custom tools) mà không có các công cụ có sẵn.
Việc kết hợp công cụ trong Gemini API giờ đây cho phép bạn trộn lẫn các công cụ có sẵn với các khai báo hàm tùy chỉnh trong cùng một yêu cầu. Gemini sẽ tự quyết định nên gọi công cụ nào, theo thứ tự nào và tự động luân chuyển ngữ cảnh giữa chúng.
Dưới đây là hai ví dụ về việc kết hợp công cụ.
Ví dụ 1: Kết hợp công cụ với Gọi hàm (Function Calling)
Kết hợp Google Search, URL Context và một hàm tùy chỉnh trong một yêu cầu duy nhất. Mô hình sẽ tìm kiếm trên web, đọc nội dung trang và gọi hàm của bạn mà không cần bạn phải chỉ định thứ tự thực hiện.
Lấy Gemini API key và cài đặt SDK:
pip install google-genai
Định nghĩa một hàm tùy chỉnh và truyền nó cùng với các công cụ có sẵn:
from google import genai
client = genai.Client()
# Định nghĩa hàm lưu sự cố
file_incident = {
"type": "function",
"name": "file_incident",
"description": "Lưu một sự cố bảo mật vào hệ thống theo dõi nội bộ.",
"parameters": {
"type": "object",
"properties": {
"cve_id": {"type": "string", "description": "Mã định danh CVE"},
"severity": {"type": "string", "description": "Critical, High, Medium, hoặc Low"},
"summary": {"type": "string", "description": "Mô tả ngắn gọn về lỗ hổng"},
},
"required": ["cve_id", "severity", "summary"],
},
}
interaction = client.interactions.create(
model="gemini-3-flash-preview",
input="Tìm kiếm CVE nghiêm trọng mới nhất ảnh hưởng đến React, đọc toàn bộ trang thông báo và tạo một bản ghi sự cố cho nó.",
tools=[
{"type": "google_search"},
{"type": "url_context"},
{"type": "function", "name": "file_incident", "parameters": file_incident["parameters"]},
],
)
for output in interaction.outputs:
print(f"{output.type}...")
if output.type == "function_call":
print(f"Hàm: {output.name}")
print(f"Đối số: {output.arguments}")
# Luồng thực thi dự kiến:
# google_search_call...
# google_search_result...
# google_search_call...
# google_search_result...
# thought... (suy nghĩ của mô hình)
# function_call...
# Hàm: file_incident
# Đối số: {'summary': 'Lỗ hổng thực thi mã từ xa (RCE) chưa xác thực trong React Server Components (RSC)...', 'severity': 'Critical', 'cve_id': 'CVE-2025-55182'}
Ví dụ 2: Luân chuyển ngữ cảnh qua nhiều lượt tương tác (Cross-Turn Context)
Việc luân chuyển ngữ cảnh giúp bảo toàn kết quả của các công cụ có sẵn qua các lượt hội thoại khác nhau. Bằng cách truyền previous_interaction_id, các câu hỏi tiếp theo có thể suy luận dựa trên kết quả trước đó mà không cần thực thi lại công cụ. Mô hình vẫn có thể thực hiện các lệnh gọi công cụ mới nếu nó cần dữ liệu mới hoặc thấy cần thiết.
from google import genai
client = genai.Client()
# Lượt 1: URL Context đọc trang giới thiệu của Philipp
turn1 = client.interactions.create(
model="gemini-3-flash-preview",
input="Philipp Schmid là ai? https://www.philschmid.de/philipp-schmid",
tools=[{"type": "url_context"}],
)
print(turn1.outputs[-1].text)
# Lượt 2: Câu hỏi tiếp theo sử dụng ngữ cảnh từ lượt 1
turn2 = client.interactions.create(
model="gemini-3-flash-preview",
input="Tài khoản Twitter của ông ấy là gì?",
tools=[{"type": "url_context"}],
previous_interaction_id=turn1.id,
)
print(turn2.outputs[-1].text)
Nguồn bài viết từ Tác giả Phil Schmid