Title
[BUG] Reasoning Engine / ADK stream path fails when structured output is enforced (response_mime_type unexpected in Runner.run_async)
Description
We have a production backend on Vertex AI + ADK with two agents:
- a main reply agent
- a memory agent
Both agents have their own instructions and are expected to return strict backend-owned JSON contracts.
We recently switched our runtime path so that reply and memory tasks go through the ADK / Reasoning Engine agent runtime path instead of a direct structured Gemini call.
After that switch, the agent runtime starts correctly, but the request fails inside the remote ADK runtime when structured-output parameters are involved.
What we want
We want to use:
- the agent’s own instruction/runtime path
- plus strict JSON output for backend contracts
In other words:
- agent behavior must come from ADK agent instructions
- backend still needs strict JSON output (
reply_text + system_payload for reply, typed JSON for memory tasks)
Observed behavior
The request reaches Reasoning Engine successfully:
VERTEX_AGENT_INVOCATION_START
QueryReasoningEngine
CreateSession
StreamQueryReasoningEngine
Then the remote runtime fails with:
TypeError: Runner.run_async() got an unexpected keyword argument 'response_mime_type'
After that, backend-side structured extraction fails with:
Vertex structured output extraction contract violation: no valid candidate
Relevant log excerpt
VERTEX_AGENT_INVOCATION_START
QueryReasoningEngine
CreateSession
VERTEX_AGENT_STREAM_QUERY_START
StreamQueryReasoningEngine
ERROR: Runner.run_async() got an unexpected keyword argument 'response_mime_type'
VERTEX_AGENT_INVOCATION_ERROR
Exception: Vertex structured output extraction contract violation: no valid candidate
LLM_TASK_FAILED
task=reply
provider=vertex
error_type=invalid_output
reply_path=agent_runtime
execution_path=agent_runtime
Important context
Before this change, the same task worked through a direct structured Gemini path:
- direct
GenerateContent
response_mime_type="application/json"
response_schema
- strict backend validation succeeded
That path produced valid JSON, but it bypassed the ADK agent instruction contour, which is not acceptable for our use case.
Now we have the opposite:
- ADK agent runtime is active
- but strict structured output fails inside the ADK / Reasoning Engine stream path
Question
What is the correct supported way to combine:
- ADK / Reasoning Engine agent runtime path
- agent-owned instructions / role behavior
- strict JSON output contract for backend integration
Specifically:
- Is
stream_query expected to support structured output in this setup?
- Is
response_mime_type / schema supposed to be passed through the transport layer at all?
- Should this be done only inside the deployed ADK agent runtime?
- Is non-streaming
query the only supported option for strict structured JSON with ADK agents?
- If supported, what is the correct pattern for enforcing a typed JSON contract from an ADK agent without bypassing the agent contour?
Environment
- Vertex AI Reasoning Engine / ADK runtime
- Python backend calling remote agent runtime
- Gemini model behind Vertex
- strict backend-owned JSON contracts
- no tool side effects inside the agent
- side effects remain in backend only
Why this matters
This is not just about formatting.
We need both:
- instruction-owned agent behavior
- strict machine-valid JSON output for backend orchestration
Right now we can get either:
- correct JSON through direct Gemini structured path
- or agent runtime behavior through ADK path
But not both together reliably.
If needed, I can provide:
- a minimal reproduction
- the relevant provider code path
- the exact payload shape used before and after the runtime switch
- full logs
Title
[BUG] Reasoning Engine / ADK stream path fails when structured output is enforced (
response_mime_typeunexpected inRunner.run_async)Description
We have a production backend on Vertex AI + ADK with two agents:
Both agents have their own instructions and are expected to return strict backend-owned JSON contracts.
We recently switched our runtime path so that
replyand memory tasks go through the ADK / Reasoning Engine agent runtime path instead of a direct structured Gemini call.After that switch, the agent runtime starts correctly, but the request fails inside the remote ADK runtime when structured-output parameters are involved.
What we want
We want to use:
In other words:
reply_text + system_payloadfor reply, typed JSON for memory tasks)Observed behavior
The request reaches Reasoning Engine successfully:
VERTEX_AGENT_INVOCATION_STARTQueryReasoningEngineCreateSessionStreamQueryReasoningEngineThen the remote runtime fails with:
After that, backend-side structured extraction fails with:
Relevant log excerpt
Important context
Before this change, the same task worked through a direct structured Gemini path:
GenerateContentresponse_mime_type="application/json"response_schemaThat path produced valid JSON, but it bypassed the ADK agent instruction contour, which is not acceptable for our use case.
Now we have the opposite:
Question
What is the correct supported way to combine:
Specifically:
stream_queryexpected to support structured output in this setup?response_mime_type/ schema supposed to be passed through the transport layer at all?querythe only supported option for strict structured JSON with ADK agents?Environment
Why this matters
This is not just about formatting.
We need both:
Right now we can get either:
But not both together reliably.
If needed, I can provide: