Gemini 3.8 Flash: Xây dựng vòng lặp gọi hàm với Interactions API
Gemini 3.8 Flash ra mắt ngày 2 tháng 9 năm 2026 với khả năng “gọi công cụ một cách lặp đi lặp lại”: thay vì đoán toàn bộ trong một lần, mô hình thực hiện một lệnh gọi, kiểm tra kết quả rồi tiếp tục gọi công cụ khi cần. Đây là cải tiến hữu ích cho các tác nhân, nhưng cũng yêu cầu cập nhật những vòng lặp công cụ vốn được tối ưu cho 3.7 Flash.
Hai chi tiết API quan trọng nhất:
- Mọi kết quả hàm phải chứa cả
call_idvàname. - Với dự án mới, hãy ưu tiên Interactions API thay vì
generateContent.
Bài viết này trình bày luồng hai lượt hoàn chỉnh trên Interactions API, cách tương thích với generateContent, lý do Gemini 3.8 Flash có thể gọi công cụ nhiều lần hơn và cách kiểm thử toàn bộ vòng lặp trong Apidog.
Mọi request đều sử dụng HTTP và JSON thuần túy, nên bạn có thể xây dựng, kiểm thử và gỡ lỗi trong Apidog trước khi tích hợp vào ứng dụng.
Tổng quan nhanh
| Hạng mục | Gemini 3.8 Flash |
|---|---|
| ID mô hình |
gemini-3.8-flash — bản ổn định, không có hậu tố preview |
| API chính | Interactions API (POST /v1beta/interactions) |
| API cũ |
generateContent vẫn được hỗ trợ đầy đủ |
| Khai báo công cụ | tools: [{"type": "function", "name", "description", "parameters"}] |
| Lệnh gọi của mô hình | Bước function_call với id, name, arguments
|
| Phản hồi của ứng dụng |
function_result với call_id và name, kèm previous_interaction_id
|
| Mức độ suy nghĩ |
low, medium mặc định hoặc high; minimal trả về lỗi xác thực |
| Tau3-Banking | 45%, tăng 12 điểm so với 3.7 Flash theo Artificial Analysis |
| Token đầu ra | Khoảng 48.000 token mỗi tác vụ trên chỉ mục AA, tăng 30% so với 3.7 Flash |
| Giá | $0,75/1 triệu token đầu vào và $3,75/1 triệu token đầu ra đến hết ngày 31/12/2026 |
| Tính phí suy nghĩ | Token suy nghĩ được tính như token đầu ra |
Bước 1: Khai báo công cụ
Trên Interactions API, công cụ là một object phẳng gồm:
-
type: luôn làfunction -
name: tên hàm -
description: mô tả để mô hình quyết định thời điểm gọi -
parameters: JSON Schema của tham số
Mô tả càng cụ thể, mô hình càng dễ chọn đúng công cụ. Ví dụ, “tra cứu trạng thái vận chuyển hiện tại của một đơn hàng theo ID” rõ ràng hơn “trợ giúp đơn hàng”.
curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3.8-flash",
"input": "Where is order A1029 right now?",
"generation_config": {"thinking_level": "low"},
"tools": [{
"type": "function",
"name": "get_order_status",
"description": "Look up the current shipping status of an order by its ID.",
"parameters": {
"type": "object",
"properties": {"order_id": {"type": "string"}},
"required": ["order_id"]
}
}]
}'
Trong ví dụ này:
-
thinking_levelđược đặt làlowvì đây chỉ là một lượt tra cứu. - Không truyền
temperature. Hướng dẫn Gemini 3 của Google khuyến nghị giữ giá trị mặc định là1.0; giảm giá trị này có thể làm tăng nguy cơ vòng lặp không mong muốn.
Để biết thêm về mô hình, xem Gemini 3.8 Flash là gì và hướng dẫn sử dụng Gemini 3.8 Flash API.
Bước 2: Đọc bước function_call
Interactions API không trả về một tin nhắn duy nhất. Response chứa id của interaction và danh sách các bước thực thi, có thể gồm:
- Suy nghĩ của mô hình
- Một hoặc nhiều lệnh gọi công cụ
- Bước
model_outputcuối cùng
Khi mô hình cần công cụ, response sẽ chứa bước function_call:
{
"type": "function_call",
"id": "call_8f2d...",
"name": "get_order_status",
"arguments": {
"order_id": "A1029"
}
}
Bạn cần lưu cả ba trường:
-
id: gửi lại ở lượt sau dưới têncall_id -
name: xác định hàm cần thực thi và phải gửi lại -
arguments: tham số đã được phân tích thành JSON
Hãy xác thực arguments theo quy tắc của backend trước khi thực thi. Schema giúp mô hình tạo đúng cấu trúc, nhưng không thể biết quy tắc nghiệp vụ của bạn, chẳng hạn độ dài hợp lệ của mã đơn hàng.
Ngoài ra, hãy lưu id của interaction trong response. Giá trị này sẽ được dùng làm previous_interaction_id ở lượt tiếp theo.
Bước 3: Gửi kết quả với call_id và name
Sau khi chạy hàm, gửi request thứ hai với input là function_result:
curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
-H "x-goog-[REDACTED CREDENTIAL] \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3.8-flash",
"previous_interaction_id": "<interaction id from step 2>",
"input": [{
"type": "function_result",
"name": "get_order_status",
"call_id": "call_8f2d...",
"result": [{"type": "text", "text": "{\"status\":\"in_transit\",\"eta\":\"2026-09-05\"}"}]
}]
}'
Trên Gemini 3.8 Flash, cả call_id và name đều bắt buộc. Thiếu một trong hai là lỗi phổ biến khi di chuyển vòng lặp từ các model cũ.
result là một danh sách content part. Trong ví dụ trên, JSON kết quả được truyền dưới dạng chuỗi văn bản.
Vì previous_interaction_id trỏ đến interaction trước, server đã giữ lại:
- Prompt ban đầu
- Khai báo công cụ
- Lý luận của mô hình
- Lệnh gọi hàm trước đó
Bạn không cần gửi lại các dữ liệu này.
Response tiếp theo có thể:
- Kết thúc bằng
model_output: vòng lặp hoàn tất - Chứa thêm
function_call: thực thi hàm mới rồi lặp lại Bước 2
Trong SDK Python, luồng tương ứng là:
client.interactions.create(
model="gemini-3.8-flash",
input=...,
...
)
Sau đó gọi create lần hai với previous_interaction_id và danh sách function_result trong input. SDK cung cấp văn bản cuối cùng qua interaction.output_text.
Tương thích với generateContent
Phần lớn mã Gemini hiện có vẫn sử dụng:
models/gemini-3.8-flash:generateContent
Google cho biết API này vẫn được hỗ trợ đầy đủ và chưa có ngày ngừng hoạt động. Tuy nhiên, tên trường khác nhau:
| Interactions API | generateContent |
|---|---|
tools |
functionDeclarations |
function_call |
functionCall |
function_result |
functionResponse |
call_id |
id |
Trên API cũ, functionCall của mô hình chứa id. Phản hồi functionResponse của bạn phải lặp lại giá trị đó trong trường id, đồng thời gửi name và response.
Hai khác biệt thực tế cần lưu ý:
-
generateContentkhông lưu trạng thái. Bạn phải gửi lại toàn bộ lịch sửcontentsở mỗi lượt, bao gồmfunctionCallvà các chữ ký suy nghĩ. - Cấu hình suy nghĩ dùng
generationConfig.thinkingConfig.thinkingLevel, không phảigeneration_config.thinking_level.
{
"generationConfig": {
"thinkingConfig": {
"thinkingLevel": "low"
}
}
}
Token suy nghĩ xuất hiện trong:
usageMetadata.thoughtsTokenCount
và được tính phí như token đầu ra.
Nếu bắt đầu dự án mới, Interactions API thường đơn giản hơn vì trạng thái phía server giúp giảm lỗi khi gửi lại lịch sử, chữ ký hoặc call ID. Xem thêm tài liệu gọi hàm của Google, tài liệu generateContent và tài liệu Interactions API.
Vì sao Gemini 3.8 Flash gọi công cụ nhiều lần hơn?
Bài đăng ra mắt của Google mô tả Gemini 3.8 Flash là model “hoạt động chăm chỉ hơn”: với tác vụ phức tạp, model thực hiện thêm bước suy luận, gọi công cụ lặp lại và xác minh kết quả trong quá trình xử lý.
Google cũng cho biết model có thể dùng nhiều token hơn và chạy lâu hơn theo thiết kế. Artificial Analysis đo được:
- Khoảng 48.000 token đầu ra mỗi tác vụ trên chỉ mục của họ
- Tăng 30% so với 3.7 Flash
- Chi phí mỗi tác vụ:
-
high: $0,58 -
medium: $0,41 - `low40 với cùng mức giá token
-
Với vòng lặp công cụ, điều này có nghĩa là nhiều bước function_call hơn. Lợi ích là khả năng sử dụng công cụ tốt hơn: Tau3-Banking tăng lên 45%, cao hơn 12 điểm so với 3.7 Flash. Đổi lại, vòng lặp không giới hạn có thể chạy lâu hơn và tốn nhiều chi phí hơn.
Bốn biện pháp kiểm soát nên áp dụng
1. Giới hạn số lượt
Đếm số bước function_call trong mỗi tác vụ và dừng khi đạt giới hạn:
- 6–10 lượt là điểm khởi đầu hợp lý cho các tác vụ tra cứu
- Tác nhân lập trình có thể cần nhiều lượt hơn
- Khi đạt giới hạn, gửi một lượt cuối không có công cụ hoặc trả lỗi rõ ràng cho người dùng
Mô hình sẽ không tự giới hạn số lượt thay cho bộ điều khiển của bạn.
2. Chọn thinking_level theo tuyến đường
-
low: tra cứu đơn giản hoặc công cụ một bước -
medium: tác vụ nhiều bước -
high: khi việc xác minh bổ sung thực sự có giá trị - Không dùng
minimal; Gemini 3.8 Flash trả về lỗi xác thực với mức này
Tham khảo hướng dẫn về các cấp độ suy nghĩ.
3. Đặt timeout ở hai lớp
Thiết lập:
- Timeout cho từng request đến Gemini
- Timeout thực tế cho toàn bộ tác vụ trong vòng lặp
Các lần chạy suy luận trên Artificial Analysis trung bình khoảng 2,5 phút ở high và 0,8 phút ở low.
4. Thiết kế công cụ có tính idempotent
Một model có thể gọi lại cùng công cụ. Vì vậy:
-
get_order_statusphải an toàn khi chạy nhiều lần - Các thao tác có side effect như hoàn tiền hoặc gửi email phải yêu cầu bước xác nhận riêng
Nếu ngân sách không chịu được các lượt gọi bổ sung, hãy cân nhắc giữ 3.7 Flash phía sau một cờ cấu hình. Xem hướng dẫn di chuyển từ 3.7 sang 3.8 Flash.
Chữ ký suy nghĩ, gọi song song và output có cấu trúc
Chữ ký suy nghĩ
Các model Gemini 3 đính kèm chữ ký vào quá trình suy luận. Với Interactions API được lưu trữ mặc định, previous_interaction_id xử lý phần này thay bạn.
Nếu dùng store: false hoặc generateContent, bạn phải gửi lại chính xác các block suy nghĩ và chữ ký đã nhận ở mọi loại content part.
Không được:
- Cắt bớt chữ ký
- Sắp xếp lại block
- Tuần tự hóa lại dữ liệu
- Chỉnh sửa nội dung chữ ký
Bất kỳ thay đổi nào cũng có thể làm chữ ký mất hiệu lực. Tài liệu Interactions API mô tả chi tiết sự đánh đổi giữa lưu trạng thái và stateless.
Gọi công cụ song song
Response là một danh sách nên có thể chứa nhiều function_call cho các tra cứu độc lập:
json
[
{
"type": "function_call",
"id": "call_a...",
"name": "get_order_status",
"arguments": {
"order_id": "A1029"
}
},
{
"type": "function_call",
"id": "call_b...",
"name": "get_customer_profile",
"arguments": {
"customer_id": "C42"
}
}
]
Gửi một function_result cho mỗi lệnh gọi trong cùng mảng input. Mỗi kết quả phải khớp với call_id tương ứng.
Không được- Dùng JSON Schema cho câu trả lời cuối
- Đọc
model_outputdưới dạng JSON thay vì văn bản tự do
Không nên tạo một công cụ giả rồi đọc arguments để mô phỏng structured output. Cách này sẽ hỏng khi model quyết định không cần gọi công cụ.
Google cũng liệt kê Computer Use (Preview) cho Gemini 3.8 Flash. Khi cần điều khiển giao diện thay vì gọi API có cấu trúc, hãy tham khảo sử dụng máy tính so với API có cấu trúc.
Kiểm thử vòng lặp trong Apidog
Một vòng lặp công cụ thường có ba điểm dễ lỗi:
- Khai báo công cụ
- Ghép đúng ID giữa các lượt
- Nhận được câu trả lời cuối cùng
Bạn có thể kiểm thử cả ba mà không cần kết nối backend production.
1. Giả lập backend của công cụ
Tạo endpoint:
text
GET /orders/{order_id}
Bật mock server và cấu hình response cố định:
json
{
"status": "in_transit",
"eta": "2026-09-05"
}
Trong môi trường test, controller trỏ đến URL mock. Trong production, controller trỏ đến dịch vụ thật. Response cố định giúp xác định thay đổi trong câu trả lời cuối là do model, không phải do dữ liệu database.
2. Nối chuỗi hai lượt
Lưu GEMINI_API_KEY dưới dạng environment variable, sau đó tham chiếu trong header:
text
{{GEMINI_API_KEY}}
Tạo kịch bản gồm ba bước:
Bước A: Gọi Gemini
Gửi POST /v1beta/interactions với prompt và khai báo get_order_status.
Trích xuất các biến:
-
interaction_id: ID của interaction -
call_id: ID từ bướcfunction_call -
tool_name:namecủa function call -
order_id:arguments.order_id
Bước B: Chạy công cụ
Gửi:
text
GET /orders/{{order_id}}
Đây là bước controller thực thi hàm thay cho model.
Bước C: Gửi function_result
Gửi POST /v1beta/interactions với:
-
call_id:{{call_id}} -
name:{{tool_name}} -
previous_interaction_id:{{interaction_id}} - Nội dung response của Bước B trong phần văn bản của
result
3. Thêm assertion
Kiểm tra các điều kiện sau:
- Bước A trả về HTTP 200.
- Response của Bước A chứa
type: "function_call". -
namecủa function call làget_order_status. -
arguments.order_idđược trích xuất thànhA1029. - Bước C trả về HTTP 200.
- Bước C kết thúc bằng
type: "model_output"và không chứafunction_callthứ hai. - Văn bản cuối cùng chứa
in_transit.
Các assertion này xác nhận model đã đọc prompt, tuân thủ schema, nhận đúng kết quả công cụ và hoàn tất vòng lặp.
Nếu kiểm thử với generateContent, hãy thêm ngưỡng cho usageMetadata.thoughtsTokenCount theo từng thinking_level. Điều này giúp phát hiện sớm việc chi phí tăng do model “hoạt động chăm chỉ hơn”.
Bạn có thể xem thêm hướng dẫn kiểm thử API tác nhân AI hoặc tải xuống Apidog để xây dựng kịch bản với tầng miễn phí.
4. Chạy kịch bản hằng ngày
Hành vi của model có thể thay đổi qua các bản cập nhật ngầm. Một vòng lặp hoàn tất trong một lượt tuần trước có thể cần hai lượt sau khi model thay đổi.
Hãy lên lịch chạy kịch bản mỗi ngày để theo dõi:
- Số lượt
function_call - Thời gian thực thi
- Số token suy nghĩ
- Chi phí mỗi tác vụ
- Tỷ lệ hoàn tất bằng
model_output
FAQ
call_id có bắt buộc trên Gemini 3.8 Flash không?
Có.
- Interactions API yêu cầu
call_idvànametrong mọifunction_result. -
generateContentyêu cầuidvànametrong mọifunctionResponse.
Mã cũ chỉ gửi name sẽ thất bại trên các model Gemini 3.
Vì sao vòng lặp chạy nhiều lượt hơn trên 3.8 Flash?
Theo thiết kế, Gemini 3.8 Flash thực hiện nhiều bước suy luận hơn, gọi công cụ lặp lại và xác minh kết quả. Hãy giới hạn số lượt trong controller và chọn thinking_level phù hợp.
Có thể tiếp tục dùng generateContent không?
Có. Google vẫn hỗ trợ đầy đủ API này và chưa công bố ngày ngừng hoạt động. Tuy nhiên, bạn phải tự quản lý toàn bộ lịch sử, bao gồm chữ ký suy nghĩ, id của lệnh gọi và name.
thinking_level: "minimal" có hoạt động với công cụ không?
Không. Gemini 3.8 Flash trả về lỗi xác thực. Hãy dùng low.
Một tác vụ nặng công cụ có giá bao nhiêu?
Đến ngày 31/12/2026:
- $0,75 cho mỗi 1 triệu token đầu vào
- $3,75 cho mỗi 1 triệu token đầu ra
- Token suy nghĩ được tính như token đầu ra
Artificial Analysis đo được chi phí trung bình:
-
high: $0,58 mỗi tác vụ -
medium: $0,41 mỗi tác vụ -
low: $0,24 mỗi tác vụ
Chi phí thực tế phụ thuộc vào prompt, công cụ và số lượt của ứng dụng. Hãy đo usageMetadata thay vì chỉ dựa vào giá niêm yết.
Checklist triển khai
Một vòng lặp an toàn với Gemini 3.8 Flash cần:
- Khai báo công cụ bằng
tools. - Đọc
function_callvà lưuid,name,arguments. - Thực thi công cụ sau khi đã xác thực tham số.
- Gửi
function_resultvới cảcall_idvàname. - Dùng
previous_interaction_idcho lượt tiếp theo. - Xử lý thêm
function_callnếu model chưa hoàn tất. - Đặt giới hạn số lượt, timeout và ngân sách token.
- Thiết kế công cụ có tính idempotent.
- Dùng mock backend để kiểm thử.
- Lên lịch chạy assertion hằng ngày.
Đó là toàn bộ hợp đồng của Interactions API. Thay đổi lớn khi chuyển sang Gemini 3.8 Flash là model có xu hướng lặp lại nhiều hơn, nên controller phải có giới hạn lượt, thinking_level theo tuyến đường và timeout trước khi đưa vào production.
Xem tài liệu “Có gì mới trong Gemini 3.8 Flash” của Google để theo dõi các thay đổi mới nhất.
Top comments (0)