使用 IBM Bob 进行 AI 结对编程
将 Bob 用作 AI 结对编程助手,从需求到计划,再到生成代码、测试和文档,构建一个 FastAPI 待办事项 API。
借助 AI 结对编程,你可以与一个在规划、编码、测试和文档编写的每个阶段都能提供帮助的助手一起构建软件,而不仅仅是自动补全代码行。在本教程中,你将与 IBM Bob 结对,基于一组需求构建一个 FastAPI 待办事项 API。
你从需求出发,依次完成经过审查的计划、生成的代码、对实现的解释、代码质量改进、单元测试和技术文档。数据存储使用内存中的 Python 列表,无需配置数据库。
完成本教程后,你将拥有一个可运行的容器化待办事项 API,并在每个阶段实践了结对编程的审查循环:规划、生成、解释、重构、测试和文档编写。
本教程适合了解基本 Python 和 REST 概念、希望建立可重复审查循环来与 AI 助手共同构建软件的开发者。无需具备 FastAPI 经验。
本教程完整覆盖了新项目的构建全流程。若要深入了解如何在现有代码库中规划并实现大型功能,请参阅规划并实现复杂功能。
前提条件
完成本教程需要以下内容:
- 已安装并配置 Bob IDE。
- 熟悉使用文学编程从注释生成代码。
- 已完成创建新的上下文窗口,以便在这个多步骤工作流程中管理 Bob 的上下文。
- 已在工作站上安装并运行 Docker。Bob 会生成一个 Dockerfile,让你无需在本地安装 Python 或其依赖项,即可在容器中构建并运行 API。
- 具备基本的 Python 知识。
- 对 REST API 有基本了解。无需具备 FastAPI 经验。Bob 会生成 FastAPI 代码,并在工作流程中按需对其进行说明。
了解与 Bob 进行 AI 结对编程
接下来的每个阶段涵盖规划、生成、解释、重构、测试和文档编写。在每个阶段,Bob 提出更改,你在 Bob 应用之前批准、拒绝或修改。
结对编程工作流程
本教程使用以下工作流程:
需求
↓
Bob 创建计划
↓
你审查并完善计划
↓
Bob 生成代码
↓
你审查输出
↓
运行并验证
↓
Bob 解释实现
↓
Bob 提出代码质量改进建议
↓
生成测试
↓
生成文档设置工作区
启动 Bob,打开一个空项目文件夹,并将 Bob 配置为在修改文件前请求批准。
启动 IBM Bob
启动 IBM Bob IDE。
打开 Bob 聊天界面
如果 Bob 聊天界面不可见,请通过选择导航栏旁边的 Bob 图标将其打开。你也可以在 Mac 上按 Option + Command + B,或在 Windows 和 Linux 上按 Ctrl + Alt + B。

打开空项目文件夹
创建一个名为 todo-api 的空文件夹,然后通过 File > Open Folder 在 Bob 中打开它。如果 Bob 询问你是否信任该文件夹中文件的作者,请选择 Yes, I trust the authors。
Bob 会将生成的应用程序写入此文件夹。本教程不需要已有的代码仓库。
禁用自动批准
打开 Permissions 并确认自动批准已关闭。关闭自动批准后,Bob 在读取文件、编辑文件或运行命令之前会请求你的许可。你可以掌控本教程中的每一项更改。
定义需求和计划
向 Bob 提供待办事项 API 的需求,然后在 Bob 编写任何代码之前审查它提出的计划。
切换到 Plan 模式
打开 Bob 侧边栏底部的模式下拉菜单,然后选择 Plan。

