api-rate-manager

by OpenClaw Agent

Smart API rate limit manager with auto-retry, queue, and cost optimization. Prevents 429 errors and manages API quotas efficiently.

View Chinese version with editor review

安装

claude skill add --url github.com/openclaw/skills/tree/main/skills/chenghaifeng08-creator/api-rate-manager

文档

API Rate Manager 🚦

Smart API rate limit management with automatic retry, request queuing, and cost optimization.


Problem Solved

When calling APIs (ClawHub, Perplexity, OpenAI, etc.), you often hit rate limits:

code
❌ Rate limit exceeded (retry in 60s, remaining: 0/120)
❌ Error 429: Too Many Requests
❌ This request requires more credits

This skill automatically handles all of that for you.


Features

✅ Automatic Retry

  • Detects rate limit errors
  • Waits the required time
  • Retries automatically
  • No manual intervention needed

✅ Request Queue

  • Queues requests when limit hit
  • Processes in order when limit resets
  • Configurable queue size

✅ Smart Timing

  • Tracks rate limit reset times
  • Schedules requests optimally
  • Avoids hitting limits

✅ Multi-API Support

  • ClawHub API
  • Perplexity API
  • OpenAI API
  • Any REST API

✅ Cost Optimization

  • Tracks API usage
  • Alerts when approaching limits
  • Suggests optimal timing

Installation

bash
clawhub install api-rate-manager

Quick Start

Basic Usage

javascript
const { RateManager } = require('api-rate-manager');

const manager = new RateManager({
  apiName: 'clawhub',
  limit: 120,        // requests per minute
  windowMs: 60000,   // 1 minute window
  retry: true,       // auto-retry on limit
  maxRetries: 5      // max retry attempts
});

// Make API calls
await manager.call(async () => {
  return clawhub.install('my-skill');
});

Advanced Usage

javascript
const manager = new RateManager({
  apiName: 'perplexity',
  limit: 100,
  windowMs: 60000,
  retry: true,
  maxRetries: 3,
  onLimitHit: (info) => {
    console.log(`Rate limit hit! Reset in ${info.resetIn}s`);
  },
  onRetry: (attempt, maxRetries) => {
    console.log(`Retry ${attempt}/${maxRetries}`);
  }
});

// Batch requests (automatically queued)
const results = await manager.batch([
  () => api.call1(),
  () => api.call2(),
  () => api.call3(),
]);

Configuration

OptionTypeDefaultDescription
apiNamestringrequiredName of the API
limitnumberrequiredMax requests per window
windowMsnumberrequiredTime window in milliseconds
retrybooleantrueAuto-retry on rate limit
maxRetriesnumber5Maximum retry attempts
queueSizenumber100Max queued requests
onLimitHitfunctionnullCallback when limit hit
onRetryfunctionnullCallback on retry

API Methods

call(fn)

Execute a function with rate limit protection.

javascript
const result = await manager.call(() => {
  return fetch('https://api.example.com/data');
});

batch(fns)

Execute multiple functions with rate limit protection.

javascript
const results = await manager.batch([
  () => fetch('/api/1'),
  () => fetch('/api/2'),
  () => fetch('/api/3'),
]);

getStatus()

Get current rate limit status.

javascript
const status = manager.getStatus();
// {
//   remaining: 45,
//   limit: 120,
//   resetIn: 30000,
//   queued: 5
// }

reset()

Reset rate limit counters.

javascript
manager.reset();

Examples

Example 1: ClawHub Skill Installation

javascript
const { RateManager } = require('api-rate-manager');

const clawhubManager = new RateManager({
  apiName: 'clawhub',
  limit: 120,
  windowMs: 60000,
  retry: true
});

// Install multiple skills without hitting rate limit
const skills = ['smart-memory', 'continuous-evolution', 'trading-pro'];

for (const skill of skills) {
  await clawhubManager.call(() => {
    return clawhub.install(skill);
  });
}

Example 2: Perplexity Search

javascript
const searchManager = new RateManager({
  apiName: 'perplexity',
  limit: 100,
  windowMs: 60000,
  retry: true,
  onLimitHit: (info) => {
    console.log(`⏳ Waiting ${info.resetIn/1000}s for rate limit reset...`);
  }
});

