Gedankensignaturen

Thought-Signaturen sind verschlüsselte Darstellungen des internen Denkprozesses des Modells. Thought-Signaturen behalten den Gemini-Reasoning-Status während mehrstufiger Unterhaltungen bei, was bei der Verwendung von Funktionsaufrufen nützlich sein kann. Antworten können ein thought_signature-Feld in jedem Inhaltsteil enthalten (z.B. text, functionCall).

Gemini 3-Modelle erzwingen eine strengere Validierung von Thought-Signaturen als frühere Gemini-Versionen, da sie die Modellleistung für Funktionsaufrufe verbessern. Damit das Modell den vollständigen Kontext über mehrere Runden einer Unterhaltung hinweg beibehält, müssen Sie die Thought-Signaturen aus vorherigen Antworten in Ihren nachfolgenden Anfragen zurückgeben, auch wenn Sie MINIMAL-Thinking-Levels verwenden. Wenn bei der Verwendung von Gemini 3-Modellen eine erforderliche Thought-Signatur nicht zurückgegeben wird, gibt das Modell den Fehler 400 zurück.

Gemini 3 Pro Image erzwingt diese Validierung zwar nicht, aber damit das Modell den vollständigen Kontext über mehrere Runden einer Unterhaltung hinweg beibehält, müssen Sie die Gedankensignaturen aus vorherigen Antworten in Ihren nachfolgenden Anfragen zurückgeben. Gemini 3 Pro Image gibt keinen 400-Fehler zurück, wenn keine Gedankensignatur zurückgegeben wird. Codebeispiele für die Multi-Turn-Bildbearbeitung mit Gemini 3 Pro Image finden Sie unter Beispiel für die Multi-Turn-Bildbearbeitung mit Thought Signatures.

Wenn Sie das offizielle Google Gen AI SDK (Python, Node.js, Go oder Java) verwenden und die Standardfunktionen für den Chatverlauf nutzen oder die vollständige Modellantwort an den Verlauf anhängen, werden Gedankensignaturen automatisch verarbeitet.

Warum sind sie wichtig?

Wenn ein Thinking-Modell ein externes Tool aufruft, wird der interne Reasoning-Prozess pausiert. Die Gedankensignatur fungiert als „Speicherstatus“, sodass das Modell seine Gedankenkette nahtlos fortsetzen kann, sobald Sie das Ergebnis der Funktion bereitstellen. Ohne Gedankensignaturen „vergisst“ das Modell seine spezifischen Argumentationsschritte während der Phase der Toolausführung. Die Rückgabe der Signatur bietet folgende Vorteile:

  • Kontextkontinuität: Das Modell behält die Argumentationsschritte bei, die den Aufruf des Tools gerechtfertigt haben, und kann sie überprüfen.
  • Komplexe Schlussfolgerungen: Ermöglicht mehrstufige Aufgaben, bei denen die Ausgabe eines Tools die Schlussfolgerung für das nächste Tool beeinflusst.

Fortführung der Logikschritte

Bei Gemini 3.5 Flash und neueren Modellen werden Gedanken aus früheren Runden standardmäßig beibehalten. Der Dienst speichert den Denkverlauf im Kontext der Unterhaltung, bevor er an das Modell weitergegeben wird.

Wenn Sie den Unterhaltungsverlauf senden, sollten Sie mit den vorherigen Runden konsistent sein: Entweder Sie fügen den vollständigen Kontext (Gedanken, Funktionsaufrufe und Antworten) ein oder Sie lassen ihn ganz weg. Wenn Sie nur einen Teil des Kontexts angeben, kann dies die Modellleistung beeinträchtigen.

Gedankensignaturen aus anderen Modellen

Flash-Lite-Modelle können keine Gedanken lesen, die von Nicht-Flash-Lite-Modellen generiert wurden. Wenn eine Anfrage an ein Flash-Lite-Modell Gedankensignaturen enthält, die von einem Nicht-Flash-Lite-Modell generiert wurden, schlägt die Anfrage nicht fehl. Stattdessen werden diese Gedanken aus dem Kontext des Modells entfernt. Das passiert beispielsweise, wenn Sie eine Anfrage an ein Flash-Lite-Modell mit einem Verlauf aus einem Gemini Flash- oder Pro-Modell senden.

Abbiegungen und Schritte

