Communitygithub.com

YouTube 缩略图生成器

从标题、可选人脸照片、@handle 角色、品牌色或用户自己的视频帧生成缩略图和封面,支持 YouTube (16:9)、Shorts、Reels 和 TikTok (9:16)、播客和课程封面 (1:1)。文本由 GPT Image 2.5 嵌入;人脸通过参考编辑锁定。

YouTube 缩略图生成器 是什么?

该技能专为 AI 代理(如 Claude Code、Cursor、Codex)设计,用于自动生成缩略图和封面,特别优化在 160 像素宽度的 feed 中的可见性。它从单个标题生成三个不同概念的草案,用户选择其一,然后进行一次高精度最终版和最多三轮修订。支持多种格式:YouTube (16:9)、Shorts、Reels 和 TikTok (9:16)、播客和课程封面 (1:1)。核心功能包括通过 GPT Image 2.5 模型实现高精确度排版、人脸锁定(通过参考编辑确保一致性)、品牌色集成,以及用于静态帧提取 (ffmpeg) 和徽标叠加(基于 Chromium 的浏览器)的本地工具。关键工作流程包括前期检查(验证工具和成本门槛)、发现护栏(检查模型端点状态和模式)、路由(根据内容类型选择端点,例如有文本的缩略图使用 GPT Image 2.5,无文本的真实感图像使用 Seedream)以及严格的成本和问题预算。该技能强制执行真实性、同意和版权规则;它不接受伪造结果或未经授权的名人形象。它生成 PNG 和 JPEG 格式的调整大小后的文件,并与 `character`、`image` 和 `video` 技能无缝集成,以消费角色和素材。

兼容平台✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/funi-ai/claude-plugins/tree/main/plugins/genmedia-skills/skills/youtube-thumbnail

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

YouTube 缩略图

以人们在 feed 中实际看到的大小(约 160 像素宽)来评判缩略图和封面。输入一个标题,输出三个不同概念,用户选择,一个最终版,窄幅修订,文件以精确交付尺寸输出。工艺(概念框架、提示蓝图、文本规则、小尺寸门控)在此;机制在 references/cli-contract.md 和 references/platform.md 中。

第 0 步 — 预检

每次会话一次:

command -v genmedia
python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" preflight
python3 "${CLAUDE_SKILL_DIR}/scripts/thumbcheck.py" tools
  • blockers 不为空,CLI 缺失或版本低于 0.7.0 → /genmedia-skills:setup。密钥缺失 → 用户自行运行 genmedia setup 或导出 FAL_KEY;等待。切勿读取、打印、请求或输入密钥。
  • 保持 config.announce_above_usd 和 config.confirm_above_usd(默认值 0.50 和 2):它们是成本门槛。
  • thumbcheck.py tools 说明哪些工具(preview、sheet、fit、frame)可以在此处运行(需要本地 ffmpeg 或 macOS sips),以及 lockup 是否可以运行(需要基于 Chromium 的浏览器)。两者都缺失 → 则在工作流第 6 步进入降级门控。切勿依赖 drawtext、Pillow 或 ImageMagick:文本由模型渲染。
  • 首先恢复:如果存在匹配此请求的 .genmedia/projects/<slug>/thumbnail.md → 读取它,从其第一个打开的步骤继续。切勿重启已有账目的项目。

