Function call is missing a thought_signature in functionCall parts.
The message
Function call is missing a thought_signature in functionCall parts.What it means
Gemini attaches an encrypted signature to its function calls and checks that you send it back. A function call in the current turn came back without one, so the request was refused.
What to do
Send the model's parts back exactly as received, signatures in place and in the same order. For tool calls another model made, Google documents a placeholder signature that skips the check.
The error starts with this line:
Function call is missing a thought_signature in functionCall parts.
A Zed bug thread has the full body from Gemini 3.8 Flash this month:
{
"error": {
"code": 400,
"message": "Function call is missing a thought_signature in functionCall parts. This is required for tools to work correctly, and missing thought_signature may lead to degraded model performance. Additional data, function call `default_api:delete_path` , position 2. Please refer to https://ai.google.dev/gemini-api/docs/thought-signatures for more details.",
"status": "INVALID_ARGUMENT"
}
}
The body also names the function call Google objected to and a "position" for it. Google doesn't document how that position is counted, so treat the function name as the surer lead.
What a thought signature is
Gemini's thinking models reason before they call a tool. The API doesn't keep your conversation, so it hands that reasoning back to you as a thought signature attached to the response, and expects it back on the next request. Google's thinking guide calls signatures "encrypted representations of the model's internal reasoning."
The link in the error now lands on a stub saying "This page has moved" (the error text still points there), and the guide it sends you to mostly covers Google's newer Interactions API. The generateContent rules are in the version archived in December 2025, and they're specific:
- With parallel function calls, "the first function call part returned by the model response will have a thought signature." The others have none, and that's expected.
- With sequential calls, "each function call will have a signature and you must pass all signatures back."
- Checking is "enforced for all function calls within the current turn", which starts at your most recent real user message. Older turns aren't checked.
How apps lose the signature
If you use Google's own SDK and its chat history, the function-calling guide says "the SDKs automatically handle thought signatures for you." Most reports come from code that rebuilds the history itself.
Rebuilding parts one by one. The original Zed report blamed parallel calls: the signature sits on the first call only, and code that copies each call separately can drop it or attach it to the wrong one. (A Zed maintainer couldn't reproduce that version, so it's a theory for Zed specifically.) The archived guide also says parallel calls must come back as "FC1+ signature, FC2, FR1, FR2", every call before any response, and a 400 follows if you interleave them.
A translation layer. Tools that talk to Gemini through an OpenAI-style adapter have to carry the signature through a format that wasn't built for it. An OpenCode bug from September 23 traced one case to the signature being stored under one key and read back from another.
Switching models mid-task. The reliable Zed repro: a Claude or GPT model makes a tool call, the user switches to Gemini before approving it, and Gemini receives a function call it never signed. That was position 2 in the body above.
Fixing it
Keep each model response as a whole object and append it to the history unchanged. Don't rebuild it from its text and function calls. The current guide's instruction for managing history yourself is blunt: resend thought blocks "exactly as they were received."
The model-switch case has no real signature to send. For that, the archived guide gives two placeholder values, "context_engineering_is_the_way_to_go" or "skip_thought_signature_validator", which "skip validation" when set as the signature. It lists "transferring a trace from a different model" as a proper use, and calls the practice "strongly discouraged" otherwise.
Other lines the same feature prints
Match yours against these if the one at the top of the page is not quite it. They come from the same code and mean related things.
Function call is missing a thought_signature in functionCall parts. This is required for tools to work correctly, and missing thought_signature may lead to degraded model performance.Function call FC1 in the 1. content block is missing a thought_signatureis missing a thought_signature