Go 版终端 Agent PaiCLI 上线了,类Claude Code
大家好,我是二哥呀。
PaiCLI 的 Go 版本上线了。
到这里,PaiCLI 已经集齐了 Java、Python、TypeScript、Go 四个版本,核心架构完全一致,都是 ReAct + Tool Use + MCP + Memory + RAG + Skill 这一套。

先叠个甲,Go 版的定位和 Python 版、TypeScript 版一样,不是要造一个 Claude Code,而是让大家用自己最顺手的语言,把 AI Agent 的核心技术栈亲手实现一遍。
当然了 Go、Python、TypeScript 这三个版本应该会有一些bug,欢迎大家踊跃提 issue,或者直接 PR。
这样你也可以直接把这个项目的GitHub地址写到简历上,因为不同于Java版,这三个版本都是开源的。
01、Go 版有什么不一样
PaiCLI-Go 的核心依赖只有 2 个库。
Charm 全家桶(Bubble Tea + Bubbles + Lip Gloss + Glamour),终端 UI 框架。
Bubble Tea 是 Go 生态里最成熟的 TUI 框架,基于 Elm 架构,状态驱动渲染。
PaiCLI 用它做了一个全屏终端应用,不是简单的命令行问答,而是有 ASCII Logo、thinking 可视化流式输出、鼠标滚轮翻页、滚动条、上下文窗口使用进度条的完整界面。

Lip Gloss 负责终端样式渲染——颜色、边框、布局,Glamour 负责把 Markdown 渲染成带语法高亮的终端输出。
**cobra,**CLI 框架。Go 生态的事实标准,kubectl、docker、Hugo 用的都是它。
PaiCLI 用 cobra 定义了 8 个子命令:doctor(环境检查)、index(构建代码索引)、search(搜索代码)、graph(打印代码关系图)、serve(启动 Runtime API)、wechat(微信通道)、snapshot(快照管理)、version。
加上 doublestar 做 glob 匹配,Go 版的直接依赖总共 3 个。

Go 在这个场景下最大的优势是单二进制部署。
go build ./cmd/paicli 编译完就是一个可执行文件,大小在 15MB左右。
想交叉编译到 Linux 服务器,GOOS=linux go build ./cmd/paicli 一行搞定。对运维和自动化场景来说这个优势很大。
还有一个 Go 独有的能力:Go AST 级别的代码索引。
PaiCLI-Go 的 RAG 模块不只是按行拆分文本,它会调用 go/ast 和 go/parser 标准库解析 Go 源码,提取出函数级别的符号信息,包括函数名、接收者类型(比如 *Agent.Run),并且建立 import 关系和 contains 关系的代码关系图。
ast.Inspect(file, func(n ast.Node) bool {
fn, ok := n.(*ast.FuncDecl)
if !ok {
return true
}
sym := fn.Name.Name
if fn.Recv != nil && len(fn.Recv.List) > 0 {
sym = exprString(fn.Recv.List[0].Type) + "." + sym
}
// 提取函数级 Chunk,带符号名、行号范围
i.Chunks = append(i.Chunks, Chunk{...})
i.Relations = append(i.Relations, Relation{From: rel, To: sym, Kind: "contains"})
return false
})
这意味着搜索 Agent 时,不光能匹配文本里出现了 Agent 的行,还能直接定位到 Agent.Run、Agent.Team 这些函数定义,并且知道它们在哪个文件里、被谁 import。
02、实现了哪些功能

ReAct 推理循环。接收用户输入 → 调用大模型推理 → 判断是否需要工具 → 执行工具 → 把结果喂回模型 → 继续推理。
Go 版在循环里加了一个循环卫士(Loop Guard):如果检测到模型重复调用了相同参数的相同工具,直接中断循环并要求模型从已有上下文生成最终答案,防止无限循环。
13 个内置工具。read_file、write_file、list_dir、glob_files、grep_code、execute_command、create_project、web_search、web_fetch、save_memory、load_skill、search_code、revert_turn。
工具执行通过 goroutine 并行调度,4 个槽位的信号量控制并发度,每个工具调用有 90 秒超时。
func (r *Registry) ExecuteAll(ctx context.Context, calls []llm.ToolCall) []Result {
results := make([]Result, len(calls))
var wg sync.WaitGroup
sem := make(chan struct{}, 4) // 4 槽位信号量
for i, call := range calls {
wg.Add(1)
go func(i int, call llm.ToolCall) {
defer wg.Done()
sem <- struct{}{}
defer func() { <-sem }()
results[i] = r.Execute(cctx, call)
}(i, call)
}
wg.Wai...企业级Agent工作流编排项目PaiFlow
Vibe Coding版本的PaiAgent
派聪明RAG AI知识库Java版本+Go版本
微服务 PmHub、技术派、MYDB
求职派JobClaw(OpenClaw/Hermes架构
PaiCLI(类似Claude Code的Agent
派简历(代码已完成)
等实战项目。
1. 微信扫右侧的优惠券加入知识星球
2. 解锁星球的实战项目教程和源码: 项目源码+教程获取
真诚点赞 诚不我欺
回复