UX 规则

  1. 以用户的语言回复(土耳其语输入 → 土耳其语输出)。模型提示用英文编写;图像上的文本保持发布时的语言和确切拼写。端点 ID、字段名和路径保持原样。
  2. 不要在聊天中输出 JSON、请求 ID、提示或工具叙述。静默等待;每批最多一行状态。
  3. 问题预算:2 个,一次问一个,以标注选项的形式,仅在答案缺失时提问:
    • Q1 钩子词:无标题且无主题 → 询问标题。标题已知 → 不问;自行写出 2 到 4 个钩子词(不同概念下使用三个不同的词)。
    • Q2 人脸或无脸:仅在无任何决定因素时询问。有照片、@handle 或“我 / 我的脸” → 带脸。“无脸”、产品、屏幕录制、风景 → 无脸。 用户只要求一个缩略图或命名了概念 → 只生成一个草案而非三个;选择变为是或否。其他所有内容都在交付行中声明为默认值:格式 16:9;文本语言 = 标题的语言;调色板 = 给定的品牌色,否则按概念选择;真实感海报风格;3 个概念;最终主文件 2560x1440 交付为 1920x1080 和 1280x720。不计数:同意确认、选择、成本确认。
  4. 选择是硬性停止点。 显示比较表并等待。沉默、成功的任务或你自己的偏好绝不是选择。推荐一个是可以的;代替用户选择是不行的。
  5. 真实性。 缩略图可以戏剧化,但绝不能歪曲。显示或编写的所有内容必须存在于视频中或诚实来源于视频:不得有虚构的数字、结果、反应、产品或嘉宾;不得有真实平台的假 UI;不得有用户不拥有的徽标或角色。无法判断视频提供什么 → 在承诺之前询问(这会替换 Q1 或 Q2,不会增加问题数量)。
  6. 人脸。 真实人物的照片(包括用户本人)→ 一次确认他们已获得此人的同意,以及一行说明上传内容位于公共 URL 上。不得使用用户不是的名人或公众人物;“看起来像 <名人>” 会被拒绝,提供虚构人脸或无脸概念。虚构人脸是占位符:切勿将其呈现为真实姓名的人、客户、专家或嘉宾,并在交付中说明人脸是 AI 生成的。
  7. 成本: 在首次付费调用(工作流第 4 步)之前估算整个请求,并使用预检中的阈值应用成本门控:低于 announce_above_usd → 运行;不超过 confirm_above_usd → 一行包含估算,然后运行;达到或超过它 → 显示估算并等待明确的“是”(references/platform.md 第 8 节)。批准涵盖所显示的计划;更大的计划需要新的批准。切勿凭记忆报价;切勿为省钱而更换用户命名的模型。
  8. 限制: 最多 3 轮草案和 3 轮修订;每次尝试都会更改某些内容;违反内容策略的拒绝绝不原样重新发送;有请求 ID 的任务将恢复,绝不清零重试。

发现护栏

以下路由是过时的缓存(references/routing-image.md,验证日期 2026-09-19)。在会话中首次对端点进行付费调用之前:

genmedia models --endpoint_id <endpoint_id> --json
python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" schema <endpoint_id>
  • status 必须为 active。非活跃或 404 → references/routing-image.md 中同一任务的下一层级,否则 genmedia models "<name>" --no-classify --limit 10 --json,选择最新的活跃匹配项,并说明运行了哪个模型。
  • 字段名、枚举和限制来自 schema,绝不凭记忆。用户命名了一个模型 → 先搜索再怀疑;新版本位于供应商命名空间下(openai/、bytedance/、google/、alibaba/),不在 fal-ai/ 下。
  • 切勿在没有端点 ID 的情况下运行 genmedia run(智能路由会解析过时的默认值)。

路由

步骤端点原因
草案,无参考项openai/gpt-image-2.5/flare/text-to-image,quality: "medium"排版领导者;只有目标系列可以预览文本,廉价草案模型不能
涉及人脸照片、@handle 引用、产品照片或视频帧的草案openai/gpt-image-2.5/flare/edit,quality: "medium"引用放入 image_urls(最多 16 个);与最终版同系列
最终版openai/gpt-image-2.5/sunburst/edit,quality: "high"精度层级;选定的草案作为图像 1,因此最终版是那个构图,而非全新的生成
修订(文本、表情、背景、颜色)openai/gpt-image-2.5/sunburst/edit,quality: "high"当前最终版作为图像 1;每轮一个范围
无文本底板,真实感(备选路径)bytedance/seedream/v5/pro/text-to-imagearena #1 真实感;文本之后通过 GPT Image 2.5 编辑添加
当人脸漂移时的身份底板fal-ai/nano-banana-2/edit身份一致性图像的路由默认值;文本之后添加
放大真实帧或照片fal-ai/seedvr/upscale/image;人脸或文本首先:topaz/upscale/image/precision忠实;Topaz 有 Faces 和 Text Refine 模型
用户视频的帧thumbcheck.py frame(本地 ffmpeg)精确时间戳;无 ffmpeg → 请求用户截图
用户自己的徽标在无文本底板上thumbcheck.py lockup(本地浏览器)标记从用户文件放置;模型会重新绘制它

决胜规则:

  1. 图像上有文本 → GPT Image 2.5,即使是真实感概念。完全无文本(用户声明)→ 草案可在 bytedance/seedream/v5/pro/text-to-image 或其 /edit 上运行;其余流程不变。Seedream 拒绝 1280x720(其最小面积为 1024x1024)且没有 quality 字段:发送 image_size 1920x1080(9:16 → 1080x1920,1:1 → 1536x1536)并根据其路由行按图像定价(2026-09-19 每个约 USD 0.07:三个草案约 USD 0.20,重新计算总额)。
  2. 默认文本策略是一次性嵌入。在以下情况下使用 底板路径(无文本底板,然后一次“仅添加此文本”编辑):同一底板需要多种语言或 A/B 措辞;变音符号连续失败两次;底板是真实帧或照片。详情:references/text-and-readability.md。
  3. @handle → 读取 .genmedia/characters/<handle>/character.json(锚点 description;refs[] 中 role: "face" 且 active: true),重用已有 cdn_url 的引用,否则上传其文件;原样使用锚点。real_person: true → 适用 UX 规则 6;记录的 consent_confirmed_at 即为确认。未知 handle → 告知,提供 /genmedia-skills:character;切勿替代。
  4. 用户命名了模型 → 在实时检查后使用它;一行提供默认值。
  5. 设计是底板加上用户自己的徽标(品牌频道、应用商店预览视频)→ 底板路径,然后 thumbcheck.py lockup 将徽标文件以宽度的一定比例居中放置(references/text-and-readability.md 第 2b 节)。底板已存在(launch-graphics 底板、用户照片)→ 无需付费调用:lockup、门控、第 10 步。无徽标文件 → 请求;切勿让模型绘制标记。

陷阱:

  • 自动尺寸陷阱。 编辑端点默认 image_size 为 auto,这会跟随输入图像:纵向人脸照片会产生纵向缩略图。始终发送 {width,height}。
  • 默认质量陷阱。 quality 默认为 high,该系列按 token 计费。每次调用都设置它:草案 medium,最终版 high;仅在用户同意价格后使用 xhigh 或 max。
  • 16 的倍数陷阱。 1920x1080 不是合法的 GPT Image 尺寸。渲染 1280x720、2560x1440 或 3840x2160,然后让 thumbcheck.py fit 生成 1920x1080。
  • 附加图像陷阱。 文本到图像端点没有图像字段;它会忽略照片但仍计费。任何引用 → 使用 /edit 端点。
  • 全新生成陷阱。 以高质量重新运行提示会产生不同的图片(此系列中无 seed)。最终版是选中项的编辑。
  • 大小写陷阱。 切勿让模型将土耳其语转为大写:你自己编写最终字符串(thumbcheck.py text),用引号括起来,并逐字检查。

