Chữ ký của Thought

Chữ ký tư duy là các biểu diễn được mã hoá của quy trình tư duy nội bộ của mô hình và được dùng để duy trì bối cảnh lập luận trong các lượt tương tác nhiều bước. Khi sử dụng các mô hình tư duy (chẳng hạn như dòng Gemini 3 và 2.5), API có thể trả về trường thoughtSignature trong các phần nội dung của phản hồi (ví dụ: text hoặc functionCall phần).

Theo nguyên tắc chung, nếu nhận được chữ ký tư duy trong phản hồi của mô hình, bạn nên truyền lại chính xác chữ ký đó khi gửi nhật ký trò chuyện trong lượt tiếp theo. Khi sử dụng các mô hình Gemini 3, bạn phải truyền lại chữ ký tư duy trong quá trình gọi hàm, nếu không, bạn sẽ gặp lỗi xác thực (mã trạng thái 4xx). Điều này bao gồm cả khi sử dụng chế độ cài đặt minimal mức tư duy cho Gemini 3 Flash.

Cách hoạt động

Hình ảnh dưới đây minh hoạ ý nghĩa của "lượt" và "bước" liên quan đến việc gọi hàm trong API Gemini. "Lượt" là một lần trao đổi hoàn chỉnh trong cuộc trò chuyện giữa người dùng và mô hình. "Bước" là một hành động hoặc thao tác chi tiết hơn do mô hình thực hiện, thường là một phần của quy trình lớn hơn để hoàn tất một lượt.

Sơ đồ lượt và bước gọi hàm

Tài liệu này tập trung vào việc xử lý lệnh gọi hàm cho các mô hình Gemini 3. Hãy tham khảo phần hành vi của mô hình để biết sự khác biệt với 2.5.

Gemini 3 trả về chữ ký tư duy cho tất cả phản hồi của mô hình (phản hồi từ API) bằng lệnh gọi hàm. Chữ ký tư duy xuất hiện trong các trường hợp sau:

  • Khi có các lệnh gọi hàm song song, phần lệnh gọi hàm đầu tiên do phản hồi của mô hình trả về sẽ có chữ ký tư duy.
  • Khi có các lệnh gọi hàm tuần tự (nhiều bước), mỗi lệnh gọi hàm sẽ có một chữ ký và bạn phải truyền lại tất cả chữ ký.
  • Phản hồi của mô hình không có lệnh gọi hàm sẽ trả về chữ ký tư duy bên trong phần cuối cùng do mô hình trả về.

Bảng sau đây cung cấp hình ảnh minh hoạ cho các lệnh gọi hàm nhiều bước, kết hợp định nghĩa về lượt và bước với khái niệm về chữ ký được giới thiệu ở trên:

Lượt

Bước

Yêu cầu của người dùng

Phản hồi của mô hình

FunctionResponse

1

1

request1 = user_prompt FC1 + signature FR1

1

2

request2 = request1 + (FC1 + signature) + FR1 FC2 + signature FR2

1

3

request3 = request2 + (FC2 + signature) + FR2 text_output

(no FCs)

Không có

Chữ ký trong các phần gọi hàm

