Gedankensignaturen

Gedankensignaturen sind verschlüsselte Darstellungen des internen Denkprozesses des Modells und werden verwendet, um den Kontext der Argumentation bei Interaktionen mit mehreren Schritten beizubehalten. Wenn Sie Denkmodelle wie die Gemini 3- und 2.5-Serie verwenden, kann die API ein thoughtSignature Feld in den Inhaltsteilen der Antwort zurückgeben (z.B. text oder functionCall Teile).

Als allgemeine Regel gilt: Wenn Sie eine Gedankensignatur in einer Modellantwort erhalten, sollten Sie sie in der nächsten Runde genau so zurückgeben, wie Sie sie erhalten haben, wenn Sie den Unterhaltungsverlauf senden. Wenn Sie Gemini 3-Modelle verwenden, müssen Sie Gedankensignaturen bei Funktionsaufrufen zurückgeben. Andernfalls erhalten Sie einen Validierungsfehler (Statuscode 4xx). Das gilt auch, wenn Sie die Einstellung für die minimal Denkebene für Gemini 3 Flash verwenden.

Funktionsweise

Die folgende Grafik veranschaulicht die Bedeutung von "Runde" und "Schritt" im Zusammenhang mit Funktionsaufrufen in der Gemini API. Eine „Runde“ ist ein einzelner, vollständiger Austausch in einer Unterhaltung zwischen einem Nutzer und einem Modell. Ein „Schritt“ ist eine detailliertere Aktion oder Operation, die vom Modell ausgeführt wird, oft als Teil eines größeren Prozesses, um eine Runde abzuschließen.

Diagramm mit Zügen und Schritten für Funktionsaufrufe

In diesem Dokument geht es um die Verarbeitung von Funktionsaufrufen für Gemini 3-Modelle. Informationen zu Abweichungen bei 2.5 finden Sie im Abschnitt zum Modellverhalten.

Gemini 3 gibt Gedankensignaturen für alle Modellantworten (Antworten von der API) mit einem Funktionsaufruf zurück. Gedankensignaturen werden in den folgenden Fällen angezeigt:

  • Bei parallelen Funktions aufrufen enthält der erste Funktionsaufruf-Teil, der von der Modellantwort zurückgegeben wird, eine Gedankensignatur.
  • Bei sequenziellen Funktionsaufrufen (mehrere Schritte) hat jeder Funktionsaufruf eine Signatur und Sie müssen alle Signaturen zurückgeben.
  • Modellantworten ohne Funktionsaufruf geben eine Gedankensignatur im letzten Teil zurück, der vom Modell zurückgegeben wird.

Die folgende Tabelle enthält eine Visualisierung für Funktionsaufrufe mit mehreren Schritten, in der die Definitionen von Runden und Schritten mit dem oben eingeführten Konzept der Signaturen kombiniert werden:

Runde

Schritt

Nutzeranfrage

Modellantwort

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)

Keine

Signaturen in Funktionsaufruf-Teilen

Wenn Gemini einen functionCall generiert, verwendet es die thought_signature, um die Ausgabe des Tools in der nächsten Runde korrekt zu verarbeiten.

  • Verhalten:
    • Einzelner Funktionsaufruf: Der functionCall-Teil enthält eine thought_signature.
    • Parallele Funktionsaufrufe: Wenn das Modell parallele Funktionsaufrufe in einer Antwort generiert, wird die thought_signature nur an den ersten functionCall-Teil angehängt. Nachfolgende functionCall-Teile in derselben Antwort enthalten keine Signatur.
  • Anforderung: Sie müssen diese Signatur in genau dem Teil zurückgeben, in dem sie empfangen wurde, wenn Sie den Unterhaltungsverlauf zurücksenden.
  • Validierung: Für alle Funktionsaufrufe in der aktuellen Runde wird eine strenge Validierung erzwungen . Nur die aktuelle Runde ist erforderlich. Wir validieren nicht für vorherige Runden.
    • Die API durchsucht den Verlauf (von der neuesten zur ältesten Nachricht), um die letzte Nutzer -Nachricht zu finden, die Standardinhalte (z. B. text) enthält. Das ist der Beginn der aktuellen Runde. Das ist be functionResponse.
    • Alle functionCall-Runden des Modells, die nach dieser bestimmten Nutzernachricht auftreten, werden als Teil der Runde betrachtet.
    • Der erste functionCall-Teil in jedem Schritt der aktuellen Runde muss die zugehörige thought_signature enthalten.
    • Wenn Sie eine thought_signature für den ersten functionCall-Teil in einem Schritt der aktuellen Runde weglassen, schlägt die Anfrage mit einem 400-Fehler fehl.
  • Wenn keine korrekten Signaturen zurückgegeben werden, wird ein Fehler ausgegeben.
    • Gemini 3-Modelle: Wenn keine Signaturen angegeben werden, wird ein 400-Fehler zurückgegeben. Die Formulierung hat das folgende Format:
      • Für den Funktionsaufruf <Function Call> im <index of contents array> Inhaltsblock fehlt ein thought_signature. Beispiel: Funktions aufruf FC1 im 1. Inhaltsblock fehlt ein thought_signature.

