Skip to content

Commit 9204821

Browse files
authored
ignore empty text parts (#466)
1 parent 4553b3c commit 9204821

File tree

2 files changed

+18
-4
lines changed

2 files changed

+18
-4
lines changed

pydantic_ai_slim/pydantic_ai/agent.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -841,11 +841,13 @@ async def _handle_model_response(
841841
"""
842842
texts: list[str] = []
843843
tool_calls: list[_messages.ToolCallPart] = []
844-
for item in model_response.parts:
845-
if isinstance(item, _messages.TextPart):
846-
texts.append(item.content)
844+
for part in model_response.parts:
845+
if isinstance(part, _messages.TextPart):
846+
# ignore empty content for text parts, see #437
847+
if part.content:
848+
texts.append(part.content)
847849
else:
848-
tool_calls.append(item)
850+
tool_calls.append(part)
849851

850852
if texts:
851853
text = '\n\n'.join(texts)

tests/test_agent.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1112,3 +1112,15 @@ def return_settings(_: list[ModelMessage], info: AgentInfo) -> ModelResponse:
11121112
my_agent = Agent(FunctionModel(return_settings), model_settings={'temperature': 0.1})
11131113
assert (await my_agent.run('Hello')).data == IsJson({'temperature': 0.1})
11141114
assert (await my_agent.run('Hello', model_settings={'temperature': 0.5})).data == IsJson({'temperature': 0.5})
1115+
1116+
1117+
async def test_empty_text_part():
1118+
def return_empty_text(_: list[ModelMessage], info: AgentInfo) -> ModelResponse:
1119+
assert info.result_tools is not None
1120+
args_json = '{"response": ["foo", "bar"]}'
1121+
return ModelResponse(parts=[TextPart(''), ToolCallPart.from_json(info.result_tools[0].name, args_json)])
1122+
1123+
agent = Agent(FunctionModel(return_empty_text), result_type=tuple[str, str])
1124+
1125+
result = await agent.run('Hello')
1126+
assert result.data == ('foo', 'bar')

0 commit comments

Comments
 (0)