Skip to content

Commit 8ce2b5e

Browse files
authored
feat: add daily token limit error handling and corresponding test (#16)
1 parent 084ed2e commit 8ce2b5e

3 files changed

Lines changed: 24 additions & 0 deletions

File tree

‎apps/gateway/internal/adapters/metering/client.go‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,9 @@ func userFacingMeteringError(method, path string, status int, envelope errorResp
295295
if envelope.Error.Code == domain.ErrCodeInsufficientBalance {
296296
wantStatus = http.StatusPaymentRequired
297297
wantType = domain.ErrTypePermission
298+
} else if envelope.Error.Code == domain.ErrCodeDailyTokenLimit {
299+
wantStatus = http.StatusTooManyRequests
300+
wantType = domain.ErrTypeRateLimit
298301
}
299302
}
300303

‎apps/gateway/internal/adapters/metering/client_test.go‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,3 +263,22 @@ func assertInternalMeteringError(t *testing.T, err error) {
263263
t.Fatalf("metadata = %#v, want metering dependency", gatewayErr.Metadata)
264264
}
265265
}
266+
267+
func TestClientReserve_MapsDailyTokenLimitWithoutRetry(t *testing.T) {
268+
var attempts atomic.Int32
269+
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
270+
attempts.Add(1)
271+
w.WriteHeader(http.StatusTooManyRequests)
272+
_, _ = w.Write([]byte(`{"error":{"type":"rate_limit_error","code":"daily_token_limit_exceeded","message":"Daily token quota reached"}}`))
273+
}))
274+
defer server.Close()
275+
client := NewClient(server.URL, "token", time.Second)
276+
_, err := client.Reserve(context.Background(), testAuth(), domain.EndpointChatCompletions, domain.GenerateRequest{PublicModelID: "model"}, testModel(), "gw-limit")
277+
var gatewayErr *domain.GatewayError
278+
if !errors.As(err, &gatewayErr) || gatewayErr.HTTPStatus != 429 || gatewayErr.Type != domain.ErrTypeRateLimit || gatewayErr.Code != domain.ErrCodeDailyTokenLimit {
279+
t.Fatalf("got %#v, want daily quota 429", err)
280+
}
281+
if attempts.Load() != 1 {
282+
t.Fatalf("quota error retried %d times", attempts.Load())
283+
}
284+
}

‎pkg/domain/error.go‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const (
1111
ErrTypePermission = "permission_error"
1212
ErrTypeProvider = "provider_error"
1313
ErrTypeInternal = "internal_error"
14+
ErrTypeRateLimit = "rate_limit_error"
1415
)
1516

1617
// Error codes as defined in the spec.
@@ -33,6 +34,7 @@ const (
3334
ErrCodeInvalidField = "invalid_field"
3435
ErrCodeUnknownField = "unknown_field"
3536
ErrCodeInsufficientBalance = "insufficient_balance"
37+
ErrCodeDailyTokenLimit = "daily_token_limit_exceeded"
3638
ErrCodeClientCanceled = "client_canceled"
3739
ErrCodeInternalError = "internal_error"
3840
)

0 commit comments

Comments
 (0)