crucible-env / scripts /test_rate_limiter.py
Farbricated
v3.0
3c1121f
Raw History Blame Contribute Delete
1.95 kB
"""Test the token-aware rate limiter and retry-after parser."""
import time
from utils.llm_client import (
_parse_groq_retry_after, _estimate_tokens,
_groq_limiter, backend_info, get_call_stats, active_backend,
_GROQ_TPM_LIMIT, _GROQ_TPM_EFFECTIVE,
)
print("=== _parse_groq_retry_after ===")
cases = [
("Rate limit reached ... Please try again in 12.345s.", 12.845),
("please try again in 5s", 5.5),
("Rate limit ... Please try again in 1m3.5s", 64.0),
("some other error with no time", 10.0),
]
all_ok = True
for msg, expected in cases:
got = _parse_groq_retry_after(msg)
ok = abs(got - expected) < 1.0
all_ok = all_ok and ok
print(f" [{'OK' if ok else 'FAIL'}] got={got:.2f} expected~{expected:.2f}")
print()
print("=== _estimate_tokens ===")
est = _estimate_tokens("system prompt here", "user message here", 300)
print(f" Short prompt + max_tokens=300 -> estimate={est}")
assert 300 <= est <= 400, f"Unexpected estimate: {est}"
print(" OK")
print()
print("=== Sliding-window rate limiter ===")
# Use a tiny limit for a non-blocking test
_groq_limiter.tpm_effective = 200
from collections import deque
_groq_limiter._window = deque() # reset
_groq_limiter.record(180) # fill 180/200
t0 = time.monotonic()
_groq_limiter.acquire(10) # 190/200 — should pass immediately
elapsed = time.monotonic() - t0
print(f" acquire(10) after 180 used: {elapsed:.3f}s (expect <0.1s)")
assert elapsed < 0.5, "Should not have waited!"
print()
print("=== backend_info ===")
info = backend_info()
for k, v in info.items():
print(f" {k}: {v}")
print()
print(f"GROQ_TPM_LIMIT : {_GROQ_TPM_LIMIT}")
print(f"GROQ_TPM_EFFECTIVE: {_GROQ_TPM_EFFECTIVE} (85% safety margin)")
print(f"Active backend : {active_backend()}")
print()
if all_ok:
print("ALL TESTS PASSED")
else:
print("SOME TESTS FAILED — check output above")