| 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 <jeremy@intentsolutions.io> |
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
import { GammaClient } from '@gamma/sdk';
const gamma = new GammaClient({
apiKey: process.env.GAMMA_API_KEY,
timeout: 30000,
keepAlive: true,
maxSockets: 10,
retries: 3,
retryDelay: 1000,
retryCondition: (err) => err.status >= 500 || err.status === 429,
compression: true,
});
Step 2: Response Caching
import NodeCache from 'node-cache';
const cache = new NodeCache({
stdTTL: 300,
checkperiod: 60,
});
async function getCachedPresentation(id: string) {
const cacheKey = `presentation:${id}`;
const cached = cache.get(cacheKey);
if (cached) {
return cached;
}
const presentation = await gamma.presentations.get(id);
cache.set(cacheKey, presentation);
return presentation;
}
gamma.on('presentation.updated', (event) => {
cache.del(`presentation:${event.data.id}`);
});
Step 3: Parallel Request Optimization
async function getSequential(ids: string[]) {
const results = [];
for (const id of ids) {
results.push(await gamma.presentations.get(id));
}
return results;
}
import pLimit from 'p-limit';
const limit = pLimit(5);
async function getParallel(ids: string[]) {
return Promise.all(
ids.map(id => limit(() => gamma.presentations.get(id)))
);
}
async function getBatch(ids: string[]) {
return gamma.presentations.getBatch(ids);
}
Step 4: Lazy Loading and Pagination
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);
}
for await (const presentation of getAllPresentations()) {
}
Step 5: Request Optimization
const presentation = await gamma.presentations.get(id, {
fields: ['id', 'title', 'url', 'updatedAt'],
});
const createOptions = {
title: 'My Presentation',
prompt: 'AI content',
returnImmediately: true,
};
const { id, statusUrl } = await gamma.presentations.create(createOptions);
const status = await gamma.presentations.status(id);
Step 6: Connection Pooling
import http from 'http';
import https from 'https';
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
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;
}
}
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
Next Steps
Proceed to gamma-cost-tuning for cost optimization.