Gemini CLI 源码分析

亮点
亮点有很多,最吸引我的是下面几点:
- 完全开源与可扩展:基于 Apache 2.0 协议完全开源。可控、可扩展,可以根据自己的需求写工具插件
- 定制:可以通过
GEMINI.md文件等方式自定义系统提示和指令 - 长上下文:100W
- 与现有工作流无缝集成:支持非交互模式,可以轻松地在自动化脚本中进行调用
不过目前使用起来,感觉还不达成熟。不过因为是开源的,估计过一段时间会好很多,可以当成一个储备的工具先关注着。
目前的重点,还是借助其源码,学习一下AI CLI的实现思路。
时序图
是典型的Agent架构,可以看到和其他的Agent框架(比如MetaGPT)的流程很类似:
sequenceDiagram
participant U as 👤 用户
participant T as 🖥️ 终端
participant CLI as 📦 CLI Package
participant Core as 🧠 Core Package
participant API as 🤖 Gemini API
participant Tools as 🔧 工具系统
participant FS as 💾 文件系统
%% 用户输入阶段
Note over U,FS: 🚀 用户交互开始
U->>T: 输入命令/提示
T->>CLI: 接收用户输入
%% CLI 预处理
CLI->>CLI: 解析输入命令
CLI->>CLI: 检查历史记录
CLI->>CLI: 应用主题设置
%% 发送到 Core
CLI->>Core: 发送处理请求
Note over CLI,Core: 📤 请求转发
%% Core 处理阶段
Core->>Core: 构建提示上下文
Core->>Core: 添加工具定义
Core->>Core: 整合会话历史
%% API 调用
Note over Core,API: 🔌 API 通信
Core->>API: 发送构建好的提示
API->>API: 处理请求
API->>Core: 返回响应
%% 响应处理分支
alt 📝 直接回答场景
Note over Core,CLI: 💬 无需工具执行
Core->>CLI: 返回最终结果
CLI->>CLI: 格式化输出
CLI->>T: 显示结果
T->>U: 展示给用户
else 🛠️ 需要工具执行场景
Note over Core,Tools: ⚡ 工具执行流程
Core->>Core: 解析工具请求
%% 工具类型检查
alt 📖 只读工具 (如 read-file, ls, grep)
Core->>Tools: 直接执行只读工具
Tools->>FS: 访问文件系统
FS->>Tools: 返回数据
Tools->>Core: 返回工具结果
else ⚠️ 修改性工具 (如 write-file, edit, shell)
Core->>CLI: 请求用户确认
CLI->>T: 显示确认提示
T->>U: 询问用户确认
U->>T: 用户确认/拒绝
T->>CLI: 接收用户决定
CLI->>Core: 传递用户决定
alt ✅ 用户确认执行
Core->>Tools: 执行修改性工具
Tools->>FS: 修改文件系统
FS->>Tools: 确认修改完成
Tools->>Core: 返回执行结果
else ❌ 用户拒绝执行
Core->>Core: 跳过工具执行
Note over Core: 🚫 工具执行被取消
end
end
%% 工具结果处理
Core->>API: 发送工具执行结果
API->>API: 基于工具结果生成回答
API->>Core: 返回最终响应
%% 结果返回
Core->>CLI: 返回完整结果
CLI->>CLI: 格式化和美化输出
CLI->>T: 显示最终结果
T->>U: 展示给用户
end
%% 会话管理
Note over CLI,Core: 📚 会话状态更新
CLI->>Core: 更新对话历史
Core->>Core: 保存会话状态
%% 继续对话或结束
opt 🔄 继续对话
Note over U,FS: 💭 等待下一轮输入
U->>T: 输入新的提示
Note over U,FS: ↩️ 循环回到开始
end
Note over U,FS: ✅ 交互完成
Function Calling
从源码可以看到,其实现了很多tools,通过不同的工具执行具体的任务。
Prompt
这是最经典的部分,从Prompt可以看到,Gemini CLI构建了软件开发的流程和规范,且针对不同的任务类型设定了不同的Prompt。
通过约束,减少幻觉,保证输出和用户意图的对齐:
制定了软件开发流程:
针对新应用程序的规范:
其他约束与工具调用:
CLI UI
另外发现个有意思的点,Gemini CLI的UI是基于React + Ink(可以理解为命令行的React DOM)实现的,而几大主流的AI CLI工具,都是基于这个来写CLI交互的: