← All tools
TS
AI

Gemini 3 Function-Calling 400 Error Checker

Getting a 400 error or silently broken multi-turn tool use from the Gemini 3 API? Paste your request or response to check function-calling turns for missing thoughtSignature fields, functionResponse ordering mistakes, and missing id echoes. 100% client-side.

🔒 Runs entirely in your browser — no data is ever sent anywhere

When you need a Gemini thought signature validator

Gemini 3's function-calling flow attaches an opaque thoughtSignature to each functionCall part, and it has to be replayed back to the API unmodified on the next turn — strip it, reorder it, or serialize your conversation history in a way that drops it, and the next request comes back with a 400 error that doesn't obviously point at the signature as the cause. If you're mid-integration and hitting a mysterious 400 on the second or third turn of a tool-use loop, pasting the request or response here checks the exact structural rules Gemini enforces, rather than guessing which of several possible causes it is.

What this tool checks: signatures, ordering, and id echoes

There are two distinct signature rules depending on the shape of the tool call: for several function calls made in parallel within one response, only the first functionCall part is required to carry a signature; for function calls made sequentially across separate turns, each turn's functionCall needs its own. This tool checks both cases specifically and reports exactly which turn is missing one, along with whether functionResponse parts match their corresponding functionCall in order and count, and whether the functionCall id is echoed back correctly. It accepts a full request body, a bare contents array, a raw API response, or a single content object, and detects which one you gave it — though response-only input skips the ordering checks, since there's no conversation history to check against. It can't verify what's inside a signature, only whether one is present where the API requires it — the contents are encrypted by Google and not decodable by anyone but Gemini itself.

Frequently asked questions

What is a Gemini thought signature?

It's an encrypted, opaque string the Gemini 3 API attaches to a functionCall part to preserve the model's internal reasoning state across a multi-turn tool-use conversation. When you replay conversation history back to the API — including that functionCall and its result — you must include the thoughtSignature exactly as it was returned, unmodified. Leaving it out (or stripping it during your own serialization) makes the next request invalid.

Why does my request fail with a 400 error?

The most common cause is a missing thoughtSignature on a functionCall part being replayed into history. There are two signature rules: for parallel function calls in one response, only the first functionCall part carries a signature; for sequential function calls across separate turns, each turn's functionCall needs its own. This tool checks both cases and tells you exactly which turn is missing one.

Can this tool decode or verify what's inside a thoughtSignature?

No — thought signatures are encrypted by Google and not decodable client-side (or server-side, by anyone but Gemini itself). This tool only checks structure: whether a signature is present where the API requires one, whether functionResponse parts match their functionCall in order and count, and whether the Gemini 3 functionCall id is echoed back correctly. It can't tell you if a signature's contents are valid, only whether one is missing where it shouldn't be.

What can I paste in?

A full request body ({ contents: [...] }), a bare contents array, a raw generateContent/streamGenerateContent response ({ candidates: [...] }), or a single content object ({ role, parts }). This tool detects which shape you gave it. Response-only shapes are checked for a missing signature but skip the ordering checks, since there's no conversation history to check against.

Related AI tools

Bracketly is free and open-source. If this tool saved you time, consider supporting it.

☕ Buy me a coffee