大家好!我是程序员Cobyte。今天我们从零开始,亲手打造一个“Mini Claude Code”,看看它到底是如何思考和工作的
目前最成熟的 AI Agent,莫过于各种 AI 编程助手了,比如大名鼎鼎的 Claude Code。所以,想理解 AI Agent,最好的方式就是亲自动手,写一个自己的 “Claude Code”。
首先,创建一个新的 Python 文件,就叫它 mini-claude-code.py 吧。同时,我们需要给它划定一个“安全区”——也就是一个工作目录。所有 AI 能操作的文件,都必须在这个目录里,这样它就不会乱跑到我们电脑的其他地方捣乱了。
在文件开头,导入必要的库:
import os
import json
import subprocess
from pathlib import Path
from dotenv import load_dotenv
from openai import OpenAI
接着,定义工作区的路径。我们使用 Path.cwd() / 'workspace',意思是当前目录下的 workspace 文件夹。所有的文件读写都会被限制在这个文件夹内,保证安全。
WORKDIR = Path.cwd() / 'workspace'
AI模型(比如我们要用的 DeepSeek)本身并不知道我们有哪些工具。所以,我们需要给它一份详细的“说明书”,告诉它我们有哪些工具、怎么用、需要什么参数。这份说明书,就是后面要传给大模型 API 的tools列表。
我们从最简单的read_file(读文件)开始,看它的“说明书”长什么样:
tools = [
{
"type": "function",
"function": {
"name": "read_file", # 工具的名字
"description": "读取文本文件的内容。用于查看现有代码、配置文件或文档。", # 工具是干嘛的
"parameters": { # 工具需要什么参数
"type": "object",
"properties": {
"path": { # 参数名
"type": "string",
"description": "要读取的文件路径(相对或绝对路径)"
}
},
"required": ["path"] # 哪些参数是必须的
}
}
}
]
是不是一目了然?之后我们每增加一个新工具,比如 write_file(写文件)、edit_file(改文件),只要按照这个格式写好它的“说明书”并添加到 tools 列表里,AI 就都“看”得懂了。
光有说明书还不够,我们得把真正的工具函数写出来。为了让 AI 能统一调用,我们为每个工具创建一个类,里面都有一个 execute 方法。
但在动手之前,得先写一个“门卫”,确保 AI 访问的路径都在我们划定的 workspace 目录里面,防止它“越狱”。
def checkPath(p: str) -> Path:
path = (WORKDIR / p).resolve()
if not path.is_relative_to(WORKDIR):
raise ValueError(f"路径不在工作区内: {p}")
return path
有了这个“门卫”之后我们再去实现 ReadFileTool 也就读取文件的工具类:
class ReadFileTool:
def execute(self, path: str) -> str:
try:
# 先检查路径是否合规
file_path = checkPath(path).expanduser()
if not file_path.exists():
return f" 文件不存在: {path}"
return file_path.read_text(encoding="utf-8")
except Exception as e:
return f" 读取失败: {str(e)}"
现在,我们有了第一个工具。为了方便在后面的 Agent 循环中快速找到它,我们用一个字典来管理:
file_tools = {
"read_file": ReadFileTool(),
}
后面将实现更多的工具,继续往 file_tools 里面添加。现在我们得让我们的工具先跑起来。
我们使用 DeepSeek 的 API,当然,你也可以换成 OpenAI 或其他兼容的模型。
先在项目根目录创建 .env 文件,写上你的 API Key:
DEEPSEEK_API_KEY=你的key
然后加载环境变量并初始化客户端:
load_dotenv()
client = OpenAI(
api_key=os.getenv("DEEPSEEK_API_KEY"),
base_url="https://api.deepseek.com"
)
至此,我们的 AI “大脑”就绪,可以开始思考了。
Agent Loop 是整个 AI Agent 的灵魂,它模拟了人类解决问题时的“思考-行动-观察”循环。Agent Loop 我们上一篇文章已经详细讲过它的实现原理了,我们再回顾一下它的工作流程:
这个过程用代码实现就是下面这样的:
def agent_loop(messages: list) -> str:
max_iterations = 100
iteration = 0
while iteration < max_iterations:
iteration += 1
print(f"n 33[33m 正在思考... 33[0m") # 加个提示方便调试
response = client.ch@t.completions.create(
model="deepseek-ch@t",
messages=messages,
tools=tools,
tool_choice="auto"
)
msg = response.choices[0].message
messages.append(msg) # 把模型的思考结果也加入历史
# 如果模型没要调用工具,说明任务完成,返回答案
if not msg.tool_calls:
return msg.content
# 否则,模型要调用工具了
for tool_call in msg.tool_calls:
tool_name = tool_call.function.name
args = json.loads(tool_call.function.arguments)
# 打印工具调用信息,方便我们观察
print(f"n 33[33m️ [调用工具] {tool_name}