Modes 遵循最小权限原则。在 Plan 模式下,Bob 读取你的代码并编写 Markdown 计划。Bob 不运行命令,也不做实现层面的更改。你在 Bob 编写任何应用程序代码之前审查方案。
定义应用程序需求
在 Bob 聊天界面中,输入以下提示:
Create a simple FastAPI To-Do API.
Requirements:
- Store tasks in a Python list.
- Each task should contain:
- id
- task_name
Implement these endpoints with explicit HTTP status codes:
- GET /tasks: list all tasks. Return 200.
- POST /tasks: create a task from a JSON body containing only task_name. Return 201 with the created task.
- DELETE /tasks/{task_id}: delete a task. Return 204 on success and 404 if no task has that id.
Use FastAPI and Pydantic. Use Pydantic model validation so an invalid request body returns 422.
Include a requirements.txt and a Dockerfile. The Dockerfile must start Uvicorn bound to 0.0.0.0 on port 8000 so the API is reachable through a published container port.
Save the plan as Markdown files in a folder named `plans`.
Put the FastAPI application in a single file named `main.py` at the project root.
Keep the implementation simple.
Don't install any dependencies locally or run local tests. Everything will run in a Docker container.为了制定计划,Bob 会运行其规划 skill。出现提示时,选择 Approve skill tools for task 和 Approve subagent tools for task,让 Bob 能够研究工作区并起草计划。
完善计划
你可以在 Bob 编写任何代码之前修改计划。在 Bob 聊天界面中,输入后续提示:
Update the plan to reject a task whose task_name is empty or longer than 200 characters.Bob 会修订计划,加入额外的输入验证。查看更新后的计划。
生成并审查应用程序
开启新的上下文窗口,切换到 Agent 模式,让 Bob 实现已批准的计划。
开启新的上下文窗口
在聊天框中选择 New task 或聊天面板顶部的 +,以开始新的上下文窗口。有关背景信息,请参阅创建新的上下文窗口。Bob 已将计划保存到 plans 文件夹,因此你不再需要在上下文中保留规划对话。干净的上下文让实现专注于已批准的计划。
切换到 Agent 模式并执行计划
打开 Bob 侧边栏底部的模式下拉菜单,然后选择 Agent。接着告诉 Bob 实现计划:
Implement the plan in the plans folder.
@plans/Agent 模式允许 Bob 编写文件并运行命令。由于你禁用了自动批准,Bob 在每次更改之前会请求批准。在 Bob 执行计划时批准各个步骤。
审查生成的应用程序
实现完成后,审查生成的代码。由于 Bob 的输出具有概率性,你的代码风格和内部名称可能与此处示例有所不同。该应用程序由以下部分组成。
数据模型。 Bob 生成两个 Pydantic 模型:一个用于创建任务时的请求体,另一个用于已存储的任务。创建模型会强制执行你在规划阶段添加的长度规则:
class TaskCreate(BaseModel):
task_name: Annotated[str, Field(min_length=1, max_length=200)]
class Task(BaseModel):
id: int
task_name: str端点路径和状态码与你给 Bob 的需求一致,但模型类名和文件布局可能有所不同。本教程假设模型名称为 Task 和 TaskCreate。如果 Bob 选择了不同的名称,请相应调整后续提示。
内存数据存储。 Bob 将任务存储在一个空的 Python 列表中,并为每个新任务分配递增的 id:
tasks: list[dict] = []
id_counter = 0API 操作。 应用程序提供以下端点:
GET /tasksPOST /tasksDELETE /tasks/{task_id}
POST /tasks 仅接受请求体中的 task_name,并以 201 状态码返回已创建的任务。DELETE /tasks/{task_id} 成功时返回 204,当不存在该 task_id 时返回 404。
依赖项。 Bob 生成一个列出 FastAPI、Uvicorn 和 Pydantic 的 requirements.txt 文件。
容器。 Bob 生成一个 Dockerfile,用于安装依赖项并通过 Uvicorn 在端口 8000 上运行 API。
HTTP 契约遵循需求提示,包括方法、路径和状态码。以下验证步骤按原样适用。
使用文学编程添加端点
使用文学编程模式,直接在编辑器中通过自然语言指令添加更新端点,无需切换到聊天窗口。
文学编程模式可从直接写在编辑器中的自然语言指令生成代码。
打开应用程序文件
打开 Bob 生成的 main.py 文件,并将光标放在文件末尾最后一个路由处理程序之后的空行上。
激活文学编程模式
在 Mac 上按 Command + I,或在 Windows 和 Linux 上按 Ctrl + I。你也可以选择编辑器工具栏中的魔法棒图标。
编写指令
在空行上输入以下指令。它会以与其余代码不同的颜色高亮显示。
Add a PUT /tasks/{task_id} endpoint that updates the task_name of an existing task, matching the style and conventions of the existing routes. Return 200 with the updated task, or 404 if no task has that id.Bob 会从周围的代码推断参数名称、请求模型和错误处理,因此你只需指定方法和路径。
生成并接受代码
选择 Generate,或在 Mac 上按 Command + Enter,或在 Windows 和 Linux 上按 Ctrl + Enter。Bob 会用实现替换你的指令,并显示内联差异。
审查差异后,选择 Accept All 以应用更改。再次在 Mac 上按 Command + I,或在 Windows 和 Linux 上按 Ctrl + I,退出文学编程模式。
解释、运行和验证
请 Bob 解释实现,然后运行应用程序并验证其行为。
请 Bob 解释代码
用 New task 开启新的上下文窗口,然后从模式下拉菜单中选择 Ask。Ask 模式在不编辑文件的情况下回答问题和分析代码。当你希望获得解释而不做更改时,请使用它。
理解生成的代码是 AI 结对编程的重要组成部分。请问 Bob:
Explain the generated To-Do API.Bob 可以解释应用程序架构、数据流、FastAPI 组件、Pydantic 模型、端点行为和设计决策。使用这些解释在修改或扩展代码之前,确认代码确实符合你的预期。
运行应用程序
切换回 Agent 模式,让 Bob 能够运行命令。请 Bob 在容器中构建并运行 API:
Build the Docker image and run the container with port 8000 mapped to the host. Confirm the API is reachable.Bob 会运行构建和启动命令,并在容器运行时报告结果。
在浏览器中打开 http://localhost:8000/docs。
FastAPI 会在 /docs 提供交互式 Swagger UI。使用它来探索每个端点、检查请求和响应 schema,以及从浏览器运行 API 调用。
验证 API
使用 /docs 处的 Swagger UI 对每个操作进行测试。对于每个端点:
- 展开其行并选择 Try it out。
- 输入任何路径参数或请求体。
- 选择 Execute。
- 检查服务器响应代码和响应体。
添加任务
-
展开 POST /tasks 并选择 Try it out。
-
将请求体替换为:
{ "task_name": "My first API item!" } -
选择 Execute。确认响应代码为
201,响应体显示已分配id的已创建任务。
获取任务
- 展开 GET /tasks 并选择 Try it out。
- 选择 Execute。确认响应代码为
200,响应体列出了任务My first API item!及其在添加时分配的id。
更新任务
-
展开
PUT /tasks/{task_id}并选择 Try it out。 -
输入你创建的任务的
task_id。 -
将请求体替换为:
{ "task_name": "Build and ship a To-Do API" } -
选择 Execute。确认响应代码为
200,返回的任务显示更新后的task_name。 -
将
task_id更改为不存在的值,再次选择 Execute。确认响应代码为404。
删除任务
- 展开
DELETE /tasks/{task_id}并选择 Try it out。 - 输入你创建的任务的
task_id,然后选择 Execute。确认响应代码为204。 - 展开 GET /tasks,选择 Execute,并确认该任务不再出现在响应中。
- 再次展开
DELETE /tasks/{task_id},输入相同的task_id,然后选择 Execute。确认响应代码为404。
该实现满足原始需求,包括你通过文学编程添加的更新端点。
改进代码质量
请 Bob 审查生成的代码中的质量问题,然后应用你认可的更改。此步骤将 Bob 用作审查者,而不仅仅是代码生成器。
请 Bob 提出改进建议
用 New task 开启新的上下文窗口,然后输入:
Review the To-Do API and suggest improvements to code quality, error handling, and HTTP status codes.Bob 会识别问题,例如缺少用于获取单个任务的端点、内存存储使用普通字典而非经过验证的 Task 模型,以及模块级 id_counter 难以重置或测试。
应用改进
请 Bob 实现你想保留的建议:
Add a GET /tasks/{task_id} endpoint that returns 404 when the task ID does not exist, and store tasks as Task models instead of dictionaries.审查提议的更改并批准以应用它们。请 Bob 重新构建镜像并重启容器,然后重复验证步骤。确认 GET /tasks/{task_id} 对有效 ID 返回 200 及相应任务,对未知 ID 返回 404,并且现有端点的行为与之前相同。
生成测试和文档
请 Bob 为 API 生成测试套件和技术文档。
生成单元测试
用 New task 开启新的上下文窗口,然后请问 Bob:
Generate pytest unit tests for this application. Add pytest and httpx to a dev requirements file, build a test image, and run the suite in a container.Bob 会添加 pytest 和 httpx 测试依赖项,构建包含这些依赖项的镜像,在容器中运行测试套件,并报告结果。在容器中运行测试意味着你不需要本地 Python 环境。审查并完善生成的测试。
审查和维护生成的测试仍是你的责任。
生成技术文档
请问 Bob:
Generate technical documentation for this To-Do API.Bob 可以生成应用程序概述、架构描述、端点摘要、请求和响应示例以及使用说明。此文档补充了 FastAPI 自动生成的 API 文档。
故障排除
针对常见问题,请使用以下解决方案:
- 无法连接到 Docker daemon: 在构建镜像之前启动 Docker Desktop 或 Docker 服务。
- 容器已启动,但
http://localhost:8000/docs无法加载: Dockerfile 将 API 绑定到容器内的127.0.0.1,已发布的端口无法访问该地址。请确保 Dockerfile 以--host 0.0.0.0启动 Uvicorn,然后重新构建镜像。 - 0.0.0.0:8000 端口绑定失败:端口已被占用: 停止使用端口
8000的进程,或使用docker run -d --name todo-api -p 8080:8000 todo-api映射另一个主机端口,并打开http://localhost:8080/docs。 - 容器名称 "/todo-api" 已被使用: 运行
docker rm -f todo-api,然后重新启动容器。 - 运行测试时缺少 pytest: 应用程序镜像不包含测试依赖项。请 Bob 将
pytest和httpx添加到 dev requirements 文件中,并构建单独的测试镜像。
清理
停止并移除容器以释放端口 8000:
Stop and remove the To-Do API and test container and image.API 仅将任务保留在内存中,因此移除容器会丢弃所有数据。无需进一步清理。
后续步骤
在本教程中,你通过在每个阶段与 Bob 结对并在应用每项更改之前审查,构建并验证了一个容器化的 FastAPI 待办事项 API。
- 前往规划并实现复杂功能,了解如何处理更大规模的多层次变更。
- 探索创建 commit 和 pull request,将生成的代码从编辑器提交到 pull request。
常见问题
我需要了解 FastAPI 吗? 不需要。Bob 会生成 FastAPI 和 Pydantic 代码,并在需要时加以解释。具备基本的 Python 和 REST 知识即可。
为什么要在各阶段之间切换模式? 模式遵循最小权限原则。Plan 模式只读取代码和编写计划,不运行任何内容;Agent 模式可以编辑文件并运行命令;Ask 模式在不更改文件的情况下回答问题。切换模式可让 Bob 的能力始终与当前任务相匹配。
如果 Bob 给文件或模型起了不同的名字怎么办?
HTTP 契约由需求提示固定,因此路径和状态码保持一致。类名和文件布局可能有所不同。本教程假设模型名称为 Task 和 TaskCreate;如果 Bob 选择了其他名称,请相应调整后续提示。
为什么要在每个阶段开启新的上下文窗口?
Bob 会将计划保存到 plans 文件夹,因此早期的对话内容不再需要保留在上下文中。干净的上下文让每个阶段更加专注,同时也能控制 token 消耗。
没有 Docker 也能完成本教程吗? 技术上可以在没有 Docker 的情况下完成本教程,但你需要对发给 Bob 的计划和提示进行相应修改。
Plan 模式会修改文件吗? 不会。在 Plan 模式下,Bob 只读取你的代码并编写 Markdown 计划。在你切换到 Agent 模式之前,不会有任何应用程序代码发生变更。