Khi Gemini tạo functionCall, Gemini sẽ dựa vào thought_signature để xử lý chính xác kết quả đầu ra của công cụ trong lượt tiếp theo.

  • Hành vi:
    • Lệnh gọi hàm đơn: Phần functionCall sẽ chứa thought_signature.
    • Lệnh gọi hàm song song: Nếu mô hình tạo các lệnh gọi hàm song song trong một phản hồi, thì thought_signature sẽ được đính kèm chỉ vào lệnh gọi hàm đầu tiên functionCall phần. Các phần functionCall tiếp theo trong cùng một phản hồi sẽ không chứa chữ ký.
  • Yêu cầu: Bạn phải trả về chữ ký này trong chính phần mà bạn đã nhận được khi gửi lại nhật ký trò chuyện.
  • Xác thực: Quy trình xác thực nghiêm ngặt được thực thi cho tất cả lệnh gọi hàm trong lượt hiện tại . (Chỉ yêu cầu lượt hiện tại; chúng tôi không xác thực trên các lượt trước)
    • API sẽ quay lại nhật ký (mới nhất đến cũ nhất) để tìm thông báo Người dùng gần đây nhất có chứa nội dung tiêu chuẩn (ví dụ: text) ( đây sẽ là điểm bắt đầu của lượt hiện tại). Đây sẽ không befunctionResponse.
    • Tất cả các lượt functionCall của mô hình xảy ra sau thông báo sử dụng cụ thể đó đều được coi là một phần của lượt.
    • Phần functionCall đầu tiên trong mỗi bước của lượt hiện tại phải bao gồm thought_signature.
    • Nếu bạn bỏ qua thought_signature cho phần functionCall đầu tiên trong bất kỳ bước nào của lượt hiện tại, thì yêu cầu sẽ không thành công và trả về lỗi 400.
  • Nếu không trả về chữ ký thích hợp, bạn sẽ gặp lỗi như sau
    • Mô hình Gemini 3: Việc không đưa chữ ký vào sẽ dẫn đến lỗi 400. Ngôn ngữ sẽ có dạng:
      • Lệnh gọi hàm <Function Call> trong khối nội dung <index of contents array> đang thiếu thought_signature. Ví dụ: Lệnh gọi hàm FC1 trong khối nội dung 1. đang thiếu thought_signature.

Ví dụ về lệnh gọi hàm tuần tự

Phần này trình bày ví dụ về nhiều lệnh gọi hàm trong đó người dùng đặt một câu hỏi phức tạp đòi hỏi nhiều tác vụ.

Hãy cùng xem qua ví dụ về lệnh gọi hàm nhiều lượt trong đó người dùng đặt một câu hỏi phức tạp đòi hỏi nhiều tác vụ: "Check flight status for AA100 and book a taxi if delayed".

Lượt

Bước

Yêu cầu của người dùng

Phản hồi của mô hình

FunctionResponse

1

1

request1="Check flight status for AA100 and book a taxi 2 hours before if delayed." FC1 ("check_flight") + signature FR1

1

2

request2 = request1 + FC1 ("check_flight") + signature + FR1 FC2("book_taxi") + signature FR2

1

3

request3 = request2 + FC2 ("book_taxi") + signature + FR2 text_output

(no FCs)

None

Đoạn mã sau đây minh hoạ trình tự trong bảng trên.

Lượt 1, Bước 1 (Yêu cầu của người dùng)

{
  "contents": [
    {
      "role": "user",
      "parts": [
        {
          "text": "Check flight status for AA100 and book a taxi 2 hours before if delayed."
        }
      ]
    }
  ],
  "tools": [
    {
      "functionDeclarations": [
        {
          "name": "check_flight",
          "description": "Gets the current status of a flight",
          "parameters": {
            "type": "object",
            "properties": {
              "flight": {
                "type": "string",
                "description": "The flight number to check"
              }
            },
            "required": [
              "flight"
            ]
          }
        },
        {
          "name": "book_taxi",
          "description": "Book a taxi",
          "parameters": {
            "type": "object",
            "properties": {
              "time": {
                "type": "string",
                "description": "time to book the taxi"
              }
            },
            "required": [
              "time"
            ]
          }
        }
      ]
    }
  ]
}

Lượt 1, Bước 1 (Phản hồi của mô hình)

{
"content": {
        "role": "model",
        "parts": [
          {
            "functionCall": {
              "name": "check_flight",
              "args": {
                "flight": "AA100"
              }
            },
            "thoughtSignature": "<Signature A>"
          }
        ]
  }
}

