Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Optimize Ideogram API performance with caching, model selection, and parallel generation. Use when experiencing slow generation, implementing caching strategies, or optimizing throughput for Ideogram integrations. Trigger with phrases like "ideogram performance", "optimize ideogram", "ideogram latency", "ideogram caching", "ideogram slow", "ideogram speed".
.claude/skills/jeremylongshore-ideogram-performance-tuning/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | 29% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -3% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 55% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 61% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 89% | 0% |
Optimize Ideogram image generation for speed, cost, and throughput. Key levers: model and rendering speed selection, prompt-based caching, parallel generation with concurrency limits, and CDN delivery of generated assets.
| Model / Speed | Typical Latency | Relative Cost | Quality | |---------------|-----------------|---------------|---------| | V_2_TURBO | 3-6s | ~$0.05/image | Good | | V_2 | 8-15s | ~$0.08/image | High | | V3 FLASH | 2-4s | Lowest | Draft | | V3 TURBO | 4-8s | Low | Good | | V3 DEFAULT | 8-15s | Standard | High | | V3 QUALITY | 15-25s | Premium | Highest |
typescriptconst SPEED_CONFIGS = { // Preview / draft mode -- fastest, cheapest preview: { endpoint: "https://api.ideogram.ai/generate", model: "V_2_TURBO", note: "3-6s, good enough for iteration", }, // Standard production -- balanced standard: { endpoint: "https://api.ideogram.ai/generate", model: "V_2", note: "8-15s, high quality for final assets", }, // V3 with speed control v3_fast: { endpoint: "https://api.ideogram.ai/v1/ideogram-v3/generate", rendering_speed: "TURBO", note: "4-8s, V3 quality at faster speed", }, v3_quality: { endpoint: "https://api.ideogram.ai/v1/ideogram-v3/generate", rendering_speed: "QUALITY", note: "15-25s, maximum quality", }, } as const; function getConfig(tier: keyof typeof SPEED_CONFIGS) { return SPEED_CONFIGS[tier]; }
typescriptimport { createHash } from "crypto"; import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs"; import { join } from "path"; const CACHE_DIR = "./ideogram-cache"; function cacheKey(prompt: string, style: string, aspect: string): string { return createHash("sha256") .update(`${prompt.toLowerCase().trim()}:${style}:${aspect}`) .digest("hex") .slice(0, 16); } async function cachedGenerate( prompt: string, options: { style_type?: string; aspect_ratio?: string; model?: string } = {} ) { const style = options.style_type ?? "AUTO"; const aspect = options.aspect_ratio ?? "ASPECT_1_1"; const key = cacheKey(prompt, style, aspect); const metaPath = join(CACHE_DIR, `${key}.json`); const imgPath = join(CACHE_DIR, `${key}.png`); // Return cached if exists if (existsSync(metaPath) && existsSync(imgPath)) { console.log(`Cache hit: ${key}`); return JSON.parse(readFileSync(metaPath, "utf-8")); } // Generate and cache const response = await fetch("https://api.ideogram.ai/generate", { method: "POST", headers: { "Api-Key": process.env.IDEOGRAM_API_KEY!, "Content-Type": "application/json", }, body: JSON.stringify({ image_request: { prompt, model: options.model ?? "V_2", style_type: style, aspect_ratio: aspect, magic_prompt_option: "AUTO", }, }), }); if (!response.ok) throw new Error(`Generate failed: ${response.status}`); const result = await response.json(); const image = result.data[0]; // Download and cache const imgResp = await fetch(image.url); const buffer = Buffer.from(await imgResp.arrayBuffer()); mkdirSync(CACHE_DIR, { recursive: true }); writeFileSync(imgPath, buffer); writeFileSync(metaPath, JSON.stringify({ ...image, localPath: imgPath, cachedAt: new Date().toISOString(), })); return { ...image, localPath: imgPath }; }
typescriptimport PQueue from "p-queue"; // 8 concurrent (under Ideogram's 10 in-flight limit) const queue = new PQueue({ concurrency: 8 }); async function parallelGenerate( prompts: string[], options: { style_type?: string; model?: string } = {} ) { const start = Date.now(); const results = await Promise.all( prompts.map(prompt => queue.add(() => cachedGenerate(prompt, options)) ) ); const elapsed = ((Date.now() - start) / 1000).toFixed(1); console.log(`Generated ${results.length} images in ${elapsed}s`); console.log(`Throughput: ${(results.length / (elapsed as any)).toFixed(2)} img/s`); return results; } // Generate 20 images -- queue manages concurrency automatically const prompts = Array.from({ length: 20 }, (_, i) => `Product design variant ${i + 1}`); await parallelGenerate(prompts, { style_type: "DESIGN", model: "V_2_TURBO" });
typescriptimport { S3Client, PutObjectCommand } from "@aws-sdk/client-s3"; const s3 = new S3Client({ region: "us-east-1" }); async function generateWithCDN(prompt: string, options: any = {}) { const result = await cachedGenerate(prompt, options); // Upload to S3 for CDN delivery const key = `ideogram/${result.seed}.png`; const buffer = readFileSync(result.localPath); await s3.send(new PutObjectCommand({ Bucket: process.env.S3_BUCKET!, Key: key, Body: buffer, ContentType: "image/png", CacheControl: "public, max-age=31536000, immutable", })); return { cdnUrl: `https://${process.env.CDN_DOMAIN}/${key}`, seed: result.seed, resolution: result.resolution, }; }
| Issue | Cause | Solution | |-------|-------|----------| | Rate limit 429 | Concurrency too high | Reduce queue concurrency to 5-8 | | Slow generation | QUALITY speed or complex prompt | Use TURBO for drafts, simplify prompts | | Expired URL | Delayed download | Download immediately in same function | | Cache stale | Prompt changed slightly | Normalize prompts before hashing |
For cost optimization, see ideogram-cost-tuning.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 34,171 | 24,736 | -28% | 1 | 1 | 0% | 6,075 | 6,252 | +3% | 0 | 0 | — |
case-02 | fail→fail | 28,727 | 31,251 | +9% | 1 | 1 | 0% | 5,169 | 7,303 | +41% | 0 | 0 | — |
case-03 | fail→pass | 24,074 | 26,904 | +12% | 1 | 1 | 0% | 5,320 | 6,851 | +29% | 0 | 0 | — |
case-04 | fail→pass | 15,465 | 5,499 | -64% | 1 | 1 | 0% | 3,120 | 3,035 | -3% | 0 | 0 | — |
case-05 | fail→pass | 19,263 | 15,647 | -19% | 1 | 1 | 0% | 2,503 | 3,883 | +55% | 0 | 0 | — |
case-06 | pass→pass | 59,864 | 24,509 | -59% | 1 | 1 | 0% | 2,887 | 4,984 | +73% | 0 | 0 | — |
case-07 | pass→pass | 26,152 | 6,565 | -75% | 1 | 1 | 0% | 2,027 | 3,191 | +57% | 0 | 0 | — |
case-08 | fail→pass | 17,489 | 48,113 | +175% | 1 | 1 | 0% | 2,057 | 3,317 | +61% | 0 | 0 | — |
case-09 | pass→pass | 4,997 | 8,373 | +68% | 1 | 1 | 0% | 840 | 2,589 | +208% | 0 | 0 | — |
case-10 | pass→pass | 5,319 | 2,157 | -59% | 1 | 1 | 0% | 865 | 2,365 | +173% | 0 | 0 | — |
case-11 | fail→pass | 7,679 | 3,655 | -52% | 1 | 1 | 0% | 1,400 | 2,644 | +89% | 0 | 0 | — |
case-12 | pass→pass | 12,258 | 7,656 | -38% | 1 | 1 | 0% | 1,343 | 2,409 | +79% | 0 | 0 | — |
case-13 | fail→fail | 19,999 | 17,789 | -11% | 1 | 1 | 0% | 2,862 | 4,340 | +52% | 0 | 0 | — |
case-14 | fail→pass | 15,530 | 7,735 | -50% | 1 | 1 | 0% | 1,824 | 2,360 | +29% | 0 | 0 | — |
case-15 | fail→pass | 18,011 | 10,707 | -41% | 1 | 1 | 0% | 1,472 | 2,796 | +90% | 0 | 0 | — |
case-16 | pass→pass | 27,515 | 13,933 | -49% | 1 | 1 | 0% | 3,272 | 3,667 | +12% | 0 | 0 | — |
case-17 | fail→pass | 12,539 | 4,703 | -62% | 1 | 1 | 0% | 2,277 | 2,788 | +22% | 0 | 0 | — |
case-18 | pass→pass | 15,485 | 11,776 | -24% | 1 | 1 | 0% | 2,263 | 3,242 | +43% | 0 | 0 | — |
case-19 | pass→pass | 14,371 | 11,833 | -18% | 1 | 1 | 0% | 2,099 | 3,266 | +56% | 0 | 0 | — |
case-20 | pass→pass | 10,030 | 9,993 | -0% | 1 | 1 | 0% | 774 | 2,717 | +251% | 0 | 0 | — |
case-21 | pass→pass | 14,819 | 9,591 | -35% | 1 | 1 | 0% | 1,290 | 3,397 | +163% | 0 | 0 | — |
case-22 | pass→pass | 8,909 | 5,557 | -38% | 1 | 1 | 0% | 650 | 2,992 | +360% | 0 | 0 | — |
case-23 | fail→pass | 23,900 | 12,551 | -47% | 1 | 1 | 0% | 2,736 | 3,465 | +27% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +39 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.