Evals / documents / Read a document
Read a deck with notes
Extract all the text of show.pptx, including the speaker notes, into show.txt.
The task
The reference answer shows the job can be done with deft. It is not an agent run.
deft slides to-text show.pptx --notes -o show.txt
Input

Rendered by macOS Quick Look, first page
Text inside
[ppt/slides/slide1.xml] Title of the first slide Subtitle of the first slide This bit is in italic green [ppt/slides/slide2.xml] This is the second slide It has bullet points on it They’re fun, aren’t they? Especially in a different font like Arial Black at 16 point!
Reference output
Title of the first slide Subtitle of the first slide This bit is in italic green I am the notes of the first slide This is the second slide It has bullet points on it They’re fun, aren’t they? Especially in a different font like Arial Black at 16 point! These are the notes of the 2nd slide THIS LINE IS BOLD
How a result is judged (1 check)
- text: file = "show.txt", contains = ["Title of the first slide", "I am the notes of the first slide"]
Runs
CodexWithout deftPassed2026-11-07
- Time
- 19s
- New tokens
- 5.8k
- Total input
- 70.1k
- Output tokens
- 0.7k
- Commands
- 4
- Failed
- 0
Trace
I’ll extract the slide text and speaker notes from the presentation into `show.txt` in the current directory.
rg --files -g 'show.pptx' -g 'AGENTS.md' -g 'show.txt'output
show.pptx
python3 - <<'PY' import importlib.util for m in ['pptx','lxml']: print(m, bool(importlib.util.find_spec(m))) PYoutput
pptx False lxml False
unzip -l show.pptxoutput
Archive: show.pptx Length Date Time Name --------- ---------- ----- ---- 1355 01-01-1980 00:00 docProps/app.xml 846 01-01-1980 00:00 docProps/core.xml 4794 01-01-1980 00:00 docProps/thumbnail.jpeg 7378 01-01-1980 00:00 ppt/notesMasters/notesMaster1.xml 292 01-01-1980 00:00 ppt/notesMasters/_rels/notesMaster1.xml.rels 1568 01-01-1980 00:00 ppt/notesSlides/notesSlide1.xml 1793 01-01-1980 00:00 ppt/notesSlides/notesSlide2.xml 447 01-01-1980 00:00 ppt/notesSlides/_rels/notesSlide1.xml.rels 447 01-01-1980 00:00 ppt/notesSlides/_rels/notesSlide2.xml.rels 3699 01-01-1980 00:00 ppt/presentation.xml 816 01-01-1980 00:00 ppt/presProps.xml 4094 01-01-1980 00:00 ppt/slideLayouts/slideLayout1.xml 2706 01-01-1980 00:00 ppt/slideLayouts/slideLayout10.xml 2930 01-01-1980 00:00 ppt/slideLayouts/slideLayout11.xml 2651 01-01-1980 00:00 ppt/slideLayouts/slideLayout2.xml 4206 01-01-1980 00:00 ppt/slideLayouts/slideLayout3.xml 4304 01-01-1980 00:00 ppt/slideLayouts/slideLayout4.xml 6789 01-01-1980 00:00 ppt/slideLayouts/slideLayout5.xml 2011 01-01-1980 00:00 ppt/slideLayouts/slideLayout6.xml 1714 01-01-1980 00:00 ppt/slideLayouts/slideLayout7.xml 4474 01-01-1980 00:00 ppt/slideLayouts/slideLayout8.xml 4422 01-01-1980 00:00 ppt/slideLayouts/slideLayout9.xml 311 01-01-1980 00:00 ppt/slideLayouts/ … 1579 more characterspython3 - <<'PY' import zipfile, xml.etree.ElementTree as ET, re from pathlib import Path p=Path('show.pptx') ns={'a':'http://schemas.openxmlformats.org/drawingml/2006/main','p':'http://schemas.openxmlformats.org/presentationml/2006/main'} with zipfile.ZipFile(p) as z: slides=sorted((n for n in z.namelist() if re.fullmatch(r'ppt/slides/slide\\d+\\.xml',n)), key=lambda n:int(re.search(r'(\\d+)',n).group(1))) notes={int(re.search(r'notesSlide(\\d+)',n).group(1)):n for n in z.namelist() if re.fullmatch(r'ppt/notesSlides/notesSlide\\d+\\.xml',n)} out=[] for i,s in enumerate(slides,1): out.append(f'Slide {i}') root=ET.fromstring(z.read(s)) for sp in root.findall('.//p:sp',ns): texts=[t.text or '' for t in sp.findall('.//a:t',ns)] if texts: out.append(''.join(texts)) n=notes.get(i) if n: out.append('Speaker notes:') nr=ET.fromstring(z.read(n)) for sp in nr.findall('.//p:sp',ns): ph=sp.find('./p:nvSpPr/p:nvPr/p:ph',ns) if ph is not None and ph.attrib.get('type') in ('slidenum','sldImg'): continue texts=[t.text or '' for t in sp.findall('.//a:t',ns)] if texts: out.append(''.join(texts)) out.append('') Path('show.txt').write_text('\\n'.join(out),encoding='utf-8') PY cat show.txtoutput
Slide 1 Title of the first slide Subtitle of the first slideThis bit is in italic green Speaker notes: I am the notes of the first slide 1 Slide 2 This is the second slide It has bullet points on itThey’re fun, aren’t they?Especially in a different font like Arial Black at 16 point! Speaker notes: These are the notes of the 2nd slideTHIS LINE IS BOLD 2
Extracted the slide text and speaker notes into [show.txt](show.txt).
Output
Slide 1 Title of the first slide Subtitle of the first slideThis bit is in italic green Speaker notes: I am the notes of the first slide 1 Slide 2 This is the second slide It has bullet points on itThey’re fun, aren’t they?Especially in a different font like Arial Black at 16 point! Speaker notes: These are the notes of the 2nd slideTHIS LINE IS BOLD 2
CodexWith deft, skill installedPassedRead the skillUsed deft2026-11-07
- Time
- 15s
- New tokens
- 15.0k
- Total input
- 90.5k
- Output tokens
- 0.4k
- Commands
- 5
- Failed
- 0
Trace
I’ll inspect the available file tools and the presentation, then write the extracted slide text and speaker notes to `show.txt` in this directory.
rg --files -g 'show.pptx' -g 'AGENTS.md'output
show.pptx
I’m using the `deft` workflow for this PowerPoint extraction; I’ll check its instructions for preserving notes and then create the text file.
cat .agents/skills/deft/SKILL.mdoutput
--- name: deft description: "Use deft instead of writing a script for file jobs: PDF merge/split/compress/watermark, image resize/convert/compress, video and audio trim/convert/compress, spreadsheets, Markdown to PDF/HTML, and YouTube downloads and subtitles." --- # deft One local command for file jobs. Prefer it over writing Python or shell scripts. Syntax: `deft <group> <command> [inputs] [-o output] [--options]` Groups: - `pdf`: Merge, split, compress, encrypt, forms, OCR, compare, convert - `image`: Resize, crop, convert, compress, filters, montage, OCR - `video`: Trim, crop, speed, convert, compress, GIF, frames (ffmpeg) - `audio`: Convert, trim, merge, fade, speed, tag, normalize (ffmpeg) - `doc`: Word/ODT/RTF: to text, Markdown, HTML, PDF; find and replace - `slides`: PowerPoint: extract text, Markdown outline, PDF handout - `data`: JSON/YAML/TOML/XML: convert, query with jq syntax, merge, diff - `sheet`: Excel/CSV/ODS tables: filter, sort, join, pivot, convert - `md`: Markdown to PDF, HTML, Word, EPUB; table of contents - `html`: HTML to Markdown, text, Word, PDF; screenshots - `epub`: E-books: info, to text, Markdown and PDF - `email`: EML files: headers, text, attachments - `contact`: VCF address books: to and from CSV - `calendar`: ICS calendars: to and from CSV - `gps`: GPX and KML tracks: convert, distance and time - `youtube`: Info, download, audio, subtitles, thumbnail (yt-dlp) - `file`: Any file: hash, duplicates, batch rename, base64, encoding - `qr`: Cre … 728 more characters
deft slidesoutput
deft slides - commands (input -> output) info pptx -> report Slide count, titles, images, notes from-md md -> pptx Make a deck: each heading or --- starts a slide [beta] to-md pptx -> md Outline in Markdown: a heading per slide, bullets, images to-pdf pptx -> pdf Handout PDF of slide content [beta] to-text pptx -> txt Extract the text of every slide, form feed between slides More: deft slides <command> --help
deft slides to-text --helpoutput
deft slides to-text - Extract the text of every slide, form feed between slides Same as: deft convert Usage: deft slides to-text <pptx>... [-o <txt|dir>] [options] In: pptx (each handled separately) Out: txt (default <name>.<ext>) Options: --notes Include speaker notes Common: -o --force --dry-run --json -j (deft help common) Examples: deft slides to-text deck.pptx --notes -o deck.txt Result fields: slides
deft slides to-text show.pptx --notes -o show.txtoutput
ok slides.to-text show.pptx -> show.txt 2 slides 0.00s
Extracted the text from both slides, including speaker notes, into [show.txt](show.txt).
Output
Title of the first slide Subtitle of the first slide This bit is in italic green I am the notes of the first slide This is the second slide It has bullet points on it They’re fun, aren’t they? Especially in a different font like Arial Black at 16 point! These are the notes of the 2nd slide THIS LINE IS BOLD
Claude Opus 5.5Without deftPassed2026-11-07
- Time
- 16s
- New tokens
- 10.9k
- Total input
- 43.1k
- Output tokens
- 1.5k
- Commands
- 0
- Failed
- 0
Trace
Output
===== Slide 1 ===== Title of the first slide Subtitle of the first slide This bit is in italic green --- Speaker Notes --- I am the notes of the first slide ===== Slide 2 ===== This is the second slide It has bullet points on it They’re fun, aren’t they? Especially in a different font like Arial Black at 16 point! --- Speaker Notes --- These are the notes of the 2nd slide THIS LINE IS BOLD
Claude Opus 5.5With deft, skill installedPassedRead the skillUsed deft2026-11-07
- Time
- 10s
- New tokens
- 10.0k
- Total input
- 59.4k
- Output tokens
- 0.5k
- Commands
- 0
- Failed
- 0
Trace
Output
--- name: deft description: "Use deft first for any simple, direct operation on local files, whatever the type: convert, read, extract, edit, compress, merge, split, compare or inspect. Try it before writing a script or one-liner. If unsure, run deft find; if it says no command does this, use another tool. Not for programming work: to read, write or change source code, skip it." --- # deft One local command for file jobs. Prefer it over writing Python or shell scripts. Syntax: `deft <group> <command> [inputs] [-o output] [--options]` Groups: - `pdf`: Merge, split, compress, encrypt, forms, OCR, compare, convert - `image`: Resize, crop, convert, compress, adjust, montage, OCR - `video`: Trim, merge, convert, compress, subtitles, GIF, frames (ffmpeg) - `audio`: Convert, trim, normalize, denoise, cut silence (ffmpeg) - `doc`: Word/ODT/RTF: to text, Markdown, HTML, PDF; find and replace - `slides`: PowerPoint: extract text, Markdown outline - `sheet`: Excel/CSV/ODS tables: SQL query, pivot, merge, split, convert - `json`: JSON: convert, format, merge, diff, validate - `toml`: TOML: convert, format, merge, diff, validate - `xml`: XML: convert, format, merge, diff, validate - `yaml`: YAML: convert, format, merge, diff, validate - `md`: Markdown to PDF, HTML, Word, EPUB; table of contents - `html`: HTML to Markdown, text, Word and PDF - `epub`: E-books: info, to text, Markdown and PDF - `gps`: GPX and KML tracks: convert, distance and time - `qr`: Create QR codes and barcodes; read QR codes How to use it: 1. Run `deft <group>` to list commands, or `deft find "<what you want>"` to search. If it says `no command does this`, use another tool. 2. Run `deft <group> <command> --help` for options and examples. 3. `deft convert <in> -o <out.ext>` converts between formats by extension. 4. Results are one line starting with `ok`, `partial` or `error`; add `--json` to parse them. Errors include a `hint:` with the fix. Inputs are never overwritten; pass `--force` or `--in-place` to allow it. Globs and directories work as inputs; several inputs run in parallel. If `deft` is not installed, ask the user, then follow https://github.com/firstprayer/deft/blob/main/docs/INSTALL.md
Title of the first slide Subtitle of the first slide This bit is in italic green I am the notes of the first slide This is the second slide It has bullet points on it They’re fun, aren’t they? Especially in a different font like Arial Black at 16 point! These are the notes of the 2nd slide THIS LINE IS BOLD
Claude CodeWithout deftNot run yet
Claude CodeWith deftNot run yet