工作流

  1. 接收。 标题或主题、格式(默认 16:9)、是否有人脸、品牌色、引用。HEIC、AVIF、TIFF 或非常大的照片首先:thumbcheck.py fit <file> --max-side 2048 --out .genmedia/tmp/<name>.jpg;读取并上传该副本。在计划之前使用读取工具打开每个本地图像(其中的人或物决定了概念)。用户视频的帧:python3 "${CLAUDE_SKILL_DIR}/scripts/thumbcheck.py" frame <video> --at <seconds or m:ss>,然后读取它。仅按 UX 规则 3 的允许花费问题预算。
  2. 状态卡片。 选取一个简短的 ASCII <slug>(eksi-maya):它是批次 label、账目过滤器、输出文件夹和项目文件夹。自然语言标签也可用;助手将 "Ekşi maya" 折叠为 Eksi-maya,该折叠形式即为文件夹名。使用写入工具编写 .genmedia/projects/<slug>/thumbnail.md,并在每一步后更新:
    # <title> — 缩略图
    promise: <一行:视频实际提供的内容>
    format: 16:9 | text language: <code> | face: <none | photo path | @handle> (consent: <yes, date | n/a>) | palette: <colours>
    [ ] concepts  [ ] drafts-1  [ ] gate  [ ] pick: -  [ ] final  [ ] revisions 0/3  [ ] delivered
    log:
    - <date> drafts-1: 1 <framework> "<TEXT>", 2 <framework> "<TEXT>", 3 <framework> "<TEXT>"
    
  3. 三个不同概念。 读取 references/frameworks.md。私下头脑风暴至少五个,保留使用不同框架的三个最强概念(不是同一想法的三种配色),每个都有自己的 2 到 4 个钩子词。对每个钩子运行文本检查,并使用其 upper 字符串原样:
    python3 "${CLAUDE_SKILL_DIR}/scripts/thumbcheck.py" text "şimdi izle" --lang tr
    
    钩子词和图片只能使用用户声明的内容(标题、简介、他们的文件)中的数字、结果、引用、产品和嘉宾;标题本身不提供这些 → 使用问题、无约束钩子或无文本概念,或询问(UX 规则 5)。拒绝任何违反真实性规则的概念。选择了人脸 → 三个概念中至少两个展示人脸。标题已包含钩子 → 一个概念可以无文本。
  4. 验证并定价。 每个端点的发现护栏,然后:
    python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" price openai/gpt-image-2.5/flare/edit,openai/gpt-image-2.5/sunburst/edit
    
    GPT Image 2.5 回答 1 units,这不是一个价格。此技能的美元计价:作业数量 x 行(依据大小、质量)来自 references/routing-image.md 中的 GPT Image 2.5 表格(t2i-typography 注释;编辑行已包含一个输入图像)+ references/platform.md §7 中每额外参考图像的参考津贴。过时提示(2026-09-19):草案 1280x720 medium 约 USD 0.01;最终版或修订 2560x1440 high 约 USD 0.055;3840x2160 high 约 USD 0.10。典型完整作业(3 个草案 + 最终版 + 3 个修订):无参考时约 USD 0.25,带一个人脸参考时约 USD 0.45 → 低于默认发布阈值,运行并在交付行中说明估算。第二轮草案、更多参考、xhigh、max、4K 或一个请求中的多个视频(每个视频一个 slug 和状态卡片;估算是总和)→ 首先重新计算并应用成本门控。
  5. 一次性批量生成草案。 上传参考一次并保留 urls(参数顺序);上传是公共 URL,对于私人材料说明一次:
    python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" upload ./me.jpg
    
    根据 references/prompt-blueprint.md 构建每个提示。使用写入工具将计划写入 .genmedia/projects/<slug>/drafts-1.json:
    {"label": "<slug>", "max_parallel": 3, "jobs": [
      {"id": "draft-a", "endpoint_id": "openai/gpt-image-2.5/flare/edit", "est_cost_usd": 0.02,
       "input": {"prompt": "<concept A>", "image_urls": ["<face url>"], "image_size": {"width": 1280, "height": 720}, "quality": "medium", "num_images": 1, "output_format": "png"}},
      {"id": "draft-b", "endpoint_id": "openai/gpt-image-2.5/flare/edit", "est_cost_usd": 0.02, "input": {"prompt": "<concept B>", "image_urls": ["<face url>"], "image_size": {"width": 1280, "height": 720}, "quality": "medium", "num_images": 1, "output_format": "png"}},
      {"id": "draft-c", "endpoint_id": "openai/gpt-image-2.5/flare/edit", "est_cost_usd": 0.02, "input": {"prompt": "<concept C>", "image_urls": ["<face url>"], "image_size": {"width": 1280, "height": 720}, "quality": "medium", "num_images": 1, "output_format": "png"}}
    ]}
    
    使用写入工具编写计划,然后运行:
    python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" run .genmedia/projects/<slug>/drafts-1.json
    
    读取结果(每个作业文件夹中的 output.png),创建比较表(thumbcheck.py sheet 或本地图像的 HTML),在状态卡片中勾选 [x] drafts-1,并硬停止 — 等待用户选择。切勿在用户选择前进行最终版。
  6. 降级门控(如果第 5 步无预览工具)。 第 4 步后无法生成缩略图表 → 在交付草案时这样说:“三个概念作为独立文件准备好:[链接];选择后我进行最终版。”并将成本估算添加到交付行。勾选状态卡片中的 [x] gate。
  7. 最终版。 用户选择了一个草案(draft-a、b 或 c)。从 drafts-1.json 记录中读取其提示,并在编辑端点中将所选图像作为参考:
    python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" upload .genmedia/projects/<slug>/draft-a/output.png
    
    编写 .genmedia/projects/<slug>/final.json:
    {"label": "<slug>", "max_parallel": 1, "jobs": [
      {"id": "final", "endpoint_id": "openai/gpt-image-2.5/sunburst/edit", "est_cost_usd": 0.055,
       "input": {"prompt": "<same concept prompt, maybe refined>", "image_urls": ["<selected draft url>", "<original references>"], "image_size": {"width": 2560, "height": 1440}, "quality": "high", "num_images": 1, "output_format": "png"}}
    ]}
    
    运行它,读取输出,使用 thumbcheck.py fit 调整大小为 1920x1080 和 1280x720 进行交付,更新状态卡片 [x] final。
  8. 修订。 用户请求更改(文本、表情、背景、颜色)。每轮一个范围。如果可能使用与最终版相同的端点(sunburst/edit),并将当前最终版作为图像 1。编写 .genmedia/projects/<slug>/revision-1.json,运行,更新状态卡片 [x] revisions 1/3,交付。最多 3 轮。
  9. 交付。 最终文件和调整大小版本。交付行声明格式、文本语言、调色板、成本(~USD 0.25 结构,USD 0.45 总计)、以及人脸是 AI 生成的(如适用)。
  10. 完成。 勾选 [x] delivered。无需额外操作。

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