Ein mehrstufiger Unterhaltungsablauf mit einem Large Language Model (LLM), das Funktionsaufrufe (FC) und Funktionsantworten (FR) verwendet, um eine endgültige Antwort zu generieren. Der Prozess ist in zwei Runden unterteilt: Runde 1 besteht aus drei Schritten. Schritt 1: Der Nutzer-Prompt führt zu Modell FC1. Schritt 2: Das Modell erhält FR1, was zu Modell FC2 führt. Schritt 3: Das Modell empfängt FR2, was zur endgültigen Modellausgabe für Turn 1 führt. Runde 2 beginnt mit einem neuen Nutzer-Prompt, wobei der gesamte Kontext von Runde 1 verwendet wird, um die endgültige Modellausgabe für Runde 2 zu generieren.
Wechselseitiger Gesprächsablauf mit Funktionsaufrufen und Antworten.

Im Zusammenhang mit Funktionsaufrufen ist es wichtig, den Unterschied zwischen Runden und Schritten zu verstehen:

  • Ein Turn stellt einen vollständigen Gesprächsaustausch dar, der mit dem Prompt eines Nutzers beginnt und endet, wenn das Modell eine endgültige Antwort auf diesen Prompt liefert, die kein Funktionsaufruf ist.
  • Ein Schritt erfolgt innerhalb einer einzelnen Runde, wenn das Modell eine Funktion aufruft und eine Funktionsantwort benötigt, um den Denkprozess fortzusetzen. Wie im Diagramm dargestellt, kann ein einzelner Turn mehrere Schritte umfassen, wenn das Modell mehrere Funktionen nacheinander aufrufen muss, um die Anfrage des Nutzers zu erfüllen.

Thought Signatures verwenden

Die einfachste Möglichkeit, mit Gedankensignaturen umzugehen, besteht darin, alle Parts aus allen vorherigen Nachrichten im Unterhaltungsverlauf beim Senden einer neuen Anfrage genau so einzufügen, wie sie vom Modell zurückgegeben wurden.

Wenn Sie keines der Google Gen AI SDKs verwenden oder den Unterhaltungsverlauf ändern oder kürzen müssen, müssen Sie dafür sorgen, dass die Gedankensignaturen erhalten bleiben und an das Modell zurückgesendet werden.

Bei Verwendung des Google Gen AI SDK (empfohlen)

Wenn Sie die Chatverlaufsfunktionen der SDKs verwenden oder das content-Objekt des Modells aus der vorherigen Antwort an die contents der nächsten Anfrage anhängen, werden Signaturen automatisch verarbeitet.

Das folgende Python-Beispiel zeigt die automatische Verarbeitung:

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}")

Bei Verwendung von REST oder manueller Verarbeitung

Wenn Sie direkt mit der API interagieren, müssen Sie die Signaturverarbeitung gemäß den folgenden Regeln für Gemini 3 Pro implementieren:

  • Funktionsaufrufe:
    • Wenn die Modellantwort einen oder mehrere functionCall-Teile enthält, ist ein thought_signature für die korrekte Verarbeitung erforderlich.
    • Bei parallelen Funktionsaufrufen in einer einzelnen Antwort enthält nur der erste functionCall-Teil die thought_signature.
    • Bei sequenziellen Funktionsaufrufen über mehrere Schritte in einer Runde enthält jeder functionCall-Teil einen thought_signature.
    • Regel: Wenn Sie die nächste Anfrage erstellen, müssen Sie die part mit der functionCall und der zugehörigen thought_signature genau so angeben, wie sie vom Modell zurückgegeben wurde. Bei sequenziellen (mehrstufigen) Funktionsaufrufen wird die Validierung für alle Schritte im aktuellen Durchlauf durchgeführt. Wenn ein erforderlicher thought_signature für den ersten functionCall-Teil in einem Schritt des aktuellen Durchlaufs weggelassen wird, führt dies zu einem 400-Fehler. Eine Runde beginnt mit der neuesten Nutzernachricht, die kein functionResponse ist.
    • Wenn das Modell parallele Funktionsaufrufe zurückgibt (z. B. FC1+signature, FC2), muss Ihre Antwort alle Funktionsaufrufe gefolgt von allen Funktionsantworten (FC1+signature, FC2, FR1, FR2) enthalten. Verschachtelte Antworten (FC1+signature, FR1, FC2, FR2) führen zu einem 400-Fehler. Gibt functionResponse-Teile in derselben Reihenfolge wie die entsprechenden functionCall-Teile zurück. Die API ordnet parallele Funktionsantworten Funktionsaufrufen nach id (falls in v1beta1 angegeben) oder nach name und sequenzieller Reihenfolge im parts-Array zu.
    • In seltenen Fällen müssen Sie functionCall-Teile bereitstellen, die nicht von der API generiert wurden und daher keine zugehörige Gedankensignatur haben (z. B. beim Übertragen des Verlaufs von einem Modell, das keine Gedankensignaturen enthält). Sie können thought_signature auf skip_thought_signature_validator setzen, aber das sollte nur als letzte Möglichkeit verwendet werden, da es sich negativ auf die Modellleistung auswirkt.
  • Nicht-Funktionsaufrufe:
    • Wenn die Modellantwort keinen functionCall enthält, kann sie einen thought_signature im letzten part der Antwort enthalten (z. B. im letzten text-Teil).
    • Regel: Es wird empfohlen, diese Signatur in die nächste Anfrage aufzunehmen, um die beste Leistung zu erzielen. Wenn Sie sie weglassen, wird jedoch kein Fehler verursacht. Beim Streaming wird diese Signatur möglicherweise in einem Teil mit leerem Textinhalt zurückgegeben. Achten Sie daher darauf, alle Teile zu parsen, bis finish_reason vom Modell zurückgegeben wird.

