diff --git a/pydantic_ai_slim/pydantic_ai/_thinking_part.py b/pydantic_ai_slim/pydantic_ai/_thinking_part.py index fa10b4e0e..a7ba38fc0 100644 --- a/pydantic_ai_slim/pydantic_ai/_thinking_part.py +++ b/pydantic_ai_slim/pydantic_ai/_thinking_part.py @@ -16,21 +16,22 @@ def split_content_into_text_and_thinking(content: str) -> list[ThinkingPart | Te something else, we just match the tag to make it easier for other models that don't support the `ThinkingPart`. """ parts: list[ThinkingPart | TextPart] = [] - - start_index = content.find(START_THINK_TAG) - while start_index >= 0: - before_think, content = content[:start_index], content[start_index + len(START_THINK_TAG) :] - if before_think: - parts.append(TextPart(content=before_think)) - end_index = content.find(END_THINK_TAG) - if end_index >= 0: - think_content, content = content[:end_index], content[end_index + len(END_THINK_TAG) :] - parts.append(ThinkingPart(content=think_content)) - else: - # We lose the `` tag, but it shouldn't matter. - parts.append(TextPart(content=content)) - content = '' - start_index = content.find(START_THINK_TAG) - if content: - parts.append(TextPart(content=content)) + + start_index = 0 + while True: + start = content.find('', start_index) + if start < 0: + if start_index < len(content): + parts.append(TextPart(content=content[start_index:])) + break + if start > start_index: + parts.append(TextPart(content=content[start_index:start])) + think_start = start + 7 # len('') + end = content.find('', think_start) + if end < 0: + parts.append(TextPart(content=content[think_start:])) + break + if end > think_start: + parts.append(ThinkingPart(content=content[think_start:end])) + start_index = end + 8 # len('') return parts