home / skills / jeremylongshore / claude-code-plugins-plus-skills / gamma-performance-tuning

This skill helps you optimize Gamma API performance and reduce latency by configuring clients, caching, parallel requests, and pagination.

npx playbooks add skill jeremylongshore/claude-code-plugins-plus-skills --skill gamma-performance-tuning

Review the files below or copy the command above to add this skill to your agents.

Files (1)
SKILL.md
5.1 KB
---
name: gamma-performance-tuning
description: |
  Optimize Gamma API performance and reduce latency.
  Use when experiencing slow response times, optimizing throughput,
  or improving user experience with Gamma integrations.
  Trigger with phrases like "gamma performance", "gamma slow",
  "gamma latency", "gamma optimization", "gamma speed".
allowed-tools: Read, Write, Edit
version: 1.0.0
license: MIT
author: Jeremy Longshore <[email protected]>
---

# Gamma Performance Tuning

## Overview
Optimize Gamma API integration performance for faster response times and better throughput.

## Prerequisites
- Working Gamma integration
- Performance monitoring tools
- Understanding of caching concepts

## Instructions

### Step 1: Client Configuration Optimization
```typescript
import { GammaClient } from '@gamma/sdk';

const gamma = new GammaClient({
  apiKey: process.env.GAMMA_API_KEY,

  // Connection optimization
  timeout: 30000,
  keepAlive: true,
  maxSockets: 10,

  // Retry configuration
  retries: 3,
  retryDelay: 1000,
  retryCondition: (err) => err.status >= 500 || err.status === 429,

  // Compression
  compression: true,
});
```

### Step 2: Response Caching
```typescript
import NodeCache from 'node-cache';

const cache = new NodeCache({
  stdTTL: 300, // 5 minutes default
  checkperiod: 60,
});

async function getCachedPresentation(id: string) {
  const cacheKey = `presentation:${id}`;

  // Check cache first
  const cached = cache.get(cacheKey);
  if (cached) {
    return cached;
  }

  // Fetch from API
  const presentation = await gamma.presentations.get(id);

  // Cache the result
  cache.set(cacheKey, presentation);

  return presentation;
}

// Cache invalidation on updates
gamma.on('presentation.updated', (event) => {
  cache.del(`presentation:${event.data.id}`);
});
```

### Step 3: Parallel Request Optimization
```typescript
// Instead of sequential requests
async function getSequential(ids: string[]) {
  const results = [];
  for (const id of ids) {
    results.push(await gamma.presentations.get(id)); // Slow!
  }
  return results;
}

// Use parallel requests with concurrency control
import pLimit from 'p-limit';

const limit = pLimit(5); // Max 5 concurrent requests

async function getParallel(ids: string[]) {
  return Promise.all(
    ids.map(id => limit(() => gamma.presentations.get(id)))
  );
}

// Batch API if available
async function getBatch(ids: string[]) {
  return gamma.presentations.getBatch(ids); // Single request for multiple items
}
```

### Step 4: Lazy Loading and Pagination
```typescript
// Pagination for large lists
async function* getAllPresentations() {
  let cursor: string | undefined;

  do {
    const page = await gamma.presentations.list({
      limit: 100,
      cursor,
    });

    for (const presentation of page.items) {
      yield presentation;
    }

    cursor = page.nextCursor;
  } while (cursor);
}

// Usage
for await (const presentation of getAllPresentations()) {
  // Process one at a time, memory efficient
}
```

### Step 5: Request Optimization
```typescript
// Only request needed fields
const presentation = await gamma.presentations.get(id, {
  fields: ['id', 'title', 'url', 'updatedAt'], // Skip large fields
});

// Avoid redundant API calls
const createOptions = {
  title: 'My Presentation',
  prompt: 'AI content',
  returnImmediately: true, // Don't wait for generation
};

const { id, statusUrl } = await gamma.presentations.create(createOptions);

// Poll status separately if needed
const status = await gamma.presentations.status(id);
```

