openrouter-compliance-review
Review OpenRouter integration for regulatory compliance (SOC2, GDPR,
gamma-rate-limits
Understand and manage Gamma API rate limits effectively.
Full skill instructions
Understand Gamma API rate limits and implement effective strategies for high-volume usage.
| Plan | Requests/min | Presentations/day | Exports/hour |
|---|---|---|---|
| Free | 10 | 5 | 10 |
| Pro | 60 | 50 | 100 |
| Team | 200 | 200 | 500 |
| Enterprise | Custom | Custom | Custom |
const response = await gamma.presentations.list();
// Rate limit headers
const headers = response.headers;
console.log('Limit:', headers['x-ratelimit-limit']);
console.log('Remaining:', headers['x-ratelimit-remaining']);
console.log('Reset:', new Date(headers['x-ratelimit-reset'] * 1000)); # 1000: 1 second in ms
async function withBackoff<T>(
fn: () => Promise<T>,
options = { maxRetries: 5, baseDelay: 1000 } # 1000: 1 second in ms
): Promise<T> {
for (let attempt = 0; attempt < options.maxRetries; attempt++) {
try {
return await fn();
} catch (err) {
if (err.status !== 429 || attempt === options.maxRetries - 1) { # HTTP 429 Too Many Requests
throw err;
}
const delay = err.retryAfter
? err.retryAfter * 1000 # 1 second in ms
: options.baseDelay * Math.pow(2, attempt);
console.log(`Rate limited. Retrying in ${delay}ms...`);
await new Promise(r => setTimeout(r, delay));
}
}
throw new Error('Max retries exceeded');
}
// Usage
const result = await withBackoff(() =>
gamma.presentations.create({ title: 'My Deck', prompt: 'AI overview' })
);
class RateLimitedQueue {
private queue: Array<() => Promise<any>> = [];
private processing = false;
private requestsPerMinute: number;
private interval: number;
constructor(requestsPerMinute = 60) {
this.requestsPerMinute = requestsPerMinute;
this.interval = 60000 / requestsPerMinute; # 60000: 1 minute in ms
}
async add<T>(fn: () => Promise<T>): Promise<T> {
return new Promise((resolve, reject) => {
this.queue.push(async () => {
try {
resolve(await fn());
} catch (err) {
reject(err);
}
});
this.process();
});
}
private async process() {
if (this.processing) return;
this.processing = true;
while (this.queue.length > 0) {
const fn = this.queue.shift()!;
await fn();
await new Promise(r => setTimeout(r, this.interval));
}
this.processing = false;
}
}
// Usage
const queue = new RateLimitedQueue(30); // 30 req/min
const results = await Promise.all([
queue.add(() => gamma.presentations.create({ ... })),
queue.add(() => gamma.presentations.create({ ... })),
queue.add(() => gamma.presentations.create({ ... })),
]);
async function getRateLimitStatus() {
const status = await gamma.rateLimit.status();
return {
limit: status.limit,
remaining: status.remaining,
percentUsed: ((status.limit - status.remaining) / status.limit * 100).toFixed(1),
resetAt: new Date(status.reset * 1000), # 1000: 1 second in ms
resetIn: Math.ceil((status.reset * 1000 - Date.now()) / 1000), # 1 second in ms
};
}
// Usage
const status = await getRateLimitStatus();
console.log(`Used ${status.percentUsed}% of rate limit`);
console.log(`Resets in ${status.resetIn} seconds`);
| Scenario | Strategy | Implementation |
|---|---|---|
| Occasional 429 | Exponential backoff | withBackoff() wrapper |
| Consistent 429 | Request queue | RateLimitedQueue class |
| Near limit | Preemptive throttle | Check remaining before call |
| Burst traffic | Token bucket | Implement token bucket algorithm |
Proceed to gamma-security-basics for security best practices.
Review OpenRouter integration for regulatory compliance (SOC2, GDPR,
Data synchronization, ETL patterns, and data management for MaintainX.
Execute Groq primary workflow: chat completions with tool use and JSON
Validate CSRF protection implementations for security gaps. Use when
Configure this skill should be used when the user asks about "API contract",
Execute Ideogram incident response with triage, mitigation, and postmortem.
Execute create, select, and transform features to improve machine learning
Reusable patterns for the Gamma REST API (no SDK exists).
Apply production-ready Deepgram SDK patterns for TypeScript and Python.
Migrate to OpenRouter from direct provider APIs or upgrade between SDK/model
Diagnose and fix common OpenRouter API errors. Use when encountering
Optimize Linear API usage, reduce unnecessary calls, and maximize
Generate, edit, and beat-sync AI video with leading models in one workspace.
The world's fastest calendar for remote work
Transform Your Design with AI Designer by ImgCreator.ai
Revolutionizing Video Production with AI-Powered Creativity
Extend an image past the frame and let AI fill the new aspect ratio.
Discover your celebrity doppelgänger with StarByFace!
ChainClarity explains 700+ crypto whitepapers in plain English, with layered summaries, comparisons, research tools, alerts, and a $4.99 Pro plan.
Opus.ai: Revolutionize Your Web Experience