Skip to content

Commit a535008

Browse files
fix(py): fix the encoded media parts in response with google-genai pl… (#4000)
Co-authored-by: Mengqin Shen <[email protected]>
1 parent bdb70a4 commit a535008

File tree

5 files changed

+15
-13
lines changed

5 files changed

+15
-13
lines changed

py/plugins/google-genai/src/genkit/plugins/google_genai/models/imagen.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,10 +206,11 @@ def _contents_from_response(self, response: genai_types.GenerateImagesResponse)
206206
content = []
207207
if response.generated_images:
208208
for image in response.generated_images:
209+
b64_data = base64.b64encode(image.image.image_bytes).decode('utf-8')
209210
content.append(
210211
Part(
211212
media=Media(
212-
url=base64.b64encode(image.image.image_bytes),
213+
url=f'data:{image.image.mime_type};base64,{b64_data}',
213214
contentType=image.image.mime_type,
214215
)
215216
)

py/plugins/google-genai/src/genkit/plugins/google_genai/models/utils.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,13 @@ def to_gemini(cls, part: Part) -> genai.types.Part:
8989
)
9090
)
9191
if isinstance(part.root, MediaPart):
92+
url = part.root.media.url
93+
if not url.startswith(cls.DATA):
94+
raise ValueError(f'Unsupported media URL for inline_data: {url}')
95+
data = base64.b64decode(url.split(',', 1)[1])
9296
return genai.types.Part(
9397
inline_data=genai.types.Blob(
94-
data=part.root.media.url,
95-
mime_type=part.root.media.content_type,
98+
data=data,
9699
)
97100
)
98101
if isinstance(part.root, CustomPart):
@@ -160,9 +163,10 @@ def from_gemini(cls, part: genai.types.Part) -> Part:
160163
)
161164
)
162165
if part.inline_data:
166+
b64_data = base64.b64encode(part.inline_data.data).decode('utf-8')
163167
return Part(
164168
media=Media(
165-
url=base64.b64encode(part.inline_data.data),
169+
url=f'data:{part.inline_data.mime_type};base64,{b64_data}',
166170
contentType=part.inline_data.mime_type,
167171
)
168172
)

py/plugins/google-genai/test/models/test_googlegenai_gemini.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,8 @@
1414
#
1515
# SPDX-License-Identifier: Apache-2.0
1616

17-
import base64
1817
import sys
19-
import unittest
18+
import urllib.request
2019
from unittest.mock import ANY, AsyncMock, MagicMock, patch
2120

2221
if sys.version_info < (3, 11): # noqa
@@ -186,8 +185,8 @@ async def test_generate_media_response(mocker, version):
186185

187186
assert content.root.media.content_type == response_mimetype
188187

189-
decoded_url = base64.b64decode(content.root.media.url)
190-
assert decoded_url == response_byte_string
188+
with urllib.request.urlopen(content.root.media.url) as response:
189+
assert response.read() == response_byte_string
191190

192191

193192
def test_convert_schema_property(mocker):

py/plugins/google-genai/test/models/test_googlegenai_imagen.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
# SPDX-License-Identifier: Apache-2.0
1616

1717
import base64
18+
import urllib.request
1819

1920
import pytest
2021
from google import genai
@@ -76,5 +77,5 @@ async def test_generate_media_response(mocker, version):
7677

7778
assert content.root.media.content_type == response_mimetype
7879

79-
decoded_url = base64.b64decode(content.root.media.url)
80-
assert decoded_url == response_byte_string
80+
with urllib.request.urlopen(content.root.media.url) as response:
81+
assert response.read() == response_byte_string

py/samples/google-genai-hello/src/google_genai_hello.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,6 @@ async def simple_generate_with_tools_flow(value: int, ctx: ActionRunContext) ->
116116
The generated response with a function.
117117
"""
118118
response = await ai.generate(
119-
model='googleai/gemini-2.5-flash',
120119
prompt=f'what is a gablorken of {value}',
121120
tools=['gablorkenTool'],
122121
on_chunk=ctx.send_chunk,
@@ -149,7 +148,6 @@ async def simple_generate_with_interrupts(value: int) -> str:
149148
The generated response with a function.
150149
"""
151150
response1 = await ai.generate(
152-
model='googleai/gemini-2.5-flash',
153151
messages=[
154152
Message(
155153
role=Role.USER,
@@ -164,7 +162,6 @@ async def simple_generate_with_interrupts(value: int) -> str:
164162

165163
tr = tool_response(response1.interrupts[0], 178)
166164
response = await ai.generate(
167-
model='googleai/gemini-2.5-flash',
168165
messages=response1.messages,
169166
tool_responses=[tr],
170167
tools=['gablorkenTool'],

0 commit comments

Comments
 (0)