Lượt 1, Bước 2 (Phản hồi của người dùng – Gửi kết quả đầu ra của công cụ) Vì lượt này của người dùng chỉ chứa functionResponse (không có văn bản mới), nên chúng ta vẫn ở Lượt 1. Chúng ta phải giữ nguyên <Signature_A>.

{
      "role": "user",
      "parts": [
        {
          "text": "Check flight status for AA100 and book a taxi 2 hours before if delayed."
        }
      ]
    },
    {
        "role": "model",
        "parts": [
          {
            "functionCall": {
              "name": "check_flight",
              "args": {
                "flight": "AA100"
              }
            },
            "thoughtSignature": "<Signature A>" //Required and Validated
          }
        ]
      },
      {
        "role": "user",
        "parts": [
          {
            "functionResponse": {
              "name": "check_flight",
              "response": {
                "status": "delayed",
                "departure_time": "12 PM"
                }
              }
            }
        ]
}

Lượt 1, Bước 2 (Mô hình) Mô hình hiện quyết định đặt taxi dựa trên kết quả đầu ra của công cụ trước đó.

{
      "content": {
        "role": "model",
        "parts": [
          {
            "functionCall": {
              "name": "book_taxi",
              "args": {
                "time": "10 AM"
              }
            },
            "thoughtSignature": "<Signature B>"
          }
        ]
      }
}

Lượt 1, Bước 3 (Người dùng – Gửi kết quả đầu ra của công cụ) Để gửi thông tin xác nhận đặt taxi, chúng ta phải đưa chữ ký vào TẤT CẢ lệnh gọi hàm trong vòng lặp này (<Signature A> + <Signature B>).

{
      "role": "user",
      "parts": [
        {
          "text": "Check flight status for AA100 and book a taxi 2 hours before if delayed."
        }
      ]
    },
    {
        "role": "model",
        "parts": [
          {
            "functionCall": {
              "name": "check_flight",
              "args": {
                "flight": "AA100"
              }
            },
            "thoughtSignature": "<Signature A>" //Required and Validated
          }
        ]
      },
      {
        "role": "user",
        "parts": [
          {
            "functionResponse": {
              "name": "check_flight",
              "response": {
                "status": "delayed",
                "departure_time": "12 PM"
              }
              }
            }
        ]
      },
      {
        "role": "model",
        "parts": [
          {
            "functionCall": {
              "name": "book_taxi",
              "args": {
                "time": "10 AM"
              }
            },
            "thoughtSignature": "<Signature B>" //Required and Validated
          }
        ]
      },
      {
        "role": "user",
        "parts": [
          {
            "functionResponse": {
              "name": "book_taxi",
              "response": {
                "booking_status": "success"
              }
              }
            }
        ]
    }
}

Ví dụ về lệnh gọi hàm song song

Hãy cùng xem qua ví dụ về lệnh gọi hàm song song trong đó người dùng hỏi "Check weather in Paris and London" để xem mô hình thực hiện quy trình xác thực ở đâu.

Lượt

Bước

Yêu cầu của người dùng

Phản hồi của mô hình

FunctionResponse

1

1

request1="Check the weather in Paris and London"

FC1 ("Paris") + signature

FC2 ("London")

FR1

1

2

request 2 = request1 + FC1 ("Paris") + signature + FC2 ("London")

text_output

(no FCs)

Không có

Đoạn mã sau đây minh hoạ trình tự trong bảng trên.

Lượt 1, Bước 1 (Yêu cầu của người dùng)

{
  "contents": [
    {
      "role": "user",
      "parts": [
        {
          "text": "Check the weather in Paris and London."
        }
      ]
    }
  ],
  "tools": [
    {
      "functionDeclarations": [
        {
          "name": "get_current_temperature",
          "description": "Gets the current temperature for a given location.",
          "parameters": {
            "type": "object",
            "properties": {
              "location": {
                "type": "string",
                "description": "The city name, e.g. San Francisco"
              }
            },
            "required": [
              "location"
            ]
          }
        }
      ]
    }
  ]
}

