Skip to content

dAppCore/go-ratelimit

Repository files navigation

Go Reference Licence: EUPL-1.2 Go Version

go-ratelimit

Provider-agnostic sliding window rate limiter for LLM API calls. Enforces requests per minute (RPM), tokens per minute (TPM), and requests per day (RPD) quotas per model using an in-memory sliding window. Ships with default quota profiles for Gemini, OpenAI, Anthropic, and a local inference provider. State persists across process restarts via YAML (single-process) or SQLite (multi-process, WAL mode). Includes a Gemini-specific token counting helper and a YAML-to-SQLite migration path.

Module: dappco.re/go/core/go-ratelimit Licence: EUPL-1.2 Language: Go 1.26

Quick Start

import "dappco.re/go/core/go-ratelimit"

// YAML backend (default, single-process)
rl, err := ratelimit.New()
if err != nil {
    log.Fatal(err)
}

// SQLite backend (multi-process)
rl, err = ratelimit.NewWithSQLite("/tmp/ratelimits.db")
if err != nil {
    log.Fatal(err)
}
defer rl.Close()

if rl.CanSend("gemini-2.0-flash", 1500) {
    rl.RecordUsage("gemini-2.0-flash", 1000, 500)
}

if err := rl.Persist(); err != nil {
    log.Fatal(err)
}

For agent workflows, Decide returns a structured verdict with retry guidance:

decision := rl.Decide("gemini-2.0-flash", 1500)
if !decision.Allowed {
    log.Printf("throttled (%s); retry after %s", decision.Code, decision.RetryAfter)
}

Documentation

  • Architecture — sliding window algorithm, provider quotas, YAML and SQLite backends
  • Development Guide — prerequisites, test patterns, coding standards
  • Project History — completed phases with commit hashes, known limitations

Build & Test

go build ./...
go test ./...
go test -race ./...
go vet ./...
go test -cover ./...
go mod tidy

Licence

European Union Public Licence 1.2.

About

Core ecosystem — go-ratelimit

Resources

License

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors

Languages