Synthèse automatique
Implémente la limitation de débit, le backoff exponentiel et la mise en file des requêtes pour l'API Lokalise.
Points forts
- Décrit précisément la limite de 6 requêtes par seconde et l'espacement minimal de 170 ms
- Fournit des exemples TypeScript prêts à l'emploi avec p-queue et @lokalise/node-api
- Explique la lecture des en-têtes X-RateLimit et Retry-After
- Inclut la pagination throttlée pour les opérations en masse
Limites
- Se concentre sur Node.js/TypeScript et ne fournit pas d'exemples dans d'autres langages
- Suppose l'utilisation de p-queue et du SDK officiel
- L'extrait de code de pagination est tronqué dans le SKILL.md
À utiliser lorsqu'on intègre l'API Lokalise et qu'on doit gérer les erreurs 429, les retries ou le débit des requêtes.
À éviter si l'on travaille avec une autre API ou si l'on cherche une solution de rate limiting générique indépendante de Lokalise.
Analyse de sécurité
SûrThe skill is pure documentation and TypeScript example code for implementing rate limiting, backoff, and request queuing against the Lokalise API. It declares only Read/Write/Edit tools and contains no shell execution, no network calls that exfiltrate data, no obfuscated payloads, and no instructions to disable safety. API tokens are read from environment variables, which is the correct pattern rather than hardcoding secrets.
Aucun point d'attention détecté
Comment cette analyse est faiteExemples
Add a request queue to my Lokalise API calls so we stay under 6 requests per second, and wrap 429 responses with exponential backoff.My Lokalise translation export sometimes fails with 429 Too Many Requests. Implement retry logic that respects the Retry-After header and adds jitter.Write a TypeScript helper that paginates through all Lokalise project keys with throttled requests and exponential backoff on failures.name: lokalise-rate-limits description: 'Implement Lokalise rate limiting, backoff, and request queuing patterns.
Use when handling rate limit errors, implementing retry logic,
or optimizing API request throughput for Lokalise.
Trigger with phrases like "lokalise rate limit", "lokalise throttling",
"lokalise 429", "lokalise retry", "lokalise backoff".
' allowed-tools: Read, Write, Edit version: 1.14.0 license: MIT author: Jeremy Longshore jeremy@intentsolutions.io tags:
- saas
- lokalise
- api compatibility: Designed for Claude Code, also compatible with Codex and OpenClaw
Lokalise Rate Limits
Overview
Lokalise enforces a strict 6 requests per second rate limit across all API endpoints (https://api.lokalise.com/api2). Exceeding this triggers a 429 Too Many Requests response. This skill covers request queuing with 170ms minimum spacing, exponential backoff for 429 recovery, bulk operation throttling, and proactive quota monitoring via response headers.
Prerequisites
@lokalise/node-apiSDK installed (npm install @lokalise/node-api)- API token configured (read or read/write scope depending on operations)
- Node.js 18+ for native
AbortControllersupport in timeout handling
Instructions
1. Understand the Rate Limit Headers
Every Lokalise API response includes rate limit headers:
X-RateLimit-Limit: 6 # Max requests per second
X-RateLimit-Remaining: 4 # Requests remaining in current window
X-RateLimit-Reset: 1700000000 # Unix timestamp when the window resets
Retry-After: 1 # Seconds to wait (only on 429 responses)
Always read these headers. Never hardcode assumptions about the window — Lokalise may adjust limits per plan tier.
2. Implement a Request Queue with 170ms Spacing
Space requests at minimum 170ms apart (1000ms / 6 = ~167ms, rounded up). Use p-queue for concurrency control:
import PQueue from "p-queue";
const lokaliseQueue = new PQueue({
concurrency: 1,
interval: 170,
intervalCap: 1,
});
async function queuedRequest<T>(fn: () => Promise<T>): Promise<T> {
return lokaliseQueue.add(fn, { throwOnTimeout: true });
}
// Usage with the SDK
import { LokaliseApi } from "@lokalise/node-api";
const lokalise = new LokaliseApi({ apiKey: process.env.LOKALISE_API_TOKEN });
const keys = await queuedRequest(() =>
lokalise.keys().list({
project_id: "123456789.abcdefgh",
limit: 500,
page: 1,
})
);
3. Add Exponential Backoff for 429 Recovery
When a 429 occurs, honor the Retry-After header first. If absent, use exponential backoff with jitter:
async function withBackoff<T>(
fn: () => Promise<T>,
maxRetries = 5
): Promise<T> {
for (let attempt = 0; attempt <= maxRetries; attempt++) {
try {
return await fn();
} catch (error: any) {
if (error.code === 429 && attempt < maxRetries) {
const retryAfter = error.headers?.["retry-after"];
const baseDelay = retryAfter
? parseInt(retryAfter, 10) * 1000
: Math.pow(2, attempt) * 1000;
const jitter = Math.random() * 500;
const delay = baseDelay + jitter;
console.warn(
`Rate limited. Attempt ${attempt + 1}/${maxRetries}. ` +
`Waiting ${Math.round(delay)}ms...`
);
await new Promise((resolve) => setTimeout(resolve, delay));
continue;
}
throw error;
}
}
throw new Error("Max retries exceeded for Lokalise API request");
}
4. Throttle Bulk Operations
For operations that process many items (listing all keys, bulk translations), paginate with built-in throttling:
async function paginateAll<T>(
fetchPage: (page: number) => Promise<{ items: T[]; totalPages: number }>
): Promise<T[]> {
const allItems: T[] = [];
let page = 1;
let totalPages = 1;
do {
const result = await queuedRequest(() => fetchPage(page));
allItems.push(...result.items);
totalPages = result.totalPages;
page++;
} while (page <= totalPages);
return allItems;
}
// Fetch all keys across pages
const allKeys = await paginateAll(async (page) => {
const response = await lokalise.keys().list({
project_id: projectId,
limit: 500, // max per page
page,
});
return {
items: response.items,
totalPages: response.totalCount
? Math.ceil(response.totalCount / 500)
: 1,
};
});
For bulk key creation, batch into groups of 500 (API limit per request) and queue each batch:
async function bulkCreateKeys(
projectId: string,
keys: Array<{ key_name: string; platforms: string[] }>
): Promise<void> {
const batchSize = 500;
for (let i = 0; i < keys.length; i += batchSize) {
const batch = keys.slice(i, i + batchSize);
await queuedRequest(() =>
lokalise.keys().create({
project_id: projectId,
keys: batch,
})
);
console.log(
`Created keys ${i + 1}-${Math.min(i + batchSize, keys.length)} ` +
`of ${keys.length}`
);
}
}
5. Monitor Quota Proactively
Track remaining quota and preemptively slow down before hitting the limit:
let remainingRequests = 6;
let resetTimestamp = 0;
function updateQuota(headers: Record<string, string>): void {
remainingRequests = parseInt(headers["x-ratelimit-remaining"] ?? "6", 10);
resetTimestamp = parseInt(headers["x-ratelimit-reset"] ?? "0", 10);
}
async function throttleIfNeeded(): Promise<void> {
if (remainingRequests <= 1) {
const now = Math.floor(Date.now() / 1000);
const waitSeconds = Math.max(0, resetTimestamp - now) + 0.5;
console.warn(
`Quota nearly exhausted (${remainingRequests} remaining). ` +
`Pausing ${waitSeconds}s until reset.`
);
await new Promise((resolve) =>
setTimeout(resolve, waitSeconds * 1000)
);
}
}
Output
- Request queue enforcing 6 req/sec with 170ms minimum spacing between calls
- Automatic retry with exponential backoff + jitter on 429 responses
- Paginated fetching with throttling for bulk data retrieval
- Proactive throttling when
X-RateLimit-Remainingdrops to 1
Error Handling
| Header | Description | Action |
|--------|-------------|--------|
| X-RateLimit-Limit | Max requests per window (always 6) | Use as concurrency ceiling |
| X-RateLimit-Remaining | Requests left in current window | Pause proactively when <= 1 |
| X-RateLimit-Reset | Unix timestamp of window reset | Sleep until this time on exhaustion |
| Retry-After | Seconds to wait (only on 429) | Always honor this value exactly |
If you receive a 429 without Retry-After, default to 1 second then exponential backoff. Never retry more than 5 times — if consistently rate-limited, your architecture needs request consolidation, not more retries.
Examples
Complete Rate-Limited Client
import { LokaliseApi } from "@lokalise/node-api";
import PQueue from "p-queue";
class RateLimitedLokalise {
private api: LokaliseApi;
private queue: PQueue;
constructor(apiKey: string) {
this.api = new LokaliseApi({ apiKey });
this.queue = new PQueue({ concurrency: 1, interval: 170, intervalCap: 1 });
}
async request<T>(fn: (api: LokaliseApi) => Promise<T>): Promise<T> {
return this.queue.add(
() => withBackoff(() => fn(this.api)),
{ throwOnTimeout: true }
);
}
}
// Usage
const client = new RateLimitedLokalise(process.env.LOKALISE_API_TOKEN!);
const keys = await client.request((api) =>
api.keys().list({ project_id: "123456789.abcdefgh", limit: 500 })
);
CLI with Rate Limiting
# The lokalise2 CLI respects rate limits internally, but for scripted
# loops you need manual spacing:
for project_id in $(lokalise2 project list --token $TOKEN --format json \
| jq -r '.[].project_id'); do
lokalise2 file download \
--token "$LOKALISE_API_TOKEN" \
--project-id "$project_id" \
--format json \
--dest ./locales/"$project_id"/
sleep 0.2 # 200ms spacing
done
Resources
- Lokalise API Rate Limits
- p-queue — Promise-based queue with concurrency control
- @lokalise/node-api SDK
Next Steps
For handling specific API errors beyond rate limits, see lokalise-common-errors.
Du fichier au premier essai
Le téléchargement contient exactement le contenu affiché sur cette fiche. Cette copie peut différer de la dernière version du dépôt source.
Consulter la source et ses fichiers annexesCe téléchargement contient uniquement SKILL.md. Les scripts, références, modèles et dépendances éventuels ne sont pas inclus. Récupérez les fichiers nécessaires depuis la source en conservant leur arborescence avant de poursuivre.
1. Télécharger le fichier
Télécharger SKILL.mdDepuis la racine d’un projet de test, enregistrez le fichier sous .skill-downloads/lokalise-rate-limits-mrzxuqzx/SKILL.md, ou utilisez la commande suivante. Ce dossier sert à examiner la skill avant son installation.
Commande pour macOS/Linux ou WSL : un shell POSIX et curl sont nécessaires. Sous Windows sans WSL, utilisez le bouton de téléchargement et créez le dossier manuellement.
mkdir -p '.skill-downloads/lokalise-rate-limits-mrzxuqzx' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/lokalise-rate-limits-mrzxuqzx/download' --output '.skill-downloads/lokalise-rate-limits-mrzxuqzx/SKILL.md.part' && mv '.skill-downloads/lokalise-rate-limits-mrzxuqzx/SKILL.md.part' '.skill-downloads/lokalise-rate-limits-mrzxuqzx/SKILL.md'2. Vérifier les prérequis
Lisez SKILL.md avant de l’utiliser. Si le fichier cite des scripts ou services externes, examinez-les et préparez les accès nécessaires dans votre environnement de test.
Environnement déclaré par l’auteur : Designed for Claude Code, also compatible with Codex and OpenClaw
Outils déclarés par l’auteur (à vérifier dans votre agent) : Read, Write, Edit
Extrait original : Prerequisites
@lokalise/node-apiSDK installed (npm install @lokalise/node-api)- API token configured (read or read/write scope depending on operations)
- Node.js 18+ for native
AbortControllersupport in timeout handling
Les plateformes de la fiche sont des indications du catalogue. Les chemins ci-dessous suivent la documentation des outils ; ils ne prouvent pas que cette skill y a été exécutée. Aucune version minimale de ces outils n’est attestée pour cette fiche.
3. Charger la skill
Après vérification, copiez le dossier complet dans le projet avec l’une des commandes ci-dessous, puis ouvrez une nouvelle session de l’outil. La commande s’arrête si un dossier du même nom existe déjà : comparez les fichiers avant de le remplacer.
Claude Code
test -f '.skill-downloads/lokalise-rate-limits-mrzxuqzx/SKILL.md' && test -s '.skill-downloads/lokalise-rate-limits-mrzxuqzx/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/lokalise-rate-limits' && cp -R '.skill-downloads/lokalise-rate-limits-mrzxuqzx' '.claude/skills/lokalise-rate-limits'Codex
test -f '.skill-downloads/lokalise-rate-limits-mrzxuqzx/SKILL.md' && test -s '.skill-downloads/lokalise-rate-limits-mrzxuqzx/SKILL.md' && mkdir -p '.agents/skills' && test ! -e '.agents/skills/lokalise-rate-limits' && cp -R '.skill-downloads/lokalise-rate-limits-mrzxuqzx' '.agents/skills/lokalise-rate-limits'OpenSkills
OpenSkills doit déjà être installé. La procédure locale install/read est contrôlée avec OpenSkills 1.5.0, qui exige Node.js ≥ 20.6.0. Aucun slug du catalogue n’est résolu automatiquement.
Installation officielle d’OpenSkillsopenskills install './.skill-downloads/lokalise-rate-limits-mrzxuqzx'openskills read 'lokalise-rate-limits-mrzxuqzx'La lecture doit afficher le contenu du fichier installé et son dossier de base. Elle ne lance ni la skill ni ses dépendances.
Pour un agent qui lit AGENTS.md, synchronisez ensuite l’index. Cette commande modifie AGENTS.md : relisez le diff avant de l’utiliser.
openskills syncMode manuel ou autre outil : joignez SKILL.md à une conversation, ou ouvrez-le dans un agent capable de lire les fichiers. Ajoutez les ressources annexes nécessaires. Il n’existe pas de dossier universel reconnu par tous les outils.
4. Faire un premier essai
Utilisez une entrée courte et fictive : un endpoint d’API, un petit document ou un brief d’interface. Dans une nouvelle conversation, joignez le fichier ou donnez son chemin à l’agent, puis adaptez cette demande :
Lis .skill-downloads/lokalise-rate-limits-mrzxuqzx/SKILL.md et applique ses instructions à cet exemple : [décrire une entrée de test]. Indique les fichiers, dépendances ou accès qui manquent. Produis le résultat demandé par la skill sans inventer de données ni exécuter de script non examiné.Résultat attendu : une sortie correspondant aux instructions de la skill, ou une liste précise des prérequis manquants. Une simple confirmation de lecture ne valide pas le premier usage. Si une ressource externe est indisponible, ce parcours reste à tester.
Bonnes pratiques React Hook Form
Developpement
Maîtrisez React Hook Form : évitez les anti-patterns, gérez les abonnements, et traitez correctement reset, dirty state et entrées contrôlées.
Migration Emotion vers Mantine
Developpement
Migrer les styled-components Emotion vers des composants Mantine avec style props et modules CSS. Pour convertir .styled.tsx ou supprimer les imports @emotion.
Détecteur de dérive de périmètre
Developpement
Analyse les diffs git par rapport à une intention pour détecter la dérive de périmètre, fichiers non liés et PR trop larges, puis suggère de garder, diviser ou justifier.