Beachten Sie die folgenden Regeln, damit der Kontext des Modells erhalten bleibt:

  • Senden Sie die thought_signature immer in der ursprünglichen Part an das Modell zurück.
  • Führen Sie keine Part mit einer Signatur mit einer ohne Signatur zusammen. Dadurch wird der Positionskontext des Gedankens unterbrochen.
  • Kombinieren Sie nicht zwei Parts, die beide Signaturen enthalten, da die Signaturstrings nicht zusammengeführt werden können.

Beispiel für sequenziellen Funktionsaufruf

Das folgende Beispiel zeigt einen mehrstufigen Funktionsaufruf, bei dem der Nutzer fragt: „Flugstatus für AA100 prüfen und bei Verspätung ein Taxi buchen“. Dies erfordert mehrere Aufgaben.

REST

Im folgenden Beispiel wird gezeigt, wie Sie Gedankensignaturen über mehrere Schritte in einem sequenziellen Funktionsaufruf-Workflow mit der REST API verarbeiten.

Runde 1, Schritt 1 (Nutzeranfrage)
{
  "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"
            ]
          }
        }
      ]
    }
  ]
}
Runde 1, Schritt 1 (Modellantwort)
{
"content": {
        "role": "model",
        "parts": [
          {
            "functionCall": {
              "name": "check_flight",
              "args": {
                "flight": "AA100"
              }
            },
            "thoughtSignature": "<SIGNATURE_A>"
          }
        ]
  }
}
Runde 1, Schritt 2 (Nutzerantwort – Senden von Toolausgaben)

Da diese Nutzerrunde nur ein functionResponse (keinen neuen Text) enthält, befinden wir uns immer noch in Runde 1. Sie müssen <SIGNATURE_A> beibehalten.

{
      "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"
                }
              }
            }
        ]
}
Turn 1, Schritt 2 (Modellantwort)

Das Modell entscheidet sich nun, basierend auf der vorherigen Toolausgabe ein Taxi zu buchen.

{
      "content": {
        "role": "model",
        "parts": [
          {
            "functionCall": {
              "name": "book_taxi",
              "args": {
                "time": "10 AM"
              }
            },
            "thoughtSignature": "<SIGNATURE_B>"
          }
        ]
      }
}
Runde 1, Schritt 3 (Nutzerantwort – Senden der Toolausgabe)

Wenn Sie die Bestätigung der Taxibuchung senden möchten, müssen Sie Signaturen für alle Funktionsaufrufe in dieser Schleife (<SIGNATURE_A> und <SIGNATURE_B>) angeben.

{
      "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"
              }
              }
            }
        ]
    }
}

Chatvervollständigungen

Im folgenden Beispiel wird gezeigt, wie Gedankensignaturen über mehrere Schritte in einem sequenziellen Funktionsaufruf-Workflow mit der Chat Completions API verarbeitet werden.

Runde 1, Schritt 1 (Nutzeranfrage)
{
  "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"
          ]
        }
      }
    }
  ]
}
Runde 1, Schritt 1 (Modellantwort)
{
      "role": "model",
        "tool_calls": [
          {
            "extra_content": {
              "google": {
                "thought_signature": "<SIGNATURE_A>"
              }
            },
            "function": {
              "arguments": "{\"flight\":\"AA100\"}",
              "name": "check_flight"
            },
            "id": "function-call-1",
            "type": "function"
          }
        ]
    }
Runde 1, Schritt 2 (Nutzerantwort – Senden von Toolausgaben)

Da diese Nutzerrunde nur ein functionResponse (keinen neuen Text) enthält, befinden wir uns immer noch in Runde 1. Sie müssen <SIGNATURE_A> beibehalten.

"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\"}"
    }
  ]
Turn 1, Schritt 2 (Modellantwort)

Das Modell entscheidet sich nun, basierend auf der vorherigen Toolausgabe ein Taxi zu buchen.

{
"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"
          }
       ]
}
Runde 1, Schritt 3 (Nutzerantwort – Senden der Toolausgabe)

