Concurrency-limited Queue Pattern
When generating per-slide audio, run tasks in parallel but cap active requests by model rate limits.
Dynamic Concurrency
gemini-2.5-pro-preview-tts: concurrency10gemini-2.5-flash-preview-tts: concurrency25
Queue Pattern
const queue: Promise<void>[] = [];
for (; currentIndex < Math.min(CONCURRENCY, slides.length); currentIndex++) {
queue.push(processSlide(currentIndex));
}
while (currentIndex < slides.length) {
const finished = await Promise.race(queue);
const i = queue.indexOf(finished);
if (i !== -1) queue.splice(i, 1);
queue.push(processSlide(currentIndex++));
}
await Promise.all(queue);
Error Handling Model
- Save successful slides immediately (no rollback).
- Accumulate per-slide errors.
- Throw one summary error at end if any failures occurred.
This gives maximum throughput without losing already-completed work.