标题和作者
标题:Experimenting with Starlette 1.0 with Claude skills
作者:Simon Willison
主题:本文探讨了如何利用 Claude 的 Skills 功能来应对 Starlette 框架 1.0 版本发布带来的兼容性挑战。
背景:Starlette 是 FastAPI 的底层框架,拥有极高的使用率。1.0 版本引入了 lifespan 机制以替代旧的 on_startup 和 on_shutdown,这破坏了向后兼容性。作者担心现有的 LLM(在 0.x 版本上训练)无法生成 1.0 代码,于是尝试使用 Claude 的技能系统来解决这个问题。
摘要
本文作者尝试解决了一个关键问题:当 Starlette 框架从 0.x 升级到 1.0 并引入破坏性变更(如 lifespan 机制)时,现有的 LLM 模型可能无法生成兼容新版本的代码。作者利用 Claude 内置的 "skill-creator" 技能,为 Starlette 1.0 创建了一个包含所有新特性示例的技能文档,并将其导入到 Claude 的技能库中。随后,作者让 Claude 基于这个新技能构建了一个完整的任务管理应用,结果 Claude 成功生成了包含数据库、模板和 API 的代码,并自动编写测试脚本验证了应用的功能。
术语解释:Starlette 是一个轻量级的 ASGI 框架,常用于构建高性能的异步 Web 应用,它是 FastAPI 的基础。ASGI(Asynchronous Server Gateway Interface)是 Python 的异步服务器网关接口标准。lifespan 是 Starlette 1.0 引入的一种新机制,用于管理应用启动和关闭时的生命周期事件,替代了之前的 on_startup 和 on_shutdown。Skills 是 Claude AI 提供的一种功能,允许用户将自定义的文档或提示词作为上下文加载到对话中,使 AI 在后续交互中能参考这些信息。
主要主题和概念
主题一:Starlette 1.0 的生命周期管理变革
What:Starlette 1.0 版本彻底改变了应用启动和关闭时的代码执行方式,引入了 lifespan 机制来替代原有的 on_startup 和 on_shutdown 参数。
Why:旧的方式将启动和关闭逻辑与路由定义紧密耦合,而新的 lifespan 机制基于 Python 的异步上下文管理器,提供了更灵活、更符合 Python 风格的方式来管理应用资源,使得代码结构更加解耦和清晰。
How:开发者需要定义一个异步上下文管理器函数,该函数接收 app 参数。在 yield 关键字之前编写启动代码,在 yield 之后编写关闭代码。然后将这个函数传递给 Starlette 实例的 lifespan 参数,而不是之前的 on_startup 和 on_shutdown 参数。
术语解释:异步上下文管理器(Async Context Manager)是一种可以管理异步资源(如网络连接、数据库事务)的对象,它定义了 __aenter__ 和 __aexit__ 方法,确保资源在使用后能正确释放。lifespan 机制就是利用这种上下文管理器来统一处理应用启动和关闭时的逻辑。
主题二:利用 Claude Skills 更新 LLM 知识库
What:作者利用 Claude 的 "skill-creator" 技能,为 Starlette 1.0 创建了一个包含新特性代码示例的技能文档,并将其注入到 Claude 的对话上下文中。
Why:由于 LLM 通常是针对特定版本(如 0.x)训练的,它们可能不熟悉 1.0 的新变更,导致生成的代码无法运行。作者希望通过更新 Claude 的上下文知识,使其能够“学会”新的 API,而无需重新训练模型。
How:作者克隆了 Starlette 的 GitHub 仓库,并指示 Claude 使用内置的 skill-creator 技能生成一个涵盖 1.0 版本所有功能的技能文档。随后,作者点击了复制按钮,将生成的文档添加到了自己的技能库中。此后,Claude 在生成代码时就能参考这些 1.0 版本的示例。
术语解释:Skills(技能)是 Claude AI 的一个功能模块,它允许用户定义一组特定的提示词和文档。当技能被激活时,AI 会将这些文档视为上下文的一部分,从而在回答问题或生成代码时表现出对该主题的深入了解。
主题三:AI 编码代理的自动化测试与验证
What:Claude 在生成完整的任务管理应用代码后,不仅编写了代码,还自动编写并执行了测试脚本来验证应用的功能。
Why:仅仅生成代码是不够的,确保代码能够实际运行并满足需求是关键。作者希望验证 Claude 是否具备端到端的编码和测试能力。
How:Claude 生成了一个名为 "taskflow" 的应用,包含了 SQLite 数据库、Jinja2 模板和 Starlette 路由。接着,Claude 在终端中编写了一段 Python 脚本,手动调用了应用的 API 端点(如获取统计数据、项目、任务、标签),创建新任务和评论,并检查主页。最后,脚本输出了测试结果,确认“所有测试通过”。
术语解释:TestClient 是 Starlette 提供的一个测试客户端工具,它允许开发者像发送 HTTP 请求一样调用路由函数,从而在不需要启动服务器的情况下测试应用逻辑。
重要引文
论点:Starlette 1.0 版本最显著的变化在于应用启动和关闭代码的执行方式,从旧的 on_startup 和 on_shutdown 参数转变为新的 lifespan 机制。
论据:原文明确指出:“The most notable of these is a change to how code runs on startup and shutdown... the new system uses a neat lifespan mechanism instead based around an async context manager”。
论证:作者详细描述了新机制的具体实现方式:开发者不再使用 on_startup 和 on_shutdown 参数,而是定义一个名为 lifespan 的异步上下文管理器函数。这个函数接受 app 作为参数,在 yield 语句之前执行启动代码,在 yield 之后执行关闭代码。这种基于上下文管理器的模式比之前直接传递回调函数的方式更加整洁和灵活。
术语解释:同上(ASGI、Context Manager、lifespan)。
总结
本文的核心亮点在于展示了如何通过 Claude 的 Skills 功能,有效地解决了大语言模型在处理软件框架重大版本更新时的知识滞后问题。通过为 Claude 创建一个包含 Starlette 1.0 全部特性示例的技能文档,作者成功让 Claude 生成了一套完全兼容 1.0 版本的“Taskflow”任务管理应用代码。更令人印象深刻的是,Claude 不仅完成了代码生成,还自动编写并运行了测试脚本,验证了应用的数据库交互、API 响应和页面渲染功能。这一实验证明了,只要提供足够的上下文和示例,LLM 就能迅速适应新版本的技术栈,并具备端到端的编码和测试能力,这为未来的 AI 辅助编程提供了新的思路。