import unittest
from types import SimpleNamespace

import requests

from sglang.srt.utils import is_hip
from sglang.test.run_eval import run_eval
from sglang.test.server_fixtures.eagle_fixture import EagleServerBase
from sglang.test.test_utils import (
    DEFAULT_DRAFT_MODEL_EAGLE3,
    DEFAULT_TARGET_MODEL_EAGLE3,
)

_is_hip = is_hip()


class TestEagle3Basic(EagleServerBase):
    target_model = DEFAULT_TARGET_MODEL_EAGLE3
    draft_model = DEFAULT_DRAFT_MODEL_EAGLE3

    spec_algo = "EAGLE3"
    spec_steps = 2
    spec_topk = 1
    spec_tokens = 3
    extra_args = (
        [
            "--dtype=float16",
            "--chunked-prefill-size",
            1024,
            "--attention-backend",
            "aiter",
        ]
        if _is_hip
        else ["--dtype=float16", "--chunked-prefill-size", 1024]
    )

    def test_mmlu(self):
        """Override to add EAGLE-specific assertions"""
        args = SimpleNamespace(
            base_url=self.base_url,
            model=self.target_model,
            eval_name="mmlu",
            num_examples=64,
            num_threads=32,
        )

        metrics = run_eval(args)
        self.assertGreaterEqual(metrics["score"], 0.72)

        server_info = requests.get(self.base_url + "/server_info").json()
        avg_spec_accept_length = server_info["internal_states"][0][
            "avg_spec_accept_length"
        ]
        print(f"{avg_spec_accept_length=}")
        if _is_hip:
            self.assertGreater(avg_spec_accept_length, 2.24)
        else:
            self.assertGreater(avg_spec_accept_length, 2.26)


if __name__ == "__main__":

    unittest.main()