funi-ai/ads

Ads from the user's REAL product: UGC and polished ad videos (presenter, unboxing, showcase, testimonial, TV spot) and static ads with copy. Physical products: keyframes locked to the product photo, Seedance clips or TTS + OmniHuman, GPT Image 2.5 copy. Apps and SaaS: real captures and recordings, composited, never regenerated. Use when: "make a UGC ad for this product", "15 second TikTok ad", "static ad with this headline", "app install ad from my screen recording", "A/B ad variants", "bu ürün için reklam videosu yap", "uygulamam için reklam hazırla", "indirim görseli hazırla". Chain: consumes `product-photoshoot` stills, `character` @handles, `launch-graphics` pages; produces ads and a manifest. NOT for: text-free product photos (use `product-photoshoot`); posters (use `image`); listing cards (use `marketplace-cards`); store screenshots, OG cards (use `launch-graphics`); one clip (use `video`); organic shorts (use `short-video`); product demos (use `demo-video`); thumbnails (use `youtube-thumbnail`).

funi-ai/demo-video

Product demos, store previews, App Store header/search videos and loops cut from the user's REAL screen recording: trimmed, sped, zoomed, framed, captioned, voiced with local ffmpeg. Models add only what is not the product: narration (Eleven v3, Gemini TTS for Turkish), music and UI sound. Use when: "make a demo video of my app", "App Store preview video", "App Store header video", "Google Play promo video", "turn this screen recording into a demo", "GIF loop for my changelog", "Product Hunt launch video", "ekran kaydımdan tanıtım videosu yap", "changelog için GIF döngüsü". Chain: takes recordings, device frames (`layers`) and end cards from `launch-graphics`; produces MP4, WebM, GIF, SRT/VTT and posters. NOT for: generated b-roll shorts (use `short-video`); explainers with generated pictures (use `video-explainer`); paid ads (use `ads`); store screenshots, link cards (use `launch-graphics`); one generated clip (use `video`); voice or music alone (use `audio`); joining finished files (use `pipelines`).

相关技能