### Step 6: Connection Pooling
```typescript
import http from 'http';
import https from 'https';

// Reuse connections
const httpAgent = new http.Agent({
  keepAlive: true,
  maxSockets: 25,
  maxFreeSockets: 10,
  timeout: 60000,
});

const httpsAgent = new https.Agent({
  keepAlive: true,
  maxSockets: 25,
  maxFreeSockets: 10,
  timeout: 60000,
});

const gamma = new GammaClient({
  apiKey: process.env.GAMMA_API_KEY,
  httpAgent,
  httpsAgent,
});
```

## Performance Metrics

### Monitoring Setup
```typescript
import { performance } from 'perf_hooks';

async function timedRequest<T>(name: string, fn: () => Promise<T>): Promise<T> {
  const start = performance.now();

  try {
    const result = await fn();
    const duration = performance.now() - start;

    console.log(`[PERF] ${name}: ${duration.toFixed(2)}ms`);
    metrics.recordLatency(name, duration);

    return result;
  } catch (err) {
    const duration = performance.now() - start;
    console.log(`[PERF] ${name} FAILED: ${duration.toFixed(2)}ms`);
    throw err;
  }
}

// Usage
const presentation = await timedRequest('gamma.get', () =>
  gamma.presentations.get(id)
);
```

## Performance Targets

| Operation | Target | Action if Exceeded |
|-----------|--------|-------------------|
| Simple GET | < 200ms | Check network, use caching |
| List (100 items) | < 500ms | Reduce page size |
| Create presentation | < 5s | Use async pattern |
| Export PDF | < 30s | Use webhook notification |

## Resources
- [Gamma Performance Guide](https://gamma.app/docs/performance)
- [Node.js Performance](https://nodejs.org/en/docs/guides/dont-block-the-event-loop)

## Next Steps
Proceed to `gamma-cost-tuning` for cost optimization.

Overview

This skill helps optimize Gamma API integrations to reduce latency, increase throughput, and improve end-user responsiveness. It provides practical configuration, caching, request patterns, and monitoring techniques to make Gamma-powered features faster and more reliable. Followable steps cover client tuning, concurrency control, and targeted request shaping.

How this skill works

The skill inspects common latency sources and applies pragmatic fixes: client-side timeouts and connection pooling, response caching and invalidation, controlled parallelism and batching, lazy loading with pagination, and field-level request trimming. It also adds lightweight timing hooks to measure per-operation latency and trigger corrective actions when targets are exceeded.

When to use it

  • When Gamma-powered features respond slowly or intermittently
  • Before launching high-throughput workloads or bulk imports
  • When end-user experience requires faster perceived load times
  • When diagnosing spikes in error rates or 429/5xx responses
  • When aiming to reduce costs by avoiding redundant API calls

Best practices

  • Set sensible timeouts, keepAlive, and limited maxSockets on the client
  • Cache stable read responses with TTL and invalidate on updates
  • Use controlled concurrency (p-limit) or batching instead of naive parallelism
  • Request only needed fields and use returnImmediately for async operations
  • Monitor per-operation latency and set actionable performance targets
  • Reuse HTTP/HTTPS agents to enable connection pooling

Example use cases

  • Speed up dashboard loading by caching presentation metadata and invalidating on update events
  • Process thousands of items by using paginated generators and limited concurrency to avoid rate limits
  • Reduce end-to-end time for presentation creation with async create + status polling
  • Improve bulk export throughput by batching IDs into a single API call when supported
  • Diagnose a latency regression by recording timedRequest metrics around critical Gamma calls

FAQ

How do I handle rate limits (429) effectively?

Implement retries with exponential backoff, respect Retry-After headers, and add concurrency limits or batching to reduce request volume.

When should I cache responses versus always fetching fresh data?

Cache when data is read-heavy and changes infrequently; set short TTLs for moderately dynamic content and invalidate cache on update events.