Is this a client library issue or a product issue?
This is a PRODUCT ISSUE (Gemini 3 Flash Preview API behavior), not a client library issue. The client library is working correctly - we've verified this with extensive debug logging showing the raw API responses. However, filing here as the Gemini API is the underlying product for this SDK.
Environment details
- Programming language: TypeScript/JavaScript (Node.js)
- OS: Linux
- Language runtime version: Node.js (via Vertex AI)
- Package version:
@google/genai v1.38.0
- Model:
gemini-3-flash-preview
- API: Vertex AI
- Region:
global
Steps to reproduce
Summary
Gemini 3 Flash Preview inconsistently generates thought_signature fields for parallel function calls. When 3+ tools are called, only the first 1-2 receive signatures, causing subsequent 400 INVALID_ARGUMENT errors when returning function results.
Reproduction Steps
- Configure Vertex AI with
gemini-3-flash-preview model (global region)
- Define 3 or more function/tool declarations
- Send a prompt that triggers 3+ parallel function calls via
generateContentStream
- Capture raw API response - observe only first 1-2 tool calls have
thought_signature field
- Return all function results (with signatures where provided)
- Result: 400 INVALID_ARGUMENT error: "Unable to submit request because function call
<name> in the X. content block is missing a thought_signature"
Evidence
Test Case 1: User request requiring 3 data operations
Google's Raw Response (3 parallel tool calls):
{
"toolCalls": [
{
"toolName": "get_resource_list",
"hasThoughtSignatureField": true,
"thoughtSignatureValue": "CiEBjz1rX0ilumvPg6k0sMMUtISoQCLJv2bPJ7Vv9r+Xw0o=",
"thoughtSignatureLength": 48
},
{
"toolName": "get_detailed_results",
"hasThoughtSignatureField": true,
"thoughtSignatureValue": "CiEBjz1rX0ilumvPg6k0sMMUtISoQCLJv2bPJ7Vv9r+Xw0o=",
"thoughtSignatureLength": 48
},
{
"toolName": "analyze_data",
"hasThoughtSignatureField": false,
"thoughtSignatureValue": undefined
}
]
}
Result: ✅ Position 1-2 have signatures | ❌ Position 3 missing → 400 error
Error:
Unable to submit request because function call `analyze_data`
in the 6. content block is missing a `thought_signature`.
Test Case 2: Different prompt, same 3 tools
Google's Raw Response:
{
"toolCalls": [
{
"toolName": "analyze_data",
"hasThoughtSignatureField": true,
"thoughtSignatureValue": "CiEBjz1rX0ilumvPg6k0sMMUtISoQCLJv2bPJ7Vv9r+Xw0o=",
"thoughtSignatureLength": 48
},
{
"toolName": "get_detailed_results",
"hasThoughtSignatureField": false,
"thoughtSignatureValue": undefined
},
{
"toolName": "get_resource_list",
"hasThoughtSignatureField": false,
"thoughtSignatureValue": undefined
}
]
}
Result: ✅ Position 1 has signature | ❌ Position 2-3 missing → 400 error
Key Finding: Position-Based Bug
The tool get_resource_list:
- ✅ HAD signature in Test Case 1 (position 1)
- ❌ NO signature in Test Case 2 (position 3)
This proves it's position-based, not tool-specific.
Pattern Summary
| Test |
Total Tools |
Signatures Provided |
Failed On |
| 1 |
3 |
Position 1-2 only |
Position 3 |
| 2 |
3 |
Position 1 only |
Position 2 |
Gemini 3 Flash generates signatures for ~first 1-2 tool calls, then stops. The cutoff is non-deterministic.
Debug Logs
Raw logs from production showing API response directly from SDK:
[llm] 2026-01-23 16:19:40 [debug]: [RAW GOOGLE RESPONSE] Tool call received
{"toolName":"analyze_data","hasThoughtSignatureField":true,
"thoughtSignatureValue":"CiEBjz1rX0ilumvPg6k0sMMUtISoQCLJv2bPJ7Vv9r+Xw0o="}
[llm] 2026-01-23 16:19:40 [debug]: [RAW GOOGLE RESPONSE] Tool call received
{"toolName":"get_detailed_results","hasThoughtSignatureField":false}
[llm] 2026-01-23 16:19:41 [debug]: [RAW GOOGLE RESPONSE] Tool call received
{"toolName":"get_resource_list","hasThoughtSignatureField":false}
Implementation Verification
We've ruled out client library issues by:
✅ Capturing thought signatures from streaming responses correctly
✅ Preserving signatures through tool execution lifecycle
✅ Returning signatures byte-for-byte to the API
✅ Extensive debug logging at every step
✅ Confirming with raw API response logs that Google doesn't send all signatures
The same implementation works flawlessly with gemini-2.5-flash, proving this is a Gemini 3 API issue.
Impact
- Severity: Critical - prevents production use with multi-tool scenarios
- Scope: Any application using Gemini 3 Flash with 3+ parallel function calls
- Frequency: Consistent when 3+ tools called
- Reliability: Non-deterministic cutoff makes failures unpredictable
Workaround
Use gemini-2.5-flash - it doesn't use thought signatures and handles parallel function calls reliably.
Questions
- Why are thought signatures inconsistently generated for parallel function calls?
- Is this a known limitation of the preview API?
- What is the intended maximum number of parallel function calls with thought signatures?
- Is there a timeline for fixing this?
- Should Gemini 3 Flash be considered production-ready for function calling?
Additional Context
We have extensive debug logs, raw API responses, and reproduction code available. Happy to provide additional evidence or collaborate on debugging.
This bug makes Gemini 3 Flash unsuitable for production use with multi-tool function calling.
Is this a client library issue or a product issue?
This is a PRODUCT ISSUE (Gemini 3 Flash Preview API behavior), not a client library issue. The client library is working correctly - we've verified this with extensive debug logging showing the raw API responses. However, filing here as the Gemini API is the underlying product for this SDK.
Environment details
@google/genaiv1.38.0gemini-3-flash-previewglobalSteps to reproduce
Summary
Gemini 3 Flash Preview inconsistently generates
thought_signaturefields for parallel function calls. When 3+ tools are called, only the first 1-2 receive signatures, causing subsequent 400 INVALID_ARGUMENT errors when returning function results.Reproduction Steps
gemini-3-flash-previewmodel (global region)generateContentStreamthought_signaturefield<name>in the X. content block is missing athought_signature"Evidence
Test Case 1: User request requiring 3 data operations
Google's Raw Response (3 parallel tool calls):
{ "toolCalls": [ { "toolName": "get_resource_list", "hasThoughtSignatureField": true, "thoughtSignatureValue": "CiEBjz1rX0ilumvPg6k0sMMUtISoQCLJv2bPJ7Vv9r+Xw0o=", "thoughtSignatureLength": 48 }, { "toolName": "get_detailed_results", "hasThoughtSignatureField": true, "thoughtSignatureValue": "CiEBjz1rX0ilumvPg6k0sMMUtISoQCLJv2bPJ7Vv9r+Xw0o=", "thoughtSignatureLength": 48 }, { "toolName": "analyze_data", "hasThoughtSignatureField": false, "thoughtSignatureValue": undefined } ] }Result: ✅ Position 1-2 have signatures | ❌ Position 3 missing → 400 error
Error:
Test Case 2: Different prompt, same 3 tools
Google's Raw Response:
{ "toolCalls": [ { "toolName": "analyze_data", "hasThoughtSignatureField": true, "thoughtSignatureValue": "CiEBjz1rX0ilumvPg6k0sMMUtISoQCLJv2bPJ7Vv9r+Xw0o=", "thoughtSignatureLength": 48 }, { "toolName": "get_detailed_results", "hasThoughtSignatureField": false, "thoughtSignatureValue": undefined }, { "toolName": "get_resource_list", "hasThoughtSignatureField": false, "thoughtSignatureValue": undefined } ] }Result: ✅ Position 1 has signature | ❌ Position 2-3 missing → 400 error
Key Finding: Position-Based Bug
The tool
get_resource_list:This proves it's position-based, not tool-specific.
Pattern Summary
Gemini 3 Flash generates signatures for ~first 1-2 tool calls, then stops. The cutoff is non-deterministic.
Debug Logs
Raw logs from production showing API response directly from SDK:
Implementation Verification
We've ruled out client library issues by:
✅ Capturing thought signatures from streaming responses correctly
✅ Preserving signatures through tool execution lifecycle
✅ Returning signatures byte-for-byte to the API
✅ Extensive debug logging at every step
✅ Confirming with raw API response logs that Google doesn't send all signatures
The same implementation works flawlessly with
gemini-2.5-flash, proving this is a Gemini 3 API issue.Impact
Workaround
Use
gemini-2.5-flash- it doesn't use thought signatures and handles parallel function calls reliably.Questions
Additional Context
We have extensive debug logs, raw API responses, and reproduction code available. Happy to provide additional evidence or collaborate on debugging.
This bug makes Gemini 3 Flash unsuitable for production use with multi-tool function calling.