Update to Frameo.AI
Snapshot Oct 24, 2026 · 13:00 UTC · version 1.2.5
Collection source: downloaded plugin package.
Instructions updated for thumbnail-set
Full description — Now says: Three to five thumbnail concepts for a video, then variants of the chosen one: a face or product, a short title treatment, high contrast, delivered at upload...
Observed in instructions or declared skills. Runtime behavior has not been tested.
Up to 10 plugins free · no card required.
All fields and original values.
Full description
Oct 8, 2026 · 18:02 UTC
Three to five thumbnail concepts for a video: a face or product, a short title treatment, high contrast, delivered at upload size.
Oct 24, 2026 · 13:00 UTC
Three to five thumbnail concepts for a video, then variants of the chosen one: a face or product, a short title treatment, high contrast, delivered at upload size. Use for YouTube thumbnails, video covers and A/B test sets.
Skill instructions
Oct 8, 2026 · 18:02 UTC
video: a face or product, a short title treatment, high contrast, delivered at upload size." Needs: the video's title; a face photo or the product photos; the platform (YouTube 16:9, Instagram 1:1 or 4:5) Credits: about 110–180 (3–5 imag...
Oct 24, 2026 · 13:00 UTC
video, then variants of the chosen one: a face or product, a short title treatment, high contrast, delivered at upload size. Use for YouTube thumbnails, video covers and A/B test sets." A set of thumbnail or cover options for a video, to...
Supporting files
Oct 8, 2026 · 18:02 UTC
[{"relative_path":"agents/openai.yaml","size_in_bytes":369},{"relative_path":"assets/icon.svg","size_in_bytes":334}]
Oct 24, 2026 · 13:00 UTC
[{"relative_path":"agents/openai.yaml","size_in_bytes":372},{"relative_path":"assets/icon.svg","size_in_bytes":334},{"relative_path":"references/frameworks.md","size_in_bytes":2834},{"relative_path":"references/prompt-order.md","size_in_...
Compare saved observations
Download comparison JSONSKILL.md text changes
− removed · + added
--- before +++ after @@ -1,28 +1,38 @@ --- name: thumbnail-set -description: "Three to five thumbnail concepts for a video: a face or product, a short title treatment, high contrast, delivered at upload size." +description: "Three to five thumbnail concepts for a video, then variants of the chosen one: a face or product, a short title treatment, high contrast, delivered at upload size. Use for YouTube thumbnails, video covers and A/B test sets." --- -Needs: the video's title; a face photo or the product photos; the platform (YouTube 16:9, Instagram 1:1 or 4:5) -Credits: about 110–180 (3–5 images at ~36 each, the default model's 4K tier) -Time: 10 minutes - ## When -After the video exists: a set to A/B. Not for the video itself. +A set of thumbnail or cover options for a video, to pick from or A/B test. The video itself +comes from `script-to-video`, `faceless-story-video` or `ugc-video`, not from here. A 9:16 Reels +or Shorts cover for a product follows `get_skill_file(skill_id="thumbnail-set", path="references/reel-cover.md")`. ## Ask first -1. **Title** — the 2–4 words that go on the image. -2. **Subject** — a face (`show_upload` for files on the user's device, `import_media_url` for a web link; images attached to the chat do not reach Frameo, and `create_upload_url` is for clients that send the file themselves) or the product photos. -3. **Platform** — sets the frame: YouTube 16:9, Instagram 1:1; for Instagram 4:5 generate at - 3:4 (the nearest supported ratio) and crop at the end. +All in one turn: + +1. **Title** — 2–6 words for the overlay, or none. It is burned in at step 6, never generated. +2. **Who is in frame** — "Do you want yourself or a specific person in the thumbnail? Send a + face photo and the thumbnail keeps that exact face; otherwise say whether you want a generated + person or no person at all." Photos come in through `show_upload` for files on the user's device, `import_media_url` for a web link; images attached to the chat reach Frameo only through `import_attachments`, in apps that pass them such as ChatGPT, and `create_upload_url` is for clients that send the file themselves. A generated person only when the + user asks for one; never an invented real-looking person by default. No person means a product, + place, map or graphic concept. +3. **Platform** — sets the frame: YouTube 16:9, Shorts 9:16, Instagram 1:1; for Instagram 4:5 + generate at 3:4 (the nearest supported ratio) and crop at the end. +4. **A reference thumbnail** (optional) — an example the user likes. Ask once whether to match it + closely or take it as loose inspiration. It is studied by eye only, for its concept, pose, + composition, background and emotion, and is never passed to a generate call. +5. **How many** — one thumbnail, or a set of about four variants of the chosen concept (each a + different emotion or camera take, at most 16). ## Steps **Before any paid step.** The project: `list_projects` (or `create_project`) gives the `project_id` and, when the project has several modules, the `module_id`; every call below that takes a project — -`estimate_cost` included — gets that same pair; without it those tools answer `project_needed`. The +`estimate_cost` included — gets that same pair; without the project those tools answer `project_needed`, and without the +module of a project that has several, `module_needed`, which lists its modules. The quote: one `estimate_cost(items=[…])` prices a stage in one call, with the same project, model, size and number of `image_urls` or `reference_image_urls` (`reference_count`) as each generate call, and returns a `quote_id` per item plus the total. Each generate call then passes its own item's `quote_id` and `confirmed_by_user=true`. A quote is single-use and lasts @@ -30,7 +40,7 @@ comes to more than the user approved is asked about again first. Generate calls return `generation_ids`; `wait_task` returns the links, and `show_generations` shows each stage's running and finished work in one card where the chat app displays Frameo cards: all the stage's ids at -once, before its first `wait_task`, and the finished result with `final: true`. +once, before its first `wait_task`; the card updates itself as the work finishes, so the same ids are not shown again. **The plan first.** Before the first paid call, the plan goes to the user in the chat as plain text: what will be made, in order, one line per generation (for a script, the shot list; for a @@ -40,31 +50,59 @@ generated until the user says yes. The user can drop or change lines; a changed line is priced again. -**1. Concepts.** Propose 3–5 in one line each (big face + reaction, product + number, before/ -after, a question, a bold object on colour); the user picks or edits. - -**2. Images (~36 each at 4K).** `generate_image` per concept, each with its own quote, -`image_urls=[face or product]`, -prompt = the concept plus "high contrast, one focal point, space on the left third for -text, no small details", `aspect_ratio` from Ask first (1:1, 16:9, 9:16 or 3:4) and -`image_resolution` at the highest tier the model offers (`list_models(kind="image")` -names them, e.g. 4K on the default; the quote is exact for that model and tier). Leave the title off the image: the exact title is burned in at step 3, not generated. +**1. Concepts.** Read `get_skill_file(skill_id="thumbnail-set", path="references/frameworks.md")`. Every concept opens an +information gap (the image raises a question the video answers) and stays true to the video: it +may exaggerate, never promise what the video does not have. Propose 3–5 concepts in one line +each, drawn from different frameworks (two can combine); the user picks or edits. + +**2. Prompts.** One prompt per variant, built in the order set out in +`get_skill_file(skill_id="thumbnail-set", path="references/prompt-order.md")`: frame, scene, no text, subject, key elements, +location, composition, background, lighting, grade. The subject is large, 40–60% of the frame, +on a power third; the title takes the free quarter that composition leaves, so no fixed text +area is asked for in the prompt. With a face photo, the identity-lock paragraph from that file +goes in for each person, and every person gets the lighting rig. A split frame only when the +user asks for a split, before/after or versus layout. Variants differ only by the emotion +phrase or one camera-take line from that file. +With no person in the concept (a landscape, a map, a product alone), variants differ by one camera +take (wider, closer, lower) or one change of time of day or light instead. + +**3. Images (~36 each at 4K).** `generate_image` per variant, each with its own quote, +`image_urls` = the face photos first (in character order), then any product photo or logo; none +for a concept without them. `aspect_ratio` from Ask first, the default `image_model`, and +`image_resolution` at the highest tier the model offers (`list_models(kind="image")` names them, +e.g. 4K on the default; the quote is exact for that model and tier). No text in the image. `wait_task`, then show the set. -**3. Title and exact size (free).** One `run_ffmpeg` per pick: `scale` + `crop` to the -platform's pixel size (1280×720, 1080×1080, 1080×1350), and the title burned in from an `.ass` -sidecar with the `ass` filter (Noto Sans, large and bold, thick outline, in the free space) unless the -user prefers their own editor; ask which. `wait_task` for each -output link. +**4. Check (free).** Each image against the plan: `view_image(url, resolution="high")` shows +whether the face matches its photo, whether any stray text or watermark slipped in, and whether +hands and the hero element are clean. The small preview `wait_task` returns stands in for the +feed: a thumbnail competes at about 120 px wide, so the emotion and the hero element must read +at that size; if they do not, the composition is wrong, not the resolution. A failed image is +made again once with the same prompt; one still failing is shown with the flaw named. + +**5. Tweaks (when asked).** One change at a time on the picked image: `generate_image` with +`image_urls=[the picked image]` and a prompt that changes only that one thing (the expression, +the background, its colour, the rim-light colour) and keeps everything else exactly as it is; +the wording is in `get_skill_file(skill_id="thumbnail-set", path="references/prompt-order.md")`. Each tweak is quoted like +any image, and its result becomes the picked image for the next one. + +**6. Title and exact size (free).** Ask whether the title is burned in or left for the user's +own editor. One `run_ffmpeg` per pick: `scale` + `crop` to the platform's pixel size (1280×720, +1080×1920, 1080×1080, 1080×1350), and the title burned in from an `.ass` sidecar with the `ass` +filter, in one of the styles in `get_skill_file(skill_id="thumbnail-set", path="references/title-styles.md")`, placed in the +free quarter of that image (looked at first) and never over a face. `view_image` on the result +checks the title reads correctly. `wait_task` for each output link. -**4. Deliver.** Links and `open_in_frameo`. +**7. Deliver.** Links and `open_in_frameo`. ## Done -The set on the canvas in one row. -`open_in_frameo` on the result opens the project in the Frameo app, where every take sits on -the canvas, ready for retakes and edits. +The set in the Frameo project, kept together, each with its concept and, when made, its titled version. +`open_in_frameo` on the result opens the project in the Frameo app, where every take is ready for retakes and edits. ## Files -None. +- `references/frameworks.md` — 16 concept frameworks, the information gap and the truth rule, read at step 1. +- `references/prompt-order.md` — the prompt order, identity lock, emotions, camera takes, lighting rig, split frames and tweak wording, read at steps 2 and 5. +- `references/title-styles.md` — five `.ass` title styles and where the title goes, read at step 6. +- `references/reel-cover.md` — a 9:16 cover with the product low and the top third kept for the title.
Full technical diff · 3 changed fields
changed /description
"Three to five thumbnail concepts for a video: a face or product, a short title treatment, high contrast, delivered at upload size."
"Three to five thumbnail concepts for a video, then variants of the chosen one: a face or product, a short title treatment, high contrast, delivered at upload size. Use for YouTube thumbnails, video covers and A/B test sets."
changed /included_files
[
{
"relative_path": "agents/openai.yaml",
"size_in_bytes": 369
},
{
"relative_path": "assets/icon.svg",
"size_in_bytes": 334
}
][
{
"relative_path": "agents/openai.yaml",
"size_in_bytes": 372
},
{
"relative_path": "assets/icon.svg",
"size_in_bytes": 334
},
{
"relative_path": "references/frameworks.md",
"size_in_bytes": 2834
},
{
"relative_path": "references/prompt-order.md",
"size_in_bytes": 5229
},
{
"relative_path": "references/reel-cover.md",
"size_in_bytes": 1328
},
{
"relative_path": "references/title-styles.md",
"size_in_bytes": 1829
}
]changed /skill_md_contents
"---\nname: thumbnail-set\ndescription: \"Three to five thumbnail concepts for a video: a face or product, a short title treatment, high contrast, delivered at upload size.\"\n---\n\nNeeds: the video's title; a face photo or the product photos; the platform (YouTube 16:9, Instagram 1:1 or 4:5)\nCredits: about 110–180 (3–5 images at ~36 each, the default model's 4K tier)\nTime: 10 minutes\n\n## When\n\nAfter the video exists: a set to A/B. Not for the video itself.\n\n## Ask first\n\n1. **Title** — the 2–4 words that go on the image.\n2. **Subject** — a face (`show_upload` for files on the user's device, `import_media_url` for a web link; images attached to the chat do not reach Frameo, and `create_upload_url` is for clients that send the file themselves) or the product photos.\n3. **Platform** — sets the frame: YouTube 16:9, Instagram 1:1; for Instagram 4:5 generate at\n 3:4 (the nearest supported ratio) and crop at the end.\n\n## Steps\n\n**Before any paid step.** The project: `list_projects` (or `create_project`) gives the `project_id`\nand, when the project has several modules, the `module_id`; every call below that takes a project —\n`estimate_cost` included — gets that same pair; without it those tools answer `project_needed`. The\nquote: one `estimate_cost(items=[…])` prices a stage in one call, with the same project, model,\nsize and number of `image_urls` or `reference_image_urls` (`reference_count`) as each generate call, and returns a `quote_id` per item plus the total. Each generate call\nthen passes its own item's `quote_id` and `confirmed_by_user=true`. A quote is single-use and lasts\n15 minutes, so a long plan is priced stage by stage, right before each stage runs; a stage that\ncomes to more than the user approved is asked about again first. Generate calls return\n`generation_ids`; `wait_task` returns the links, and `show_generations` shows each stage's running\nand finished work in one card where the chat app displays Frameo cards: all the stage's ids at\nonce, before its first `wait_task`, and the finished result with `final: true`.\n\n**The plan first.** Before the first paid call, the plan goes to the user in the chat as plain\ntext: what will be made, in order, one line per generation (for a script, the shot list; for a\nset, each shot), with each line's credits and the total. The credits come from\n`estimate_cost(items=[…])`, up to 10 items a call, so a long plan takes several calls; those\nquotes may expire unused, since each stage is quoted again right before it runs. Nothing is\ngenerated until the user says yes. The user can drop or change lines; a changed line is priced\nagain.\n\n**1. Concepts.** Propose 3–5 in one line each (big face + reaction, product + number, before/\nafter, a question, a bold object on colour); the user picks or edits.\n\n**2. Images (~36 each at 4K).** `generate_image` per concept, each with its own quote,\n`image_urls=[face or product]`,\nprompt = the concept plus \"high contrast, one focal point, space on the left third for\ntext, no small details\", `aspect_ratio` from Ask first (1:1, 16:9, 9:16 or 3:4) and\n`image_resolution` at the highest tier the model offers (`list_models(kind=\"image\")`\nnames them, e.g. 4K on the default; the quote is exact for that model and tier). Leave the title off the image: the exact title is burned in at step 3, not generated.\n`wait_task`, then show the set.\n\n**3. Title and exact size (free).** One `run_ffmpeg` per pick: `scale` + `crop` to the\nplatform's pixel size (1280×720, 1080×1080, 1080×1350), and the title burned in from an `.ass`\nsidecar with the `ass` filter (Noto Sans, large and bold, thick outline, in the free space) unless the\nuser prefers their own editor; ask which. `wait_task` for each\noutput link.\n\n**4. Deliver.** Links and `open_in_frameo`.\n\n## Done\n\nThe set on the canvas in one row.\n`open_in_frameo` on the result opens the project in the Frameo app, where every take sits on\nthe canvas, ready for retakes and edits.\n\n## Files\n\nNone.\n"
"---\nname: thumbnail-set\ndescription: \"Three to five thumbnail concepts for a video, then variants of the chosen one: a face or product, a short title treatment, high contrast, delivered at upload size. Use for YouTube thumbnails, video covers and A/B test sets.\"\n---\n\n## When\n\nA set of thumbnail or cover options for a video, to pick from or A/B test. The video itself\ncomes from `script-to-video`, `faceless-story-video` or `ugc-video`, not from here. A 9:16 Reels\nor Shorts cover for a product follows `get_skill_file(skill_id=\"thumbnail-set\", path=\"references/reel-cover.md\")`.\n\n## Ask first\n\nAll in one turn:\n\n1. **Title** — 2–6 words for the overlay, or none. It is burned in at step 6, never generated.\n2. **Who is in frame** — \"Do you want yourself or a specific person in the thumbnail? Send a\n face photo and the thumbnail keeps that exact face; otherwise say whether you want a generated\n person or no person at all.\" Photos come in through `show_upload` for files on the user's device, `import_media_url` for a web link; images attached to the chat reach Frameo only through `import_attachments`, in apps that pass them such as ChatGPT, and `create_upload_url` is for clients that send the file themselves. A generated person only when the\n user asks for one; never an invented real-looking person by default. No person means a product,\n place, map or graphic concept.\n3. **Platform** — sets the frame: YouTube 16:9, Shorts 9:16, Instagram 1:1; for Instagram 4:5\n generate at 3:4 (the nearest supported ratio) and crop at the end.\n4. **A reference thumbnail** (optional) — an example the user likes. Ask once whether to match it\n closely or take it as loose inspiration. It is studied by eye only, for its concept, pose,\n composition, background and emotion, and is never passed to a generate call.\n5. **How many** — one thumbnail, or a set of about four variants of the chosen concept (each a\n different emotion or camera take, at most 16).\n\n## Steps\n\n**Before any paid step.** The project: `list_projects` (or `create_project`) gives the `project_id`\nand, when the project has several modules, the `module_id`; every call below that takes a project —\n`estimate_cost` included — gets that same pair; without the project those tools answer `project_needed`, and without the\nmodule of a project that has several, `module_needed`, which lists its modules. The\nquote: one `estimate_cost(items=[…])` prices a stage in one call, with the same project, model,\nsize and number of `image_urls` or `reference_image_urls` (`reference_count`) as each generate call, and returns a `quote_id` per item plus the total. Each generate call\nthen passes its own item's `quote_id` and `confirmed_by_user=true`. A quote is single-use and lasts\n15 minutes, so a long plan is priced stage by stage, right before each stage runs; a stage that\ncomes to more than the user approved is asked about again first. Generate calls return\n`generation_ids`; `wait_task` returns the links, and `show_generations` shows each stage's running\nand finished work in one card where the chat app displays Frameo cards: all the stage's ids at\nonce, before its first `wait_task`; the card updates itself as the work finishes, so the same ids are not shown again.\n\n**The plan first.** Before the first paid call, the plan goes to the user in the chat as plain\ntext: what will be made, in order, one line per generation (for a script, the shot list; for a\nset, each shot), with each line's credits and the total. The credits come from\n`estimate_cost(items=[…])`, up to 10 items a call, so a long plan takes several calls; those\nquotes may expire unused, since each stage is quoted again right before it runs. Nothing is\ngenerated until the user says yes. The user can drop or change lines; a changed line is priced\nagain.\n\n**1. Concepts.** Read `get_skill_file(skill_id=\"thumbnail-set\", path=\"references/frameworks.md\")`. Every concept opens an\ninformation gap (the image raises a question the video answers) and stays true to the video: it\nmay exaggerate, never promise what the video does not have. Propose 3–5 concepts in one line\neach, drawn from different frameworks (two can combine); the user picks or edits.\n\n**2. Prompts.** One prompt per variant, built in the order set out in\n`get_skill_file(skill_id=\"thumbnail-set\", path=\"references/prompt-order.md\")`: frame, scene, no text, subject, key elements,\nlocation, composition, background, lighting, grade. The subject is large, 40–60% of the frame,\non a power third; the title takes the free quarter that composition leaves, so no fixed text\narea is asked for in the prompt. With a face photo, the identity-lock paragraph from that file\ngoes in for each person, and every person gets the lighting rig. A split frame only when the\nuser asks for a split, before/after or versus layout. Variants differ only by the emotion\nphrase or one camera-take line from that file.\nWith no person in the concept (a landscape, a map, a product alone), variants differ by one camera\ntake (wider, closer, lower) or one change of time of day or light instead.\n\n**3. Images (~36 each at 4K).** `generate_image` per variant, each with its own quote,\n`image_urls` = the face photos first (in character order), then any product photo or logo; none\nfor a concept without them. `aspect_ratio` from Ask first, the default `image_model`, and\n`image_resolution` at the highest tier the model offers (`list_models(kind=\"image\")` names them,\ne.g. 4K on the default; the quote is exact for that model and tier). No text in the image.\n`wait_task`, then show the set.\n\n**4. Check (free).** Each image against the plan: `view_image(url, resolution=\"high\")` shows\nwhether the face matches its photo, whether any stray text or watermark slipped in, and whether\nhands and the hero element are clean. The small preview `wait_task` returns stands in for the\nfeed: a thumbnail competes at about 120 px wide, so the emotion and the hero element must read\nat that size; if they do not, the composition is wrong, not the resolution. A failed image is\nmade again once with the same prompt; one still failing is shown with the flaw named.\n\n**5. Tweaks (when asked).** One change at a time on the picked image: `generate_image` with\n`image_urls=[the picked image]` and a prompt that changes only that one thing (the expression,\nthe background, its colour, the rim-light colour) and keeps everything else exactly as it is;\nthe wording is in `get_skill_file(skill_id=\"thumbnail-set\", path=\"references/prompt-order.md\")`. Each tweak is quoted like\nany image, and its result becomes the picked image for the next one.\n\n**6. Title and exact size (free).** Ask whether the title is burned in or left for the user's\nown editor. One `run_ffmpeg` per pick: `scale` + `crop` to the platform's pixel size (1280×720,\n1080×1920, 1080×1080, 1080×1350), and the title burned in from an `.ass` sidecar with the `ass`\nfilter, in one of the styles in `get_skill_file(skill_id=\"thumbnail-set\", path=\"references/title-styles.md\")`, placed in the\nfree quarter of that image (looked at first) and never over a face. `view_image` on the result\nchecks the title reads correctly. `wait_task` for each output link.\n\n**7. Deliver.** Links and `open_in_frameo`.\n\n## Done\n\nThe set in the Frameo project, kept together, each with its concept and, when made, its titled version.\n`open_in_frameo` on the result opens the project in the Frameo app, where every take is ready for retakes and edits.\n\n## Files\n\n- `references/frameworks.md` — 16 concept frameworks, the information gap and the truth rule, read at step 1.\n- `references/prompt-order.md` — the prompt order, identity lock, emotions, camera takes, lighting rig, split frames and tweak wording, read at steps 2 and 5.\n- `references/title-styles.md` — five `.ass` title styles and where the title goes, read at step 6.\n- `references/reel-cover.md` — a 9:16 cover with the product low and the top third kept for the title.\n"
Full snapshot data
{
"description": "Three to five thumbnail concepts for a video, then variants of the chosen one: a face or product, a short title treatment, high contrast, delivered at upload size. Use for YouTube thumbnails, video covers and A/B test sets.",
"included_files": [
{
"relative_path": "agents/openai.yaml",
"size_in_bytes": 372
},
{
"relative_path": "assets/icon.svg",
"size_in_bytes": 334
},
{
"relative_path": "references/frameworks.md",
"size_in_bytes": 2834
},
{
"relative_path": "references/prompt-order.md",
"size_in_bytes": 5229
},
{
"relative_path": "references/reel-cover.md",
"size_in_bytes": 1328
},
{
"relative_path": "references/title-styles.md",
"size_in_bytes": 1829
}
],
"name": "thumbnail-set",
"skill_md_contents": "---\nname: thumbnail-set\ndescription: \"Three to five thumbnail concepts for a video, then variants of the chosen one: a face or product, a short title treatment, high contrast, delivered at upload size. Use for YouTube thumbnails, video covers and A/B test sets.\"\n---\n\n## When\n\nA set of thumbnail or cover options for a video, to pick from or A/B test. The video itself\ncomes from `script-to-video`, `faceless-story-video` or `ugc-video`, not from here. A 9:16 Reels\nor Shorts cover for a product follows `get_skill_file(skill_id=\"thumbnail-set\", path=\"references/reel-cover.md\")`.\n\n## Ask first\n\nAll in one turn:\n\n1. **Title** — 2–6 words for the overlay, or none. It is burned in at step 6, never generated.\n2. **Who is in frame** — \"Do you want yourself or a specific person in the thumbnail? Send a\n face photo and the thumbnail keeps that exact face; otherwise say whether you want a generated\n person or no person at all.\" Photos come in through `show_upload` for files on the user's device, `import_media_url` for a web link; images attached to the chat reach Frameo only through `import_attachments`, in apps that pass them such as ChatGPT, and `create_upload_url` is for clients that send the file themselves. A generated person only when the\n user asks for one; never an invented real-looking person by default. No person means a product,\n place, map or graphic concept.\n3. **Platform** — sets the frame: YouTube 16:9, Shorts 9:16, Instagram 1:1; for Instagram 4:5\n generate at 3:4 (the nearest supported ratio) and crop at the end.\n4. **A reference thumbnail** (optional) — an example the user likes. Ask once whether to match it\n closely or take it as loose inspiration. It is studied by eye only, for its concept, pose,\n composition, background and emotion, and is never passed to a generate call.\n5. **How many** — one thumbnail, or a set of about four variants of the chosen concept (each a\n different emotion or camera take, at most 16).\n\n## Steps\n\n**Before any paid step.** The project: `list_projects` (or `create_project`) gives the `project_id`\nand, when the project has several modules, the `module_id`; every call below that takes a project —\n`estimate_cost` included — gets that same pair; without the project those tools answer `project_needed`, and without the\nmodule of a project that has several, `module_needed`, which lists its modules. The\nquote: one `estimate_cost(items=[…])` prices a stage in one call, with the same project, model,\nsize and number of `image_urls` or `reference_image_urls` (`reference_count`) as each generate call, and returns a `quote_id` per item plus the total. Each generate call\nthen passes its own item's `quote_id` and `confirmed_by_user=true`. A quote is single-use and lasts\n15 minutes, so a long plan is priced stage by stage, right before each stage runs; a stage that\ncomes to more than the user approved is asked about again first. Generate calls return\n`generation_ids`; `wait_task` returns the links, and `show_generations` shows each stage's running\nand finished work in one card where the chat app displays Frameo cards: all the stage's ids at\nonce, before its first `wait_task`; the card updates itself as the work finishes, so the same ids are not shown again.\n\n**The plan first.** Before the first paid call, the plan goes to the user in the chat as plain\ntext: what will be made, in order, one line per generation (for a script, the shot list; for a\nset, each shot), with each line's credits and the total. The credits come from\n`estimate_cost(items=[…])`, up to 10 items a call, so a long plan takes several calls; those\nquotes may expire unused, since each stage is quoted again right before it runs. Nothing is\ngenerated until the user says yes. The user can drop or change lines; a changed line is priced\nagain.\n\n**1. Concepts.** Read `get_skill_file(skill_id=\"thumbnail-set\", path=\"references/frameworks.md\")`. Every concept opens an\ninformation gap (the image raises a question the video answers) and stays true to the video: it\nmay exaggerate, never promise what the video does not have. Propose 3–5 concepts in one line\neach, drawn from different frameworks (two can combine); the user picks or edits.\n\n**2. Prompts.** One prompt per variant, built in the order set out in\n`get_skill_file(skill_id=\"thumbnail-set\", path=\"references/prompt-order.md\")`: frame, scene, no text, subject, key elements,\nlocation, composition, background, lighting, grade. The subject is large, 40–60% of the frame,\non a power third; the title takes the free quarter that composition leaves, so no fixed text\narea is asked for in the prompt. With a face photo, the identity-lock paragraph from that file\ngoes in for each person, and every person gets the lighting rig. A split frame only when the\nuser asks for a split, before/after or versus layout. Variants differ only by the emotion\nphrase or one camera-take line from that file.\nWith no person in the concept (a landscape, a map, a product alone), variants differ by one camera\ntake (wider, closer, lower) or one change of time of day or light instead.\n\n**3. Images (~36 each at 4K).** `generate_image` per variant, each with its own quote,\n`image_urls` = the face photos first (in character order), then any product photo or logo; none\nfor a concept without them. `aspect_ratio` from Ask first, the default `image_model`, and\n`image_resolution` at the highest tier the model offers (`list_models(kind=\"image\")` names them,\ne.g. 4K on the default; the quote is exact for that model and tier). No text in the image.\n`wait_task`, then show the set.\n\n**4. Check (free).** Each image against the plan: `view_image(url, resolution=\"high\")` shows\nwhether the face matches its photo, whether any stray text or watermark slipped in, and whether\nhands and the hero element are clean. The small preview `wait_task` returns stands in for the\nfeed: a thumbnail competes at about 120 px wide, so the emotion and the hero element must read\nat that size; if they do not, the composition is wrong, not the resolution. A failed image is\nmade again once with the same prompt; one still failing is shown with the flaw named.\n\n**5. Tweaks (when asked).** One change at a time on the picked image: `generate_image` with\n`image_urls=[the picked image]` and a prompt that changes only that one thing (the expression,\nthe background, its colour, the rim-light colour) and keeps everything else exactly as it is;\nthe wording is in `get_skill_file(skill_id=\"thumbnail-set\", path=\"references/prompt-order.md\")`. Each tweak is quoted like\nany image, and its result becomes the picked image for the next one.\n\n**6. Title and exact size (free).** Ask whether the title is burned in or left for the user's\nown editor. One `run_ffmpeg` per pick: `scale` + `crop` to the platform's pixel size (1280×720,\n1080×1920, 1080×1080, 1080×1350), and the title burned in from an `.ass` sidecar with the `ass`\nfilter, in one of the styles in `get_skill_file(skill_id=\"thumbnail-set\", path=\"references/title-styles.md\")`, placed in the\nfree quarter of that image (looked at first) and never over a face. `view_image` on the result\nchecks the title reads correctly. `wait_task` for each output link.\n\n**7. Deliver.** Links and `open_in_frameo`.\n\n## Done\n\nThe set in the Frameo project, kept together, each with its concept and, when made, its titled version.\n`open_in_frameo` on the result opens the project in the Frameo app, where every take is ready for retakes and edits.\n\n## Files\n\n- `references/frameworks.md` — 16 concept frameworks, the information gap and the truth rule, read at step 1.\n- `references/prompt-order.md` — the prompt order, identity lock, emotions, camera takes, lighting rig, split frames and tweak wording, read at steps 2 and 5.\n- `references/title-styles.md` — five `.ass` title styles and where the title goes, read at step 6.\n- `references/reel-cover.md` — a 9:16 cover with the product low and the top third kept for the title.\n"
}SHA-256 of public snapshot: b4db69b165141d12255831ffd82763212fc35ed5678f5770e9ec198ac4acb363