Wenn Sie die Bestätigung der Taxibuchung senden möchten, müssen Sie Signaturen für alle Funktionsaufrufe in dieser Schleife (<SIGNATURE_A> und <SIGNATURE_B>) angeben.

"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\"}"
    }
  ]

Beispiel für parallele Funktionsaufrufe

Das folgende Beispiel zeigt einen parallelen Funktionsaufruf, bei dem der Nutzer fragt: „Wie ist das Wetter in Paris und London?“

REST

Das folgende Beispiel zeigt, wie Gedankensignaturen in einem Workflow mit parallelen Funktionsaufrufen mithilfe der REST API verarbeitet werden.

Runde 1, Schritt 1 (Nutzeranfrage)
{
  "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"
            ]
          }
        }
      ]
    }
  ]
}
Runde 1, Schritt 1 (Modellantwort)
{
  "content": {
    "parts": [
      {
        "functionCall": {
          "name": "get_current_temperature",
          "args": {
            "location": "Paris"
          }
        },
        "thoughtSignature": "<SIGNATURE_A>"
      },
      {
        "functionCall": {
          "name": "get_current_temperature",
          "args": {
            "location": "London"
          }
        }
      }
    ]
  }
}
Runde 1, Schritt 2 (Nutzerantwort – Senden von Toolausgaben)

Sie müssen <SIGNATURE_A> im ersten Teil genau so beibehalten, wie Sie es erhalten haben.

[
  {
    "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": {
          "name": "get_current_temperature",
          "response": {
            "temp": "12C"
          }
        }
      }
    ]
  }
]

Chatvervollständigungen

Im folgenden Beispiel wird gezeigt, wie Gedankensignaturen in einem Workflow mit parallelen Funktionsaufrufen mithilfe der Chat Completions API verarbeitet werden.

Runde 1, Schritt 1 (Nutzeranfrage)
{
  "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"
            ]
          }
        }
      ]
    }
  ]
}
Runde 1, Schritt 1 (Modellantwort)
{
"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"
          }
        ]
}
Runde 1, Schritt 2 (Nutzerantwort – Senden von Toolausgaben)

Sie müssen <SIGNATURE_A> im ersten Teil genau so beibehalten, wie Sie es erhalten haben.

"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\"}"
    }
  ]

Signaturen in Parts, die nicht von functionCall stammen

Gemini kann auch im letzten Part einer Antwort ein thought_signature zurückgeben, selbst wenn kein Funktionsaufruf vorhanden ist.

  • Verhalten: Der endgültige Inhalt Part (text, inlineData usw.), der vom Modell zurückgegeben wird, kann einen thought_signature enthalten.
  • Anforderung: Es wird empfohlen, diese Signatur zurückzugeben, damit das Modell eine hohe Qualität bei der Argumentation beibehält, insbesondere bei komplexen Anweisungen oder simulierten agentischen Workflows.
  • Validierung: Die API erzwingt nicht strikt die Validierung von Signaturen in Nicht-functionCall-Teilen. Wenn Sie sie weglassen, erhalten Sie keinen blockierenden Fehler, aber die Leistung kann beeinträchtigt werden.

Beispiel für eine Modellantwort mit Signatur im Textteil:

Die folgenden Beispiele zeigen eine Modellantwort, bei der ein thought_signature in einem Nicht-functionCall-Part enthalten ist, und wie Sie damit in einer nachfolgenden Anfrage umgehen.

Runde 1, Schritt 1 (Modellantwort)
{
  "role": "model",
  "parts": [
    {
      "text": "I need to calculate the risk. Let me think step-by-step...",
      "thought_signature": "<SIGNATURE_C>" // OPTIONAL (Recommended)
    }
  ]
}
Turn 2, Step 1 (user)
[
  { "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." }] }
]

Beispiel für die Multi-Turn-Bildbearbeitung mit Thought Signatures

In den folgenden Beispielen wird gezeigt, wie Sie bei der Multi-Turn-Bilderstellung und ‑bearbeitung mit Gemini 3 Pro Image Gedankensignaturen abrufen und übergeben.

Runde 1: Antwort abrufen und Daten speichern, die Gedankensignaturen enthalten

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))

Runde 2: Daten mit Gedankensignaturen übergeben

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))

Nächste Schritte

Übersicht

Informationen zu den Denkfähigkeiten von Gemini und zum Konfigurieren von Denkaufwand

Anleitung

Hier finden Sie Prompt-Engineering-Techniken und Best Practices, die auf Gemini-Thinking-Modelle zugeschnitten sind.

Anleitung

Hier erfahren Sie, wie Sie Gemini-Modelle so konfigurieren, dass sie bei der Antwortgenerierung mithilfe von Funktionsaufrufen externe Tools verwenden.