Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions google/genai/batches.py
Original file line number Diff line number Diff line change
Expand Up @@ -2164,7 +2164,7 @@ def _list(
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
return return_value
Expand Down Expand Up @@ -2264,7 +2264,7 @@ def delete(
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
return return_value
Expand Down Expand Up @@ -2794,7 +2794,7 @@ async def _list(
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
return return_value
Expand Down Expand Up @@ -2894,7 +2894,7 @@ async def delete(
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
return return_value
Expand Down
8 changes: 4 additions & 4 deletions google/genai/caches.py
Original file line number Diff line number Diff line change
Expand Up @@ -1419,7 +1419,7 @@ def delete(
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
return return_value
Expand Down Expand Up @@ -1579,7 +1579,7 @@ def _list(
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
return return_value
Expand Down Expand Up @@ -1880,7 +1880,7 @@ async def delete(
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
return return_value
Expand Down Expand Up @@ -2042,7 +2042,7 @@ async def _list(
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
return return_value
Expand Down
8 changes: 4 additions & 4 deletions google/genai/files.py
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ def _list(
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
return return_value
Expand Down Expand Up @@ -491,7 +491,7 @@ def delete(
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
return return_value
Expand Down Expand Up @@ -862,7 +862,7 @@ async def _list(
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
return return_value
Expand Down Expand Up @@ -1111,7 +1111,7 @@ async def delete(
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
return return_value
Expand Down
46 changes: 26 additions & 20 deletions google/genai/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -1109,6 +1109,9 @@ def _EmbedContentResponse_from_mldev(
if getv(from_object, ['metadata']) is not None:
setv(to_object, ['metadata'], getv(from_object, ['metadata']))

if getv(from_object, ['usageMetadata']) is not None:
setv(to_object, ['usage_metadata'], getv(from_object, ['usageMetadata']))

return to_object


Expand Down Expand Up @@ -1136,6 +1139,9 @@ def _EmbedContentResponse_from_vertex(
if getv(from_object, ['metadata']) is not None:
setv(to_object, ['metadata'], getv(from_object, ['metadata']))

if getv(from_object, ['usageMetadata']) is not None:
setv(to_object, ['usage_metadata'], getv(from_object, ['usageMetadata']))

if getv(root_object, ['embedding_api_type']) == 'EMBED_CONTENT':
embedding = getv(from_object, ['embedding'])
usage_metadata = getv(from_object, ['usageMetadata'])
Expand Down Expand Up @@ -5025,7 +5031,7 @@ def _generate_content(
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
return return_value
Expand Down Expand Up @@ -5126,7 +5132,7 @@ def _generate_content_stream(
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
yield return_value
Expand Down Expand Up @@ -5247,7 +5253,7 @@ def _embed_content(
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
return return_value
Expand Down Expand Up @@ -5338,7 +5344,7 @@ def _generate_images(
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
return return_value
Expand Down Expand Up @@ -5422,7 +5428,7 @@ def _edit_image(
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
return return_value
Expand Down Expand Up @@ -5506,7 +5512,7 @@ def _upscale_image(
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
return return_value
Expand Down Expand Up @@ -5881,7 +5887,7 @@ def _list(
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
return return_value
Expand Down Expand Up @@ -6049,7 +6055,7 @@ def delete(
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
return return_value
Expand Down Expand Up @@ -6159,7 +6165,7 @@ def count_tokens(
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
return return_value
Expand Down Expand Up @@ -6262,7 +6268,7 @@ def compute_tokens(
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
return return_value
Expand Down Expand Up @@ -7224,7 +7230,7 @@ async def _generate_content(
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
return return_value
Expand Down Expand Up @@ -7328,7 +7334,7 @@ async def async_generator(): # type: ignore[no-untyped-def]
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
yield return_value
Expand Down Expand Up @@ -7451,7 +7457,7 @@ async def _embed_content(
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
return return_value
Expand Down Expand Up @@ -7542,7 +7548,7 @@ async def _generate_images(
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
return return_value
Expand Down Expand Up @@ -7626,7 +7632,7 @@ async def _edit_image(
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
return return_value
Expand Down Expand Up @@ -7710,7 +7716,7 @@ async def _upscale_image(
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
return return_value
Expand Down Expand Up @@ -8092,7 +8098,7 @@ async def _list(
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
return return_value
Expand Down Expand Up @@ -8260,7 +8266,7 @@ async def delete(
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
return return_value
Expand Down Expand Up @@ -8370,7 +8376,7 @@ async def count_tokens(
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
return return_value
Expand Down Expand Up @@ -8472,7 +8478,7 @@ async def compute_tokens(
else {},
)
return_value.sdk_http_response = types.HttpResponse(
headers=response.headers
headers=response.headers, body=response.body
)
self._api_client._verify_response(return_value)
return return_value
Expand Down
64 changes: 64 additions & 0 deletions google/genai/tests/types/test_embed_content_response_fields.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
"""Regression tests for #2658 — EmbedContentResponse should surface usageMetadata
and HttpResponse in sdk_http_response should include body.

Background: ``EmbedContentResponse`` lacks a ``usage_metadata`` field. Separately,
every ``HttpResponse`` construction across the SDK passes only
``headers=response.headers``, silently dropping ``body=response.body`` —
users inspecting ``response.sdk_http_response.body`` always see ``None``.

Tests:

1. ``test_embed_content_response_has_usage_metadata_field`` — the type
declares ``usage_metadata`` (model_fields contains the name).
2. ``test_embed_content_response_dict_has_usage_metadata_field`` — the
corresponding TypedDict also declares the field.
3. ``test_http_response_body_construction_through_wrapper`` — using the
`_common` machinery that wraps sdk_http_response, body should be
preserved when present.
"""

from __future__ import annotations


def test_embed_content_response_has_usage_metadata_field():
"""The EmbedContentResponse Pydantic model must expose usage_metadata
as a field so calling code can access ``response.usage_metadata``.
"""
from google.genai import types

field_names = types.EmbedContentResponse.model_fields.keys()
assert "usage_metadata" in field_names, (
"#2658 regression: EmbedContentResponse must declare a "
"'usage_metadata' field so callers can read it. "
f"Declared fields: {sorted(field_names)}"
)


def test_embed_content_response_dict_has_usage_metadata_field():
"""The corresponding TypedDict must declare usage_metadata too."""
from google.genai import types

# TypedDict exposes annotations via __annotations__
annotations = types.EmbedContentResponseDict.__annotations__
assert "usage_metadata" in annotations, (
"#2658 regression: EmbedContentResponseDict must declare "
"'usage_metadata' for dict-style callers. "
f"Declared annotations: {sorted(annotations.keys())}"
)


def test_http_response_accepts_body():
"""HttpResponse type must accept body and round-trip it through
Pydantic. (The bug is in call sites, but the type must support
passing body= for the fix to take effect.)
"""
from google.genai import types

resp = types.HttpResponse(
headers={"content-type": "application/json"},
body='{"embeddings": []}',
)
assert resp.body == '{"embeddings": []}', (
f"#2658 regression: HttpResponse must preserve body. Got: {resp.body!r}"
)
assert resp.headers == {"content-type": "application/json"}
Loading
Loading