Simon Willison 用 Codex 语音模式为博客新增 Newsletters 页面
A new feature for my blog, built using my voice
AI 导读
Simon Willison 用 ChatGPT 桌面版 Codex 标签页的语音对话模式,在做饭的半小时里几乎全程靠说话为博客开发出 Newsletters 页面,底层模型为 GPT-6 Astra High。
正文· AI 翻译
2026年10月9日
我今天为我的博客发布了一个新功能:Newsletters 页面,它提供了一个索引,列出我发出的所有新闻通讯,包括免费的每周 Substack 和每月仅限赞助者的更新。我几乎完全是用语音构建这个功能的,一边做晚饭一边对着笔记本电脑聊天。
Codex 语音模式
我使用的是 ChatGPT 桌面应用,在 Codex 标签页中,使用语音对话模式,针对本地开发环境运行。效果是这样的:

我通过输入以下命令,针对本地的 simonwillisonblog 检出启动了会话:
Start dev server and open in browser
这让我预览了它将要在其上工作的站点,也意味着我之后可以让它向我展示新页面,以便我能直观地跟踪它的进度。
然后我点击了“开始新的语音聊天”按钮——那不是麦克风按钮,而是它右边的那个——并把笔记本电脑放在厨房里,这样我做饭时就能和它说话。
和我的电脑说话
我很清楚自己想要构建什么,而且这是一个足够简单的 Django 功能,我确信模型(在这种情况下是 GPT-6 Astra High)能够完成它。一个新模型、一次迁移、一些视图代码、模板,以及几个从外部来源填充数据库的导入函数。
以下是 Codex 捕获的我的语音转录摘录:
嗯,它们不会。嗯,这将是一种新的内容类型。嗯,它不会显示……哦,等等。对,不——我不想让它显示在我的,嗯,标签页和日期归档页面上,还有……实际上,不,我想……我不想让它出现在标签页上。我不想让它出现在,嗯,博客索引页面上。但我想我确实想让它出现在基于日期的页面上。你知道,如果你导航到9月19日,而我在那天发送了一份新闻通讯,我想让它显示出来。所以……这——所以我想我们可能需要一个新模型。另一件事是我希望它们可搜索,呃,Substack 的那些不可搜索,因为那些实际上只是我博客上其他内容的副本。这些每月的确实包含独特的内容,而且一旦它们……发布,比如在发出一个月后公开,我希望它们出现在我的搜索结果中。
显然这已经足够清晰,模型知道我想要构建什么!你可以阅读完整的转录,包括不流畅之处等等,在这个 Gist 中。
我们就这样持续了大约半小时(做晚饭所需的时间)。模型会回复,偶尔问一些澄清问题,然后开始修改代码。
我们构建了什么
我们完全通过语音取得了令人惊讶的进展:
- 在 Django 中表示导入新闻通讯的新模型和迁移,以及相应的 Django Admin 配置
- Four working imports:
- 通过 RSS 获取最新的 Substack 条目
- 通过它们未公开的 API 获取其他所有 Substack 条目,GPT-6 Astra 知道这个 API(它直接尝试了
/api/v1/archive),然后运行搜索来弄清楚如何分页,并找到了 Karen Spinner 的这篇文章 - 我所有已发布的每月新闻通讯,来自我的 simonw/monthly-newsletter-archive GitHub 仓库
- 我最近一期仅限赞助者的私密新闻通讯,来自一个私有仓库
- /newsletters/ 和 /newsletters/2026/ 公开归档页面
- 新闻通讯也显示在日和月归档页面上,但不显示在标签页或我的主页上
- 每周 Substack 新闻简报链接到 Substack;归档的月度新闻简报有各自的页面
- 与我的站点搜索引擎集成
它几乎可以发布了。问题出在导入部分:Astra 提出可以从我的本地副本导出数据,这样我就能将其导入生产环境,但我希望它能像我的其他导入脚本一样工作。由于部分数据存放在一个私有 GitHub 仓库中,这需要创建一个新的 API 密钥,而我知道为此我得在键盘前坐上一阵子。
通过审查来完成它
在我完成烹饪并判断它基本功能齐全后,我让 Codex 创建了一个分支并打开了一个拉取请求。
我在 GitHub PR 界面中审查了代码。它几乎就是我需要的,只是其中一个导入脚本选择了在子进程中使用 Git。我需要其中一个导入从私有 Git 仓库拉取,所以我认为用 API 会更靠谱。我切换回打字,让 Codex 将其替换为基于 API 的导入。
你可以在该 PR 的额外提交中看到我在审查期间所做的更改。我修复了导入机制,并对那些公开页面的显示做了几处调整。又花了半小时基于打字的提示,才达到我满意地通过合并 PR 将其部署到生产环境的状态。
最终结果
你可以在新的新闻简报索引页看到最终结果,或者查看往期月度新闻简报的页面。

索引页将我最新的 Substack 每周新闻简报和 GitHub 赞助者月度新闻简报按时间倒序混合展示。页面下方是按年份归档页面的链接。
GPT-6 Astra 设计了该页面,然后根据我在厨房里瞥一眼本地预览时口头给出的反馈对设计进行了调整。
更适合多任务处理,而非日常主力
OpenAI 非常喜欢在DevDay 之类的场合使用像这样的语音驱动演示——它们在那样的环境中确实效果很好。不过我认为这不会成为我的日常主力。
我之前写过,我在遛狗时用手机上的 ChatGPT 语音模式完成了多少“工作”——主要是研究和头脑风暴,但偶尔也会通过让 ChatGPT 编写和测试代码片段来进行实际的开发工作。
这次感觉不同。视觉预览的加入,加上在我需要传达无法用语音表达的内容时可以通过键盘输入或粘贴,使得这成为一种强大得多的与编码智能体交互的方式。
不过,一旦深入到细节,我还是会切换回打字。能够粘贴示例和错误信息,或者直接高亮需要更改的代码或功能,仍然比试图用语言描述更高效。
我主要在家工作,这很好,因为在共享办公空间里我绝不会想这样跟我的电脑说话!
对我来说最杀手级的功能是多任务处理能力。我通常一边做饭一边听播客或刷 TikTok;现在我可以真正地构建东西了。