Simon Willison 博客
精选
73AI 编辑部评分,满分 100

用 shot-scraper video 让 AI 智能体录制工作演示视频

2026-07-01 00:54· 47天前· Simon Willison
AI 导读

shot-scraper 1.10 新增 shot-scraper video 命令,支持通过 storyboard.yml 文件定义操作步骤,并利用 Playwright 录制浏览器视频。演示视频展示了 Datasette 中从粘贴的 CSV/TSV/JSON 数据创建新表的功能。该功能依赖 Playwright 1.61.0 新增的 screencast 机制,解决了此前视频开头白帧、宽度固定 800px 等问题。开发者 Simon Willison 强调,将 --help 输出设计得足够详细,可使编码 Agent 直接利用该命令生成演示视频。

推荐理由

Simon 把 agent 的产出从文字推到了视频,这个 shot-scraper video 让 agent 自己生成 storyboard 并录屏,等于给自动化流程加了一双眼睛,开发者可以立刻用上这套 demo 生成方案。

正文 · AI 翻译

shot-scraper video 是今天发布的 shot-scraper 1.10 版本中引入的一个新命令,它接受一个 storyboard.yml 文件,该文件定义了针对 Web 应用程序运行的一系列操作,并使用 Playwright 录制这些操作的视频。我之前写过关于编码智能体为其工作生成演示的重要性;这是我为实现这一目标所做的最新尝试。

以下是使用 shot-scraper video 创建的示例视频,演示了一个仍在开发中的功能——从粘贴的 CSV、TSV 或 JSON 数据在 Datasette 中创建新表:

该视频是通过运行以下命令创建的:

shot-scraper video datasette-bulk-insert-storyboard.yml \
  --auth datasette-demo-auth.json --mp4

(那个 --auth JSON 文件包含一个 cookie,如文档中所述。)

以下是 datasette-bulk-insert-storyboard.yml 文件:

output: /tmp/datasette-bulk-insert-demo.webm
server:
  - uv
  - --directory
  - /Users/simon/Dropbox/dev/datasette
  - run
  - datasette
  - -p
  - 6419
  - --root
  - --secret
  - "1"
  - /tmp/demo.db
url: http://127.0.0.1:6419/demo/tasks
viewport:
  width: 1280
  height: 720
cursor: true
wait_for: 'button[data-table-action="insert-row"]'
javascript: |
  (() => {
    let clipboardText = "";
    Object.defineProperty(navigator, "clipboard", {
      configurable: true,
      get: () => ({
        writeText: async (text) => {
          clipboardText = String(text);
        },
        readText: async () => clipboardText,
      }),
    });
  })();
scenes:
  - name: Bulk insert existing table rows
    do:
      - : 0.8
      - click: 'button[data-table-action="insert-row"]'
      - wait_for: "#row-edit-dialog[open]"
      - : 0.5
      - click: ".row-edit-bulk-insert"
      - wait_for: ".row-edit-bulk-textarea"
      - : 0.5
      - click: ".row-edit-copy-template"
      - wait_for: "text=Copied"
      - : 0.8
      - fill:
          into: ".row-edit-bulk-textarea"
          text: |
            title,owner,status,priority,notes
            Prepare release video,Ana,doing,1,Recorded with shot-scraper
            Check pasted CSV import,Ben,review,3,Previewed before inserting
            Share the branch demo,Chen,queued,2,Bulk insert creates three rows
      - : 0.8
      - click: ".row-edit-save"
      - wait_for: "text=Previewing 3 rows."
      - : 1.2
      - click: ".row-edit-save"
      - wait_for: "text=3 rows inserted."
      - : 1.0
      - click: ".row-edit-cancel"
      - wait_for: "text=Prepare release video"
      - : 1.0
  - name: Create a table from pasted CSV
    open: http://127.0.0.1:6419/demo
    wait_for: 'details.actions-menu-links summary'
    do:
      - : 0.8
      - click: 'details.actions-menu-links summary'
      - click: 'button[data-database-action="create-table"]'
      - wait_for: "#table-create-dialog[open]"
      - : 0.5
      - fill:
          into: ".table-create-table-name"
          text: "launch_metrics"
      - click: ".table-create-from-data"
      - wait_for: ".table-create-data-textarea"
      - : 0.5
      - fill:
          into: ".table-create-data-textarea"
          text: |
            metric_id,name,score,recorded_on
            m001,Activation rate,87.5,2026-06-29
            m002,Retention check,72.25,2026-06-30
            m003,CSV import health,95,2026-07-01
      - : 0.8
      - click: ".table-create-save"
      - wait_for: "text=Previewing 3 rows."
      - : 1.2
      - click: ".table-create-save"
      - wait_for_url: "**/demo/launch_metrics"
      - wait_for: "text=Activation rate"
      - : 1.2

