实战三:Mini-Coder (简易版 Cursor)
这一节不打算做一个“看起来很全”的 Agent,而是故意做一个很小、但逻辑完整的版本。原因很简单:真正理解 Coding Agent,靠的不是背概念,而是亲手把最小闭环跑通。
一个最小可用的 Coding Agent,至少要做到三件事:
- 看懂目录和文件
- 读到实际代码
- 在改完之后留下可验证的结果
[PROMPT_LAB_BANNER]
1. 核心思路
示意图:Coding Agent 的重点不只是“会写代码”,而是能在上下文里持续执行。
Coding Agent 需要三个核心工具:
- List Files: 看看目录里有什么。
- Read File: 读取代码内容。
- Write File: 修改代码。
这个版本先故意不做太多事情,比如不接浏览器、不接 Git、不做多轮规划。先把最小链路搭起来,后面再慢慢加能力。
2. 定义工具 (Python 版)
import os
def list_files(directory="."):
"""列出指定目录下的文件"""
return str(os.listdir(directory))
def read_file(file_path):
"""读取文件内容"""
if not os.path.exists(file_path):
return "Error: File not found"
with open(file_path, "r") as f:
return f.read()
def write_file(file_path, content):
"""(覆盖)写入文件内容"""
with open(file_path, "w") as f:
f.write(content)
return f"Successfully wrote to {file_path}"
这里要有一个现实提醒:write_file 这种直接覆盖写入,在教学里够用,但在真实项目里其实很危险。生产环境更常见的做法会是:
- 先读取原文件
- 生成 diff 或 patch
- 通过 patch 应用修改
- 再执行验证步骤
因为一旦让 Agent 直接整文件覆盖,出错时很难回滚。
3. 编写 Agent 提示词 (System Prompt)
Prompt 的作用,不是让它“像高级程序员一样说话”,而是限制它按一个靠谱的顺序做事。
SYSTEM_PROMPT = """
你是一个全栈开发工程师 Agent。你的任务是帮助用户修改代码。
你的工作流程:
1. 探索:先查看目录结构,定位相关文件。
2. 阅读:读取需要修改的文件内容。
3. 思考:分析代码逻辑,设计修改方案。
4. 执行:调用 write_file 工具应用修改。
约束:
- 修改前必须先读取文件,不要猜测内容。
- 每次只修改一个文件,修改后等待用户反馈。
"""
4. 组装与运行
你可以用任意 Agent 框架来组装,重点不在库,而在执行顺序。下面用伪代码表示:
agent = Agent(
model="claude-3-5-sonnet", # 推荐用 Sonnet,写代码能力最强
tools=[list_files, read_file, write_file],
system_prompt=SYSTEM_PROMPT
)
# 任务:给 hello.py 增加一个打招呼的函数
agent.run("请检查当前目录下的 hello.py,给它增加一个 greet(name) 函数")
Agent 的执行轨迹 (Trace)
- Thought: 我需要先看看
hello.py是否存在。 - Action:
list_files(".") - Observation:
['hello.py', 'README.md'] - Thought: 文件存在,我需要读取它的内容。
- Action:
read_file("hello.py") - Observation:
print("Hello World") - Thought: 原代码很简单。我要添加 greet 函数。
- Action:
write_file("hello.py", "def greet(name):\n print(f'Hello {name}')\n\nprint('Hello World')") - Final Answer: 修改已完成。
5. 进阶:把玩具工具换成真实工具层
手写 list_files、read_file、write_file 很适合入门,但一旦进入真实项目,很快就会不够用。
这时更合理的升级方向通常是接入更标准的工具层,比如文件系统 server、搜索能力、测试执行器,或者基于 MCP 的工具接入。
- 安装 Server:
npm install -g @modelcontextprotocol/server-filesystem - 连接 Agent: 配置 Agent 通过 Stdio 连接该 Server。
- 优势: 安全性更高(可以限制目录访问权限),且支持更多高级操作(如搜索、Diff)。
一旦走到这一步,你的 Agent 就开始从“教学 demo”进入“能在真实仓库里做点事情”的阶段了。
小结
一个最小可用的 Coding Agent,核心并不复杂:
- 能先探索环境,再决定修改点。
- 能读取真实文件,而不是凭空猜代码。
- 能在修改后执行验证,而不是只输出“我已经改好了”。
如果你后面想继续增强它,优先级通常是:
- 加
diff/patch,不要直接整文件覆盖。 - 加测试和 linter,让它能自我验证。
- 加更好的上下文选择,别每次把整个仓库塞进去。