Gemini CLI 源码分析

Logo

亮点

亮点有很多,最吸引我的是下面几点:

  • 完全开源与可扩展:基于 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,通过不同的工具执行具体的任务。
tools

Prompt

这是最经典的部分,从Prompt可以看到,Gemini CLI构建了软件开发的流程和规范,且针对不同的任务类型设定了不同的Prompt。

通过约束,减少幻觉,保证输出和用户意图的对齐:
约束

制定了软件开发流程:
Workflow

针对新应用程序的规范:
Standard

其他约束与工具调用:
Others

CLI UI

另外发现个有意思的点,Gemini CLI的UI是基于React + Ink(可以理解为命令行的React DOM)实现的,而几大主流的AI CLI工具,都是基于这个来写CLI交互的:
Ink