尽管,如过去构建 AutoDev 的 AutoCRUD、精准测试功能一样,我们有意去构建一个完全自动化的 API 开发智能体。但是依旧的,我们会遇到一些问题:
也因此,在当前阶段,我们预期的一个智能体变为了 10+ 个智能体,以降低人的心智负担。也因此,我们开始思考三个问题:
也由此,这有了这篇文章的内容。
在构建 API 时,通常我们会有两个阶段:商业战略阶段与技术实现阶段。在商业战略阶段,我们会考虑到 API 的业务价值、API 的商业模式等等。在技术实现阶段,我们会考虑到 API 的设计、API 的文档、API 的测试等等。
在技术实现阶段,我们会有以下几个步骤:
这是一个非常完美的 API 开发流程,但是在实际开发中,我们会遇到大量的问题。毕竟,白天你和各个上下游的人员沟通完,只剩下下班前的半小时,又或者是 晚上的时间来写代码。在你加班加点干完活后,你的代码写完了,但是文档没写完,测试没写完,甚至是你的代码写完了,又或者你的代码不符合规范。
那 AI 可以吗?
最近,我们在 Shire 语言中开发了 API 开发相关的智能体包,以支持开发者更好地构建 API。在这个过程中,我们结合了标准 API 开发的流程与 AI 智能体的能力,以向开发者提供更好的 AI 辅助 API 开发体验。
我们创建了 10+ 个智能体,以支持 API 开发的各个阶段,如需求分析、API 设计、API 文档生成、API 代码生成、API 测试等等。当然,对于联调来说, 我们暂时没有很好的设计,除此在发布阶段,暂时也不需要 AI 的参与。
设计阶段主要由远程(Dify)需求 Agent、本地 Swagger 生成、 Mock 代码生成三个智能体组成。
在这里,事实上,我们还欠缺了一个设计:结合内部的 API 文档规范和现有的代码库设计。我们在 Shire 中引入了 mock
函数,以直接运行
Mock 服务, 示例:mock("docs/mock_v0-stubs.json")
。
开发阶段主要由三个智能体组成:结合需求的代码生成、开发测试 API 代码、API 代码测试。
为此,我们还在 execute 函数中,支持了原先的 Gradle 任务方式,即通过 execute(":bootRun")
可以直接启动 Spring Boot
项目。当然,我们还支持了 commit
、push
函数,以支持 Git 操作。
在测试阶段,我们主要结合了四不同的测试框架,以支持 API 的测试:ab 测试、Python 语言的 Locust 测试、JavaScript 语言的 K6 测试、Playwright 测试。
虽然这里的四个智能体吹得有点过,但是实际上只是 API 流程中的两个步骤。
而针对于应用缺少 Swagger API 文档的情况,我们构建了四个智能体来解决这个问题:
我们在 Shire 中添加了 batch
函数,以便于批量添加 Spring RestDocs 注解,示例:
batch("add-annotation-to-controller-test.shire)
脚本。
结合我们过往在辅助需求与 AutoDev 的开发经验,我们总结了三个思考,以在未来更好的构建 AI 编程智能体:
AI 辅助研发的两种模式是:增强现有与创建新范式。在当前生成式 AI 还不够强大的情况下,我们可以通过增强现有的 API 开发流程,以提升我们的效率与质量。
生成式 AI 绝对不是一句:请生成一个 xxx 的 API。而是结合:
这就意味着,我们需要打开 API 的开发流程,获得更多的上下文信息,以确保生成的 API 符合我们的预期。
在开发 API 时,我们会按阶段来划分的原因是,每个阶段都需要与不同角色的人员进行沟通,因而会变成一个阻塞点。哪怕有了 AI 的参与,这些阻塞点依旧在, 只是有些可以转换为决策点,有些依旧是阻塞点:
AI 可以帮助我们做的是:提供更多的信息,以支持我们的决策。但是,AI 不能帮我们做决策,因为决策是需要人类参与的。
在大部分团队中,你只需要实现业务代码,而不需要实现测试代码等。但是,在结合生成式 AI 代码的背景下,生成的业务代码可能是错的。为了避免出现质量、 返工等问题,最好的方式是:构建多轮自动检验,以确保质量。
除此,我们可以由多个不同的模型来生成两个不同的代码,来进行相互检验。如:一个模型生成的代码用于测试,另一个模型生成的代码用于生产。
在 AI 辅助研发火热的今天,经典的 API 开发模式依旧是不可替代的 —— AI 并不能帮你设计出一个完美的 API,也不能帮你背锅。但是呢,我们可以借由 AI 的能力,来提升我们的效率,提升我们的质量与开发体验。
PS:Shire 相关的 API 设计与开发 AI 智能体实现见:
围观我的Github Idea墙, 也许,你会遇到心仪的项目