Tanda tangan pemikiran adalah representasi terenkripsi dari proses pemikiran internal model. Tanda tangan pemikiran mempertahankan status penalaran Gemini selama
percakapan multi-giliran dan multi-langkah, yang dapat berguna saat menggunakan
pemanggilan fungsi. Respons dapat menyertakan kolom thought_signature dalam bagian konten apa pun (misalnya, text, functionCall).
Model Gemini 3 menerapkan validasi yang lebih ketat pada tanda tangan pemikiran daripada versi Gemini sebelumnya karena meningkatkan performa model untuk pemanggilan fungsi. Untuk memastikan model mempertahankan konteks lengkap di beberapa giliran percakapan, Anda harus menampilkan tanda tangan pemikiran dari respons sebelumnya dalam permintaan berikutnya, bahkan saat menggunakan tingkat pemikiran MINIMAL. Jika tanda tangan pemikiran yang diperlukan tidak ditampilkan saat menggunakan model Gemini 3, model akan menampilkan error 400.
Meskipun Gemini 3 Pro Image tidak menerapkan validasi ini, untuk memastikan model mempertahankan konteks lengkap di beberapa giliran percakapan, Anda tetap harus menampilkan tanda tangan pemikiran dari respons sebelumnya dalam permintaan berikutnya. Gemini 3 Pro Image tidak menampilkan error 400 jika tanda tangan pemikiran tidak ditampilkan. Untuk contoh kode terkait pengeditan gambar multi-giliran
menggunakan Gemini 3 Pro Image, lihat
Contoh pengeditan gambar multi-giliran menggunakan tanda tangan pemikiran.
Jika Anda menggunakan Google Gen AI SDK Google resmi (Python, Node.js, Go, atau Java) dan menggunakan fitur histori chat standar atau menambahkan respons model lengkap ke histori, tanda tangan pemikiran akan ditangani secara otomatis.
Mengapa tanda tangan pemikiran penting?
Saat model yang berbasis penalaran memanggil alat eksternal, model akan menjeda proses penalaran internalnya. Tanda tangan pemikiran bertindak sebagai "status penyimpanan", yang memungkinkan model melanjutkan rantai pemikirannya dengan lancar setelah Anda memberikan hasil fungsi. Tanpa tanda tangan pemikiran, model akan "melupakan" langkah-langkah penalaran tertentu selama fase eksekusi alat. Mengirim kembali tanda tangan akan memastikan:
- Kontinuitas konteks: Model mempertahankan dan dapat memeriksa langkah-langkah penalaran yang membenarkan pemanggilan alat.
- Penalaran kompleks: Memungkinkan tugas multi-langkah dengan output satu alat yang menginformasikan penalaran untuk alat berikutnya.
Retensi pemikiran
Untuk model Gemini 3.5 Flash dan yang lebih baru, pemikiran dari giliran sebelumnya dipertahankan secara default. Layanan ini mempertahankan histori pemikiran dalam konteks percakapan sebelum meneruskannya ke model.
Saat mengirim histori percakapan, konsistenlah dengan giliran sebelumnya: sertakan konteks lengkap (pemikiran, panggilan fungsi, dan respons) atau hapus sepenuhnya. Memberikan konteks parsial dapat menurunkan performa model.
Giliran dan langkah
Dalam konteks pemanggilan fungsi, penting untuk memahami perbedaan antara giliran dan langkah:
- Giliran mewakili pertukaran percakapan lengkap, dimulai dengan perintah pengguna dan berakhir saat model memberikan respons akhir non-panggilan fungsi ke perintah tersebut.
- Langkah terjadi dalam satu giliran saat model memanggil fungsi dan memerlukan respons fungsi untuk melanjutkan proses penalarannya. Seperti yang ditunjukkan dalam diagram, satu giliran dapat melibatkan beberapa langkah jika model perlu memanggil beberapa fungsi secara berurutan untuk memenuhi permintaan pengguna.
Cara menggunakan tanda tangan pemikiran
Cara termudah untuk menangani tanda tangan pemikiran adalah dengan menyertakan semua Part dari semua pesan sebelumnya dalam histori percakapan saat mengirim permintaan baru, persis seperti yang ditampilkan oleh model.
Jika Anda tidak menggunakan salah satu Google Gen AI SDK Google, atau Anda perlu mengubah atau memangkas histori percakapan, Anda harus memastikan bahwa tanda tangan pemikiran dipertahankan dan dikirim kembali ke model.
Saat menggunakan Google Gen AI SDK Google (direkomendasikan)
Saat menggunakan fitur histori chat SDK atau menambahkan objek
content model dari respons sebelumnya ke contents permintaan berikutnya, tanda tangan akan ditangani secara otomatis.
Contoh Python berikut menunjukkan penanganan otomatis:
from google import genai
from google.genai.types import Content, FunctionDeclaration, GenerateContentConfig, Part, ThinkingConfig, Tool
client = genai.Client()
# 1. Define your tool
get_weather_declaration = FunctionDeclaration(
name="get_weather",
description="Gets the current weather temperature for a given location.",
parameters={
"type": "object",
"properties": {"location": {"type": "string"}},
"required": ["location"],
},
)
get_weather_tool = Tool(function_declarations=[get_weather_declaration])
# 2. Send a message that triggers the tool
prompt = "What's the weather like in London?"
response = client.models.generate_content(
model="gemini-3.5-flash",
contents=prompt,
config=GenerateContentConfig(
tools=[get_weather_tool],
thinking_config=ThinkingConfig(include_thoughts=True)
),
)
# 3. Handle the function call
function_call = response.function_calls[0]
location = function_call.args["location"]
print(f"Model wants to call: {function_call.name}")
# Execute your tool (for example, call an API)
# (This is a mock response for the example)
print(f"Calling external tool for: {location}")
function_response_data = {
"location": location,
"temperature": "30C",
}
# 4. Send the tool's result back
# Append this turn's messages to history for a final response.
# The `content` object automatically attaches the required thought_signature behind the scenes.
history = [
Content(role="user", parts=[Part(text=prompt)]),
response.candidates[0].content, # Signature preserved here
Content(
role="tool",
parts=[
Part.from_function_response(
name=function_call.name,
response=function_response_data,
)
],
)
]
response_2 = client.models.generate_content(
model="gemini-3.5-flash",
contents=history,
config=GenerateContentConfig(
tools=[get_weather_tool],
thinking_config=ThinkingConfig(include_thoughts=True)
),
)
# 5. Get the final, natural-language answer
print(f"\nFinal model response: {response_2.text}")
Saat menggunakan REST atau penanganan manual
Jika berinteraksi langsung dengan API, Anda harus menerapkan penanganan tanda tangan berdasarkan aturan berikut untuk Gemini 3 Pro:
- Pemanggilan fungsi:
- Jika respons model berisi satu atau beberapa bagian
functionCall,thought_signaturediperlukan untuk pemrosesan yang benar. - Dalam kasus panggilan fungsi paralel dalam satu respons, hanya bagian
functionCallpertama yang akan berisithought_signature. - Dalam kasus panggilan fungsi berurutan di beberapa langkah dalam satu giliran, setiap bagian
functionCallakan berisithought_signature. - Aturan: Saat membuat permintaan berikutnya, Anda harus menyertakan
partyang berisifunctionCalldanthought_signaturepersis seperti yang ditampilkan oleh model. Untuk pemanggilan fungsi berurutan (multi-langkah), validasi dilakukan pada semua langkah dalam giliran saat ini, dan menghilangkanthought_signatureyang diperlukan untuk bagianfunctionCallpertama di langkah mana pun dalam giliran saat ini akan menghasilkan error400. Giliran dimulai dengan pesan pengguna terbaru yang bukanfunctionResponse. - Jika model menampilkan panggilan fungsi paralel (misalnya,
FC1+signature,FC2), respons Anda harus berisi semua panggilan fungsi yang diikuti oleh semua respons fungsi (FC1+signature,FC2,FR1,FR2). Respons yang diselingi (FC1+signature,FR1,FC2,FR2) akan menghasilkan error400. - Ada kasus yang jarang terjadi saat Anda perlu memberikan bagian
functionCallyang tidak dibuat oleh API dan oleh karena itu tidak memiliki tanda tangan pemikiran terkait (misalnya, saat mentransfer histori dari model yang tidak menyertakan tanda tangan pemikiran). Anda dapat menetapkanthought_signaturekeskip_thought_signature_validator, tetapi, ini harus menjadi upaya terakhir karena akan berdampak negatif pada performa model.
- Jika respons model berisi satu atau beberapa bagian
- Pemanggilan non-fungsi:
- Jika respons model tidak berisi
functionCall, respons tersebut mungkin menyertakanthought_signaturedipartterakhir respons (misalnya, bagiantextterakhir). - Aturan: Menyertakan tanda tangan ini dalam permintaan berikutnya
direkomendasikan untuk performa terbaik, tetapi menghilangkannya tidak akan menyebabkan
error. Saat melakukan streaming, tanda tangan ini mungkin ditampilkan di bagian dengan konten teks kosong, jadi pastikan untuk mengurai semua bagian hingga
finish_reasonditampilkan oleh model.
- Jika respons model tidak berisi
Ikuti aturan ini untuk memastikan konteks model dipertahankan:
- Selalu kirim
thought_signaturekembali ke model di dalamPartaslinya. - Jangan gabungkan
Partyang berisi tanda tangan dengan yang tidak. Hal ini akan merusak konteks posisi pemikiran. - Jangan gabungkan dua
Partyang keduanya berisi tanda tangan, karena string tanda tangan tidak dapat digabungkan.
Contoh pemanggilan fungsi berurutan
Contoh berikut menunjukkan contoh pemanggilan fungsi multi-langkah saat pengguna bertanya "Periksa status penerbangan untuk AA100 dan pesan taksi jika tertunda", yang memerlukan beberapa tugas.
REST
Contoh berikut menunjukkan cara menangani tanda tangan pemikiran di beberapa langkah dalam alur kerja pemanggilan fungsi berurutan menggunakan REST API.
Giliran 1, Langkah 1 (permintaan pengguna)
{ "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" ] } } ] } ] }
Giliran 1, Langkah 1 (respons model)
{ "content": { "role": "model", "parts": [ { "functionCall": { "name": "check_flight", "args": { "flight": "AA100" } }, "thoughtSignature": "<SIGNATURE_A>" } ] } }
Giliran 1, Langkah 2 (respons pengguna - mengirim output alat)
Karena giliran pengguna ini hanya berisi functionResponse (tidak ada teks baru), kita masih berada di Giliran 1. Anda harus mempertahankan <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>" } ] }, { "role": "user", "parts": [ { "functionResponse": { "name": "check_flight", "response": { "status": "delayed", "departure_time": "12 PM" } } } ] }
Giliran 1, Langkah 2 (respons model)
Model kini memutuskan untuk memesan taksi berdasarkan output alat sebelumnya.
{ "content": { "role": "model", "parts": [ { "functionCall": { "name": "book_taxi", "args": { "time": "10 AM" } }, "thoughtSignature": "<SIGNATURE_B>" } ] } }
Giliran 1, Langkah 3 (respons pengguna - mengirim output alat)
Untuk mengirim konfirmasi pemesanan taksi, Anda harus menyertakan tanda tangan untuk semua
panggilan fungsi dalam loop ini (<SIGNATURE_A> dan <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>" } ] }, { "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>" } ] }, { "role": "user", "parts": [ { "functionResponse": { "name": "book_taxi", "response": { "booking_status": "success" } } } ] } }
Chat Completions
Contoh berikut menunjukkan cara menangani tanda tangan pemikiran di beberapa langkah dalam alur kerja pemanggilan fungsi berurutan menggunakan Chat Completions API.
Giliran 1, Langkah 1 (permintaan pengguna)
{ "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" ] } } } ] }
Giliran 1, Langkah 1 (respons model)
{ "role": "model", "tool_calls": [ { "extra_content": { "google": { "thought_signature": "<SIGNATURE_A>" } }, "function": { "arguments": "{\"flight\":\"AA100\"}", "name": "check_flight" }, "id": "function-call-1", "type": "function" } ] }
Giliran 1, Langkah 2 (respons pengguna - mengirim output alat)
Karena giliran pengguna ini hanya berisi functionResponse (tidak ada teks baru), kita masih berada di Giliran 1. Anda harus mempertahankan <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>" } }, "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\"}" } ]
Giliran 1, Langkah 2 (respons model)
Model kini memutuskan untuk memesan taksi berdasarkan output alat sebelumnya.
{ "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" } ] }
Giliran 1, Langkah 3 (respons pengguna - mengirim output alat)
Untuk mengirim konfirmasi pemesanan taksi, Anda harus menyertakan tanda tangan untuk semua
panggilan fungsi dalam loop ini (<SIGNATURE_A> dan <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>" } }, "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>" } }, "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\"}" } ]
Contoh pemanggilan fungsi paralel
Contoh berikut menunjukkan contoh pemanggilan fungsi paralel saat pengguna bertanya "Periksa cuaca di Paris dan London".
REST
Contoh berikut menunjukkan cara menangani tanda tangan pemikiran dalam alur kerja pemanggilan fungsi paralel menggunakan REST API.
Giliran 1, Langkah 1 (permintaan pengguna)
{ "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" ] } } ] } ] }
Giliran 1, Langkah 1 (respons model)
{ "content": { "parts": [ { "functionCall": { "name": "get_current_temperature", "args": { "location": "Paris" } }, "thoughtSignature": "<SIGNATURE_A>" }, { "functionCall": { "name": "get_current_temperature", "args": { "location": "London" } } } ] } }
Giliran 1, Langkah 2 (respons pengguna - mengirim output alat)
Anda harus mempertahankan <SIGNATURE_A> di bagian pertama persis seperti yang diterima.
[ { "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>" }, { "functionCall": { "name": "get_current_temperature", "args": { "city": "London" } } } ] }, { "role": "user", "parts": [ { "functionResponse": { "name": "get_current_temperature", "response": { "temp": "15C" } } }, { "functionResponse": { "functionResponse": { "name": "get_current_temperature", "response": { "temp": "12C" } } } ] } ]
Chat Completions
Contoh berikut menunjukkan cara menangani tanda tangan pemikiran dalam alur kerja pemanggilan fungsi paralel menggunakan Chat Completions API.
Giliran 1, Langkah 1 (permintaan pengguna)
{ "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" ] } } ] } ] }
Giliran 1, Langkah 1 (respons model)
{ "role": "assistant", "tool_calls": [ { "extra_content": { "google": { "thought_signature": "<SIGNATURE_A>" } }, "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" } ] }
Giliran 1, Langkah 2 (respons pengguna - mengirim output alat)
Anda harus mempertahankan <SIGNATURE_A> di bagian pertama persis seperti yang diterima.
"messages": [ { "role": "user", "content": "Check the weather in Paris and London." }, { "role": "assistant", "tool_calls": [ { "extra_content": { "google": { "thought_signature": "<SIGNATURE_A>" } }, "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" } ] }, { "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\"}" } ]
Tanda tangan di Part non-functionCall
Gemini juga dapat menampilkan thought_signature di Part terakhir respons, meskipun tidak ada panggilan fungsi.
- Perilaku:
Partkonten akhir (text,inlineData, dll.) yang ditampilkan oleh model mungkin berisithought_signature. - Persyaratan: Menampilkan tanda tangan ini direkomendasikan untuk memastikan model mempertahankan penalaran berkualitas tinggi, terutama untuk alur kerja agen simulasi atau mengikuti petunjuk yang kompleks.
- Validasi: API tidak secara ketat menerapkan validasi untuk tanda tangan di bagian non-
functionCall. Anda tidak akan menerima error pemblokiran jika menghilangkannya, meskipun performa dapat menurun.
Contoh respons model dengan tanda tangan di bagian teks:
Contoh berikut menunjukkan respons model yang menyertakan thought_signature di Part non-functionCall dan cara menanganinya dalam permintaan berikutnya.
Giliran 1, Langkah 1 (respons model)
{ "role": "model", "parts": [ { "text": "I need to calculate the risk. Let me think step-by-step...", "thought_signature": "<SIGNATURE_C>" // OPTIONAL (Recommended) } ] }
Giliran 2, Langkah 1 (pengguna)
[ { "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." }] } ]
Contoh pengeditan gambar multi-giliran menggunakan tanda tangan pemikiran
Contoh berikut menggambarkan cara mengambil dan meneruskan tanda tangan pemikiran selama pembuatan dan pengeditan gambar multi-giliran dengan Gemini 3 Pro Image.
Giliran 1: Dapatkan respons dan simpan data yang menyertakan tanda tangan pemikiran
chat = client.chats.create( model="gemini-3-pro-image-preview", config=types.GenerateContentConfig( response_modalities=['TEXT', 'IMAGE'] ) ) message = "Create an image of a clear perfume bottle sitting on a vanity." response = chat.send_message(message) data = b'' for part in response.candidates[0].content.parts: if part.text: display(Markdown(part.text)) if part.inline_data: data = part.inline_data.data display(Image(data=data, width=500))
Giliran 2: Teruskan data yang menyertakan tanda tangan pemikiran
response = chat.send_message( message=[ types.Part.from_bytes( data=data, mime_type="image/png", ), "Make the perfume bottle purple and add a vase of hydrangeas next to the bottle.", ], ) for part in response.candidates[0].content.parts: if part.text: display(Markdown(part.text)) if part.inline_data: display(Image(data=part.inline_data.data, width=500))
Langkah berikutnya
Panduan pembuatan perintah pemikiran
Pelajari teknik rekayasa perintah dan praktik terbaik yang disesuaikan untuk model pemikiran Gemini.
Pengantar pemanggilan fungsi
Pelajari cara mengaktifkan model Gemini untuk menggunakan alat eksternal selama pembuatan respons menggunakan pemanggilan fungsi.