DEV Community

Cover image for Gọi hàm Gemini 3.8 Flash: call_id, vòng lặp công cụ lặp và cách kiểm thử
Sebastian Petrus
Sebastian Petrus

Posted on Originally published at apidog.com

Gọi hàm Gemini 3.8 Flash: call_id, vòng lặp công cụ lặp và cách kiểm thử

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.

Dùng thử Apidog hôm nay

Hai chi tiết API quan trọng nhất:

  • Mọi kết quả hàm phải chứa cả call_idname.
  • 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_idname, 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"]
      }
    }]
  }'
Enter fullscreen mode Exit fullscreen mode

Trong ví dụ này:

  • thinking_level được đặt là low vì đâ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ì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_output cuố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"
  }
}
Enter fullscreen mode Exit fullscreen mode

Bạn cần lưu cả ba trường:

  • id: gửi lại ở lượt sau dưới tên call_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_idname

Sau khi chạy hàm, gửi request thứ hai với inputfunction_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\"}"}]
    }]
  }'
Enter fullscreen mode Exit fullscreen mode

Trên Gemini 3.8 Flash, cả call_idname đề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.

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=...,
    ...
)
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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 nameresponse.

Hai khác biệt thực tế cần lưu ý:

  1. generateContent khô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ồm functionCall và các chữ ký suy nghĩ.
  2. Cấu hình suy nghĩ dùng generationConfig.thinkingConfig.thinkingLevel, không phải generation_config.thinking_level.
{
  "generationConfig": {
    "thinkingConfig": {
      "thinkingLevel": "low"
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Token suy nghĩ xuất hiện trong:

usageMetadata.thoughtsTokenCount
Enter fullscreen mode Exit fullscreen mode

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 generateContenttà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_status phả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_output dướ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:

  1. Khai báo công cụ
  2. Ghép đúng ID giữa các lượt
  3. 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ước function_call
  • tool_name: name củ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".
  • name của function call là get_order_status.
  • arguments.order_id được trích xuất thành A1029.
  • Bước C trả về HTTP 200.
  • Bước C kết thúc bằng type: "model_output" và không chứa function_call thứ 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_idname trong mọi function_result.
  • generateContent yêu cầu idname trong mọi functionResponse.

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:

  1. Khai báo công cụ bằng tools.
  2. Đọc function_call và lưu id, name, arguments.
  3. Thực thi công cụ sau khi đã xác thực tham số.
  4. Gửi function_result với cả call_idname.
  5. Dùng previous_interaction_id cho lượt tiếp theo.
  6. Xử lý thêm function_call nếu model chưa hoàn tất.
  7. Đặt giới hạn số lượt, timeout và ngân sách token.
  8. Thiết kế công cụ có tính idempotent.
  9. Dùng mock backend để kiểm thử.
  10. 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)