视频命令文档中包含更简单的示例,但为了本文的目的,我决定采用更全面的示例。

那个演示用的 YAML storyboard 完全由运行在 Codex Desktop 中的 GPT-5.5 xhigh 构建,使用的提示词是在我本地该分支的 ~/dev/datasette 目录下运行的:

审查此分支上的更改。

切换到 ~/dev/shot-scraper 目录并运行命令 "uv run shot-scraper video --help"。

现在使用那个新的 video 命令录制此分支新功能的视频演示,包括运行一个 "uv run datasette -p 6419 --root --secret 1 /tmp/demo.db" 开发服务器,这样你就可以针对你首先创建的演示数据库来录制视频。

既然我已经发布了这个功能,提示词可以改为 "run uvx shot-scraper video --help",应该能达到同样的效果。

我非常喜欢这种模式:命令的 --help 输出提供了足够详细的信息,让编码智能体能够使用它——这有点像把 SKILL.md 文件直接捆绑在工具内部。我在 showboat 和 rodney 中也使用了相同的模式。

我是如何构建这个功能的

shot-scraper video 最初是一个实验性原型。shot-scraper 构建在 Playwright 之上,它所需的关键功能是让 Playwright 能够录制浏览器会话的视频,并且有足够的控制力来创建所需的演示。

我几年前第一次尝试这个功能,发现 Playwright 生成的视频包含了额外的浏览器界面元素,这些元素对调试测试失败很有用,但对于产品演示来说却是不需要的。

他们不久前修复了这个问题,但仍然存在一些小障碍。特别是,我录制的视频开头会出现几帧白屏,因为录制机制在浏览器加载第一个 URL 之前就已经启动了。

Playwright 1.59 新增了一种屏幕录制机制,可以对视频录制进行更精细的控制。这几乎完全符合我的需求,但生成的视频宽度被固定为 800 像素。

我发现了一个已合并的 PR 修复了这个问题,但当时尚未发布。然后昨天他们在 playwright-python 1.61.0 中发布了这个修复,我终于可以无障碍地完成这个功能的实现了!

代码本身全部由 Codex Desktop 中的 GPT-5.5 xhigh 编写。我还让它编写了文档,这为我审查设计提供了一个非常有用的框架——对该功能的多次迭代改进都来自于审查这份文档,发现其中冗余、不一致或令人困惑的地方,然后请求(或口述)一个更好的设计方案。

YAML 格式本身主要由编码智能体定义。我让它使用 Pydantic 来定义和验证该格式,部分原因是为了让设计更容易审查。

这是一个很好的例子,说明如果没有编码智能体的支持,我几乎肯定不会去实现这类功能。我最初在 2024 年 2 月提交了这个问题,但一直很难从其他项目中抽出必要的时间来解决它。

2026 年 6 月 30 日

更多近期文章

  • 全新 GPT-5.6 系列:Luna、Terra、Sol - 2026 年 7 月 9 日
  • sqlite-utils 4.0,现已支持数据库模式迁移 - 2026 年 7 月 7 日
  • sqlite-utils 4.0rc2,主要由 Claude Fable 编写(花费约 149.25 美元) - 2026 年 7 月 5 日

本文为《让你的智能体使用 shot-scraper video 录制工作视频演示》,作者 Simon Willison,发布于 2026 年 6 月 30 日。