Beispiel für sequenzielle Funktionsaufrufe

In diesem Abschnitt wird ein Beispiel für mehrere Funktionsaufrufe gezeigt, bei denen der Nutzer eine komplexe Frage stellt, für die mehrere Aufgaben erforderlich sind.

Sehen wir uns ein Beispiel für Funktionsaufrufe in mehreren Runden an, bei dem der Nutzer eine komplexe Frage stellt, für die mehrere Aufgaben erforderlich sind: "Check flight status for AA100 and book a taxi if delayed".

Runde

Schritt

Nutzeranfrage

Modellantwort

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

Der folgende Code veranschaulicht die Sequenz in der obigen Tabelle.

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 – Toolausgaben senden) Da diese Nutzerrunde nur eine functionResponse (kein neuer Text) enthält, befinden wir uns noch in Runde 1. Wir müssen beibehalten <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"
                }
              }
            }
        ]
}

Runde 1, Schritt 2 (Modell) Das Modell beschließt 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 (Nutzer – Toolausgabe senden) Um die Taxibuchung Bestätigung zu senden, müssen wir Signaturen für ALLE Funktionsaufrufe in dieser Schleife angeben (<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"
              }
              }
            }
        ]
    }
}

Beispiel für parallele Funktionsaufrufe

Sehen wir uns ein Beispiel für parallele Funktionsaufrufe an, bei dem der Nutzer "Check weather in Paris and London" fragt, um zu sehen, wo das Modell eine Validierung durchführt.

Runde

Schritt

Nutzeranfrage

Modellantwort

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)

Keine

Der folgende Code veranschaulicht die Sequenz in der obigen Tabelle.

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>"// INCLUDED on First FC
      },
      {
        "functionCall": {
          "name": "get_current_temperature",
          "args": {
            "location": "London"
          }// NO signature on subsequent parallel FCs
        }
      }
    ]
  }
}

Runde 1, Schritt 2 (Nutzerantwort – Toolausgaben senden) Wir müssen <Signature_A> im ersten Teil genau so beibehalten, wie wir sie 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>" // 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"
          }
        }
      }
    ]
  }
]

Signaturen in Teilen, die keine functionCall sind

Gemini kann auch thought_signatures im letzten Teil der Antwort in Teilen zurückgeben, die keine Funktionsaufrufe sind.

  • Verhalten: Der letzte Inhaltsteil (text, inlineData…), der vom Modell zurückgegeben wird, kann eine thought_signature enthalten.
  • Empfehlung: Es wird empfohlen , diese Signaturen 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 keine strenge Validierung. Sie erhalten keinen blockierenden Fehler, wenn Sie sie weglassen. Die Leistung kann sich jedoch verschlechtern.

Text/Kontextbezogene Argumentation (keine Validierung)

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

Runde 2, Schritt 1 (Nutzer)

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

Signaturen für OpenAI-Kompatibilität

Die folgenden Beispiele zeigen, wie Sie Gedankensignaturen für eine Chat Completion API mit OpenAI-Kompatibilität verarbeiten.

Beispiel für sequenzielle Funktionsaufrufe

Dies ist ein Beispiel für mehrere Funktionsaufrufe, bei denen der Nutzer eine komplexe Frage stellt, für die mehrere Aufgaben erforderlich sind.

Sehen wir uns ein Beispiel für Funktionsaufrufe in mehreren Runden an, bei dem der Nutzer Check flight status for AA100 and book a taxi if delayed fragt. Sie können sehen, was passiert, wenn der Nutzer eine komplexe Frage stellt, für die mehrere Aufgaben erforderlich sind.

