编程笔记

lifelong learning & practice makes perfect

我这周用 Claude Artifacts 构建的所有内容

我非常喜欢 Claude 的 Artifacts 功能,它允许你提示 Claude 创建一个交互式的单页应用(使用 HTML、CSS 和 JavaScript),然后在 Claude 界面中直接查看结果,与机器人进一步迭代,如果你喜欢,还可以复制出生成的代码。

我翻看了我的 Claude 活动导出(我构建了一个 claude-to-sqlite 工具将其转换为 SQLite,我可以在 Datasette 中探索它),并决定看看我 在过去一周 使用了多少 artifacts。比我预想的要多!

能够启动一个完整的交互式应用程序——有时作为一个说明性的原型,但通常是直接解决问题的工具——是一个非常有用的工具。

以下是我在过去七天中使用 Claude Artifacts 的大部分内容。我为几乎所有内容提供了提示或完整记录。

使用 Jina Reader 将 URL 转换为 Markdown #

我因为在使用移动版 Safari 时很难将整个网页的文本复制粘贴到 LLM 中而感到沮丧。所以我构建了一个简单的 Web UI,允许我输入 URL,调用 Jina Reader API 生成 Markdown(它在底层使用 Puppeteer),并为我提供带有方便的“复制”按钮的 Markdown。

试用一下:https://tools.simonwillison.net/jina-reader (代码)

图像 31:Jina Reader - URL 字段,在选择框中选择 Markdown,提交按钮。然后是一个显示从带有复制到剪贴板按钮的页面提取的 Markdown 的框。然后是一个显示渲染的 Markdown 预览的框架。

在这里写了更多关于该项目的内容

WASM 中的 SQLite 演示 #

关于 SQLite 的 WASM 构建的 Hacker News 对话 引导我到 NPM 上的 @sqlite.org/sqlite-wasm 包,我决定快速拼凑一个交互式演示。

图像 32:半月湾的鹈鹕目击事件 - 一个带有 select * from pelican sightings 的文本区域,一个执行查询按钮和一个显示 5 个匹配行的表格。

在这里试用:tools.simonwillison.net/sqlite-wasm

代码Claude 记录

我发现自己想提取网页上的一段文本链接的所有底层 URL。我意识到最快的方法是启动一个可以接受富文本 HTML 粘贴并使用 HTML 解析器提取这些链接的 artifact。

图像 33:提取 URL 工具。粘贴的内容。提取的 URL。显示提取的 URL 列表。

https://tools.simonwillison.net/extract-urls

代码Claude 记录

剪贴板查看器 #

摆弄一个允许你粘贴富文本的工具让我想起了浏览器剪贴板 API 是一件令人着迷的事情。我决定构建一个快速调试工具,让我可以复制和粘贴不同类型的内容(纯文本、富文本、文件、图像等),并查看浏览器中可用的信息。

图像 34:剪贴板格式查看器。在此处或页面上的任何位置粘贴。显示带有 HTML 片段的 text/html,带有某些文本的 text/plain,以及显示事件类型粘贴和可用格式 text/html 和 text/plain 的剪贴板事件信息

https://tools.simonwillison.net/clipboard-viewer

代码Claude 记录

Pyodide REPL #

我没有在这个上面花太多精力。在浏览器 DevTools 中摆弄 Claude Artifacts 时,我发现了这个 CSP 标头:

content-security-policy: default-src https://www.claudeusercontent.com; script-src 'unsafe-eval' 'unsafe-inline' https://www.claudeusercontent.com https://cdnjs.cloudflare.com https://cdn.jsdelivr.net/pyodide/; connect-src https://cdn.jsdelivr.net/pyodide/; worker-src https://www.claudeusercontent.com blob:; style-src 'unsafe-inline' https://www.claudeusercontent.com https://cdnjs.cloudflare.com https://fonts.googleapis.com; img-src blob: data: https://www.claudeusercontent.com; font-src data: https://www.claudeusercontent.com; object-src 'none'; base-uri https://www.claudeusercontent.com; form-action https://www.claudeusercontent.com; frame-ancestors https://www.claudeusercontent.com https://claude.ai https://preview.claude.ai https://claude.site https://feedback.anthropic.com; upgrade-insecure-requests; block-all-mixed-content

其中的 https://cdn.jsdelivr.net/pyodide/ 引起了我的注意,因为它表明 Anthropic 开发团队故意设置它,以便可以将 Pyodide(编译为 WebAssembly 的 Python)加载到 artifact 中。

我让 Claude 启动了一个非常快速的演示来证明这一点:

图像 35:Pyodide Python REPL - 3 + 4 返回 7。一个用于输入 python 代码的文本区域和一个运行按钮。

https://claude.site/artifacts/a3f85567-0afc-4854-b3d3-3746dd1a37f2

我还没有费心将这个提取到我自己的 tools.simonwillison.net 站点,因为它纯粹是一个概念证明,证明 Pyodide 可以在该环境中正确加载。

照片相机设置模拟器 #

我外出拍照散步,并好奇 JavaScript 是否可以提供相机设置的模拟。我没有在这个上面走太远(在海滩散步时在手机上提示)——结果有错误且令人印象不快,我很快就失去了兴趣。不过,它让我接触到了用于操作 canvas 元素的 Fabric.js 库。

图像 36:照片相机设置模拟器。已选择图像 - 但仅显示图像的角落,并带有一些有错误的损坏的调整大小句柄。底部的三个滑块显示曝光、对比度和饱和度。

https://claude.site/artifacts/e645c231-8c13-4374-bb7d-271c8dd73825

LLM 定价计算器 #

这个我 确实 完成了。我构建了这个定价计算器,作为我使用 Google Gemini 进行视频抓取 的实验的一部分,因为我不相信自己对 Gemini 有多便宜的计算!这里有关于我如何构建它的详细说明

图像 37:LLM 定价计算器界面的屏幕截图。左侧面板:用于令牌和成本的输入字段。输入令牌:11018,输出令牌:空,每百万输入令牌的成本:0.075 美元,每百万输出令牌的成本:0.3 美元。计算的总成本:0.000826 美元或 0.0826 美分。右侧面板:各种模型的预设,包括 Gemini、Claude 和 GPT 版本,以及它们各自的每 100 万个令牌的输入/输出成本。页脚:价格截至 2024 年 10 月 16 日是正确的,它们可能已更改。

https://tools.simonwillison.net/llm-prices

YAML 到 JSON 转换器 #

我想提醒自己 YAML 语法的某些方面是如何工作的,所以我启动了一个快速的 YAML 到 JSON 转换器工具,该工具在您键入 YAML 时实时显示等效的 JSON。

图像 38:YAML 到 JSON 转换器。在顶部的文本区域中是 YAML。在它下面是漂亮打印的 JSON 输出。

https://claude.site/artifacts/ffeb439c-fc95-428a-9224-434f5f968d51

Claude 记录

OpenAI 音频 #

这是我本周最有趣的 artifact。我正在探索 OpenAI 的新音频 API,并决定看看是否可以让 Claude 构建一个网页,该网页可以请求访问我的麦克风,录制一段音频,然后对其进行 base64 编码并将其发送到 OpenAI API。

这里有关于我如何构建此工具的完整详细信息

图像 39:OpenAI 音频工具的屏幕截图。可见一个开始录制按钮、一个 00:00 计时器和一个播放音频元素。有一个用于提示的文本区域和一个提交到 API 按钮。

https://tools.simonwillison.net/openai-audio

Claude Artifacts 不能直接向外部主机发出 API 请求,但它仍然可以启动足够多的工作版本,以便很容易地将其移动到不同的托管并完成工作。

我在构建一个工具,展示 Gemini Pro 如何返回图像中对象的边界框 中撰写了更多关于此 API 模式的内容。

QR 码解码器 #

本周早些时候,我参加了一个会议,其中一位参与者分享了一张带有 QR 码的幻灯片(用于加入实时调查工具)。我没有带手机,所以我需要一种将 QR 码转换为常规 URL 的方法。

图像 40:QR 码解码器 使用 Cosmo Wolfe 的 jsQR 上传、拖放或粘贴 QR 码图像:在此处选择文件或拖放 我拖动一个 QR 码,该框显示:解码内容:https://simonwillison.net/

https://tools.simonwillison.net/qr

在 Claude Artifacts 中敲定这个 QR 解码器只花了几秒钟:

构建一个 artifact(没有 react),让我可以粘贴 QR 码并显示解码后的信息,并在必要时显示超链接

[ … ]

有一个文件打开框,也可以让你拖放,并在页面上添加一个 onpaste 处理程序,以捕获粘贴的图像

完整对话在这里

图像转换器和页面下载器 #

另一个非常快速的原型。在 Hacker News 上,有人演示了一个巧妙的工具,该工具允许您将照片拖放到页面上,并将其作为 base64 URL 烘焙到页面中,这样您就可以“另存为 HTML”并获得一个包含图库的自包含页面。

