Skip to content

Commit 0b0f0e2

Browse files
committed
More fixes to reasoning
1 parent 1d40ed9 commit 0b0f0e2

File tree

3 files changed

+21
-3
lines changed

3 files changed

+21
-3
lines changed

pydantic_ai_slim/pydantic_ai/_parts_manager.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ def handle_text_delta(
111111
if existing_text_part_and_index is None:
112112
# There is no existing text part that should be updated, so create a new one
113113
new_part_index = len(self._parts)
114-
part = TextPart(content=content)
114+
part = TextPart(id=vendor_part_id, content=content)
115115
if vendor_part_id is not None:
116116
self._vendor_id_to_part_index[vendor_part_id] = new_part_index
117117
self._parts.append(part)

pydantic_ai_slim/pydantic_ai/messages.py

+4
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,8 @@ class TextPart:
476476
part_kind: Literal['text'] = 'text'
477477
"""Part type identifier, this is available on all parts as a discriminator."""
478478

479+
id: str | None = None
480+
479481
def has_content(self) -> bool:
480482
"""Return `True` if the text content is non-empty."""
481483
return bool(self.content)
@@ -494,6 +496,8 @@ class ThinkingPart:
494496
part_kind: Literal['thinking'] = 'thinking'
495497
"""Part type identifier, this is available on all parts as a discriminator."""
496498

499+
id: str | None = None
500+
497501
def has_content(self) -> bool:
498502
"""Return `True` if the thinking content is non-empty."""
499503
return bool(self.content)

pydantic_ai_slim/pydantic_ai/models/openai.py

+16-2
Original file line numberDiff line numberDiff line change
@@ -725,7 +725,21 @@ async def _map_messages(
725725
elif isinstance(message, ModelResponse):
726726
for item in message.parts:
727727
if isinstance(item, TextPart):
728-
openai_messages.append(responses.EasyInputMessageParam(role='assistant', content=item.content))
728+
openai_messages.append(
729+
responses.ResponseOutputMessageParam(
730+
id=item.id or '',
731+
role='assistant',
732+
content=[
733+
responses.ResponseOutputTextParam(
734+
text=item.content,
735+
type='output_text',
736+
annotations=[],
737+
)
738+
],
739+
status='completed',
740+
type='message',
741+
)
742+
)
729743
elif isinstance(item, ToolCallPart):
730744
openai_messages.append(self._map_tool_call(item))
731745
elif isinstance(item, ThinkingPart):
@@ -950,7 +964,7 @@ async def _get_event_iterator(self) -> AsyncIterator[ModelResponseStreamEvent]:
950964
pass
951965

952966
elif isinstance(chunk, responses.ResponseTextDeltaEvent):
953-
yield self._parts_manager.handle_text_delta(vendor_part_id=chunk.content_index, content=chunk.delta)
967+
yield self._parts_manager.handle_text_delta(vendor_part_id=chunk.item_id, content=chunk.delta)
954968

955969
elif isinstance(chunk, responses.ResponseReasoningSummaryTextDeltaEvent):
956970
yield self._parts_manager.handle_thinking_delta(

0 commit comments

Comments
 (0)