Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add Bwkyd/wps-skills --skill wps-ppt-gengit clone --depth 1 https://github.com/Bwkyd/wps-skillsWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/bwkyd/wps-skills/wps-ppt-gen)<a href="https://agentmods.dev/skills/bwkyd/wps-skills/wps-ppt-gen"><img src="https://agentmods.dev/badge/skills/bwkyd/wps-skills/wps-ppt-gen/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/bwkyd/wps-skills/wps-ppt-gen"><img src="https://agentmods.dev/badge/skills/bwkyd/wps-skills/wps-ppt-gen.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00075 | $0.03431 |
| Opus 5 | $0.00037 | $0.01716 |
| Sonnet 5 | $0.00015 | $0.00686 |
| Haiku 4.5 | $0.00007 | $0.00343 |
Grade A, and why
wps-ppt-gen scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 11d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 375 lines — stays where its author put it; the contents beside it link to each section on GitHub.
WPS PPT 生成器
从主题大纲 → 自动生成完整的精美 PPT(.pptx)。
When to Use
- 用户需要制作PPT/演示文稿
- 用户说"帮我做一个PPT"
- 用户需要述职报告/项目汇报/产品介绍/培训课件等PPT
- 用户有内容大纲想转成PPT
When NOT to Use
- 只需要PPT大纲不需要文件 → 使用
wps-ppt-outline - 已有PPT需要美化 → 使用
wps-ppt-polish - 需要教学课件特殊排版 → 使用
wps-courseware
风格选择菜单
┌─────────────────────────────────────────────┐
│ WPS PPT 风格选择 │
├─────────────────────────────────────────────┤
│ │
│ [1] 📊 简约商务 白底+深色文字+蓝色强调 │
│ [2] 🚀 科技风 深色底+渐变+几何元素 │
│ [3] 🏛️ 党政风 红色主调+庄重+国徽元素 │
│ [4] 📚 教育风 清新+活泼配色+图文混排 │
│ [5] 🎨 创意风 大图背景+极简文字 │
│ [6] 📈 数据风 图表为主+数据驱动 │
│ │
│ 输入编号或风格名称选择 │
└─────────────────────────────────────────────┘
工作流程
Step 1: 确认需求
- 主题:PPT的主题是什么?
- 场景:述职/汇报/产品/培训/竞标/其他?
- 页数:期望多少页?(默认15-20页)
- 风格:从上方菜单选择(默认简约商务)
- 特殊要求:是否需要图表?是否有固定模板?
Step 2: 生成大纲
根据场景生成PPT结构大纲:
述职报告(推荐15-20页):
1. 封面(标题+姓名+部门+日期)
2. 目录
3-4. 工作回顾(KPI完成情况)
5-7. 重点项目(每项1-2页)
8-9. 数据成果(图表页)
10-11. 经验总结与反思
12-13. 下阶段计划
14. 需要的支持
15. 感谢页
项目汇报(推荐12-15页):
1. 封面
2. 目录
3. 项目背景
4-5. 项目目标与范围
6-8. 实施进展(里程碑)
9-10. 关键成果/数据
11. 风险与问题
12. 下一步计划
13. 时间表
14. 资源需求
15. Q&A
产品介绍(推荐10-15页):
1. 封面(产品名+Slogan)
2. 痛点/市场背景
3. 解决方案概览
4-6. 核心功能(每项1页)
7. 竞品对比
8-9. 客户案例/数据
10. 定价方案
11. 合作流程
12. 联系方式
Step 3: 生成 .pptx 文件
确保依赖:
pip install python-pptx 2>/dev/null || pip3 install python-pptx 2>/dev/null
核心代码框架:
from pptx import Presentation
from pptx.util import Inches, Pt, Mm, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.enum.shapes import MSO_SHAPE
import os
class PPTGenerator:
"""中式PPT生成器"""
# 预置风格配色
THEMES = {
'business': {
'name': '简约商务',
'bg': RGBColor(0xFF, 0xFF, 0xFF),
'title': RGBColor(0x1F, 0x38, 0x64),
'accent': RGBColor(0x2B, 0x57, 0x9A),
'text': RGBColor(0x33, 0x33, 0x33),
'light': RGBColor(0xE8, 0xEE, 0xF7),
'title_font': '微软雅黑',
'body_font': '微软雅黑',
},
'tech': {
'name': '科技风',
'bg': RGBColor(0x0A, 0x1A, 0x2F),
'title': RGBColor(0xFF, 0xFF, 0xFF),
'accent': RGBColor(0x00, 0xD4, 0xFF),
'text': RGBColor(0xCC, 0xCC, 0xCC),
'light': RGBColor(0x15, 0x2A, 0x45),
'title_font': '微软雅黑',
'body_font': '微软雅黑',
},
'gov': {
'name': '党政风',
'bg': RGBColor(0xFF, 0xFF, 0xFF),
'title': RGBColor(0xCC, 0x00, 0x00),
'accent': RGBColor(0xCC, 0x00, 0x00),
'text': RGBColor(0x33, 0x33, 0x33),
'light': RGBColor(0xFF, 0xE8, 0xE8),
'title_font': '方正小标宋简体',
'body_font': '仿宋_GB2312',
},
'edu': {
'name': '教育风',
'bg': RGBColor(0xFF, 0xFF, 0xFF),
'title': RGBColor(0x2E, 0x75, 0xB6),
'accent': RGBColor(0x4C, 0xAF, 0x50),
'text': RGBColor(0x33, 0x33, 0x33),
'light': RGBColor(0xE3, 0xF2, 0xFD),
'title_font': '微软雅黑',
'body_font': '微软雅黑',
},
}
def __init__(self, theme='business', widescreen=True):
self.prs = Presentation()
self.theme = self.THEMES.get(theme, self.THEMES['business'])
# 宽屏16:9(默认)或4:3
if widescreen:
self.prs.slide_width = Mm(338.67)
self.prs.slide_height = Mm(190.5)
else:
self.prs.slide_width = Mm(254)
self.prs.slide_height = Mm(190.5)
self.slide_width = self.prs.slide_width
self.slide_height = self.prs.slide_height
def add_bg(self, slide, color=None):
"""设置幻灯片背景色"""
bg = slide.background
fill = bg.fill
fill.solid()
fill.fore_color.rgb = color or self.theme['bg']
def add_shape(self, slide, left, top, width, height, color=None):
"""添加色块装饰"""
shape = slide.shapes.add_shape(
MSO_SHAPE.RECTANGLE, left, top, width, height
)
shape.fill.solid()
shape.fill.fore_color.rgb = color or self.theme['accent']
shape.line.fill.background()
return shape
def add_text_box(self, slide, left, top, width, height, text,
font_size=18, font_color=None, font_name=None,
bold=False, alignment=PP_ALIGN.LEFT):
"""添加文本框"""
txBox = slide.shapes.add_textbox(left, top, width, height)
tf = txBox.text_frame
tf.word_wrap = True
p = tf.paragraphs[0]
p.text = text
p.font.size = Pt(font_size)
p.font.color.rgb = font_color or self.theme['text']
p.font.name = font_name or self.theme['body_font']
p.font.bold = bold
p.alignment = alignment
return txBox
def add_cover(self, title, subtitle='', author='', date=''):
"""封面页"""
slide = self.prs.slides.add_slide(self.prs.slide_layouts[6]) # 空白
self.add_bg(slide)
# 左侧装饰条
self.add_shape(slide, Mm(0), Mm(0), Mm(12), self.slide_height)
# 标题
self.add_text_box(
slide, Mm(30), Mm(50), Mm(280), Mm(50), title,
font_size=36, font_color=self.theme['title'],
font_name=self.theme['title_font'], bold=True,
alignment=PP_ALIGN.LEFT
)
# 副标题
if subtitle:
self.add_text_box(
slide, Mm(30), Mm(105), Mm(280), Mm(30), subtitle,
font_size=20, font_color=self.theme['accent']
)
# 作者+日期
info = f'{author} {date}' if author else date
if info.strip():
self.add_text_box(
slide, Mm(30), Mm(150), Mm(280), Mm(20), info,
font_size=14, font_color=self.theme['text']
)
def add_toc(self, items):
"""目录页"""
slide = self.prs.slides.add_slide(self.prs.slide_layouts[6])
self.add_bg(slide)
self.add_text_box(
slide, Mm(30), Mm(15), Mm(100), Mm(20), '目录',
font_size=28, font_color=self.theme['title'],
font_name=self.theme['title_font'], bold=True
)
# 装饰线
self.add_shape(slide, Mm(30), Mm(40), Mm(60), Mm(2))
for i, item in enumerate(items):
y = Mm(55 + i * 22)
# 序号
num_shape = self.add_shape(
slide, Mm(30), y, Mm(10), Mm(10),
self.theme['accent']
)
num_shape.text_frame.paragraphs[0].text = str(i + 1).zfill(2)
num_shape.text_frame.paragraphs[0].font.size = Pt(11)
num_shape.text_frame.paragraphs[0].font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF)
num_shape.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
# 标题
self.add_text_box(
slide, Mm(48), y, Mm(250), Mm(15), item,
font_size=16, bold=False
)
def add_content_slide(self, title, bullets, note=''):
"""内容页(标题+要点列表)"""
slide = self.prs.slides.add_slide(self.prs.slide_layouts[6])
self.add_bg(slide)
# 标题区
self.add_shape(slide, Mm(0), Mm(0), self.slide_width, Mm(40),
self.theme['light'])
self.add_text_box(
slide, Mm(30), Mm(8), Mm(280), Mm(25), title,
font_size=24, font_color=self.theme['title'],
font_name=self.theme['title_font'], bold=True
)
# 要点列表
for i, bullet in enumerate(bullets):
y = Mm(55 + i * 25)
# 圆点
self.add_shape(slide, Mm(30), y + Mm(4), Mm(4), Mm(4),
self.theme['accent'])
# 文本
self.add_text_box(
slide, Mm(40), y, Mm(270), Mm(20), bullet,
font_size=16
)
def add_thank_slide(self, text='感谢聆听', subtext='THANK YOU'):
"""感谢页"""
slide = self.prs.slides.add_slide(self.prs.slide_layouts[6])
self.add_bg(slide)
self.add_text_box(
slide, Mm(0), Mm(60), self.slide_width, Mm(40), text,
font_size=44, font_color=self.theme['title'],
font_name=self.theme['title_font'], bold=True,
alignment=PP_ALIGN.CENTER
)
self.add_text_box(
slide, Mm(0), Mm(110), self.slide_width, Mm(20), subtext,
font_size=18, font_color=self.theme['accent'],
alignment=PP_ALIGN.CENTER
)
def save(self, filename):
self.prs.save(filename)
return os.path.abspath(filename)
What ships with it
2 files beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 11d ago First seen · 375 lines · 75 tokens per session scan A 9c51736e5b6c
wps-ppt-gen is a skill published in the GitHub repository Bwkyd/wps-skills (7 stars, last pushed 4mo ago), licensed MIT. It adds 75 tokens to every session and 3,431 once invoked, about $0.0004 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
docx-template-translator
Adaptive conversion of LaTeX, PDF, or Markdown sources into a complete Word .docx that follows a user-supplied .docx template. Use when pandoc --reference-doc alone is not enough — for thesis, dissertation, report, or institutional Word formatting that needs cover pages, declarations, TOC, heading numbering, captions…
法律文件脱敏处理
A browser-based and Python tool for removing sensitive details from legal Word documents and restoring them later. It can replace information such as names, dates, prices, bank accounts and case numbers while preserving document formatting.
note-organizer
Use this skill whenever the user wants to organize course materials, lecture notes, PPT/PDF/DOCX files, textbooks, personal notes, senior-student notes, historical exams, review questions, standards, manuals, or scattered study resources into a structured Markdown note library. Use it even when the user only says…
exhibition-outline
A template for turning an exhibition plan into a three-page presentation outline. The pages cover the theme, its explanation and visitor story, and a detailed area-by-area display plan.
tender-analysis
A workflow for reviewing tender documents, which are formal project requests that describe requirements and bidding rules. It extracts project details, technical and business conditions, deadlines, scoring rules, risks, and questions for clarification.
docx
Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx files). Triggers include: any mention of 'Word doc', 'word document', '.docx', or requests to produce professional documents with formatting like tables of contents, headings, page numbers, or letterheads. Also use when…