XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet
公开
关注 0 Fork 0 Star 0
UTF-8
import unittest
import time

from g4f.tools.run_tools import ThinkingProcessor, Reasoning


class TestThinkingProcessor(unittest.TestCase):
    def assertEqualReasoning(self, first, second, msg=None):
        if isinstance(first, Reasoning) and isinstance(second, Reasoning):
            if (
                first.status != second.status
                or first.is_thinking != second.is_thinking
                or first.token != second.token
                or first.label != second.label
            ):
                raise self.failureException(msg or f"{first.label} != {second.label}")
        elif first != second:
            raise self.failureException(msg or f"{first} != {second}")

    def test_non_thinking_chunk(self):
        chunk = "This is a regular text."
        expected_time, expected_result = 0, [chunk]
        actual_time, actual_result = ThinkingProcessor.process_thinking_chunk(chunk)
        self.assertEqual(actual_time, expected_time)
        self.assertEqual(actual_result, expected_result)

    def test_thinking_start(self):
        chunk = "Hello <think>World"
        expected_time = time.time()
        expected_result = [
            "Hello ",
            Reasoning(status="🤔 Is thinking...", is_thinking="<think>"),
            Reasoning("World"),
        ]
        actual_time, actual_result = ThinkingProcessor.process_thinking_chunk(chunk)
        self.assertAlmostEqual(actual_time, expected_time, delta=1)
        self.assertEqual(actual_result[0], expected_result[0])
        self.assertEqualReasoning(actual_result[1], expected_result[1])
        self.assertEqualReasoning(actual_result[2], expected_result[2])

    def test_thinking_end(self):
        start_time = time.time()
        chunk = "token</think> content after"
        expected_result = [
            Reasoning("token"),
            Reasoning(status="", is_thinking="</think>"),
            " content after",
        ]
        actual_time, actual_result = ThinkingProcessor.process_thinking_chunk(
            chunk, start_time
        )
        self.assertEqual(actual_time, 0)
        self.assertEqualReasoning(actual_result[0], expected_result[0])
        self.assertEqualReasoning(actual_result[1], expected_result[1])
        self.assertEqual(actual_result[2], expected_result[2])

    def test_thinking_start_and_end(self):
        start_time = time.time()
        chunk = "<think>token</think> content after"
        expected_result = [
            Reasoning(status="🤔 Is thinking...", is_thinking="<think>"),
            Reasoning("token"),
            Reasoning(status="", is_thinking="</think>"),
            " content after",
        ]
        actual_time, actual_result = ThinkingProcessor.process_thinking_chunk(
            chunk, start_time
        )
        self.assertEqual(actual_time, 0)
        self.assertEqualReasoning(actual_result[0], expected_result[0])
        self.assertEqualReasoning(actual_result[1], expected_result[1])
        self.assertEqualReasoning(actual_result[2], expected_result[2])
        self.assertEqual(actual_result[3], expected_result[3])

    def test_ongoing_thinking(self):
        start_time = time.time()
        chunk = "Still thinking..."
        expected_result = [Reasoning("Still thinking...")]
        actual_time, actual_result = ThinkingProcessor.process_thinking_chunk(
            chunk, start_time
        )
        self.assertEqual(actual_time, start_time)
        self.assertEqualReasoning(actual_result[0], expected_result[0])

    def test_chunk_with_text_after_think(self):
        chunk = "Start <think>Middle</think>End"
        expected_time = 0
        expected_result = [
            "Start ",
            Reasoning(status="🤔 Is thinking...", is_thinking="<think>"),
            Reasoning("Middle"),
            Reasoning(status="", is_thinking="</think>"),
            "End",
        ]
        actual_time, actual_result = ThinkingProcessor.process_thinking_chunk(chunk)
        self.assertEqual(actual_time, expected_time)
        for i in range(1, len(expected_result)):
            self.assertEqualReasoning(actual_result[i], expected_result[i])