Limiteur de Taux
Empêche un utilisateur unique d'inonder votre Endpoint d'IA avec des requêtes. Utilise un algorithme de fenêtre glissante avec suivi des tokens et requêtes par utilisateur.
const guard = new Guardian({
rateLimit: {
maxRequests: 10, // Max 10 requêtes...
windowMs: 60_000, // ...par 60 secondes
maxTokens: 50_000, // Limite aussi le total des tokens par fenêtre
keyFn: (prompt) => getUserId(prompt), // Comment identifier l'utilisateur
},
});Configuration
| Option | Type | Défaut | Description |
|---|---|---|---|
maxRequests |
number |
100 |
Requêtes max par fenêtre |
windowMs |
number |
60000 |
Taille de la fenêtre en millisecondes |
maxTokens |
number |
undefined |
Total de tokens max par fenêtre |
keyFn |
(prompt: string) => string |
() => 'global' |
Fonction d'identification utilisateur |
store |
RateLimitStore |
In-memory | Backend de stockage personnalisé |
Limitation Basée sur les Requêtes
const guard = new Guardian({
rateLimit: {
maxRequests: 5,
windowMs: 60_000, // 5 requêtes par minute et par utilisateur
keyFn: (p) => p.userId,
},
});
// À la 6e requête dans la fenêtre :
try {
await guard.protect(callFn, prompt);
} catch (err) {
if (err instanceof RateLimitError) {
const retryAfter = Math.ceil(err.context.resetInMs / 1000);
return Response.json(
{ error: 'Trop de requêtes', retryAfter },
{ status: 429, headers: { 'Retry-After': String(retryAfter) } }
);
}
}Limitation Basée sur les Tokens
const guard = new Guardian({
rateLimit: {
maxTokens: 100_000, // 100K tokens par utilisateur par heure
windowMs: 3_600_000,
keyFn: (p) => p.userId,
},
});Stockage Personnalisé (Redis)
Remplacez la mémoire par défaut par Redis pour les déploiements multi-instances :
import { RedisRateLimitStore } from '@edwinfom/ai-guard/rate-limit';
import { Redis } from 'ioredis';
const guard = new Guardian({
rateLimit: {
maxRequests: 20,
windowMs: 60_000,
store: new RedisRateLimitStore(new Redis(process.env.REDIS_URL)),
},
});Métadonnées de Résultat
const result = await guard.protect(callFn, prompt);
console.log(result.meta.rateLimit);
// {
// remaining: 7, // Requêtes restantes dans la fenêtre actuelle
// reset: 1737000000, // Timestamp Unix de réinitialisation de la fenêtre
// total: 10, // Total autorisé par fenêtre
// }