python

yaml

playwright

shot-scraper

pydantic

来源:Simon Willison 博客 · simonwillison.net

用 shot-scraper video 让 AI 智能体录制工作演示视频

Simon Willison 博客·2026-07-01 00:54·47天前·Simon Willison
AI 导读

shot-scraper 1.10 新增 shot-scraper video 命令,支持通过 storyboard.yml 文件定义操作步骤,并利用 Playwright 录制浏览器视频。演示视频展示了 Datasette 中从粘贴的 CSV/TSV/JSON 数据创建新表的功能。该功能依赖 Playwright 1.61.0 新增的 screencast 机制,解决了此前视频开头白帧、宽度固定 800px 等问题。开发者 Simon Willison 强调,将 --help 输出设计得足够详细,可使编码 Agent 直接利用该命令生成演示视频。

正文 · AI 翻译

shot-scraper video 是今天发布的 shot-scraper 1.10 版本中引入的一个新命令,它接受一个 storyboard.yml 文件,该文件定义了针对 Web 应用程序运行的一系列操作,并使用 Playwright 录制这些操作的视频。我之前写过关于编码智能体为其工作生成演示的重要性;这是我为实现这一目标所做的最新尝试。

以下是使用 shot-scraper video 创建的示例视频,演示了一个仍在开发中的功能——从粘贴的 CSV、TSV 或 JSON 数据在 Datasette 中创建新表:

该视频是通过运行以下命令创建的:

shot-scraper video datasette-bulk-insert-storyboard.yml \
  --auth datasette-demo-auth.json --mp4

(那个 --auth JSON 文件包含一个 cookie,如文档中所述。)

以下是 datasette-bulk-insert-storyboard.yml 文件:

output: /tmp/datasette-bulk-insert-demo.webm
server:
  - uv
  - --directory
  - /Users/simon/Dropbox/dev/datasette
  - run
  - datasette
  - -p
  - 6419
  - --root
  - --secret
  - "1"
  - /tmp/demo.db
url: http://127.0.0.1:6419/demo/tasks
viewport:
  width: 1280
  height: 720
cursor: true
wait_for: 'button[data-table-action="insert-row"]'
javascript: |
  (() => {
    let clipboardText = "";
    Object.defineProperty(navigator, "clipboard", {
      configurable: true,
      get: () => ({
        writeText: async (text) => {
          clipboardText = String(text);
        },
        readText: async () => clipboardText,
      }),
    });
  })();
scenes:
  - name: Bulk insert existing table rows
    do:
      - : 0.8
      - click: 'button[data-table-action="insert-row"]'
      - wait_for: "#row-edit-dialog[open]"
      - : 0.5
      - click: ".row-edit-bulk-insert"
      - wait_for: ".row-edit-bulk-textarea"
      - : 0.5
      - click: ".row-edit-copy-template"
      - wait_for: "text=Copied"
      - : 0.8
      - fill:
          into: ".row-edit-bulk-textarea"
          text: |
            title,owner,status,priority,notes
            Prepare release video,Ana,doing,1,Recorded with shot-scraper
            Check pasted CSV import,Ben,review,3,Previewed before inserting
            Share the branch demo,Chen,queued,2,Bulk insert creates three rows
      - : 0.8
      - click: ".row-edit-save"
      - wait_for: "text=Previewing 3 rows."
      - : 1.2
      - click: ".row-edit-save"
      - wait_for: "text=3 rows inserted."
      - : 1.0
      - click: ".row-edit-cancel"
      - wait_for: "text=Prepare release video"
      - : 1.0
  - name: Create a table from pasted CSV
    open: http://127.0.0.1:6419/demo
    wait_for: 'details.actions-menu-links summary'
    do:
      - : 0.8
      - click: 'details.actions-menu-links summary'
      - click: 'button[data-database-action="create-table"]'
      - wait_for: "#table-create-dialog[open]"
      - : 0.5
      - fill:
          into: ".table-create-table-name"
          text: "launch_metrics"
      - click: ".table-create-from-data"
      - wait_for: ".table-create-data-textarea"
      - : 0.5
      - fill:
          into: ".table-create-data-textarea"
          text: |
            metric_id,name,score,recorded_on
            m001,Activation rate,87.5,2026-06-29
            m002,Retention check,72.25,2026-06-30
            m003,CSV import health,95,2026-07-01
      - : 0.8
      - click: ".table-create-save"
      - wait_for: "text=Previewing 3 rows."
      - : 1.2
      - click: ".table-create-save"
      - wait_for_url: "**/demo/launch_metrics"
      - wait_for: "text=Activation rate"
      - : 1.2