Lượt 1, Bước 1 (Phản hồi của mô hình)

{
  "content": {
    "parts": [
      {
        "functionCall": {
          "name": "get_current_temperature",
          "args": {
            "location": "Paris"
          }
        },
        "thoughtSignature": "<Signature_A>"// INCLUDED on First FC
      },
      {
        "functionCall": {
          "name": "get_current_temperature",
          "args": {
            "location": "London"
          }// NO signature on subsequent parallel FCs
        }
      }
    ]
  }
}

Lượt 1, Bước 2 (Phản hồi của người dùng – Gửi kết quả đầu ra của công cụ) Chúng ta phải giữ nguyên <Signature_A> ở phần đầu tiên đúng như đã nhận được.

[
  {
    "role": "user",
    "parts": [
      {
        "text": "Check the weather in Paris and London."
      }
    ]
  },
  {
    "role": "model",
    "parts": [
      {
        "functionCall": {
          "name": "get_current_temperature",
          "args": {
            "city": "Paris"
          }
        },
        "thought_signature": "<Signature_A>" // MUST BE INCLUDED
      },
      {
        "functionCall": {
          "name": "get_current_temperature",
          "args": {
            "city": "London"
          }
        }
      } // NO SIGNATURE FIELD
    ]
  },
  {
    "role": "user",
    "parts": [
      {
        "functionResponse": {
          "name": "get_current_temperature",
          "response": {
            "temp": "15C"
          }
        }
      },
      {
        "functionResponse": {
          "name": "get_current_temperature",
          "response": {
            "temp": "12C"
          }
        }
      }
    ]
  }
]

Chữ ký trong các phần không phải là functionCall

Gemini cũng có thể trả về thought_signatures trong phần cuối cùng của phản hồi ở các phần không phải là lệnh gọi hàm.

  • Hành vi: Phần nội dung cuối cùng (text, inlineData…) do mô hình trả về có thể chứa thought_signature.
  • Đề xuất: Bạn nên trả về các chữ ký này để đảm bảo mô hình duy trì khả năng lập luận chất lượng cao, đặc biệt là đối với các quy trình làm việc phức tạp theo hướng dẫn hoặc mô phỏng tác nhân.
  • Xác thực: API không thực thi nghiêm ngặt quy trình xác thực. Bạn sẽ không nhận được lỗi chặn nếu bỏ qua các chữ ký này, mặc dù hiệu suất có thể giảm.

Lập luận bằng văn bản/trong bối cảnh (Không xác thực)

Lượt 1, Bước 1 (Phản hồi của mô hình)

{
  "role": "model",
  "parts": [
    {
      "text": "I need to calculate the risk. Let me think step-by-step...",
      "thought_signature": "<Signature_C>" // OPTIONAL (Recommended)
    }
  ]
}

Lượt 2, Bước 1 (Người dùng)

[
  { "role": "user", "parts": [{ "text": "What is the risk?" }] },
  {
    "role": "model", 
    "parts": [
      {
        "text": "I need to calculate the risk. Let me think step-by-step...",
        // If you omit <Signature_C> here, no error will occur.
      }
    ]
  },
  { "role": "user", "parts": [{ "text": "Summarize it." }] }
]

Chữ ký để tương thích với OpenAI

Các ví dụ sau đây cho thấy cách xử lý chữ ký tư duy cho API hoàn thành cuộc trò chuyện bằng cách sử dụng khả năng tương thích với OpenAI.

Ví dụ về lệnh gọi hàm tuần tự

Đây là ví dụ về nhiều lệnh gọi hàm trong đó người dùng đặt một câu hỏi phức tạp đòi hỏi nhiều tác vụ.

Hãy cùng xem qua ví dụ về lệnh gọi hàm nhiều lượt trong đó người dùng hỏi Check flight status for AA100 and book a taxi if delayed và bạn có thể thấy điều gì xảy ra khi người dùng đặt một câu hỏi phức tạp đòi hỏi nhiều tác vụ.

