pptx (anthropics/skills)
建立、讀取與編輯 .pptx 與 .potx 簡報、範本、版面配置與備忘稿。
anthropics pptx:所有組別都通過我們的簡報檢查(5.0 對 4.99),技能多花 1.4 倍的 Token;有一次一句話提示的執行產出 LibreOffice 打不開的簡報
Codex CLI · gpt-6-astra
24.0 / 30
相對未使用技能的提升:+0.01 · 視情況推薦 · 17 次執行
視情況推薦:提升幅度 +0.01 低於 +1.0。推薦條件為總分至少 22/30、產出品質至少 3.5、提升幅度至少 +1.0。
SOTA
透過使用 Codex 測試。
涵蓋 Codex, Claude Code
Codex CLI 0.166(SOTA 等級):17 次評分執行。依我們的等級規則,在這裡通過也涵蓋 Claude Code;但這不代表第二等級的結果。
分數
每個維度為 0 到 5 分,六個維度相加即為滿分 30 的總分。每個維度都是 5 分最好。成本 5 分代表便宜又快速;安裝 5 分代表容易安裝。
- 觸發可靠性
- 5.0
- 相對未使用技能的提升
- 2.0
- 產出品質
- 5.0
- Token 與時間成本
- 3.0
- 安裝與可攜性
- 4.0
- 安全性
- 5.0
安全審查
安全靜態掃描:0 CRITICAL / 1 HIGH / 6 MEDIUM。人工審查:可在無網路沙箱中安全執行(已說明掃描器的發現)。掃描結果不能證明技能一定安全。
安裝
npx skills@latest add anthropics/skills --skill pptx
固定 Commit: ca45fc496a3436251f191354091d557da31c15b5
測試日期: 2026-11-02
我們測了什麼
- 建立一份提案簡報 — 建立 pitch.pptx:一份 5 頁、16:9 的簡報,為虛構產品 Falcon 的上市發表而做:標題頁、Problem 頁、Solution 頁、Traction 頁(含季度營收長條圖:Q1 12、Q2 18、Q3 27、Q4 35,單位 $k),以及結尾的 Ask 頁。…
- 插入並重新命名投影片 — 在 team.pptx 中把第 2 頁的標題改成「Revenue outlook」,並在它後面插入一張標題為「Risks」的新投影片,內含三個項目符號(supply delays、hiring、currency)。其餘每一頁與其演講者備忘稿都保持不變。將結果存回 team.pptx…
- 擷取大綱與表格 — 從 team.pptx 寫出 outline.txt(每行一個投影片標題,依順序)與 table.csv(結果頁上的表格,表頭列在前)。不要修改 team.pptx。
優點
- 技能即使未被點名也會被採用:6/6 次實驗組執行都讀取了技能檔案。
- 使用技能後的絕對品質很高:5.0 / 5。
缺點
- 相較未使用技能,沒有可測量的提升(+0.01,落在雜訊範圍內)。
- 對照組本身就拿到 4.99:這是天花板效應,所以測試無法顯示提升。
- 測試注意事項:原定 18 次執行只跑了 17 次,t3 的一句話提示組 n=1。批次在測試機上反覆發生 LibreOffice 當機後提前停止。
- 每個任務的每個組別 n=2;約 1 分以內的差異屬於雜訊。
評測
在 Mac 測試機上使用 Codex CLI 0.166(gpt-6-astra,低推理),每次執行都建立全新的暫存專案與暫存的 HOME/TMPDIR/快取,分別安裝技能(實驗組)、未安裝技能(對照組),或未安裝技能但把技能的核心要求濃縮成一句話附在提示詞後(一句話提示組);每個任務的每個組別執行 2 次,關閉網路,封鎖 /tmp 寫入。提示詞從未提到技能(下方註明的措辭除外)。三個任務:建立一份 5 頁、16:9 的提案簡報(每頁都有演講者備忘稿、原生可編輯圖表、真正的項目符號、所有內容都在投影片上、可在 LibreOffice 開啟);在 team.pptx 中把第 2 頁重新命名,並在它後面插入一張標題為「Risks」、含三個項目符號的投影片,其餘投影片、表格與演講者備忘稿都保持不變;把投影片標題與表格擷取到文字檔,且不修改簡報。兩組都使用相同的離線 pptxgenjs 與 python-pptx 副本。檢查使用 python-pptx,並在我們這邊離線進行 LibreOffice 轉檔。原定 18 次執行,實際跑了 17 次:批次提前停止(見限制),因此一句話提示組在擷取任務上少一次執行。
三組對照
| 組別 | 平均分數(0-5) | 每次執行 Token 用量 |
|---|---|---|
| 未使用技能 | 4.99 | 114k |
| 一句話提示 | 4.86 | 224k |
| 使用技能 | 5.0 | 162k |
以 Codex CLI 執行 17 次,採規則式檢查評分,不經 LLM 評審。總分 24.0 / 30,評級為 視情況推薦。
揭露事項:原定 18 次執行只跑了 17 次:t3 的一句話提示組 n=1。批次在測試機上反覆發生 LibreOffice 當機後提前停止。
評定:視情況(24.0 / 30)。 來源:anthropics/skills,skills/pptx,固定於 commit ca45fc4。安裝:npx skills@latest add anthropics/skills --skill pptx。授權: 專有(技能目錄中的 LICENSE.txt):以唯讀方式評估,未再散布。
這是什麼
anthropics/skills 的 pptx 技能:用 pptxgenjs 建立簡報(附上一份會導致檔案損毀的陷阱清單)、透過解壓縮並以輔助腳本編輯投影片 XML(add_slide.py、clean.py、thumbnail.py)來編輯簡報、用 markitdown 讀取內容,並以 scripts/office/validate.py 與 LibreOffice 驗證。SKILL.md 約 3,100 字,外加 Python 腳本與 OOXML schema;專有授權,以唯讀方式評估。
我們如何測試
在 Mac 測試機上使用 Codex CLI 0.166(gpt-6-astra、低推理),每次執行都使用全新的臨時專案與臨時 HOME/TMPDIR/快取,安裝技能(使用技能組)、不安裝(對照組),或是不安裝但把技能核心要求濃縮成一句話附加在提示詞後(一句話組);每個任務的每組各執行 2 次,關閉網路、封鎖 /tmp 寫入。提示詞完全沒有提到技能名稱(下述措辭除外)。
三個任務:建立一份 5 張投影片的 16:9 募資簡報(每張都有講者備註、原生可編輯圖表、真正的項目符號、所有內容都在投影片內、可在 LibreOffice 開啟);在 team.pptx 中把第 2 張投影片改標題,並在後面插入一張標題為 'Risks' 的投影片與三個項目符號,同時保留其他投影片、表格與講者備註;把投影片標題與表格匯出成文字檔,且不修改簡報。兩組都有相同的 pptxgenjs 與 python-pptx 離線副本。檢查在我們這邊離線以 python-pptx 加上 LibreOffice 轉檔完成。原定 18 次執行,實際跑了 17 次:批次提前中止(見限制),因此一句話組在匯出任務少一次執行。
- 建立募資簡報 — 建立 pitch.pptx:一份 5 張投影片的 16:9 簡報,用於虛構產品 Falcon 的發表:標題投影片、Problem 投影片、Solution 投影片、Traction 投影片(含季度營收長條圖:Q1 12、Q2 18、Q3 27、Q4 35,單位 $k),以及結尾的 Ask 投影片。E…
- 插入並改標題 — 在 team.pptx 中把第 2 張投影片的標題改成 'Revenue outlook',並在緊接其後插入一張標題為 'Risks' 的新投影片,含三個項目符號(供應延遲、人力招募、匯率)。其他每張投影片與其講者備註都保持不變。將結果存為 team.pptx…
- 匯出大綱與表格 — 從 team.pptx 寫出 outline.txt(每行一個投影片標題,依順序)與 table.csv(結果投影片上的表格,表頭列在前)。請勿修改 team.pptx。
評分採程式化方式(隱藏測試/植入問題召回/限制條件檢查/視情況搭配渲染+OCR),每次執行 0–5 分。所有分數都不是由 LLM 評審決定。
結果
給第三組的一句話提示:"把簡報做成真正的 PowerPoint 物件:先設定 16:9 版面,使用原生可編輯圖表(不是圖片)、真正的項目符號(絕不手打 '•' 字元)、透過備註 API 加入講者備註、讓每個圖形都留在投影片內,並轉成 PDF 確認檔案能開啟;編輯時只改被要求的部分,其他投影片與備註維持原樣,不要留下工作檔案。"
| 任務 | 對照組分數 | 一句話提示 | 使用技能 | 對照組 token | 一句話組 token | 使用技能 token | 技能讀取 |
|---|---|---|---|---|---|---|---|
| t1-new | 4.96 | 5.0 | 5.0 | 147k | 342k | 185k | 2/2 |
| t2-edit | 5.0 | 4.65 | 5.0 | 114k | 175k | 199k | 2/2 |
| t3-extract | 5.0 | 5.0 | 5.0 | 79k | 80k | 99k | 2/2 |
平均分數:未使用技能 4.99,使用技能 5.0(差異 +0.01)。每次執行 token:114k 對 162k(1.42x);時間 67 秒對 70 秒。一句話組:4.86(技能相對一句話提示的增益:+0.14;一句話提示相對未使用技能的增益:-0.12);一句話組每次執行 224k token,因此技能成本是一句話提示的 0.72 倍。
實際情況
- 分數沒有差異:對照組 4.99、一句話組 4.86、使用技能 5.00。對照組本來就能做出正確的簡報(5 張投影片、每張都有備註、原生圖表、沒有手打的項目符號、圖形都在投影片內、可在 LibreOffice 開啟),也能用 python-pptx 完成編輯,且不遺失備註或表格。
- 技能成本更高:每次執行 162k token,對照組 114k(1.4x),一句話版本 224k(2.0x),主要花在建立任務(技能 185k,一句話版本 325–361k,對照組 118–176k)。
- 有一次失敗,在一句話組:它編輯後的 team.pptx 可用 python-pptx 開啟,但 LibreOffice 無法轉檔(我們這邊重現兩次);agent 自己也回報 LibreOffice 當掉了。技能組的六份簡報全都轉檔成功,六次技能執行也都跑了它的 validate.py。
- 技能在 6/6 次執行中都被讀取,而且 6 次都用了它的 markitdown、validate.py 與 LibreOffice 包裝器(soffice.py)。對照組從未呼叫 LibreOffice;一句話組 5 次中有 4 次直接呼叫 soffice。
面向分數
| 面向 | 分數 | 原因 |
|---|---|---|
| 1_output_quality | 5.0 | 使用技能時平均 5.00/5(程式化檢查,見各任務表)。 |
| 2_lift_vs_no_skill | 2.01 | 相對未使用技能的 4.99 提升 +0.01 分(每個任務 n=2;約 1 分以下屬雜訊)。 |
| 3_trigger | 5.0 | 使用技能組 6/6 次執行都讀取技能檔案。 |
| 4_instructions_portability | 4 | 假定已安裝 pptxgenjs、python-pptx、markitdown 與 LibreOffice;以 Linux 沙盒為導向。 |
| 5_efficiency | 3 | token 1.42x(每次執行 162k 對 114k)、時間 1.04x(70 秒對 67 秒)。 |
| 6_safety_hygiene | 5 | 已讀過腳本:soffice.py(LibreOffice 啟動器;僅在 Linux 且 socket 被封鎖時編譯一個小型 LD_PRELOAD shim)、thumbnail.py、add_slide.py、clean.py 與驗證器;沒有網路、沒有存取憑證。 |
這項測試的限制
- 批次在 18 次執行中的第 17 次停止:agent(多為技能組與一句話組)把簡報轉成 PDF 時,LibreOffice 在測試電腦上反覆當掉,使用者要求我們停止。所有結果都來自已完成的執行;缺少一次一句話組的匯出執行。
- 規則檢查(結構、備註、圖表、邊界、能否開啟);沒有評斷投影片的視覺品質,也沒有實際演練技能中的設計指引(色盤、版面構想)。
- 小型簡報;5 張與 3 張投影片。範本驅動的編輯、合併/分割與註解都沒有測試。
- 檢查中的轉檔在我們這邊離線執行;造成當機的是 agent 自己在測試電腦上使用 LibreOffice。
- 每組每任務 n = 2:約 1 分以下的差異屬雜訊。
- 規則式評分只能衡量檢查項目看得到的部分,無法判斷品味,也無法判斷結果是否為最佳。
安全性
請見 security.md。掃描:CRITICAL 0 / HIGH 1 / MEDIUM 6。評定:可安全執行(無網路沙盒)。掃描乾淨並不代表技能安全。
總結
在小型簡報上,搭配 python-pptx 的一般 Codex 本來就能產出正確、有效的檔案,因此技能的陷阱清單與驗證器多花了約 40% token,分數卻沒有提高。它的驗證器與轉檔步驟對較大型或範本式的簡報有用,但這項測試沒有涵蓋那些情況。請注意,技能本身的工作流程會呼叫 LibreOffice,而它在某些桌機環境可能不穩定。
完整紀錄
執行日誌:pptx (Codex CLI, network off, per-run temp HOME/TMPDIR, one row per graded run.) 欄位:任務、組-輪次、得分(0-5)、token、秒、通過的檢查、代理開啟的 skill 檔案。 t1-new control-1: 得分 4.92, token 117727, 秒 118.4, 檢查 1/2, 未開啟 t1-new control-2: 得分 5.0, token 176319, 秒 129.0, 檢查 2/2, 未開啟 t1-new oneliner-1: 得分 5.0, token 324776, 秒 128.1, 檢查 2/2, 未開啟 t1-new oneliner-2: 得分 5.0, token 360676, 秒 134.3, 檢查 2/2, 未開啟 t1-new treatment-1: 得分 5.0, token 183150, 秒 123.4, 檢查 2/2, 開啟 pptx t1-new treatment-2: 得分 5.0, token 187890, 秒 110.7, 檢查 2/2, 開啟 pptx t2-edit control-1: 得分 5.0, token 115865, 秒 43.4, 檢查 2/2, 未開啟 t2-edit control-2: 得分 5.0, token 113982, 秒 42.2, 檢查 2/2, 未開啟 t2-edit oneliner-1: 得分 4.31, token 147330, 秒 67.2, 檢查 1/2, 未開啟
17 次執行、3 個產出檔案
範例產出
SOTA · 装了 skill:create_pitch.js(t1-new,第 1 次,Codex)
const pptxgen=require('pptxgenjs'); const p=new pptxgen();p.layout='LAYOUT_WIDE';p.title='Falcon launch';p.author='Falcon';p.theme={headFontFace:'Arial',bodyFontFace:'Arial',lang:'en-US'}; const dark='192620',green='C2F36B',muted='56665C'; function t(s,text,x,y,w,h,size=20,color=dark,bold=false){s.addText(text,{x,y,w,h,fontSize:size,fontFace:'Arial',color,bold,margin:0});} function base(n,d=false){const s=p.addSlide();s.background={color:d?dark:'FFFFFF'};t(s,'FALCON / LAUNCH',.65,.35,6,.25,10,d?green:muted,true);t(s,String(n).padStart(2,'0'),12,6.9,.6,.25,10,d?'FFFFFF':muted);return s;} function list(s,items,x,y,w,h,color=dark,size=22){s.addText(items.map((text,i)=>({text,options:{bullet:{indent:size},hanging:4,breakLine:i<items.length-1}})),{x,y,w,h,fontFace:'Arial',fontSize:size,color,margin:0,paraSpaceAfter:23,valign:'top'});} function box(s,x,y,w,h,color){s.addShape(p.ShapeType.roundRect,{x,y,w,h,fill:{color},line:{color,transparency:100},radius:.15});} let s=base(1,true);t(s,'Falcon',.75,1.45,8,1.1,66,'FFFFFF',true);t(s,'Turn team plans into\nforward motion.',.75,2.85,8,1.5,34,'FFFFFF');t(s,'One workspace for priorities, owners, and progress.',.75,4.85,8,.7,20,'B9C8BE');s.addShape(p.ShapeType.chevron,{x:10,y:1.8,w:1.2,h:3.3,fill:{color:green},line:{color:green}});s.addShape(p.ShapeType.chevron,{x:11.4,y:2.5,w:.6,h:1.9,fill:{color:'71964A'},line:{color:'71964A'}});t(s,'Fictional product • Illustrative launch pitch',.75,6.5,8,.3,11,'B9C8BE');s.addNotes('Introduce Falcon as a fictional work-management product for growing teams. Its promise is to turn plans into coordinated action through shared priorities, owners, and progress. All business details are illustrative; quarterly revenue was supplied for this pitch.'); s=base(2);t(s,'Problem',.65,1,10,.65,40,dark,true);t(s,'Work moves faster than the tools tracking it.',.65,1.85,12,.6,25,muted);list(s,['Priorities scatter across chats, docs, and spreadsheets.','Unclear ownership delays decisions and handoffs.','Manual updates hide risks until deadlines slip.'],.8,3,7.1,3);box(s,9,2.85,3.55,3.15,'F0F5F1');t(s,'The cost',9.35,3.2,2.8,.4,20,muted,true);t(s,'More chasing.\nLess shipping.',9.35,3.95,2.8,1.3,30,dark,true);s.addNotes('Growing teams often keep priorities in multiple places, leaving owners and dependencies unclear. Explain how this creates time spent chasing updates. These are product assumptions for a fictional launch, not research findings.'); s=base(3);t(s,'Solution',.65,1,10,.65,40,dark,true);t(s,'One shared view. A clear next step.',.65,1.85,12,.6,25,muted);[['01','Align priorities',['Capture goals in one place.','Link tasks to outcomes.']],['02','Assign owners',['Give every task an owner.','Make deadlines visible.']],['03','Advance work',['Track progress together.','Flag blockers early.']]].forEach((a,i)=>{let x=.65+i*4.1;box(s,x,2.9,3.8,3.3,'F0F5F1');t(s,a[0],x+.3,3.2,1,.5,28,'638831',true);t(s,a[1],x+.3,4,3.2,.6,23,dark,true);list(s,a[2],x+.3,4.9,3.1,1.1,dark,16);});s.addNotes('Walk through the proposed workflow: align on priorities, assign owners, and advance work with visible progress and blockers. These are conceptual features of the fictional Falcon product. Emphasize the va [... excerpt: first 3200 of 5381 characters]