视频命令文档中包含更简单的示例,但为了本文的目的,我决定采用更全面的示例。

那个演示用的 YAML storyboard 完全由运行在 Codex Desktop 中的 GPT-5.5 xhigh 构建,使用的提示词是在我本地该分支的 ~/dev/datasette 目录下运行的:

审查此分支上的更改。

切换到 ~/dev/shot-scraper 目录并运行命令 "uv run shot-scraper video --help"。

现在使用那个新的 video 命令录制此分支新功能的视频演示,包括运行一个 "uv run datasette -p 6419 --root --secret 1 /tmp/demo.db" 开发服务器,这样你就可以针对你首先创建的演示数据库来录制视频。

既然我已经发布了这个功能,提示词可以改为 "run uvx shot-scraper video --help",应该能达到同样的效果。

我非常喜欢这种模式:命令的 --help 输出提供了足够详细的信息,让编码智能体能够使用它——这有点像把 SKILL.md 文件直接捆绑在工具内部。我在 showboat 和 rodney 中也使用了相同的模式。

我是如何构建这个功能的

shot-scraper video 最初是一个实验性原型。shot-scraper 构建在 Playwright 之上,它所需的关键功能是让 Playwright 能够录制浏览器会话的视频,并且有足够的控制力来创建所需的演示。

我几年前第一次尝试这个功能,发现 Playwright 生成的视频包含了额外的浏览器界面元素,这些元素对调试测试失败很有用,但对于产品演示来说却是不需要的。

他们不久前修复了这个问题,但仍然存在一些小障碍。特别是,我录制的视频开头会出现几帧白屏,因为录制机制在浏览器加载第一个 URL 之前就已经启动了。

Playwright 1.59 新增了一种屏幕录制机制,可以对视频录制进行更精细的控制。这几乎完全符合我的需求,但生成的视频宽度被固定为 800 像素。

我发现了一个已合并的 PR 修复了这个问题,但当时尚未发布。然后昨天他们在 playwright-python 1.61.0 中发布了这个修复,我终于可以无障碍地完成这个功能的实现了!

代码本身全部由 Codex Desktop 中的 GPT-5.5 xhigh 编写。我还让它编写了文档,这为我审查设计提供了一个非常有用的框架——对该功能的多次迭代改进都来自于审查这份文档,发现其中冗余、不一致或令人困惑的地方,然后请求(或口述)一个更好的设计方案。

YAML 格式本身主要由编码智能体定义。我让它使用 Pydantic 来定义和验证该格式,部分原因是为了让设计更容易审查。

这是一个很好的例子,说明如果没有编码智能体的支持,我几乎肯定不会去实现这类功能。我最初在 2024 年 2 月提交了这个问题,但一直很难从其他项目中抽出必要的时间来解决它。

2026 年 6 月 30 日

更多近期文章

  • 全新 GPT-5.6 系列:Luna、Terra、Sol - 2026 年 7 月 9 日
  • sqlite-utils 4.0,现已支持数据库模式迁移 - 2026 年 7 月 7 日
  • sqlite-utils 4.0rc2,主要由 Claude Fable 编写(花费约 149.25 美元) - 2026 年 7 月 5 日

本文为《让你的智能体使用 shot-scraper video 录制工作视频演示》,作者 Simon Willison,发布于 2026 年 6 月 30 日。

python

yaml

playwright

shot-scraper

pydantic

来源:Simon Willison 博客· simonwillison.net