Lượt

Bước

Yêu cầu của người dùng

Phản hồi của mô hình

FunctionResponse

1

1

request1="Check the weather in Paris and London" FC1 ("Paris") + signature

FC2 ("London")

FR1

1

2

request 2 = request1 + FC1 ("Paris") + signature + FC2 ("London") text_output

(no FCs)

None

Đoạn mã sau đây hướng dẫn bạn thực hiện trình tự đã cho.

Lượt 1, Bước 1 (Yêu cầu của người dùng)

{
  "model": "google/gemini-3.1-pro-preview",
  "messages": [
    {
      "role": "user",
      "content": "Check flight status for AA100 and book a taxi 2 hours before if delayed."
    }
  ],
  "tools": [
    {
      "type": "function",
      "function": {
        "name": "check_flight",
        "description": "Gets the current status of a flight",
        "parameters": {
          "type": "object",
          "properties": {
            "flight": {
              "type": "string",
              "description": "The flight number to check."
            }
          },
          "required": [
            "flight"
          ]
        }
      }
    },
    {
      "type": "function",
      "function": {
        "name": "book_taxi",
        "description": "Book a taxi",
        "parameters": {
          "type": "object",
          "properties": {
            "time": {
              "type": "string",
              "description": "time to book the taxi"
            }
          },
          "required": [
            "time"
          ]
        }
      }
    }
  ]
}

Lượt 1, Bước 1 (Phản hồi của mô hình)

{
      "role": "model",
        "tool_calls": [
          {
            "extra_content": {
              "google": {
                "thought_signature": "<Signature A>"
              }
            },
            "function": {
              "arguments": "{\"flight\":\"AA100\"}",
              "name": "check_flight"
            },
            "id": "function-call-1",
            "type": "function"
          }
        ]
    }

Lượt 1, Bước 2 (Phản hồi của người dùng – Gửi kết quả đầu ra của công cụ)

Vì lượt này của người dùng chỉ chứa functionResponse (không có văn bản mới), nên chúng ta vẫn ở Lượt 1 và phải giữ nguyên <Signature_A>.

"messages": [
    {
      "role": "user",
      "content": "Check flight status for AA100 and book a taxi 2 hours before if delayed."
    },
    {
      "role": "model",
        "tool_calls": [
          {
            "extra_content": {
              "google": {
                "thought_signature": "<Signature A>" //Required and Validated
              }
            },
            "function": {
              "arguments": "{\"flight\":\"AA100\"}",
              "name": "check_flight"
            },
            "id": "function-call-1",
            "type": "function"
          }
        ]
    },
    {
      "role": "tool",
      "name": "check_flight",
      "tool_call_id": "function-call-1",
      "content": "{\"status\":\"delayed\",\"departure_time\":\"12 PM\"}"                 
    }
  ]

Lượt 1, Bước 2 (Mô hình)

Mô hình hiện quyết định đặt taxi dựa trên kết quả đầu ra của công cụ trước đó.

{
"role": "model",
"tool_calls": [
{
"extra_content": {
"google": {
"thought_signature": "<Signature B>"
}
            },
            "function": {
              "arguments": "{\"time\":\"10 AM\"}",
              "name": "book_taxi"
            },
            "id": "function-call-2",
            "type": "function"
          }
       ]
}

Lượt 1, Bước 3 (Người dùng – Gửi kết quả đầu ra của công cụ)

Để gửi thông tin xác nhận đặt taxi, chúng ta phải đưa chữ ký vào TẤT CẢ lệnh gọi hàm trong vòng lặp này (<Signature A> + <Signature B>).

