共计 4126 个字符,预计需要花费 11 分钟才能阅读完成。
在您常用的代码生成工具中,哪个功能最强大?
1. 理解能力卓越
2. 代码质量出色
3. 生成效率高
4. 使用成本
如果您有其他推荐,欢迎分享,谢谢!
项目起源
最近,Claude Code 受到广泛关注,作为一个终端 AI 编程助手,它能够直接在命令行中帮助用户编写代码、修复 Bug 和执行命令。
经过一段时间的使用,我产生了一个想法:这种技术的核心原理到底是什么?我是否能够尝试自己开发一个呢?
因此,我花费了几周的时间,用 Go 语言从头构建了一个迷你版本,命名为MiniCode。
完成后,我意识到这个过程涉及的知识点相当多,而网上关于此的系统性讲解却很少。因此,我将整个过程整理成一个30 天教程,从最基本的 API 调用,到流式输出、工具系统,再到 TUI 界面,逐步引导你理解 AI Agent 的核心原理。
项目链接: https://github.com/JiayuXu0/MiniCode 欢迎大家 Star,衷心感谢!

https://www.zhihu.com/video/1992713323851036365
结论:AI Agent 并不复杂
许多文章对 AI Agent 的描述显得非常神秘,提到诸如“自主决策”、“任务规划”以及“记忆系统”等概念,仿佛是在讨论通用人工智能(AGI)。
但其实,其核心原理相当简单:

它的运作方式是一个 循环过程:LLM 会决定是否使用工具,若使用则将结果反馈,再由 LLM 判断,直到它认为可以给出答案为止。
Claude Code 的“智能”本质上源于:
- 强大的基础模型(Claude 4)
- 精心设计的工具集合(20 多个工具)
- 巧妙的提示工程
虽然我们无法匹敌其模型能力,但在工具系统和架构设计方面,完全可以借鉴。
为何选择 Go 而非 Python?
网络上 90% 以上的 AI Agent 教程都是基于 Python 和 LangChain。我选择 Go 的原因包括:
1. 性能优势
Go 编译成原生二进制,启动速度快,内存占用小。而 Python 在导入一系列依赖时就需要耗费几秒。
2. 部署便捷
只需将一个二进制文件复制到服务器上即可运行,无需安装 Python、配置虚拟环境,也不需要花费时间进行 pip install。
3. 支持并发处理
流式输出要求同时处理多个任务:接收 API 响应、更新用户界面、响应用户输入。Go 的 goroutine 非常适合这种场景,相较于 Python 的 async/await,使用起来更加方便。
4. 类型安全
工具的输入和输出都有明确的类型定义,编译阶段能够及时发现错误。而 Python 有时只能在运行时才提示你 KeyError。
技术栈选择
| 组件 | 选择 | 理由 |
|---|---|---|
| AI SDK | Fantasy | 由 Charmbracelet 开发,比 LangChain 轻量十倍 |
| TUI 框架 | Bubble Tea | 基于 Elm 架构,状态管理清晰 |
| LLM | 智谱 GLM-4 | 国产模型,提供免费额度,API 兼容 OpenAI |
Fantasy 是我这次的意外收获。它是由 Charmbracelet(即开发 Bubble Tea 的团队)推出的 AI SDK,具备以下特点:
- 统一接口,支持 OpenAI、Anthropic、Google 等主流服务提供商
- 原生支持流式输出
- 工具系统设计优雅
- 避免了 LangChain 的过度抽象
核心实现:工具系统
Claude Code 最为核心的功能是 工具调用。例如,当你请求“帮我找到所有 Go 文件”时,它将:
- 理解你的请求
- 调用相应工具进行文件搜索
- 获取结果后组织语言进行回复
在 Fantasy 中,定义一个工具极为简单:
// 定义输入结构
type GlobInput struct {Pattern string `json:"pattern" description:"The glob pattern (e.g., **/*.go)"`
Path string `json:"path,omitempty" description:"Search directory"`
}
// 实现工具函数
func Glob(ctx context.Context, input GlobInput, call fantasy.ToolCall) (fantasy.ToolResponse, error) {matches, err := doublestar.FilepathGlob(filepath.Join(input.Path, input.Pattern))
if err != nil {return fantasy.NewTextErrorResponse(err.Error()), nil
}
return fantasy.NewTextResponse(fmt.Sprintf("Found %d files:n%s", len(matches), strings.Join(matches, "n"))), nil
}
// 注册工具
tool := fantasy.NewAgentTool("glob", "Search files by pattern", Glob)
几个关键要点:
description标签会发送给 LLM,让其明确该参数的用途- 返回
TextErrorResponse表示工具执行失败,LLM 将意识到需要换一种方法 - Fantasy 会自动将结构体转换为 JSON Schema
目前 MiniCode 实现了六个工具:
| 工具 | 功能 |
|---|---|
| glob | 文件搜索(支持 ** 递归) |
| view | 查看文件内容(带行号) |
| grep | 内容搜索(正则匹配) |
| bash | 执行命令 |
| write | 写入文件 |
| edit | 编辑文件(字符串替换) |
流式输出:打字机效果
非流式输出的体验往往较差——发送请求后,需要等候数秒才能看到回复,过程不明朗。
流式输出则能实时展示 AI 的思考过程:
result, err := agent.Stream(ctx, fantasy.AgentStreamCall{
Messages: history,
Prompt: input,
OnTextDelta: func(id, text string) error {
// 每收到一个文本片段就更新 UI
program.Send(streamTextMsg{delta: text})
return nil
},
OnToolCall: func(tc fantasy.ToolCallContent) error {
// 工具调用开始,显示 loading 状态
program.Send(streamToolCallMsg{name: tc.ToolName})
return nil
},
OnToolResult: func(tr fantasy.ToolResultContent) error {
// 工具执行完成,显示结果
program.Send(streamToolResultMsg{result: tr.Result})
return nil
},
})
这里有一个需要注意的地方:回调函数在独立的 goroutine 中执行,因此不能直接修改 UI 状态,以免造成竞态条件。
解决方案是通过 program.Send() 发送消息到主循环,由 Bubble Tea 的 Update 函数统一处理。
TUI 架构:Elm 模式
Bubble Tea 采用 Elm 架构,核心由三个函数组成:
- Model: 应用状态
- Update: 根据消息更新状态
- View: 根据状态渲染界面
这种架构的优点在于 状态管理非常清晰。所有状态的修改都在 Update 函数中进行,而 View 则是一个纯函数,不存在意外的副作用。
MiniCode 的 Model 结构如下:
type Model struct {
textarea textarea.Model // 输入框
viewport viewport.Model // 消息显示区
history []fantasy.Message // 对话历史
agent fantasy.Agent // AI Agent
streaming bool // 是否正在流式输出
streamParts []streamPart // 流式内容缓存
cancelFunc context.CancelFunc // 取消函数
}
教程大纲
整个项目整理为一个 30 天的教程,目前已完成第 1-4 天的内容:
| Day | 主题 | 内容 |
|---|---|---|
| Day 1 | 创建第一个 AI Agent | Fantasy SDK 基础、Provider、Agent |
| Day 2 | 为 Agent 添加工具 | Tool 系统、Glob 实现、AgentResult 结构 |
| Day 3 | 构建交互式 TUI | Bubble Tea、Elm 架构、多轮对话 |
| Day 4 | 实现流式输出 | Streaming API、跨 goroutine 通信、取消机制 |
| Day 5+ | 更多工具和高级特性 | 持续更新中… |
每篇教程都包含完整的代码示例和详细的原理解析,而不是那种“Hello World”轻松完成的简单文档。
总结
开展这个项目的初衷,旨在弄清楚 Claude Code 的工作原理。完成后我意识到,AI Agent 的核心原理其实并不复杂,真正的挑战在于工程细节和产品的打磨。
目前已完成第 1-4 天的教程,实现了基本功能:流式输出、工具调用、多轮对话、TUI 界面。接下来我会持续更新,将 30 天的内容全部整理完毕。
后续更新计划:
- Day 5-10:完善工具集(文件读写、代码编辑、命令执行)
- Day 11-20:Agent 循环与上下文管理
- Day 21-30:子 Agent、记忆系统、生产级部署
老实说,编写教程的工作比写代码要辛苦得多——代码只要能够运行就好,而教程则需要将每一个细节都解释清楚。因此,我恳请大家:
- 给我点个 Star ⭐️ —— 这将是我不断更新的最大动力
- 关注这个项目 —— 这样你能第一时间接收到更新通知
- 请关注我 —— 我会在知乎上同步每天的教程内容
一个人独自写作容易分心,有人关注就会变得不一样了。
GitHub: https://github.com/JiayuXu0/MiniCode
如果你在学习过程中遇到任何问题,欢迎提出问题,我会尽量给予回复。同时也欢迎你贡献代码,一起完善这个项目。
让我们共同努力,在 30 天内理解 AI Agent 的运作!


听说 Go 的部署非常方便,省去了不少麻烦,真是个好选择!