Skip to content

Commit e42265e

Browse files
fix(py): fix the issue of no response in say_hi_stream flow (#4003)
Co-authored-by: Mengqin Shen <mengqin@google.com>
1 parent 3f2e38b commit e42265e

File tree

2 files changed

+23
-12
lines changed

2 files changed

+23
-12
lines changed

‎py/plugins/anthropic/src/genkit/plugins/anthropic/models.py‎

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,10 @@ async def generate(self, request: GenerateRequest, ctx: ActionRunContext | None
7575

7676
if streaming:
7777
response = await self._generate_streaming(params, ctx)
78-
content = []
7978
else:
8079
response = await self.client.messages.create(**params)
81-
content = self._to_genkit_content(response.content)
80+
81+
content = self._to_genkit_content(response.content)
8282

8383
response_message = Message(role=Role.MODEL, content=content)
8484
basic_usage = get_basic_usage_stats(input_=request.messages, response=response_message)
@@ -155,7 +155,7 @@ async def _generate_streaming(self, params: dict[str, Any], ctx: ActionRunContex
155155
GenerateResponseChunk(
156156
role=Role.MODEL,
157157
index=0,
158-
content=[TextPart(text=chunk.delta.text)],
158+
content=[Part(root=TextPart(text=chunk.delta.text))],
159159
)
160160
)
161161
return await stream.get_final_message()
@@ -223,15 +223,17 @@ def _to_genkit_content(self, content_blocks: list) -> list[Part]:
223223
parts = []
224224
for block in content_blocks:
225225
if block.type == 'text':
226-
parts.append(TextPart(text=block.text))
226+
parts.append(Part(root=TextPart(text=block.text)))
227227
elif block.type == 'tool_use':
228228
parts.append(
229-
ToolRequestPart(
230-
tool_request={
231-
'ref': block.id,
232-
'name': block.name,
233-
'input': block.input,
234-
}
229+
Part(
230+
root=ToolRequestPart(
231+
tool_request={
232+
'ref': block.id,
233+
'name': block.name,
234+
'input': block.input,
235+
}
236+
)
235237
)
236238
)
237239
return parts

‎py/plugins/anthropic/tests/test_models.py‎

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,9 +180,10 @@ def test_to_anthropic_messages():
180180
class MockStreamManager:
181181
"""Mock stream manager for testing streaming."""
182182

183-
def __init__(self, chunks):
183+
def __init__(self, chunks, final_content=None):
184184
self.chunks = chunks
185185
self.final_message = MagicMock()
186+
self.final_message.content = final_content if final_content else []
186187
self.final_message.usage = MagicMock(input_tokens=10, output_tokens=20)
187188
self.final_message.stop_reason = 'end_turn'
188189

@@ -217,7 +218,8 @@ async def test_streaming_generation():
217218
MagicMock(type='content_block_delta', delta=MagicMock(text='!')),
218219
]
219220

220-
mock_stream = MockStreamManager(chunks)
221+
final_content = [MagicMock(type='text', text='Hello world!')]
222+
mock_stream = MockStreamManager(chunks, final_content=final_content)
221223
mock_client.messages.stream.return_value = mock_stream
222224

223225
model = AnthropicModel(model_name='claude-sonnet-4', client=mock_client)
@@ -248,3 +250,10 @@ def send_chunk(chunk: GenerateResponseChunk):
248250

249251
assert response.usage.input_tokens == 10
250252
assert response.usage.output_tokens == 20
253+
254+
# Verify final response content is populated
255+
assert len(response.message.content) == 1
256+
final_part = response.message.content[0]
257+
assert isinstance(final_part, Part)
258+
assert isinstance(final_part.root, TextPart)
259+
assert final_part.root.text == 'Hello world!'

0 commit comments

Comments
 (0)