"messages": [
    {
      "role": "user",
      "content": "Check flight status for AA100 and book a taxi 2 hours before if delayed."
    },
    {
      "role": "model",
        "tool_calls": [
          {
            "extra_content": {
              "google": {
                "thought_signature": "<Signature A>" //Required and Validated
              }
            },
            "function": {
              "arguments": "{\"flight\":\"AA100\"}",
              "name": "check_flight"
            },
            "id": "function-call-1d6a1a61-6f4f-4029-80ce-61586bd86da5",
            "type": "function"
          }
        ]
    },
    {
      "role": "tool",
      "name": "check_flight",
      "tool_call_id": "function-call-1d6a1a61-6f4f-4029-80ce-61586bd86da5",
      "content": "{\"status\":\"delayed\",\"departure_time\":\"12 PM\"}"                 
    },
    {
      "role": "model",
        "tool_calls": [
          {
            "extra_content": {
              "google": {
                "thought_signature": "<Signature B>" //Required and Validated
              }
            },
            "function": {
              "arguments": "{\"time\":\"10 AM\"}",
              "name": "book_taxi"
            },
            "id": "function-call-65b325ba-9b40-4003-9535-8c7137b35634",
            "type": "function"
          }
        ]
    },
    {
      "role": "tool",
      "name": "book_taxi",
      "tool_call_id": "function-call-65b325ba-9b40-4003-9535-8c7137b35634",
      "content": "{\"booking_status\":\"success\"}"
    }
  ]

Ví dụ về lệnh gọi hàm song song

Hãy cùng xem qua ví dụ về lệnh gọi hàm song song trong đó người dùng hỏi "Check weather in Paris and London" và bạn có thể thấy mô hình thực hiện quy trình xác thực ở đâu.

Lượt

Bước

Yêu cầu của người dùng

Phản hồi của mô hình

FunctionResponse

1

1

request1="Check the weather in Paris and London" FC1 ("Paris") + signature

FC2 ("London")

FR1

1

2

request 2 = request1 + FC1 ("Paris") + signature + FC2 ("London") text_output

(no FCs)

None

Dưới đây là mã để hướng dẫn bạn thực hiện trình tự đã cho.

Lượt 1, Bước 1 (Yêu cầu của người dùng)

{
  "contents": [
    {
      "role": "user",
      "parts": [
        {
          "text": "Check the weather in Paris and London."
        }
      ]
    }
  ],
  "tools": [
    {
      "functionDeclarations": [
        {
          "name": "get_current_temperature",
          "description": "Gets the current temperature for a given location.",
          "parameters": {
            "type": "object",
            "properties": {
              "location": {
                "type": "string",
                "description": "The city name, e.g. San Francisco"
              }
            },
            "required": [
              "location"
            ]
          }
        }
      ]
    }
  ]
}

Lượt 1, Bước 1 (Phản hồi của mô hình)

{
"role": "assistant",
        "tool_calls": [
          {
            "extra_content": {
              "google": {
                "thought_signature": "<Signature A>" //Signature returned
              }
            },
            "function": {
              "arguments": "{\"location\":\"Paris\"}",
              "name": "get_current_temperature"
            },
            "id": "function-call-f3b9ecb3-d55f-4076-98c8-b13e9d1c0e01",
            "type": "function"
          },
          {
            "function": {
              "arguments": "{\"location\":\"London\"}",
              "name": "get_current_temperature"
            },
            "id": "function-call-335673ad-913e-42d1-bbf5-387c8ab80f44",
            "type": "function" // No signature on Parallel FC
          }
        ]
}

Lượt 1, Bước 2 (Phản hồi của người dùng – Gửi kết quả đầu ra của công cụ)

Bạn phải giữ nguyên <Signature_A> ở phần đầu tiên đúng như đã nhận được.

