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

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). Dies gilt auch, wenn Sie die Einstellung 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 ein Vorgang, der 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 Teil des Funktionsaufrufs, 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 veranschaulicht Funktionsaufrufe mit mehreren Schritten. Dabei werden die Definitionen von Runden und Schritten mit dem oben eingeführten Konzept der Signaturen kombiniert:

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 Teilen von Funktionsaufrufen

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 Teil functionCall 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. Dies ist der Beginn der aktuellen Runde. Dies 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 enthalten sind, wird ein 400-Fehler zurückgegeben. Die Formulierung hat folgendes 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 Bestätigung der Taxibuchung zu senden, müssen wir Signaturen für ALLE Funktionsaufrufe in dieser Schleife einfügen (<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" eingibt, 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 sie empfangen wurde.

[
  {
    "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 der Argumentation beibehält, insbesondere bei komplexen Anweisungen oder simulierten agentischen Arbeitsabläufen.
  • Validierung: Die API erzwingt keine strenge Validierung. Sie erhalten keinen blockierenden Fehler, wenn Sie sie weglassen. Die Leistung kann jedoch beeinträchtigt werden.

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 die 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 eingibt. 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 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 veranschaulicht die angegebene Sequenz.

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 einfügen (<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" eingibt. 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 veranschaulicht die angegebene Sequenz.

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 empfangen wurde.

"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 Teil des Funktionsaufrufs in der aktuellen Runde und im aktuellen Schritt? Ich muss Teile des Funktionsaufrufs 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 deterministisch vom Client ausgeführt wurden, oder wenn Sie eine Ablaufverfolgung von einem anderen Modell übertragen, das keine Gedankensignaturen enthält, können Sie die folgenden Platzhaltersignaturen "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 + signature, FC2“ zurückgibt, wird die Nutzerantwort „FC1 + signature, FC2, FR1, FR2“ erwartet. Wenn Sie sie als „FC1 + signature, 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 das Modell finish_reason zurückgibt.

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 Teil des Funktionsaufrufs. 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 im Leitfaden zur Bildgenerierung.