Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Creative-mode PPT pipeline. One full-page 16:9 PNG per slide. LLM / VLM calls go through sn-ppt-standard/lib/model_client.py (shared thin client). Text-to-image (the actual png rendering) goes through sn-image-base/scripts/sn_agent_runner.py. Falls back to web image search when T2I generation fails. Expects task_pack.json + info_pack.json already written by sn-ppt-entry.
.claude/skills/opensensenova-sn-ppt-creative/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 16% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 18% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 83% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 38% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 22% | 0% |
把公共 Story 转译成一套 16:9 整页视觉:每页生成一张完整 PNG,并可组装为 PPTX。 Creative 负责视觉转译,不负责 Research,不生成自己的内容大纲。
必须存在:
<DECK_DIR>/task_pack.json<DECK_DIR>/info_pack.json<DECK_DIR>/outline.mdtask_pack.choices.output == "creative",或旧任务的 ppt_mode == "creative"DECK_DIR 只能取 task_pack.deck_dir 的绝对路径。所有生成产物只写到该目录;不得写入 用户 home 根目录、宿主 workspace 根目录、Skill 目录、repo、/tmp 或另一个 workspace。 已有任务必须复用原 DECK_DIR,不得另建目录。
把当前 Skill 所在目录记为只读的 SKILL_ROOT,把同级 sn-ppt-tools/ 解析为绝对 PPT_TOOLS_DIR。开始生图前读取 $PPT_TOOLS_DIR/references/capability-policy.md。文本推理、风格判断和视觉理解使用宿主 Agent 原生能力;图片生成优先使用宿主原生工具,原生能力不存在或一次实际调用失败时, 才使用 PPT 整包自带的 image_generate.py。
不得调用 model_client.py、sn_agent_runner.py,不得要求用户在 Agent 外再配置文本或 视觉模型 API。
开始和恢复时重新读取磁盘上的 outline.md。它固定:
Creative 可以决定视觉隐喻、艺术媒介、构图、页面动势和信息图形语言,但不能:
outline.json;发现现有材料不足时,保留对应页位并明确缺口,返回 Entry/Story;不得在 Creative 内补做 Research。
读取 task_pack.choices.design_richness:
restrained:收敛构图、材质、文字装饰和视觉隐喻,优先稳定与清晰。rich:默认,在清晰信息层级上提供充分画面、页型变化和跨页一致性。high_creative:允许更大胆的构图、艺术媒介、英雄页面和视觉动势,但不牺牲文字可读性、事实和 Story。
丰富度只控制视觉投入,不改变页数、结论和 Research 边界。本发布版不再提供额外的 Artistic/Classical 分线选择。
textstyle_spec.md pages/ page_001.prompt.txt page_001.png page_002.prompt.txt page_002.png ... <deck_id>.pptx
style_spec.md 是出口内部的视觉说明,不是第二份 Story;它只能补充跨页视觉语言、构图 规则、配色、材质、字体气质和负面约束,不得重写 outline。
先运行:
bashpython3 "$SKILL_ROOT/scripts/resume_scan.py" --deck-dir "$DECK_DIR"
按磁盘真实产物继续:
style_spec.md 不存在:重新形成 deck 级视觉说明;page_NNN.prompt.txt 存在而 PNG 缺失:只重新生图;读取 task/info pack、当前 outline、用户材料索引、已有 Research 主报告以及 reference_image_captions。把 task_pack.state.current_stage 写为 output.creative.plan,状态写为 generating。
由宿主 Agent 直接形成 <DECK_DIR>/style_spec.md。至少明确:
有参考图片时使用宿主原生视觉能力理解它们,并优先复用 info_pack 中已有说明;同一张图 不重复理解。不得在本阶段搜索事实或改写 outline。
每一页从当前 outline 的同序号页面生成一个 <DECK_DIR>/pages/page_NNN.prompt.txt。prompt 必须包含:
style_spec.md 中需要跨页一致的视觉语言;不能把 style_spec.md、JSON、CSS 或内部字段名直接拼进 prompt。写完每页后执行:
bashpython3 "$SKILL_ROOT/scripts/sanitize_prompt.py" \ --path "$DECK_DIR/pages/page_NNN.prompt.txt"
一页一个独立 Agent 动作,不用单个脚本循环生成全套 prompt。每页完成后输出简短进度。
对每个缺少 PNG 的页面:
最终文件保存到 $DECK_DIR/pages/page_NNN.png。
bash python3 "$PPT_TOOLS_DIR/scripts/image_generate.py" \ --prompt-file "$DECK_DIR/pages/page_NNN.prompt.txt" \ --deck-dir "$DECK_DIR" \ --output "pages/page_NNN.png" \ --size "2752x1536"
伪造成功。
每页生图是一个独立工具调用,成功或失败后都输出 heartbeat。不得在第一次失败后循环 重试;用户后续明确要求重试时再恢复该页。
如果开始生产前已经确认原生和内置生图都不可用,保留 style、prompt 和前置公共产物, 把状态写为 partial 并停止 Creative 出口;不得静默切换到 Standard、Dynamic 或 Native PPTX。
所有页面处理后执行:
bashpython3 "$SKILL_ROOT/scripts/build_pptx.py" --deck-dir "$DECK_DIR"
脚本按页号把已有 PNG 满版放入 16:9 PPTX;缺失页保留为空白页并在结果中报告。脚本或 本地依赖不可用时,不安装新依赖,不改用其他构建器;逐页 PNG 仍是有效交付。
把 pages/ 和可用 PPTX 的绝对路径写入 task_pack.state.artifacts,把 creative 加入 completed_stages。全部页面成功时状态写 completed;存在缺页或打包失败时写 partial 和 last_error。
必须提供用户可见的简短进度:
text已进入 sn-ppt-creative,共 N 页 [style] style_spec.md 完成 [prompt 2/N] 完成 [图 2/N] page_002.png 完成 [pptx] <deck_id>.pptx 完成
失败时在对应行说明原因,然后继续。收尾只总结输出目录、成功页、失败页和 PPTX 状态, 并指出 outline.md 是用户可编辑的叙事源。
model_client.py、sn_agent_runner.py 或额外文本模型 API。outline.md。DECK_DIR。| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 4,627 | 15,864 | +243% | 1 | 1 | 0% | 522 | 3,114 | +497% | 0 | 0 | — |
case-02 | fail→fail | 11,209 | 8,148 | -27% | 1 | 1 | 0% | 299 | 2,627 | +779% | 0 | 0 | — |
case-03 | fail→fail | 8,119 | 10,630 | +31% | 1 | 1 | 0% | 246 | 2,580 | +949% | 0 | 0 | — |
case-04 | fail→pass | 35,547 | 4,016 | -89% | 1 | 1 | 0% | 2,418 | 2,802 | +16% | 0 | 0 | — |
case-05 | fail→pass | 17,381 | 5,537 | -68% | 1 | 1 | 0% | 2,530 | 2,984 | +18% | 0 | 0 | — |
case-06 | fail→pass | 13,476 | 8,948 | -34% | 1 | 1 | 0% | 1,649 | 3,022 | +83% | 0 | 0 | — |
case-07 | fail→pass | 18,408 | 4,302 | -77% | 1 | 1 | 0% | 2,045 | 2,818 | +38% | 0 | 0 | — |
case-08 | pass→fail | 9,291 | 4,810 | -48% | 1 | 1 | 0% | 778 | 2,853 | +267% | 0 | 0 | — |
case-09 | fail→fail | 12,728 | 5,152 | -60% | 1 | 1 | 0% | 1,629 | 2,980 | +83% | 0 | 0 | — |
case-10 | fail→fail | 13,326 | 5,461 | -59% | 1 | 1 | 0% | 1,751 | 2,940 | +68% | 0 | 0 | — |
case-11 | pass→pass | 18,216 | 7,637 | -58% | 1 | 1 | 0% | 2,265 | 3,038 | +34% | 0 | 0 | — |
case-12 | fail→pass | 12,423 | 3,622 | -71% | 1 | 1 | 0% | 2,254 | 2,744 | +22% | 0 | 0 | — |
case-13 | fail→pass | 12,919 | 5,693 | -56% | 1 | 1 | 0% | 1,644 | 3,188 | +94% | 0 | 0 | — |
case-14 | fail→pass | 13,009 | 3,978 | -69% | 1 | 1 | 0% | 1,926 | 2,793 | +45% | 0 | 0 | — |
case-15 | fail→fail | 9,036 | 6,984 | -23% | 1 | 1 | 0% | 1,562 | 2,977 | +91% | 0 | 0 | — |
case-16 | fail→pass | 7,443 | 3,713 | -50% | 1 | 1 | 0% | 1,122 | 2,758 | +146% | 0 | 0 | — |
case-17 | fail→pass | 12,456 | 3,370 | -73% | 1 | 1 | 0% | 1,780 | 2,800 | +57% | 0 | 0 | — |
case-18 | fail→pass | 13,847 | 6,493 | -53% | 1 | 1 | 0% | 1,911 | 2,977 | +56% | 0 | 0 | — |
case-19 | pass→fail | 40,663 | 13,818 | -66% | 1 | 1 | 0% | 3,617 | 3,527 | -2% | 0 | 0 | — |
case-20 | fail→pass | 41,711 | 39,874 | -4% | 1 | 1 | 0% | 8,227 | 10,271 | +25% | 0 | 0 | — |
case-21 | fail→fail | 21,143 | 24,404 | +15% | 1 | 1 | 0% | 2,114 | 4,740 | +124% | 0 | 0 | — |
case-22 | fail→fail | 3,119 | 3,781 | +21% | 1 | 1 | 0% | 288 | 2,633 | +814% | 0 | 0 | — |
case-23 | pass→pass | 10,593 | 4,895 | -54% | 1 | 1 | 0% | 1,514 | 2,941 | +94% | 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, and 20 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +39 percentage points is the difference between those two pass rates over the 20 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
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.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/4/2026 | +56% |
Other measured skills in the registry, with their headline benchmark lift.