Interactions: stateless replay of an `mcp_server_tool_result` whose `structured_content` holds a `$ref` returns 400
Mantenedores costumam responder em até 1 dia
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 3/5
- Tempo estimado
- 1-2 dias
- Facilidade para iniciantes
- 57/100
Direção de pesquisa
Start by tracing how the SDK models and serializes mcp_server_tool_result steps for stateless Interactions API requests; the issue does not name specific files or tests. Compare the returned structured_content reference with the replayed function response, then add a regression test using the reproduction shape. Done means replaying the emitted steps succeeds when structured_content contains a $ref.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
This issue was posted by Claude Code using claude-opus-5-5 on behalf of David.
Interactions API rejects its own mcp_server_tool_result step on stateless replay when structured_content contains a $ref.
With store: false, sending back the steps a previous interaction returned fails with HTTP 400 when an MCP image result came from a server that also sets structuredContent:
400 {"error":{"message":"The referenced name `structured_content.result[0]` in function_response.response does not match to a display_name in the function_response.parts.","code":"invalid_request"}}
The step is exactly what the API emitted. Image results without structured_content, and audio and embedded-resource results, replay fine (200).
Reproduce (raw HTTP, no SDK)
-
Run a public MCP server with a tool returning an
ImageContentblock and matchingstructuredContent. FastMCP does this for a tool annotated-> list[ImageContent]:from mcp.server.fastmcp import FastMCP from mcp.types import ImageContent PNG = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR4nGNg+M/A8B8ABf4C/gzLSmsAAAAASUVORK5CYII=' mcp = FastMCP('probe', stateless_http=True) @mcp.tool() def get_image() -> list[ImageContent]: return [ImageContent(type='image', data=PNG, mimeType='image/png')] mcp.run(transport='streamable-http') -
POST /v1beta/interactionswithmodel: gemini-3.8-flash,store: false,tools: [{"type": "mcp_server", "name": "probe", "url": "<server>/mcp"}], and auser_inputasking it to callget_image. The response contains:{"type": "mcp_server_tool_result", "call_id": "...", "signature": "...", "name": "probe:get_image", "server_name": "probe", "result": {"call_tool_result_json": "{\"content\":[{\"type\":\"image\",...}],\"structuredContent\":{...}}", "structured_content": {"result": [{"$ref": "structured_content.result[0]"}]}}} -
Send a second request whose
inputis the firstuser_input, every returned step unchanged, and a newuser_input. It returns the 400 above. Dropping only that tool's call and result steps returns 200.
Related: the live result shape differs from the reference and SDK types
- The API reference documents
mcp_server_tool_result.resultas(ImageContent or TextContent) array,objectorstring. Live results for text, image, audio and embedded-resource tools all arrive as an undocumented object:call_tool_result_json(the MCPCallToolResultas a JSON string), optionalstructured_content, a plain-textresult, and for blob resources a key named after the MIME type ("application/pdf": "<base64>"). MCPServerToolResultStepResultin this SDK is an empty model, so none of those fields are typed. The list branch types only text and image items; audio, video and document items parse asUnknownFunctionResultSubcontent.
Observed with google-genai 2.30.0 on the Gemini API (gemini-3.8-flash), November 2026.
- Linguagem predominante
- Python
- Estrelas
- 4.1k
- Forks
- 1.1k
- Merge médio
- 1d 21h
- PRs com merge (30d)
- 103
Preparar o ambiente
- Sem Dockerfile nem arquivo Docker Compose
- Sem modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de googleapis/python-genai
-
Test import module that doesn't existTalvez já em andamento @Venkaiahbabuneelam assumiu há 25 dias. Abertapriority: p2 type: bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 66/100
googleapis/python-genai#3122 · 6 comentários · 1 responsável ·
Mantenedores costumam responder em até 1 dia
-
Curated history keeps half a user turn when the model turn is invalidTalvez já em andamento @Venkaiahbabuneelam assumiu há 34 dias. Abertapriority: p2 type: bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 62/100
googleapis/python-genai#3051 · 3 comentários · 1 responsável ·
Mantenedores costumam responder em até 1 dia
-
[Bug]: Unsubscripted typing.List and typing.Dict crash convert_if_exist_pydantic_model in AFCTalvez já em andamento @Venkaiahbabuneelam assumiu há 34 dias. Abertapriority: p2 type: bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
googleapis/python-genai#3044 · 1 comentário · 1 responsável ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 48/100
googleapis/python-genai#3314 ·
Mantenedores costumam responder em até 1 dia
-
SyntaxWarning on import in 3.0.0 (invalid escape sequence in types.py)Talvez já em andamento @VISHNU0906 assumiu há 1 dia. Aberta
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 35/100
googleapis/python-genai#3308 · 2 comentários · 1 reação ·
Mantenedores costumam responder em até 1 dia
Todas as issues de googleapis/python-genai
Issues semelhantes
-
bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 74/100
igormcsouza/tether#278 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 91/100
aws-samples/sample-per-model-bedrock#803 ·
Mantenedores costumam responder em até 1 dia
-
documentation p1
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
huggingface/accelerate#4511 ·
Mantenedores costumam responder em até 1 dia
-
follow-up
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
Mantenedores costumam responder em até 1 dia