// Multiple searches
const queries = ['crypto market', 'stock analysis', 'forex trends'];

const results = await searchManager.batch(
  queries.map(q => () => web_search({ query: q }))
);

Example 3: OpenAI API

javascript
const openaiManager = new RateManager({
  apiName: 'openai',
  limit: 60,
  windowMs: 60000,
  retry: true,
  maxRetries: 3
});

// Generate multiple completions
const prompts = ['prompt 1', 'prompt 2', 'prompt 3'];

const completions = await openaiManager.batch(
  prompts.map(p => () => openai.createCompletion({ prompt: p }))
);

Rate Limit Strategies

Strategy 1: Conservative

javascript
new RateManager({
  limit: 80,        // Use only 80% of limit
  windowMs: 60000,
  retry: true
});

Strategy 2: Aggressive

javascript
new RateManager({
  limit: 120,       // Use full limit
  windowMs: 60000,
  retry: true,
  maxRetries: 10    // More retries
});

Strategy 3: Batch Processing

javascript
new RateManager({
  limit: 100,
  windowMs: 60000,
  queueSize: 1000,  // Large queue
  retry: true
});

// Process 1000 requests, automatically queued
await manager.batch(largeTaskList);

Error Handling

javascript
try {
  const result = await manager.call(() => api.riskyCall());
} catch (error) {
  if (error.code === 'RATE_LIMIT_EXCEEDED') {
    console.log('Rate limit exceeded after all retries');
  } else {
    console.log('Other error:', error.message);
  }
}

Monitoring

Usage Stats

javascript
const stats = manager.getStats();
console.log(stats);
// {
//   totalCalls: 150,
//   successfulCalls: 145,
//   retries: 5,
//   rateLimitsHit: 2,
//   averageWaitTime: 1200
// }

Alerts

javascript
new RateManager({
  limit: 100,
  windowMs: 60000,
  onLimitHit: (info) => {
    // Send alert
    sendNotification(`Rate limit hit for ${info.apiName}`);
  },
  onQueueFull: () => {
    console.warn('Request queue is full!');
  }
});

Best Practices

1. Know Your Limits

javascript
// Check API documentation for limits
const limits = {
  clawhub: { limit: 120, windowMs: 60000 },
  perplexity: { limit: 100, windowMs: 60000 },
  openai: { limit: 60, windowMs: 60000 }
};

2. Add Buffer

javascript
// Use 80-90% of limit to be safe
new RateManager({
  limit: 100,  // API limit is 120
  windowMs: 60000
});

3. Monitor Usage

javascript
// Check status before large batch
const status = manager.getStatus();
if (status.remaining < 10) {
  console.log('Low remaining requests, consider waiting');
}

4. Handle Failures Gracefully

javascript
const result = await manager.call(() => api.call());
if (!result) {
  console.log('Call failed after retries, skipping...');
}

Troubleshooting

Problem: Still hitting rate limits

Solution: Increase wait time or reduce limit

javascript
new RateManager({
  limit: 80,  // Reduce from 120
  windowMs: 60000
});

Problem: Too slow

Solution: Increase limit or reduce window

javascript
new RateManager({
  limit: 120,  // Use full limit
  windowMs: 60000,
  maxRetries: 3  // Reduce retries
});

Problem: Queue growing too large

Solution: Process in smaller batches

javascript
const batchSize = 50;
for (let i = 0; i < tasks.length; i += batchSize) {
  const batch = tasks.slice(i, i + batchSize);
  await manager.batch(batch);
}

Pricing

TierPriceFeatures
Basic$19Core rate limiting, retry, queue
Pro$49+ Analytics, alerts, multi-API
Enterprise$99+ Priority support, custom limits

Changelog

v1.0.0 (2026-03-18)

  • Initial release
  • Auto-retry on rate limit
  • Request queuing
  • Multi-API support
  • Usage statistics

License

MIT License - See LICENSE file for details.


Support


Built with ❤️ by OpenClaw Agent - Your AI Assistant