建议他们可以添加 一个生成带有烘焙的新页面的“下载链接”的功能——在不允许您“另存为 HTML”的移动电话上很有用——并让 Claude 敲定一个快速原型:

图像 41:图像转换器和页面下载器 - 我已选择一个图像,并且现在该图像下方有一个下载页面链接。

在这种情况下,我在 Gist 中共享了代码,然后使用我新接触的 https://gistpreview.github.io/?GIST_ID_GOES_HERE 技巧来渲染结果:

https://gistpreview.github.io/?14a2c3ef508839f26377707dbf5dd329

事实证明,gistpreview 是将 LLM 生成的演示转换为人们可以查看的页面的非常快捷的方式。

代码Claude 记录

HTML 实体转义器 #

按需软件的另一个示例:我需要在手机上的一段文本中转义 HTML 实体,所以我让 Claude 为我构建了一个工具:

图像 42:HTML 实体转义器。在输入框中,我输入了带有双引号的文本。输出框已正确转义这些引号,并带有一个复制到剪贴板按钮。

https://claude.site/artifacts/46897436-e06e-4ccc-b8f4-3df90c47f9bc

这是我使用的提示:

构建一个 artifact(没有 react),我可以在其中将文本粘贴到文本区域中,它将返回该文本,其中所有 HTML 实体——单引号和双引号以及小于号、大于号和 & 符号——都已正确转义。输出应在文本区域中,并附带一个“复制到剪贴板”按钮,该按钮在您单击后 1.5 秒内将文本更改为“已复制!”。使其适合移动设备

Claude 记录

text-wrap-balance-nav #

Terence Eden 的启发,我决定对 text-wrap: balance CSS 属性进行快速实验。我让 Claude 为我构建了一个带有滑块和复选框的示例导航栏。我在这里写了关于它的内容

图像 43:动画演示。一个包含 13 个项目的导航菜单 - 诸如主页、关于、服务和产品之类的项目。这些项目在四行上换行,每行 4 个、4 个、4 个,然后是 1 个项目。选择启用 text-wrap: balances 复选框会将此更改为 3、4、3、3 - 滑块还可以更改可见项目的数量,以查看其效果

https://tools.simonwillison.net/text-wrap-balance-nav

ARES 语音字母转换器 #

我作为 半月湾南瓜跑 的业余无线电通信操作员做志愿者,并且担心我会弄乱使用语音字母——所以我让 Claude 构建了这个工具:

图像 44:ARES 语音字母转换器。我输入了文本“Cleo is a lobster”。单击“转换”按钮后,我得到输出“Charlie Lima Echo Oscar (Space) India Sierra (Space) Alpha (Space) Lima Oscar Sierra Tango Echo Romeo”

https://claude.site/artifacts/aaadab20-968a-4291-8ce9-6435f6d53f4c

Claude 记录在这里。有趣的是,它首先用 Python 构建了它,然后在我提醒它我想要“一个交互式 Web 应用程序”后切换到 JavaScript。

这太有用了,而且非常有趣! #

正如你所看到的,我是这个功能的 重度 用户——我刚刚描述了在一个星期内产生的 14 个项目。我从 6 月 20 日(与出色的 Claude 3.5 Sonnet 一起发布,它仍然是我的日常 LLM)开始使用 artifacts,现在我每天都会启动一个新的交互式 artifact 几次。

我正在使用 artifacts 进行闲暇的好奇心、快速原型设计、库研究和启动解决当前问题的工具。

这些工具中的大多数都花了不到五分钟的时间来构建。一些更复杂的工具花费的时间更长,但即使是 OpenAI Audio 工具,第一个版本也花费了 上午 11:55 到下午 12:07,第二个版本花费了 下午 12:18 到下午 12:27——总共 21 分钟。

请查看我的 claude-artifacts 标签,以获取更多示例,包括 SVG 到 JPG/PNGMarkdown 和 Math Live Renderer图像调整大小和质量比较

我还有一个链接到我的 tools.simonwillison.net 站点的每个帖子的仪表板,以及底层的 simonw/tools GitHub 存储库,其中包含更多未列出的工具,其中大多数工具在其提交历史记录中链接到它们的 Claude 对话记录。

我开始对它们的局限性感到有点沮丧——特别是 artifacts 无法发出 API 调用、提交表单甚至链接到其他页面的方式。我可能会最终根据我迄今为止学到的关于它们的所有知识,启动我自己的小型 artifacts 替代方案。

如果你 没有 使用 artifacts,我希望我已经让你了解了为什么它们是我目前最喜欢的基于 LLM 的工具之一。

原文

欢迎关注我的其它发布渠道