Issue Title:
gemini-3.5-transcribe Interactions API hangs and returns status: incomplete when passing transcription_config for Diarization
Description
When using the newly announced gemini-3.5-transcribe model for pre-recorded audio via the client.interactions.create API, the configuration syntax provided in the announcement email does not work with the current Python SDK, and attempting to work around it causes the backend to fail.
There are two distinct issues occurring:
1. The documentation/email syntax throws a local exception:
The announcement email states we should use the config kwarg:
interaction = client.interactions.create(
model="gemini-3.5-transcribe",
config=dict(transcription_config=dict(...))
)
In google-genai version 2.17.0, this immediately throws a local exception:
TypeError: create() got unexpected keyword argument(s): config. Use extra_body=... to send additional request body fields.
2. The workaround syntax causes a backend freeze:
If we instead pass the configuration via generation_config (which is standard for Gemini models):
interaction = client.interactions.create(
model="gemini-3.5-transcribe",
generation_config={"transcription_config": { ... }}
)
The SDK accepts this, but the API blocks for ~72 seconds and returns an interaction object stuck in "status": "incomplete". The output_text truncates to just the first two words of the audio file (e.g., "Hello. Hello.") despite the usage block confirming that the entire audio file was tokenized (e.g., 6,325 audio tokens for a 4-minute file).
Polling client.interactions.get() indefinitely yields "status": "incomplete".
Crucially, if the generation_config block is completely removed, the API successfully processes the exact same 4-minute audio file synchronously in ~36 seconds, returns "status": "completed", and outputs the full 28,000-character transcript. However, this drops the speaker diarization and word-level timestamps since the config is missing.
Environment details
- OS: Windows
- Python version: 3.13
- SDK version (
pip show google-genai): 2.17.0
- Model:
gemini-3.5-transcribe
Steps to reproduce
- Upload an audio file (e.g., 4 minutes long) using
client.files.upload.
- Call
client.interactions.create and pass the transcription_config dictionary exactly as shown in the announcement email.
Code Snippet that FAILS LOCALLY (From Email):
import time
from google import genai
client = genai.Client(api_key='YOUR_API_KEY')
audio_file = client.files.get(name='files/YOUR_FILE_ID')
interaction = client.interactions.create(
model="gemini-3.5-transcribe",
input=[{
"type": "audio",
"uri": audio_file.uri,
"mime_type": audio_file.mime_type,
}],
config={
"transcription_config": {
"language_codes": ["hi-IN", "en-US"],
"mode": {
"type": "verbatim",
"diarization_mode": "speaker",
"timestamp_granularities": ["word"],
}
}
}
)
# Output: TypeError: create() got unexpected keyword argument(s): config
Code Snippet that FAILS ON BACKEND (Hangs on Incomplete):
# ... same as above, but using generation_config ...
interaction = client.interactions.create(
model="gemini-3.5-transcribe",
input=[{
"type": "audio",
"uri": audio_file.uri,
"mime_type": audio_file.mime_type,
}],
generation_config={
"transcription_config": {
"language_codes": ["hi-IN", "en-US"],
"mode": {
"type": "verbatim",
"diarization_mode": "speaker",
"timestamp_granularities": ["word"],
}
}
}
)
print(interaction.status) # Output: "incomplete"
print(interaction.output_text) # Output: "Hello. Hello." (Truncated)
Code Snippet that SUCCEEDS (But lacks diarization):
# ... same as above ...
# Removing generation_config fixes the freeze, but we lose diarization.
interaction = client.interactions.create(
model="gemini-3.5-transcribe",
input=[{
"type": "audio",
"uri": audio_file.uri,
"mime_type": audio_file.mime_type,
}]
)
print(interaction.status) # Output: "completed"
print(len(interaction.output_text)) # Output: 28325 (Full transcript successfully processed)
Expected Behavior
The interactions.create endpoint should accept the diarization configuration and return the full transcript with speaker labels and timestamps, rather than getting stuck in an "incomplete" state. The announcement documentation must be updated to match the current SDK, or the SDK must be updated to accept the config keyword argument for this endpoint.
Issue Title:
gemini-3.5-transcribeInteractions API hangs and returnsstatus: incompletewhen passingtranscription_configfor DiarizationDescription
When using the newly announced
gemini-3.5-transcribemodel for pre-recorded audio via theclient.interactions.createAPI, the configuration syntax provided in the announcement email does not work with the current Python SDK, and attempting to work around it causes the backend to fail.There are two distinct issues occurring:
1. The documentation/email syntax throws a local exception:
The announcement email states we should use the
configkwarg:In
google-genaiversion 2.17.0, this immediately throws a local exception:TypeError: create() got unexpected keyword argument(s): config. Use extra_body=... to send additional request body fields.2. The workaround syntax causes a backend freeze:
If we instead pass the configuration via
generation_config(which is standard for Gemini models):The SDK accepts this, but the API blocks for ~72 seconds and returns an interaction object stuck in
"status": "incomplete". Theoutput_texttruncates to just the first two words of the audio file (e.g., "Hello. Hello.") despite the usage block confirming that the entire audio file was tokenized (e.g., 6,325 audio tokens for a 4-minute file).Polling
client.interactions.get()indefinitely yields"status": "incomplete".Crucially, if the
generation_configblock is completely removed, the API successfully processes the exact same 4-minute audio file synchronously in ~36 seconds, returns"status": "completed", and outputs the full 28,000-character transcript. However, this drops the speaker diarization and word-level timestamps since the config is missing.Environment details
pip show google-genai): 2.17.0gemini-3.5-transcribeSteps to reproduce
client.files.upload.client.interactions.createand pass thetranscription_configdictionary exactly as shown in the announcement email.Code Snippet that FAILS LOCALLY (From Email):
Code Snippet that FAILS ON BACKEND (Hangs on Incomplete):
Code Snippet that SUCCEEDS (But lacks diarization):
Expected Behavior
The
interactions.createendpoint should accept the diarization configuration and return the full transcript with speaker labels and timestamps, rather than getting stuck in an"incomplete"state. The announcement documentation must be updated to match the current SDK, or the SDK must be updated to accept theconfigkeyword argument for this endpoint.