【Gemini-Cli】剖析源码架构
·
Gemini CLI 架构分析文档
基于 gemini-cli 源代码的深度架构分析
分析时间: 2026-04-02
版本: 0.36.0-nightly.20260317.2f90b4653
目录
1. 项目概述
1.1 项目简介
Gemini CLI 是 Google 开源的一个强大的 AI 代理命令行工具,将 Gemini 大模型的能力直接带入终端。它提供了轻量级的 Gemini 访问方式,是从提示到模型的最直接路径。
1.2 核心特性
- 免费层级: 每分钟 60 次请求,每天 1000 次请求(使用个人 Google 账户)
- 强大的 Gemini 3 模型: 改进的推理能力和 1M token 上下文窗口
- 内置工具: Google Search grounding、文件操作、Shell 命令、Web 获取
- 可扩展: MCP (Model Context Protocol) 支持自定义集成
- 终端优先: 为命令行用户设计
- 开源: Apache 2.0 许可证
1.3 Monorepo 结构
2. 整体架构
2.1 分层架构图
2.2 核心数据流
3. 核心包分析
3.1 @google/gemini-cli (CLI 包)
职责: 应用入口点、UI 组件、命令处理
关键文件:
src/gemini.tsx- 主入口,启动流程src/interactiveCli.tsx- 交互模式入口src/nonInteractiveCli.ts- 非交互模式处理src/ui/AppContainer.tsx- 主 UI 容器
启动流程:
3.2 @google/gemini-cli-core (Core 包)
职责: 核心业务逻辑、工具系统、代理系统
核心模块:
| 模块 | 职责 |
|---|---|
core/ |
LLM 客户端、内容生成器 |
tools/ |
工具定义和注册 |
agents/ |
子代理系统 |
scheduler/ |
工具调度执行 |
policy/ |
策略引擎 |
services/ |
文件系统、沙箱、遥测等服务 |
mcp/ |
MCP 协议实现 |
hooks/ |
钩子系统 |
config/ |
配置管理 |
3.3 @google/gemini-cli-a2a-server
职责: Agent-to-Agent 协议服务端,允许 Gemini CLI 作为 A2A 代理服务器运行。
3.4 @google/gemini-cli-sdk
职责: SDK 封装,供第三方应用集成使用。
4. 核心组件详解
4.1 工具系统 (Tool System)
内置工具类型:
| 工具名 | 类型 | 描述 |
|---|---|---|
read_file |
Read | 读取文件内容 |
write_file |
Edit | 写入文件 |
edit_file |
Edit | 编辑文件 |
ls |
Read | 列出目录 |
grep_search |
Search | 搜索文件内容 |
glob |
Search | 文件模式匹配 |
shell |
Execute | 执行 Shell 命令 |
web_fetch |
Fetch | 获取网页内容 |
web_search |
Search | 网页搜索 |
memory |
Other | 管理 GEMINI.md 记忆 |
ask_user |
Communicate | 询问用户 |
activate_skill |
Other | 激活技能 |
4.2 调度器 (Scheduler)
调度器是工具执行的核心编排组件,负责管理工具调用的生命周期。
调度器核心流程:
4.3 GeminiClient (LLM 客户端)
4.4 策略引擎 (Policy Engine)
策略引擎负责对工具调用进行安全检查和权限控制。
策略规则类型:
interface PolicyRule {
toolName?: string; // 工具名匹配
mcpName?: string; // MCP 服务器名
argsPattern?: string; // 参数正则匹配
decision: PolicyDecision; // ALLOW | DENY | ASK_USER
modes?: ApprovalMode[]; // 适用的审批模式
subagent?: string; // 子代理名称
priority?: number; // 优先级
}
4.5 代理系统 (Agent System)
代理执行流程:
4.6 MCP 集成
5. 数据流与交互
5.1 用户输入处理流程
渲染错误: Mermaid 渲染失败: Parse error on line 4: ...sh 命令] PARSE -->|@ 提及| ATMENTION[处理 ----------------------^ Expecting 'AMP', 'COLON', 'PIPE', 'TESTSTR', 'DOWN', 'DEFAULT', 'NUM', 'COMMA', 'NODE_STRING', 'BRKT', 'MINUS', 'MULT', 'UNICODE_TEXT', got 'LINK_ID'
5.2 上下文管理
5.3 会话状态管理
6. 扩展机制
6.1 MCP 服务器配置
{
"mcpServers": {
"server-name": {
"command": "/path/to/server",
"args": ["--arg1", "value1"],
"env": {
"API_KEY": "xxx"
},
"timeout": 600000,
"trust": true
}
}
}
6.2 技能系统 (Skills)
6.3 钩子系统 (Hooks)
支持的钩子事件:
| 事件 | 触发时机 |
|---|---|
BeforeTool |
工具执行前 |
AfterTool |
工具执行后 |
SessionStart |
会话开始 |
SessionEnd |
会话结束 |
BeforeAgent |
代理循环前 |
AfterAgent |
代理循环后 |
6.4 扩展系统 (Extensions)
7. 安全与沙箱
7.1 沙箱架构
7.2 权限控制
7.3 审批模式
渲染错误: Mermaid 渲染失败: Parse error on line 2: ...gram-v2 [*] --> Default: 默认模式 D ----------------------^ Expecting 'ID', 'EDGE_STATE', got 'DEFAULT'
8. 技术栈与依赖
8.1 核心技术栈
| 层级 | 技术 | 用途 |
|---|---|---|
| 运行时 | Node.js 20+ | JavaScript 运行环境 |
| 语言 | TypeScript | 类型安全的开发体验 |
| UI 框架 | React + Ink | 终端 UI 组件 |
| 构建工具 | esbuild | 快速打包 |
| 测试框架 | Vitest | 单元测试和集成测试 |
8.2 关键依赖
AI/ML 相关:
@google/genai- Google Generative AI SDK@a2a-js/sdk- Agent-to-Agent 协议 SDK
MCP 相关:
@modelcontextprotocol/sdk- MCP 协议实现
终端 UI:
ink- React 终端渲染chalk- 终端颜色ansi-escapes- ANSI 转义序列
文件系统:
glob- 文件模式匹配ignore- gitignore 解析@joshua.litt/get-ripgrep- ripgrep 集成
安全与沙箱:
@lydell/node-pty- 伪终端keytar- 安全凭据存储
遥测与监控:
@opentelemetry/*- OpenTelemetry 集成@google-cloud/logging- Google Cloud 日志
8.3 打包与分发
9. 设计模式与最佳实践
9.1 使用的设计模式
1. 依赖注入模式
Config对象通过构造函数注入到需要的组件- 便于测试和模块解耦
2. 观察者模式
MessageBus实现发布-订阅机制coreEvents事件系统用于组件间通信
3. 策略模式
PolicyEngine使用策略规则进行决策- 不同的沙箱策略实现
4. 工厂模式
createSandboxManager工厂函数createContentGenerator工厂函数
5. 命令模式
- 工具调用封装为
ToolInvocation对象 - 支持撤销、重做等操作
6. 责任链模式
- 钩子系统的执行链
- 策略规则的匹配链
9.2 架构最佳实践
分层架构:
- 清晰的关注点分离
- 依赖方向从外向内
配置管理:
- 分层配置(用户/项目/工作区)
- 支持远程管理配置
错误处理:
- 结构化错误类型
- 友好的错误消息
- 可恢复错误处理
可测试性:
- 依赖注入
- 模块化设计
- 测试工具包
10. 总结
10.1 架构亮点
- 模块化设计: 清晰的包结构和职责划分
- 可扩展性: MCP、钩子、技能、扩展等多种扩展机制
- 安全性: 多层安全机制,包括沙箱、策略引擎、权限控制
- 用户体验: 支持交互和非交互模式,丰富的 UI 组件
- 可观测性: 完善的遥测系统和日志记录
10.2 架构图总览
10.3 关键数据结构
工具调用结果:
interface ToolResult {
llmContent: PartListUnion; // LLM 历史内容
returnDisplay: ToolResultDisplay; // 用户显示
error?: {
message: string;
type?: ToolErrorType;
};
data?: Record<string, unknown>;
tailToolCallRequest?: { // 链式调用
name: string;
args: Record<string, unknown>;
};
}
代理会话事件:
type AgentEvent =
| { type: 'agent_start'; streamId: string; ... }
| { type: 'content'; content: ContentPart; ... }
| { type: 'tool_call'; toolCall: ToolCall; ... }
| { type: 'tool_result'; result: ToolResult; ... }
| { type: 'agent_end'; reason: StreamEndReason; ... };
配置结构:
interface Config {
// 工具注册表
toolRegistry: ToolRegistry;
// 策略引擎
policyEngine: PolicyEngine;
// 消息总线
messageBus: MessageBus;
// 沙箱管理器
sandboxManager: SandboxManager;
// 存储服务
storage: Storage;
// ...更多配置
}
附录
A. 文件结构概览
gemini-cli/
├── packages/
│ ├── cli/ # CLI 包
│ │ ├── src/
│ │ │ ├── gemini.tsx # 主入口
│ │ │ ├── interactiveCli.tsx
│ │ │ ├── nonInteractiveCli.ts
│ │ │ ├── ui/ # UI 组件
│ │ │ ├── commands/ # 命令处理
│ │ │ └── config/ # CLI 配置
│ │ └── package.json
│ │
│ ├── core/ # 核心包
│ │ ├── src/
│ │ │ ├── core/ # 核心逻辑
│ │ │ ├── tools/ # 工具定义
│ │ │ ├── agents/ # 代理系统
│ │ │ ├── scheduler/ # 调度器
│ │ │ ├── policy/ # 策略引擎
│ │ │ ├── services/ # 服务层
│ │ │ ├── mcp/ # MCP 实现
│ │ │ ├── hooks/ # 钩子系统
│ │ │ ├── config/ # 配置管理
│ │ │ └── utils/ # 工具函数
│ │ └── package.json
│ │
│ ├── a2a-server/ # A2A 服务
│ ├── sdk/ # SDK
│ ├── devtools/ # 开发工具
│ └── test-utils/ # 测试工具
│
├── docs/ # 文档
├── schemas/ # JSON Schemas
├── scripts/ # 构建脚本
└── package.json # 根配置
B. 参考链接
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)