"messages": [
    {
      "role": "user",
      "content": "Check the weather in Paris and London."
    },
    {
      "role": "assistant",
        "tool_calls": [
          {
            "extra_content": {
              "google": {
                "thought_signature": "<Signature A>" //Required
              }
            },
            "function": {
              "arguments": "{\"location\":\"Paris\"}",
              "name": "get_current_temperature"
            },
            "id": "function-call-f3b9ecb3-d55f-4076-98c8-b13e9d1c0e01",
            "type": "function"
          },
          {
            "function": { //No Signature
              "arguments": "{\"location\":\"London\"}",
              "name": "get_current_temperature"
            },
            "id": "function-call-335673ad-913e-42d1-bbf5-387c8ab80f44",
            "type": "function"
          }
        ]
    },
    {
      "role":"tool",
      "name": "get_current_temperature",
      "tool_call_id": "function-call-f3b9ecb3-d55f-4076-98c8-b13e9d1c0e01",
      "content": "{\"temp\":\"15C\"}"
    },    
    {
      "role":"tool",
      "name": "get_current_temperature",
      "tool_call_id": "function-call-335673ad-913e-42d1-bbf5-387c8ab80f44",
      "content": "{\"temp\":\"12C\"}"
    }
  ]

Câu hỏi thường gặp

  1. Làm cách nào để chuyển nhật ký từ một mô hình khác sang Gemini 3 bằng phần gọi hàm trong lượt và bước hiện tại? Tôi cần cung cấp các phần gọi hàm không do API tạo ra và do đó không có chữ ký tư duy được liên kết ?

    Mặc dù bạn không nên chèn các khối gọi hàm tuỳ chỉnh vào yêu cầu, nhưng trong những trường hợp không thể tránh được (ví dụ: cung cấp thông tin cho mô hình về các lệnh gọi hàm và phản hồi do ứng dụng thực thi một cách xác định hoặc chuyển dấu vết từ một mô hình khác không bao gồm chữ ký tư duy), bạn có thể đặt các chữ ký giả sau đây của "context_engineering_is_the_way_to_go" hoặc "skip_thought_signature_validator" trong trường chữ ký tư duy để bỏ qua quy trình xác thực.

  2. Tôi đang gửi lại các lệnh gọi hàm và phản hồi song song xen kẽ và API đang trả về lỗi 400. Vì sao lại như vậy?

    Khi API trả về các lệnh gọi hàm song song "FC1 + signature, FC2", phản hồi dự kiến của người dùng là "FC1+ signature, FC2, FR1, FR2". Nếu bạn xen kẽ các lệnh gọi hàm và phản hồi này dưới dạng "FC1 + signature, FR1, FC2, FR2" thì API sẽ trả về lỗi 400.

  3. Khi phát trực tuyến và mô hình không trả về lệnh gọi hàm, tôi không thể tìm thấy chữ ký tư duy

    Trong phản hồi của mô hình không chứa FC bằng yêu cầu phát trực tuyến, mô hình có thể trả về chữ ký tư duy trong một phần có phần nội dung văn bản trống. Bạn nên phân tích cú pháp toàn bộ yêu cầu cho đến khi finish_reason được mô hình trả về.

Chữ ký tư duy cho các mô hình khác nhau

Các mô hình Gemini 3 và mô hình Gemini 2.5 hoạt động khác nhau với chữ ký tư duy trong các lệnh gọi hàm:

  • Nếu có các lệnh gọi hàm trong một phản hồi,
    • Gemini 3 sẽ luôn có chữ ký trên phần gọi hàm đầu tiên. Bạn bắt buộc phải trả về phần đó.
    • Gemini 2.5 sẽ có chữ ký trong phần đầu tiên (bất kể loại nào). Bạn có thể trả về phần đó.
  • Nếu không có lệnh gọi hàm trong một phản hồi,
    • Gemini 3 sẽ có chữ ký ở phần cuối cùng nếu mô hình tạo ra một tư duy.
    • Gemini 2.5 sẽ không có chữ ký trong bất kỳ phần nào.

Hãy tham khảo trang Tư duy để biết thêm thông tin so sánh. Đối với các mô hình Hình ảnh Gemini 3, hãy xem phần quy trình tư duy trong hướng dẫn Tạo hình ảnh.