evalstone/evalscope/tests/api/test_request_stats.py
sora 13274243a0 Bump vendored EvalScope and add K3-ready DPV4 configs.
Keep K3 suite selection and report-schema scoring in bash, merge K3/vision dataset_args into dpv4 yamls, and pin EvalScope at 735d920ee911 with local patches.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-02 07:30:48 +00:00

59 lines
2.1 KiB
Python

from evalscope.api.messages.request_stats import RequestStats, is_client_error
from evalscope.utils.function_utils import retry_call
class _FakeHTTPError(Exception):
def __init__(self, code=None, message=''):
super().__init__(message)
self.code = code
self.message = message
def test_is_client_error_context_length_and_content_filter():
assert is_client_error(_FakeHTTPError(code='context_length_exceeded', message='too long'))
assert is_client_error(_FakeHTTPError(code='content_filter', message='blocked'))
assert is_client_error(_FakeHTTPError(message='prompt is too long for the context window'))
assert not is_client_error(_FakeHTTPError(code='internal_error', message='upstream 500'))
assert not is_client_error(TimeoutError('timed out'))
def test_request_stats_success_rate_excludes_client_errors():
stats = RequestStats()
stats.on_attempt(True, None)
stats.on_attempt(True, None)
stats.on_attempt(False, TimeoutError('timeout'))
stats.on_attempt(False, _FakeHTTPError(code='context_length_exceeded', message='overflow'))
stats.record_logical(True)
stats.record_logical(True)
stats.record_logical(False)
snap = stats.snapshot()
assert snap['total_attempts'] == 4
assert snap['success_attempts'] == 2
assert snap['failed_attempts'] == 1
assert snap['client_errors'] == 1
# denominator is HTTP attempts that are vendor-channel (success + failed)
assert snap['success_rate'] == 0.6667
assert snap['logical_calls'] == 3
assert snap['logical_success'] == 2
assert snap['client_error_types'].get('_FakeHTTPError') == 1
def test_retry_call_on_attempt_counts_retries():
stats = RequestStats()
calls = {'n': 0}
def flaky():
calls['n'] += 1
if calls['n'] < 3:
raise TimeoutError('again')
return 'ok'
assert retry_call(flaky, retries=3, sleep_interval=0, on_attempt=stats.on_attempt) == 'ok'
snap = stats.snapshot()
assert snap['total_attempts'] == 3
assert snap['success_attempts'] == 1
assert snap['failed_attempts'] == 2
assert snap['success_rate'] == round(1 / 3, 4)