Agent Skills
Discover and share powerful Agent Skills for AI assistants
gamma-rate-limits - Agent Skill - Agent Skills
Home/ Skills / gamma-rate-limits Understand and manage Gamma API rate limits effectively.
Use when hitting rate limits, optimizing API usage,
or implementing request queuing systems.
Trigger with phrases like "gamma rate limit", "gamma quota",
"gamma 429", "gamma throttle", "gamma request limits".
Use the skills CLI to install this skill with one command. Auto-detects all installed AI assistants.
Method 1 - skills CLI
npx skills i jeremylongshore/claude-code-plugins-plus-skills/plugins/saas-packs/gamma-pack/skills/gamma-rate-limits CopyMethod 2 - openskills (supports sync & update)
npx openskills install jeremylongshore/claude-code-plugins-plus-skills CopyAuto-detects Claude Code, Cursor, Codex CLI, Gemini CLI, and more. One install, works everywhere.
Installation Path
Download and extract to one of the following locations:
Claude Code Cursor OpenCode Gemini CLI Codex CLI
~/.claude/skills/gamma-rate-limits/ Back No setup needed. Let our cloud agents run this skill for you.
Select Model
Claude Haiku 4.5 $0.10 Claude Sonnet 4.5 $0.20 Claude Opus 4.5 $0.50 Claude Sonnet 4.5 $0.20 /task
Best for coding tasks
Try NowNo setup required
Gamma Rate Limits
Overview
Understand Gamma API rate limits and implement effective strategies for high-volume usage.
Prerequisites
Active Gamma API integration
Understanding of HTTP headers
Basic queuing concepts
Rate Limit Tiers
Plan Requests/min Presentations/day Exports/hour Free 10 5 10 Pro 60 50 100 Team 200 200 500 Enterprise Custom Custom Custom
Instructions
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
Step 2: Implement Exponential Backoff
async function withBackoff < T >(
fn : () => Promise < T >,
options = { maxRetries: 5 , baseDelay: 1000 } # 1000 : 1 second in ms
)
Step 3: Request Queue
class RateLimitedQueue {
private queue : Array <() => Promise < any >> = [];
private processing = false ;
private requestsPerMinute :
Step 4: Monitor Usage
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
Output
Rate limit aware API calls
Automatic retry with backoff
Request queuing system
Usage monitoring dashboard
Error Handling
Scenario Strategy Implementation Occasional 429 Exponential backoff withBackoff() wrapperConsistent 429 Request queue RateLimitedQueue classNear limit Preemptive throttle Check remaining before call Burst traffic Token bucket Implement token bucket algorithm
Resources
Next Steps
Proceed to gamma-security-basics for security best practices.
(headers[
'x-ratelimit-reset'
]
*
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' })
);
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 ({ ... })),
]);
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` );