Skip to content

Commit d2f8524

Browse files
committed
More fixes to reasoning
1 parent bccdb69 commit d2f8524

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
@@ -486,6 +486,8 @@ class TextPart:
486486
part_kind: Literal['text'] = 'text'
487487
"""Part type identifier, this is available on all parts as a discriminator."""
488488

489+
id: str | None = None
490+
489491
def has_content(self) -> bool:
490492
"""Return `True` if the text content is non-empty."""
491493
return bool(self.content)
@@ -504,6 +506,8 @@ class ThinkingPart:
504506
part_kind: Literal['thinking'] = 'thinking'
505507
"""Part type identifier, this is available on all parts as a discriminator."""
506508

509+
id: str | None = None
510+
507511
def has_content(self) -> bool:
508512
"""Return `True` if the thinking content is non-empty."""
509513
return bool(self.content)

pydantic_ai_slim/pydantic_ai/models/openai.py

+16-2
Original file line numberDiff line numberDiff line change
@@ -727,7 +727,21 @@ async def _map_messages(
727727
elif isinstance(message, ModelResponse):
728728
for item in message.parts:
729729
if isinstance(item, TextPart):
730-
openai_messages.append(responses.EasyInputMessageParam(role='assistant', content=item.content))
730+
openai_messages.append(
731+
responses.ResponseOutputMessageParam(
732+
id=item.id or '',
733+
role='assistant',
734+
content=[
735+
responses.ResponseOutputTextParam(
736+
text=item.content,
737+
type='output_text',
738+
annotations=[],
739+
)
740+
],
741+
status='completed',
742+
type='message',
743+
)
744+
)
731745
elif isinstance(item, ToolCallPart):
732746
openai_messages.append(self._map_tool_call(item))
733747
elif isinstance(item, ThinkingPart):
@@ -952,7 +966,7 @@ async def _get_event_iterator(self) -> AsyncIterator[ModelResponseStreamEvent]:
952966
pass
953967

954968
elif isinstance(chunk, responses.ResponseTextDeltaEvent):
955-
yield self._parts_manager.handle_text_delta(vendor_part_id=chunk.content_index, content=chunk.delta)
969+
yield self._parts_manager.handle_text_delta(vendor_part_id=chunk.item_id, content=chunk.delta)
956970

957971
elif isinstance(chunk, responses.ResponseReasoningSummaryTextDeltaEvent):
958972
yield self._parts_manager.handle_thinking_delta(

0 commit comments

Comments
 (0)