Skip to content

Commit 526712a

Browse files
committed
✨ feat: Add rate limit to Gemini API requests
1 parent b16d70b commit 526712a

File tree

2 files changed

+14
-5
lines changed

2 files changed

+14
-5
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ require (
1212
github.com/pgvector/pgvector-go v0.3.0
1313
github.com/redis/go-redis/v9 v9.11.0
1414
github.com/stretchr/testify v1.10.0
15+
golang.org/x/time v0.11.0
1516
google.golang.org/genai v1.15.0
1617
)
1718

@@ -45,7 +46,6 @@ require (
4546
golang.org/x/sync v0.14.0 // indirect
4647
golang.org/x/sys v0.33.0 // indirect
4748
golang.org/x/text v0.25.0 // indirect
48-
golang.org/x/time v0.11.0 // indirect
4949
google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect
5050
google.golang.org/grpc v1.66.2 // indirect
5151
google.golang.org/protobuf v1.34.2 // indirect

internal/embed/embed.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"log/slog"
88

99
_ "github.com/joho/godotenv/autoload"
10+
"golang.org/x/time/rate"
1011
"google.golang.org/genai"
1112
)
1213

@@ -15,8 +16,9 @@ type Embedder interface {
1516
}
1617

1718
type GeminiEmbedder struct {
18-
client *genai.Client
19-
logger *slog.Logger
19+
client *genai.Client
20+
logger *slog.Logger
21+
limiter *rate.Limiter
2022
}
2123

2224
func NewGeminiEmbedder(ctx context.Context, logger *slog.Logger, apiKey string) (*GeminiEmbedder, error) {
@@ -35,13 +37,20 @@ func NewGeminiEmbedder(ctx context.Context, logger *slog.Logger, apiKey string)
3537
}
3638

3739
return &GeminiEmbedder{
38-
client: client,
39-
logger: logger,
40+
client: client,
41+
logger: logger,
42+
limiter: rate.NewLimiter(rate.Limit(5), 2), // 5 requests/sec, with up to 2 sent instantly in a burst
4043
}, nil
4144
}
4245

4346
func (g *GeminiEmbedder) Embed(ctx context.Context, input string) ([]float32, error) {
4447
dim := int32(768)
48+
49+
if err := g.limiter.Wait(ctx); err != nil {
50+
g.logger.Warn("rate limiter blocked request", "error", err)
51+
return nil, fmt.Errorf("rate limit exceeded: %w", err)
52+
}
53+
4554
contents := []*genai.Content{
4655
genai.NewContentFromText(input, genai.RoleUser),
4756
}

0 commit comments

Comments
 (0)