Skip to content

Carousel Workflows

The carousel workflow generates an ordered deck of slides for a single-topic carousel post. The LLM drafts a per-slide outline (slide 1 = hook, last slide = CTA, middles = distinct points), then one image is generated per slide using a prompt derived from that slide’s outline entry. The output preserves slide order so consumer UIs can render the deck as a swipeable group rather than a grid of unordered thumbnails.

Workflow: carousel/generate  ·  Aliases: carousel, image/carousel

Produces a single carousel post — outline + N rendered slides in narrative order, plus a post-body caption.

Submit either the canonical name or the image/carousel alias (Socialite uses the latter from its bundle dispatcher so it can swap from image/generate without changing the input shape).

Terminal window
fab run carousel/generate \
--input topic="AI productivity tips" \
--input slide_count=5 \
--input audience="busy founders" \
--input tone="punchy"
draft_outline (LLM) → derive_aesthetic (LLM) → render_slides (image-per-slide, parallel) → write_caption (LLM)
  1. draft_outline asks the LLM for a [{title, body}, ...] plan with slide_count entries. Slide 1 is the hook; the last slide is the CTA. Titles are short (≤ 6 words) and ALL CAPS-ready.
  2. derive_aesthetic drafts a single concrete aesthetic brief (palette, lighting, composition, medium) for the whole deck so every slide reads as part of the same set. Skipped when the caller passed an explicit visual_style.
  3. render_slides generates one image per outline entry in parallel. Each prompt combines the slide title (on-image hero text), the deck-wide aesthetic, and tone-driven visual directives (e.g. “punchy” → saturated complementary colors, hard rim lighting, dynamic composition).
  4. write_caption drafts the post-body caption (2–4 sentences, soft CTA) referencing the realized slide titles, so the caption matches what the deck actually says.
ParameterTypeDefaultDescription
topicstringrequiredSubject of the carousel — drives outline + image prompts.
slide_countint5Number of slides (3–10).
num_thumbnailsint | nullnullLegacy alias for slide_count (accepted so callers swapping from image/generate don’t have to rename the field).
audiencestring"general"Target reader persona.
tonestring""Voice/tone hint (e.g. "punchy", "warm", "luxurious"). Drives both narrative voice and the image model’s visual direction (palette, lighting, energy).
industrystring""Industry/vertical hint passed through to outline + caption prompts.
keywordslist[str][]Topical keywords woven into the deck’s narrative.
channelslist[str][]Distribution channels; shapes prompt guidance.
visual_stylestring""Optional override. When empty, the workflow derives a deck-wide aesthetic brief from topic + tone + audience (recommended).
aspect_ratiostring"1:1"Aspect ratio for slide images. Imagen accepts 1:1, 9:16, 16:9, 4:3, 3:4. Avoid 4:5 — Imagen rejects it and the run silently falls through to a lower-quality provider.
{
"kind": "carousel",
"topic": "AI productivity tips",
"caption": "AI won't take your job — but the founder using it will. Swipe through 5 ways to claw back two hours a day, starting with the meeting you can already kill.",
"slides": [
{
"order": 0,
"title": "AI WON'T REPLACE YOU",
"body": "But someone using it will.",
"image_path": "/tmp/carousel_slide_00.png",
"image_asset_id": "018f..."
},
{
"order": 1,
"title": "TIP 1 — DELETE BUSYWORK",
"body": "Automate the meetings nobody asked for.",
"image_path": "/tmp/carousel_slide_01.png",
"image_asset_id": "018f..."
}
]
}
FieldTypeDescription
kindstringAlways "carousel" — consumers route on this.
topicstringEchoed input topic.
captionstringPost-body caption summarizing the deck — what the consumer renders as the Instagram post copy under the swipeable images.
slideslist[CarouselSlide]Ordered slide list. slides[i].order matches the index.
slides[].orderintZero-based slide position. Stable across the run.
slides[].titlestringOn-image hero text.
slides[].bodystringOptional supporting copy (may be empty for visual-only slides).
slides[].image_pathstringLocal or signed-URL path to the rendered slide.
slides[].image_asset_idstring | nullFabric asset ID when uploaded server-side.

If a single slide’s image generation fails, the slide is dropped from the output but the run still succeeds. If every slide fails, the run fails with a clear error. Consumers should iterate slides (which may have gaps in order) rather than assuming a contiguous index.

Pair carousel/generate with bundle/ad-hoc to produce a multi-format deck — carousel + video + text post — for the same brief in one submission:

{
"bundle": [
{ "workflow": "carousel/generate", "input": { "topic": "...", "slide_count": 5 } },
{ "workflow": "video/ai-shorts", "input": { "topic": "..." } },
{ "workflow": "global/content-generate", "input": { "topic": "...", "content_types": ["text"] } }
]
}