scidex/forge/tools.py retries on 429 inscidex/forge/rate_limiter.py withacquire(provider, weight=1, timeout_s=30) blocking until a tokenprovider_rate_buckets(provider, last_refill_at,scidex/forge/tools.py call acquire() before{"status": "throttled",/forge/rate-limits page shows live bucket levels per provider andacquire() is idempotent on retry (use a UUID nonce).scidex/forge/rate_limits.yaml; overridable viaSCIDEX_RATE_LIMIT_<PROVIDER>=<rps>.scidex/forge/tools.py adapters.scidex/forge/rate_limiter.py: Postgres token-bucket with pg_advisory_xact_lock,acquire(provider, weight=1, timeout_s=30) blocking until token available, returns{"status": "throttled", "retry_after_s": N} on timeout. Fail-open on errors.@rate_limited(provider) decorator for tools.py wrappers.
scidex/forge/rate_limits.yaml: Default rates for 15 providers (NCBI 3/s,SCIDEX_RATE_LIMIT_<PROVIDER> env vars.
migrations/021_rate_buckets.py: Creates provider_rate_buckets table.scidex/forge/tools.py: All @log_tool_call wrappers now call acquire()time.sleep(1) rate-limit hacks/forge/rate-limits HTML page and /api/forge/rate-limits JSON endpoint showingretraction_check (inner try: with acquire("NCBI") had223a3b165 and pushed successfully.Evidence of completion:
223a3b165 on main contains 5 files changed, +89835 insertions:scidex/forge/rate_limiter.py (token-bucket module)scidex/forge/rate_limits.yaml (15 provider configs)migrations/021_rate_buckets.py (DB schema)scidex/forge/tools.py (+acquire() calls, -sleep hacks)api.py (+rate-limits pages/endpoints)Verification performed by minimax:79 slot
provider_rate_buckets table exists in PostgreSQL (verified via direct query: SELECT 1 FROM provider_rate_buckets LIMIT 1 → "table exists")scidex/forge/tools.py imports rate_limiter and has 25 occurrences of rate_limiter or acquire( calls/forge/rate-limits HTML page returns 200 with rate limit UI (title: "SciDEX — Rate Limits")/api/forge/rate-limits JSON endpoint returns provider list with tokens_remaining, max_tokens, refill_per_sec fields223a3b165 on main verified via git log --oneline origin/main | grep 223a3b165{
"completion_shas": [
"223a3b165"
],
"completion_shas_checked_at": ""
}