Runde

Schritt

Nutzeranfrage

Modellantwort

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

Der folgende Code führt die angegebene Sequenz durch.

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 – Toolausgaben senden)

Da diese Nutzerrunde nur eine functionResponse (kein neuer Text) enthält, befinden wir uns noch in Runde 1 und 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>" //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\"}"                 
    }
  ]

Runde 1, Schritt 2 (Modell)

Das Modell beschließt 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 (Nutzer – Toolausgabe senden)

Um die Bestätigung der Taxibuchung zu senden, müssen wir Signaturen für ALLE Funktionsaufrufe in dieser Schleife angeben (<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\"}"
    }
  ]

Beispiel für parallele Funktionsaufrufe

Sehen wir uns ein Beispiel für parallele Funktionsaufrufe an, bei dem der Nutzer "Check weather in Paris and London" fragt. Sie können sehen, wo das Modell eine Validierung durchführt.

Runde

Schritt

Nutzeranfrage

Modellantwort

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

Der folgende Code führt die angegebene Sequenz durch.

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

Runde 1, Schritt 2 (Nutzerantwort – Toolausgaben senden)

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

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

Häufig gestellte Fragen

  1. Wie übertrage ich den Verlauf von einem anderen Modell zu Gemini 3 mit einem Funktionsaufruf-Teil in der aktuellen Runde und im aktuellen Schritt? Ich muss Funktionsaufruf Teile angeben, die nicht von der API generiert wurden und daher keine zugehörige Gedankensignatur haben?

    Es wird dringend davon abgeraten, benutzerdefinierte Funktionsaufrufblöcke in die Anfrage einzufügen. In Fällen, in denen dies jedoch nicht vermieden werden kann, z. B. wenn Sie dem Modell Informationen zu Funktionsaufrufen und -antworten geben, die vom Client deterministisch ausgeführt wurden, oder wenn Sie eine Ablaufverfolgung von einem anderen Modell übertragen, das keine Gedankensignaturen enthält, können Sie die folgenden Platzhaltersignaturen entweder "context_engineering_is_the_way_to_go" oder "skip_thought_signature_validator" im Feld für die Gedankensignatur festlegen, um die Validierung zu überspringen.

  2. Ich sende verschachtelte parallele Funktionsaufrufe und -antworten zurück und die API gibt einen 400-Fehler zurück. Woran liegt das?

    Wenn die API parallele Funktionsaufrufe „FC1 + Signatur, FC2“ zurückgibt, wird die Nutzerantwort „FC1 + Signatur, FC2, FR1, FR2“ erwartet. Wenn Sie sie als „FC1 + Signatur, FR1, FC2, FR2“ verschachtelt haben, gibt die API einen 400-Fehler zurück.

  3. Beim Streaming und wenn das Modell keinen Funktionsaufruf zurückgibt, kann ich die Gedankensignatur nicht finden.

    Bei einer Modellantwort, die keinen Funktionsaufruf mit einer Streaminganfrage enthält, kann das Modell die Gedankensignatur in einem Teil mit einem leeren Textinhaltsteil zurückgeben. Es empfiehlt sich, die gesamte Anfrage zu parsen, bis finish_reason vom Modell zurückgegeben wird.

Gedankensignaturen für verschiedene Modelle

Gemini 3-Modelle und Gemini 2.5-Modelle verhalten sich bei Gedankensignaturen in Funktionsaufrufen unterschiedlich:

  • Wenn eine Antwort Funktionsaufrufe enthält,
    • hat Gemini 3 immer die Signatur im ersten Funktionsaufruf-Teil. Es ist erforderlich , diesen Teil zurückzugeben.
    • Gemini 2.5 hat die Signatur im ersten Teil (unabhängig vom Typ). Es ist optional , diesen Teil zurückzugeben.
  • Wenn eine Antwort keine Funktionsaufrufe enthält,
    • hat Gemini 3 die Signatur im letzten Teil, wenn das Modell einen Gedanken generiert.
    • Gemini 2.5 hat in keinem Teil eine Signatur.

Weitere Vergleichsdetails finden Sie auf der Seite zum Thinking-Modus. Informationen zu Gemini 3-Bildmodellen finden Sie im Abschnitt zum Denkprozess des Leitfadens zur Bildgenerierung.