Skip to content

Commit 28578bf

Browse files
committed
- fix case multiple_thinking_parts_with_text_between
1 parent 5fae762 commit 28578bf

File tree

1 file changed

+27
-14
lines changed

1 file changed

+27
-14
lines changed

pydantic_ai_slim/pydantic_ai/_parts_manager.py

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ def _handle_text_delta_simple(
330330
ignore_leading_whitespace=ignore_leading_whitespace,
331331
)
332332

333-
def _handle_text_delta_with_thinking_tags(
333+
def _handle_text_delta_with_thinking_tags( # noqa: C901
334334
self,
335335
*,
336336
vendor_part_id: VendorId,
@@ -390,20 +390,33 @@ def _handle_text_delta_with_thinking_tags(
390390

391391
for i, (segment_type, segment_content) in enumerate(segments):
392392
if segment_type == 'text':
393-
# Skip whitespace-only text before a thinking tag when ignore_leading_whitespace=True
394-
skip_whitespace_before_tag = (
395-
ignore_leading_whitespace
396-
and segment_content.isspace()
397-
and i + 1 < len(segments)
398-
and segments[i + 1][0] == 'start_tag'
393+
yield from self._emit_text_part(
394+
vendor_part_id=vendor_part_id,
395+
content=segment_content,
396+
id=id,
397+
ignore_leading_whitespace=ignore_leading_whitespace,
399398
)
400-
if not skip_whitespace_before_tag: # praga: no cover - line was always true (this is probably dead code, will remove after double checking)
401-
yield from self._emit_text_part(
402-
vendor_part_id=vendor_part_id,
403-
content=segment_content,
404-
id=id,
405-
ignore_leading_whitespace=ignore_leading_whitespace,
406-
)
399+
# After emitting TextPart, reconstruct remaining segments as literal text
400+
remaining_segments = segments[i + 1 :]
401+
if remaining_segments:
402+
reconstructed = ''
403+
for seg_type, seg_content in remaining_segments:
404+
if seg_type == 'text': # pragma: no cover - line was always true
405+
reconstructed += seg_content
406+
elif seg_type == 'start_tag':
407+
reconstructed += start_tag
408+
elif seg_type == 'thinking':
409+
reconstructed += seg_content
410+
elif seg_type == 'end_tag': # pragma: no cover - partial, line was always true
411+
reconstructed += end_tag
412+
if reconstructed: # pragma: no cover - partial, line was always true
413+
yield from self._emit_text_part(
414+
vendor_part_id=vendor_part_id,
415+
content=reconstructed,
416+
id=id,
417+
ignore_leading_whitespace=False,
418+
)
419+
break
407420
elif segment_type == 'start_tag':
408421
self._vendor_id_to_part_index.pop(vendor_part_id, None)
409422
new_part_index = len(self._parts)

0 commit comments

Comments
 (0)